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 "pair_mliap.h"
#include "sna.h"
#include "tokenizer.h"
#include <cmath>
#include <cstring>
@ -403,58 +404,42 @@ 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;
// 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)
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,13 +447,12 @@ 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) {
if (keywd == "nelems") {
nelements = utils::inumeric(FLERR, keyval, false, lmp);
elements = new char *[nelements];
memory->create(radelem, nelements, "mliap_snap_descriptor:radelem");
@ -476,27 +460,27 @@ void MLIAPDescriptorSNAP::read_paramfile(char *paramfilename)
memory->create(rinnerelem, nelements, "mliap_snap_descriptor:rinner");
memory->create(drinnerelem, nelements, "mliap_snap_descriptor:drinner");
nelementsflag = 1;
} else if (strcmp(keywd,"rcutfac") == 0) {
} else if (keywd == "rcutfac") {
rcutfac = utils::numeric(FLERR, keyval, false, lmp);
rcutfacflag = 1;
} else if (strcmp(keywd,"twojmax") == 0) {
} else if (keywd == "twojmax") {
twojmax = utils::inumeric(FLERR, keyval, false, lmp);
twojmaxflag = 1;
} else if (strcmp(keywd,"rfac0") == 0)
} else if (keywd == "rfac0")
rfac0 = utils::numeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"rmin0") == 0)
else if (keywd == "rmin0")
rmin0 = utils::numeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"switchflag") == 0)
else if (keywd == "switchflag")
switchflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"bzeroflag") == 0)
else if (keywd == "bzeroflag")
bzeroflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"chemflag") == 0)
else if (keywd == "chemflag")
chemflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"bnormflag") == 0)
else if (keywd == "bnormflag")
bnormflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"wselfallflag") == 0)
else if (keywd == "wselfallflag")
wselfallflag = utils::inumeric(FLERR, keyval, false, lmp);
else if (strcmp(keywd,"switchinnerflag") == 0)
else if (keywd == "switchinnerflag")
switchinnerflag = utils::inumeric(FLERR, keyval, false, lmp);
else
error->all(FLERR, "Incorrect SNAP parameter file");

View File

@ -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,37 +140,40 @@ 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"));
scale[ielem][0][l] = values.next_double();
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;
if (l == ndescriptors) {
@ -180,9 +182,9 @@ void MLIAPModelNN::read_coeffs(char *coefffilename)
}
} 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++) {
scale[ielem][1][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f"));
scale[ielem][1][l+icoeff] = values.next_double();
}
l += nwords;
if (l == ndescriptors) {
@ -195,9 +197,9 @@ void MLIAPModelNN::read_coeffs(char *coefffilename)
} else if (stats == 3) {
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++) {
coeffelem[ielem][l+icoeff] = atof(strtok(nullptr,"' \t\n\r\f"));
coeffelem[ielem][l+icoeff] = values.next_double();
}
l += nwords;
if (l == nparams) {