implement the processing for special bonds in JSON

This commit is contained in:
Axel Kohlmeyer
2025-06-21 12:59:15 -04:00
parent 0caaca8a05
commit 9360038013

View File

@ -1494,34 +1494,60 @@ void Molecule::from_json(const std::string &molid, const json &moldata)
"[\"atom-id\",\"n12\",\"n13\",\"n14\"] but found [\"{}\",\"{}\",\"{}\",\"{}\"]",
id, secfmt[0], secfmt[1], secfmt[2], secfmt[3]);
}
#if 0
if (moldata["special"].contains("bonds")) {
specialflag = tag_require = 1;
const auto &specialbonds = moldata["special"]["bonds"];
if (!specialbonds.contains("format"))
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: JSON molecule data does not contain required \"format\" "
"field for \"special:bonds\"",
id);
if (specialbonds.contains("data")) {
if (specialbonds["data"].size() != natoms)
error->all(
FLERR, Error::NOLASTLINE,
"Molecule template {}: Found {} instead of {} data entries for \"special:bonds\"", id,
specialbonds["data"].size(), natoms);
} else {
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: JSON molecule data does not contain required \"data\" "
"field for \"special:bonds\"",
id);
// process bonds
const auto &specialbonds = moldata["special"]["bonds"];
secfmt.clear();
for (int i = 0; i < 2; ++i) secfmt.push_back(specialbonds["format"][i]);
if ((secfmt[0] == "atom-id") && (secfmt[1] == "atom-id-list")) {
memset(count, 0, natoms * sizeof(int));
for (int i = 0; i < natoms; ++i) {
if (!specialbonds["data"][i][0].is_number_integer())
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: invalid atom-id {} for entry {} in \"special:bonds\" "
"section of molecule JSON data",
id, to_string(specialbonds["data"][i][0]), i + 1);
const int iatom = int(specialbonds["data"][i][0]);
if ((iatom < 0) || (iatom >= natoms))
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: invalid atom-id {} in \"special:bondss\" section of "
"molecule JSON data",
id, iatom + 1);
int m = 0;
for (const auto &item : specialbonds["data"][i][1]) {
if (!item.is_number_integer())
error->all(
FLERR, Error::NOLASTLINE,
"Molecule template {}: invalid data in \"special:bonds\" section of molecule "
"JSON data: {}",
id, to_string(specialbonds["data"][i][1]));
tagint ival = tagint(item);
if ((ival <= 0) || (ival > natoms) || (ival == iatom + 1))
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: invalid atom index {} in \"special:bonds\" section "
"of JSON data",
id, ival);
special[iatom][m++] = tagint(item);
}
count[iatom]++;
}
// check
for (int i = 0; i < natoms; i++) {
if (count[i] == 0) {
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: atom {} missing in \"special:bonds\" JSON section", id,
i + 1);
}
}
} else {
error->all(FLERR, Error::NOLASTLINE,
"Molecule template {}: JSON molecule data does not contain required \"bonds\" "
"field for \"special\"",
id);
"Molecule template {}: Expected \"special:bonds\" format "
"[\"atom-id\",\"atom-id-list\"] but found [\"{}\",\"{}\"]",
id, secfmt[0], secfmt[1]);
}
#endif
}
// shake settings