use tokenizer class for parsing

This commit is contained in:
Axel Kohlmeyer
2022-03-14 16:53:27 -04:00
parent 1d1dea56d8
commit ec97d859b9
2 changed files with 104 additions and 118 deletions

View File

@ -24,6 +24,7 @@
#include "mliap_data.h" #include "mliap_data.h"
#include "pair_mliap.h" #include "pair_mliap.h"
#include "sna.h" #include "sna.h"
#include "tokenizer.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
@ -402,59 +403,43 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename)
// strip comment, skip line if blank // strip comment, skip line if blank
if ((ptr = strchr(line,'#'))) *ptr = '\0'; if ((ptr = strchr(line, '#'))) *ptr = '\0';
nwords = utils::count_words(line);
if (nwords == 0) continue;
// words = ptrs to all words in line
// strip single and double quotes from words // 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"); auto keywd = words.next();
char* keyval = strtok(nullptr,"' \t\n\r\f");
// check for keywords with one value per element // check for keywords with one value per element
if (strcmp(keywd,"elems") == 0 || if ((keywd == "elems") || (keywd == "radelems") || (keywd == "welems") ||
strcmp(keywd,"radelems") == 0 || (keywd == "rinnerelems") || (keywd == "drinnerelems")) {
strcmp(keywd,"welems") == 0 ||
strcmp(keywd,"rinnerelems") == 0 ||
strcmp(keywd,"drinnerelems") == 0) {
if (nelementsflag == 0 || nwords != nelements+1) if ((nelementsflag == 0) || (words.count() != nelements + 1))
error->all(FLERR,"Incorrect SNAP parameter file"); error->all(FLERR, "Incorrect SNAP parameter file");
if (comm->me == 0) if (comm->me == 0) utils::logmesg(lmp, "SNAP keyword {} \n", utils::trim(line));
utils::logmesg(lmp,"SNAP keyword {} {} ... \n", keywd, keyval);
if (strcmp(keywd,"elems") == 0) { if (keywd == "elems") {
for (int ielem = 0; ielem < nelements; ielem++) { for (int ielem = 0; ielem < nelements; ielem++)
elements[ielem] = utils::strdup(keyval); elements[ielem] = utils::strdup(words.next());
keyval = strtok(nullptr,"' \t\n\r\f");
}
elementsflag = 1; elementsflag = 1;
} else if (strcmp(keywd,"radelems") == 0) { } else if (keywd == "radelems") {
for (int ielem = 0; ielem < nelements; ielem++) { for (int ielem = 0; ielem < nelements; ielem++)
radelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); radelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp);
keyval = strtok(nullptr,"' \t\n\r\f");
}
radelemflag = 1; radelemflag = 1;
} else if (strcmp(keywd,"welems") == 0) { } else if (keywd == "welems") {
for (int ielem = 0; ielem < nelements; ielem++) { for (int ielem = 0; ielem < nelements; ielem++)
wjelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); wjelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp);
keyval = strtok(nullptr,"' \t\n\r\f");
}
wjelemflag = 1; wjelemflag = 1;
} else if (strcmp(keywd,"rinnerelems") == 0) { } else if (keywd == "rinnerelems") {
for (int ielem = 0; ielem < nelements; ielem++) { for (int ielem = 0; ielem < nelements; ielem++)
rinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); rinnerelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp);
keyval = strtok(nullptr,"' \t\n\r\f");
}
rinnerflag = 1; rinnerflag = 1;
} else if (strcmp(keywd,"drinnerelems") == 0) { } else if (keywd == "drinnerelems") {
for (int ielem = 0; ielem < nelements; ielem++) { for (int ielem = 0; ielem < nelements; ielem++)
drinnerelem[ielem] = utils::numeric(FLERR,keyval,false,lmp); drinnerelem[ielem] = utils::numeric(FLERR, words.next(), false, lmp);
keyval = strtok(nullptr,"' \t\n\r\f");
}
rinnerflag = 1; rinnerflag = 1;
} }
@ -462,44 +447,43 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename)
// all other keywords take one value // all other keywords take one value
if (nwords != 2) if (words.count() != 2) error->all(FLERR, "Incorrect SNAP parameter file");
error->all(FLERR,"Incorrect SNAP parameter file");
if (comm->me == 0) auto keyval = words.next();
utils::logmesg(lmp,"SNAP keyword {} {} \n", keywd, keyval); if (comm->me == 0) utils::logmesg(lmp, "SNAP keyword {} {} \n", keywd, keyval);
if (strcmp(keywd,"nelems") == 0) { if (keywd == "nelems") {
nelements = utils::inumeric(FLERR,keyval,false,lmp); nelements = utils::inumeric(FLERR, keyval, false, lmp);
elements = new char*[nelements]; elements = new char *[nelements];
memory->create(radelem,nelements,"mliap_snap_descriptor:radelem"); memory->create(radelem, nelements, "mliap_snap_descriptor:radelem");
memory->create(wjelem,nelements,"mliap_snap_descriptor:wjelem"); memory->create(wjelem, nelements, "mliap_snap_descriptor:wjelem");
memory->create(rinnerelem,nelements,"mliap_snap_descriptor:rinner"); memory->create(rinnerelem, nelements, "mliap_snap_descriptor:rinner");
memory->create(drinnerelem,nelements,"mliap_snap_descriptor:drinner"); memory->create(drinnerelem, nelements, "mliap_snap_descriptor:drinner");
nelementsflag = 1; nelementsflag = 1;
} else if (strcmp(keywd,"rcutfac") == 0) { } else if (keywd == "rcutfac") {
rcutfac = utils::numeric(FLERR,keyval,false,lmp); rcutfac = utils::numeric(FLERR, keyval, false, lmp);
rcutfacflag = 1; rcutfacflag = 1;
} else if (strcmp(keywd,"twojmax") == 0) { } else if (keywd == "twojmax") {
twojmax = utils::inumeric(FLERR,keyval,false,lmp); twojmax = utils::inumeric(FLERR, keyval, false, lmp);
twojmaxflag = 1; twojmaxflag = 1;
} else if (strcmp(keywd,"rfac0") == 0) } else if (keywd == "rfac0")
rfac0 = utils::numeric(FLERR,keyval,false,lmp); rfac0 = utils::numeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"rmin0") == 0) else if (keywd == "rmin0")
rmin0 = utils::numeric(FLERR,keyval,false,lmp); rmin0 = utils::numeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"switchflag") == 0) else if (keywd == "switchflag")
switchflag = utils::inumeric(FLERR,keyval,false,lmp); switchflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"bzeroflag") == 0) else if (keywd == "bzeroflag")
bzeroflag = utils::inumeric(FLERR,keyval,false,lmp); bzeroflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"chemflag") == 0) else if (keywd == "chemflag")
chemflag = utils::inumeric(FLERR,keyval,false,lmp); chemflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"bnormflag") == 0) else if (keywd == "bnormflag")
bnormflag = utils::inumeric(FLERR,keyval,false,lmp); bnormflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"wselfallflag") == 0) else if (keywd == "wselfallflag")
wselfallflag = utils::inumeric(FLERR,keyval,false,lmp); wselfallflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"switchinnerflag") == 0) else if (keywd == "switchinnerflag")
switchinnerflag = utils::inumeric(FLERR,keyval,false,lmp); switchinnerflag = utils::inumeric(FLERR, keyval, false, lmp);
else else
error->all(FLERR,"Incorrect SNAP parameter file"); error->all(FLERR, "Incorrect SNAP parameter file");
} }
} }

View File

@ -33,8 +33,8 @@ using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
MLIAPModelNN::MLIAPModelNN(LAMMPS* lmp, char* coefffilename) : MLIAPModelNN::MLIAPModelNN(LAMMPS* _lmp, char* coefffilename) :
MLIAPModel(lmp, coefffilename) MLIAPModel(_lmp, coefffilename)
{ {
nnodes = nullptr; nnodes = nullptr;
activation = nullptr; activation = nullptr;
@ -73,8 +73,8 @@ void MLIAPModelNN::read_coeffs(char *coefffilename)
if (comm->me == 0) { if (comm->me == 0) {
fpcoeff = utils::open_potential(coefffilename,lmp,nullptr); fpcoeff = utils::open_potential(coefffilename,lmp,nullptr);
if (fpcoeff == nullptr) if (fpcoeff == nullptr)
error->one(FLERR,"Cannot open MLIAPModel coeff file {}: {}", error->one(FLERR,"Cannot open MLIAPModel coeff file {}: {}", coefffilename,
coefffilename,utils::getsyserror()); utils::getsyserror());
} }
char line[MAXLINE], *ptr, *tstr; char line[MAXLINE], *ptr, *tstr;
@ -111,8 +111,7 @@ void MLIAPModelNN::read_coeffs(char *coefffilename)
nelements = coeffs.next_int(); nelements = coeffs.next_int();
nparams = coeffs.next_int(); nparams = coeffs.next_int();
} catch (TokenizerException &e) { } catch (TokenizerException &e) {
error->all(FLERR,"Incorrect format in MLIAPModel coefficient " error->all(FLERR,"Incorrect format in MLIAPModel coefficient file: {}",e.what());
"file: {}",e.what());
} }
// set up coeff lists // set up coeff lists
@ -141,70 +140,73 @@ void MLIAPModelNN::read_coeffs(char *coefffilename)
// strip comment, skip line if blank // strip comment, skip line if blank
if ((ptr = strchr(line,'#'))) *ptr = '\0'; if ((ptr = strchr(line,'#'))) *ptr = '\0';
nwords = utils::trim_and_count_words(line); nwords = utils::trim_and_count_words(line);
if (nwords == 0) continue; if (nwords == 0) continue;
ValueTokenizer values(line, "\"' \t\n\t\f");
if (stats == 0) { // Header NET if (stats == 0) { // Header NET
tstr = strtok(line,"' \t\n\r\f"); auto tstr = values.next_string();
if (strncmp(tstr, "NET", 3) != 0) error->all(FLERR,"Incorrect format in MLIAPModel coefficient file"); if (tstr.substr(0,3) != "NET")
error->all(FLERR,"Incorrect format in MLIAPModel coefficient file");
ndescriptors = atoi(strtok(nullptr,"' \t\n\r\f")); ndescriptors = values.next_int();
nlayers = atoi(strtok(nullptr,"' \t\n\r\f")); nlayers = values.next_int();
memory->create(activation,nlayers,"mliap_model:activation"); memory->create(activation,nlayers,"mliap_model:activation");
memory->create(nnodes,nlayers,"mliap_model:nnodes"); memory->create(nnodes,nlayers,"mliap_model:nnodes");
memory->create(scale,nelements,2,ndescriptors,"mliap_model:scale"); memory->create(scale,nelements,2,ndescriptors,"mliap_model:scale");
for (int ilayer = 0; ilayer < nlayers; ilayer++) { for (int ilayer = 0; ilayer < nlayers; ilayer++) {
tstr = strtok(nullptr,"' \t\n\r\f"); tstr = values.next_string();
nnodes[ilayer] = atoi(strtok(nullptr,"' \t\n\r\f")); nnodes[ilayer] = values.next_int();
if (strncmp(tstr, "linear", 6) == 0) activation[ilayer] = 0; if (tstr == "linear") activation[ilayer] = 0;
else if (strncmp(tstr, "sigmoid", 7) == 0) activation[ilayer] = 1; else if (tstr == "sigmoid") activation[ilayer] = 1;
else if (strncmp(tstr, "tanh", 4) == 0) activation[ilayer] = 2; else if (tstr == "tanh") activation[ilayer] = 2;
else if (strncmp(tstr, "relu", 4) == 0) activation[ilayer] = 3; else if (tstr == "relu") activation[ilayer] = 3;
else activation[ilayer] = 4; else activation[ilayer] = 4;
} }
stats = 1; stats = 1;
} else if (stats == 1) { } else if (stats == 1) {
scale[ielem][0][l] = atof(strtok(line,"' \t\n\r\f")); scale[ielem][0][l] = values.next_double();
for (int icoeff = 1; icoeff < nwords; icoeff++) { for (int icoeff = 1; icoeff < nwords; icoeff++) {
scale[ielem][0][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); scale[ielem][0][l+icoeff] = values.next_double();
} }
l += nwords; l += nwords;
if (l == ndescriptors) { if (l == ndescriptors) {
stats = 2; stats = 2;
l = 0; l = 0;
} }
} else if (stats == 2) { } else if (stats == 2) {
scale[ielem][1][l] = atof(strtok(line,"' \t\n\r\f")); scale[ielem][1][l] = values.next_double();
for (int icoeff = 1; icoeff < nwords; icoeff++) { for (int icoeff = 1; icoeff < nwords; icoeff++) {
scale[ielem][1][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); scale[ielem][1][l+icoeff] = values.next_double();
} }
l += nwords; l += nwords;
if (l == ndescriptors) { if (l == ndescriptors) {
stats = 3; stats = 3;
l = 0; l = 0;
} }
// set up coeff lists // set up coeff lists
} else if (stats == 3) { } 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")); coeffelem[ielem][l] = values.next_double();
for (int icoeff = 1; icoeff < nwords; icoeff++) { for (int icoeff = 1; icoeff < nwords; icoeff++) {
coeffelem[ielem][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f")); coeffelem[ielem][l+icoeff] = values.next_double();
} }
l += nwords; l += nwords;
if (l == nparams) { if (l == nparams) {
stats = 1; stats = 1;
l = 0; l = 0;
ielem++; ielem++;
} }
} }
} }
} }