simplify/optimize code
This commit is contained in:
@ -187,20 +187,20 @@ void AtomVecHybrid::process_args(int narg, char **arg)
|
|||||||
// save concat_grow to check for duplicates of special-case fields
|
// save concat_grow to check for duplicates of special-case fields
|
||||||
|
|
||||||
char *concat_grow;;
|
char *concat_grow;;
|
||||||
char *null = nullptr;
|
char *dummyptr = nullptr;
|
||||||
|
|
||||||
fields_grow = merge_fields(0,fields_grow,1,concat_grow);
|
fields_grow = merge_fields(0,fields_grow,1,concat_grow);
|
||||||
fields_copy = merge_fields(1,fields_copy,0,null);
|
fields_copy = merge_fields(1,fields_copy,0,dummyptr);
|
||||||
fields_comm = merge_fields(2,fields_comm,0,null);
|
fields_comm = merge_fields(2,fields_comm,0,dummyptr);
|
||||||
fields_comm_vel = merge_fields(3,fields_comm_vel,0,null);
|
fields_comm_vel = merge_fields(3,fields_comm_vel,0,dummyptr);
|
||||||
fields_reverse = merge_fields(4,fields_reverse,0,null);
|
fields_reverse = merge_fields(4,fields_reverse,0,dummyptr);
|
||||||
fields_border = merge_fields(5,fields_border,0,null);
|
fields_border = merge_fields(5,fields_border,0,dummyptr);
|
||||||
fields_border_vel = merge_fields(6,fields_border_vel,0,null);
|
fields_border_vel = merge_fields(6,fields_border_vel,0,dummyptr);
|
||||||
fields_exchange = merge_fields(7,fields_exchange,0,null);
|
fields_exchange = merge_fields(7,fields_exchange,0,dummyptr);
|
||||||
fields_restart = merge_fields(8,fields_restart,0,null);
|
fields_restart = merge_fields(8,fields_restart,0,dummyptr);
|
||||||
fields_create = merge_fields(9,fields_create,0,null);
|
fields_create = merge_fields(9,fields_create,0,dummyptr);
|
||||||
fields_data_atom = merge_fields(10,fields_data_atom,0,null);
|
fields_data_atom = merge_fields(10,fields_data_atom,0,dummyptr);
|
||||||
fields_data_vel = merge_fields(11,fields_data_vel,0,null);
|
fields_data_vel = merge_fields(11,fields_data_vel,0,dummyptr);
|
||||||
|
|
||||||
fields_allocated = 1;
|
fields_allocated = 1;
|
||||||
|
|
||||||
@ -545,56 +545,38 @@ void AtomVecHybrid::pack_property_atom(int multiindex, double *buf,
|
|||||||
char *AtomVecHybrid::merge_fields(int inum, char *root,
|
char *AtomVecHybrid::merge_fields(int inum, char *root,
|
||||||
int concat_flag, char *&concat_str)
|
int concat_flag, char *&concat_str)
|
||||||
{
|
{
|
||||||
// create concatenated string of length size from root + all substyles
|
// create vector with all words combined
|
||||||
|
|
||||||
int size = strlen(root) + 1;
|
|
||||||
for (int k = 0; k < nstyles; k++)
|
|
||||||
size += strlen(fieldstrings[k].fstr[inum]) + 1;
|
|
||||||
|
|
||||||
char *concat = new char[size];
|
|
||||||
strcpy(concat,root);
|
|
||||||
|
|
||||||
|
std::string concat;
|
||||||
|
if (root) concat += root;
|
||||||
for (int k = 0; k < nstyles; k++) {
|
for (int k = 0; k < nstyles; k++) {
|
||||||
if (strlen(concat)) strcat(concat," ");
|
if (concat.size() > 0) concat += " ";
|
||||||
strcat(concat,fieldstrings[k].fstr[inum]);
|
concat += fieldstrings[k].fstr[inum];
|
||||||
|
}
|
||||||
|
if (concat_flag) concat_str = utils::strdup(concat);
|
||||||
|
|
||||||
|
// remove duplicate words without changing the order
|
||||||
|
|
||||||
|
auto words = Tokenizer(concat, " ").as_vector();
|
||||||
|
std::vector<std::string> dedup;
|
||||||
|
for (auto &w : words) {
|
||||||
|
bool found = false;
|
||||||
|
for (auto &d : dedup) {
|
||||||
|
if (w == d) found = true;
|
||||||
|
}
|
||||||
|
if (!found) dedup.push_back(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
// identify unique words in concatenated string
|
// create final concatenated, deduped string
|
||||||
|
concat.clear();
|
||||||
std::vector<std::string> words = Tokenizer(concat, " ").as_vector();
|
for (auto &d : dedup) {
|
||||||
int nwords = words.size();
|
concat += d;
|
||||||
|
concat += " ";
|
||||||
int *unique = new int[nwords];
|
|
||||||
|
|
||||||
for (int i = 0; i < nwords; i++) {
|
|
||||||
unique[i] = 1;
|
|
||||||
for (int j = 0; j < i; j++)
|
|
||||||
if (words[i] == words[j]) unique[i] = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct a new deduped string
|
// remove trailing blank
|
||||||
|
if (concat.size() > 0) concat.pop_back();
|
||||||
char *dedup = new char[size];
|
return utils::strdup(concat);
|
||||||
dedup[0] = '\0';
|
|
||||||
|
|
||||||
for (int i = 0; i < nwords; i++) {
|
|
||||||
if (!unique[i]) continue;
|
|
||||||
strcat(dedup,words[i].c_str());
|
|
||||||
if (i < nwords-1) strcat(dedup," ");
|
|
||||||
}
|
|
||||||
|
|
||||||
// clean up or return concat
|
|
||||||
|
|
||||||
if (concat_flag) concat_str = concat;
|
|
||||||
else delete [] concat;
|
|
||||||
|
|
||||||
// clean up
|
|
||||||
|
|
||||||
delete [] unique;
|
|
||||||
|
|
||||||
// return final concatenated, deduped string
|
|
||||||
|
|
||||||
return dedup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
|||||||
@ -351,7 +351,5 @@ void ComputePressure::virial_compute(int n, int ndiag)
|
|||||||
void ComputePressure::reset_extra_compute_fix(const char *id_new)
|
void ComputePressure::reset_extra_compute_fix(const char *id_new)
|
||||||
{
|
{
|
||||||
delete [] id_temp;
|
delete [] id_temp;
|
||||||
int n = strlen(id_new) + 1;
|
id_temp = utils::strdup(id_new);
|
||||||
id_temp = new char[n];
|
|
||||||
strcpy(id_temp,id_new);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1502,7 +1502,7 @@ TEST(PairStyle, extract)
|
|||||||
if (!lmp) {
|
if (!lmp) {
|
||||||
std::cerr << "One or more prerequisite styles are not available "
|
std::cerr << "One or more prerequisite styles are not available "
|
||||||
"in this LAMMPS configuration:\n";
|
"in this LAMMPS configuration:\n";
|
||||||
for (auto prerequisite : test_config.prerequisites) {
|
for (const auto &prerequisite : test_config.prerequisites) {
|
||||||
std::cerr << prerequisite.first << "_style " << prerequisite.second << "\n";
|
std::cerr << prerequisite.first << "_style " << prerequisite.second << "\n";
|
||||||
}
|
}
|
||||||
GTEST_SKIP();
|
GTEST_SKIP();
|
||||||
|
|||||||
Reference in New Issue
Block a user