diff --git a/src/ML-IAP/mliap_descriptor_snap.cpp b/src/ML-IAP/mliap_descriptor_snap.cpp index a914e523e2..dd9bf5d812 100644 --- a/src/ML-IAP/mliap_descriptor_snap.cpp +++ b/src/ML-IAP/mliap_descriptor_snap.cpp @@ -24,6 +24,7 @@ #include "mliap_data.h" #include "pair_mliap.h" #include "sna.h" +#include "tokenizer.h" #include #include @@ -402,59 +403,43 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename) // strip comment, skip line if blank - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + if ((ptr = strchr(line, '#'))) *ptr = '\0'; - // words = ptrs to all words in line // strip single and double quotes from words + Tokenizer words(line, "\"' \t\n\t\f"); + if (words.count() == 0) continue; - char* keywd = strtok(line,"' \t\n\r\f"); - char* keyval = strtok(nullptr,"' \t\n\r\f"); + auto keywd = words.next(); // check for keywords with one value per element - if (strcmp(keywd,"elems") == 0 || - strcmp(keywd,"radelems") == 0 || - strcmp(keywd,"welems") == 0 || - strcmp(keywd,"rinnerelems") == 0 || - strcmp(keywd,"drinnerelems") == 0) { + if ((keywd == "elems") || (keywd == "radelems") || (keywd == "welems") || + (keywd == "rinnerelems") || (keywd == "drinnerelems")) { - if (nelementsflag == 0 || nwords != nelements+1) - error->all(FLERR,"Incorrect SNAP parameter file"); + if ((nelementsflag == 0) || (words.count() != nelements + 1)) + error->all(FLERR, "Incorrect SNAP parameter file"); - if (comm->me == 0) - utils::logmesg(lmp,"SNAP keyword {} {} ... \n", keywd, keyval); + if (comm->me == 0) utils::logmesg(lmp, "SNAP keyword {} \n", utils::trim(line)); - if (strcmp(keywd,"elems") == 0) { - for (int ielem = 0; ielem < nelements; ielem++) { - elements[ielem] = utils::strdup(keyval); - keyval = strtok(nullptr,"' \t\n\r\f"); - } + if (keywd == "elems") { + for (int ielem = 0; ielem < nelements; ielem++) + elements[ielem] = utils::strdup(words.next()); elementsflag = 1; - } else if (strcmp(keywd,"radelems") == 0) { - for (int ielem = 0; ielem < nelements; ielem++) { - radelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); - keyval = strtok(nullptr,"' \t\n\r\f"); - } + } else if (keywd == "radelems") { + for (int ielem = 0; ielem < nelements; ielem++) + radelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp); radelemflag = 1; - } else if (strcmp(keywd,"welems") == 0) { - for (int ielem = 0; ielem < nelements; ielem++) { - wjelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); - keyval = strtok(nullptr,"' \t\n\r\f"); - } + } else if (keywd == "welems") { + for (int ielem = 0; ielem < nelements; ielem++) + wjelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp); wjelemflag = 1; - } else if (strcmp(keywd,"rinnerelems") == 0) { - for (int ielem = 0; ielem < nelements; ielem++) { - rinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); - keyval = strtok(nullptr,"' \t\n\r\f"); - } + } else if (keywd == "rinnerelems") { + for (int ielem = 0; ielem < nelements; ielem++) + rinnerelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp); rinnerflag = 1; - } else if (strcmp(keywd,"drinnerelems") == 0) { - for (int ielem = 0; ielem < nelements; ielem++) { - drinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); - keyval = strtok(nullptr,"' \t\n\r\f"); - } + } else if (keywd == "drinnerelems") { + for (int ielem = 0; ielem < nelements; ielem++) + drinnerelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp); rinnerflag = 1; } @@ -462,44 +447,43 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename) // all other keywords take one value - if (nwords != 2) - error->all(FLERR,"Incorrect SNAP parameter file"); + if (words.count() != 2) error->all(FLERR, "Incorrect SNAP parameter file"); - if (comm->me == 0) - utils::logmesg(lmp,"SNAP keyword {} {} \n", keywd, keyval); + auto keyval = words.next(); + if (comm->me == 0) utils::logmesg(lmp, "SNAP keyword {} {} \n", keywd, keyval); - if (strcmp(keywd,"nelems") == 0) { - nelements = utils::inumeric(FLERR,keyval,false,lmp); - elements = new char*[nelements]; - memory->create(radelem,nelements,"mliap_snap_descriptor:radelem"); - memory->create(wjelem,nelements,"mliap_snap_descriptor:wjelem"); - memory->create(rinnerelem,nelements,"mliap_snap_descriptor:rinner"); - memory->create(drinnerelem,nelements,"mliap_snap_descriptor:drinner"); + if (keywd == "nelems") { + nelements = utils::inumeric(FLERR, keyval, false, lmp); + elements = new char *[nelements]; + memory->create(radelem, nelements, "mliap_snap_descriptor:radelem"); + memory->create(wjelem, nelements, "mliap_snap_descriptor:wjelem"); + memory->create(rinnerelem, nelements, "mliap_snap_descriptor:rinner"); + memory->create(drinnerelem, nelements, "mliap_snap_descriptor:drinner"); nelementsflag = 1; - } else if (strcmp(keywd,"rcutfac") == 0) { - rcutfac = utils::numeric(FLERR,keyval,false,lmp); + } else if (keywd == "rcutfac") { + rcutfac = utils::numeric(FLERR, keyval, false, lmp); rcutfacflag = 1; - } else if (strcmp(keywd,"twojmax") == 0) { - twojmax = utils::inumeric(FLERR,keyval,false,lmp); + } else if (keywd == "twojmax") { + twojmax = utils::inumeric(FLERR, keyval, false, lmp); twojmaxflag = 1; - } else if (strcmp(keywd,"rfac0") == 0) - rfac0 = utils::numeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"rmin0") == 0) - rmin0 = utils::numeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"switchflag") == 0) - switchflag = utils::inumeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"bzeroflag") == 0) - bzeroflag = utils::inumeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"chemflag") == 0) - chemflag = utils::inumeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"bnormflag") == 0) - bnormflag = utils::inumeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"wselfallflag") == 0) - wselfallflag = utils::inumeric(FLERR,keyval,false,lmp); - else if (strcmp(keywd,"switchinnerflag") == 0) - switchinnerflag = utils::inumeric(FLERR,keyval,false,lmp); + } else if (keywd == "rfac0") + rfac0 = utils::numeric(FLERR, keyval, false, lmp); + else if (keywd == "rmin0") + rmin0 = utils::numeric(FLERR, keyval, false, lmp); + else if (keywd == "switchflag") + switchflag = utils::inumeric(FLERR, keyval, false, lmp); + else if (keywd == "bzeroflag") + bzeroflag = utils::inumeric(FLERR, keyval, false, lmp); + else if (keywd == "chemflag") + chemflag = utils::inumeric(FLERR, keyval, false, lmp); + else if (keywd == "bnormflag") + bnormflag = utils::inumeric(FLERR, keyval, false, lmp); + else if (keywd == "wselfallflag") + wselfallflag = utils::inumeric(FLERR, keyval, false, lmp); + else if (keywd == "switchinnerflag") + switchinnerflag = utils::inumeric(FLERR, keyval, false, lmp); else - error->all(FLERR,"Incorrect SNAP parameter file"); + error->all(FLERR, "Incorrect SNAP parameter file"); } } diff --git a/src/ML-IAP/mliap_model_nn.cpp b/src/ML-IAP/mliap_model_nn.cpp index 24fddda766..f068b07283 100644 --- a/src/ML-IAP/mliap_model_nn.cpp +++ b/src/ML-IAP/mliap_model_nn.cpp @@ -33,8 +33,8 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -MLIAPModelNN::MLIAPModelNN(LAMMPS* lmp, char* coefffilename) : - MLIAPModel(lmp, coefffilename) +MLIAPModelNN::MLIAPModelNN(LAMMPS* _lmp, char* coefffilename) : + MLIAPModel(_lmp, coefffilename) { nnodes = nullptr; activation = nullptr; @@ -73,8 +73,8 @@ void MLIAPModelNN::read_coeffs(char *coefffilename) if (comm->me == 0) { fpcoeff = utils::open_potential(coefffilename,lmp,nullptr); if (fpcoeff == nullptr) - error->one(FLERR,"Cannot open MLIAPModel coeff file {}: {}", - coefffilename,utils::getsyserror()); + error->one(FLERR,"Cannot open MLIAPModel coeff file {}: {}", coefffilename, + utils::getsyserror()); } char line[MAXLINE], *ptr, *tstr; @@ -111,8 +111,7 @@ void MLIAPModelNN::read_coeffs(char *coefffilename) nelements = coeffs.next_int(); nparams = coeffs.next_int(); } catch (TokenizerException &e) { - error->all(FLERR,"Incorrect format in MLIAPModel coefficient " - "file: {}",e.what()); + error->all(FLERR,"Incorrect format in MLIAPModel coefficient file: {}",e.what()); } // set up coeff lists @@ -141,70 +140,73 @@ void MLIAPModelNN::read_coeffs(char *coefffilename) // strip comment, skip line if blank if ((ptr = strchr(line,'#'))) *ptr = '\0'; + nwords = utils::trim_and_count_words(line); if (nwords == 0) continue; + ValueTokenizer values(line, "\"' \t\n\t\f"); if (stats == 0) { // Header NET - tstr = strtok(line,"' \t\n\r\f"); - if (strncmp(tstr, "NET", 3) != 0) error->all(FLERR,"Incorrect format in MLIAPModel coefficient file"); + auto tstr = values.next_string(); + if (tstr.substr(0,3) != "NET") + error->all(FLERR,"Incorrect format in MLIAPModel coefficient file"); - ndescriptors = atoi(strtok(nullptr,"' \t\n\r\f")); - nlayers = atoi(strtok(nullptr,"' \t\n\r\f")); + ndescriptors = values.next_int(); + nlayers = values.next_int(); memory->create(activation,nlayers,"mliap_model:activation"); memory->create(nnodes,nlayers,"mliap_model:nnodes"); memory->create(scale,nelements,2,ndescriptors,"mliap_model:scale"); for (int ilayer = 0; ilayer < nlayers; ilayer++) { - tstr = strtok(nullptr,"' \t\n\r\f"); - nnodes[ilayer] = atoi(strtok(nullptr,"' \t\n\r\f")); + tstr = values.next_string(); + nnodes[ilayer] = values.next_int(); - if (strncmp(tstr, "linear", 6) == 0) activation[ilayer] = 0; - else if (strncmp(tstr, "sigmoid", 7) == 0) activation[ilayer] = 1; - else if (strncmp(tstr, "tanh", 4) == 0) activation[ilayer] = 2; - else if (strncmp(tstr, "relu", 4) == 0) activation[ilayer] = 3; + if (tstr == "linear") activation[ilayer] = 0; + else if (tstr == "sigmoid") activation[ilayer] = 1; + else if (tstr == "tanh") activation[ilayer] = 2; + else if (tstr == "relu") activation[ilayer] = 3; else activation[ilayer] = 4; } stats = 1; } else if (stats == 1) { - scale[ielem][0][l] = atof(strtok(line,"' \t\n\r\f")); - for (int icoeff = 1; icoeff < nwords; icoeff++) { - scale[ielem][0][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); - } - l += nwords; - if (l == ndescriptors) { - stats = 2; - l = 0; - } + scale[ielem][0][l] = values.next_double(); + for (int icoeff = 1; icoeff < nwords; icoeff++) { + scale[ielem][0][l+icoeff] = values.next_double(); + } + l += nwords; + if (l == ndescriptors) { + stats = 2; + l = 0; + } } else if (stats == 2) { - scale[ielem][1][l] = atof(strtok(line,"' \t\n\r\f")); - for (int icoeff = 1; icoeff < nwords; icoeff++) { - scale[ielem][1][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); - } - l += nwords; - if (l == ndescriptors) { - stats = 3; - l = 0; - } + scale[ielem][1][l] = values.next_double(); + for (int icoeff = 1; icoeff < nwords; icoeff++) { + scale[ielem][1][l+icoeff] = values.next_double(); + } + l += nwords; + if (l == ndescriptors) { + stats = 3; + l = 0; + } - // set up coeff lists + // set up coeff lists } else if (stats == 3) { - if (nwords > 30) error->all(FLERR,"Incorrect format in MLIAPModel coefficient file"); + if (nwords > 30) error->all(FLERR,"Incorrect format in MLIAPModel coefficient file"); - coeffelem[ielem][l] = atof(strtok(line,"' \t\n\r\f")); - for (int icoeff = 1; icoeff < nwords; icoeff++) { - coeffelem[ielem][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); - } - l += nwords; - if (l == nparams) { - stats = 1; - l = 0; - ielem++; - } + coeffelem[ielem][l] = values.next_double(); + for (int icoeff = 1; icoeff < nwords; icoeff++) { + coeffelem[ielem][l+icoeff] = values.next_double(); + } + l += nwords; + if (l == nparams) { + stats = 1; + l = 0; + ielem++; + } } } }