Correct implementation to actually follow the documentation.

This commit is contained in:
Axel Kohlmeyer
2025-06-17 10:31:17 -04:00
parent 632bc8f20d
commit 635719a2ec

View File

@ -2803,16 +2803,22 @@ void Molecule::shakeflag_read(char *line)
if (values.count() != 2) error->all(FLERR, fileiarg, "Invalid Shake Flags section in molecule file"); if (values.count() != 2) error->all(FLERR, fileiarg, "Invalid Shake Flags section in molecule file");
values.next_int(); int iatom = values.next_int() - 1;
shake_flag[i] = values.next_int(); if (iatom < 0 || iatom >= natoms)
error->all(FLERR, fileiarg, "Invalid atom index in Shake Flags section of molecule file");
count[iatom]++;
shake_flag[iatom] = values.next_int();
} }
} catch (TokenizerException &e) { } catch (TokenizerException &e) {
error->all(FLERR, fileiarg, "Invalid Shake Flags section in molecule file: {}", e.what()); error->all(FLERR, fileiarg, "Invalid Shake Flags section in molecule file: {}", e.what());
} }
for (int i = 0; i < natoms; i++) for (int i = 0; i < natoms; i++) {
if (shake_flag[i] < 0 || shake_flag[i] > 4) if (shake_flag[i] < 0 || shake_flag[i] > 4)
error->all(FLERR, fileiarg, "Invalid shake flag in molecule file"); error->all(FLERR, fileiarg, "Invalid shake flag in molecule file");
if (count[i] == 0)
error->all(FLERR, fileiarg, "Atom {} missing in Shake Flags section of molecule file", i + 1);
}
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -2828,54 +2834,57 @@ void Molecule::shakeatom_read(char *line)
ValueTokenizer values(utils::trim_comment(line)); ValueTokenizer values(utils::trim_comment(line));
nmatch = values.count(); nmatch = values.count();
int iatom = values.next_int() - 1;
if ((iatom < 0) || (iatom >= natoms))
throw TokenizerException(fmt::format("Invalid atom-id {} in Shake Atoms section of "
"molecule file", iatom + 1), "");
switch (shake_flag[i]) { switch (shake_flag[iatom]) {
case 1: case 1:
values.next_int(); shake_atom[iatom][0] = values.next_tagint();
shake_atom[i][0] = values.next_tagint(); shake_atom[iatom][1] = values.next_tagint();
shake_atom[i][1] = values.next_tagint(); shake_atom[iatom][2] = values.next_tagint();
shake_atom[i][2] = values.next_tagint();
nwant = 4; nwant = 4;
break; break;
case 2: case 2:
values.next_int(); shake_atom[iatom][0] = values.next_tagint();
shake_atom[i][0] = values.next_tagint(); shake_atom[iatom][1] = values.next_tagint();
shake_atom[i][1] = values.next_tagint();
nwant = 3; nwant = 3;
break; break;
case 3: case 3:
values.next_int(); shake_atom[iatom][0] = values.next_tagint();
shake_atom[i][0] = values.next_tagint(); shake_atom[iatom][1] = values.next_tagint();
shake_atom[i][1] = values.next_tagint(); shake_atom[iatom][2] = values.next_tagint();
shake_atom[i][2] = values.next_tagint();
nwant = 4; nwant = 4;
break; break;
case 4: case 4:
values.next_int(); shake_atom[iatom][0] = values.next_tagint();
shake_atom[i][0] = values.next_tagint(); shake_atom[iatom][1] = values.next_tagint();
shake_atom[i][1] = values.next_tagint(); shake_atom[iatom][2] = values.next_tagint();
shake_atom[i][2] = values.next_tagint(); shake_atom[iatom][3] = values.next_tagint();
shake_atom[i][3] = values.next_tagint();
nwant = 5; nwant = 5;
break; break;
case 0: case 0:
values.next_int();
nwant = 1; nwant = 1;
break; break;
default: default:
error->all(FLERR, fileiarg, "Invalid shake atom in molecule file"); throw TokenizerException(
fmt::format("Unexpected Shake flag {} for atom {} in Shake flags "
"section of molecule file", shake_flag[iatom], iatom + 1), "");
} }
if (nmatch != nwant) error->all(FLERR, fileiarg, "Invalid shake atom in molecule file"); if (nmatch != nwant)
throw TokenizerException(
fmt::format("Unexpected number of atom-ids ({} vs {}) for atom {} in Shake Atoms "
"section of molecule file", nmatch, nwant, iatom + 1), "");
} }
} catch (TokenizerException &e) { } catch (TokenizerException &e) {
error->all(FLERR, fileiarg, "Invalid shake atom in molecule file: {}", e.what()); error->all(FLERR, fileiarg, "Invalid Shake Atoms section in molecule file: {}", e.what());
} }
for (int i = 0; i < natoms; i++) { for (int i = 0; i < natoms; i++) {