simplify/optimize code

This commit is contained in:
Axel Kohlmeyer
2021-09-15 16:09:30 -04:00
parent a8220a8502
commit 3caa066c28
3 changed files with 40 additions and 60 deletions

View File

@ -187,20 +187,20 @@ void AtomVecHybrid::process_args(int narg, char **arg)
// save concat_grow to check for duplicates of special-case fields
char *concat_grow;;
char *null = nullptr;
char *dummyptr = nullptr;
fields_grow = merge_fields(0,fields_grow,1,concat_grow);
fields_copy = merge_fields(1,fields_copy,0,null);
fields_comm = merge_fields(2,fields_comm,0,null);
fields_comm_vel = merge_fields(3,fields_comm_vel,0,null);
fields_reverse = merge_fields(4,fields_reverse,0,null);
fields_border = merge_fields(5,fields_border,0,null);
fields_border_vel = merge_fields(6,fields_border_vel,0,null);
fields_exchange = merge_fields(7,fields_exchange,0,null);
fields_restart = merge_fields(8,fields_restart,0,null);
fields_create = merge_fields(9,fields_create,0,null);
fields_data_atom = merge_fields(10,fields_data_atom,0,null);
fields_data_vel = merge_fields(11,fields_data_vel,0,null);
fields_copy = merge_fields(1,fields_copy,0,dummyptr);
fields_comm = merge_fields(2,fields_comm,0,dummyptr);
fields_comm_vel = merge_fields(3,fields_comm_vel,0,dummyptr);
fields_reverse = merge_fields(4,fields_reverse,0,dummyptr);
fields_border = merge_fields(5,fields_border,0,dummyptr);
fields_border_vel = merge_fields(6,fields_border_vel,0,dummyptr);
fields_exchange = merge_fields(7,fields_exchange,0,dummyptr);
fields_restart = merge_fields(8,fields_restart,0,dummyptr);
fields_create = merge_fields(9,fields_create,0,dummyptr);
fields_data_atom = merge_fields(10,fields_data_atom,0,dummyptr);
fields_data_vel = merge_fields(11,fields_data_vel,0,dummyptr);
fields_allocated = 1;
@ -545,56 +545,38 @@ void AtomVecHybrid::pack_property_atom(int multiindex, double *buf,
char *AtomVecHybrid::merge_fields(int inum, char *root,
int concat_flag, char *&concat_str)
{
// create concatenated string of length size from root + all substyles
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);
// create vector with all words combined
std::string concat;
if (root) concat += root;
for (int k = 0; k < nstyles; k++) {
if (strlen(concat)) strcat(concat," ");
strcat(concat,fieldstrings[k].fstr[inum]);
if (concat.size() > 0) concat += " ";
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
std::vector<std::string> words = Tokenizer(concat, " ").as_vector();
int nwords = words.size();
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;
// create final concatenated, deduped string
concat.clear();
for (auto &d : dedup) {
concat += d;
concat += " ";
}
// construct a new deduped string
char *dedup = new char[size];
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;
// remove trailing blank
if (concat.size() > 0) concat.pop_back();
return utils::strdup(concat);
}
/* ----------------------------------------------------------------------

View File

@ -351,7 +351,5 @@ void ComputePressure::virial_compute(int n, int ndiag)
void ComputePressure::reset_extra_compute_fix(const char *id_new)
{
delete [] id_temp;
int n = strlen(id_new) + 1;
id_temp = new char[n];
strcpy(id_temp,id_new);
id_temp = utils::strdup(id_new);
}

View File

@ -1502,7 +1502,7 @@ TEST(PairStyle, extract)
if (!lmp) {
std::cerr << "One or more prerequisite styles are not available "
"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";
}
GTEST_SKIP();