use tokenizer class for parsing
This commit is contained in:
@ -24,6 +24,7 @@
|
||||
#include "mliap_data.h"
|
||||
#include "pair_mliap.h"
|
||||
#include "sna.h"
|
||||
#include "tokenizer.h"
|
||||
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user