process "shake:atoms" and "shake:types" sections in JSON data
This commit is contained in:
190
src/molecule.cpp
190
src/molecule.cpp
@ -1407,62 +1407,177 @@ void Molecule::from_json(const std::string &molid, const json &moldata)
|
|||||||
|
|
||||||
// shake_atoms
|
// shake_atoms
|
||||||
|
|
||||||
|
#define APPLY_SHAKE_ATOMS(ncols) \
|
||||||
|
if (c[1].size() != ncols) \
|
||||||
|
error->all(FLERR, Error::NOLASTLINE, \
|
||||||
|
"Molecule template {}: invalid number of items for atom-id {} in \"shake:" \
|
||||||
|
"atoms\" section of molecue JSON data ({} vs {})", \
|
||||||
|
id, iatom + 1, c[1].size(), ncols); \
|
||||||
|
for (int i = 0; i < ncols; ++i) { \
|
||||||
|
if (!c[1][i].is_number_integer()) \
|
||||||
|
error->all(FLERR, Error::NOLASTLINE, \
|
||||||
|
"Molecule template {}: invalid atom-id {} in atom-id-list for atom {} " \
|
||||||
|
"in \"shake:atoms\" section of molecule JSON data", \
|
||||||
|
id, to_string(c[1][i]), iatom + 1); \
|
||||||
|
shake_atom[iatom][i] = int(c[1][i]); \
|
||||||
|
}
|
||||||
|
|
||||||
if (shakeatomflag) {
|
if (shakeatomflag) {
|
||||||
const auto &shakedata = moldata["shake"]["atoms"];
|
const auto &shakedata = moldata["shake"]["atoms"];
|
||||||
secfmt.clear();
|
secfmt.clear();
|
||||||
for (int i = 0; i < 2; ++i) secfmt.push_back(shakedata["format"][i]);
|
for (int i = 0; i < 2; ++i) secfmt.push_back(shakedata["format"][i]);
|
||||||
if ((secfmt[0] == "atom-id") && (secfmt[1] == "atom-id-list")) {
|
if ((secfmt[0] == "atom-id") && (secfmt[1] == "atom-id-list")) {
|
||||||
|
|
||||||
for (int i = 0; i < natoms; i++) shake_flag[i] = -1;
|
|
||||||
memset(count, 0, natoms * sizeof(int));
|
memset(count, 0, natoms * sizeof(int));
|
||||||
for (const auto &c : shakedata["data"]) {
|
for (const auto &c : shakedata["data"]) {
|
||||||
if (c.size() < 2)
|
if (c.size() < 2)
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
"Molecule template {}: missing data in \"shake:flags\" section of molecule "
|
"Molecule template {}: missing data in \"shake:atoms\" section of molecule "
|
||||||
"JSON data: {}",
|
"JSON data: {}",
|
||||||
id, to_string(c));
|
id, to_string(c));
|
||||||
if (!c[0].is_number_integer())
|
if (!c[0].is_number_integer())
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
"Molecule template {}: invalid atom-id in \"shake:flags\" section of molecule "
|
"Molecule template {}: invalid atom-id in \"shake:atoms\" section of molecule "
|
||||||
"JSON data: {}",
|
"JSON data: {}",
|
||||||
id, to_string(c[0]));
|
id, to_string(c[0]));
|
||||||
|
|
||||||
const int iatom = int(c[0]) - 1;
|
const int iatom = int(c[0]) - 1;
|
||||||
if ((iatom < 0) || (iatom >= natoms))
|
if ((iatom < 0) || (iatom >= natoms))
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
"Molecule template {}: invalid atom-id {} in \"shake:flags\" section of "
|
"Molecule template {}: invalid atom-id {} in \"shake:atoms\" section of "
|
||||||
"molecule JSON data",
|
"molecule JSON data",
|
||||||
id, iatom + 1);
|
id, iatom + 1);
|
||||||
if (!c[1].is_number_integer())
|
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
switch (shake_flag[iatom]) {
|
||||||
"Molecule template {}: invalid flag in \"shake:flags\" section of "
|
case 1:
|
||||||
"molecule JSON data: {}",
|
APPLY_SHAKE_ATOMS(3);
|
||||||
id, to_string(c[1]));
|
break;
|
||||||
shake_flag[iatom] = int(c[1]);
|
case 2:
|
||||||
|
APPLY_SHAKE_ATOMS(2);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
APPLY_SHAKE_ATOMS(3);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
APPLY_SHAKE_ATOMS(4);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
APPLY_SHAKE_ATOMS(0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: Unsupported Shake flag {} for "
|
||||||
|
" atom {} in \"shake:atoms\" section of molecule JSON data",
|
||||||
|
id, shake_flag[iatom], iatom + 1);
|
||||||
|
}
|
||||||
count[iatom]++;
|
count[iatom]++;
|
||||||
}
|
}
|
||||||
// checks
|
// checks
|
||||||
for (int i = 0; i < natoms; i++) {
|
for (int i = 0; i < natoms; i++) {
|
||||||
if (count[i] == 0) {
|
if (count[i] == 0)
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
"Molecule template {}: atom {} missing in \"shake:flags\" JSON section", id,
|
"Molecule template {}: atom {} missing in \"shake:atoms\" JSON section", id,
|
||||||
i + 1);
|
i + 1);
|
||||||
}
|
|
||||||
if ((shake_flag[i] < 0) || (shake_flag[i] > 4))
|
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
|
||||||
"Molecule template {}: invalid flag value {} in \"shake:flags\" section of "
|
|
||||||
"molecule JSON data",
|
|
||||||
id, shake_flag[i]);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error->all(FLERR, Error::NOLASTLINE,
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
"Molecule template {}: Expected \"shake:flags\" format [\"atom-id\",\"mass\"] but "
|
"Molecule template {}: Expected \"shake:atoms\" format "
|
||||||
"found [\"{}\",\"{}\"]",
|
"[\"atom-id\",\"atom-id-list\"] but found [\"{}\",\"{}\"]",
|
||||||
id, secfmt[0], secfmt[1]);
|
id, secfmt[0], secfmt[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#undef APPLY_SHAKE_ATOMS
|
||||||
|
|
||||||
// shake_bond_types
|
// shake_bond_types
|
||||||
if (shaketypeflag) {}
|
|
||||||
|
#define SET_SHAKE_TYPE(type, idx, ncols, offset) \
|
||||||
|
if (c[1].size() < ncols) \
|
||||||
|
error->all(FLERR, Error::NOLASTLINE, \
|
||||||
|
"Molecule template {}: invalid number of items for atom-id {} in \"shake:" \
|
||||||
|
"types\" section of molecue JSON data ({} vs {})", \
|
||||||
|
id, iatom + 1, c[1].size(), ncols); \
|
||||||
|
if (c[1][idx].is_number_integer()) { \
|
||||||
|
shake_type[iatom][idx] = int(c[1][idx]) + offset; \
|
||||||
|
} else { \
|
||||||
|
char *subst = utils::expand_type(FLERR, c[1][idx], type, lmp); \
|
||||||
|
if (subst) { \
|
||||||
|
shake_type[iatom][idx] = utils::inumeric(FLERR, subst, false, lmp); \
|
||||||
|
delete[] subst; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shaketypeflag) {
|
||||||
|
const auto &shakedata = moldata["shake"]["types"];
|
||||||
|
secfmt.clear();
|
||||||
|
for (int i = 0; i < 2; ++i) secfmt.push_back(shakedata["format"][i]);
|
||||||
|
if ((secfmt[0] == "atom-id") && (secfmt[1] == "type-list")) {
|
||||||
|
|
||||||
|
memset(count, 0, natoms * sizeof(int));
|
||||||
|
for (const auto &c : shakedata["data"]) {
|
||||||
|
if (c.size() < 2)
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: missing data in \"shake:types\" section of molecule "
|
||||||
|
"JSON data: {}",
|
||||||
|
id, to_string(c));
|
||||||
|
if (!c[0].is_number_integer())
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: invalid atom-id in \"shake:types\" section of molecule "
|
||||||
|
"JSON data: {}",
|
||||||
|
id, to_string(c[0]));
|
||||||
|
|
||||||
|
const int iatom = int(c[0]) - 1;
|
||||||
|
if ((iatom < 0) || (iatom >= natoms))
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: invalid atom-id {} in \"shake:types\" section of "
|
||||||
|
"molecule JSON data",
|
||||||
|
id, iatom + 1);
|
||||||
|
|
||||||
|
switch (shake_flag[iatom]) {
|
||||||
|
case 1:
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 0, 3, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 1, 3, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::ANGLE, 2, 3, aoffset);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 0, 2, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 1, 2, boffset);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 0, 3, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 1, 3, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 2, 3, boffset);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 0, 4, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 1, 4, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 2, 4, boffset);
|
||||||
|
SET_SHAKE_TYPE(Atom::BOND, 3, 4, boffset);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: Unsupported Shake flag {} for "
|
||||||
|
" atom {} in \"shake:atoms\" section of molecule JSON data",
|
||||||
|
id, shake_flag[iatom], iatom + 1);
|
||||||
|
}
|
||||||
|
count[iatom]++;
|
||||||
|
}
|
||||||
|
// checks
|
||||||
|
for (int i = 0; i < natoms; i++) {
|
||||||
|
if (count[i] == 0)
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: atom {} missing in \"shake:atoms\" JSON section", id,
|
||||||
|
i + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
error->all(FLERR, Error::NOLASTLINE,
|
||||||
|
"Molecule template {}: Expected \"shake:atoms\" format "
|
||||||
|
"[\"atom-id\",\"atom-id-list\"] but found [\"{}\",\"{}\"]",
|
||||||
|
id, secfmt[0], secfmt[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#undef SET_SHAKE_TYPE
|
||||||
|
|
||||||
// body_integers
|
// body_integers
|
||||||
// body_doubles
|
// body_doubles
|
||||||
@ -3147,7 +3262,12 @@ void Molecule::shaketype_read(char *line)
|
|||||||
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
nwant = 2;
|
subst = utils::expand_type(FLERR, values[2], Atom::BOND, lmp);
|
||||||
|
if (subst) values[2] = subst;
|
||||||
|
shake_type[iatom][1] = utils::inumeric(FLERR, values[2], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
|
delete[] subst;
|
||||||
|
|
||||||
|
nwant = 3;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
@ -3156,12 +3276,17 @@ void Molecule::shaketype_read(char *line)
|
|||||||
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
subst = utils::expand_type(FLERR, values[1], Atom::BOND, lmp);
|
subst = utils::expand_type(FLERR, values[2], Atom::BOND, lmp);
|
||||||
if (subst) values[1] = subst;
|
if (subst) values[2] = subst;
|
||||||
shake_type[iatom][1] = utils::inumeric(FLERR, values[2], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][1] = utils::inumeric(FLERR, values[2], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
nwant = 3;
|
subst = utils::expand_type(FLERR, values[1], Atom::BOND, lmp);
|
||||||
|
if (subst) values[3] = subst;
|
||||||
|
shake_type[iatom][2] = utils::inumeric(FLERR, values[3], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
|
delete[] subst;
|
||||||
|
|
||||||
|
nwant = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
@ -3170,17 +3295,22 @@ void Molecule::shaketype_read(char *line)
|
|||||||
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][0] = utils::inumeric(FLERR, values[1], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
subst = utils::expand_type(FLERR, values[1], Atom::BOND, lmp);
|
subst = utils::expand_type(FLERR, values[2], Atom::BOND, lmp);
|
||||||
if (subst) values[1] = subst;
|
if (subst) values[2] = subst;
|
||||||
shake_type[iatom][1] = utils::inumeric(FLERR, values[2], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][1] = utils::inumeric(FLERR, values[2], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
subst = utils::expand_type(FLERR, values[1], Atom::BOND, lmp);
|
subst = utils::expand_type(FLERR, values[3], Atom::BOND, lmp);
|
||||||
if (subst) values[1] = subst;
|
if (subst) values[3] = subst;
|
||||||
shake_type[iatom][2] = utils::inumeric(FLERR, values[3], false, lmp) + ((subst) ? 0 : boffset);
|
shake_type[iatom][2] = utils::inumeric(FLERR, values[3], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
delete[] subst;
|
delete[] subst;
|
||||||
|
|
||||||
nwant = 4;
|
subst = utils::expand_type(FLERR, values[4], Atom::BOND, lmp);
|
||||||
|
if (subst) values[4] = subst;
|
||||||
|
shake_type[iatom][3] = utils::inumeric(FLERR, values[4], false, lmp) + ((subst) ? 0 : boffset);
|
||||||
|
delete[] subst;
|
||||||
|
|
||||||
|
nwant = 5;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
|||||||
@ -347,7 +347,7 @@
|
|||||||
"properties": {
|
"properties": {
|
||||||
"format": {
|
"format": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"const": ["atom-id", "bond-type-list"]
|
"const": ["atom-id", "type-list"]
|
||||||
},
|
},
|
||||||
"data": {
|
"data": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
|
|||||||
Reference in New Issue
Block a user