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 // 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;
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------

View File

@ -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);
} }

View File

@ -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();