From 25d4b3484d83913e3825e7b9d0ef013fa02a461b Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Sun, 12 May 2024 01:00:09 -0400 Subject: [PATCH] example with augmented utils::bounds option to check for type label --- src/FEP/fix_adapt_fep.cpp | 27 ++++++--------------------- src/atom.h | 2 +- src/fix_adapt.cpp | 36 ++++++++---------------------------- src/utils.cpp | 21 +++++++++++++++------ src/utils.h | 6 ++++-- 5 files changed, 34 insertions(+), 58 deletions(-) diff --git a/src/FEP/fix_adapt_fep.cpp b/src/FEP/fix_adapt_fep.cpp index f457a12adf..e1d7376b59 100644 --- a/src/FEP/fix_adapt_fep.cpp +++ b/src/FEP/fix_adapt_fep.cpp @@ -91,20 +91,10 @@ FixAdaptFEP::FixAdaptFEP(LAMMPS *lmp, int narg, char **arg) : adapt[nadapt].which = PAIR; adapt[nadapt].pstyle = utils::strdup(arg[iarg+1]); adapt[nadapt].pparam = utils::strdup(arg[iarg+2]); - char *typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+3], Atom::ATOM, lmp); - if (typestr) - adapt[nadapt].ilo = adapt[nadapt].ihi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+3], 1, atom->ntypes, - adapt[nadapt].ilo, adapt[nadapt].ihi, error); - delete[] typestr; - typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+4], Atom::ATOM, lmp); - if (typestr) - adapt[nadapt].jlo = adapt[nadapt].jhi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+4], 1, atom->ntypes, - adapt[nadapt].jlo, adapt[nadapt].jhi, error); - delete[] typestr; + utils::bounds(FLERR, arg[iarg+3], 1, atom->ntypes, + adapt[nadapt].ilo, adapt[nadapt].ihi, error, Atom::ATOM); + utils::bounds(FLERR, arg[iarg+4], 1, atom->ntypes, + adapt[nadapt].jlo, adapt[nadapt].jhi, error, Atom::ATOM); // switch i,j if i > j, if wildcards were not used @@ -140,13 +130,8 @@ FixAdaptFEP::FixAdaptFEP(LAMMPS *lmp, int narg, char **arg) : adapt[nadapt].aparam = CHARGE; chgflag = 1; } else error->all(FLERR,"Illegal fix adapt/fep command"); - char *typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+2], Atom::ATOM, lmp); - if (typestr) - adapt[nadapt].ilo = adapt[nadapt].ihi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+2], 1, atom->ntypes, - adapt[nadapt].ilo, adapt[nadapt].ihi, error); - delete[] typestr; + utils::bounds(FLERR, arg[iarg+2], 1, atom->ntypes, + adapt[nadapt].ilo, adapt[nadapt].ihi, error, Atom::ATOM); if (utils::strmatch(arg[iarg+3],"^v_")) { adapt[nadapt].var = utils::strdup(arg[iarg+3]+2); } else error->all(FLERR,"Illegal fix adapt/fep command"); diff --git a/src/atom.h b/src/atom.h index f238b2d5b1..5d270097ca 100644 --- a/src/atom.h +++ b/src/atom.h @@ -33,7 +33,7 @@ class Atom : protected Pointers { enum { DOUBLE, INT, BIGINT }; enum { GROW = 0, RESTART = 1, BORDER = 2 }; enum { ATOMIC = 0, MOLECULAR = 1, TEMPLATE = 2 }; - enum { ATOM = 0, BOND = 1, ANGLE = 2, DIHEDRAL = 3, IMPROPER = 4 }; + enum { ATOM = 0, BOND = 1, ANGLE = 2, DIHEDRAL = 3, IMPROPER = 4, NONTYPE = 5 }; enum { NUMERIC = 0, LABELS = 1 }; enum { MAP_NONE = 0, MAP_ARRAY = 1, MAP_HASH = 2, MAP_YES = 3 }; diff --git a/src/fix_adapt.cpp b/src/fix_adapt.cpp index d68c5f368a..438d31a5f9 100644 --- a/src/fix_adapt.cpp +++ b/src/fix_adapt.cpp @@ -99,20 +99,10 @@ FixAdapt::FixAdapt(LAMMPS *lmp, int narg, char **arg) : adapt[nadapt].pair = nullptr; adapt[nadapt].pstyle = utils::strdup(arg[iarg+1]); adapt[nadapt].pparam = utils::strdup(arg[iarg+2]); - char *typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+3], Atom::ATOM, lmp); - if (typestr) - adapt[nadapt].ilo = adapt[nadapt].ihi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+3], 1, atom->ntypes, - adapt[nadapt].ilo, adapt[nadapt].ihi, error); - delete[] typestr; - typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+4], Atom::ATOM, lmp); - if (typestr) - adapt[nadapt].jlo = adapt[nadapt].jhi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+4], 1, atom->ntypes, - adapt[nadapt].jlo, adapt[nadapt].jhi, error); - delete[] typestr; + utils::bounds(FLERR, arg[iarg+3], 1, atom->ntypes, + adapt[nadapt].ilo, adapt[nadapt].ihi, error, Atom::ATOM); + utils::bounds(FLERR, arg[iarg+4], 1, atom->ntypes, + adapt[nadapt].jlo, adapt[nadapt].jhi, error, Atom::ATOM); // switch i,j if i > j, if wildcards were not used @@ -136,13 +126,8 @@ FixAdapt::FixAdapt(LAMMPS *lmp, int narg, char **arg) : adapt[nadapt].bond = nullptr; adapt[nadapt].bstyle = utils::strdup(arg[iarg+1]); adapt[nadapt].bparam = utils::strdup(arg[iarg+2]); - char *typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+3], Atom::BOND, lmp); - if (typestr) - adapt[nadapt].ilo = adapt[nadapt].ihi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+3], 1, atom->nbondtypes, - adapt[nadapt].ilo, adapt[nadapt].ihi, error); - delete[] typestr; + utils::bounds(FLERR, arg[iarg+3], 1, atom->nbondtypes, + adapt[nadapt].ilo, adapt[nadapt].ihi, error, Atom::BOND); if (utils::strmatch(arg[iarg+4],"^v_")) { adapt[nadapt].var = utils::strdup(arg[iarg+4]+2); } else error->all(FLERR,"Argument #{} must be variable not {}", iarg+5, arg[iarg+4]); @@ -154,13 +139,8 @@ FixAdapt::FixAdapt(LAMMPS *lmp, int narg, char **arg) : adapt[nadapt].angle = nullptr; adapt[nadapt].astyle = utils::strdup(arg[iarg+1]); adapt[nadapt].aparam = utils::strdup(arg[iarg+2]); - char *typestr = nullptr; - typestr = utils::expand_type(FLERR, arg[iarg+3], Atom::ANGLE, lmp); - if (typestr) - adapt[nadapt].ilo = adapt[nadapt].ihi = utils::inumeric(FLERR, typestr, false, lmp); - else utils::bounds(FLERR, arg[iarg+3], 1, atom->nangletypes, - adapt[nadapt].ilo, adapt[nadapt].ihi, error); - delete[] typestr; + utils::bounds(FLERR, arg[iarg+3], 1, atom->nangletypes, + adapt[nadapt].ilo, adapt[nadapt].ihi, error, Atom::ANGLE); if (utils::strmatch(arg[iarg+4],"^v_")) { adapt[nadapt].var = utils::strdup(arg[iarg+4]+2); } else error->all(FLERR,"Argument #{} must be variable not {}", iarg+5, arg[iarg+4]); diff --git a/src/utils.cpp b/src/utils.cpp index 55b029fc0d..013b67dfc2 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -596,15 +596,24 @@ tagint utils::tnumeric(const char *file, int line, const char *str, bool do_abor /* ---------------------------------------------------------------------- compute bounds implied by numeric str with a possible wildcard asterisk + if str is a single number or type label, return nlo = nhi = label2type(str) ------------------------------------------------------------------------- */ // clang-format off template -void utils::bounds(const char *file, int line, const std::string &str, - bigint nmin, bigint nmax, TYPE &nlo, TYPE &nhi, Error *error) +void utils::bounds(const char *file, int line, const std::string &str, bigint nmin, + bigint nmax, TYPE &nlo, TYPE &nhi, Error *error, int mode = Atom::NONTYPE) { nlo = nhi = -1; - // check for illegal charcters + if (mode != Atom::NONTYPE) { + char *typestr; + if ( typestr = utils::expand_type(FLERR, str, mode, lmp) ) + nlo = nhi = utils::inumeric(FLERR, typestr, false, lmp); + delete[] typestr; + if (nlo > -1) return; + } + + // check for illegal characters size_t found = str.find_first_not_of("*-0123456789"); if (found != std::string::npos) { if (error) error->all(file, line, "Invalid range string: {}", str); @@ -642,11 +651,11 @@ void utils::bounds(const char *file, int line, const std::string &str, } template void utils::bounds<>(const char *, int, const std::string &, - bigint, bigint, int &, int &, Error *); + bigint, bigint, int &, int &, Error *, int); template void utils::bounds<>(const char *, int, const std::string &, - bigint, bigint, long &, long &, Error *); + bigint, bigint, long &, long &, Error *, int); template void utils::bounds<>(const char *, int, const std::string &, - bigint, bigint, long long &, long long &, Error *); + bigint, bigint, long long &, long long &, Error *, int); // clang-format on /* ------------------------------------------------------------------------- diff --git a/src/utils.h b/src/utils.h index 383927ad34..6cb67a0d9f 100644 --- a/src/utils.h +++ b/src/utils.h @@ -310,9 +310,10 @@ namespace utils { /*! Compute index bounds derived from a string with a possible wildcard * * This functions processes the string in *str* and set the values of *nlo* - * and *nhi* according to the following five cases: + * and *nhi* according to the following six cases: * * - a single number, i: nlo = i; nhi = i; + * - a single type label, typestr: nlo = nhi = label2type(typestr) * - a single asterisk, \*: nlo = nmin; nhi = nmax; * - a single number followed by an asterisk, i\*: nlo = i; nhi = nmax; * - a single asterisk followed by a number, \*i: nlo = nmin; nhi = i; @@ -325,11 +326,12 @@ namespace utils { * \param nmax largest allowed upper bound * \param nlo lower bound * \param nhi upper bound + * \param mode select labelmap using constants from Atom class * \param error pointer to Error class for out-of-bounds messages */ template void bounds(const char *file, int line, const std::string &str, bigint nmin, bigint nmax, - TYPE &nlo, TYPE &nhi, Error *error); + TYPE &nlo, TYPE &nhi, Error *error, int mode); /*! Expand list of arguments when containing fix/compute wildcards *