From 3ffa5908ca8fd1fcb8369c7f66bbc78027f23c06 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Feb 2024 10:16:34 -0500 Subject: [PATCH 01/99] add get_bitmask_by_id() accessor to Group class --- src/group.cpp | 15 +++++++++++++++ src/group.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/src/group.cpp b/src/group.cpp index a586c33ed9..b438e8fede 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -623,6 +623,21 @@ int Group::find_unused() return -1; } +/* ---------------------------------------------------------------------- + return group bitmask for given group id. Error out if group is not found. +------------------------------------------------------------------------- */ + +int Group::get_bitmask_by_id(const std::string &file, int line, const std::string &name, + const std::string &caller) +{ + int igroup = 0; + while (igroup < MAX_GROUP) + if (names[igroup] && (name == names[igroup])) break; + if (igroup == MAX_GROUP) + error->all(file, line, "Group ID {} requested by {} does not exist", name, caller); + return bitmask[igroup]; +} + /* ---------------------------------------------------------------------- add atoms to group that are in same molecules as atoms already in group do not include molID = 0 diff --git a/src/group.h b/src/group.h index 0820c7d4b2..728b0a1d02 100644 --- a/src/group.h +++ b/src/group.h @@ -31,11 +31,13 @@ class Group : protected Pointers { Group(class LAMMPS *); ~Group() override; + void assign(int, char **); // assign atoms to a group void assign(const std::string &); // convenience function void create(const std::string &, int *); // add flagged atoms to a group int find(const std::string &); // lookup name in list of groups int find_or_create(const char *); // lookup name or create new group + int get_bitmask_by_id(const std::string &, int, const std::string &, const std::string &); void write_restart(FILE *); void read_restart(FILE *); From 279b218af188793b7662df764f12c12a6a303be0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Jun 2024 16:45:39 -0400 Subject: [PATCH 02/99] fix logic bug --- src/group.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/group.cpp b/src/group.cpp index b438e8fede..55f6ae2969 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -631,8 +631,9 @@ int Group::get_bitmask_by_id(const std::string &file, int line, const std::strin const std::string &caller) { int igroup = 0; - while (igroup < MAX_GROUP) + for (; igroup < MAX_GROUP; ++igroup) { if (names[igroup] && (name == names[igroup])) break; + } if (igroup == MAX_GROUP) error->all(file, line, "Group ID {} requested by {} does not exist", name, caller); return bitmask[igroup]; From 5f2c81804d8e136eb98c369a1d8b46da442d648f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Jun 2024 16:45:53 -0400 Subject: [PATCH 03/99] add unit test for bitmap accessor --- unittest/commands/test_groups.cpp | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/unittest/commands/test_groups.cpp b/unittest/commands/test_groups.cpp index 7f0a054c40..94b828df60 100644 --- a/unittest/commands/test_groups.cpp +++ b/unittest/commands/test_groups.cpp @@ -255,6 +255,41 @@ TEST_F(GroupTest, Molecular) command("group three include xxx");); } +TEST_F(GroupTest, Bitmap) +{ + atomic_system(); + + BEGIN_HIDE_OUTPUT(); + command("group one region left"); + command("group two region right"); + command("group three empty"); + command("group four region left"); + command("group four region right"); + command("group six subtract four one"); + END_HIDE_OUTPUT(); + + int bm_one = group->get_bitmask_by_id(FLERR, "one", "unittest 1"); + int bm_two = group->get_bitmask_by_id(FLERR, "two", "unittest 2"); + int bm_three = group->get_bitmask_by_id(FLERR, "three", "unittest 3"); + int bm_four = group->get_bitmask_by_id(FLERR, "four", "unittest 4"); + int bm_six = group->get_bitmask_by_id(FLERR, "six", "unittest 6"); + int nlocal = lmp->atom->natoms; + auto mask = lmp->atom->mask; + + for (int i = 0; i < nlocal; ++i) { + if ((mask[i] & bm_one) && (mask[i] & bm_two)) { + EXPECT_NE((mask[i] & bm_four), 0); + } + if (mask[i] & bm_two) { + EXPECT_NE((mask[i] & bm_six), 0); + } + EXPECT_EQ((mask[i] & bm_three), 0); + } + + TEST_FAILURE(".*ERROR: Group ID five requested by unittest 5 does not exist.*", + group->get_bitmask_by_id(FLERR, "five", "unittest 5");); +} + TEST_F(GroupTest, Dynamic) { atomic_system(); From a0939c4fcc82bf908f18f4e99a34118ad06f110e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 1 Jun 2024 17:57:31 -0400 Subject: [PATCH 04/99] use new bitmap accessor function and simplify code --- src/atom.cpp | 2 +- src/change_box.cpp | 4 +--- src/compute.cpp | 6 +++--- src/compute_coord_atom.cpp | 8 +++----- src/compute_coord_atom.h | 2 +- src/compute_group_group.cpp | 8 ++------ src/compute_group_group.h | 2 +- src/create_bonds.cpp | 8 ++------ src/create_bonds.h | 2 +- src/delete_atoms.cpp | 25 ++++++------------------- src/delete_bonds.cpp | 6 ++---- 11 files changed, 23 insertions(+), 50 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index 866a52e25a..865f9f4e3b 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2284,7 +2284,7 @@ void Atom::first_reorder() // nfirst = index of first atom not in firstgroup // when find firstgroup atom out of place, swap it with atom nfirst - int bitmask = group->bitmask[firstgroup]; + const int bitmask = group->get_bitmask_by_id(FLERR, firstgroupname, "Atom::first_reorder"); nfirst = 0; while (nfirst < nlocal && mask[nfirst] & bitmask) nfirst++; diff --git a/src/change_box.cpp b/src/change_box.cpp index eb7ce7f136..ce122bc75b 100644 --- a/src/change_box.cpp +++ b/src/change_box.cpp @@ -52,9 +52,7 @@ void ChangeBox::command(int narg, char **arg) // group - int igroup = group->find(arg[0]); - if (igroup == -1) error->all(FLERR,"Could not find change_box group ID {}", arg[0]); - int groupbit = group->bitmask[igroup]; + int groupbit = group->get_bitmask_by_id(FLERR, arg[0], "change_box"); // parse operation arguments // allocate ops to max possible length diff --git a/src/compute.cpp b/src/compute.cpp index d703cbfe6a..ddacca50e6 100644 --- a/src/compute.cpp +++ b/src/compute.cpp @@ -48,11 +48,11 @@ Compute::Compute(LAMMPS *lmp, int narg, char **arg) : id = utils::strdup(arg[0]); if (!utils::is_id(id)) - error->all(FLERR,"Compute ID must be alphanumeric or underscore characters"); + error->all(FLERR,"Compute ID {} must only have alphanumeric or underscore characters", id); + groupbit = group->get_bitmask_by_id(FLERR, arg[1], fmt::format("compute {}", arg[2])); igroup = group->find(arg[1]); - if (igroup == -1) error->all(FLERR,"Could not find compute group ID"); - groupbit = group->bitmask[igroup]; + if (igroup == -1) error->all(FLERR,"Could not find compute group ID {}", arg[1]); style = utils::strdup(arg[2]); diff --git a/src/compute_coord_atom.cpp b/src/compute_coord_atom.cpp index ea19f01b91..2426767263 100644 --- a/src/compute_coord_atom.cpp +++ b/src/compute_coord_atom.cpp @@ -39,8 +39,7 @@ ComputeCoordAtom::ComputeCoordAtom(LAMMPS *lmp, int narg, char **arg) : { if (narg < 5) error->all(FLERR, "Illegal compute coord/atom command"); - jgroup = group->find("all"); - jgroupbit = group->bitmask[jgroup]; + jgroupbit = group->get_bitmask_by_id(FLERR, "all", "compute coord/atom"); cstyle = NONE; if (strcmp(arg[3], "cutoff") == 0) { @@ -50,11 +49,10 @@ ComputeCoordAtom::ComputeCoordAtom(LAMMPS *lmp, int narg, char **arg) : int iarg = 5; if ((narg > 6) && (strcmp(arg[5], "group") == 0)) { + delete[] group2; group2 = utils::strdup(arg[6]); iarg += 2; - jgroup = group->find(group2); - if (jgroup == -1) error->all(FLERR, "Compute coord/atom group2 ID does not exist"); - jgroupbit = group->bitmask[jgroup]; + jgroupbit = group->get_bitmask_by_id(FLERR, group2, "compute coord/atom"); } ncol = narg - iarg + 1; diff --git a/src/compute_coord_atom.h b/src/compute_coord_atom.h index 6aed13dd59..89311d71e0 100644 --- a/src/compute_coord_atom.h +++ b/src/compute_coord_atom.h @@ -46,7 +46,7 @@ class ComputeCoordAtom : public Compute { double **carray; char *group2; - int jgroup, jgroupbit; + int jgroupbit; class ComputeOrientOrderAtom *c_orientorder; char *id_orientorder; diff --git a/src/compute_group_group.cpp b/src/compute_group_group.cpp index afc825ac3c..c88b9c7ca5 100644 --- a/src/compute_group_group.cpp +++ b/src/compute_group_group.cpp @@ -54,9 +54,7 @@ ComputeGroupGroup::ComputeGroupGroup(LAMMPS *lmp, int narg, char **arg) : extvector = 1; group2 = utils::strdup(arg[3]); - jgroup = group->find(group2); - if (jgroup == -1) error->all(FLERR, "Compute group/group group ID does not exist"); - jgroupbit = group->bitmask[jgroup]; + jgroupbit = group->get_bitmask_by_id(FLERR, group2, "compute group/group"); pairflag = 1; kspaceflag = 0; @@ -147,9 +145,7 @@ void ComputeGroupGroup::init() // recheck that group 2 has not been deleted - jgroup = group->find(group2); - if (jgroup == -1) error->all(FLERR, "Compute group/group group ID does not exist"); - jgroupbit = group->bitmask[jgroup]; + jgroupbit = group->get_bitmask_by_id(FLERR, group2, "compute group/group"); // need an occasional half neighbor list diff --git a/src/compute_group_group.h b/src/compute_group_group.h index 3e66484368..a7be4890ca 100644 --- a/src/compute_group_group.h +++ b/src/compute_group_group.h @@ -35,7 +35,7 @@ class ComputeGroupGroup : public Compute { private: char *group2; - int jgroup, jgroupbit, othergroupbit; + int jgroupbit; double **cutsq; double e_self, e_correction; int pairflag, kspaceflag, boundaryflag, molflag; diff --git a/src/create_bonds.cpp b/src/create_bonds.cpp index 13a99a182f..fe9d98a82d 100644 --- a/src/create_bonds.cpp +++ b/src/create_bonds.cpp @@ -59,12 +59,8 @@ void CreateBonds::command(int narg, char **arg) if (strcmp(arg[0], "many") == 0) { style = MANY; if (narg != 6) error->all(FLERR, "No optional keywords allowed with create_bonds many"); - igroup = group->find(arg[1]); - if (igroup == -1) error->all(FLERR, "Cannot find create_bonds first group ID {}", arg[1]); - group1bit = group->bitmask[igroup]; - igroup = group->find(arg[2]); - if (igroup == -1) error->all(FLERR, "Cannot find create_bonds second group ID {}", arg[2]); - group2bit = group->bitmask[igroup]; + group1bit = group->get_bitmask_by_id(FLERR, arg[1], "create_bonds"); + group2bit = group->get_bitmask_by_id(FLERR, arg[2], "create_bonds"); btype = utils::inumeric(FLERR, arg[3], false, lmp); rmin = utils::numeric(FLERR, arg[4], false, lmp); rmax = utils::numeric(FLERR, arg[5], false, lmp); diff --git a/src/create_bonds.h b/src/create_bonds.h index 03cbea5ccc..bd3d9defba 100644 --- a/src/create_bonds.h +++ b/src/create_bonds.h @@ -30,7 +30,7 @@ class CreateBonds : public Command { void command(int, char **) override; private: - int igroup, group1bit, group2bit; + int group1bit, group2bit; int btype, atype, dtype; tagint batom1, batom2, aatom1, aatom2, aatom3, datom1, datom2, datom3, datom4; double rmin, rmax; diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index 6e14964a35..321a891dfe 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -86,8 +86,8 @@ void DeleteAtoms::command(int narg, char **arg) error->all(FLERR, "Unknown delete_atoms sub-command: {}", arg[0]); if (allflag) { - int igroup = group->find("all"); - if ((igroup >= 0) && modify->check_rigid_group_overlap(group->bitmask[igroup])) + int igroupbit = group->get_bitmask_by_id(FLERR, "all", "delete_atoms"); + if (modify->check_rigid_group_overlap(igroupbit)) error->warning(FLERR, "Attempting to delete atoms in rigid bodies"); } else { if (modify->check_rigid_list_overlap(dlist)) @@ -215,8 +215,7 @@ void DeleteAtoms::delete_group(int narg, char **arg) { if (narg < 2) utils::missing_cmd_args(FLERR, "delete_atoms group", error); - int igroup = group->find(arg[1]); - if (igroup == -1) error->all(FLERR, "Could not find delete_atoms group ID {}", arg[1]); + int groupbit = group->get_bitmask_by_id(FLERR, arg[1], "delete_atoms"); options(narg - 2, &arg[2]); // check for special case of group = all @@ -233,8 +232,6 @@ void DeleteAtoms::delete_group(int narg, char **arg) for (int i = 0; i < nlocal; i++) dlist[i] = 0; int *mask = atom->mask; - int groupbit = group->bitmask[igroup]; - for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) dlist[i] = 1; } @@ -280,18 +277,11 @@ void DeleteAtoms::delete_overlap(int narg, char **arg) const double cut = utils::numeric(FLERR, arg[1], false, lmp); const double cutsq = cut * cut; + const int group1bit = group->get_bitmask_by_id(FLERR, arg[2], "delete_atoms"); + const int group2bit = group->get_bitmask_by_id(FLERR, arg[3], "delete_atoms"); - int igroup1 = group->find(arg[2]); - if (igroup1 < 0) - error->all(FLERR, "Could not find delete_atoms overlap first group ID {}", arg[2]); - int igroup2 = group->find(arg[3]); - if (igroup2 < 0) - error->all(FLERR, "Could not find delete_atoms overlap second group ID {}", arg[3]); options(narg - 4, &arg[4]); - const int group1bit = group->bitmask[igroup1]; - const int group2bit = group->bitmask[igroup2]; - if (comm->me == 0) utils::logmesg(lmp, "System init for delete_atoms ...\n"); // request a full neighbor list for use by this command @@ -453,9 +443,7 @@ void DeleteAtoms::delete_random(int narg, char **arg) error->all(FLERR, "Unknown delete_atoms random style: {}", arg[1]); } - int igroup = group->find(arg[4]); - if (igroup == -1) error->all(FLERR, "Could not find delete_atoms random group ID {}", arg[4]); - + int groupbit = group->get_bitmask_by_id(FLERR, arg[4], "delete_atoms"); auto region = domain->get_region_by_id(arg[5]); if (!region && (strcmp(arg[5], "NULL") != 0)) error->all(FLERR, "Could not find delete_atoms random region ID {}", arg[5]); @@ -476,7 +464,6 @@ void DeleteAtoms::delete_random(int narg, char **arg) double **x = atom->x; int *mask = atom->mask; - int groupbit = group->bitmask[igroup]; if (region) region->prematch(); // delete approximate fraction of atoms in both group and region diff --git a/src/delete_bonds.cpp b/src/delete_bonds.cpp index 1f8fe71bff..bce297d839 100644 --- a/src/delete_bonds.cpp +++ b/src/delete_bonds.cpp @@ -56,11 +56,9 @@ void DeleteBonds::command(int narg, char **arg) if (comm->me == 0) utils::logmesg(lmp,"Deleting bonds ...\n"); - // identify group + // get group bitmask - int igroup = group->find(arg[0]); - if (igroup == -1) error->all(FLERR,"Cannot find delete_bonds group ID"); - int groupbit = group->bitmask[igroup]; + int groupbit = group->get_bitmask_by_id(FLERR, arg[0], "delete_bonds"); // set style and which = type value From adb3343a173079a31a450470201bf85af9f6dfb0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 25 Sep 2024 23:14:50 -0400 Subject: [PATCH 05/99] Start general document about file formats --- doc/src/Run_formats.rst | 119 ++++++++++++++++++++ doc/src/Run_head.rst | 10 +- doc/utils/sphinx-config/false_positives.txt | 1 + 3 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 doc/src/Run_formats.rst diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst new file mode 100644 index 0000000000..896ddcade2 --- /dev/null +++ b/doc/src/Run_formats.rst @@ -0,0 +1,119 @@ +File formats used by LAMMPS +=========================== + +This page provides a general overview of the kinds of files and file +formats that LAMMPS is reading and writing. + +Character Encoding +^^^^^^^^^^^^^^^^^^ + +For text files, LAMMPS uses `ASCII character encoding +`_ which represents the digits 0 to +9, the lower and upper case letters a to z, some common punctuation and +other symbols and a few whitespace characters including a regular "space +character", "line feed", "carriage return", "tabulator". These are all +represented by bytes with a value smaller than 128 and only 95 of those +128 values represent printable characters. This is sufficient to represent +most English text, but misses accented characters or umlauts or Greek +symbols and more. + +Modern text often uses `UTF-8 character encoding +`_ instead. This is a way to +represent many more different characters as defined by the Unicode +standard. This is compatible with ASCII, since the first 128 values are +identical with the ASCIII encoding. It is important to note, however, +that there are Unicode characters that look similar or even identical to +ASCII characters, but have a different representation. As a general +rule, these characters are not be correctly recognized by LAMMPS. For +some parts of LAMMPS' text processing, there are translation tables with +known "lookalike" characters that will transparently substitute them +with their ASCII equivalents. Non-ASCII lookalike characters are often +used by web browsers or PDF viewers to improve the readability of +text. Thus, when using copy-n-paste to transfer text from such an +application to your input file, you may unintentionally create text that +is not fully in ASCII encoding and may cause errors when LAMMPS is +trying to read it. + +Lines with non-printable and non-ASCII characters in text files can be +detected for example with: + +.. code-block:: bash + + env LC_ALL=C grep -n '[^ -~]' some_file.txt + +Number Formatting +^^^^^^^^^^^^^^^^^ + +Different countries and languages have different conventions to format +numbers. While in some regions commas are used for fractions and points +to indicate thousand, million and so on, this is reversed in other +regions. Modern operating systems have facilities to adjust input and +output accordingly. The exact rules are often applied according to the +value of the ``$LANG`` environment variable (e.g. "en_US.utf8"). + +For the sake of simplicity of the implementation and transferability of +results, LAMMPS does not support this and instead expects numbers being +formatted in the generic or "C" locale. The "C" locale has no +punctuation for thousand, million and so on and uses a decimal point for +fractions. One thousand would be represented as "1000.0" and not as +"1,000.0" nor as "1.000,0". + +LAMMPS also only accepts integer numbers when an integer is required, +so using "1.0" is not accepted; you have to use "1" instead. + +For floating point numbers in scientific notation, the Fortran double +precision notation "1.1d3" is not accepted either; you have to use +"1100", "1100.0" or "1.1e3". + +Input file +^^^^^^^^^^ + +A LAMMPS input file is a text file with commands. It is read +line-by-line and each line is processed *immediately*. Before looking +for commands and executing them, there is a pre-processing step where +`${variable}` and `$(expression)` constructs are expanded or evaluated +and lines that end in the ampersand character '&' are combined with the +next line (similar to Fortran 90 free format source code). + +The LAMMPS input syntax has minimal support for conditionals and loops, +but if more complex operations are required, it is recommended to use +the library interface, e.g. :doc:`from Python using the LAMMPS Python +module `. + +There is a frequent misconception about the :doc:`if command `: +this is a command for conditional execution **outside** a run or +minimization. To trigger actions on specific conditions **during** +a run is a non-trivial operation that usually requires adopting one +of the available fix commands or creating a new one. + +LAMMPS commands can change the internal state and thus the order of +commands matters and reordering them can produce different results. + +Each line must have an "end-of-line" character (line feed or carriage +return plus line feed). Some text editors do not automatically insert +one which may have the result that LAMMPS ignores the last command. +It is thus recommended, to always have an empty line at the end of an +input file. + +The specific details describing how LAMMPS input is processed and parsed +are explained in :doc:`Commands_parse`. + +Data file +^^^^^^^^^ + + +Molecule file +^^^^^^^^^^^^^ + + +Potential file +^^^^^^^^^^^^^^ + + +Restart file +^^^^^^^^^^^^ + + +Dump file +^^^^^^^^^ + diff --git a/doc/src/Run_head.rst b/doc/src/Run_head.rst index 5da5942d9b..6739df5cbb 100644 --- a/doc/src/Run_head.rst +++ b/doc/src/Run_head.rst @@ -1,10 +1,11 @@ Run LAMMPS ********** -These pages explain how to run LAMMPS once you have :doc:`installed an executable ` or :doc:`downloaded the source code ` -and :doc:`built an executable `. The :doc:`Commands ` -doc page describes how input scripts are structured and the commands -they can contain. +These pages explain how to run LAMMPS once you have :doc:`installed an +executable ` or :doc:`downloaded the source code ` and +:doc:`built an executable `. The :doc:`Commands ` doc +page describes how input scripts are structured and the commands they +can contain. .. toctree:: :maxdepth: 1 @@ -12,4 +13,5 @@ they can contain. Run_basics Run_options Run_output + Run_formats Run_windows diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 70d6b4e323..694e4ec871 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -3930,6 +3930,7 @@ username usleep usolve usr +utf util utils utsa From c36e1a9c8e4acffc3d4b985fa28430091e785be2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 29 Sep 2024 21:41:54 -0400 Subject: [PATCH 06/99] save current status to git --- doc/src/Run_formats.rst | 144 +++++++++++++++++++++++++++++++++++----- 1 file changed, 128 insertions(+), 16 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 896ddcade2..6e3c87cf79 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -24,18 +24,18 @@ standard. This is compatible with ASCII, since the first 128 values are identical with the ASCIII encoding. It is important to note, however, that there are Unicode characters that look similar or even identical to ASCII characters, but have a different representation. As a general -rule, these characters are not be correctly recognized by LAMMPS. For -some parts of LAMMPS' text processing, there are translation tables with -known "lookalike" characters that will transparently substitute them -with their ASCII equivalents. Non-ASCII lookalike characters are often -used by web browsers or PDF viewers to improve the readability of -text. Thus, when using copy-n-paste to transfer text from such an +rule, these characters are not correctly recognized by LAMMPS. For some +parts of LAMMPS' text processing, translation tables with known +"lookalike" characters are used that transparently substitute non-ASCII +characters with their ASCII equivalents. Non-ASCII lookalike characters +are often used by web browsers or PDF viewers to improve the readability +of text. Thus, when using copy-n-paste to transfer text from such an application to your input file, you may unintentionally create text that -is not fully in ASCII encoding and may cause errors when LAMMPS is -trying to read it. +is not exclusively using ASCII encoding and may cause errors when LAMMPS +is trying to read it. Lines with non-printable and non-ASCII characters in text files can be -detected for example with: +detected for example with a (Linux) command like the following: .. code-block:: bash @@ -71,9 +71,55 @@ Input file A LAMMPS input file is a text file with commands. It is read line-by-line and each line is processed *immediately*. Before looking for commands and executing them, there is a pre-processing step where -`${variable}` and `$(expression)` constructs are expanded or evaluated +comments (text starting with a pound sign '#') are removed, +`${variable}` and `$(expression)` constructs are expanded or evaluated, and lines that end in the ampersand character '&' are combined with the -next line (similar to Fortran 90 free format source code). +next line (similar to Fortran 90 free format source code). After the +pre-processing, lines are split into "words" and the first word must be a +:doc:`command ` and everything . Below are some example lines: + +.. code-block:: LAMMPS + + # full line comment + + # some global settings + units lj + atom_style atomic + # ^^ command ^^ argument(s) + + variable x index 1 # may be overridden from command line with -var x + variable xx equal 20*$x # variable "xx" is always 20 time "x" + + lattice fcc 0.8442 + + # multi-line command, uses spacing from "lattice" command + region box block 0.0 ${xx} & + 0.0 40.0 & + 0.0 30.0 + # create simulation box and fillwith atoms according to lattice setting + create_box 1 box + create_atoms 1 box + + # set force field and parameters + mass 1 1.0 + pair_style lj/cut 2.5 + pair_coeff 1 1 1.0 1.0 2.5 + + # run simulation + fix 1 all nve + run 1000 + +The pivotal command in this example input is the :doc:`create_box +command `. It defines the simulation system and many +parameters that go with it: units, atom style, number of atom types (and +other types) and more. Those settings are *locked in* after the box is +created. Commands that change these kind of settings are only allowed +**before** a simulation box is created and many other commands are only +allowed **after** the simulation box is defined (e.g. :doc:`pair_coeff +`). Very few commands (e.g. :doc:`pair_style `) +may be used in either part of the input. The :doc:`read_data +` and :doc:`read_restart ` commands also create +the system box and thus have a similar pivotal function. The LAMMPS input syntax has minimal support for conditionals and loops, but if more complex operations are required, it is recommended to use @@ -86,14 +132,16 @@ minimization. To trigger actions on specific conditions **during** a run is a non-trivial operation that usually requires adopting one of the available fix commands or creating a new one. -LAMMPS commands can change the internal state and thus the order of -commands matters and reordering them can produce different results. +LAMMPS commands change the internal state and thus the order of commands +matters and reordering them can produce different results. For example, +the region defined by the :doc:`region command ` in the example +above depends on the :doc:`lattice setting ` and thus its +dimensions will be different depending on the order of the two commands. Each line must have an "end-of-line" character (line feed or carriage return plus line feed). Some text editors do not automatically insert -one which may have the result that LAMMPS ignores the last command. -It is thus recommended, to always have an empty line at the end of an -input file. +one which may cause LAMMPS to ignore the last command. It is thus +recommended, to always have an empty line at the end of an input file. The specific details describing how LAMMPS input is processed and parsed are explained in :doc:`Commands_parse`. @@ -101,6 +149,70 @@ are explained in :doc:`Commands_parse`. Data file ^^^^^^^^^ +A LAMMPS data file contains a description of a system suitable for +reading with the :doc:`read_data command `. This is commonly +used for setting up more complex and particularly molecular systems +which can be difficult to achieve with the commands :doc:`create_box +` and :doc:`create_atoms ` alone. Also, data +files can be used as a portable alternatives to a :doc:`binary restart +file `. A restart file can be converted into a data file +from the :doc:`command line `. + +The file is generally structured into a header section at the very +beginning of the file and multiple titled sections like "Atoms", +Masses", "Pair Coeffs", and so on. The data file **always** starts +with a "title" line, which will be **ignored** by LAMMPS. Omitting +the title line can lead to unexpected behavior as then a line of +the header with an actual setting may be ignored. This is often a +line with the "atoms" keyword, which results in LAMMPS assuming that +there are no atoms in the data file and thus throwing an error on the +contents of the "Atoms" section. The title line may contain some +keywords that can be used by external programs to convey information +about the system, that is not required and not read by LAMMPS. + +Data files may contain comments, which start with the pound sign '#'. +There must be at least one blank between a valid keyword and the pound +sign. + +.. code-block:: bash + + LAMMPS Title line (ignored) + # full line comment + + 10 atoms # comment + 4 atom types + + -36.840194 64.211560 xlo xhi + -41.013691 68.385058 ylo yhi + -29.768095 57.139462 zlo zhi + + Masses + + 1 12.0110 + 2 12.0110 + 3 15.9990 + 4 1.0080 + + Pair Coeffs + + 1 0.110000 3.563595 0.110000 3.563595 + 2 0.080000 3.670503 0.010000 3.385415 + 3 0.120000 3.029056 0.120000 2.494516 + 4 0.022000 2.351973 0.022000 2.351973 + + Atoms # full + + 1 1 1 0.560 43.99993 58.52678 36.78550 0 0 0 + 2 1 2 -0.270 45.10395 58.23499 35.86693 0 0 0 + 3 1 3 -0.510 43.81519 59.54928 37.43995 0 0 0 + 4 1 4 0.090 45.71714 57.34797 36.13434 0 0 0 + 5 1 4 0.090 45.72261 59.13657 35.67007 0 0 0 + 6 1 4 0.090 44.66624 58.09539 34.85538 0 0 0 + 7 1 3 -0.470 43.28193 57.47427 36.91953 0 0 0 + 8 1 4 0.070 42.07157 57.45486 37.62418 0 0 0 + 9 1 1 0.510 42.19985 57.57789 39.12163 0 0 0 + 10 1 1 0.510 41.88641 58.62251 39.70398 0 0 0 + # ^^atomID ^^molID ^^type ^^charge ^^xcoord ^^ycoord ^^ycoord ^^image^^flags Molecule file ^^^^^^^^^^^^^ From 12b6b797b8f16e2dfe721feac03e8732bf296376 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 9 Jan 2025 14:47:20 -0500 Subject: [PATCH 07/99] simplify --- src/group.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index 5d87ef39b6..d19b802b24 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -656,11 +656,8 @@ int Group::find_unused() int Group::get_bitmask_by_id(const std::string &file, int line, const std::string &name, const std::string &caller) { - int igroup = 0; - for (; igroup < MAX_GROUP; ++igroup) { - if (names[igroup] && (name == names[igroup])) break; - } - if (igroup == MAX_GROUP) + int igroup = find(name); + if (igroup < 0) error->all(file, line, "Group ID {} requested by {} does not exist", name, caller); return bitmask[igroup]; } From 195f8a9670e8e1c764c42e5238f76ab59e7c0663 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 9 Jan 2025 19:30:34 -0500 Subject: [PATCH 08/99] a couple more updates to use the new API --- src/displace_atoms.cpp | 3 +-- src/dump.cpp | 3 ++- src/fix.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/displace_atoms.cpp b/src/displace_atoms.cpp index 5ecf5a2c9e..d5b6c1b9af 100644 --- a/src/displace_atoms.cpp +++ b/src/displace_atoms.cpp @@ -74,8 +74,7 @@ void DisplaceAtoms::command(int narg, char **arg) // group and style igroup = group->find(arg[0]); - if (igroup == -1) error->all(FLERR,"Could not find displace_atoms group ID"); - groupbit = group->bitmask[igroup]; + groupbit = group->get_bitmask_by_id(FLERR, arg[0], "displace_atoms"); if (modify->check_rigid_group_overlap(groupbit)) error->warning(FLERR,"Attempting to displace atoms in rigid bodies"); diff --git a/src/dump.cpp b/src/dump.cpp index 3425b6d441..b6d8cf535a 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -58,7 +58,7 @@ Dump::Dump(LAMMPS *lmp, int /*narg*/, char **arg) : id = utils::strdup(arg[0]); igroup = group->find(arg[1]); - groupbit = group->bitmask[igroup]; + groupbit = group->get_bitmask_by_id(FLERR, arg[1], fmt::format("dump {}", arg[2])); style = utils::strdup(arg[2]); @@ -311,6 +311,7 @@ void Dump::init() int Dump::count() { + // group all if (igroup == 0) return atom->nlocal; int *mask = atom->mask; diff --git a/src/fix.cpp b/src/fix.cpp index 8678706347..3f3b585e0a 100644 --- a/src/fix.cpp +++ b/src/fix.cpp @@ -48,8 +48,8 @@ Fix::Fix(LAMMPS *lmp, int /*narg*/, char **arg) : error->all(FLERR,"Fix ID must be alphanumeric or underscore characters"); igroup = group->find(arg[1]); - if (igroup == -1) error->all(FLERR,"Could not find fix group ID"); - groupbit = group->bitmask[igroup]; + if (igroup == -1) error->all(FLERR,"Could not find fix {} group ID {}", arg[2], arg[1]); + groupbit = group->get_bitmask_by_id(FLERR, arg[1], fmt::format("fix {}",arg[2])); style = utils::strdup(arg[2]); From ac68f70e20ed64bf13ae4910f8b4572731c67fee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 9 Jan 2025 21:23:56 -0500 Subject: [PATCH 09/99] three more --- src/fix_nh.cpp | 10 +++------- src/fix_recenter.cpp | 13 +++++-------- src/fix_spring.cpp | 10 +++------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/fix_nh.cpp b/src/fix_nh.cpp index b56033d6d6..73f3908a6f 100644 --- a/src/fix_nh.cpp +++ b/src/fix_nh.cpp @@ -271,7 +271,7 @@ FixNH::FixNH(LAMMPS *lmp, int narg, char **arg) : delete[] id_dilate; id_dilate = utils::strdup(arg[iarg+1]); int idilate = group->find(id_dilate); - if (idilate == -1) + if (idilate < 0) error->all(FLERR,"Fix {} dilate group ID {} does not exist", style, id_dilate); } iarg += 2; @@ -629,12 +629,8 @@ void FixNH::init() { // recheck that dilate group has not been deleted - if (allremap == 0) { - int idilate = group->find(id_dilate); - if (idilate == -1) - error->all(FLERR,"Fix {} dilate group ID {} does not exist", style, id_dilate); - dilate_group_bit = group->bitmask[idilate]; - } + if (allremap == 0) + dilate_group_bit = group->get_bitmask_by_id(FLERR, id_dilate, fmt::format("fix {}", style)); // ensure no conflict with fix deform diff --git a/src/fix_recenter.cpp b/src/fix_recenter.cpp index 4da8c4787b..2e9803870a 100644 --- a/src/fix_recenter.cpp +++ b/src/fix_recenter.cpp @@ -41,7 +41,7 @@ enum{BOX,LATTICE,FRACTION}; FixRecenter::FixRecenter(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg < 6) error->all(FLERR,"Illegal fix recenter command"); + if (narg < 6) utils::missing_cmd_args(FLERR,"fix recenter", error); xcom = ycom = zcom = 0.0; xflag = yflag = zflag = 1; @@ -74,17 +74,15 @@ FixRecenter::FixRecenter(LAMMPS *lmp, int narg, char **arg) : int iarg = 6; while (iarg < narg) { if (strcmp(arg[iarg],"shift") == 0) { - int igroup2 = group->find(arg[iarg+1]); - if (igroup2 < 0) error->all(FLERR,"Could not find fix recenter group ID"); - group2bit = group->bitmask[igroup2]; + group2bit = group->get_bitmask_by_id(FLERR, arg[iarg+1], "fix recenter"); iarg += 2; } else if (strcmp(arg[iarg],"units") == 0) { if (strcmp(arg[iarg+1],"box") == 0) scaleflag = BOX; else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = LATTICE; else if (strcmp(arg[iarg+1],"fraction") == 0) scaleflag = FRACTION; - else error->all(FLERR,"Illegal fix recenter command"); + else error->all(FLERR,"Unknown fix recenter units argument {}", arg[iarg+1]); iarg += 2; - } else error->all(FLERR,"Illegal fix recenter command"); + } else error->all(FLERR,"Unknown fix recenter keyword {}", arg[iarg]); } // scale xcom,ycom,zcom @@ -103,8 +101,7 @@ FixRecenter::FixRecenter(LAMMPS *lmp, int narg, char **arg) : // cannot have 0 atoms in group - if (group->count(igroup) == 0) - error->all(FLERR,"Fix recenter group has no atoms"); + if (group->count(igroup) == 0) error->all(FLERR,"Fix recenter group {} has no atoms", arg[1]); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_spring.cpp b/src/fix_spring.cpp index 93c1f7867d..829073179d 100644 --- a/src/fix_spring.cpp +++ b/src/fix_spring.cpp @@ -73,11 +73,9 @@ FixSpring::FixSpring(LAMMPS *lmp, int narg, char **arg) : group2 = utils::strdup(arg[4]); igroup2 = group->find(arg[4]); - if (igroup2 == -1) - error->all(FLERR,"Fix spring couple group ID does not exist"); if (igroup2 == igroup) - error->all(FLERR,"Two groups cannot be the same in fix spring couple"); - group2bit = group->bitmask[igroup2]; + error->all(FLERR,"The two groups cannot be the same in fix spring couple"); + group2bit = group->get_bitmask_by_id(FLERR, arg[4], "fix spring"); k_spring = utils::numeric(FLERR,arg[5],false,lmp); xflag = yflag = zflag = 1; @@ -121,9 +119,7 @@ void FixSpring::init() if (group2) { igroup2 = group->find(group2); - if (igroup2 == -1) - error->all(FLERR,"Fix spring couple group ID does not exist"); - group2bit = group->bitmask[igroup2]; + group2bit = group->get_bitmask_by_id(FLERR, group2, "fix spring"); } masstotal = group->mass(igroup); From cea31e463d54effc7687cabdaa2156652f7cb1c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Mar 2025 10:20:31 -0400 Subject: [PATCH 10/99] remove references to -DLAMMPS_SMALLSMALL and trigger error when used --- cmake/CMakeLists.txt | 4 +- cmake/Modules/LAMMPSInterfacePlugin.cmake | 4 +- doc/src/Build_extras.rst | 9 ++-- doc/src/Build_settings.rst | 15 ++---- doc/src/Errors_messages.rst | 5 +- doc/src/Fortran.rst | 3 +- doc/src/Library_add.rst | 6 +-- fortran/lammps.f90 | 66 +++-------------------- src/info.cpp | 2 - src/lammps.cpp | 7 --- src/library.h | 2 +- src/lmptype.h | 42 +++------------ 12 files changed, 35 insertions(+), 130 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c1a0875c15..f22fa401a2 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -431,8 +431,8 @@ else() target_link_libraries(lammps PUBLIC mpi_stubs) endif() -set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallsmall: all 32-bit, smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") -set(LAMMPS_SIZES_VALUES smallbig bigbig smallsmall) +set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") +set(LAMMPS_SIZES_VALUES smallbig bigbig) set_property(CACHE LAMMPS_SIZES PROPERTY STRINGS ${LAMMPS_SIZES_VALUES}) validate_option(LAMMPS_SIZES LAMMPS_SIZES_VALUES) string(TOUPPER ${LAMMPS_SIZES} LAMMPS_SIZES) diff --git a/cmake/Modules/LAMMPSInterfacePlugin.cmake b/cmake/Modules/LAMMPSInterfacePlugin.cmake index fcaf604778..5b7444f62c 100644 --- a/cmake/Modules/LAMMPSInterfacePlugin.cmake +++ b/cmake/Modules/LAMMPSInterfacePlugin.cmake @@ -260,8 +260,8 @@ endif() ################ # integer size selection -set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallsmall: all 32-bit, smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") -set(LAMMPS_SIZES_VALUES smallbig bigbig smallsmall) +set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") +set(LAMMPS_SIZES_VALUES smallbig bigbig) set_property(CACHE LAMMPS_SIZES PROPERTY STRINGS ${LAMMPS_SIZES_VALUES}) validate_option(LAMMPS_SIZES LAMMPS_SIZES_VALUES) string(TOUPPER ${LAMMPS_SIZES} LAMMPS_SIZES) diff --git a/doc/src/Build_extras.rst b/doc/src/Build_extras.rst index f57407f9c1..ca64ffbe2e 100644 --- a/doc/src/Build_extras.rst +++ b/doc/src/Build_extras.rst @@ -255,11 +255,10 @@ Traditional make Before building LAMMPS, you must build the GPU library in ``lib/gpu``\ . You can do this manually if you prefer; follow the instructions in -``lib/gpu/README``. Note that the GPU library uses MPI calls, so you must -use the same MPI library (or the STUBS library) settings as the main -LAMMPS code. This also applies to the ``-DLAMMPS_BIGBIG``\ , -``-DLAMMPS_SMALLBIG``\ , or ``-DLAMMPS_SMALLSMALL`` settings in whichever -Makefile you use. +``lib/gpu/README``. Note that the GPU library uses MPI calls, so you +must use the same MPI library (or the STUBS library) settings as the +main LAMMPS code. This also applies to the ``-DLAMMPS_BIGBIG`` or +``-DLAMMPS_SMALLBIG`` settings in whichever Makefile you use. You can also build the library in one step from the ``lammps/src`` dir, using a command like these, which simply invokes the ``lib/gpu/Install.py`` diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index fb3ebf4b48..7717618f12 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -315,7 +315,7 @@ large counters can become before "rolling over". The default setting of .. code-block:: bash - -D LAMMPS_SIZES=value # smallbig (default) or bigbig or smallsmall + -D LAMMPS_SIZES=value # smallbig (default) or bigbig If the variable is not set explicitly, "smallbig" is used. @@ -326,7 +326,7 @@ large counters can become before "rolling over". The default setting of .. code-block:: make - LMP_INC = -DLAMMPS_SMALLBIG # or -DLAMMPS_BIGBIG or -DLAMMPS_SMALLSMALL + LMP_INC = -DLAMMPS_SMALLBIG # or -DLAMMPS_BIGBIG The default setting is ``-DLAMMPS_SMALLBIG`` if nothing is specified @@ -335,34 +335,27 @@ LAMMPS system size restrictions .. list-table:: :header-rows: 1 - :widths: 18 27 28 27 + :widths: 27 36 37 :align: center * - - smallbig - bigbig - - smallsmall * - Total atom count - :math:`2^{63}` atoms (= :math:`9.223 \cdot 10^{18}`) - :math:`2^{63}` atoms (= :math:`9.223 \cdot 10^{18}`) - - :math:`2^{31}` atoms (= :math:`2.147 \cdot 10^9`) * - Total timesteps - :math:`2^{63}` steps (= :math:`9.223 \cdot 10^{18}`) - :math:`2^{63}` steps (= :math:`9.223 \cdot 10^{18}`) - - :math:`2^{31}` steps (= :math:`2.147 \cdot 10^9`) * - Atom ID values - :math:`1 \le i \le 2^{31} (= 2.147 \cdot 10^9)` - :math:`1 \le i \le 2^{63} (= 9.223 \cdot 10^{18})` - - :math:`1 \le i \le 2^{31} (= 2.147 \cdot 10^9)` * - Image flag values - :math:`-512 \le i \le 511` - :math:`- 1\,048\,576 \le i \le 1\,048\,575` - - :math:`-512 \le i \le 511` The "bigbig" setting increases the size of image flags and atom IDs over -"smallbig" and the "smallsmall" setting is only needed if your machine -does not support 64-bit integers or incurs performance penalties when -using them. +the default "smallbig" setting. These are limits for the core of the LAMMPS code, specific features or some styles may impose additional limits. The :ref:`ATC diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index bfc395067a..7be94f6fb3 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -6233,8 +6233,9 @@ Doc page with :doc:`WARNING messages ` Atom IDs must be positive integers. *One or more atom IDs is too big* - The limit on atom IDs is set by the SMALLBIG, BIGBIG, SMALLSMALL - setting in your LAMMPS build. See the :doc:`Build settings ` page for more info. + The limit on atom IDs is set by the SMALLBIG, BIGBIG + setting in your LAMMPS build. See the + :doc:`Build settings ` page for more info. *One or more atom IDs is zero* Either all atoms IDs must be zero or none of them. diff --git a/doc/src/Fortran.rst b/doc/src/Fortran.rst index ea0ade5cf4..0a8434f63d 100644 --- a/doc/src/Fortran.rst +++ b/doc/src/Fortran.rst @@ -2773,8 +2773,7 @@ Procedures Bound to the :f:type:`lammps` Derived Type END SUBROUTINE external_callback END INTERFACE - where ``c_bigint`` is ``c_int`` if ``-DLAMMPS_SMALLSMALL`` was used and - ``c_int64_t`` otherwise; and ``c_tagint`` is ``c_int64_t`` if + where ``c_bigint`` is ``c_int64_t`` and ``c_tagint`` is ``c_int64_t`` if ``-DLAMMPS_BIGBIG`` was used and ``c_int`` otherwise. The argument *caller* to :f:subr:`set_fix_external_callback` is unlimited diff --git a/doc/src/Library_add.rst b/doc/src/Library_add.rst index 8777ebbcad..e955422984 100644 --- a/doc/src/Library_add.rst +++ b/doc/src/Library_add.rst @@ -19,9 +19,9 @@ there are now a few requirements for including new changes or extensions. be added. - New features should also be implemented and documented not just for the C interface, but also the Python and Fortran interfaces. - - All additions should work and be compatible with ``-DLAMMPS_BIGBIG``, - ``-DLAMMPS_SMALLBIG``, ``-DLAMMPS_SMALLSMALL`` as well as when - compiling with and without MPI support. + - All additions should work and be compatible with + ``-DLAMMPS_BIGBIG``, ``-DLAMMPS_SMALLBIG`` as well as when compiling + with and without MPI support. - The ``library.h`` file should be kept compatible to C code at a level similar to C89. Its interfaces may not reference any custom data types (e.g. ``bigint``, ``tagint``, and so on) that diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 2cfd4422b0..9922fd1f2d 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -334,14 +334,6 @@ MODULE LIBLAMMPS ! Interface templates for fix external callbacks ABSTRACT INTERFACE - SUBROUTINE external_callback_smallsmall(caller, timestep, ids, x, fexternal) - IMPORT :: c_int, c_double - CLASS(*), INTENT(INOUT) :: caller - INTEGER(c_int), INTENT(IN) :: timestep - INTEGER(c_int), DIMENSION(:), INTENT(IN) :: ids - REAL(c_double), DIMENSION(:,:), INTENT(IN) :: x - REAL(c_double), DIMENSION(:,:), INTENT(OUT) :: fexternal - END SUBROUTINE external_callback_smallsmall SUBROUTINE external_callback_smallbig(caller, timestep, ids, x, fexternal) IMPORT :: c_int, c_double, c_int64_t CLASS(*), INTENT(INOUT) :: caller @@ -363,8 +355,6 @@ MODULE LIBLAMMPS ! Derived type for fix external callback data TYPE fix_external_data CHARACTER(LEN=:), ALLOCATABLE :: id - PROCEDURE(external_callback_smallsmall), NOPASS, POINTER :: & - callback_smallsmall => NULL() PROCEDURE(external_callback_smallbig), NOPASS, POINTER :: & callback_smallbig => NULL() PROCEDURE(external_callback_bigbig), NOPASS, POINTER :: & @@ -2262,7 +2252,7 @@ CONTAINS CALL lammps_free(Cname) END SUBROUTINE lmp_scatter_atoms_subset_double - ! equivalent function to lammps_gather_bonds (LAMMPS_SMALLSMALL or SMALLBIG) + ! equivalent function to lammps_gather_bonds (LAMMPS_SMALLBIG) SUBROUTINE lmp_gather_bonds_small(self, data) CLASS(lammps), INTENT(IN) :: self INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data @@ -2304,7 +2294,7 @@ CONTAINS CALL lammps_gather_bonds(self%handle, Cdata) END SUBROUTINE lmp_gather_bonds_big - ! equivalent function to lammps_gather_angles (LAMMPS_SMALLSMALL or SMALLBIG) + ! equivalent function to lammps_gather_angles (LAMMPS_SMALLBIG) SUBROUTINE lmp_gather_angles_small(self, data) CLASS(lammps), INTENT(IN) :: self INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data @@ -2346,7 +2336,7 @@ CONTAINS CALL lammps_gather_angles(self%handle, Cdata) END SUBROUTINE lmp_gather_angles_big - ! equivalent function to lammps_gather_dihedrals (LAMMPS_SMALLSMALL or SMALLBIG) + ! equivalent function to lammps_gather_dihedrals (LAMMPS_SMALLBIG) SUBROUTINE lmp_gather_dihedrals_small(self, data) CLASS(lammps), INTENT(IN) :: self INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data @@ -2388,7 +2378,7 @@ CONTAINS CALL lammps_gather_dihedrals(self%handle, Cdata) END SUBROUTINE lmp_gather_dihedrals_big - ! equivalent function to lammps_gather_impropers (LAMMPS_SMALLSMALL or SMALLBIG) + ! equivalent function to lammps_gather_impropers (LAMMPS_SMALLBIG) SUBROUTINE lmp_gather_impropers_small(self, data) CLASS(lammps), INTENT(IN) :: self INTEGER(c_int), DIMENSION(:), ALLOCATABLE, TARGET, INTENT(OUT) :: data @@ -2763,7 +2753,7 @@ CONTAINS IF (tagint_size /= 4_c_int .AND. (PRESENT(id) .OR. PRESENT(image))) THEN CALL lmp_error(self, LMP_ERROR_ALL + LMP_ERROR_WORLD, & 'Unable to create_atoms; your id/image array types are incompatible& - & with LAMMPS_SMALLBIG and LAMMPS_SMALLSMALL [Fortran/create_atoms]') + & with LAMMPS_SMALLBIG [Fortran/create_atoms]') END IF n = SIZE(type, KIND=c_int) IF (PRESENT(bexpand)) THEN @@ -3360,7 +3350,7 @@ CONTAINS construct_fix_external_data%id = ' ' END FUNCTION construct_fix_external_data - ! equivalent function to lammps_set_fix_external_callback for -DSMALLSMALL + ! equivalent function to lammps_set_fix_external_callback ! note that "caller" is wrapped into a fix_external_data derived type along ! with the fix id and the Fortran calling function. SUBROUTINE lmp_set_fix_external_callback(self, id, callback, caller) @@ -3394,11 +3384,7 @@ CONTAINS ext_data(this_fix)%id = id ext_data(this_fix)%lammps_instance => self - IF (SIZE_TAGINT == 4_c_int .AND. SIZE_BIGINT == 4_c_int) THEN - ! -DSMALLSMALL - c_callback = C_FUNLOC(callback_wrapper_smallsmall) - CALL set_fix_external_callback_smallsmall(this_fix, callback) - ELSE IF (SIZE_TAGINT == 8_c_int .AND. SIZE_BIGINT == 8_c_int) THEN + IF (SIZE_TAGINT == 8_c_int .AND. SIZE_BIGINT == 8_c_int) THEN ! -DBIGBIG c_callback = C_FUNLOC(callback_wrapper_bigbig) CALL set_fix_external_callback_bigbig(this_fix, callback) @@ -3420,12 +3406,6 @@ CONTAINS END SUBROUTINE lmp_set_fix_external_callback ! Wrappers to assign callback pointers with explicit interfaces - SUBROUTINE set_fix_external_callback_smallsmall(id, callback) - INTEGER, INTENT(IN) :: id - PROCEDURE(external_callback_smallsmall) :: callback - - ext_data(id)%callback_smallsmall => callback - END SUBROUTINE set_fix_external_callback_smallsmall SUBROUTINE set_fix_external_callback_smallbig(id, callback) INTEGER, INTENT(IN) :: id @@ -3450,9 +3430,7 @@ CONTAINS DO i = 1, SIZE(ext_data) - 1 c_id = f2c_string(ext_data(i)%id) c_caller = C_LOC(ext_data(i)) - IF (SIZE_TAGINT == 4_c_int .AND. SIZE_BIGINT == 4_c_int) THEN - c_callback = C_FUNLOC(callback_wrapper_smallsmall) - ELSE IF (SIZE_TAGINT == 8_c_int .AND. SIZE_BIGINT == 8_c_int) THEN + IF (SIZE_TAGINT == 8_c_int .AND. SIZE_BIGINT == 8_c_int) THEN c_callback = C_FUNLOC(callback_wrapper_bigbig) ELSE c_callback = C_FUNLOC(callback_wrapper_smallbig) @@ -3464,34 +3442,6 @@ CONTAINS END SUBROUTINE rebind_external_callback_data ! companions to lmp_set_fix_external_callback to change interface - SUBROUTINE callback_wrapper_smallsmall(caller, timestep, nlocal, ids, x, & - fexternal) BIND(C) - TYPE(c_ptr), INTENT(IN), VALUE :: caller - INTEGER(c_int), INTENT(IN), VALUE :: timestep - INTEGER(c_int), INTENT(IN), VALUE :: nlocal - TYPE(c_ptr), INTENT(IN), VALUE :: ids, x, fexternal - TYPE(c_ptr), DIMENSION(:), POINTER :: x0, f0 - INTEGER(c_int), DIMENSION(:), POINTER :: f_ids => NULL() - REAL(c_double), DIMENSION(:,:), POINTER :: f_x => NULL(), & - f_fexternal => NULL() - TYPE(fix_external_data), POINTER :: f_caller => NULL() - - CALL C_F_POINTER(ids, f_ids, [nlocal]) - CALL C_F_POINTER(x, x0, [nlocal]) - CALL C_F_POINTER(x0(1), f_x, [3, nlocal]) - CALL C_F_POINTER(fexternal, f0, [nlocal]) - CALL C_F_POINTER(f0(1), f_fexternal, [3, nlocal]) - IF (C_ASSOCIATED(caller)) THEN - CALL C_F_POINTER(caller, f_caller) - CALL f_caller%callback_smallsmall(f_caller%caller, timestep, f_ids, & - f_x, f_fexternal) - ELSE - CALL lmp_error(f_caller%lammps_instance, & - LMP_ERROR_ALL + LMP_ERROR_WORLD, & - 'Got null pointer from "caller"; this should never happen;& - & please report a bug') - END IF - END SUBROUTINE callback_wrapper_smallsmall SUBROUTINE callback_wrapper_smallbig(caller, timestep, nlocal, ids, x, & fexternal) BIND(C) diff --git a/src/info.cpp b/src/info.cpp index 17b1f417ea..072ec97899 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -304,8 +304,6 @@ void Info::command(int narg, char **arg) fputs("-DLAMMPS_BIGBIG\n",out); #elif defined(LAMMPS_SMALLBIG) fputs("-DLAMMPS_SMALLBIG\n",out); -#else // defined(LAMMPS_SMALLSMALL) - fputs("-DLAMMPS_SMALLSMALL\n",out); #endif if (has_gzip_support()) utils::print(out,"\n{}\n",platform::compress_info()); diff --git a/src/lammps.cpp b/src/lammps.cpp index cecad6e870..9d2e755f77 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -688,11 +688,6 @@ LAMMPS::LAMMPS(int narg, char **arg, MPI_Comm communicator) : sizeof(tagint) != 8 || sizeof(bigint) != 8) error->all(FLERR,"Small to big integers are not sized correctly"); #endif -#ifdef LAMMPS_SMALLSMALL - if (sizeof(smallint) != 4 || sizeof(imageint) != 4 || - sizeof(tagint) != 4 || sizeof(bigint) != 4) - error->all(FLERR,"Small to big integers are not sized correctly"); -#endif // create Kokkos class if KOKKOS installed, unless explicitly switched off // instantiation creates dummy Kokkos class if KOKKOS is not installed @@ -1481,8 +1476,6 @@ void LAMMPS::print_config(FILE *fp) fputs("-DLAMMPS_BIGBIG\n",fp); #elif defined(LAMMPS_SMALLBIG) fputs("-DLAMMPS_SMALLBIG\n",fp); -#else // defined(LAMMPS_SMALLSMALL) - fputs("-DLAMMPS_SMALLSMALL\n",fp); #endif utils::print(fp,"sizeof(smallint): {}-bit\n" diff --git a/src/library.h b/src/library.h index 99b251ee85..6f1c21d748 100644 --- a/src/library.h +++ b/src/library.h @@ -24,7 +24,7 @@ /* We follow the behavior of regular LAMMPS compilation and assume * -DLAMMPS_SMALLBIG when no define is set. */ -#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) && !defined(LAMMPS_SMALLSMALL) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif diff --git a/src/lmptype.h b/src/lmptype.h index ec2cd3f7e9..8927de429c 100644 --- a/src/lmptype.h +++ b/src/lmptype.h @@ -80,10 +80,16 @@ static constexpr uint32_t MEMCPYMASK = (static_cast(1) << 31) - 1U; // default to 32-bit smallint and other ints, 64-bit bigint -#if !defined(LAMMPS_SMALLSMALL) && !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif +// we no longer support LAMMPS_SMALLSMALL + +#if defined(LAMMPS_SMALLSMALL) +#error LAMMPS no longer supports -DLAMMPS_SMALLSMALL +#endif + // allow user override of LONGLONG to LONG, necessary for some machines/MPI #ifdef LAMMPS_LONGLONG_TO_LONG @@ -162,40 +168,6 @@ typedef int64_t bigint; #endif -// for machines that do not support 64-bit ints -// 32-bit smallint/imageint/tagint/bigint - -#ifdef LAMMPS_SMALLSMALL - -typedef int smallint; -typedef int imageint; -typedef int tagint; -typedef int bigint; - -#define MAXSMALLINT INT_MAX -#define MAXTAGINT INT_MAX -#define MAXBIGINT INT_MAX -#define MAXDOUBLEINT INT_MAX - -#define MPI_LMP_TAGINT MPI_INT -#define MPI_LMP_IMAGEINT MPI_INT -#define MPI_LMP_BIGINT MPI_INT - -#define TAGINT_FORMAT "%d" -#define BIGINT_FORMAT "%d" - -#define LAMMPS_TAGINT LAMMPS_INT -#define LAMMPS_TAGINT_2D LAMMPS_INT_2D -#define LAMMPS_BIGINT LAMMPS_INT -#define LAMMPS_BIGINT_2D LAMMPS_INT_2D - -#define IMGMASK 1023 -#define IMGMAX 512 -#define IMGBITS 10 -#define IMG2BITS 20 - -#endif - /** Data structure for packing 32-bit and 64-bit integers * into double (communication) buffers * From 557d279774a9f87eec6471b561adc3b42b48ac08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Mar 2025 16:31:09 -0400 Subject: [PATCH 11/99] remove references to SMALLSMALL from examples --- examples/COUPLE/plugin/liblammpsplugin.h | 4 +--- examples/plugins/LAMMPSInterfaceCXX.cmake | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/COUPLE/plugin/liblammpsplugin.h b/examples/COUPLE/plugin/liblammpsplugin.h index c765b0adc3..c347dac4c1 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.h +++ b/examples/COUPLE/plugin/liblammpsplugin.h @@ -24,7 +24,7 @@ * Follow the behavior of regular LAMMPS compilation and assume * -DLAMMPS_SMALLBIG when no define is set. */ -#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) && !defined(LAMMPS_SMALLSMALL) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif @@ -100,8 +100,6 @@ extern "C" { #if defined(LAMMPS_BIGBIG) typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); -#elif defined(LAMMPS_SMALLSMALL) -typedef void (*FixExternalFnPtr)(void *, int, int, int *, double **, double **); #else typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **); #endif diff --git a/examples/plugins/LAMMPSInterfaceCXX.cmake b/examples/plugins/LAMMPSInterfaceCXX.cmake index d1f8faec22..4cd4510a61 100644 --- a/examples/plugins/LAMMPSInterfaceCXX.cmake +++ b/examples/plugins/LAMMPSInterfaceCXX.cmake @@ -131,8 +131,8 @@ endif() ################ # integer size selection -set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallsmall: all 32-bit, smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") -set(LAMMPS_SIZES_VALUES smallbig bigbig smallsmall) +set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") +set(LAMMPS_SIZES_VALUES smallbig bigbig) set_property(CACHE LAMMPS_SIZES PROPERTY STRINGS ${LAMMPS_SIZES_VALUES}) validate_option(LAMMPS_SIZES LAMMPS_SIZES_VALUES) string(TOUPPER ${LAMMPS_SIZES} LAMMPS_SIZES) From 361914f3f154b1d7f229020f6cdba7265e5e59e4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Mar 2025 16:31:30 -0400 Subject: [PATCH 12/99] remove references to SMALLSMALL from GPU library --- lib/gpu/Makefile.aurora | 4 ++-- lib/gpu/Makefile.cuda | 4 ++-- lib/gpu/Makefile.cuda_mps | 4 ++-- lib/gpu/Makefile.hip | 4 ++-- lib/gpu/Makefile.linux | 4 ++-- lib/gpu/Makefile.linux_multi | 4 ++-- lib/gpu/Makefile.linux_opencl | 4 ++-- lib/gpu/Makefile.oneapi | 4 ++-- lib/gpu/Makefile.oneapi_prof | 4 ++-- lib/gpu/Makefile.serial | 4 ++-- lib/gpu/lal_amoeba.cu | 6 ------ lib/gpu/lal_hippo.cu | 6 ------ lib/gpu/lal_lj_tip4p_long.cu | 6 ------ lib/gpu/lal_neighbor_gpu.cu | 6 ------ lib/gpu/lal_precision.h | 7 +------ lib/gpu/lal_preprocessor.h | 3 +-- 16 files changed, 22 insertions(+), 52 deletions(-) diff --git a/lib/gpu/Makefile.aurora b/lib/gpu/Makefile.aurora index c343e061ee..1f6c9b646a 100644 --- a/lib/gpu/Makefile.aurora +++ b/lib/gpu/Makefile.aurora @@ -11,8 +11,8 @@ EXTRAMAKE = Makefile.lammps.opencl # OCL_TUNE = -DCYPRESS_OCL # -- Uncomment for AMD Cypress OCL_TUNE = -DGENERIC_OCL # -- Uncomment for generic device -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.cuda b/lib/gpu/Makefile.cuda index 75428c9513..d7552d267c 100644 --- a/lib/gpu/Makefile.cuda +++ b/lib/gpu/Makefile.cuda @@ -11,8 +11,8 @@ ifeq ($(CUDA_HOME),) CUDA_HOME = /usr/local/cuda endif -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.cuda_mps b/lib/gpu/Makefile.cuda_mps index 22a34c105c..4063de92e7 100644 --- a/lib/gpu/Makefile.cuda_mps +++ b/lib/gpu/Makefile.cuda_mps @@ -11,8 +11,8 @@ ifeq ($(CUDA_HOME),) CUDA_HOME = /usr/local/cuda endif -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.hip b/lib/gpu/Makefile.hip index 0350c841c4..54085523bf 100644 --- a/lib/gpu/Makefile.hip +++ b/lib/gpu/Makefile.hip @@ -7,8 +7,8 @@ # - change HIP_ARCH for your GPU # ------------------------------------------------------------------------- */ -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.linux b/lib/gpu/Makefile.linux index e02413f3ba..6b7122ea6b 100644 --- a/lib/gpu/Makefile.linux +++ b/lib/gpu/Makefile.linux @@ -51,8 +51,8 @@ CUDA_ARCH = -arch=sm_60 # Hopper hardware #CUDA_ARCH = -arch=sm_90 -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.linux_multi b/lib/gpu/Makefile.linux_multi index e3a76d9934..3fac7030ea 100644 --- a/lib/gpu/Makefile.linux_multi +++ b/lib/gpu/Makefile.linux_multi @@ -51,8 +51,8 @@ CUDA_CODE = -gencode arch=compute_50,code=[sm_50,compute_50] -gencode arch=compu CUDA_ARCH += $(CUDA_CODE) -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.linux_opencl b/lib/gpu/Makefile.linux_opencl index b4b25544ee..1ad4ceba96 100644 --- a/lib/gpu/Makefile.linux_opencl +++ b/lib/gpu/Makefile.linux_opencl @@ -6,8 +6,8 @@ EXTRAMAKE = Makefile.lammps.opencl -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.oneapi b/lib/gpu/Makefile.oneapi index e67f4bb082..79e52482c7 100644 --- a/lib/gpu/Makefile.oneapi +++ b/lib/gpu/Makefile.oneapi @@ -6,8 +6,8 @@ EXTRAMAKE = Makefile.lammps.opencl -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.oneapi_prof b/lib/gpu/Makefile.oneapi_prof index 58a03392e2..160b2f0d33 100644 --- a/lib/gpu/Makefile.oneapi_prof +++ b/lib/gpu/Makefile.oneapi_prof @@ -6,8 +6,8 @@ EXTRAMAKE = Makefile.lammps.opencl -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/Makefile.serial b/lib/gpu/Makefile.serial index 67d2ce927d..43541ef019 100644 --- a/lib/gpu/Makefile.serial +++ b/lib/gpu/Makefile.serial @@ -45,8 +45,8 @@ CUDA_ARCH = -arch=sm_60 #CUDA_ARCH = -arch=sm_80 #CUDA_ARCH = -arch=sm_86 -# this setting should match LAMMPS Makefile -# one of LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG and LAMMPS_SMALLSMALL +# this setting should match the LAMMPS Makefile +# either LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG LMP_INC = -DLAMMPS_SMALLBIG diff --git a/lib/gpu/lal_amoeba.cu b/lib/gpu/lal_amoeba.cu index a92509f06d..14d1d3e5de 100644 --- a/lib/gpu/lal_amoeba.cu +++ b/lib/gpu/lal_amoeba.cu @@ -23,9 +23,6 @@ #include "inttypes.h" #define tagint int64_t #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #ifndef _DOUBLE_DOUBLE _texture( pos_tex,float4); _texture( q_tex,float); @@ -43,9 +40,6 @@ _texture( q_tex,int2); #ifdef LAMMPS_BIGBIG #define tagint long #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #endif // defined(NV_KERNEL) || defined(USE_HIP) diff --git a/lib/gpu/lal_hippo.cu b/lib/gpu/lal_hippo.cu index 01ad8e753a..3ae1e5ff21 100644 --- a/lib/gpu/lal_hippo.cu +++ b/lib/gpu/lal_hippo.cu @@ -23,9 +23,6 @@ #include "inttypes.h" #define tagint int64_t #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #ifndef _DOUBLE_DOUBLE _texture( pos_tex,float4); _texture( q_tex,float); @@ -43,9 +40,6 @@ _texture( q_tex,int2); #ifdef LAMMPS_BIGBIG #define tagint long #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #endif // defined(NV_KERNEL) || defined(USE_HIP) diff --git a/lib/gpu/lal_lj_tip4p_long.cu b/lib/gpu/lal_lj_tip4p_long.cu index 26ceb38538..46a47d7710 100644 --- a/lib/gpu/lal_lj_tip4p_long.cu +++ b/lib/gpu/lal_lj_tip4p_long.cu @@ -27,9 +27,6 @@ #define tagint int64_t #endif #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #ifndef _DOUBLE_DOUBLE _texture( pos_tex,float4); _texture( q_tex,float); @@ -50,9 +47,6 @@ _texture( q_tex,int2); #define tagint int64_t #endif #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #define pos_tex x_ #define q_tex q_ #endif diff --git a/lib/gpu/lal_neighbor_gpu.cu b/lib/gpu/lal_neighbor_gpu.cu index 7d0941ccd5..a0fa26b7e4 100644 --- a/lib/gpu/lal_neighbor_gpu.cu +++ b/lib/gpu/lal_neighbor_gpu.cu @@ -28,9 +28,6 @@ #define tagint int64_t #endif #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #ifndef _DOUBLE_DOUBLE _texture( pos_tex,float4); #else @@ -140,9 +137,6 @@ __kernel void kernel_calc_cell_counts(const unsigned *restrict cell_id, #ifdef LAMMPS_BIGBIG #define tagint long #endif -#ifdef LAMMPS_SMALLSMALL -#define tagint int -#endif #endif __kernel void transpose(__global tagint *restrict out, diff --git a/lib/gpu/lal_precision.h b/lib/gpu/lal_precision.h index 85e009e96b..f0df796b49 100644 --- a/lib/gpu/lal_precision.h +++ b/lib/gpu/lal_precision.h @@ -150,8 +150,7 @@ enum{SPHERE_SPHERE,SPHERE_ELLIPSE,ELLIPSE_SPHERE,ELLIPSE_ELLIPSE}; // default to 32-bit smallint and other ints, 64-bit bigint: // same as defined in src/lmptype.h -#if !defined(LAMMPS_SMALLSMALL) && !defined(LAMMPS_BIGBIG) && \ - !defined(LAMMPS_SMALLBIG) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif @@ -164,9 +163,5 @@ typedef int tagint; typedef int64_t tagint; #define OCL_INT_TYPE "-DLAMMPS_BIGBIG" #endif -#ifdef LAMMPS_SMALLSMALL -typedef int tagint; -#define OCL_INT_TYPE "-DLAMMPS_SMALLSMALL" -#endif #endif // LAL_PRECISION_H diff --git a/lib/gpu/lal_preprocessor.h b/lib/gpu/lal_preprocessor.h index 93d6936f38..d7f7c700c5 100644 --- a/lib/gpu/lal_preprocessor.h +++ b/lib/gpu/lal_preprocessor.h @@ -406,7 +406,6 @@ ucl_inline int sbmask15(int j) { return j >> SBBITS15 & 7; }; // default to 32-bit smallint and other ints, 64-bit bigint: // same as defined in src/lmptype.h -#if !defined(LAMMPS_SMALLSMALL) && !defined(LAMMPS_BIGBIG) && \ - !defined(LAMMPS_SMALLBIG) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif From aafdac1917f007ef9d501583bd307b3616ba7cc6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Mar 2025 21:06:23 -0400 Subject: [PATCH 13/99] update intros to three pages with errors and warnings and cross-reference them --- doc/src/Errors_details.rst | 19 +++++++++++-------- doc/src/Errors_messages.rst | 16 ++++++++++------ doc/src/Errors_warnings.rst | 16 ++++++++++------ 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 5aa24d74c8..d0e6233fb2 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -1,12 +1,15 @@ -Error and warning details -========================= +Errors and warnings details +=========================== -Many errors or warnings are self-explanatory and thus straightforward to -resolve. However, there are also cases, where there is no single cause -and explanation, where LAMMPS can only detect symptoms of an error but -not the exact cause, or where the explanation needs to be more detailed -than what can be fit into a message printed by the program. The -following are discussions of such cases. +Many errors and warnings that LAMMPS outputs are self-explanatory and +thus straightforward to resolve. However, there are also cases, where +there is no single cause and explanation. LAMMPS can only detect +symptoms of an error but not name the exact cause, or the explanation +needs to be more detailed than what can be fit into a short message +printed by the program. The following are discussions of such cases; +first on a more general level and then for specific cases. In the +latter cases, LAMMPS will output a short message and then provide +a URL that links to a specific section on this page. .. contents:: diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index bfc395067a..d8102eee25 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -1,11 +1,15 @@ Error messages ============== -This is an alphabetic list of the ERROR messages LAMMPS prints out and -the reason why. If the explanation here is not sufficient, the -documentation for the offending command may help. Error messages also -list the source file and line number where the error was generated. -For example, a message like this: +This is an alphabetic list of some of the ERROR messages LAMMPS prints +out and the reason why. If the explanation here is not sufficient, the +documentation for the offending command may help. This is a historic +list and no longer updated. Instead the LAMMPS developers are trying +to provide more details right with the error message or link to a +paragraph with :doc:`detailed explanations `. + +Error messages also list the source file and line number where the error +was generated. For example, a message like this: .. parsed-literal:: @@ -14,7 +18,7 @@ For example, a message like this: means that line #78 in the file src/velocity.cpp generated the error. Looking in the source code may help you figure out what went wrong. -Doc page with :doc:`WARNING messages ` +Please also see the page with :doc:`Warning messages `. ---------- diff --git a/doc/src/Errors_warnings.rst b/doc/src/Errors_warnings.rst index 25aa87f162..3e4aab74d1 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -1,11 +1,15 @@ Warning messages ================ -This is an alphabetic list of the WARNING messages LAMMPS prints out -and the reason why. If the explanation here is not sufficient, the -documentation for the offending command may help. Warning messages -also list the source file and line number where the warning was -generated. For example, a message like this: +This is an alphabetic list of some of the WARNING messages LAMMPS prints +out and the reason why. If the explanation here is not sufficient, the +documentation for the offending command may help. This is a historic +list and no longer updated. Instead the LAMMPS developers are trying +to provide more details right with the error message or link to a +paragraph with :doc:`detailed explanations `. + +Warning messages also list the source file and line number where the +warning was generated. For example, a message like this: .. parsed-literal:: @@ -14,7 +18,7 @@ generated. For example, a message like this: means that line #187 in the file src/domain.cpp generated the error. Looking in the source code may help you figure out what went wrong. -Doc page with :doc:`ERROR messages ` +Please also see the page with :doc:`Error messages ` ---------- From ee930935f5d78f4a0a69b60b83ac2a2f9a08f0c4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 14 Mar 2025 21:07:43 -0400 Subject: [PATCH 14/99] remove "self-explanatory" explanations. --- doc/src/Errors_messages.rst | 3195 ----------------------------------- doc/src/Errors_warnings.rst | 134 +- 2 files changed, 1 insertion(+), 3328 deletions(-) diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index d8102eee25..14836cebb6 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -41,15 +41,6 @@ Please also see the page with :doc:`Warning messages `. All angle coefficients must be set in the data file or by the angle_coeff command before running a simulation. -*All atom IDs = 0 but atom_modify id = yes* - Self-explanatory. - -*All atoms of a swapped type must have same charge.* - Self-explanatory. - -*All atoms of a swapped type must have the same charge.* - Self-explanatory. - *All bond coeffs are not set* All bond coefficients must be set in the data file or by the bond_coeff command before running a simulation. @@ -83,12 +74,6 @@ Please also see the page with :doc:`Warning messages `. the x,y,z fields, else LAMMPS cannot reconstruct the unscaled coordinates. -*All universe/uloop variables must have same # of values* - Self-explanatory. - -*All variables in next command must be same style* - Self-explanatory. - *Angle atom missing in delete_bonds* The delete_bonds command cannot find one or more atoms in a particular angle on a particular processor. The pairwise cutoff is too short or @@ -128,18 +113,6 @@ Please also see the page with :doc:`Warning messages `. *Angle potential must be defined for SHAKE* When shaking angles, an angle_style potential must be used. -*Angle style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Angle style hybrid cannot have none as an argument* - Self-explanatory. - -*Angle style hybrid cannot use same angle style twice* - Self-explanatory. - -*Angle table must range from 0 to 180 degrees* - Self-explanatory. - *Angle table parameters did not set N* List of angle table parameters must include N setting. @@ -175,27 +148,6 @@ Please also see the page with :doc:`Warning messages `. *Arcsin of invalid value in variable formula* Argument of arcsin() must be between -1 and 1. -*Assigning body parameters to non-body atom* - Self-explanatory. - -*Assigning ellipsoid parameters to non-ellipsoid atom* - Self-explanatory. - -*Assigning line parameters to non-line atom* - Self-explanatory. - -*Assigning quat to non-body atom* - Self-explanatory. - -*Assigning tri parameters to non-tri atom* - Self-explanatory. - -*At least one atom of each swapped type must be present to define charges.* - Self-explanatory. - -*Atom IDs must be consecutive for velocity create loop all* - Self-explanatory. - *Atom IDs must be used for molecular systems* Atom IDs are used to identify and find partner atoms in bonds. @@ -219,21 +171,12 @@ Please also see the page with :doc:`Warning messages `. This is an internal LAMMPS error. Please report it to the developers. -*Atom style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Atom style hybrid cannot use same atom style twice* - Self-explanatory. - *Atom style template molecule must have atom types* The defined molecule(s) does not specify atom types. *Atom style was redefined after using fix property/atom* This is not allowed. -*Atom type must be zero in fix gcmc mol command* - Self-explanatory. - *Atom vector in equal-style variable formula* Atom vectors generate one value per atom which is not allowed in an equal-style variable. @@ -250,28 +193,13 @@ Please also see the page with :doc:`Warning messages `. The atom_modify map command cannot be used after a read_data, read_restart, or create_box command. -*Atom_modify sort and first options cannot be used together* - Self-explanatory. - *Atom_style command after simulation box is defined* The atom_style command cannot be used after a read_data, read_restart, or create_box command. -*Atom_style line can only be used in 2d simulations* - Self-explanatory. - -*Atom_style tri can only be used in 3d simulations* - Self-explanatory. - *Atomfile variable could not read values* Check the file assigned to the variable. -*Atomfile variable in equal-style variable formula* - Self-explanatory. - -*Atomfile-style variable in equal-style variable formula* - Self-explanatory. - *Attempt to pop empty stack in fix box/relax* Internal LAMMPS error. Please report it to the developers. @@ -281,9 +209,6 @@ Please also see the page with :doc:`Warning messages `. *Attempting to rescale a 0.0 temperature* Cannot rescale a temperature that is already 0.0. -*Attempting to insert more particles than available lattice points* - Self-explanatory. - *Bad FENE bond* Two atoms in a FENE bond have become so far apart that the bond cannot be computed. @@ -427,15 +352,6 @@ Please also see the page with :doc:`Warning messages `. *Bond potential must be defined for SHAKE* Cannot use fix shake unless bond potential is defined. -*Bond style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Bond style hybrid cannot have none as an argument* - Self-explanatory. - -*Bond style hybrid cannot use same bond style twice* - Self-explanatory. - *Bond style quartic cannot be used with 3,4-body interactions* No angle, dihedral, or improper styles can be defined when using bond style quartic. @@ -480,12 +396,6 @@ Please also see the page with :doc:`Warning messages `. *Bonds defined but no bond types* The data file header lists bonds but no bond types. -*Both restart files must use % or neither* - Self-explanatory. - -*Both restart files must use MPI-IO or neither* - Self-explanatory. - *Both sides of boundary must be periodic* Cannot specify a boundary as periodic only on the lo or hi side. Must be periodic on both sides. @@ -514,21 +424,6 @@ Please also see the page with :doc:`Warning messages `. Only triclinic boxes can be used with off-diagonal pressure components. See the region prism command for details. -*Can only use -plog with multiple partitions* - Self-explanatory. See page discussion of command-line switches. - -*Can only use -pscreen with multiple partitions* - Self-explanatory. See page discussion of command-line switches. - -*Can only use Kokkos supported regions with Kokkos package* - Self-explanatory. - -*Can only use NEB with 1-processor replicas* - This is current restriction for NEB as implemented in LAMMPS. - -*Can only use TAD with 1-processor replicas for NEB* - This is current restriction for NEB as implemented in LAMMPS. - *Cannot (yet) do analytic differentiation with pppm/gpu* This is a current restriction of this command. @@ -565,18 +460,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot (yet) use kspace_style pppm/stagger with triclinic systems* This feature is not yet supported. -*Cannot (yet) use molecular templates with Kokkos* - Self-explanatory. - -*Cannot (yet) use respa with Kokkos* - Self-explanatory. - -*Cannot (yet) use rigid bodies with fix deform and Kokkos* - Self-explanatory. - -*Cannot (yet) use rigid bodies with fix nh and Kokkos* - Self-explanatory. - *Cannot (yet) use single precision with MSM (remove -DFFT_SINGLE from Makefile and re-compile)* Single precision cannot be used with MSM. @@ -587,9 +470,6 @@ Please also see the page with :doc:`Warning messages `. The simulation box must be defined with edges aligned with the Cartesian axes. -*Cannot balance in z dimension for 2d simulation* - Self-explanatory. - *Cannot change box ortho/triclinic with certain fixes defined* This is because those fixes store the shape of the box. You need to use unfix to discard the fix, change the box, then redefine a new @@ -603,12 +483,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot change box tilt factors for orthogonal box* Cannot use tilt factors unless the simulation box is non-orthogonal. -*Cannot change box to orthogonal when tilt is non-zero* - Self-explanatory. - -*Cannot change box z boundary to non-periodic for a 2d simulation* - Self-explanatory. - *Cannot change dump_modify every for dump dcd* The frequency of writing dump dcd snapshots cannot be changed. @@ -623,20 +497,11 @@ Please also see the page with :doc:`Warning messages `. This is because fix pour pre-computes the time delay for particles to fall out of the insertion volume due to gravity. -*Cannot change to comm_style brick from tiled layout* - Self-explanatory. - *Cannot change_box after reading restart file with per-atom info* This is because the restart file info cannot be migrated with the atoms. You can get around this by performing a 0-timestep run which will assign the restart file info to actual atoms. -*Cannot change_box in xz or yz for 2d simulation* - Self-explanatory. - -*Cannot change_box in z dimension for 2d simulation* - Self-explanatory. - *Cannot clear group all* This operation is not allowed. @@ -672,27 +537,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot currently use pair reax with pair hybrid* This is not yet supported. -*Cannot currently use pppm/gpu with fix balance.* - Self-explanatory. - -*Cannot delete group all* - Self-explanatory. - -*Cannot delete group currently used by a compute* - Self-explanatory. - -*Cannot delete group currently used by a dump* - Self-explanatory. - -*Cannot delete group currently used by a fix* - Self-explanatory. - -*Cannot delete group currently used by atom_modify first* - Self-explanatory. - -*Cannot delete_atoms bond yes for non-molecular systems* - Self-explanatory. - *Cannot displace_atoms after reading restart file with per-atom info* This is because the restart file info cannot be migrated with the atoms. You can get around this by performing a 0-timestep run which @@ -706,9 +550,6 @@ Please also see the page with :doc:`Warning messages `. This is a restriction due to the way atoms are organized in a list to enable the atom_modify first command. -*Cannot dump sort on atom IDs with no atom IDs defined* - Self-explanatory. - *Cannot dump sort when multiple dump files are written* In this mode, each processor dumps its atoms to a file, so no sorting is allowed. @@ -721,30 +562,15 @@ Please also see the page with :doc:`Warning messages `. This is a restriction due to the way atoms are organized in a list to enable the atom_modify first command. -*Cannot find create_bonds group ID* - Self-explanatory. - *Cannot find delete_bonds group ID* Group ID used in the delete_bonds command does not exist. -*Cannot find specified group ID for core particles* - Self-explanatory. - -*Cannot find specified group ID for shell particles* - Self-explanatory. - *Cannot have both pair_modify shift and tail set to yes* These 2 options are contradictory. *Cannot intersect groups using a dynamic group* This operation is not allowed. -*Cannot mix molecular and molecule template atom styles* - Self-explanatory. - -*Cannot open -reorder file* - Self-explanatory. - *Cannot open ADP potential file %s* The specified ADP potential file cannot be opened. Check that the path and name are correct. @@ -805,16 +631,10 @@ Please also see the page with :doc:`Warning messages `. The specified Vashishta potential file cannot be opened. Check that the path and name are correct. -*Cannot open balance output file* - Self-explanatory. - *Cannot open coul/streitz potential file %s* The specified coul/streitz potential file cannot be opened. Check that the path and name are correct. -*Cannot open custom file* - Self-explanatory. - *Cannot open data file %s* The specified file cannot be opened. Check that the path and name are correct. @@ -823,9 +643,6 @@ Please also see the page with :doc:`Warning messages `. Using a "\*" in the name of the restart file will open the current directory to search for matching file names. -*Cannot open dump file* - Self-explanatory. - *Cannot open dump file %s* The output file for the dump command cannot be opened. Check that the path and name are correct. @@ -855,9 +672,6 @@ Please also see the page with :doc:`Warning messages `. The specified file cannot be opened. Check that the path and name are correct. -*Cannot open fix balance output file* - Self-explanatory. - *Cannot open fix poems file %s* The specified file cannot be opened. Check that the path and name are correct. @@ -901,9 +715,6 @@ Please also see the page with :doc:`Warning messages `. LAMMPS was compiled without support for reading and writing gzipped files through a pipeline to the gzip program with -DLAMMPS_GZIP. -*Cannot open input script %s* - Self-explanatory. - *Cannot open log.cite file* This file is created when you use some LAMMPS features, to indicate what paper you should cite on behalf of those who implemented @@ -938,15 +749,6 @@ Please also see the page with :doc:`Warning messages `. The specified polymorphic potential file cannot be opened. Check that the path and name are correct. -*Cannot open print file %s* - Self-explanatory. - -*Cannot open processors output file* - Self-explanatory. - -*Cannot open restart file %s* - Self-explanatory. - *Cannot open restart file for reading - MPI error: %s* This error was generated by MPI when reading/writing an MPI-IO restart file. @@ -960,9 +762,6 @@ Please also see the page with :doc:`Warning messages `. opened. Check that the directory you are running in allows for files to be created. -*Cannot open temporary file for world counter.* - Self-explanatory. - *Cannot open universe log file* For a multi-partition run, the master log file cannot be opened. Check that the directory you are running in allows for files to be @@ -977,9 +776,6 @@ Please also see the page with :doc:`Warning messages `. This error was generated by MPI when reading/writing an MPI-IO restart file. -*Cannot read_data without add keyword after simulation box is defined* - Self-explanatory. - *Cannot read_restart after simulation box is defined* The read_restart command cannot be used after a read_data, read_restart, or create_box command. @@ -1021,40 +817,10 @@ Please also see the page with :doc:`Warning messages `. all together (pair), or in pieces (inner/middle/outer). You can't do both. -*Cannot set cutoff/multi before simulation box is defined* - Self-explanatory. - -*Cannot set dpd/theta for this atom style* - Self-explanatory. - -*Cannot set dump_modify flush for dump xtc* - Self-explanatory. - *Cannot set mass for this atom style* This atom style does not support mass settings for each atom type. Instead they are defined on a per-atom basis in the data file. -*Cannot set meso/cv for this atom style* - Self-explanatory. - -*Cannot set meso/e for this atom style* - Self-explanatory. - -*Cannot set meso/rho for this atom style* - Self-explanatory. - -*Cannot set non-zero image flag for non-periodic dimension* - Self-explanatory. - -*Cannot set non-zero z velocity for 2d simulation* - Self-explanatory. - -*Cannot set quaternion for atom that has none* - Self-explanatory. - -*Cannot set quaternion with xy components for 2d system* - Self-explanatory. - *Cannot set respa hybrid and any of pair/inner/middle/outer* In the rRESPA integrator, you must compute pairwise potentials either all together (pair), with different cutoff regions (inner/middle/outer), @@ -1068,39 +834,18 @@ Please also see the page with :doc:`Warning messages `. This error was generated by MPI when reading/writing an MPI-IO restart file. -*Cannot set smd/contact/radius for this atom style* - Self-explanatory. - -*Cannot set smd/mass/density for this atom style* - Self-explanatory. - *Cannot set temperature for fix rigid/nph* The temp keyword cannot be specified. -*Cannot set theta for atom that is not a line* - Self-explanatory. - *Cannot set this attribute for this atom style* The attribute being set does not exist for the defined atom style. -*Cannot set variable z velocity for 2d simulation* - Self-explanatory. - -*Cannot skew triclinic box in z for 2d simulation* - Self-explanatory. - *Cannot subtract groups using a dynamic group* This operation is not allowed. *Cannot union groups using a dynamic group* This operation is not allowed. -*Cannot use -kokkos on without KOKKOS installed* - Self-explanatory. - -*Cannot use -reorder after -partition* - Self-explanatory. See page discussion of command-line switches. - *Cannot use Ewald with 2d simulation* The kspace style ewald cannot be used in 2d simulations. You can use 2d Ewald in a 3d simulation; see the kspace_modify command. @@ -1113,15 +858,9 @@ Please also see the page with :doc:`Warning messages `. *Cannot use EwaldDisp with 2d simulation* This is a current restriction of this command. -*Cannot use Kokkos pair style with rRESPA inner/middle* - Self-explanatory. - *Cannot use NEB unless atom map exists* Use the atom_modify command to create an atom map. -*Cannot use NEB with a single replica* - Self-explanatory. - *Cannot use NEB with atom_modify sort enabled* This is current restriction for NEB implemented in LAMMPS. @@ -1170,109 +909,40 @@ Please also see the page with :doc:`Warning messages `. The boundary style of the face where atoms are added can not be of type p (periodic). -*Cannot use atomfile-style variable unless atom map exists* - Self-explanatory. See the atom_modify command to create a map. - -*Cannot use both com and bias with compute temp/chunk* - Self-explanatory. - -*Cannot use chosen neighbor list style with buck/coul/cut/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with buck/coul/long/kk* - Self-explanatory. - *Cannot use chosen neighbor list style with buck/kk* That style is not supported by Kokkos. *Cannot use chosen neighbor list style with coul/cut/kk* That style is not supported by Kokkos. -*Cannot use chosen neighbor list style with coul/debye/kk* - Self-explanatory. - *Cannot use chosen neighbor list style with coul/dsf/kk* That style is not supported by Kokkos. *Cannot use chosen neighbor list style with coul/wolf/kk* That style is not supported by Kokkos. -*Cannot use chosen neighbor list style with lj/charmm/coul/charmm/implicit/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/charmm/coul/charmm/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/charmm/coul/long/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/class2/coul/cut/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/class2/coul/long/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/class2/kk* - Self-explanatory. - *Cannot use chosen neighbor list style with lj/cut/coul/cut/kk* That style is not supported by Kokkos. -*Cannot use chosen neighbor list style with lj/cut/coul/debye/kk* - Self-explanatory. - *Cannot use chosen neighbor list style with lj/cut/coul/long/kk* That style is not supported by Kokkos. *Cannot use chosen neighbor list style with lj/cut/kk* That style is not supported by Kokkos. -*Cannot use chosen neighbor list style with lj/expand/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/gromacs/coul/gromacs/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with lj/gromacs/kk* - Self-explanatory. - *Cannot use chosen neighbor list style with lj/spica/kk* That style is not supported by Kokkos. *Cannot use chosen neighbor list style with pair eam/kk* That style is not supported by Kokkos. -*Cannot use chosen neighbor list style with pair eam/kk/alloy* - Self-explanatory. - -*Cannot use chosen neighbor list style with pair eam/kk/fs* - Self-explanatory. - -*Cannot use chosen neighbor list style with pair sw/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with tersoff/kk* - Self-explanatory. - -*Cannot use chosen neighbor list style with tersoff/zbl/kk* - Self-explanatory. - -*Cannot use compute chunk/atom bin z for 2d model* - Self-explanatory. - *Cannot use compute cluster/atom unless atoms have IDs* Atom IDs are used to identify clusters. -*Cannot use create_atoms rotate unless single style* - Self-explanatory. - *Cannot use create_bonds unless atoms have IDs* This command requires a mapping from global atom IDs to local atoms, but the atoms that have been defined have no IDs. -*Cannot use create_bonds with non-molecular system* - Self-explanatory. - *Cannot use cwiggle in variable formula between runs* This is a function of elapsed time. @@ -1287,12 +957,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot use delete_bonds with non-molecular system* Your choice of atom style does not have bonds. -*Cannot use dump_modify fileper without % in dump file name* - Self-explanatory. - -*Cannot use dump_modify nfile without % in dump file name* - Self-explanatory. - *Cannot use dynamic group with fix adapt atom* This is not yet supported. @@ -1344,28 +1008,13 @@ Please also see the page with :doc:`Warning messages `. *Cannot use fix deform trate on a box with zero tilt* The trate style alters the current strain. -*Cannot use fix deposit rigid and not molecule* - Self-explanatory. - *Cannot use fix deposit rigid and shake* These two attributes are conflicting. -*Cannot use fix deposit shake and not molecule* - Self-explanatory. - -*Cannot use fix enforce2d with 3d simulation* - Self-explanatory. - *Cannot use fix gcmc in a 2d simulation* Fix gcmc is set up to run in 3d only. No 2d simulations with fix gcmc are allowed. -*Cannot use fix gcmc shake and not molecule* - Self-explanatory. - -*Cannot use fix msst without per-type mass defined* - Self-explanatory. - *Cannot use fix npt and fix deform on same component of stress tensor* This would be changing the same box dimension twice. @@ -1378,15 +1027,6 @@ Please also see the page with :doc:`Warning messages `. When specifying a diagonal pressure component, the dimension must be periodic. -*Cannot use fix nvt/npt/nph with both xy dynamics and xy scaling* - Self-explanatory. - -*Cannot use fix nvt/npt/nph with both xz dynamics and xz scaling* - Self-explanatory. - -*Cannot use fix nvt/npt/nph with both yz dynamics and yz scaling* - Self-explanatory. - *Cannot use fix nvt/npt/nph with xy scaling when y is non-periodic dimension* The second dimension in the barostatted tilt factor must be periodic. @@ -1396,15 +1036,9 @@ Please also see the page with :doc:`Warning messages `. *Cannot use fix nvt/npt/nph with yz scaling when z is non-periodic dimension* The second dimension in the barostatted tilt factor must be periodic. -*Cannot use fix pour rigid and not molecule* - Self-explanatory. - *Cannot use fix pour rigid and shake* These two attributes are conflicting. -*Cannot use fix pour shake and not molecule* - Self-explanatory. - *Cannot use fix pour with triclinic box* This option is not yet supported. @@ -1412,15 +1046,6 @@ Please also see the page with :doc:`Warning messages `. These commands both change the box size/shape, so you cannot use both together. -*Cannot use fix press/berendsen on a non-periodic dimension* - Self-explanatory. - -*Cannot use fix press/berendsen with triclinic box* - Self-explanatory. - -*Cannot use fix reax/bonds without pair_style reax* - Self-explanatory. - *Cannot use fix rigid npt/nph and fix deform on same component of stress tensor* This would be changing the same box dimension twice. @@ -1441,61 +1066,16 @@ Please also see the page with :doc:`Warning messages `. *Cannot use fix ttm with triclinic box* This is a current restriction of this fix due to the grid it creates. -*Cannot use fix tune/kspace without a kspace style* - Self-explanatory. - *Cannot use fix tune/kspace without a pair style* This fix (tune/kspace) can only be used when a pair style has been specified. -*Cannot use fix wall in periodic dimension* - Self-explanatory. - -*Cannot use fix wall zlo/zhi for a 2d simulation* - Self-explanatory. - -*Cannot use fix wall/reflect in periodic dimension* - Self-explanatory. - -*Cannot use fix wall/reflect zlo/zhi for a 2d simulation* - Self-explanatory. - -*Cannot use fix wall/srd in periodic dimension* - Self-explanatory. - *Cannot use fix wall/srd more than once* Nor is their a need to since multiple walls can be specified in one command. -*Cannot use fix wall/srd without fix srd* - Self-explanatory. - -*Cannot use fix wall/srd zlo/zhi for a 2d simulation* - Self-explanatory. - -*Cannot use fix_deposit unless atoms have IDs* - Self-explanatory. - -*Cannot use fix_pour unless atoms have IDs* - Self-explanatory. - -*Cannot use include command within an if command* - Self-explanatory. - *Cannot use lines with fix srd unless overlap is set* This is because line segments are connected to each other. -*Cannot use multiple fix wall commands with pair brownian* - Self-explanatory. - -*Cannot use multiple fix wall commands with pair lubricate* - Self-explanatory. - -*Cannot use multiple fix wall commands with pair lubricate/poly* - Self-explanatory. - -*Cannot use multiple fix wall commands with pair lubricateU* - Self-explanatory. - *Cannot use neigh_modify exclude with GPU neighbor builds* This is a current limitation of the GPU implementation in LAMMPS. @@ -1505,138 +1085,6 @@ Please also see the page with :doc:`Warning messages `. the simulation box is very small in some dimension, compared to the neighbor cutoff. Use the "nsq" style instead of "bin" style. -*Cannot use newton pair with beck/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with born/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with born/coul/wolf/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with born/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with buck/coul/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with buck/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with buck/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with colloid/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with coul/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with coul/debye/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with coul/dsf/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with dipole/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with dipole/sf/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with dpd/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with dpd/tstat/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with eam/alloy/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with eam/fs/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with eam/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with gauss/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with gayberne/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/charmm/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/class2/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/class2/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cubic/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/coul/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/coul/debye/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/coul/dsf/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/coul/msm/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/expand/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/gromacs/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/spica/coul/long/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj/spica/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with lj96/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with mie/cut/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with morse/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with resquared/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with soft/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with table/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with yukawa/colloid/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with yukawa/gpu pair style* - Self-explanatory. - -*Cannot use newton pair with zbl/gpu pair style* - Self-explanatory. - *Cannot use non-zero forces in an energy minimization* Fix setforce cannot be used in this manner. Use fix addforce instead. @@ -1664,9 +1112,6 @@ Please also see the page with :doc:`Warning messages `. boundaries unless you use the kspace_modify command to define a 2d slab with a non-periodic z dimension. -*Cannot use order greater than 8 with pppm/gpu.* - Self-explanatory. - *Cannot use package gpu neigh yes with triclinic box* This is a current restriction in LAMMPS. @@ -1679,18 +1124,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot use ramp in variable formula between runs* This is because the ramp() function is time dependent. -*Cannot use read_data add before simulation box is defined* - Self-explanatory. - -*Cannot use read_data extra with add flag* - Self-explanatory. - -*Cannot use read_data offset without add flag* - Self-explanatory. - -*Cannot use read_data shift without add flag* - Self-explanatory. - *Cannot use region INF or EDGE when box does not exist* Regions that extend to the box boundaries can only be used after the create_box command has been used. @@ -1698,18 +1131,12 @@ Please also see the page with :doc:`Warning messages `. *Cannot use set atom with no atom IDs defined* Atom IDs are not defined, so they cannot be used to identify an atom. -*Cannot use set mol with no molecule IDs defined* - Self-explanatory. - *Cannot use swiggle in variable formula between runs* This is a function of elapsed time. *Cannot use tris with fix srd unless overlap is set* This is because triangles are connected to each other. -*Cannot use variable energy with constant efield in fix efield* - LAMMPS computes the energy itself when the E-field is constant. - *Cannot use variable energy with constant force in fix addforce* This is because for constant force, LAMMPS can compute the change in energy directly. @@ -1724,22 +1151,10 @@ Please also see the page with :doc:`Warning messages `. *Cannot use vdisplace in variable formula between runs* This is a function of elapsed time. -*Cannot use velocity bias command without temp keyword* - Self-explanatory. - *Cannot use velocity create loop all unless atoms have IDs* Atoms in the simulation to do not have IDs, so this style of velocity creation cannot be performed. -*Cannot use wall in periodic dimension* - Self-explanatory. - -*Cannot use write_restart fileper without % in restart file name* - Self-explanatory. - -*Cannot use write_restart nfile without % in restart file name* - Self-explanatory. - *Cannot wiggle and shear fix wall/gran* Cannot specify both options at the same time. @@ -1750,12 +1165,6 @@ Please also see the page with :doc:`Warning messages `. *Cannot yet use KSpace solver with grid with comm style tiled* This is current restriction in LAMMPS. -*Cannot yet use comm_style tiled with multi-mode comm* - Self-explanatory. - -*Cannot yet use comm_style tiled with triclinic box* - Self-explanatory. - *Cannot yet use compute tally with Kokkos* This feature is not yet supported. @@ -1778,50 +1187,11 @@ Please also see the page with :doc:`Warning messages `. *Cannot zero gld force for zero atoms* There are no atoms currently in the group. -*Cannot zero momentum of no atoms* - Self-explanatory. - -*Change_box command before simulation box is defined* - Self-explanatory. - *Change_box volume used incorrectly* The "dim volume" option must be used immediately following one or two settings for "dim1 ..." (and optionally "dim2 ...") and must be for a different dimension, i.e. dim != dim1 and dim != dim2. -*Chunk/atom compute does not exist for compute angmom/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute com/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute gyration/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute inertia/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute msd/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute omega/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute property/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute temp/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute torque/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for compute vcm/chunk* - Self-explanatory. - -*Chunk/atom compute does not exist for fix ave/chunk* - Self-explanatory. - *Comm tiled invalid index in box drop brick* Internal error check in comm_style tiled which should not occur. Contact the developers. @@ -1830,12 +1200,6 @@ Please also see the page with :doc:`Warning messages `. Internal error check in comm_style tiled which should not occur. Contact the developers. -*Comm_modify group != atom_modify first group* - Self-explanatory. - -*Communication cutoff for comm_style tiled cannot exceed periodic box length* - Self-explanatory. - *Communication cutoff too small for SNAP micro load balancing* This can happen if you change the neighbor skin after your pair_style command or if your box dimensions grow during a run. You can set the @@ -1844,69 +1208,12 @@ Please also see the page with :doc:`Warning messages `. *Compute %s does not allow use of dynamic group* Dynamic groups have not yet been enabled for this compute. -*Compute for fix pafi does not calculate a local array* - Self-explanatory. - -*Compute for fix pafi must have 9 fields per atom* - Self-explanatory. - -*Compute ID for compute chunk /atom does not exist* - Self-explanatory. - -*Compute ID for compute chunk/atom does not exist* - Self-explanatory. - -*Compute gyration ID does not exist for compute gyration/shape* - Self-explanatory. Provide a valid compute ID. - -*Compute gyration/shape compute ID does not point to a gyration compute* - Self-explanatory. Provide and ID of a compute gyration command. - -*Compute ID for compute reduce does not exist* - Self-explanatory. - -*Compute ID for compute slice does not exist* - Self-explanatory. - -*Compute ID for fix ave/atom does not exist* - Self-explanatory. - -*Compute ID for fix ave/chunk does not exist* - Self-explanatory. - -*Compute ID for fix ave/correlate does not exist* - Self-explanatory. - -*Compute ID for fix ave/histo does not exist* - Self-explanatory. - -*Compute ID for fix ave/time does not exist* - Self-explanatory. - -*Compute ID for fix numdiff does not exist* - Self-explanatory. - -*Compute ID for fix numdiff/virial does not exist* - Self-explanatory. - -*Compute ID for fix store/state does not exist* - Self-explanatory. - -*Compute ID for fix vector does not exist* - Self-explanatory. - -*Compute ID must be alphanumeric or underscore characters* - Self-explanatory. - *Compute angle/local used when angles are not allowed* The atom style does not support angles. *Compute angmom/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. -*Compute body/local requires atom style body* - Self-explanatory. - *Compute bond/local used when bonds are not allowed* The atom style does not support bonds. @@ -1923,43 +1230,13 @@ Please also see the page with :doc:`Warning messages `. *Compute chunk/atom compute array is accessed out-of-range* The index for the array is out of bounds. -*Compute chunk/atom compute does not calculate a per-atom array* - Self-explanatory. - -*Compute chunk/atom compute does not calculate a per-atom vector* - Self-explanatory. - -*Compute chunk/atom compute does not calculate per-atom values* - Self-explanatory. - -*Compute chunk/atom cylinder axis must be z for 2d* - Self-explanatory. - *Compute chunk/atom fix array is accessed out-of-range* The index for the array is out of bounds. -*Compute chunk/atom fix does not calculate a per-atom array* - Self-explanatory. - -*Compute chunk/atom fix does not calculate a per-atom vector* - Self-explanatory. - -*Compute chunk/atom fix does not calculate per-atom values* - Self-explanatory. - -*Compute chunk/atom for triclinic boxes requires units reduced* - Self-explanatory. - *Compute chunk/atom ids once but nchunk is not once* You cannot assign chunks IDs to atom permanently if the number of chunks may change. -*Compute chunk/atom molecule for non-molecular system* - Self-explanatory. - -*Compute chunk/atom sphere z origin must be 0.0 for 2d* - Self-explanatory. - *Compute chunk/atom stores no IDs for compute property/chunk* It will only store IDs if its compress option is enabled. @@ -1972,9 +1249,6 @@ Please also see the page with :doc:`Warning messages `. *Compute chunk/atom stores no coord3 for compute property/chunk* Only certain binning options for compute chunk/atom store coordinates. -*Compute chunk/atom variable is not atom-style variable* - Self-explanatory. - *Compute chunk/atom without bins cannot use discard mixed* That discard option only applies to the binning styles. @@ -1985,28 +1259,13 @@ Please also see the page with :doc:`Warning messages `. This is so that the pair style defines a cutoff distance which is used to find clusters. -*Compute cna/atom cutoff is longer than pairwise cutoff* - Self-explanatory. - -*Compute cna/atom requires a pair style be defined* - Self-explanatory. - *Compute com/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. -*Compute contact/atom requires a pair style be defined* - Self-explanatory. - -*Compute contact/atom requires atom style sphere* - Self-explanatory. - *Compute coord/atom cutoff is longer than pairwise cutoff* Cannot compute coordination at distances longer than the pair cutoff, since those atoms are not in the neighbor list. -*Compute coord/atom requires a pair style be defined* - Self-explanatory. - *Compute damage/atom requires peridynamic potential* Damage is a Peridynamic-specific metric. It requires you to be running a Peridynamics simulation. @@ -2014,65 +1273,29 @@ Please also see the page with :doc:`Warning messages `. *Compute dihedral/local used when dihedrals are not allowed* The atom style does not support dihedrals. -*Compute dilatation/atom cannot be used with this pair style* - Self-explanatory. - -*Compute dilatation/atom requires Peridynamic pair style* - Self-explanatory. - *Compute does not allow an extra compute or fix to be reset* This is an internal LAMMPS error. Please report it to the developers. -*Compute erotate/asphere requires atom style ellipsoid or line or tri* - Self-explanatory. - *Compute erotate/asphere requires extended particles* This compute cannot be used with point particles. -*Compute erotate/rigid with non-rigid fix-ID* - Self-explanatory. - -*Compute erotate/sphere requires atom style sphere* - Self-explanatory. - -*Compute erotate/sphere/atom requires atom style sphere* - Self-explanatory. - *Compute event/displace has invalid fix event assigned* This is an internal LAMMPS error. Please report it to the developers. -*Compute group/group group ID does not exist* - Self-explanatory. - *Compute gyration/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. -*Compute heat/flux compute ID does not compute ke/atom* - Self-explanatory. - -*Compute heat/flux compute ID does not compute pe/atom* - Self-explanatory. - -*Compute heat/flux compute ID does not compute stress/atom* - Self-explanatory. - *Compute hexorder/atom cutoff is longer than pairwise cutoff* Cannot compute order parameter beyond cutoff. -*Compute hexorder/atom requires a pair style be defined* - Self-explanatory. - *Compute improper/local used when impropers are not allowed* The atom style does not support impropers. *Compute inertia/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. -*Compute ke/rigid with non-rigid fix-ID* - Self-explanatory. - *Compute msd/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. @@ -2081,24 +1304,12 @@ Please also see the page with :doc:`Warning messages `. the number of chunks is changing. Compute chunk/atom allows setting nchunk to be static. -*Compute nve/asphere requires atom style ellipsoid* - Self-explanatory. - -*Compute nvt/nph/npt asphere requires atom style ellipsoid* - Self-explanatory. - -*Compute nvt/nph/npt body requires atom style body* - Self-explanatory. - *Compute omega/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. *Compute orientorder/atom cutoff is longer than pairwise cutoff* Cannot compute order parameter beyond cutoff. -*Compute orientorder/atom requires a pair style be defined* - Self-explanatory. - *Compute pair must use group all* Pair styles accumulate energy on all atoms. @@ -2106,12 +1317,6 @@ Please also see the page with :doc:`Warning messages `. Energies computed by potentials (pair, bond, etc) are computed on all atoms. -*Compute plasticity/atom cannot be used with this pair style* - Self-explanatory. - -*Compute plasticity/atom requires Peridynamic pair style* - Self-explanatory. - *Compute pressure must use group all* Virial contributions computed by potentials (pair, bond, etc) are computed on all atoms. @@ -2127,9 +1332,6 @@ Please also see the page with :doc:`Warning messages `. The command is accessing a vector added by the fix property/atom command, that does not exist. -*Compute property/atom for atom property that is not allocated* - Self-explanatory. - *Compute property/atom integer vector does not exist* The command is accessing a vector added by the fix property/atom command, that does not exist. @@ -2141,117 +1343,36 @@ Please also see the page with :doc:`Warning messages `. Only inputs that generate the same number of datums can be used together. E.g. bond and angle quantities cannot be mixed. -*Compute property/local does not (yet) work with atom_style template* - Self-explanatory. - -*Compute property/local for property that is not allocated* - Self-explanatory. - -*Compute rdf requires a pair style be defined* - Self-explanatory. - *Compute reduce compute array is accessed out-of-range* An index for the array is out of bounds. *Compute reduce compute calculates global values* A compute that calculates peratom or local values is required. -*Compute reduce compute does not calculate a local array* - Self-explanatory. - -*Compute reduce compute does not calculate a local vector* - Self-explanatory. - -*Compute reduce compute does not calculate a per-atom array* - Self-explanatory. - -*Compute reduce compute does not calculate a per-atom vector* - Self-explanatory. - *Compute reduce fix array is accessed out-of-range* An index for the array is out of bounds. *Compute reduce fix calculates global values* A fix that calculates peratom or local values is required. -*Compute reduce fix does not calculate a local array* - Self-explanatory. - -*Compute reduce fix does not calculate a local vector* - Self-explanatory. - -*Compute reduce fix does not calculate a per-atom array* - Self-explanatory. - -*Compute reduce fix does not calculate a per-atom vector* - Self-explanatory. - -*Compute reduce replace requires min or max mode* - Self-explanatory. - -*Compute reduce variable is not atom-style variable* - Self-explanatory. - *Compute slice compute array is accessed out-of-range* An index for the array is out of bounds. -*Compute slice compute does not calculate a global array* - Self-explanatory. - -*Compute slice compute does not calculate a global vector* - Self-explanatory. - -*Compute slice compute does not calculate global vector or array* - Self-explanatory. - *Compute slice compute vector is accessed out-of-range* The index for the vector is out of bounds. *Compute slice fix array is accessed out-of-range* An index for the array is out of bounds. -*Compute slice fix does not calculate a global array* - Self-explanatory. - -*Compute slice fix does not calculate a global vector* - Self-explanatory. - -*Compute slice fix does not calculate global vector or array* - Self-explanatory. - *Compute slice fix vector is accessed out-of-range* The index for the vector is out of bounds. -*Compute sna/atom cutoff is longer than pairwise cutoff* - Self-explanatory. - -*Compute sna/atom requires a pair style be defined* - Self-explanatory. - -*Compute snad/atom cutoff is longer than pairwise cutoff* - Self-explanatory. - -*Compute snad/atom requires a pair style be defined* - Self-explanatory. - -*Compute snav/atom cutoff is longer than pairwise cutoff* - Self-explanatory. - -*Compute snav/atom requires a pair style be defined* - Self-explanatory. - *Compute stress/atom temperature ID does not compute temperature* The specified compute must compute temperature. -*Compute temp/asphere requires atom style ellipsoid* - Self-explanatory. - *Compute temp/asphere requires extended particles* This compute cannot be used with point particles. -*Compute temp/body requires atom style body* - Self-explanatory. - *Compute temp/body requires bodies* This compute can only be applied to body particles. @@ -2264,27 +1385,6 @@ Please also see the page with :doc:`Warning messages `. *Compute temp/cs used when bonds are not allowed* This compute only works on pairs of bonded particles. -*Compute temp/partial cannot use vz for 2d systemx* - Self-explanatory. - -*Compute temp/profile cannot bin z for 2d systems* - Self-explanatory. - -*Compute temp/profile cannot use vz for 2d systemx* - Self-explanatory. - -*Compute temp/sphere requires atom style sphere* - Self-explanatory. - -*Compute ti kspace style does not exist* - Self-explanatory. - -*Compute ti pair style does not exist* - Self-explanatory. - -*Compute ti tail when pair style does not compute tail corrections* - Self-explanatory. - *Compute torque/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. @@ -2308,9 +1408,6 @@ Please also see the page with :doc:`Warning messages `. *Compute vcm/chunk does not use chunk/atom compute* The style of the specified compute is not chunk/atom. -*Computed temperature for fix temp/berendsen cannot be 0.0* - Self-explanatory. - *Computed temperature for fix temp/rescale cannot be 0.0* Cannot rescale the temperature to a new value if the current temperature is 0.0. @@ -2372,67 +1469,19 @@ Please also see the page with :doc:`Warning messages `. The specified constraints did not allow this style of grid to be created. -*Could not evaluate Python function input variable* - Self-explanatory. - *Could not find Python function* The provided Python code was run successfully, but it not define a callable function with the required name. -*Could not find atom_modify first group ID* - Self-explanatory. - *Could not find change_box group ID* Group ID used in the change_box command does not exist. -*Could not find compute ID for PRD* - Self-explanatory. - -*Could not find compute ID for TAD* - Self-explanatory. - -*Could not find compute ID for temperature bias* - Self-explanatory. - -*Could not find compute ID to delete* - Self-explanatory. - -*Could not find compute displace/atom fix ID* - Self-explanatory. - -*Could not find compute event/displace fix ID* - Self-explanatory. - -*Could not find compute group ID* - Self-explanatory. - -*Could not find compute heat/flux compute ID* - Self-explanatory. - -*Could not find compute msd fix ID* - Self-explanatory. - *Could not find compute msd/chunk fix ID* The compute creates an internal fix, which has been deleted. *Could not find compute pressure temperature ID* The compute ID for calculating temperature does not exist. -*Could not find compute stress/atom temperature ID* - Self-explanatory. - -*Could not find compute vacf fix ID* - Self-explanatory. - -*Could not find compute/voronoi surface group ID* - Self-explanatory. - -*Could not find compute_modify ID* - Self-explanatory. - -*Could not find custom per-atom property ID* - Self-explanatory. - *Could not find delete_atoms group ID* Group ID used in the delete_atoms command does not exist. @@ -2442,61 +1491,16 @@ Please also see the page with :doc:`Warning messages `. *Could not find displace_atoms group ID* Group ID used in the displace_atoms command does not exist. -*Could not find dump custom compute ID* - Self-explanatory. - -*Could not find dump custom fix ID* - Self-explanatory. - -*Could not find dump custom variable name* - Self-explanatory. - *Could not find dump group ID* A group ID used in the dump command does not exist. -*Could not find dump local compute ID* - Self-explanatory. - -*Could not find dump local fix ID* - Self-explanatory. - -*Could not find dump modify compute ID* - Self-explanatory. - -*Could not find dump modify custom atom floating point property ID* - Self-explanatory. - -*Could not find dump modify custom atom integer property ID* - Self-explanatory. - -*Could not find dump modify fix ID* - Self-explanatory. - -*Could not find dump modify variable name* - Self-explanatory. - -*Could not find fix ID to delete* - Self-explanatory. - *Could not find fix adapt storage fix ID* This should not happen unless you explicitly deleted a secondary fix that fix adapt created internally. -*Could not find fix halt variable name* - Self-explanatory. - -*Could not find fix gcmc exclusion group ID* - Self-explanatory. - -*Could not find fix gcmc rotation group ID* - Self-explanatory. - *Could not find fix group ID* A group ID used in the fix command does not exist. -*Could not find fix msst compute ID* - Self-explanatory. - *Could not find fix poems group ID* A group ID used in the fix poems command does not exist. @@ -2506,9 +1510,6 @@ Please also see the page with :doc:`Warning messages `. *Could not find fix rigid group ID* A group ID used in the fix rigid command does not exist. -*Could not find fix srd group ID* - Self-explanatory. - *Could not find fix_modify ID* A fix ID used in the fix_modify command does not exist. @@ -2518,12 +1519,6 @@ Please also see the page with :doc:`Warning messages `. *Could not find fix_modify temperature ID* The compute ID for computing temperature does not exist. -*Could not find group clear group ID* - Self-explanatory. - -*Could not find group delete group ID* - Self-explanatory. - *Could not find pair fix ID* A fix is created internally by the pair style to store shear history information. You cannot delete it. @@ -2531,9 +1526,6 @@ Please also see the page with :doc:`Warning messages `. *Could not find set group ID* Group ID specified in set command does not exist. -*Could not find specified fix gcmc group ID* - Self-explanatory. - *Could not find thermo compute ID* Compute ID specified in thermo_style command does not exist. @@ -2545,15 +1537,9 @@ Please also see the page with :doc:`Warning messages `. The fix ID needed by thermo style custom to compute a requested quantity does not exist. -*Could not find thermo custom variable name* - Self-explanatory. - *Could not find thermo fix ID* Fix ID specified in thermo_style command does not exist. -*Could not find thermo variable name* - Self-explanatory. - *Could not find thermo_modify pressure ID* The compute ID needed by thermo style custom to compute pressure does not exist. @@ -2576,15 +1562,6 @@ Please also see the page with :doc:`Warning messages `. Could not initialize at least one of the devices specified for the gpu package -*Could not grab element entry from EIM potential file* - Self-explanatory - -*Could not grab global entry from EIM potential file* - Self-explanatory. - -*Could not grab pair entry from EIM potential file* - Self-explanatory. - *Could not initialize embedded Python* The main module in Python was not accessible. @@ -2620,9 +1597,6 @@ Please also see the page with :doc:`Warning messages `. *Coulombic cut not supported in pair_style lj/long/dipole/long* Must use long-range Coulombic interactions. -*Cound not find dump_modify ID* - Self-explanatory. - *Create_atoms command before simulation box is defined* The create_atoms command cannot be used before a read_data, read_restart, or create_box command. @@ -2639,9 +1613,6 @@ Please also see the page with :doc:`Warning messages `. *Create_atoms region ID does not exist* A region ID used in the create_atoms command does not exist. -*Create_bonds command before simulation box is defined* - Self-explanatory. - *Create_bonds command requires no kspace_style be defined* This is so that atom pairs that are already bonded to not appear in the neighbor list. @@ -2653,12 +1624,6 @@ Please also see the page with :doc:`Warning messages `. *Create_bonds max distance > neighbor cutoff* Can only create bonds for atom pairs that will be in neighbor list. -*Create_bonds requires a pair style be defined* - Self-explanatory. - -*Create_box region ID does not exist* - Self-explanatory. - *Create_box region does not support a bounding box* Not all regions represent bounded volumes. You cannot use such a region with the create_box command. @@ -2671,21 +1636,6 @@ Please also see the page with :doc:`Warning messages `. The command is accessing a vector added by the fix property/atom command, that does not exist. -*Custom per-atom property ID is not floating point* - Self-explanatory. - -*Custom per-atom property ID is not integer* - Self-explanatory. - -*Cut-offs missing in pair_style lj/long/dipole/long* - Self-explanatory. - -*Cutoffs missing in pair_style buck/long/coul/long* - Self-explanatory. - -*Cutoffs missing in pair_style lj/long/coul/long* - Self-explanatory. - *Cyclic loop in joint connections* Fix poems cannot (yet) work with coupled bodies whose joints connect the bodies in a ring (or cycle). @@ -2693,9 +1643,6 @@ Please also see the page with :doc:`Warning messages `. *Degenerate lattice primitive vectors* Invalid set of 3 lattice vectors for lattice command. -*Delete region ID does not exist* - Self-explanatory. - *Delete_atoms command before simulation box is defined* The delete_atoms command cannot be used before a read_data, read_restart, or create_box command. @@ -2717,9 +1664,6 @@ Please also see the page with :doc:`Warning messages `. *Delete_bonds command with no atoms existing* No atoms are yet defined so the delete_bonds command cannot be used. -*Deposition region extends outside simulation box* - Self-explanatory. - *Did not assign all atoms correctly* Atoms read in from a data file were not assigned correctly to processors. This is likely due to some atom coordinates being @@ -2747,12 +1691,6 @@ Please also see the page with :doc:`Warning messages `. *Did not set pressure for fix rigid/nph* The press keyword must be specified. -*Did not set temp for fix rigid/nvt/small* - Self-explanatory. - -*Did not set temp or press for fix rigid/npt/small* - Self-explanatory. - *Did not set temperature for fix rigid/nvt* The temp keyword must be specified. @@ -2794,15 +1732,6 @@ Please also see the page with :doc:`Warning messages `. No dihedral coefficients have been assigned in the data file or via the dihedral_coeff command. -*Dihedral style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Dihedral style hybrid cannot have none as an argument* - Self-explanatory. - -*Dihedral style hybrid cannot use same dihedral style twice* - Self-explanatory. - *Dihedral/improper extent > half of periodic box length* This error was detected by the neigh_modify check yes setting. It is an error because the dihedral atoms are so far apart it is ambiguous @@ -2834,9 +1763,6 @@ Please also see the page with :doc:`Warning messages `. The dimension command cannot be used after a read_data, read_restart, or create_box command. -*Disk limit not supported by OS or illegal path* - Self-explanatory. - *Dispersion PPPMDisp order has been reduced below minorder* The default minimum order is 2. This can be reset by the kspace_modify minorder command. @@ -2845,9 +1771,6 @@ Please also see the page with :doc:`Warning messages `. The displace_atoms command cannot be used before a read_data, read_restart, or create_box command. -*Distance must be > 0 for compute event/displace* - Self-explanatory. - *Divide by 0 in influence function* This should not normally occur. It is likely a problem with your model. @@ -2856,23 +1779,14 @@ Please also see the page with :doc:`Warning messages `. This should not normally occur. It is likely a problem with your model. -*Divide by 0 in variable formula* - Self-explanatory. - *Domain too large for neighbor bins* The domain has become extremely large so that neighbor bins cannot be used. Most likely, one or more atoms have been blown out of the simulation box to a great distance. -*Double precision is not supported on this accelerator* - Self-explanatory - *Dump atom/gz only writes compressed files* The dump atom/gz output file name must have a .gz suffix. -*Dump cfg arguments can not mix xs\|ys\|zs with xsu\|ysu\|zsu* - Self-explanatory. - *Dump cfg arguments must start with 'mass type xs ys zs' or 'mass type xsu ysu zsu'* This is a requirement of the CFG output format. See the dump cfg doc page for more details. @@ -2887,30 +1801,6 @@ Please also see the page with :doc:`Warning messages `. The fix must produce per-atom quantities on timesteps that dump custom needs them. -*Dump custom compute does not calculate per-atom array* - Self-explanatory. - -*Dump custom compute does not calculate per-atom vector* - Self-explanatory. - -*Dump custom compute does not compute per-atom info* - Self-explanatory. - -*Dump custom compute vector is accessed out-of-range* - Self-explanatory. - -*Dump custom fix does not compute per-atom array* - Self-explanatory. - -*Dump custom fix does not compute per-atom info* - Self-explanatory. - -*Dump custom fix does not compute per-atom vector* - Self-explanatory. - -*Dump custom fix vector is accessed out-of-range* - Self-explanatory. - *Dump custom variable is not atom-style variable* Only atom-style variables generate per-atom quantities, needed for dump output. @@ -2931,132 +1821,36 @@ Please also see the page with :doc:`Warning messages `. This is because a % signifies one file per processor and MPI-IO creates one large file for all processors. -*Dump file does not contain requested snapshot* - Self-explanatory. - -*Dump file is incorrectly formatted* - Self-explanatory. - -*Dump image body yes requires atom style body* - Self-explanatory. - -*Dump image bond not allowed with no bond types* - Self-explanatory. - -*Dump image cannot perform sorting* - Self-explanatory. - -*Dump image line requires atom style line* - Self-explanatory. - *Dump image requires one snapshot per file* Use a "\*" in the filename. -*Dump image tri requires atom style tri* - Self-explanatory. - *Dump local and fix not computed at compatible times* The fix must produce per-atom quantities on timesteps that dump local needs them. -*Dump local attributes contain no compute or fix* - Self-explanatory. - *Dump local cannot sort by atom ID* This is because dump local does not really dump per-atom info. -*Dump local compute does not calculate local array* - Self-explanatory. - -*Dump local compute does not calculate local vector* - Self-explanatory. - -*Dump local compute does not compute local info* - Self-explanatory. - -*Dump local compute vector is accessed out-of-range* - Self-explanatory. - *Dump local count is not consistent across input fields* Every column of output must be the same length. -*Dump local fix does not compute local array* - Self-explanatory. - -*Dump local fix does not compute local info* - Self-explanatory. - -*Dump local fix does not compute local vector* - Self-explanatory. - -*Dump local fix vector is accessed out-of-range* - Self-explanatory. - -*Dump modify bcolor not allowed with no bond types* - Self-explanatory. - -*Dump modify bdiam not allowed with no bond types* - Self-explanatory. - -*Dump modify compute ID does not compute per-atom array* - Self-explanatory. - -*Dump modify compute ID does not compute per-atom info* - Self-explanatory. - -*Dump modify compute ID does not compute per-atom vector* - Self-explanatory. - -*Dump modify compute ID vector is not large enough* - Self-explanatory. - *Dump modify element names do not match atom types* Number of element names must equal number of atom types. -*Dump modify fix ID does not compute per-atom array* - Self-explanatory. - -*Dump modify fix ID does not compute per-atom info* - Self-explanatory. - -*Dump modify fix ID does not compute per-atom vector* - Self-explanatory. - -*Dump modify fix ID vector is not large enough* - Self-explanatory. - -*Dump modify variable is not atom-style variable* - Self-explanatory. - -*Dump sort column is invalid* - Self-explanatory. - *Dump xtc requires sorting by atom ID* Use the dump_modify sort command to enable this. *Dump xyz/gz only writes compressed files* The dump xyz/gz output file name must have a .gz suffix. -*Dump_modify buffer yes not allowed for this style* - Self-explanatory. - *Dump_modify format string is too short* There are more fields to be dumped in a line of output than your format string specifies. -*Dump_modify region ID does not exist* - Self-explanatory. - *Dumping an atom property that is not allocated* The chosen atom style does not define the per-atom quantity being dumped. -*Duplicate atom IDs exist* - Self-explanatory. - -*Duplicate fields in read_dump command* - Self-explanatory. - *Duplicate particle in PeriDynamic bond - simulation box is too small* This is likely because your box length is shorter than 2 times the bond length. @@ -3076,15 +1870,9 @@ Please also see the page with :doc:`Warning messages `. have tallied energy, but they did not on this timestep. See the variable page for ideas on how to make this work. -*Epsilon or sigma reference not set by pair style in PPPMDisp* - Self-explanatory. - *Epsilon or sigma reference not set by pair style in ewald/n* The pair style is not providing the needed epsilon or sigma values. -*Error in MEAM parameter file: keyword %s (further information)* - Self-explanatory. Check the parameter file. - *Error in vdw spline: inner radius > outer radius* A pre-tabulated spline is invalid. Likely a problem with the potential parameters. @@ -3122,57 +1910,9 @@ Please also see the page with :doc:`Warning messages `. *File variable could not read value* Check the file assigned to the variable. -*Final box dimension due to fix deform is < 0.0* - Self-explanatory. - *Fix %s does not allow use of dynamic group* Dynamic groups have not yet been enabled for this fix. -*Fix ID for compute chunk/atom does not exist* - Self-explanatory. - -*Fix ID for compute erotate/rigid does not exist* - Self-explanatory. - -*Fix ID for compute ke/rigid does not exist* - Self-explanatory. - -*Fix ID for compute reduce does not exist* - Self-explanatory. - -*Fix ID for compute slice does not exist* - Self-explanatory. - -*Fix ID for fix ave/atom does not exist* - Self-explanatory. - -*Fix ID for fix ave/chunk does not exist* - Self-explanatory. - -*Fix ID for fix ave/correlate does not exist* - Self-explanatory. - -*Fix ID for fix ave/histo does not exist* - Self-explanatory. - -*Fix ID for fix ave/time does not exist* - Self-explanatory. - -*Fix ID for fix store/state does not exist* - Self-explanatory - -*Fix ID for fix vector does not exist* - Self-explanatory. - -*Fix ID for read_data does not exist* - Self-explanatory. - -*Fix ID for velocity does not exist* - Self-explanatory. - -*Fix ID must be alphanumeric or underscore characters* - Self-explanatory. - *Fix SRD: bad bin assignment for SRD advection* Something has gone wrong in your SRD model; try using more conservative settings. @@ -3195,12 +1935,6 @@ Please also see the page with :doc:`Warning messages `. *Fix adapt interface to this pair style not supported* New coding for the pair style would need to be done. -*Fix adapt kspace style does not exist* - Self-explanatory. - -*Fix adapt pair style does not exist* - Self-explanatory - *Fix adapt pair style param not supported* The pair style does not know about the parameter you specified. @@ -3210,30 +1944,15 @@ Please also see the page with :doc:`Warning messages `. *Fix adapt requires atom attribute diameter* The atom style being used does not specify an atom diameter. -*Fix adapt type pair range is not valid for pair hybrid sub-style* - Self-explanatory. - *Fix append/atoms requires a lattice be defined* Use the lattice command for this purpose. -*Fix ave/atom compute array is accessed out-of-range* - Self-explanatory. - -*Fix ave/atom compute does not calculate a per-atom array* - Self-explanatory. - *Fix ave/atom compute does not calculate a per-atom vector* A compute used by fix ave/atom must generate per-atom values. *Fix ave/atom compute does not calculate per-atom values* A compute used by fix ave/atom must generate per-atom values. -*Fix ave/atom fix array is accessed out-of-range* - Self-explanatory. - -*Fix ave/atom fix does not calculate a per-atom array* - Self-explanatory. - *Fix ave/atom fix does not calculate a per-atom vector* A fix used by fix ave/atom must generate per-atom values. @@ -3243,145 +1962,19 @@ Please also see the page with :doc:`Warning messages `. *Fix ave/atom variable is not atom-style variable* A variable used by fix ave/atom must generate per-atom values. -*Fix ave/chunk compute does not calculate a per-atom array* - Self-explanatory. - -*Fix ave/chunk compute does not calculate a per-atom vector* - Self-explanatory. - -*Fix ave/chunk compute does not calculate per-atom values* - Self-explanatory. - -*Fix ave/chunk compute vector is accessed out-of-range* - Self-explanatory. - *Fix ave/chunk does not use chunk/atom compute* The specified compute is not for a compute chunk/atom command. -*Fix ave/chunk fix does not calculate a per-atom array* - Self-explanatory. - -*Fix ave/chunk fix does not calculate a per-atom vector* - Self-explanatory. - -*Fix ave/chunk fix does not calculate per-atom values* - Self-explanatory. - -*Fix ave/chunk fix vector is accessed out-of-range* - Self-explanatory. - -*Fix ave/chunk variable is not atom-style variable* - Self-explanatory. - -*Fix ave/correlate compute does not calculate a scalar* - Self-explanatory. - -*Fix ave/correlate compute does not calculate a vector* - Self-explanatory. - *Fix ave/correlate compute vector is accessed out-of-range* The index for the vector is out of bounds. -*Fix ave/correlate fix does not calculate a scalar* - Self-explanatory. - -*Fix ave/correlate fix does not calculate a vector* - Self-explanatory. - *Fix ave/correlate fix vector is accessed out-of-range* The index for the vector is out of bounds. -*Fix ave/correlate variable is not equal-style variable* - Self-explanatory. - -*Fix ave/histo cannot input local values in scalar mode* - Self-explanatory. - -*Fix ave/histo cannot input per-atom values in scalar mode* - Self-explanatory. - -*Fix ave/histo compute array is accessed out-of-range* - Self-explanatory. - -*Fix ave/histo compute does not calculate a global array* - Self-explanatory. - -*Fix ave/histo compute does not calculate a global scalar* - Self-explanatory. - -*Fix ave/histo compute does not calculate a global vector* - Self-explanatory. - -*Fix ave/histo compute does not calculate a local array* - Self-explanatory. - -*Fix ave/histo compute does not calculate a local vector* - Self-explanatory. - -*Fix ave/histo compute does not calculate a per-atom array* - Self-explanatory. - -*Fix ave/histo compute does not calculate a per-atom vector* - Self-explanatory. - -*Fix ave/histo compute does not calculate local values* - Self-explanatory. - -*Fix ave/histo compute does not calculate per-atom values* - Self-explanatory. - -*Fix ave/histo compute vector is accessed out-of-range* - Self-explanatory. - -*Fix ave/histo fix array is accessed out-of-range* - Self-explanatory. - -*Fix ave/histo fix does not calculate a global array* - Self-explanatory. - -*Fix ave/histo fix does not calculate a global scalar* - Self-explanatory. - -*Fix ave/histo fix does not calculate a global vector* - Self-explanatory. - -*Fix ave/histo fix does not calculate a local array* - Self-explanatory. - -*Fix ave/histo fix does not calculate a local vector* - Self-explanatory. - -*Fix ave/histo fix does not calculate a per-atom array* - Self-explanatory. - -*Fix ave/histo fix does not calculate a per-atom vector* - Self-explanatory. - -*Fix ave/histo fix does not calculate local values* - Self-explanatory. - -*Fix ave/histo fix does not calculate per-atom values* - Self-explanatory. - -*Fix ave/histo fix vector is accessed out-of-range* - Self-explanatory. - -*Fix ave/histo input is invalid compute* - Self-explanatory. - -*Fix ave/histo input is invalid fix* - Self-explanatory. - -*Fix ave/histo input is invalid variable* - Self-explanatory. - *Fix ave/histo inputs are not all global, peratom, or local* All inputs in a single fix ave/histo command must be of the same style. -*Fix ave/histo/weight value and weight vector lengths do not match* - Self-explanatory. - *Fix ave/time cannot set output array intensive/extensive from these inputs* One of more of the vector inputs has individual elements which are flagged as intensive or extensive. Such an input cannot be flagged as @@ -3390,48 +1983,18 @@ Please also see the page with :doc:`Warning messages `. *Fix ave/time cannot use variable with vector mode* Variables produce scalar values. -*Fix ave/time columns are inconsistent lengths* - Self-explanatory. - *Fix ave/time compute array is accessed out-of-range* An index for the array is out of bounds. -*Fix ave/time compute does not calculate a scalar* - Self-explanatory. - -*Fix ave/time compute does not calculate a vector* - Self-explanatory. - -*Fix ave/time compute does not calculate an array* - Self-explanatory. - *Fix ave/time compute vector is accessed out-of-range* The index for the vector is out of bounds. -*Fix ave/time fix array cannot be variable length* - Self-explanatory. - *Fix ave/time fix array is accessed out-of-range* An index for the array is out of bounds. -*Fix ave/time fix does not calculate a scalar* - Self-explanatory. - -*Fix ave/time fix does not calculate a vector* - Self-explanatory. - -*Fix ave/time fix does not calculate an array* - Self-explanatory. - -*Fix ave/time fix vector cannot be variable length* - Self-explanatory. - *Fix ave/time fix vector is accessed out-of-range* The index for the vector is out of bounds. -*Fix ave/time variable is not equal-style variable* - Self-explanatory. - *Fix balance rcb cannot be used with comm_style brick* Comm_style tiled must be used instead. @@ -3443,19 +2006,10 @@ Please also see the page with :doc:`Warning messages `. acquire needed info, The comm_modify cutoff command can be used to extend the communication range. -*Fix bond/create angle type is invalid* - Self-explanatory. - *Fix bond/create cutoff is longer than pairwise cutoff* This is not allowed because bond creation is done using the pairwise neighbor list. -*Fix bond/create dihedral type is invalid* - Self-explanatory. - -*Fix bond/create improper type is invalid* - Self-explanatory. - *Fix bond/create induced too many angles/dihedrals/impropers per atom* See the read_data command for info on using the "extra/angle/per/atom", (or dihedral, improper) keywords to allow for additional @@ -3502,15 +2056,6 @@ Please also see the page with :doc:`Warning messages `. comm_modify cutoff command can be used to extend the communication range. -*Fix bond/react: A deleted atom cannot remain bonded to an atom that is not deleted* - Self-explanatory. - -*Fix bond/react: First neighbors of chiral atoms must be of mutually different types* - Self-explanatory. - -*Fix bond/react: Chiral atoms must have exactly four first neighbors* - Self-explanatory. - *Fix bond/react: Molecule template 'Coords' section required for chiralIDs keyword* The coordinates of atoms in the pre-reacted template are used to determine chirality. @@ -3528,12 +2073,6 @@ Please also see the page with :doc:`Warning messages `. *Fix bond/swap cannot use dihedral or improper styles* These styles cannot be defined when using this fix. -*Fix bond/swap requires pair and bond styles* - Self-explanatory. - -*Fix bond/swap requires special_bonds = 0,1,1* - Self-explanatory. - *Fix box/relax generated negative box length* The pressure being applied is likely too large. Try applying it incrementally, to build to the high pressure. @@ -3559,12 +2098,6 @@ Please also see the page with :doc:`Warning messages `. *Fix deform volume setting is invalid* Cannot use volume style unless other dimensions are being controlled. -*Fix deposit and fix rigid/small not using same molecule template ID* - Self-explanatory. - -*Fix deposit and fix shake not using same molecule template ID* - Self-explanatory. - *Fix deposit molecule must have atom types* The defined molecule does not specify atom types. @@ -3582,9 +2115,6 @@ Please also see the page with :doc:`Warning messages `. Not all regions represent bounded volumes. You cannot use such a region with the fix deposit command. -*Fix deposit shake fix does not exist* - Self-explanatory. - *Fix efield requires atom attribute q or mu* The atom style defined does not have this attribute. @@ -3632,28 +2162,16 @@ Please also see the page with :doc:`Warning messages `. *Fix freeze requires atom attribute torque* The atom style defined does not have this attribute. -*Fix gcmc and fix shake not using same molecule template ID* - Self-explanatory. - -*Fix gcmc atom has charge, but atom style does not* - Self-explanatory. - *Fix gcmc cannot exchange individual atoms belonging to a molecule* This is an error since you should not delete only one atom of a molecule. The user has specified atomic (non-molecular) gas exchanges, but an atom belonging to a molecule could be deleted. -*Fix gcmc does not (yet) work with atom_style template* - Self-explanatory. - *Fix gcmc molecule command requires that atoms have molecule attributes* Should not choose the gcmc molecule feature if no molecules are being simulated. The general molecule flag is off, but gcmc's molecule flag is on. -*Fix gcmc molecule has charges, but atom style does not* - Self-explanatory. - *Fix gcmc molecule must have atom types* The defined molecule does not specify atom types. @@ -3680,39 +2198,6 @@ Please also see the page with :doc:`Warning messages `. Not all regions represent bounded volumes. You cannot use such a region with the fix gcmc command. -*Fix gcmc region extends outside simulation box* - Self-explanatory. - -*Fix gcmc shake fix does not exist* - Self-explanatory. - -*Fix gld c coefficients must be >= 0* - Self-explanatory. - -*Fix gld needs more prony series coefficients* - Self-explanatory. - -*Fix gld prony terms must be > 0* - Self-explanatory. - -*Fix gld series type must be pprony for now* - Self-explanatory. - -*Fix gld start temperature must be >= 0* - Self-explanatory. - -*Fix gld stop temperature must be >= 0* - Self-explanatory. - -*Fix gld tau coefficients must be > 0* - Self-explanatory. - -*Fix halt variable is not equal-style variable* - Self-explanatory. - -*Fix heat group has no atoms* - Self-explanatory. - *Fix heat kinetic energy of an atom went negative* This will cause the velocity rescaling about to be performed by fix heat to be invalid. @@ -3728,69 +2213,24 @@ Please also see the page with :doc:`Warning messages `. *Fix langevin angmom is not yet implemented with kokkos* This option is not yet available. -*Fix langevin angmom requires atom style ellipsoid* - Self-explanatory. - *Fix langevin angmom requires extended particles* This fix option cannot be used with point particles. -*Fix langevin gjf and respa are not compatible* - Self-explanatory. - *Fix langevin gjf cannot have period equal to dt/2* If the period is equal to dt/2 then division by zero will happen. -*Fix langevin gjf should come before fix nve* - Self-explanatory. - *Fix langevin gjf with tbias is not yet implemented with kokkos* This option is not yet available. *Fix langevin omega is not yet implemented with kokkos* This option is not yet available. -*Fix langevin omega requires atom style sphere* - Self-explanatory. - *Fix langevin omega requires extended particles* One of the particles has radius 0.0. *Fix langevin period must be > 0.0* The time window for temperature relaxation must be > 0 -*Fix langevin variable returned negative temperature* - Self-explanatory. - -*Fix momentum group has no atoms* - Self-explanatory. - -*Fix move cannot define z or vz variable for 2d problem* - Self-explanatory. - -*Fix move cannot rotate aroung non z-axis for 2d problem* - Self-explanatory. - -*Fix move cannot set linear z motion for 2d problem* - Self-explanatory. - -*Fix move cannot set wiggle z motion for 2d problem* - Self-explanatory. - -*Fix msst compute ID does not compute potential energy* - Self-explanatory. - -*Fix msst compute ID does not compute pressure* - Self-explanatory. - -*Fix msst compute ID does not compute temperature* - Self-explanatory. - -*Fix msst requires a periodic box* - Self-explanatory. - -*Fix msst tscale must satisfy 0 <= tscale < 1* - Self-explanatory. - *Fix npt/nph has tilted box too far in one step - periodic cell is too far from equilibrium state* Self-explanatory. The change in the box tilt is too extreme on a short timescale. @@ -3810,61 +2250,22 @@ Please also see the page with :doc:`Warning messages `. *Fix nve/asphere requires extended particles* This fix can only be used for particles with a shape setting. -*Fix nve/asphere/noforce requires atom style ellipsoid* - Self-explanatory. - *Fix nve/asphere/noforce requires extended particles* One of the particles is not an ellipsoid. -*Fix nve/body requires atom style body* - Self-explanatory. - *Fix nve/body requires bodies* This fix can only be used for particles that are bodies. -*Fix nve/line can only be used for 2d simulations* - Self-explanatory. - -*Fix nve/line requires atom style line* - Self-explanatory. - -*Fix nve/line requires line particles* - Self-explanatory. - *Fix nve/sphere dipole requires atom attribute mu* An atom style with this attribute is needed. -*Fix nve/sphere requires atom style sphere* - Self-explanatory. - *Fix nve/sphere requires extended particles* This fix can only be used for particles of a finite size. -*Fix nve/tri can only be used for 3d simulations* - Self-explanatory. - -*Fix nve/tri requires atom style tri* - Self-explanatory. - -*Fix nve/tri requires tri particles* - Self-explanatory. - *Fix nvt/nph/npt asphere requires extended particles* The shape setting for a particle in the fix group has shape = 0.0, which means it is a point particle. -*Fix nvt/nph/npt body requires bodies* - Self-explanatory. - -*Fix nvt/nph/npt sphere requires atom style sphere* - Self-explanatory. - -*Fix nvt/npt/nph damping parameters must be > 0.0* - Self-explanatory. - -*Fix nvt/npt/nph dilate group ID does not exist* - Self-explanatory. - *Fix nvt/sphere requires extended particles* This fix can only be used for particles of a finite size. @@ -3883,15 +2284,6 @@ Please also see the page with :doc:`Warning messages `. *Fix peri neigh does not exist* Somehow a fix that the pair style defines has been deleted. -*Fix pour and fix rigid/small not using same molecule template ID* - Self-explanatory. - -*Fix pour and fix shake not using same molecule template ID* - Self-explanatory. - -*Fix pour insertion count per timestep is 0* - Self-explanatory. - *Fix pour molecule must have atom types* The defined molecule does not specify atom types. @@ -3902,12 +2294,6 @@ Please also see the page with :doc:`Warning messages `. When using atom_style template, you cannot pour molecules that are not in that template. -*Fix pour polydisperse fractions do not sum to 1.0* - Self-explanatory. - -*Fix pour region ID does not exist* - Self-explanatory. - *Fix pour region cannot be dynamic* Only static regions can be used with fix pour. @@ -3918,187 +2304,49 @@ Please also see the page with :doc:`Warning messages `. *Fix pour requires atom attributes radius, rmass* The atom style defined does not have these attributes. -*Fix pour rigid fix does not exist* - Self-explanatory. - -*Fix pour shake fix does not exist* - Self-explanatory. - -*Fix press/berendsen damping parameters must be > 0.0* - Self-explanatory. - -*Fix property/atom cannot specify mol twice* - Self-explanatory. - -*Fix property/atom cannot specify q twice* - Self-explanatory. - -*Fix property/atom mol when atom_style already has molecule attribute* - Self-explanatory. - -*Fix property/atom q when atom_style already has charge attribute* - Self-explanatory. - *Fix property/atom vector name already exists* The name for an integer or floating-point vector must be unique. -*Fix qeq has negative upper Taper radius cutoff* - Self-explanatory. - -*Fix qeq/comb group has no atoms* - Self-explanatory. - *Fix qeq/comb requires atom attribute q* An atom style with charge must be used to perform charge equilibration. -*Fix qeq/dynamic group has no atoms* - Self-explanatory. - -*Fix qeq/dynamic requires atom attribute q* - Self-explanatory. - -*Fix qeq/fire group has no atoms* - Self-explanatory. - -*Fix qeq/fire requires atom attribute q* - Self-explanatory. - -*Fix qeq/point group has no atoms* - Self-explanatory. - *Fix qeq/point has insufficient QEq matrix size* Occurs when number of neighbor atoms for an atom increased too much during a run. Increase SAFE_ZONE and MIN_CAP in fix_qeq.h and re-compile. -*Fix qeq/point requires atom attribute q* - Self-explanatory. - -*Fix qeq/shielded group has no atoms* - Self-explanatory. - *Fix qeq/shielded has insufficient QEq matrix size* Occurs when number of neighbor atoms for an atom increased too much during a run. Increase SAFE_ZONE and MIN_CAP in fix_qeq.h and re-compile. -*Fix qeq/shielded requires atom attribute q* - Self-explanatory. - *Fix qeq/slater could not extract params from pair coul/streitz* This should not happen unless pair coul/streitz has been altered. -*Fix qeq/slater group has no atoms* - Self-explanatory. - *Fix qeq/slater has insufficient QEq matrix size* Occurs when number of neighbor atoms for an atom increased too much during a run. Increase SAFE_ZONE and MIN_CAP in fix_qeq.h and re-compile. -*Fix qeq/slater requires atom attribute q* - Self-explanatory. - *Fix reax/bonds numbonds > nsbmax_most* The limit of the number of bonds expected by the ReaxFF force field was exceeded. -*Fix recenter group has no atoms* - Self-explanatory. - -*Fix restrain requires an atom map, see atom_modify* - Self-explanatory. - *Fix rigid atom has non-zero image flag in a non-periodic dimension* Image flags for non-periodic dimensions should not be set. -*Fix rigid file has no lines* - Self-explanatory. - -*Fix rigid langevin period must be > 0.0* - Self-explanatory. - -*Fix rigid molecule requires atom attribute molecule* - Self-explanatory. - -*Fix rigid npt/nph dilate group ID does not exist* - Self-explanatory. - *Fix rigid npt/nph does not yet allow triclinic box* This is a current restriction in LAMMPS. -*Fix rigid npt/nph period must be > 0.0* - Self-explanatory. - -*Fix rigid npt/small t_chain should not be less than 1* - Self-explanatory. - -*Fix rigid npt/small t_order must be 3 or 5* - Self-explanatory. - -*Fix rigid nvt/npt/nph damping parameters must be > 0.0* - Self-explanatory. - -*Fix rigid nvt/small t_chain should not be less than 1* - Self-explanatory. - -*Fix rigid nvt/small t_iter should not be less than 1* - Self-explanatory. - -*Fix rigid nvt/small t_order must be 3 or 5* - Self-explanatory. - -*Fix rigid xy torque cannot be on for 2d simulation* - Self-explanatory. - -*Fix rigid z force cannot be on for 2d simulation* - Self-explanatory. - -*Fix rigid/npt period must be > 0.0* - Self-explanatory. - -*Fix rigid/npt temperature order must be 3 or 5* - Self-explanatory. - -*Fix rigid/npt/small period must be > 0.0* - Self-explanatory. - -*Fix rigid/nvt period must be > 0.0* - Self-explanatory. - -*Fix rigid/nvt temperature order must be 3 or 5* - Self-explanatory. - -*Fix rigid/nvt/small period must be > 0.0* - Self-explanatory. - *Fix rigid/small atom has non-zero image flag in a non-periodic dimension* Image flags for non-periodic dimensions should not be set. -*Fix rigid/small langevin period must be > 0.0* - Self-explanatory. - *Fix rigid/small molecule must have atom types* The defined molecule does not specify atom types. *Fix rigid/small molecule must have coordinates* The defined molecule does not specify coordinates. -*Fix rigid/small npt/nph period must be > 0.0* - Self-explanatory. - -*Fix rigid/small nvt/npt/nph damping parameters must be > 0.0* - Self-explanatory. - -*Fix rigid/small nvt/npt/nph dilate group ID does not exist* - Self-explanatory. - -*Fix rigid/small requires an atom map, see atom_modify* - Self-explanatory. - -*Fix rigid/small requires atom attribute molecule* - Self-explanatory. - *Fix rigid: Bad principal moments* The principal moments of inertia computed for a rigid body are not within the required tolerances. @@ -4110,9 +2358,6 @@ Please also see the page with :doc:`Warning messages `. *Fix shake molecule template must have shake info* The defined molecule does not specify SHAKE information. -*Fix spring couple group ID does not exist* - Self-explanatory. - *Fix srd can only currently be used with comm_style brick* This is a current restriction in LAMMPS. @@ -4123,18 +2368,9 @@ Please also see the page with :doc:`Warning messages `. This is because the SRD collisions will impart torque to the solute particles. -*Fix srd requires SRD particles all have same mass* - Self-explanatory. - *Fix srd requires ghost atoms store velocity* Use the comm_modify vel yes command to enable this. -*Fix srd requires newton pair on* - Self-explanatory. - -*Fix store/state compute array is accessed out-of-range* - Self-explanatory. - *Fix store/state compute does not calculate a per-atom array* The compute calculates a per-atom vector. @@ -4145,9 +2381,6 @@ Please also see the page with :doc:`Warning messages `. Computes that calculate global or local quantities cannot be used with fix store/state. -*Fix store/state fix array is accessed out-of-range* - Self-explanatory. - *Fix store/state fix does not calculate a per-atom array* The fix calculates a per-atom vector. @@ -4158,71 +2391,20 @@ Please also see the page with :doc:`Warning messages `. Fixes that calculate global or local quantities cannot be used with fix store/state. -*Fix store/state for atom property that is not allocated* - Self-explanatory. - *Fix store/state variable is not atom-style variable* Only atom-style variables calculate per-atom quantities. -*Fix temp/berendsen period must be > 0.0* - Self-explanatory. - -*Fix temp/berendsen variable returned negative temperature* - Self-explanatory. - *Fix temp/csld is not compatible with fix rattle or fix shake* These two commands cannot currently be used together with fix temp/csld. -*Fix temp/csld variable returned negative temperature* - Self-explanatory. - -*Fix temp/csvr variable returned negative temperature* - Self-explanatory. - -*Fix temp/rescale variable returned negative temperature* - Self-explanatory. - -*Fix tfmc displacement length must be > 0* - Self-explanatory. - *Fix tfmc is not compatible with fix shake* These two commands cannot currently be used together. -*Fix tfmc temperature must be > 0* - Self-explanatory. - -*Fix thermal/conductivity swap value must be positive* - Self-explanatory. - *Fix tmd must come after integration fixes* Any fix tmd command must appear in the input script after all time integration fixes (nve, nvt, npt). See the fix tmd documentation for details. -*Fix ttm electron temperatures must be > 0.0* - Self-explanatory. - -*Fix ttm electronic_density must be > 0.0* - Self-explanatory. - -*Fix ttm electronic_specific_heat must be > 0.0* - Self-explanatory. - -*Fix ttm electronic_thermal_conductivity must be >= 0.0* - Self-explanatory. - -*Fix ttm gamma_p must be > 0.0* - Self-explanatory. - -*Fix ttm gamma_s must be >= 0.0* - Self-explanatory. - -*Fix ttm number of nodes must be > 0* - Self-explanatory. - -*Fix ttm v_0 must be >= 0.0* - Self-explanatory. - *Fix used in compute chunk/atom not computed at compatible time* The chunk/atom compute cannot query the output of the fix on a timestep it is needed. @@ -4239,39 +2421,6 @@ Please also see the page with :doc:`Warning messages `. The inputs to the command have conflicting intensive/extensive attributes. You need to use more than one fix vector command. -*Fix vector compute does not calculate a scalar* - Self-explanatory. - -*Fix vector compute does not calculate a vector* - Self-explanatory. - -*Fix vector compute vector is accessed out-of-range* - Self-explanatory. - -*Fix vector fix does not calculate a scalar* - Self-explanatory. - -*Fix vector fix does not calculate a vector* - Self-explanatory. - -*Fix vector fix vector is accessed out-of-range* - Self-explanatory. - -*Fix vector variable is not equal-style variable* - Self-explanatory. - -*Fix viscosity swap value must be positive* - Self-explanatory. - -*Fix viscosity vtarget value must be positive* - Self-explanatory. - -*Fix wall cutoff <= 0.0* - Self-explanatory. - -*Fix wall/colloid requires atom style sphere* - Self-explanatory. - *Fix wall/colloid requires extended particles* One of the particles has radius 0.0. @@ -4279,21 +2428,12 @@ Please also see the page with :doc:`Warning messages `. Must use a granular pair style to define the parameters needed for this fix. -*Fix wall/gran requires atom style sphere* - Self-explanatory. - *Fix wall/piston command only available at zlo* The face keyword must be zlo. -*Fix wall/region colloid requires atom style sphere* - Self-explanatory. - *Fix wall/region colloid requires extended particles* One of the particles has radius 0.0. -*Fix wall/region cutoff <= 0.0* - Self-explanatory. - *Fix_modify pressure ID does not compute pressure* The compute ID assigned to the fix must compute pressure. @@ -4307,12 +2447,6 @@ Please also see the page with :doc:`Warning messages `. *Found no restart file matching pattern* When using a "\*" in the restart file name, no matching file was found. -*GPU library not compiled for this accelerator* - Self-explanatory. - -*GPU package does not (yet) work with atom_style template* - Self-explanatory. - *GPU particle split must be set to 1 for this pair style.* For this pair style, you cannot run part of the force calculation on the host. See the package command. @@ -4329,21 +2463,12 @@ Please also see the page with :doc:`Warning messages `. *Gravity changed since fix pour was created* The gravity vector defined by fix gravity must be static. -*Gravity must point in -y to use with fix pour in 2d* - Self-explanatory. - -*Gravity must point in -z to use with fix pour in 3d* - Self-explanatory. - *Grmask function in equal-style variable formula* Grmask is per-atom operation. *Group ID does not exist* A group ID used in the group command does not exist. -*Group ID in variable formula does not exist* - Self-explanatory. - *Group all cannot be made dynamic* This operation is not allowed. @@ -4351,15 +2476,6 @@ Please also see the page with :doc:`Warning messages `. The group command cannot be used before a read_data, read_restart, or create_box command. -*Group dynamic cannot reference itself* - Self-explanatory. - -*Group dynamic parent group cannot be dynamic* - Self-explanatory. - -*Group dynamic parent group does not exist* - Self-explanatory. - *Group region ID does not exist* A region ID used in the group command does not exist. @@ -4392,19 +2508,10 @@ Please also see the page with :doc:`Warning messages `. One or more of the coefficients defined in the potential file is invalid. -*Illegal compute voronoi/atom command (occupation and (surface or edges))* - Self-explanatory. - *Illegal coul/streitz parameter* One or more of the coefficients defined in the potential file is invalid. -*Illegal dump_modify sfactor value (must be > 0.0)* - Self-explanatory. - -*Illegal dump_modify tfactor value (must be > 0.0)* - Self-explanatory. - *Illegal fix gcmc gas mass <= 0* The computed mass of the designated gas molecule or atom type was less than or equal to zero. @@ -4415,9 +2522,6 @@ Please also see the page with :doc:`Warning messages `. *Illegal fix wall/piston velocity* The piston velocity must be positive. -*Illegal integrate style* - Self-explanatory. - *Illegal nb3b/harmonic parameter* One or more of the coefficients defined in the potential file is invalid. @@ -4487,15 +2591,6 @@ Please also see the page with :doc:`Warning messages `. No improper coefficients have been assigned in the data file or via the improper_coeff command. -*Improper style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Improper style hybrid cannot have none as an argument* - Self-explanatory. - -*Improper style hybrid cannot use same improper style twice* - Self-explanatory. - *Improper_coeff command before improper_style is defined* Coefficients cannot be set in the data file or via the improper_coeff command until an improper_style has been assigned. @@ -4558,24 +2653,6 @@ Please also see the page with :doc:`Warning messages `. *Incorrect SNAP parameter file* The file cannot be parsed correctly, check its internal syntax. -*Incorrect args for angle coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect args for bond coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect args for dihedral coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect args for improper coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect args for pair coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect args in pair_style command* - Self-explanatory. - *Incorrect atom format in data file* Number of values per atom line in the data file is not consistent with the atom style. @@ -4654,49 +2731,25 @@ Please also see the page with :doc:`Warning messages `. *Incorrect integer value in Bodies section of data file* See page for body style. -*Incorrect multiplicity arg for dihedral coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect number of elements in potential file* - Self-explanatory. - *Incorrect rigid body format in fix rigid file* The number of fields per line is not what expected. *Incorrect rigid body format in fix rigid/small file* The number of fields per line is not what expected. -*Incorrect sign arg for dihedral coefficients* - Self-explanatory. Check the input script or data file. - -*Incorrect table format check for element types* - Self-explanatory. - *Incorrect velocity format in data file* Each atom style defines a format for the Velocity section of the data file. The read-in lines do not match. -*Incorrect weight arg for dihedral coefficients* - Self-explanatory. Check the input script or data file. - -*Index between variable brackets must be positive* - Self-explanatory. - *Indexed per-atom vector in variable formula without atom map* Accessing a value from an atom vector requires the ability to lookup an atom index, which is provided by an atom map. An atom map does not exist (by default) for non-molecular problems. Using the atom_modify map command will force an atom map to be created. -*Initial temperatures not all set in fix ttm* - Self-explanatory. - *Input line quote not followed by white-space* An end quote must be followed by white-space. -*Insertion region extends outside simulation box* - Self-explanatory. - *Insufficient Jacobi rotations for POEMS body* Eigensolve for rigid body was not sufficiently accurate. @@ -4720,62 +2773,17 @@ Please also see the page with :doc:`Warning messages `. *Internal error in atom_style body* This error should not occur. Contact the developers. -*Invalid -reorder N value* - Self-explanatory. - -*Invalid Angles section in molecule file* - Self-explanatory. - -*Invalid Bonds section in molecule file* - Self-explanatory. - -*Invalid Boolean syntax in if command* - Self-explanatory. - -*Invalid Charges section in molecule file* - Self-explanatory. - -*Invalid Coords section in molecule file* - Self-explanatory. - -*Invalid Diameters section in molecule file* - Self-explanatory. - -*Invalid Dihedrals section in molecule file* - Self-explanatory. - -*Invalid Impropers section in molecule file* - Self-explanatory. - -*Invalid Kokkos command-line args* - Self-explanatory. See Section 2.7 of the manual for details. - *Invalid LAMMPS restart file* The file does not appear to be a LAMMPS restart file since it does not contain the correct magic string at the beginning. -*Invalid Masses section in molecule file* - Self-explanatory. - *Invalid molecule ID in molecule file* Molecule ID must be a non-zero positive integer. -*Invalid Molecules section in molecule file* - Self-explanatory. - *Invalid REAX atom type* There is a mis-match between LAMMPS atom types and the elements listed in the ReaxFF force field file. -*Invalid Special Bond Counts section in molecule file* - Self-explanatory. - -*Invalid Types section in molecule file* - Self-explanatory. - -*Invalid angle count in molecule file* - Self-explanatory. - *Invalid angle table length* Length must be 2 or greater. @@ -4783,12 +2791,6 @@ Please also see the page with :doc:`Warning messages `. Angle type must be positive integer and within range of specified angle types. -*Invalid angle type in Angles section of molecule file* - Self-explanatory. - -*Invalid angle type index for fix shake* - Self-explanatory. - *Invalid args for non-hybrid pair coefficients* "NULL" is only supported in pair_coeff calls when using pair hybrid @@ -4804,9 +2806,6 @@ Please also see the page with :doc:`Warning messages `. Atom IDs must be positive integers and within range of defined atoms. -*Invalid atom ID in Angles section of molecule file* - Self-explanatory. - *Invalid atom ID in Atoms section of data file* Atom IDs must be positive integers. @@ -4818,9 +2817,6 @@ Please also see the page with :doc:`Warning messages `. Atom IDs must be positive integers and within range of defined atoms. -*Invalid atom ID in Bonds section of molecule file* - Self-explanatory. - *Invalid atom ID in Bonus section of data file* Atom IDs must be positive integers and within range of defined atoms. @@ -4829,9 +2825,6 @@ Please also see the page with :doc:`Warning messages `. Atom IDs must be positive integers and within range of defined atoms. -*Invalid atom ID in Fragments section of molecule file* - Self-explanatory. - *Invalid atom ID in Impropers section of data file* Atom IDs must be positive integers and within range of defined atoms. @@ -4840,15 +2833,6 @@ Please also see the page with :doc:`Warning messages `. Atom IDs must be positive integers and within range of defined atoms. -*Invalid atom ID in dihedrals section of molecule file* - Self-explanatory. - -*Invalid atom ID in impropers section of molecule file* - Self-explanatory. - -*Invalid atom ID in variable file* - Self-explanatory. - *Invalid atom IDs in neb file* An ID in the file was not found in the system. @@ -4877,12 +2861,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid atom type in fix atom/swap command* The atom type specified in the atom/swap command does not exist. -*Invalid atom type in fix bond/create command* - Self-explanatory. - -*Invalid atom type in fix deposit command* - Self-explanatory. - *Invalid atom type in fix deposit mol command* The atom types in the defined molecule are added to the value specified in the create_atoms command, as an offset. The final value @@ -4892,9 +2870,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid atom type in fix gcmc command* The atom type specified in the gcmc command does not exist. -*Invalid atom type in fix pour command* - Self-explanatory. - *Invalid atom type in fix pour mol command* The atom types in the defined molecule are added to the value specified in the create_atoms command, as an offset. The final value @@ -4919,18 +2894,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid atom_style body command* No body style argument was provided. -*Invalid atom_style command* - Self-explanatory. - -*Invalid attribute in dump custom command* - Self-explanatory. - -*Invalid attribute in dump local command* - Self-explanatory. - -*Invalid attribute in dump modify command* - Self-explanatory. - *Invalid basis setting in create_atoms command* The basis index must be between 1 to N where N is the number of basis atoms in the lattice. The type index must be between 1 to N where N @@ -4950,9 +2913,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid body nparticle command* Arguments in atom-style command are not correct. -*Invalid bond count in molecule file* - Self-explanatory. - *Invalid bond table length* Length must be 2 or greater. @@ -4960,21 +2920,6 @@ Please also see the page with :doc:`Warning messages `. Bond type must be positive integer and within range of specified bond types. -*Invalid bond type in Bonds section of molecule file* - Self-explanatory. - -*Invalid bond type in create_bonds command* - Self-explanatory. - -*Invalid bond type in fix bond/break command* - Self-explanatory. - -*Invalid bond type in fix bond/create command* - Self-explanatory. - -*Invalid bond type index for fix shake* - Self-explanatory. Check the fix shake command in the input script. - *Invalid coeffs for this dihedral style* Cannot set class 2 coeffs in data file for this dihedral style. @@ -5078,22 +3023,10 @@ Please also see the page with :doc:`Warning messages `. *Invalid density in set command* Density must be > 0.0. -*Invalid diameter in set command* - Self-explanatory. - -*Invalid dihedral count in molecule file* - Self-explanatory. - *Invalid dihedral type in Dihedrals section of data file* Dihedral type must be positive integer and within range of specified dihedral types. -*Invalid dihedral type in dihedrals section of molecule file* - Self-explanatory. - -*Invalid dipole length in set command* - Self-explanatory. - *Invalid displace_atoms rotate axis for 2d* Axis must be in z direction. @@ -5133,15 +3066,9 @@ Please also see the page with :doc:`Warning messages `. *Invalid dump_modify threshold operator* Operator keyword used for threshold specification in not recognized. -*Invalid entry in -reorder file* - Self-explanatory. - *Invalid fix ID in variable formula* The fix is not recognized. -*Invalid fix ave/time off column* - Self-explanatory. - *Invalid fix box/relax command for a 2d simulation* Fix box/relax styles involving the z dimension cannot be used in a 2d simulation. @@ -5152,12 +3079,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid fix box/relax pressure settings* Settings for coupled dimensions must be the same. -*Invalid fix halt attribute* - Self-explanatory. - -*Invalid fix halt operator* - Self-explanatory. - *Invalid fix nvt/npt/nph command for a 2d simulation* Cannot control z dimension in a 2d model. @@ -5212,94 +3133,22 @@ Please also see the page with :doc:`Warning messages `. *Invalid group function in variable formula* Group function is not recognized. -*Invalid group in comm_modify command* - Self-explanatory. - *Invalid image up vector* Up vector cannot be (0,0,0). *Invalid immediate variable* Syntax of immediate value is incorrect. -*Invalid improper count in molecule file* - Self-explanatory. - *Invalid improper type in Impropers section of data file* Improper type must be positive integer and within range of specified improper types. -*Invalid improper type in impropers section of molecule file* - Self-explanatory. - *Invalid index for non-body particles in compute body/local command* Only indices 1,2,3 can be used for non-body particles. -*Invalid index in compute body/local command* - Self-explanatory. - -*Invalid is_active() function in variable formula* - Self-explanatory. - -*Invalid is_available() function in variable formula* - Self-explanatory. - -*Invalid is_defined() function in variable formula* - Self-explanatory. - -*Invalid keyword in angle table parameters* - Self-explanatory. - -*Invalid keyword in bond table parameters* - Self-explanatory. - -*Invalid keyword in compute angle/local command* - Self-explanatory. - -*Invalid keyword in compute bond/local command* - Self-explanatory. - -*Invalid keyword in compute dihedral/local command* - Self-explanatory. - -*Invalid keyword in compute improper/local command* - Self-explanatory. - -*Invalid keyword in compute pair/local command* - Self-explanatory. - -*Invalid keyword in compute property/atom command* - Self-explanatory. - -*Invalid keyword in compute property/chunk command* - Self-explanatory. - -*Invalid keyword in compute property/local command* - Self-explanatory. - -*Invalid keyword in dump cfg command* - Self-explanatory. - *Invalid keyword in pair table parameters* Keyword used in list of table parameters is not recognized. -*Invalid length in set command* - Self-explanatory. - -*Invalid mass in set command* - Self-explanatory. - -*Invalid mass line in data file* - Self-explanatory. - -*Invalid mass value* - Self-explanatory. - -*Invalid math function in variable formula* - Self-explanatory. - -*Invalid math/group/special function in variable formula* - Self-explanatory. - *Invalid option in lattice command for non-custom style* Certain lattice keywords are not supported unless the lattice style is "custom". @@ -5340,9 +3189,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid random number seed in set command* Random number seed must be > 0. -*Invalid replace values in compute reduce* - Self-explanatory. - *Invalid rigid body ID in fix rigid file* The ID does not match the number of an existing ID of rigid bodies that are defined by the fix rigid command. @@ -5355,12 +3201,6 @@ Please also see the page with :doc:`Warning messages `. The number of timesteps must fit in a 32-bit integer. If you want to run for more steps than this, perform multiple shorter runs. -*Invalid run command start/stop value* - Self-explanatory. - -*Invalid run command upto value* - Self-explanatory. - *Invalid seed for Marsaglia random # generator* The initial seed for this random number generator must be a positive integer less than or equal to 900 million. @@ -5369,45 +3209,9 @@ Please also see the page with :doc:`Warning messages `. The initial seed for this random number generator must be a positive integer. -*Invalid shake angle type in molecule file* - Self-explanatory. - -*Invalid shake atom in molecule file* - Self-explanatory. - -*Invalid shake bond type in molecule file* - Self-explanatory. - -*Invalid shake flag in molecule file* - Self-explanatory. - -*Invalid shape in Ellipsoids section of data file* - Self-explanatory. - *Invalid shape in Triangles section of data file* Two or more of the triangle corners are duplicate points. -*Invalid shape in set command* - Self-explanatory. - -*Invalid shear direction for fix wall/gran* - Self-explanatory. - -*Invalid special atom index in molecule file* - Self-explanatory. - -*Invalid special function in variable formula* - Self-explanatory. - -*Invalid style in pair_write command* - Self-explanatory. Check the input script. - -*Invalid syntax in variable formula* - Self-explanatory. - -*Invalid t_event in prd command* - Self-explanatory. - *Invalid t_event in tad command* The value must be greater than 0. @@ -5473,9 +3277,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid variable evaluation in variable formula* A variable used in a formula could not be evaluated. -*Invalid variable in next command* - Self-explanatory. - *Invalid variable name* Variable name used in an input script line is invalid. @@ -5492,21 +3293,6 @@ Please also see the page with :doc:`Warning messages `. *Invalid volume in set command* Volume must be > 0.0. -*Invalid wiggle direction for fix wall/gran* - Self-explanatory. - -*Invoked angle equil angle on angle style none* - Self-explanatory. - -*Invoked angle single on angle style none* - Self-explanatory. - -*Invoked bond equil distance on bond style none* - Self-explanatory. - -*Invoked bond single on bond style none* - Self-explanatory. - *Invoked pair single on pair style none* A command (e.g. a dump) attempted to invoke the single() function on a pair style none, which is illegal. You are probably attempting to @@ -5523,12 +3309,6 @@ Please also see the page with :doc:`Warning messages `. Model. Please contact the OpenKIM database maintainers to verify and potentially correct this. -*KOKKOS package does not yet support comm_style tiled* - Self-explanatory. - -*KOKKOS package requires a kokkos enabled atom_style* - Self-explanatory. - *KSpace accuracy must be > 0* The kspace accuracy designated in the input must be greater than zero. @@ -5553,9 +3333,6 @@ Please also see the page with :doc:`Warning messages `. Setting a kspace style requires that a pair style with matching long-range Coulombic or dispersion components be used. -*Keyword %s in MEAM parameter file not recognized* - Self-explanatory. - *Kokkos has been compiled for CUDA but no GPUs are requested* One or more GPUs must be used when Kokkos is compiled for CUDA. @@ -5569,39 +3346,18 @@ Please also see the page with :doc:`Warning messages `. the required accuracy via *force/disp/real* as well as *force/disp/kspace* is set. -*Kspace style does not support compute group/group* - Self-explanatory. - -*Kspace style pppm/disp/tip4p requires newton on* - Self-explanatory. - -*Kspace style pppm/tip4p requires newton on* - Self-explanatory. - *Kspace style requires atom attribute q* The atom style defined does not have these attributes. -*Kspace_modify eigtol must be smaller than one* - Self-explanatory. - *LAMMPS is not built with Python embedded* This is done by including the PYTHON package before LAMMPS is built. This is required to use python-style variables. -*LAMMPS unit_style lj not supported by KIM models* - Self-explanatory. Check the input script or data file. - -*LJ6 off not supported in pair_style buck/long/coul/long* - Self-explanatory. - *Label map is incomplete: all types must be assigned a unique type label* For a given type-kind (atom types, bond types, etc.) to be written to the data file, all associated types must be assigned a type label, and each type label can be assigned to only one numeric type. -*Label wasn't found in input script* - Self-explanatory. - *Labelmap command before simulation box is defined* The labelmap command cannot be used before a read_data, read_restart, or create_box command. @@ -5629,9 +3385,6 @@ Please also see the page with :doc:`Warning messages `. 2d simulation can use sq, sq2, or hex lattice. 3d simulation can use sc, bcc, or fcc lattice. -*Log of zero/negative value in variable formula* - Self-explanatory. - *Lost atoms via balance: original %ld current %ld* This should not occur. Report the problem to the developers. @@ -5682,9 +3435,6 @@ Please also see the page with :doc:`Warning messages `. The minimize command cannot be used before a read_data, read_restart, or create_box command. -*Mismatched brackets in variable* - Self-explanatory. - *Mismatched compute in variable formula* A compute is referenced incorrectly or a compute that produces per-atom values is used in an equal-style variable formula. @@ -5701,9 +3451,6 @@ Please also see the page with :doc:`Warning messages `. produces per-atom values is used in an equal-style variable formula. -*Modulo 0 in variable formula* - Self-explanatory. - *Molecule IDs too large for compute chunk/atom* The IDs must not be larger than can be stored in a 32-bit integer since chunk IDs are 32-bit integers. @@ -5711,42 +3458,6 @@ Please also see the page with :doc:`Warning messages `. *Molecule auto special bond generation overflow* Counts exceed maxspecial setting for other atoms in system. -*Molecule file has angles but no nangles setting* - Self-explanatory. - -*Molecule file has body params but no setting for them* - Self-explanatory. - -*Molecule file has bonds but no nbonds setting* - Self-explanatory. - -*Molecule file has dihedrals but no ndihedrals setting* - Self-explanatory. - -*Molecule file has fragments but no nfragments setting* - Self-explanatory. - -*Molecule file has impropers but no nimpropers setting* - Self-explanatory. - -*Molecule file has no Body Doubles section* - Self-explanatory. - -*Molecule file has no Body Integers section* - Self-explanatory. - -*Molecule file has no Fragments section* - Self-explanatory. - -*Molecule file has special flags but no bonds* - Self-explanatory. - -*Molecule file needs both Special Bond sections* - Self-explanatory. - -*Molecule file requires atom style body* - Self-explanatory. - *Molecule file shake flags not before shake atoms* The order of the two sections is important. @@ -5759,42 +3470,6 @@ Please also see the page with :doc:`Warning messages `. *Molecule file special list does not match special count* The number of values in an atom's special list does not match count. -*Molecule file z center-of-mass must be 0.0 for 2d* - Self-explanatory. - -*Molecule file z coord must be 0.0 for 2d* - Self-explanatory. - -*Molecule natoms must be 1 for body particle* - Self-explanatory. - -*Molecule sizescale must be 1.0 for body particle* - Self-explanatory. - -*Molecule template ID for atom_style template does not exist* - Self-explanatory. - -*Molecule template ID for create_atoms does not exist* - Self-explanatory. - -*Molecule template ID for fix deposit does not exist* - Self-explanatory. - -*Molecule template ID for fix gcmc does not exist* - Self-explanatory. - -*Molecule template ID for fix pour does not exist* - Self-explanatory. - -*Molecule template ID for fix rigid/small does not exist* - Self-explanatory. - -*Molecule template ID for fix shake does not exist* - Self-explanatory. - -*Molecule template ID must be alphanumeric or underscore characters* - Self-explanatory. - *Molecule topology/atom exceeds system topology/atom* The number of bonds, angles, etc per-atom in the molecule exceeds the system setting. See the create_box command for how to specify these @@ -5815,9 +3490,6 @@ Please also see the page with :doc:`Warning messages `. *More than one fix shake* Only one fix shake can be defined. -*Mu not allowed when not using semi-grand in fix atom/swap command* - Self-explanatory. - *Must define angle_style before Angle Coeffs* Must use an angle_style command before reading a data file that defines Angle Coeffs. @@ -5878,9 +3550,6 @@ Please also see the page with :doc:`Warning messages `. Cannot use the temper command with only one processor partition. Use the -partition command-line option. -*Must not have multiple fixes change box parameter ...* - Self-explanatory. - *Must read Angle Type Labels before Angles* An Angle Type Labels section of a data file must come before the Angles section. @@ -5945,21 +3614,6 @@ Please also see the page with :doc:`Warning messages `. *Must specify a region in fix deposit* The region keyword must be specified with this fix. -*Must specify a region in fix pour* - Self-explanatory. - -*Must specify at least 2 types in fix atom/swap command* - Self-explanatory. - -*Must use 'kim_style init' command before simulation box is defined* - Self-explanatory. - -*Must use 'kim_style define' command after simulation box is defined* - Self-explanatory. - -*Must use 'kim_style init' command before 'kim_style define'* - Self-explanatory. - *Must use 'kspace_modify pressure/scalar no' for rRESPA with kspace_style MSM* The kspace scalar pressure option cannot (yet) be used with rRESPA. @@ -5983,22 +3637,10 @@ Please also see the page with :doc:`Warning messages `. *Must use Kokkos half/thread or full neighbor list with threads or GPUs* Using Kokkos half-neighbor lists with threading is not allowed. -*Must use a block or cylinder region with fix pour* - Self-explanatory. - -*Must use a block region with fix pour for 2d simulations* - Self-explanatory. - *Must use a bond style with TIP4P potential* TIP4P potentials assume bond lengths in water are constrained by a fix shake command. -*Must use a molecular atom style with fix poems molecule* - Self-explanatory. - -*Must use a z-axis cylinder region with fix pour* - Self-explanatory. - *Must use an angle style with TIP4P potential* TIP4P potentials assume angles in water are constrained by a fix shake command. @@ -6006,12 +3648,6 @@ Please also see the page with :doc:`Warning messages `. *Must use atom map style array with Kokkos* See the atom_modify map command. -*Must use atom style with molecule IDs with fix bond/swap* - Self-explanatory. - -*Must use pair_style comb or comb3 with fix qeq/comb* - Self-explanatory. - *Must use variable energy with fix addforce* Must define an energy variable when applying a dynamic force during minimization. @@ -6020,21 +3656,12 @@ Please also see the page with :doc:`Warning messages `. You must define an energy when performing a minimization with a variable E-field. -*NEB command before simulation box is defined* - Self-explanatory. - *NEB requires damped dynamics minimizer* Use a different minimization style. -*NEB requires use of fix neb* - Self-explanatory. - *NL ramp in wall/piston only implemented in zlo for now* The ramp keyword can only be used for piston applied to face zlo. -*Need nswaptypes mu values in fix atom/swap command* - Self-explanatory. - *Needed bonus data not in data file* Some atom styles require bonus data. See the read_data page for details. @@ -6043,12 +3670,6 @@ Please also see the page with :doc:`Warning messages `. The header of the data file indicated bonds, angles, etc would be included, but they are not present. -*Neigh_modify exclude molecule requires atom attribute molecule* - Self-explanatory. - -*Neigh_modify include group != atom_modify first group* - Self-explanatory. - *Neighbor delay must be 0 or multiple of every setting* The delay and every parameters set via the neigh_modify command are inconsistent. If the delay setting is non-zero, then it must be a @@ -6065,12 +3686,6 @@ Please also see the page with :doc:`Warning messages `. *Neighbor multi not yet enabled for ghost neighbors* This is a current restriction within LAMMPS. -*Neighbor multi not yet enabled for granular* - Self-explanatory. - -*Neighbor multi not yet enabled for rRESPA* - Self-explanatory. - *Neighbor page size must be >= 10x the one atom setting* This is required to prevent wasting too much memory. @@ -6098,19 +3713,10 @@ Please also see the page with :doc:`Warning messages `. *Next command must list all universe and uloop variables* This is to ensure they stay in sync. -*No Kspace style defined for compute group/group* - Self-explanatory. - *No OpenMP support compiled in* An OpenMP flag is set, but LAMMPS was not built with OpenMP support. -*No angle style is defined for compute angle/local* - Self-explanatory. - -*No angles allowed with this atom style* - Self-explanatory. - *No atoms in data file* The header of the data file indicated that atoms would be included, but they are not present. @@ -6118,52 +3724,16 @@ Please also see the page with :doc:`Warning messages `. *No basis atoms in lattice* Basis atoms must be defined for lattice style user. -*No bodies allowed with this atom style* - Self-explanatory. Check data file. - -*No bond style is defined for compute bond/local* - Self-explanatory. - -*No bonds allowed with this atom style* - Self-explanatory. - -*No box information in dump. You have to use 'box no'* - Self-explanatory. - *No count or invalid atom count in molecule file* The number of atoms must be specified. -*No dihedral style is defined for compute dihedral/local* - Self-explanatory. - -*No dihedrals allowed with this atom style* - Self-explanatory. - *No dump custom arguments specified* The dump custom command requires that atom quantities be specified to output to dump file. -*No dump local arguments specified* - Self-explanatory. - -*No ellipsoids allowed with this atom style* - Self-explanatory. Check data file. - *No fix gravity defined for fix pour* Gravity is required to use fix pour. -*No improper style is defined for compute improper/local* - Self-explanatory. - -*No impropers allowed with this atom style* - Self-explanatory. - -*No input values for fix ave/spatial* - Self-explanatory. - -*No lines allowed with this atom style* - Self-explanatory. Check data file. - *No matching element in ADP potential file* The ADP potential file does not contain elements that match the requested elements. @@ -6176,39 +3746,15 @@ Please also see the page with :doc:`Warning messages `. The data file cannot specify the number of bonds, angles, etc, because this info if inferred from the molecule templates. -*No overlap of box and region for create_atoms* - Self-explanatory. - *No pair coul/streitz for fix qeq/slater* These commands must be used together. -*No pair hbond/dreiding coefficients set* - Self-explanatory. - *No pair style defined for compute group/group* Cannot calculate group interactions without a pair style defined. -*No pair style is defined for compute pair/local* - Self-explanatory. - -*No pair style is defined for compute property/local* - Self-explanatory. - *No rigid bodies defined* The fix specification did not end up defining any rigid bodies. -*No triangles allowed with this atom style* - Self-explanatory. Check data file. - -*No values in fix ave/chunk command* - Self-explanatory. - -*No values in fix ave/time command* - Self-explanatory. - -*Non digit character between brackets in variable* - Self-explanatory. - *Non integer # of swaps in temper command* Swap frequency in temper command must evenly divide the total # of timesteps. @@ -6216,15 +3762,6 @@ Please also see the page with :doc:`Warning messages `. *Non-numeric box dimensions - simulation unstable* The box size has apparently blown up. -*Non-zero atom IDs with atom_modify id = no* - Self-explanatory. - -*Non-zero read_data shift z value for 2d simulation* - Self-explanatory. - -*Nprocs not a multiple of N for -reorder* - Self-explanatory. - *Number of core atoms != number of shell atoms* There must be a one-to-one pairing of core and shell atoms. @@ -6247,25 +3784,10 @@ Please also see the page with :doc:`Warning messages `. Two or more rigid bodies defined by the fix rigid command cannot contain the same atom. -*One or more rigid bodies are a single particle* - Self-explanatory. - *One or zero atoms in rigid body* Any rigid body defined by the fix rigid command must contain 2 or more atoms. -*Only 2 types allowed when not using semi-grand in fix atom/swap command* - Self-explanatory. - -*Only one cut-off allowed when requesting all long* - Self-explanatory. - -*Only one cutoff allowed when requesting all long* - Self-explanatory. - -*Only zhi currently implemented for fix append/atoms* - Self-explanatory. - *Out of range atoms - cannot compute MSM* One or more atoms are attempting to map their charge to a MSM grid point that is not owned by a processor. This is likely for one of two @@ -6366,12 +3888,6 @@ Please also see the page with :doc:`Warning messages `. The prd command cannot be used before a read_data, read_restart, or create_box command. -*PRD nsteps must be multiple of t_event* - Self-explanatory. - -*PRD t_corr must be multiple of t_event* - Self-explanatory. - *Package command after simulation box is defined* The package command cannot be used after a read_data, read_restart, or create_box command. @@ -6392,30 +3908,18 @@ Please also see the page with :doc:`Warning messages `. The OPENMP package must be installed via "make yes-openmp" before LAMMPS is built. -*Pair body requires atom style body* - Self-explanatory. - *Pair body requires body style nparticle* This pair style is specific to the nparticle body style. -*Pair brownian requires atom style sphere* - Self-explanatory. - *Pair brownian requires extended particles* One of the particles has radius 0.0. *Pair brownian requires monodisperse particles* All particles must be the same finite size. -*Pair brownian/poly requires atom style sphere* - Self-explanatory. - *Pair brownian/poly requires extended particles* One of the particles has radius 0.0. -*Pair brownian/poly requires newton pair off* - Self-explanatory. - *Pair coeff for hybrid has invalid style* Style in pair coeff must have been listed in pair_style command. @@ -6451,18 +3955,6 @@ Please also see the page with :doc:`Warning messages `. Each atom type involved in pair_style gayberne must have these 3 coefficients set at least once. -*Pair gayberne requires atom style ellipsoid* - Self-explanatory. - -*Pair gayberne requires atoms with same type have same shape* - Self-explanatory. - -*Pair gayberne/gpu requires atom style ellipsoid* - Self-explanatory. - -*Pair gayberne/gpu requires atoms with same type have same shape* - Self-explanatory. - *Pair granular requires atom attributes radius, rmass* The atom style defined does not have these attributes. @@ -6473,9 +3965,6 @@ Please also see the page with :doc:`Warning messages `. This is a current restriction of the implementation of pair granular styles with history. -*Pair hybrid single calls do not support per sub-style special bond values* - Self-explanatory. - *Pair hybrid sub-style does not support single call* You are attempting to invoke a single() call on a pair style that does not support it. @@ -6491,36 +3980,21 @@ Please also see the page with :doc:`Warning messages `. *Pair inner cutoff >= Pair outer cutoff* The specified cutoffs for the pair style are inconsistent. -*Pair line/lj requires atom style line* - Self-explanatory. - *Pair lj/long/dipole/long requires atom attributes mu, torque* The atom style defined does not have these attributes. -*Pair lubricate requires atom style sphere* - Self-explanatory. - *Pair lubricate requires ghost atoms store velocity* Use the comm_modify vel yes command to enable this. *Pair lubricate requires monodisperse particles* All particles must be the same finite size. -*Pair lubricate/poly requires atom style sphere* - Self-explanatory. - *Pair lubricate/poly requires extended particles* One of the particles has radius 0.0. *Pair lubricate/poly requires ghost atoms store velocity* Use the comm_modify vel yes command to enable this. -*Pair lubricate/poly requires newton pair off* - Self-explanatory. - -*Pair lubricateU requires atom style sphere* - Self-explanatory. - *Pair lubricateU requires ghost atoms store velocity* Use the comm_modify vel yes command to enable this. @@ -6530,9 +4004,6 @@ Please also see the page with :doc:`Warning messages `. *Pair lubricateU/poly requires ghost atoms store velocity* Use the comm_modify vel yes command to enable this. -*Pair lubricateU/poly requires newton pair off* - Self-explanatory. - *Pair peri lattice is not identical in x, y, and z* The lattice defined by the lattice command must be cubic. @@ -6543,24 +4014,6 @@ Please also see the page with :doc:`Warning messages `. Even for atomic systems, an atom map is required to find Peridynamic bonds. Use the atom_modify command to define one. -*Pair resquared epsilon a,b,c coeffs are not all set* - Self-explanatory. - -*Pair resquared epsilon and sigma coeffs are not all set* - Self-explanatory. - -*Pair resquared requires atom style ellipsoid* - Self-explanatory. - -*Pair resquared requires atoms with same type have same shape* - Self-explanatory. - -*Pair resquared/gpu requires atom style ellipsoid* - Self-explanatory. - -*Pair resquared/gpu requires atoms with same type have same shape* - Self-explanatory. - *Pair style AIREBO requires atom IDs* This is a requirement to use the AIREBO potential. @@ -6578,9 +4031,6 @@ Please also see the page with :doc:`Warning messages `. *Pair style COMB requires atom IDs* This is a requirement to use the AIREBO potential. -*Pair style COMB requires atom attribute q* - Self-explanatory. - *Pair style COMB requires newton pair on* See the newton command. This is a restriction to use the COMB potential. @@ -6588,9 +4038,6 @@ Please also see the page with :doc:`Warning messages `. *Pair style COMB3 requires atom IDs* This is a requirement to use the COMB3 potential. -*Pair style COMB3 requires atom attribute q* - Self-explanatory. - *Pair style COMB3 requires newton pair on* See the newton command. This is a restriction to use the COMB3 potential. @@ -6674,9 +4121,6 @@ Please also see the page with :doc:`Warning messages `. *Pair style coul/long/gpu requires atom attribute q* The atom style defined does not have these attributes. -*Pair style coul/streitz requires atom attribute q* - Self-explanatory. - *Pair style does not have extra field requested by compute pair/local* The pair style does not support the pN value requested by the compute pair/local command. @@ -6713,24 +4157,9 @@ Please also see the page with :doc:`Warning messages `. Atoms in the simulation do not have IDs, so history effects cannot be tracked by the granular pair potential. -*Pair style hbond/dreiding requires an atom map, see atom_modify* - Self-explanatory. - -*Pair style hbond/dreiding requires atom IDs* - Self-explanatory. - -*Pair style hbond/dreiding requires molecular system* - Self-explanatory. - *Pair style hbond/dreiding requires newton pair on* See the newton command for details. -*Pair style hybrid cannot have hybrid as an argument* - Self-explanatory. - -*Pair style hybrid cannot have none as an argument* - Self-explanatory. - *Pair style is incompatible with KSpace style* If a pair style with a long-range Coulombic component is selected, then a kspace style must also be used. @@ -6830,9 +4259,6 @@ Please also see the page with :doc:`Warning messages `. *Pair style nm/cut/coul/long requires atom attribute q* The atom style defined does not have this attribute. -*Pair style peri requires atom style peri* - Self-explanatory. - *Pair style polymorphic requires atom IDs* This is a requirement to use the polymorphic potential. @@ -6852,9 +4278,6 @@ Please also see the page with :doc:`Warning messages `. *Pair style requires a KSpace style* No kspace style is defined. -*Pair style requires use of kspace_style ewald/disp* - Self-explanatory. - *Pair style sw/gpu requires atom IDs* This is a requirement to use this potential. @@ -6907,38 +4330,17 @@ Please also see the page with :doc:`Warning messages `. *Pair tersoff/zbl/kk requires metal or real units* This is a current restriction of this pair potential. -*Pair tri/lj requires atom style tri* - Self-explanatory. - -*Pair yukawa/colloid requires atom style sphere* - Self-explanatory. - -*Pair yukawa/colloid requires atoms with same type have same radius* - Self-explanatory. - -*Pair yukawa/colloid/gpu requires atom style sphere* - Self-explanatory. - *PairKIM only works with 3D problems* This is a current limitation. -*Pair_coeff command before pair_style is defined* - Self-explanatory. - *Pair_coeff command before simulation box is defined* The pair_coeff command cannot be used before a read_data, read_restart, or create_box command. -*Pair_modify command before pair_style is defined* - Self-explanatory. - *Pair_modify special setting for pair hybrid incompatible with global special_bonds setting* Cannot override a setting of 0.0 or 1.0 or change a setting between 0.0 and 1.0. -*Pair_write command before pair_style is defined* - Self-explanatory. - *Particle on or inside fix wall surface* Particles must be "exterior" to the wall in order for energy/force to be calculated. @@ -6967,9 +4369,6 @@ Please also see the page with :doc:`Warning messages `. The number of owned atoms plus ghost atoms on a single processor must fit in 32-bit integer. -*Potential energy ID for fix neb does not exist* - Self-explanatory. - *Potential energy ID for fix nvt/nph/npt does not exist* A compute for potential energy must be defined. @@ -6979,79 +4378,22 @@ Please also see the page with :doc:`Warning messages `. *Potential file is missing an entry* The potential file does not have a needed entry. -*Power by 0 in variable formula* - Self-explanatory. - *Pressure ID for fix box/relax does not exist* The compute ID needed to compute pressure for the fix does not exist. -*Pressure ID for fix modify does not exist* - Self-explanatory. - -*Pressure ID for fix npt/nph does not exist* - Self-explanatory. - *Pressure ID for fix press/berendsen does not exist* The compute ID needed to compute pressure for the fix does not exist. -*Pressure ID for fix rigid npt/nph does not exist* - Self-explanatory. - *Pressure ID for thermo does not exist* The compute ID needed to compute pressure for thermodynamics does not exist. -*Pressure control can not be used with fix nvt* - Self-explanatory. - -*Pressure control can not be used with fix nvt/asphere* - Self-explanatory. - -*Pressure control can not be used with fix nvt/body* - Self-explanatory. - -*Pressure control can not be used with fix nvt/sllod* - Self-explanatory. - -*Pressure control can not be used with fix nvt/sphere* - Self-explanatory. - -*Pressure control must be used with fix nph* - Self-explanatory. - -*Pressure control must be used with fix nph/asphere* - Self-explanatory. - -*Pressure control must be used with fix nph/body* - Self-explanatory. - -*Pressure control must be used with fix nph/small* - Self-explanatory. - -*Pressure control must be used with fix nph/sphere* - Self-explanatory. - *Pressure control must be used with fix nphug* A pressure control keyword (iso, aniso, tri, x, y, or z) must be provided. -*Pressure control must be used with fix npt* - Self-explanatory. - -*Pressure control must be used with fix npt/asphere* - Self-explanatory. - -*Pressure control must be used with fix npt/body* - Self-explanatory. - -*Pressure control must be used with fix npt/sphere* - Self-explanatory. - -*Processor count in z must be 1 for 2d simulation* - Self-explanatory. - *Processor partitions do not match number of allocated processors* The total number of processors in all partitions must match the number of processors LAMMPS is running on. @@ -7072,12 +4414,6 @@ Please also see the page with :doc:`Warning messages `. *Processors part option and grid style are incompatible* Cannot use gstyle numa or custom with the part option. -*Processors twogrid requires proc count be a multiple of core count* - Self-explanatory. - -*Pstart and Pstop must have the same value* - Self-explanatory. - *Python function evaluation failed* The Python function did not run successfully and/or did not return a value (if it is supposed to return a value). This is probably due to @@ -7104,9 +4440,6 @@ Please also see the page with :doc:`Warning messages `. *R0 < 0 for fix spring command* Equilibrium spring length is invalid. -*RATTLE coordinate constraints are not satisfied up to desired tolerance* - Self-explanatory. - *RATTLE determinant = 0.0* The determinant of the matrix being solved for a single cluster specified by the fix rattle command is numerically invalid. @@ -7114,19 +4447,10 @@ Please also see the page with :doc:`Warning messages `. *RATTLE failed* Certain constraints were not satisfied. -*RATTLE velocity constraints are not satisfied up to desired tolerance* - Self-explanatory. - *Read data add offset is too big* It cannot be larger than the size of atom IDs, e.g. the maximum 32-bit integer. -*Read dump of atom property that is not allocated* - Self-explanatory. - -*Read rerun dump file timestep > specified stop* - Self-explanatory. - *Read restart MPI-IO input not allowed with % in filename* This is because a % signifies one file per processor and MPI-IO creates one large file for all processors. @@ -7142,16 +4466,10 @@ Please also see the page with :doc:`Warning messages `. The read_dump command cannot be used before a read_data, read_restart, or create_box command. -*Read_dump field not found in dump file* - Self-explanatory. - *Read_dump triclinic status does not match simulation* Both the dump snapshot and the current LAMMPS simulation must be using either an orthogonal or triclinic box. -*Read_dump xyz fields do not have consistent scaling/wrapping* - Self-explanatory. - *Reax_defs.h setting for NATDEF is too small* Edit the setting in the ReaxFF library and re-compile the library and re-build LAMMPS. @@ -7163,66 +4481,6 @@ Please also see the page with :doc:`Warning messages `. *Receiving partition in processors part command is already a receiver* Cannot specify a partition to be a receiver twice. -*Region ID for compute chunk/atom does not exist* - Self-explanatory. - -*Region ID for compute reduce/region does not exist* - Self-explanatory. - -*Region ID for compute temp/region does not exist* - Self-explanatory. - -*Region ID for dump custom does not exist* - Self-explanatory. - -*Region ID for fix addforce does not exist* - Self-explanatory. - -*Region ID for fix atom/swap does not exist* - Self-explanatory. - -*Region ID for fix ave/spatial does not exist* - Self-explanatory. - -*Region ID for fix aveforce does not exist* - Self-explanatory. - -*Region ID for fix deposit does not exist* - Self-explanatory. - -*Region ID for fix efield does not exist* - Self-explanatory. - -*Region ID for fix evaporate does not exist* - Self-explanatory. - -*Region ID for fix gcmc does not exist* - Self-explanatory. - -*Region ID for fix heat does not exist* - Self-explanatory. - -*Region ID for fix setforce does not exist* - Self-explanatory. - -*Region ID for fix wall/region does not exist* - Self-explanatory. - -*Region ID for group dynamic does not exist* - Self-explanatory. - -*Region ID in variable formula does not exist* - Self-explanatory. - -*Region cannot have 0 length rotation vector* - Self-explanatory. - -*Region for fix oneway does not exist* - Self-explanatory. - -*Region intersect region ID does not exist* - Self-explanatory. - *Region union or intersect cannot be dynamic* The sub-regions can be dynamic, but not the combined region. @@ -7259,18 +4517,12 @@ Please also see the page with :doc:`Warning messages `. The rerun command cannot be used before a read_data, read_restart, or create_box command. -*Rerun dump file does not contain requested snapshot* - Self-explanatory. - *Resetting timestep size is not allowed with fix move* This is because fix move is moving atoms based on elapsed time. *Respa inner cutoffs are invalid* The first cutoff must be <= the second cutoff. -*Respa levels must be >= 1* - Self-explanatory. - *Respa middle cutoffs are invalid* The first cutoff must be <= the second cutoff. @@ -7359,12 +4611,6 @@ Please also see the page with :doc:`Warning messages `. The run command cannot be used before a read_data, read_restart, or create_box command. -*Run command start value is after start of run* - Self-explanatory. - -*Run command stop value is before end of run* - Self-explanatory. - *Run_style command before simulation box is defined* The run_style command cannot be used before a read_data, read_restart, or create_box command. @@ -7385,9 +4631,6 @@ Please also see the page with :doc:`Warning messages `. See the inside keyword if you want this message to be an error vs warning. -*Same dimension twice in fix ave/spatial* - Self-explanatory. - *Sending partition in processors part command is already a sender* Cannot specify a partition to be a sender twice. @@ -7395,12 +4638,6 @@ Please also see the page with :doc:`Warning messages `. The set command cannot be used before a read_data, read_restart, or create_box command. -*Set command floating point vector does not exist* - Self-explanatory. - -*Set command integer vector does not exist* - Self-explanatory. - *Set command with no atoms existing* No atoms are yet defined so the set command cannot be used. @@ -7474,12 +4711,6 @@ Please also see the page with :doc:`Warning messages `. The 3d grid of processors defined by the processors command does not match the number of processors LAMMPS is being run on. -*Specified target stress must be uniaxial or hydrostatic* - Self-explanatory. - -*Sqrt of negative value in variable formula* - Self-explanatory. - *Subsequent read data induced too many angles per atom* See the extra/angle/per/atom keyword for the create_box or the read_data command to set this limit larger @@ -7516,9 +4747,6 @@ Please also see the page with :doc:`Warning messages `. The total charge on all atoms on the system is not 0.0. For some KSpace solvers this is an error. -*TAD nsteps must be multiple of t_event* - Self-explanatory. - *TIP4P hydrogen has incorrect atom type* The TIP4P pairwise computation found an H atom whose type does not agree with the specified H type. @@ -7531,9 +4759,6 @@ Please also see the page with :doc:`Warning messages `. The target file for the fix tmd command did not list all atoms in the fix group. -*Tad command before simulation box is defined* - Self-explanatory. - *Tagint setting in lmptype.h is invalid* Tagint must be as large or larger than smallint. @@ -7541,107 +4766,17 @@ Please also see the page with :doc:`Warning messages `. Format of tagint stored in restart file is not consistent with LAMMPS version you are running. See the settings in src/lmptype.h -*Target pressure for fix rigid/nph cannot be < 0.0* - Self-explanatory. - -*Target pressure for fix rigid/npt/small cannot be < 0.0* - Self-explanatory. - -*Target temperature for fix nvt/npt/nph cannot be 0.0* - Self-explanatory. - -*Target temperature for fix rigid/npt cannot be 0.0* - Self-explanatory. - -*Target temperature for fix rigid/npt/small cannot be 0.0* - Self-explanatory. - -*Target temperature for fix rigid/nvt cannot be 0.0* - Self-explanatory. - -*Target temperature for fix rigid/nvt/small cannot be 0.0* - Self-explanatory. - *Temper command before simulation box is defined* The temper command cannot be used before a read_data, read_restart, or create_box command. -*Temperature ID for fix bond/swap does not exist* - Self-explanatory. - -*Temperature ID for fix box/relax does not exist* - Self-explanatory. - -*Temperature ID for fix nvt/npt does not exist* - Self-explanatory. - -*Temperature ID for fix press/berendsen does not exist* - Self-explanatory. - -*Temperature ID for fix rigid nvt/npt/nph does not exist* - Self-explanatory. - -*Temperature ID for fix temp/berendsen does not exist* - Self-explanatory. - -*Temperature ID for fix temp/csld does not exist* - Self-explanatory. - -*Temperature ID for fix temp/csvr does not exist* - Self-explanatory. - -*Temperature ID for fix temp/rescale does not exist* - Self-explanatory. - *Temperature compute degrees of freedom < 0* This should not happen if you are calculating the temperature on a valid set of atoms. -*Temperature control can not be used with fix nph* - Self-explanatory. - -*Temperature control can not be used with fix nph/asphere* - Self-explanatory. - -*Temperature control can not be used with fix nph/body* - Self-explanatory. - -*Temperature control can not be used with fix nph/sphere* - Self-explanatory. - *Temperature control must be used with fix nphug* The temp keyword must be provided. -*Temperature control must be used with fix npt* - Self-explanatory. - -*Temperature control must be used with fix npt/asphere* - Self-explanatory. - -*Temperature control must be used with fix npt/body* - Self-explanatory. - -*Temperature control must be used with fix npt/sphere* - Self-explanatory. - -*Temperature control must be used with fix nvt* - Self-explanatory. - -*Temperature control must be used with fix nvt/asphere* - Self-explanatory. - -*Temperature control must be used with fix nvt/body* - Self-explanatory. - -*Temperature control must be used with fix nvt/sllod* - Self-explanatory. - -*Temperature control must be used with fix nvt/sphere* - Self-explanatory. - -*Temperature control must not be used with fix nph/small* - Self-explanatory. - *Temperature for fix nvt/sllod does not have a bias* The specified compute must compute temperature with a bias. @@ -7659,31 +4794,10 @@ Please also see the page with :doc:`Warning messages `. *Test_descriptor_string already allocated* This is an internal error. Contact the developers. -*The package gpu command is required for gpu styles* - Self-explanatory. - *Thermo and fix not computed at compatible times* Fixes generate values on specific timesteps. The thermo output does not match these timesteps. -*Thermo compute array is accessed out-of-range* - Self-explanatory. - -*Thermo compute does not compute array* - Self-explanatory. - -*Thermo compute does not compute scalar* - Self-explanatory. - -*Thermo compute does not compute vector* - Self-explanatory. - -*Thermo compute vector is accessed out-of-range* - Self-explanatory. - -*Thermo custom variable cannot be indexed* - Self-explanatory. - *Thermo custom variable is not equal-style variable* Only equal-style variables can be output with thermodynamics, not atom-style variables. @@ -7691,21 +4805,6 @@ Please also see the page with :doc:`Warning messages `. *Thermo every variable returned a bad timestep* The variable must return a timestep greater than the current timestep. -*Thermo fix array is accessed out-of-range* - Self-explanatory. - -*Thermo fix does not compute array* - Self-explanatory. - -*Thermo fix does not compute scalar* - Self-explanatory. - -*Thermo fix does not compute vector* - Self-explanatory. - -*Thermo fix vector is accessed out-of-range* - Self-explanatory. - *Thermo keyword in variable requires thermo to use/init pe* You are using a thermo keyword in a variable that requires potential energy to be calculated, but your thermo output @@ -7732,9 +4831,6 @@ Please also see the page with :doc:`Warning messages `. *Thermo_modify every variable returned a bad timestep* The returned timestep is less than or equal to the current timestep. -*Thermo_modify int format does not contain d character* - Self-explanatory. - *Thermo_modify pressure ID does not compute pressure* The specified compute ID does not compute pressure. @@ -7769,15 +4865,6 @@ Please also see the page with :doc:`Warning messages `. Table size specified via pair_modify command does not work with your machine's floating point representation. -*Too few lines in %s section of data file* - Self-explanatory. - -*Too few values in body lines in data file* - Self-explanatory. - -*Too few values in body section of molecule file* - Self-explanatory. - *Too many -pk arguments in command-line* The string formed by concatenating the arguments is too long. Use a package command in the input script instead. @@ -7865,12 +4952,6 @@ Please also see the page with :doc:`Warning messages `. Table size specified via pair_modify command is too large. Note that a value of N generates a 2\^N size table. -*Too many values in body lines in data file* - Self-explanatory. - -*Too many values in body section of molecule file* - Self-explanatory. - *Too much buffered per-proc info for dump* The size of the buffered string must fit in a 32-bit integer for a dump. @@ -7887,9 +4968,6 @@ Please also see the page with :doc:`Warning messages `. Fix poems cannot (yet) work with coupled bodies whose joints connect the bodies in a tree structure. -*Tried to convert a double to int, but input_double > INT_MAX* - Self-explanatory. - *Trying to build an occasional neighbor list before initialization completed* This is not allowed. Source code caller needs to be modified. @@ -7898,9 +4976,6 @@ Please also see the page with :doc:`Warning messages `. chunk assignments persist for some number of timesteps, but are doing it in different ways. -*Two groups cannot be the same in fix spring couple* - Self-explanatory. - *The %s type label %s is already in use for type %s* For a given type-kind (atom types, bond types, etc.), a given type label can be assigned to only one numeric type. @@ -7915,9 +4990,6 @@ Please also see the page with :doc:`Warning messages `. No matching end double quote was found following a leading double quote. -*Unexpected end of -reorder file* - Self-explanatory. - *Unexpected empty line in Angle Coeffs section* Read a blank line where there should be coefficient data. @@ -7933,9 +5005,6 @@ Please also see the page with :doc:`Warning messages `. *Unexpected empty line in Pair Coeffs section* Read a blank line where there should be coefficient data. -*Unexpected end of custom file* - Self-explanatory. - *Unexpected end of data file* LAMMPS hit the end of the data file while attempting to read a section. Something is wrong with the format of the data file. @@ -7949,9 +5018,6 @@ Please also see the page with :doc:`Warning messages `. *Unexpected end of fix rigid/small file* A read operation from the file failed. -*Unexpected end of molecule file* - Self-explanatory. - *Unexpected end of neb file* A read operation from the file failed. @@ -7975,15 +5041,6 @@ Please also see the page with :doc:`Warning messages `. *Unrecognized bond style* The choice of bond style is unknown. -*Unknown category for info is_active()* - Self-explanatory. - -*Unknown category for info is_available()* - Self-explanatory. - -*Unknown category for info is_defined()* - Self-explanatory. - *Unrecognized command: %s* The command is not known to LAMMPS. Check the input script. @@ -7999,9 +5056,6 @@ Please also see the page with :doc:`Warning messages `. *Unrecognized dump style* The choice of dump style is unknown. -*Unknown error in GPU library* - Self-explanatory. - *Unrecognized fix style* The choice of fix style is unknown. @@ -8017,15 +5071,6 @@ Please also see the page with :doc:`Warning messages `. *Unrecognized kspace style* The choice of kspace style is unknown. -*Unknown name for info newton category* - Self-explanatory. - -*Unknown name for info package category* - Self-explanatory. - -*Unknown name for info pair category* - Self-explanatory. - *Unrecognized pair style* The choice of pair style is unknown. @@ -8035,21 +5080,9 @@ Please also see the page with :doc:`Warning messages `. *Unrecognized region style* The choice of region style is unknown. -*Unknown section in molecule file* - Self-explanatory. - -*Unknown table style in angle style table* - Self-explanatory. - -*Unknown table style in bond style table* - Self-explanatory. - *Unknown table style in pair_style command* Style of table is invalid for use with pair_style table command. -*Unknown unit_style* - Self-explanatory. Check the input script or data file. - *Unrecognized lattice type in MEAM library file* The lattice type in an entry of the MEAM library file is not valid. @@ -8058,9 +5091,6 @@ Please also see the page with :doc:`Warning messages `. The lattice type in an entry of the MEAM parameter file is not valid. -*Unrecognized pair style in compute pair command* - Self-explanatory. - *Unsupported mixing rule in kspace_style ewald/disp* Only geometric mixing is supported. @@ -8070,9 +5100,6 @@ Please also see the page with :doc:`Warning messages `. *Unsupported order in kspace_style pppm/disp, pair_style %s* Only pair styles with 1/r and 1/r\^6 dependence are currently supported. -*Unsupported parameter in MEAM library file* - Self-explanatory. - *Use cutoff keyword to set cutoff in single mode* Mode is single so cutoff/multi keyword cannot be used. @@ -8083,9 +5110,6 @@ Please also see the page with :doc:`Warning messages `. Fix nvt/sllod requires that deforming atoms have a velocity profile provided by "remap v" as a fix deform option. -*Using fix nvt/sllod with no fix deform defined* - Self-explanatory. - *Using fix srd with inconsistent fix deform remap option* When shearing the box in an SRD simulation, the remap v option for fix deform needs to be used. @@ -8096,27 +5120,6 @@ Please also see the page with :doc:`Warning messages `. *Using pair lubricate/poly with inconsistent fix deform remap option* If fix deform is used, the remap v option is required. -*Using suffix gpu without GPU package installed* - Self-explanatory. - -*Using suffix intel without INTEL package installed* - Self-explanatory. - -*Using suffix kk without KOKKOS package enabled* - Self-explanatory. - -*Using suffix omp without OPENMP package installed* - Self-explanatory. - -*Using update dipole flag requires atom attribute mu* - Self-explanatory. - -*Using update dipole flag requires atom style sphere* - Self-explanatory. - -*Variable ID in variable formula does not exist* - Self-explanatory. - *Variable atom ID is too large* Specified ID is larger than the maximum allowed atom ID. @@ -8130,9 +5133,6 @@ Please also see the page with :doc:`Warning messages `. *Variable evaluation in region gave bad value* Variable returned a radius < 0.0. -*Variable for compute ti is invalid style* - Self-explanatory. - *Variable for create_atoms is invalid style* The variables must be equal-style variables. @@ -8157,9 +5157,6 @@ Please also see the page with :doc:`Warning messages `. *Variable for fix adapt is invalid style* Only equal-style variables can be used. -*Variable for fix addforce is invalid style* - Self-explanatory. - *Variable for fix aveforce is invalid style* Only equal-style variables can be used. @@ -8223,9 +5220,6 @@ Please also see the page with :doc:`Warning messages `. *Variable for region is invalid style* Only equal-style variables can be used. -*Variable for region is not equal style* - Self-explanatory. - *Variable for region sphere is invalid style* Only equal-style variables are allowed. @@ -8241,173 +5235,11 @@ Please also see the page with :doc:`Warning messages `. *Variable for velocity set is invalid style* Only atom-style variables can be used. -*Variable for voronoi radius is not atom style* - Self-explanatory. - -*Variable formula compute array is accessed out-of-range* - Self-explanatory. - -*Variable formula compute vector is accessed out-of-range* - Self-explanatory. - -*Variable formula fix array is accessed out-of-range* - Self-explanatory. - -*Variable formula fix vector is accessed out-of-range* - Self-explanatory. - *Variable has circular dependency* A circular dependency is when variable "a" in used by variable "b" and variable "b" is also used by variable "a". Circular dependencies with longer chains of dependence are also not allowed. -*Variable name between brackets must be alphanumeric or underscore characters* - Self-explanatory. - -*Variable name for compute chunk/atom does not exist* - Self-explanatory. - -*Variable name for compute reduce does not exist* - Self-explanatory. - -*Variable name for compute ti does not exist* - Self-explanatory. - -*Variable name for create_atoms does not exist* - Self-explanatory. - -*Variable name for displace_atoms does not exist* - Self-explanatory. - -*Variable name for dump every does not exist* - Self-explanatory. - -*Variable name for dump image center does not exist* - Self-explanatory. - -*Variable name for dump image phi does not exist* - Self-explanatory. - -*Variable name for dump image theta does not exist* - Self-explanatory. - -*Variable name for dump image zoom does not exist* - Self-explanatory. - -*Variable name for fix adapt does not exist* - Self-explanatory. - -*Variable name for fix addforce does not exist* - Self-explanatory. - -*Variable name for fix ave/atom does not exist* - Self-explanatory. - -*Variable name for fix ave/chunk does not exist* - Self-explanatory. - -*Variable name for fix ave/correlate does not exist* - Self-explanatory. - -*Variable name for fix ave/histo does not exist* - Self-explanatory. - -*Variable name for fix ave/spatial does not exist* - Self-explanatory. - -*Variable name for fix ave/time does not exist* - Self-explanatory. - -*Variable name for fix aveforce does not exist* - Self-explanatory. - -*Variable name for fix deform does not exist* - Self-explanatory. - -*Variable name for fix efield does not exist* - Self-explanatory. - -*Variable name for fix gravity does not exist* - Self-explanatory. - -*Variable name for fix heat does not exist* - Self-explanatory. - -*Variable name for fix indent does not exist* - Self-explanatory. - -*Variable name for fix langevin does not exist* - Self-explanatory. - -*Variable name for fix move does not exist* - Self-explanatory. - -*Variable name for fix setforce does not exist* - Self-explanatory. - -*Variable name for fix store/state does not exist* - Self-explanatory. - -*Variable name for fix temp/berendsen does not exist* - Self-explanatory. - -*Variable name for fix temp/csld does not exist* - Self-explanatory. - -*Variable name for fix temp/csvr does not exist* - Self-explanatory. - -*Variable name for fix temp/rescale does not exist* - Self-explanatory. - -*Variable name for fix vector does not exist* - Self-explanatory. - -*Variable name for fix wall does not exist* - Self-explanatory. - -*Variable name for fix wall/reflect does not exist* - Self-explanatory. - -*Variable name for fix wall/srd does not exist* - Self-explanatory. - -*Variable name for group does not exist* - Self-explanatory. - -*Variable name for group dynamic does not exist* - Self-explanatory. - -*Variable name for region cylinder does not exist* - Self-explanatory. - -*Variable name for region does not exist* - Self-explanatory. - -*Variable name for region sphere does not exist* - Self-explanatory. - -*Variable name for restart does not exist* - Self-explanatory. - -*Variable name for set command does not exist* - Self-explanatory. - -*Variable name for thermo every does not exist* - Self-explanatory. - -*Variable name for velocity set does not exist* - Self-explanatory. - -*Variable name for voronoi radius does not exist* - Self-explanatory. - -*Variable name must be alphanumeric or underscore characters* - Self-explanatory. - -*Variable uses atom property that is not allocated* - Self-explanatory. - *Velocity command before simulation box is defined* The velocity command cannot be used before a read_data, read_restart, or create_box command. @@ -8415,12 +5247,6 @@ Please also see the page with :doc:`Warning messages `. *Velocity command with no atoms existing* A velocity command has been used, but no atoms yet exist. -*Velocity ramp in z for a 2d problem* - Self-explanatory. - -*Velocity rigid used with non-rigid fix-ID* - Self-explanatory. - *Velocity temperature ID does calculate a velocity bias* The specified compute must compute a bias for temperature. @@ -8452,15 +5278,6 @@ Please also see the page with :doc:`Warning messages `. *Voro++ error: narea and neigh have a different size* This error is returned by the Voro++ library. -*Wall defined twice in fix wall command* - Self-explanatory. - -*Wall defined twice in fix wall/reflect command* - Self-explanatory. - -*Wall defined twice in fix wall/srd command* - Self-explanatory. - *Water H epsilon must be 0.0 for pair style lj/cut/tip4p/cut* This is because LAMMPS does not compute the Lennard-Jones interactions with these particles for efficiency reasons. @@ -8477,18 +5294,6 @@ Please also see the page with :doc:`Warning messages `. A world-style variable must specify a number of values equal to the number of processor partitions. -*Write_data command before simulation box is defined* - Self-explanatory. - *Write_restart command before simulation box is defined* The write_restart command cannot be used before a read_data, read_restart, or create_box command. - -*Zero length rotation vector with displace_atoms* - Self-explanatory. - -*Zero length rotation vector with fix move* - Self-explanatory. - -*Zero-length lattice orient vector* - Self-explanatory. diff --git a/doc/src/Errors_warnings.rst b/doc/src/Errors_warnings.rst index 3e4aab74d1..f152e66f4a 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -32,16 +32,10 @@ Please also see the page with :doc:`Error messages ` cutoff is set too short or the angle has blown apart and an atom is too far away. -*Angle style in data file differs from currently defined angle style* - Self-explanatory. - *Angles are defined but no angle style is set* The topology contains angles, but there are no angle forces computed since there was no angle_style command. -*Atom style in data file differs from currently defined atom style* - Self-explanatory. - *Bond atom missing in box size check* The second atom needed to compute a particular bond is missing on this processor. Typically this is because the pairwise cutoff is set too @@ -57,9 +51,6 @@ Please also see the page with :doc:`Error messages ` processor. Typically this is because the pairwise cutoff is set too short or the bond has blown apart and an atom is too far away. -*Bond style in data file differs from currently defined bond style* - Self-explanatory. - *Bonds are defined but no bond style is set* The topology contains bonds, but there are no bond forces computed since there was no bond_style command. @@ -72,9 +63,6 @@ Please also see the page with :doc:`Error messages ` length, multiplying by the number of bonds in the interaction (e.g. 3 for a dihedral) and adding a small amount of stretch. -*Both groups in compute group/group have a net charge; the Kspace boundary correction to energy will be non-zero* - Self-explanatory. - *Calling write_dump before a full system init.* The write_dump command is used before the system has been fully initialized as part of a 'run' or 'minimize' command. Not all dump @@ -90,18 +78,6 @@ Please also see the page with :doc:`Error messages ` This means the temperature associated with the rigid bodies may be incorrect on this timestep. -*Cannot include log terms without 1/r terms; setting flagHI to 1* - Self-explanatory. - -*Cannot include log terms without 1/r terms; setting flagHI to 1.* - Self-explanatory. - -*Charges are set, but coulombic solver is not used* - Self-explanatory. - -*Charges did not converge at step %ld: %lg* - Self-explanatory. - *Communication cutoff is 0.0. No ghost atoms will be generated. Atoms may get lost* The communication cutoff defaults to the maximum of what is inferred from pair and bond styles (will be zero, if none are defined) and what is specified @@ -127,9 +103,6 @@ Please also see the page with :doc:`Error messages ` is not changed automatically and the warning may be ignored depending on the specific system being simulated. -*Communication cutoff is too small for SNAP micro load balancing, increased to %lf* - Self-explanatory. - *Compute cna/atom cutoff may be too large to find ghost atom neighbors* The neighbor cutoff used may not encompass enough ghost atoms to perform this operation correctly. @@ -162,9 +135,6 @@ Please also see the page with :doc:`Error messages ` Conformation of the 4 listed dihedral atoms is extreme; you may want to check your simulation geometry. -*Dihedral style in data file differs from currently defined dihedral style* - Self-explanatory. - *Dihedrals are defined but no dihedral style is set* The topology contains dihedrals, but there are no dihedral forces computed since there was no dihedral_style command. @@ -181,9 +151,6 @@ Please also see the page with :doc:`Error messages ` *Estimated error in splitting of dispersion coeffs is %g* Error is greater than 0.0001 percent. -*Ewald/disp Newton solver failed, using old method to estimate g_ewald* - Self-explanatory. Choosing a different cutoff value may help. - *FENE bond too long* A FENE bond has stretched dangerously far. It's interaction strength will be truncated to attempt to prevent the bond from blowing up. @@ -196,9 +163,6 @@ Please also see the page with :doc:`Error messages ` A FENE bond has stretched dangerously far. It's interaction strength will be truncated to attempt to prevent the bond from blowing up. -*Fix halt condition for fix-id %s met on step %ld with value %g* - Self explanatory. - *Fix SRD walls overlap but fix srd overlap not set* You likely want to set this in your input script. @@ -242,21 +206,12 @@ Please also see the page with :doc:`Error messages ` *Fix property/atom mol or charge w/out ghost communication* A model typically needs these properties defined for ghost atoms. -*Fix qeq CG convergence failed (%g) after %d iterations at %ld step* - Self-explanatory. - *Fix qeq has non-zero lower Taper radius cutoff* Absolute value must be <= 0.01. *Fix qeq has very low Taper radius cutoff* Value should typically be >= 5.0. -*Fix qeq/dynamic tolerance may be too small for damped dynamics* - Self-explanatory. - -*Fix qeq/fire tolerance may be too small for damped fires* - Self-explanatory. - *Fix rattle should come after all other integration fixes* This fix is designed to work after all other integration fixes change atom positions. Thus it should be the last integration fix specified. @@ -289,9 +244,6 @@ Please also see the page with :doc:`Error messages ` The user-specified force accuracy cannot be achieved unless the table feature is disabled by using 'pair_modify table 0'. -*Geometric mixing assumed for 1/r\^6 coefficients* - Self-explanatory. - *Group for fix_modify temp != fix group* The fix_modify command is specifying a temperature computation that computes a temperature on a different group of atoms than the fix @@ -314,9 +266,6 @@ Please also see the page with :doc:`Error messages ` Conformation of the 4 listed improper atoms is extreme; you may want to check your simulation geometry. -*Improper style in data file differs from currently defined improper style* - Self-explanatory. - *Impropers are defined but no improper style is set* The topology contains impropers, but there are no improper forces computed since there was no improper_style command. @@ -342,18 +291,6 @@ Please also see the page with :doc:`Error messages ` The pair style has increased the communication cutoff to be consistent with the communication cutoff requirements for this pair style when run on the GPU. -*KIM Model does not provide 'energy'; Potential energy will be zero* - Self-explanatory. - -*KIM Model does not provide 'forces'; Forces will be zero* - Self-explanatory. - -*KIM Model does not provide 'particleEnergy'; energy per atom will be zero* - Self-explanatory. - -*KIM Model does not provide 'particleVirial'; virial per atom will be zero* - Self-explanatory. - *Kspace_modify slab param < 2.0 may cause unphysical behavior* The kspace_modify slab parameter should be larger to ensure periodic grids padded with empty space do not overlap. @@ -405,16 +342,10 @@ Please also see the page with :doc:`Error messages ` box, or moved further than one processor's subdomain away before reneighboring. -*MSM mesh too small, increasing to 2 points in each direction* - Self-explanatory. - *Mismatch between velocity and compute groups* The temperature computation used by the velocity command will not be on the same group of atoms that velocities are being set for. -*Mixing forced for lj coefficients* - Self-explanatory. - *Molecule attributes do not match system attributes* An attribute is specified (e.g. diameter, charge) that is not defined for the specified atom style. @@ -453,9 +384,6 @@ Please also see the page with :doc:`Error messages ` *More than one compute damage/atom* It is not efficient to use compute ke/atom more than once. -*More than one compute dilatation/atom* - Self-explanatory. - *More than one compute erotate/sphere/atom* It is not efficient to use compute erorate/sphere/atom more than once. @@ -468,24 +396,6 @@ Please also see the page with :doc:`Error messages ` *More than one compute orientorder/atom* It is not efficient to use compute orientorder/atom more than once. -*More than one compute plasticity/atom* - Self-explanatory. - -*More than one compute sna/atom* - Self-explanatory. - -*More than one compute sna/grid* - Self-explanatory. - -*More than one compute sna/grid/local* - Self-explanatory. - -*More than one compute snad/atom* - Self-explanatory. - -*More than one compute snav/atom* - Self-explanatory. - *More than one fix poems* It is not efficient to use fix poems more than once. @@ -561,21 +471,12 @@ Please also see the page with :doc:`Error messages ` *Pair COMB charge %.10f with force %.10f hit min barrier* Something is possibly wrong with your model. -*Pair brownian needs newton pair on for momentum conservation* - Self-explanatory. - -*Pair dpd needs newton pair on for momentum conservation* - Self-explanatory. - *Pair dsmc: num_of_collisions > number_of_A* Collision model in DSMC is breaking down. *Pair dsmc: num_of_collisions > number_of_B* Collision model in DSMC is breaking down. -*Pair style in data file differs from currently defined pair style* - Self-explanatory. - *Pair style restartinfo set but has no restart support* This pair style has a bug, where it does not support reading and writing information to a restart file, but does not set the member @@ -685,9 +586,6 @@ Please also see the page with :doc:`Error messages ` cluster specified by the fix shake command is numerically suspect. LAMMPS will set it to 0.0 and continue. -*Shell command '%s' failed with error '%s'* - Self-explanatory. - *Shell command returned with non-zero status* This may indicate the shell command did not operate as expected. @@ -698,15 +596,9 @@ Please also see the page with :doc:`Error messages ` This will lead to invalid constraint forces in the SHAKE/RATTLE computation. -*Simulations might be very slow because of large number of structure factors* - Self-explanatory. - *Slab correction not needed for MSM* Slab correction is intended to be used with Ewald or PPPM and is not needed by MSM. -*Specifying an 'subset' value of '0' is equivalent to no 'subset' keyword* - Self-explanatory. - *System is not charge neutral, net charge = %g* The total charge on all atoms on the system is not 0.0. For some KSpace solvers this is only a warning. @@ -738,10 +630,7 @@ Please also see the page with :doc:`Error messages ` assumed to also be for all atoms. Thus the pressure printed by thermo could be inaccurate. -*The fix ave/spatial command has been replaced by the more flexible fix ave/chunk and compute chunk/atom commands -- fix ave/spatial will be removed in the summer of 2015* - Self-explanatory. - -*The minimizer does not re-orient dipoles when using fix efield* +*The fix ave/spatial command has been replaced by the more flexible fix ave/chunk and compute chunk/atom commands -- fix ave/spatial will be removed*The minimizer does not re-orient dipoles when using fix efield* This means that only the atom coordinates will be minimized, not the orientation of the dipoles. @@ -749,9 +638,6 @@ Please also see the page with :doc:`Error messages ` More than the maximum # of neighbors was found multiple times. This was unexpected. -*Too many inner timesteps in fix ttm* - Self-explanatory. - *Too many neighbors in CNA for %d atoms* More than the maximum # of neighbors was found multiple times. This was unexpected. @@ -779,24 +665,6 @@ Please also see the page with :doc:`Error messages ` The deformation will heat the SRD particles so this can be dangerous. -*Using kspace solver on system with no charge* - Self-explanatory. - -*Using largest cut-off for lj/long/dipole/long long long* - Self-explanatory. - -*Using largest cutoff for buck/long/coul/long* - Self-explanatory. - -*Using largest cutoff for lj/long/coul/long* - Self-explanatory. - -*Using largest cutoff for pair_style lj/long/tip4p/long* - Self-explanatory. - -*Using package gpu without any pair style defined* - Self-explanatory. - *Using pair potential shift with pair_modify compute no* The shift effects will thus not be computed. From 2c3824bdd0786a515a218b5fe07159bf4117d052 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 02:11:50 -0400 Subject: [PATCH 15/99] update remaining places that used to support -DLAMMPS_SMALLSMALL --- lib/gpu/README | 8 ++++---- tools/binary2txt.cpp | 8 ++------ unittest/c-library/test_library_external.cpp | 5 +---- unittest/c-library/test_library_properties.cpp | 16 ---------------- unittest/fortran/wrap_extract_global.cpp | 18 ------------------ unittest/fortran/wrap_get_thermo.cpp | 4 ---- unittest/fortran/wrap_properties.cpp | 4 ---- unittest/utils/test_lmptype.cpp | 10 ---------- 8 files changed, 7 insertions(+), 66 deletions(-) diff --git a/lib/gpu/README b/lib/gpu/README index b720aa65cb..7cc1aea8fb 100644 --- a/lib/gpu/README +++ b/lib/gpu/README @@ -136,10 +136,10 @@ IMPORTANT: If you re-build the library, e.g. for a different precision Makefile.linux clean, to ensure all previous derived files are removed before the new build is done. -NOTE: The system-specific setting LAMMPS_SMALLBIG (default), LAMMPS_BIGBIG, - or LAMMPS_SMALLSMALL if specified when building LAMMPS (i.e. in - src/MAKE/Makefile.foo) should be consistent with that specified - when building libgpu.a (i.e. by LMP_INC in the lib/gpu/Makefile.bar). +NOTE: The system-specific setting LAMMPS_SMALLBIG (default) or LAMMPS_BIGBIG + - if specified when building LAMMPS (i.e. in src/MAKE/Makefile.foo) - + should be consistent with that specified when building libgpu.a (i.e. + by LMP_INC in the lib/gpu/Makefile.bar). ------------------------------------------------------------------------------ diff --git a/tools/binary2txt.cpp b/tools/binary2txt.cpp index 2369057324..2f7eb1e222 100644 --- a/tools/binary2txt.cpp +++ b/tools/binary2txt.cpp @@ -23,7 +23,7 @@ #include // these must match settings in src/lmptype.h which builds LAMMPS with -// -DLAMMPS_SMALLBIG (the default), -DLAMMPS_BIGBIG, or -DLAMMPS_SMALLSMALL +// -DLAMMPS_SMALLBIG (the default) or -DLAMMPS_BIGBIG // you can edit the tools/Makefile to enforce the same setting // for the build of binary2txt, e.g. // g++ -g -DLAMMPS_BIGBIG binarytxt.o -o binary2txt @@ -36,7 +36,7 @@ #define PRId64 "ld" #endif -#if !defined(LAMMPS_SMALLSMALL) && !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) +#if !defined(LAMMPS_BIGBIG) && !defined(LAMMPS_SMALLBIG) #define LAMMPS_SMALLBIG #endif @@ -44,10 +44,6 @@ typedef int tagint; typedef int64_t bigint; #define BIGINT_FORMAT "%" PRId64 -#elif defined(LAMMPS_SMALLSMALL) -typedef int tagint; -typedef int bigint; -#define BIGINT_FORMAT "%d" #else /* LAMMPS_BIGBIG */ typedef int64_t tagint; typedef int64_t bigint; diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 63ef4eee32..7783893931 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -14,10 +14,7 @@ using ::testing::HasSubstr; using ::testing::StartsWith; extern "C" { -#ifdef LAMMPS_SMALLSMALL -typedef int32_t step_t; -typedef int32_t tag_t; -#elif LAMMPS_SMALLBIG +#if LAMMPS_SMALLBIG using step_t = int64_t; using tag_t = int32_t; #else diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 1feccf5cb0..3878b13774 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -127,15 +127,9 @@ TEST_F(LibraryProperties, thermo) const char *key = (const char *)lammps_last_thermo(lmp, "keyword", 0); EXPECT_THAT(key, StrEq("Step")); ival = *(int *)lammps_last_thermo(lmp, "type", 0); -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(ival, LAMMPS_INT); - ival = *(int *)lammps_last_thermo(lmp, "data", 0); - EXPECT_EQ(ival, 2); -#else EXPECT_EQ(ival, LAMMPS_INT64); bval = *(bigint *)lammps_last_thermo(lmp, "data", 0); EXPECT_EQ(bval, 2); -#endif key = (const char *)lammps_last_thermo(lmp, "keyword", 1); EXPECT_THAT(key, StrEq("Temp")); @@ -253,11 +247,7 @@ TEST_F(LibraryProperties, box) TEST_F(LibraryProperties, setting) { -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(lammps_extract_setting(lmp, "bigint"), 4); -#else EXPECT_EQ(lammps_extract_setting(lmp, "bigint"), 8); -#endif #if defined(LAMMPS_BIGBIG) EXPECT_EQ(lammps_extract_setting(lmp, "tagint"), 8); EXPECT_EQ(lammps_extract_setting(lmp, "imageint"), 8); @@ -375,15 +365,9 @@ TEST_F(LibraryProperties, global) char *c_ptr = (char *)lammps_extract_global(lmp, "units"); EXPECT_THAT(c_ptr, StrEq("real")); -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_INT); - int *i_ptr = (int *)lammps_extract_global(lmp, "ntimestep"); - EXPECT_EQ((*i_ptr), 2); -#else EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_INT64); auto *b_ptr = (int64_t *)lammps_extract_global(lmp, "ntimestep"); EXPECT_EQ((*b_ptr), 2); -#endif EXPECT_EQ(lammps_extract_global_datatype(lmp, "dt"), LAMMPS_DOUBLE); auto *d_ptr = (double *)lammps_extract_global(lmp, "dt"); diff --git a/unittest/fortran/wrap_extract_global.cpp b/unittest/fortran/wrap_extract_global.cpp index bf442279a1..eb47b00228 100644 --- a/unittest/fortran/wrap_extract_global.cpp +++ b/unittest/fortran/wrap_extract_global.cpp @@ -85,11 +85,7 @@ TEST_F(LAMMPS_extract_global, units) TEST_F(LAMMPS_extract_global, ntimestep) { f_lammps_setup_extract_global(); -#ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_ntimestep(), 0); -#else EXPECT_EQ(f_lammps_extract_global_ntimestep_big(), 0l); -#endif }; TEST_F(LAMMPS_extract_global, dt) @@ -134,17 +130,10 @@ TEST_F(LAMMPS_extract_global, boxprops) TEST_F(LAMMPS_extract_global, atomprops) { f_lammps_setup_extract_global(); -#ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_natoms(), 2); - EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); - EXPECT_EQ(f_lammps_extract_global_nangles(), 0); - EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); -#else EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); -#endif EXPECT_EQ(f_lammps_extract_global_ntypes(), 1); EXPECT_EQ(f_lammps_extract_global_nlocal(), 2); @@ -163,15 +152,8 @@ TEST_F(LAMMPS_extract_global, fullprops) if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); // This is not currently the world's most convincing test.... f_lammps_setup_full_extract_global(); -#ifdef LAMMPS_SMALLSMALL - EXPECT_EQ(f_lammps_extract_global_natoms(), 2); - EXPECT_EQ(f_lammps_extract_global_nbonds(), 0); - EXPECT_EQ(f_lammps_extract_global_nangles(), 0); - EXPECT_EQ(f_lammps_extract_global_ndihedrals(), 0); -#else EXPECT_EQ(f_lammps_extract_global_natoms_big(), 2l); EXPECT_EQ(f_lammps_extract_global_nbonds_big(), 0l); EXPECT_EQ(f_lammps_extract_global_nangles_big(), 0l); EXPECT_EQ(f_lammps_extract_global_ndihedrals_big(), 0l); -#endif } diff --git a/unittest/fortran/wrap_get_thermo.cpp b/unittest/fortran/wrap_get_thermo.cpp index 3a2b810858..7ad4319719 100644 --- a/unittest/fortran/wrap_get_thermo.cpp +++ b/unittest/fortran/wrap_get_thermo.cpp @@ -98,11 +98,7 @@ TEST_F(LAMMPS_thermo, last_thermo) thermostr = (char *)f_lammps_last_thermo_string(6); EXPECT_STREQ(thermostr, "Press"); free(thermostr); -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(f_lammps_last_thermo_type(1), multitype::LAMMPS_INT); -#else EXPECT_EQ(f_lammps_last_thermo_type(1), multitype::LAMMPS_INT64); -#endif EXPECT_EQ(f_lammps_last_thermo_int(1), 15); EXPECT_EQ(f_lammps_last_thermo_type(2), multitype::LAMMPS_DOUBLE); EXPECT_EQ(f_lammps_last_thermo_type(3), multitype::LAMMPS_DOUBLE); diff --git a/unittest/fortran/wrap_properties.cpp b/unittest/fortran/wrap_properties.cpp index 49ec134742..7478337fb1 100644 --- a/unittest/fortran/wrap_properties.cpp +++ b/unittest/fortran/wrap_properties.cpp @@ -77,11 +77,7 @@ TEST_F(LAMMPS_properties, get_mpi_comm) TEST_F(LAMMPS_properties, extract_setting) { -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(f_lammps_extract_setting("bigint"), 4); -#else EXPECT_EQ(f_lammps_extract_setting("bigint"), 8); -#endif #if defined(LAMMPS_BIGBIG) EXPECT_EQ(f_lammps_extract_setting("tagint"), 8); EXPECT_EQ(f_lammps_extract_setting("imageint"), 8); diff --git a/unittest/utils/test_lmptype.cpp b/unittest/utils/test_lmptype.cpp index a14f3a2cab..96b1c89c31 100644 --- a/unittest/utils/test_lmptype.cpp +++ b/unittest/utils/test_lmptype.cpp @@ -25,11 +25,7 @@ TEST(Types, ubuf) double buf[3]; double d1 = 0.1; int i1 = -10; -#if defined(LAMMPS_SMALLSMALL) - bigint b1 = 2048; -#else bigint b1 = (1L << 58) + (1L << 50); -#endif buf[0] = d1; buf[1] = ubuf(i1).d; buf[2] = ubuf(b1).d; @@ -58,11 +54,7 @@ TEST(Types, multitype) EXPECT_EQ(m[1].type, multitype::LAMMPS_INT); EXPECT_EQ(m[2].type, multitype::LAMMPS_DOUBLE); -#if defined(LAMMPS_SMALLSMALL) - EXPECT_EQ(m[3].type, multitype::LAMMPS_INT); -#else EXPECT_EQ(m[3].type, multitype::LAMMPS_INT64); -#endif EXPECT_EQ(m[4].type, multitype::LAMMPS_INT); EXPECT_EQ(m[5].type, multitype::LAMMPS_DOUBLE); EXPECT_EQ(m[6].type, multitype::LAMMPS_NONE); @@ -71,9 +63,7 @@ TEST(Types, multitype) EXPECT_EQ(m[1].data.i, i1); EXPECT_EQ(m[2].data.d, d1); -#if !defined(LAMMPS_SMALLSMALL) EXPECT_EQ(m[3].data.b, -((1L << 40) + (1L << 50))); -#endif EXPECT_EQ(m[4].data.i, -1023); EXPECT_EQ(m[5].data.d, -2.225); } From 589c0264654d501094e35d486cc6e20707d55231 Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Sat, 15 Mar 2025 14:09:38 -0600 Subject: [PATCH 16/99] Tweaked the description of numbering order --- doc/src/compute_chunk_atom.rst | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/doc/src/compute_chunk_atom.rst b/doc/src/compute_chunk_atom.rst index 9bca1e26d1..24c2e2e47c 100644 --- a/doc/src/compute_chunk_atom.rst +++ b/doc/src/compute_chunk_atom.rst @@ -217,13 +217,16 @@ scaled differently in the two different dimensions to transform them into ellipses). The created bins (and hence the chunk IDs) are numbered consecutively -from 1 to the number of bins = *Nchunk*\ . For *bin2d* and *bin3d*, the -numbering varies most rapidly in the first dimension (which could be -*x*, *y*, or *z*), next rapidly in the second dimension, and most slowly in the -third dimension. For *bin/sphere*, the bin with smallest radii is chunk -1 and the bin with largest radii is chunk Nchunk = *ncbin*\ . For -*bin/cylinder*, the numbering varies most rapidly in the dimension -along the cylinder axis and most slowly in the radial direction. +from 1 to the number of bins = *Nchunk*\ . For *bin2d* and *bin3d*, the +numbering varies fastest in the last dimension (which could be +*x*, *y*, or *z*), slower in the second dimension, and slowest in the +first dimension. For *bin/sphere*, the bin with smallest radius is chunk +1 and the bin with largest radius is chunk Nchunk = *ncbin*\ . For +*bin/cylinder*, the numbering varies faster in the dimension +along the cylinder axis and slower in the radial direction. +In all cases, for a given dimension, the numbering increases +with increasing value of the coordinate (Cartesian coordinate, +sphere or cylinder radius, axial position). Each time this compute is invoked, each atom is mapped to a bin based on its current position. Note that between reneighboring timesteps, From 96f135c29457012d82789340c4f9e4ab1e6be20b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 16:38:12 -0400 Subject: [PATCH 17/99] some more small tweaks of explanation and spelling fixes --- doc/src/Build_manual.rst | 8 +++++--- doc/utils/sphinx-config/false_positives.txt | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index 0e8b34dcc7..4993aa53a0 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -221,8 +221,9 @@ HTML as a quick-n-dirty way of checking your manual page. This translation uses `Pandoc `_ instead of Sphinx and thus all special Sphinx features (cross-references, advanced tables, -embedding of Python docstring and doxygen documentation, and so on) will -not render correctly. But this is a **very fast** way to check the content +embedding of Python docstrings or doxygen documentation, and so on) will +not render correctly. Most embedded math should render correctly. This +is a **very fast** way to check the syntaxs and layout of documentation as HTML while writing the documentation. To translate **all** manual pages, you can type ``make fasthtml`` at the @@ -235,7 +236,8 @@ directly translate only individual pages: e.g. to translate only the After writing the documentation is completed, you will still need to verify with ``make html`` and ``make pdf`` that it translates -correctly. +correctly in the actual translations used for download and online +documentation. Tests for consistency, completeness, and other known issues ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 084f7c0ec1..fee9b97c8e 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -856,6 +856,7 @@ DNi Dobnikar Dobson docenv +docstrings Dodds dodgerblue dof @@ -3261,6 +3262,7 @@ resquared REsquared restartfile restartinfo +reStructuredText Restrepo rethrowing Revenga From 7b915b2983418ba152e424bfd06d8f328ea3f106 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 20:10:37 -0400 Subject: [PATCH 18/99] error message does not exist anymore --- doc/src/Errors_messages.rst | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index 14836cebb6..a63d72b027 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -22,16 +22,6 @@ Please also see the page with :doc:`Warning messages `. ---------- -*1-3 bond count is inconsistent* - An inconsistency was detected when computing the number of 1-3 - neighbors for each atom. This likely means something is wrong with - the bond topologies you have defined. - -*1-4 bond count is inconsistent* - An inconsistency was detected when computing the number of 1-4 - neighbors for each atom. This likely means something is wrong with - the bond topologies you have defined. - *Accelerator sharing is not currently supported on system* Multiple MPI processes cannot share the accelerator on your system. For NVIDIA GPUs, see the nvidia-smi command to change this From b34b6b80e40c4ae7a86d2e4e3a0e79fe945e7163 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 20:11:33 -0400 Subject: [PATCH 19/99] refactor info code so coeffs status can be appended to error --- src/info.cpp | 139 ++++++++++++++++++++++++++++++--------------------- src/info.h | 6 +++ 2 files changed, 88 insertions(+), 57 deletions(-) diff --git a/src/info.cpp b/src/info.cpp index 17b1f417ea..06c0337b7a 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -488,63 +488,11 @@ void Info::command(int narg, char **arg) Pair *pair=force->pair; fputs("\nCoeff status information:\n",out); - if (pair) { - fputs("\nPair Coeffs:\n",out); - for (int i=1; i <= atom->ntypes; ++i) - for (int j=i; j <= atom->ntypes; ++j) { - utils::print(out,"{:6d} {:6d}:",i,j); - if (pair->allocated && pair->setflag[i][j]) fputs(" is set\n",out); - else fputs(" is not set\n",out); - } - } - if (force->bond) { - Bond *bond=force->bond; - - if (bond) { - fputs("\nBond Coeffs:\n",out); - for (int i=1; i <= atom->nbondtypes; ++i) { - utils::print(out,"{:6d}:",i); - if (bond->allocated && bond->setflag[i]) fputs(" is set\n",out); - else fputs (" is not set\n",out); - } - } - } - if (force->angle) { - Angle *angle=force->angle; - - if (angle) { - fputs("\nAngle Coeffs:\n",out); - for (int i=1; i <= atom->nangletypes; ++i) { - utils::print(out,"{:6d}:",i); - if (angle->allocated && angle->setflag[i]) fputs(" is set\n",out); - else fputs (" is not set\n",out); - } - } - } - if (force->dihedral) { - Dihedral *dihedral=force->dihedral; - - if (dihedral) { - fputs("\nDihedral Coeffs:\n",out); - for (int i=1; i <= atom->ndihedraltypes; ++i) { - utils::print(out,"{:6d}:",i); - if (dihedral->allocated && dihedral->setflag[i]) fputs(" is set\n",out); - else fputs (" is not set\n",out); - } - } - } - if (force->improper) { - Improper *b=force->improper; - - if (b) { - fputs("\nImproper Coeffs:\n",out); - for (int i=1; i <= atom->nimpropertypes; ++i) { - utils::print(out,"{:6d}:",i); - if (b->allocated && b->setflag[i]) fputs(" is set\n",out); - else fputs (" is not set\n",out); - } - } - } + if (pair) utils::print(out,"\nPair coeffs\n{}", get_pair_coeff_status(lmp)); + if (force->bond) utils::print(out,"\nBond coeffs\n{}", get_bond_coeff_status(lmp)); + if (force->angle) utils::print(out,"\nAngle coeffs\n{}", get_angle_coeff_status(lmp)); + if (force->dihedral) utils::print(out,"\nDihedral coeffs\n{}", get_dihedral_coeff_status(lmp)); + if (force->improper) utils::print(out,"\nImproper coeffs\n{}", get_improper_coeff_status(lmp)); } if (flags & GROUPS) { @@ -1451,3 +1399,80 @@ std::string Info::get_variable_info(int num) { text += "\n"; return text; } + +/* ---------------------------------------------------------------------- */ + +std::string Info::get_pair_coeff_status(const LAMMPS *lmp) { + + if (!lmp || !lmp->force || !lmp->force->pair || !lmp->force->pair->allocated) + return "Pair style not yet initialized\n"; + + const auto ntypes = lmp->atom->ntypes; + const auto setflag = lmp->force->pair->setflag; + std::string output = ""; + for (int i=1; i <= ntypes; ++i) { + for (int j=i; j <= ntypes; ++j) + output += fmt::format("{:6d} {:6d}: is{}set\n", i, j, setflag[i][j] ? " " : " not "); + } + return output; +} + +/* ---------------------------------------------------------------------- */ + +std::string Info::get_bond_coeff_status(const LAMMPS *lmp) { + + if (!lmp || !lmp->force || !lmp->force->bond || !lmp->force->bond->allocated) + return "Bond style not yet initialized\n"; + + const auto ntypes = lmp->atom->nbondtypes; + const auto setflag = lmp->force->bond->setflag; + std::string output = ""; + for (int i=1; i <= ntypes; ++i) + output += fmt::format("{:6d}: is{}set\n", i, setflag[i] ? " " : " not "); + return output; +} + +/* ---------------------------------------------------------------------- */ + +std::string Info::get_angle_coeff_status(const LAMMPS *lmp) { + + if (!lmp || !lmp->force || !lmp->force->angle || !lmp->force->angle->allocated) + return "Angle style not yet initialized\n"; + + const auto ntypes = lmp->atom->nangletypes; + const auto setflag = lmp->force->angle->setflag; + std::string output = ""; + for (int i=1; i <= ntypes; ++i) + output += fmt::format("{:6d}: is{}set\n", i, setflag[i] ? " " : " not "); + return output; +} + +/* ---------------------------------------------------------------------- */ + +std::string Info::get_dihedral_coeff_status(const LAMMPS *lmp) { + + if (!lmp || !lmp->force || !lmp->force->dihedral || !lmp->force->dihedral->allocated) + return "Dihedral style not yet initialized\n"; + + const auto ntypes = lmp->atom->ndihedraltypes; + const auto setflag = lmp->force->dihedral->setflag; + std::string output = ""; + for (int i=1; i <= ntypes; ++i) + output += fmt::format("{:6d}: is{}set\n", i, setflag[i] ? " " : " not "); + return output; +} + +/* ---------------------------------------------------------------------- */ + +std::string Info::get_improper_coeff_status(const LAMMPS *lmp) { + + if (!lmp || !lmp->force || !lmp->force->improper || !lmp->force->improper->allocated) + return "Improper style not yet initialized\n"; + + const auto ntypes = lmp->atom->nimpropertypes; + const auto setflag = lmp->force->improper->setflag; + std::string output = ""; + for (int i=1; i <= ntypes; ++i) + output += fmt::format("{:6d}: is{}set\n", i, setflag[i] ? " " : " not "); + return output; +} diff --git a/src/info.h b/src/info.h index 5d705837f7..77566b0dcc 100644 --- a/src/info.h +++ b/src/info.h @@ -54,6 +54,12 @@ class Info : public Command { static std::string get_gpu_device_info(); static std::string get_accelerator_info(const std::string &pkg = ""); + static std::string get_pair_coeff_status(const LAMMPS *lmp); + static std::string get_bond_coeff_status(const LAMMPS *lmp); + static std::string get_angle_coeff_status(const LAMMPS *lmp); + static std::string get_dihedral_coeff_status(const LAMMPS *lmp); + static std::string get_improper_coeff_status(const LAMMPS *lmp); + void get_memory_info(double *); char **get_variable_names(int &num); std::string get_variable_info(int num); From 111817ce3255b756025a0c57389908a2b719cd6b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 21:16:07 -0400 Subject: [PATCH 20/99] also print pair coeff setflag status when not all pair coeffs are set --- src/DPD-BASIC/pair_dpd.cpp | 5 +- src/DPD-BASIC/pair_dpd_coul_slater_long.cpp | 5 +- src/DPD-BASIC/pair_dpd_ext.cpp | 5 +- src/DPD-MESO/pair_edpd.cpp | 5 +- src/DPD-MESO/pair_mdpd.cpp | 5 +- src/DPD-MESO/pair_tdpd.cpp | 5 +- src/DPD-REACT/pair_dpd_fdt.cpp | 5 +- src/DPD-REACT/pair_dpd_fdt_energy.cpp | 5 +- src/DPD-REACT/pair_exp6_rx.cpp | 5 +- src/DPD-REACT/pair_multi_lucy.cpp | 5 +- src/DPD-REACT/pair_multi_lucy_rx.cpp | 5 +- src/EXTRA-PAIR/pair_beck.cpp | 5 +- src/EXTRA-PAIR/pair_born_coul_dsf.cpp | 3 +- src/EXTRA-PAIR/pair_born_coul_wolf.cpp | 8 +- src/EXTRA-PAIR/pair_born_gauss.cpp | 5 +- src/EXTRA-PAIR/pair_buck_mdf.cpp | 9 +- src/EXTRA-PAIR/pair_dispersion_d3.cpp | 5 +- src/EXTRA-PAIR/pair_e3b.cpp | 5 +- src/EXTRA-PAIR/pair_lennard_mdf.cpp | 9 +- src/EXTRA-PAIR/pair_momb.cpp | 8 +- src/EXTRA-PAIR/pair_morse_smooth_linear.cpp | 9 +- src/EXTRA-PAIR/pair_nm_cut.cpp | 5 +- src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp | 5 +- src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp | 10 +- src/EXTRA-PAIR/pair_nm_cut_coul_long.h | 1 - src/EXTRA-PAIR/pair_pedone.cpp | 5 +- src/EXTRA-PAIR/pair_wf_cut.cpp | 9 +- src/FEP/pair_morse_soft.cpp | 5 +- src/GPU/pair_sw_gpu.cpp | 5 +- src/GPU/pair_tersoff_gpu.cpp | 5 +- src/GPU/pair_tersoff_mod_gpu.cpp | 5 +- src/GPU/pair_tersoff_zbl_gpu.cpp | 5 +- src/GPU/pair_vashishta_gpu.cpp | 7 +- src/INTEL/pair_snap_intel.cpp | 5 +- src/INTERLAYER/pair_drip.cpp | 5 +- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 8 +- .../pair_kolmogorov_crespi_full.cpp | 8 +- src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 10 +- src/INTERLAYER/pair_lebedeva_z.cpp | 7 +- src/KIM/pair_kim.cpp | 5 +- src/KOKKOS/pair_table_kokkos.cpp | 5 +- src/KOKKOS/pair_table_rx_kokkos.cpp | 5 +- src/KSPACE/pair_born_coul_long.cpp | 5 +- src/KSPACE/pair_buck_coul_long.cpp | 5 +- src/KSPACE/pair_buck_long_coul_long.cpp | 5 +- src/KSPACE/pair_coul_streitz.cpp | 5 +- src/LEPTON/pair_lepton.cpp | 8 +- src/MACHDYN/pair_smd_hertz.cpp | 84 +- src/MACHDYN/pair_smd_tlsph.cpp | 6 +- src/MACHDYN/pair_smd_triangulated_surface.cpp | 83 +- src/MACHDYN/pair_smd_ulsph.cpp | 759 +++++++++--------- src/MANYBODY/pair_airebo.cpp | 5 +- src/MANYBODY/pair_atm.cpp | 7 +- src/MANYBODY/pair_bop.cpp | 5 +- src/MANYBODY/pair_comb.cpp | 11 +- src/MANYBODY/pair_comb3.cpp | 11 +- src/MANYBODY/pair_edip.cpp | 8 +- src/MANYBODY/pair_edip_multi.cpp | 5 +- src/MANYBODY/pair_extep.cpp | 5 +- src/MANYBODY/pair_gw.cpp | 9 +- src/MANYBODY/pair_lcbop.cpp | 15 +- src/MANYBODY/pair_nb3b_harmonic.cpp | 5 +- src/MANYBODY/pair_polymorphic.cpp | 5 +- src/MANYBODY/pair_rebomos.cpp | 5 +- src/MANYBODY/pair_sw.cpp | 5 +- src/MANYBODY/pair_tersoff.cpp | 5 +- src/MANYBODY/pair_tersoff_table.cpp | 5 +- src/MANYBODY/pair_threebody_table.cpp | 5 +- src/MANYBODY/pair_vashishta.cpp | 5 +- src/MISC/pair_agni.cpp | 7 +- src/MISC/pair_srp.cpp | 5 +- src/ML-IAP/pair_mliap.cpp | 6 +- src/ML-PACE/pair_pace.cpp | 5 +- src/ML-PACE/pair_pace_extrapolation.cpp | 5 +- src/ML-POD/pair_pod.cpp | 5 +- src/ML-SNAP/pair_snap.cpp | 8 +- src/MOFFF/pair_buck6d_coul_gauss_dsf.cpp | 5 +- src/MOFFF/pair_buck6d_coul_gauss_long.cpp | 5 +- src/PERI/pair_peri_eps.cpp | 5 +- src/PERI/pair_peri_lps.cpp | 5 +- src/PERI/pair_peri_pmb.cpp | 5 +- src/PERI/pair_peri_ves.cpp | 5 +- src/REAXFF/pair_reaxff.cpp | 5 +- src/SMTBQ/pair_smatb.cpp | 4 +- src/SMTBQ/pair_smatb_single.cpp | 5 +- src/SMTBQ/pair_smtbq.cpp | 5 +- src/SPIN/pair_spin_dipole_cut.cpp | 5 +- src/SPIN/pair_spin_dipole_long.cpp | 5 +- src/SPIN/pair_spin_dmi.cpp | 5 +- src/SPIN/pair_spin_exchange.cpp | 5 +- src/SPIN/pair_spin_exchange_biquadratic.cpp | 5 +- src/SPIN/pair_spin_magelec.cpp | 5 +- src/SPIN/pair_spin_neel.cpp | 5 +- src/pair.cpp | 14 +- src/pair_born.cpp | 9 +- src/pair_buck.cpp | 9 +- src/pair_buck_coul_cut.cpp | 5 +- src/pair_hybrid.cpp | 4 +- src/pair_hybrid_molecular.cpp | 15 +- src/pair_morse.cpp | 5 +- src/pair_table.cpp | 12 +- 101 files changed, 915 insertions(+), 610 deletions(-) diff --git a/src/DPD-BASIC/pair_dpd.cpp b/src/DPD-BASIC/pair_dpd.cpp index 8fa2b1913c..1c8ee883a1 100644 --- a/src/DPD-BASIC/pair_dpd.cpp +++ b/src/DPD-BASIC/pair_dpd.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -278,7 +279,9 @@ void PairDPD::init_style() double PairDPD::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); diff --git a/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp b/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp index 4c4a62f157..adf141aa77 100644 --- a/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp +++ b/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -353,7 +354,9 @@ void PairDPDCoulSlaterLong::init_style() double PairDPDCoulSlaterLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); diff --git a/src/DPD-BASIC/pair_dpd_ext.cpp b/src/DPD-BASIC/pair_dpd_ext.cpp index 6c10df7419..3321686b07 100644 --- a/src/DPD-BASIC/pair_dpd_ext.cpp +++ b/src/DPD-BASIC/pair_dpd_ext.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -337,7 +338,9 @@ void PairDPDExt::init_style() double PairDPDExt::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); sigmaT[i][j] = sqrt(2.0*force->boltz*temperature*gammaT[i][j]); diff --git a/src/DPD-MESO/pair_edpd.cpp b/src/DPD-MESO/pair_edpd.cpp index 84c1f92534..3e08de6319 100644 --- a/src/DPD-MESO/pair_edpd.cpp +++ b/src/DPD-MESO/pair_edpd.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -387,7 +388,9 @@ void PairEDPD::init_style() double PairEDPD::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; cutT[j][i] = cutT[i][j]; diff --git a/src/DPD-MESO/pair_mdpd.cpp b/src/DPD-MESO/pair_mdpd.cpp index dbc78101ac..8fcfa3d786 100644 --- a/src/DPD-MESO/pair_mdpd.cpp +++ b/src/DPD-MESO/pair_mdpd.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -300,7 +301,9 @@ void PairMDPD::init_style() double PairMDPD::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); diff --git a/src/DPD-MESO/pair_tdpd.cpp b/src/DPD-MESO/pair_tdpd.cpp index cd74c2f501..c4a60a0d16 100644 --- a/src/DPD-MESO/pair_tdpd.cpp +++ b/src/DPD-MESO/pair_tdpd.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -340,7 +341,9 @@ void PairTDPD::init_style() double PairTDPD::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); sigma[i][j] = sqrt(2.0*force->boltz*temperature*gamma[i][j]); diff --git a/src/DPD-REACT/pair_dpd_fdt.cpp b/src/DPD-REACT/pair_dpd_fdt.cpp index 24b54cf69d..326130ace3 100644 --- a/src/DPD-REACT/pair_dpd_fdt.cpp +++ b/src/DPD-REACT/pair_dpd_fdt.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "fix.h" #include "force.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -332,7 +333,9 @@ void PairDPDfdt::init_style() double PairDPDfdt::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; a0[j][i] = a0[i][j]; diff --git a/src/DPD-REACT/pair_dpd_fdt_energy.cpp b/src/DPD-REACT/pair_dpd_fdt_energy.cpp index 3bb6d57ec3..1bbcd8bba0 100644 --- a/src/DPD-REACT/pair_dpd_fdt_energy.cpp +++ b/src/DPD-REACT/pair_dpd_fdt_energy.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "fix.h" #include "force.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -430,7 +431,9 @@ void PairDPDfdtEnergy::init_style() double PairDPDfdtEnergy::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; a0[j][i] = a0[i][j]; diff --git a/src/DPD-REACT/pair_exp6_rx.cpp b/src/DPD-REACT/pair_exp6_rx.cpp index d914b0592d..b898eae4ec 100644 --- a/src/DPD-REACT/pair_exp6_rx.cpp +++ b/src/DPD-REACT/pair_exp6_rx.cpp @@ -19,6 +19,7 @@ #include "error.h" #include "fix.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "modify.h" @@ -695,7 +696,9 @@ void PairExp6rx::coeff(int narg, char **arg) double PairExp6rx::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); return cut[i][j]; } diff --git a/src/DPD-REACT/pair_multi_lucy.cpp b/src/DPD-REACT/pair_multi_lucy.cpp index cb9ab92694..3efa7f46ac 100644 --- a/src/DPD-REACT/pair_multi_lucy.cpp +++ b/src/DPD-REACT/pair_multi_lucy.cpp @@ -29,6 +29,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -327,7 +328,9 @@ void PairMultiLucy::coeff(int narg, char **arg) double PairMultiLucy::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); tabindex[j][i] = tabindex[i][j]; diff --git a/src/DPD-REACT/pair_multi_lucy_rx.cpp b/src/DPD-REACT/pair_multi_lucy_rx.cpp index 178b5c3b85..a6f0850b0b 100644 --- a/src/DPD-REACT/pair_multi_lucy_rx.cpp +++ b/src/DPD-REACT/pair_multi_lucy_rx.cpp @@ -30,6 +30,7 @@ #include "error.h" #include "fix.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "modify.h" @@ -461,7 +462,9 @@ void PairMultiLucyRX::coeff(int narg, char **arg) double PairMultiLucyRX::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); tabindex[j][i] = tabindex[i][j]; diff --git a/src/EXTRA-PAIR/pair_beck.cpp b/src/EXTRA-PAIR/pair_beck.cpp index cd24609216..7cfa4810f0 100644 --- a/src/EXTRA-PAIR/pair_beck.cpp +++ b/src/EXTRA-PAIR/pair_beck.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "neigh_list.h" @@ -229,7 +230,9 @@ void PairBeck::coeff(int narg, char **arg) double PairBeck::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); AA[j][i] = AA[i][j]; BB[j][i] = BB[i][j]; diff --git a/src/EXTRA-PAIR/pair_born_coul_dsf.cpp b/src/EXTRA-PAIR/pair_born_coul_dsf.cpp index 6cd19ec54f..e22b40c598 100644 --- a/src/EXTRA-PAIR/pair_born_coul_dsf.cpp +++ b/src/EXTRA-PAIR/pair_born_coul_dsf.cpp @@ -19,10 +19,10 @@ #include "pair_born_coul_dsf.h" -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neighbor.h" #include "neigh_list.h" #include "math_const.h" @@ -30,6 +30,7 @@ #include "error.h" #include "math_special.h" +#include using namespace LAMMPS_NS; using namespace MathConst; diff --git a/src/EXTRA-PAIR/pair_born_coul_wolf.cpp b/src/EXTRA-PAIR/pair_born_coul_wolf.cpp index 8dce32ad21..24d6de0fd7 100644 --- a/src/EXTRA-PAIR/pair_born_coul_wolf.cpp +++ b/src/EXTRA-PAIR/pair_born_coul_wolf.cpp @@ -18,16 +18,18 @@ #include "pair_born_coul_wolf.h" -#include + #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neighbor.h" #include "neigh_list.h" #include "math_const.h" #include "memory.h" #include "error.h" +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -294,7 +296,9 @@ void PairBornCoulWolf::init_style() double PairBornCoulWolf::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/EXTRA-PAIR/pair_born_gauss.cpp b/src/EXTRA-PAIR/pair_born_gauss.cpp index 0cd2102c58..b670289727 100644 --- a/src/EXTRA-PAIR/pair_born_gauss.cpp +++ b/src/EXTRA-PAIR/pair_born_gauss.cpp @@ -19,6 +19,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -215,7 +216,9 @@ void PairBornGauss::coeff(int narg, char **arg) double PairBornGauss::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); if (offset_flag) { double dr = cut[i][j] - r0[i][j]; diff --git a/src/EXTRA-PAIR/pair_buck_mdf.cpp b/src/EXTRA-PAIR/pair_buck_mdf.cpp index 3c93c0f5b3..c40a940351 100644 --- a/src/EXTRA-PAIR/pair_buck_mdf.cpp +++ b/src/EXTRA-PAIR/pair_buck_mdf.cpp @@ -18,15 +18,16 @@ #include "pair_buck_mdf.h" -#include -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "memory.h" #include "error.h" +#include +#include using namespace LAMMPS_NS; @@ -250,7 +251,9 @@ void PairBuckMDF::coeff(int narg, char **arg) double PairBuckMDF::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); rhoinv[i][j] = 1.0/rho[i][j]; buck1[i][j] = a[i][j]/rho[i][j]; diff --git a/src/EXTRA-PAIR/pair_dispersion_d3.cpp b/src/EXTRA-PAIR/pair_dispersion_d3.cpp index d66148828c..1004a5f99a 100644 --- a/src/EXTRA-PAIR/pair_dispersion_d3.cpp +++ b/src/EXTRA-PAIR/pair_dispersion_d3.cpp @@ -26,6 +26,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -1420,7 +1421,9 @@ void PairDispersionD3::set_funcpar(std::string &functional_name) double PairDispersionD3::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); r0ab[j][i] = r0ab[i][j]; diff --git a/src/EXTRA-PAIR/pair_e3b.cpp b/src/EXTRA-PAIR/pair_e3b.cpp index cc81cee03f..b0ae56d86b 100644 --- a/src/EXTRA-PAIR/pair_e3b.cpp +++ b/src/EXTRA-PAIR/pair_e3b.cpp @@ -22,6 +22,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -601,7 +602,9 @@ void PairE3B::presetParam(const int flag, bool &repeatFlag, double &bondL) //pair.cpp::init uses this to set cutsq array, used for neighboring, etc double PairE3B::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/EXTRA-PAIR/pair_lennard_mdf.cpp b/src/EXTRA-PAIR/pair_lennard_mdf.cpp index b56b7407f3..3bb2afcbfa 100644 --- a/src/EXTRA-PAIR/pair_lennard_mdf.cpp +++ b/src/EXTRA-PAIR/pair_lennard_mdf.cpp @@ -19,15 +19,16 @@ #include "pair_lennard_mdf.h" -#include -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "memory.h" #include "error.h" +#include +#include using namespace LAMMPS_NS; @@ -251,7 +252,9 @@ void PairLennardMDF::coeff(int narg, char **arg) double PairLennardMDF::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cut_inner_sq[i][j] = cut_inner[i][j]*cut_inner[i][j]; diff --git a/src/EXTRA-PAIR/pair_momb.cpp b/src/EXTRA-PAIR/pair_momb.cpp index def4037157..c898590cba 100644 --- a/src/EXTRA-PAIR/pair_momb.cpp +++ b/src/EXTRA-PAIR/pair_momb.cpp @@ -19,16 +19,18 @@ #include "pair_momb.h" -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "memory.h" #include "error.h" #include "citeme.h" +#include + using namespace LAMMPS_NS; static const char cite_momb[] = @@ -252,7 +254,9 @@ void PairMomb::coeff(int narg, char **arg) double PairMomb::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); morse1[i][j] = 2.0*d0[i][j]*alpha[i][j]; diff --git a/src/EXTRA-PAIR/pair_morse_smooth_linear.cpp b/src/EXTRA-PAIR/pair_morse_smooth_linear.cpp index 9d3b3d4dc5..a3ede5f2ed 100644 --- a/src/EXTRA-PAIR/pair_morse_smooth_linear.cpp +++ b/src/EXTRA-PAIR/pair_morse_smooth_linear.cpp @@ -14,15 +14,16 @@ #include "pair_morse_smooth_linear.h" -#include -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "memory.h" #include "error.h" +#include +#include using namespace LAMMPS_NS; @@ -217,7 +218,9 @@ void PairMorseSmoothLinear::coeff(int narg, char **arg) double PairMorseSmoothLinear::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); morse1[i][j] = 2.0*d0[i][j]*alpha[i][j]; double alpha_dr = -alpha[i][j] * (cut[i][j] - r0[i][j]); diff --git a/src/EXTRA-PAIR/pair_nm_cut.cpp b/src/EXTRA-PAIR/pair_nm_cut.cpp index d3c7dca54d..a8f0687849 100644 --- a/src/EXTRA-PAIR/pair_nm_cut.cpp +++ b/src/EXTRA-PAIR/pair_nm_cut.cpp @@ -21,6 +21,7 @@ #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "math_const.h" #include "memory.h" @@ -237,7 +238,9 @@ void PairNMCut::coeff(int narg, char **arg) double PairNMCut::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); nm[i][j] = nn[i][j]*mm[i][j]; e0nm[i][j] = e0[i][j]/(nn[i][j]-mm[i][j]); diff --git a/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp index 1fb98e3f4b..bc229cacce 100644 --- a/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp +++ b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -276,7 +277,9 @@ void PairNMCutCoulCut::init_style() double PairNMCutCoulCut::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul[i][j]); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp b/src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp index cd36d4a262..488a312bbc 100644 --- a/src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp +++ b/src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "ewald_const.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "memory.h" @@ -42,7 +43,6 @@ PairNMCutCoulLong::PairNMCutCoulLong(LAMMPS *lmp) : Pair(lmp) { ewaldflag = pppmflag = 1; ftable = nullptr; - qdist = 0.0; } /* ---------------------------------------------------------------------- */ @@ -318,11 +318,11 @@ void PairNMCutCoulLong::init_style() double PairNMCutCoulLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); - // include TIP4P qdist in full cutoff, qdist = 0.0 if not TIP4P - - double cut = MAX(cut_lj[i][j],cut_coul+2.0*qdist); + double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; nm[i][j] = nn[i][j]*mm[i][j]; diff --git a/src/EXTRA-PAIR/pair_nm_cut_coul_long.h b/src/EXTRA-PAIR/pair_nm_cut_coul_long.h index 1e1d61ff90..563ebd8abd 100644 --- a/src/EXTRA-PAIR/pair_nm_cut_coul_long.h +++ b/src/EXTRA-PAIR/pair_nm_cut_coul_long.h @@ -50,7 +50,6 @@ class PairNMCutCoulLong : public Pair { double cut_coul, cut_coulsq; double **e0, **r0, **nn, **mm; double **nm, **e0nm, **r0n, **r0m, **offset; - double qdist; // TIP4P distance from O site to negative charge double g_ewald; void allocate(); diff --git a/src/EXTRA-PAIR/pair_pedone.cpp b/src/EXTRA-PAIR/pair_pedone.cpp index 3f97c76a7d..a620895d15 100644 --- a/src/EXTRA-PAIR/pair_pedone.cpp +++ b/src/EXTRA-PAIR/pair_pedone.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -226,7 +227,9 @@ void PairPedone::coeff(int narg, char **arg) double PairPedone::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); pedone1[i][j] = 2.0 * d0[i][j] * alpha[i][j]; pedone2[i][j] = 12.0 * c0[i][j]; diff --git a/src/EXTRA-PAIR/pair_wf_cut.cpp b/src/EXTRA-PAIR/pair_wf_cut.cpp index bb1978ff8c..67057c1707 100644 --- a/src/EXTRA-PAIR/pair_wf_cut.cpp +++ b/src/EXTRA-PAIR/pair_wf_cut.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_special.h" #include "memory.h" @@ -230,12 +231,14 @@ void PairWFCut::coeff(int narg, char **arg) double PairWFCut::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); nm[i][j] = nu[i][j]*mu[i][j]; e0nm[i][j] = epsilon[i][j]*2.0*nu[i][j]*powint(cut[i][j]/sigma[i][j],2*mu[i][j]) - *powint((1+2.0*nu[i][j])/(2.0*nu[i][j])/(MathSpecial::powint(cut[i][j]/sigma[i][j],2*mu[i][j])-1.0), - 2*nu[i][j]+1); + *powint((1+2.0*nu[i][j])/(2.0*nu[i][j]) + /(MathSpecial::powint(cut[i][j]/sigma[i][j],2*mu[i][j])-1.0),2*nu[i][j]+1); rcmu[i][j] = powint(cut[i][j],2*mu[i][j]); sigma_mu[i][j] = powint(sigma[i][j], 2*mu[i][j]); diff --git a/src/FEP/pair_morse_soft.cpp b/src/FEP/pair_morse_soft.cpp index e13defefa6..661acaf10f 100644 --- a/src/FEP/pair_morse_soft.cpp +++ b/src/FEP/pair_morse_soft.cpp @@ -17,6 +17,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "neigh_list.h" @@ -225,7 +226,9 @@ void PairMorseSoft::settings(int narg, char **arg) double PairMorseSoft::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); morse1[i][j] = 2.0 * d0[i][j] * alpha[i][j]; diff --git a/src/GPU/pair_sw_gpu.cpp b/src/GPU/pair_sw_gpu.cpp index 3e916a6571..4528da87cd 100644 --- a/src/GPU/pair_sw_gpu.cpp +++ b/src/GPU/pair_sw_gpu.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "force.h" #include "gpu_extra.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -232,7 +233,9 @@ void PairSWGPU::init_style() double PairSWGPU::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax; cutghost[j][i] = cutmax; diff --git a/src/GPU/pair_tersoff_gpu.cpp b/src/GPU/pair_tersoff_gpu.cpp index 9ba94548c1..10502190fd 100644 --- a/src/GPU/pair_tersoff_gpu.cpp +++ b/src/GPU/pair_tersoff_gpu.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "force.h" #include "gpu_extra.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -236,7 +237,9 @@ void PairTersoffGPU::init_style() double PairTersoffGPU::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax; cutghost[j][i] = cutmax; diff --git a/src/GPU/pair_tersoff_mod_gpu.cpp b/src/GPU/pair_tersoff_mod_gpu.cpp index 1bb09c1403..96e64a271f 100644 --- a/src/GPU/pair_tersoff_mod_gpu.cpp +++ b/src/GPU/pair_tersoff_mod_gpu.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "force.h" #include "gpu_extra.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -237,7 +238,9 @@ void PairTersoffMODGPU::init_style() double PairTersoffMODGPU::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax; cutghost[j][i] = cutmax; diff --git a/src/GPU/pair_tersoff_zbl_gpu.cpp b/src/GPU/pair_tersoff_zbl_gpu.cpp index 8d5e05ce4c..cab2a0f0ed 100644 --- a/src/GPU/pair_tersoff_zbl_gpu.cpp +++ b/src/GPU/pair_tersoff_zbl_gpu.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "force.h" #include "gpu_extra.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neigh_request.h" @@ -255,7 +256,9 @@ void PairTersoffZBLGPU::init_style() double PairTersoffZBLGPU::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax; cutghost[j][i] = cutmax; diff --git a/src/GPU/pair_vashishta_gpu.cpp b/src/GPU/pair_vashishta_gpu.cpp index 38ad2b3c57..9693f670e7 100644 --- a/src/GPU/pair_vashishta_gpu.cpp +++ b/src/GPU/pair_vashishta_gpu.cpp @@ -22,6 +22,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "gpu_extra.h" #include "memory.h" #include "neigh_list.h" @@ -234,8 +235,10 @@ void PairVashishtaGPU::init_style() double PairVashishtaGPU::init_one(int i, int j) { - if (!gpu_allocated) { allocate(); } - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (!gpu_allocated) allocate(); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax; cutghost[j][i] = cutmax; diff --git a/src/INTEL/pair_snap_intel.cpp b/src/INTEL/pair_snap_intel.cpp index 7b388206b4..416f83bd06 100644 --- a/src/INTEL/pair_snap_intel.cpp +++ b/src/INTEL/pair_snap_intel.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -424,7 +425,9 @@ void PairSNAPIntel::init_style() double PairSNAPIntel::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); scale[j][i] = scale[i][j]; return (radelem[map[i]] + radelem[map[j]])*rcutfac; diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index 2800bd604d..37989aa94e 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -26,6 +26,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -136,7 +137,9 @@ void PairDRIP::coeff(int narg, char **arg) double PairDRIP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); int itype = map[i]; int jtype = map[j]; diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index a3e3a833c3..5cddbc5edf 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -25,6 +25,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "interlayer_taper.h" #include "memory.h" #include "my_page.h" @@ -185,8 +186,11 @@ void PairILPGrapheneHBN::coeff(int narg, char **arg) double PairILPGrapheneHBN::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - if (!offset_flag) error->all(FLERR, "Must use 'pair_modify shift yes' with this pair style"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); + if (!offset_flag) + error->all(FLERR, Error::NOLASTLINE, "Must use 'pair_modify shift yes' with this pair style"); if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index 6bc3a6dde7..be6cefa62a 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "interlayer_taper.h" #include "memory.h" #include "my_page.h" @@ -164,8 +165,11 @@ void PairKolmogorovCrespiFull::coeff(int narg, char **arg) double PairKolmogorovCrespiFull::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - if (!offset_flag) error->all(FLERR, "Must use 'pair_modify shift yes' with this pair style"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); + if (!offset_flag) + error->all(FLERR, Error::NOLASTLINE, "Must use 'pair_modify shift yes' with this pair style"); if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp index fa0fe9cad1..08bf44b37d 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -245,7 +246,7 @@ void PairKolmogorovCrespiZ::coeff(int narg, char **arg) void PairKolmogorovCrespiZ::init_style() { if (force->newton_pair == 0) - error->all(FLERR, "Pair style kolmogorov/crespi/z requires newton pair on"); + error->all(FLERR, Error::NOLASTLINE, "Pair style kolmogorov/crespi/z requires newton pair on"); neighbor->add_request(this); } @@ -256,8 +257,11 @@ void PairKolmogorovCrespiZ::init_style() double PairKolmogorovCrespiZ::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); - if (!offset_flag) error->all(FLERR, "Must use 'pair_modify shift yes' with this pair style"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); + if (!offset_flag) + error->all(FLERR, Error::NOLASTLINE, "Must use 'pair_modify shift yes' with this pair style"); if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp index ff9f9dedaa..58842e805d 100644 --- a/src/INTERLAYER/pair_lebedeva_z.cpp +++ b/src/INTERLAYER/pair_lebedeva_z.cpp @@ -29,6 +29,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neighbor.h" #include "neigh_list.h" @@ -253,9 +254,11 @@ void PairLebedevaZ::init_style() double PairLebedevaZ::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); if (!offset_flag) - error->all(FLERR,"Must use 'pair_modify shift yes' with this pair style"); + error->all(FLERR, Error::NOLASTLINE, "Must use 'pair_modify shift yes' with this pair style"); if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 93ba759de4..6876dbe6dc 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -64,6 +64,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neigh_request.h" @@ -621,7 +622,9 @@ double PairKIM::init_one(int i, int j) // This is called once of each (unordered) i,j pair for each // "run ...", "minimize ...", etc. read from input - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return kim_global_influence_distance; } diff --git a/src/KOKKOS/pair_table_kokkos.cpp b/src/KOKKOS/pair_table_kokkos.cpp index fc38cdf19a..64f4025ffb 100644 --- a/src/KOKKOS/pair_table_kokkos.cpp +++ b/src/KOKKOS/pair_table_kokkos.cpp @@ -22,6 +22,7 @@ #include "atom_masks.h" #include "error.h" #include "force.h" +#include "info.h" #include "kokkos.h" #include "memory_kokkos.h" #include "neigh_list.h" @@ -483,7 +484,9 @@ void PairTableKokkos::settings(int narg, char **arg) template double PairTableKokkos::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); tabindex[j][i] = tabindex[i][j]; diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp index 517c408945..2b04c3aa75 100644 --- a/src/KOKKOS/pair_table_rx_kokkos.cpp +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "fix.h" #include "force.h" +#include "info.h" #include "kokkos.h" #include "kokkos.h" #include "kokkos_few.h" @@ -1159,7 +1160,9 @@ void PairTableRXKokkos::coeff(int narg, char **arg) template double PairTableRXKokkos::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); tabindex[j][i] = tabindex[i][j]; diff --git a/src/KSPACE/pair_born_coul_long.cpp b/src/KSPACE/pair_born_coul_long.cpp index e9abe539c1..22ba32d3c6 100644 --- a/src/KSPACE/pair_born_coul_long.cpp +++ b/src/KSPACE/pair_born_coul_long.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "ewald_const.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "memory.h" @@ -296,7 +297,9 @@ void PairBornCoulLong::coeff(int narg, char **arg) double PairBornCoulLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/KSPACE/pair_buck_coul_long.cpp b/src/KSPACE/pair_buck_coul_long.cpp index f3b7a91c0e..b9c8e2a6f3 100644 --- a/src/KSPACE/pair_buck_coul_long.cpp +++ b/src/KSPACE/pair_buck_coul_long.cpp @@ -19,6 +19,7 @@ #include "error.h" #include "ewald_const.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "memory.h" @@ -292,7 +293,9 @@ void PairBuckCoulLong::coeff(int narg, char **arg) double PairBuckCoulLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/KSPACE/pair_buck_long_coul_long.cpp b/src/KSPACE/pair_buck_long_coul_long.cpp index e1dac0a61b..188b01b2e3 100644 --- a/src/KSPACE/pair_buck_long_coul_long.cpp +++ b/src/KSPACE/pair_buck_long_coul_long.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "ewald_const.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_extra.h" #include "memory.h" @@ -274,7 +275,9 @@ void PairBuckLongCoulLong::init_style() double PairBuckLongCoulLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); if (ewald_order&(1<<6)) cut_buck[i][j] = cut_buck_global; else cut_buck[i][j] = cut_buck_read[i][j]; diff --git a/src/KSPACE/pair_coul_streitz.cpp b/src/KSPACE/pair_coul_streitz.cpp index 5949745953..055d98309b 100644 --- a/src/KSPACE/pair_coul_streitz.cpp +++ b/src/KSPACE/pair_coul_streitz.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "memory.h" @@ -162,7 +163,9 @@ double PairCoulStreitz::init_one(int i, int j) { scale[j][i] = scale[i][j]; - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cut_coul; } diff --git a/src/LEPTON/pair_lepton.cpp b/src/LEPTON/pair_lepton.cpp index e55a77a583..c9f45d8ea1 100644 --- a/src/LEPTON/pair_lepton.cpp +++ b/src/LEPTON/pair_lepton.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -216,7 +217,8 @@ void PairLepton::settings(int narg, char **arg) void PairLepton::coeff(int narg, char **arg) { - if (narg < 3 || narg > 4) error->all(FLERR, "Incorrect number of args for pair coefficients" + utils::errorurl(21)); + if (narg < 3 || narg > 4) + error->all(FLERR, "Incorrect number of args for pair coefficients" + utils::errorurl(21)); if (!allocated) allocate(); int ilo, ihi, jlo, jhi; @@ -277,7 +279,9 @@ void PairLepton::coeff(int narg, char **arg) double PairLepton::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); offset[i][j] = 0.0; if (offset_flag) { diff --git a/src/MACHDYN/pair_smd_hertz.cpp b/src/MACHDYN/pair_smd_hertz.cpp index 32b488ef03..fcdaae76bd 100644 --- a/src/MACHDYN/pair_smd_hertz.cpp +++ b/src/MACHDYN/pair_smd_hertz.cpp @@ -34,6 +34,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -252,37 +253,37 @@ void PairHertz::settings(int narg, char **arg) { ------------------------------------------------------------------------- */ void PairHertz::coeff(int narg, char **arg) { - if (narg != 3) - error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); - if (!allocated) - allocate(); + if (narg != 3) + error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); + if (!allocated) + allocate(); - int ilo, ihi, jlo, jhi; - utils::bounds(FLERR,arg[0], 1, atom->ntypes, ilo, ihi, error); - utils::bounds(FLERR,arg[1], 1, atom->ntypes, jlo, jhi, error); + int ilo, ihi, jlo, jhi; + utils::bounds(FLERR,arg[0], 1, atom->ntypes, ilo, ihi, error); + utils::bounds(FLERR,arg[1], 1, atom->ntypes, jlo, jhi, error); - double bulkmodulus_one = utils::numeric(FLERR,arg[2],false,lmp); + double bulkmodulus_one = utils::numeric(FLERR,arg[2],false,lmp); - // set short-range force constant - double kn_one = 0.0; - if (domain->dimension == 3) { - kn_one = (16. / 15.) * bulkmodulus_one; //assuming poisson ratio = 1/4 for 3d - } else { - kn_one = 0.251856195 * (2. / 3.) * bulkmodulus_one; //assuming poisson ratio = 1/3 for 2d - } + // set short-range force constant + double kn_one = 0.0; + if (domain->dimension == 3) { + kn_one = (16. / 15.) * bulkmodulus_one; //assuming poisson ratio = 1/4 for 3d + } else { + kn_one = 0.251856195 * (2. / 3.) * bulkmodulus_one; //assuming poisson ratio = 1/3 for 2d + } - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo, i); j <= jhi; j++) { - bulkmodulus[i][j] = bulkmodulus_one; - kn[i][j] = kn_one; - setflag[i][j] = 1; - count++; - } - } + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { + bulkmodulus[i][j] = bulkmodulus_one; + kn[i][j] = kn_one; + setflag[i][j] = 1; + count++; + } + } - if (count == 0) - error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); + if (count == 0) + error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- @@ -291,26 +292,27 @@ void PairHertz::coeff(int narg, char **arg) { double PairHertz::init_one(int i, int j) { - if (!allocated) - allocate(); + if (!allocated) + allocate(); - if (setflag[i][j] == 0) - error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); - bulkmodulus[j][i] = bulkmodulus[i][j]; - kn[j][i] = kn[i][j]; + bulkmodulus[j][i] = bulkmodulus[i][j]; + kn[j][i] = kn[i][j]; - // cutoff = sum of max I,J radii for - // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen + // cutoff = sum of max I,J radii for + // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen - double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; - cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); - cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); + double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; + cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); + cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); - if (comm->me == 0) { - printf("cutoff for pair smd/hertz = %f\n", cutoff); - } - return cutoff; + if (comm->me == 0) { + printf("cutoff for pair smd/hertz = %f\n", cutoff); + } + return cutoff; } /* ---------------------------------------------------------------------- diff --git a/src/MACHDYN/pair_smd_tlsph.cpp b/src/MACHDYN/pair_smd_tlsph.cpp index a1c8fbf1ea..72ea1b4d5f 100644 --- a/src/MACHDYN/pair_smd_tlsph.cpp +++ b/src/MACHDYN/pair_smd_tlsph.cpp @@ -34,6 +34,7 @@ #include "fix.h" #include "force.h" #include "group.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neighbor.h" @@ -1553,10 +1554,11 @@ double PairTlsph::init_one(int i, int j) { allocate(); if (setflag[i][j] == 0) - error->all(FLERR, "All pair coeffs are not set"); + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); if (force->newton == 1) - error->all(FLERR, "Pair style tlsph requires newton off"); + error->all(FLERR, Error::NOLASTLINE, "Pair style tlsph requires newton off"); // cutoff = sum of max I,J radii for // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen diff --git a/src/MACHDYN/pair_smd_triangulated_surface.cpp b/src/MACHDYN/pair_smd_triangulated_surface.cpp index da9d5faa12..c50b7700f6 100644 --- a/src/MACHDYN/pair_smd_triangulated_surface.cpp +++ b/src/MACHDYN/pair_smd_triangulated_surface.cpp @@ -34,6 +34,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -334,37 +335,37 @@ void PairTriSurf::settings(int narg, char **arg) { ------------------------------------------------------------------------- */ void PairTriSurf::coeff(int narg, char **arg) { - if (narg != 3) - error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); - if (!allocated) - allocate(); + if (narg != 3) + error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); + if (!allocated) + allocate(); - int ilo, ihi, jlo, jhi; - utils::bounds(FLERR,arg[0], 1,atom->ntypes, ilo, ihi, error); - utils::bounds(FLERR,arg[1], 1,atom->ntypes, jlo, jhi, error); + int ilo, ihi, jlo, jhi; + utils::bounds(FLERR,arg[0], 1,atom->ntypes, ilo, ihi, error); + utils::bounds(FLERR,arg[1], 1,atom->ntypes, jlo, jhi, error); - double bulkmodulus_one = utils::numeric(FLERR,arg[2],false,lmp); + double bulkmodulus_one = utils::numeric(FLERR,arg[2],false,lmp); - // set short-range force constant - double kn_one = 0.0; - if (domain->dimension == 3) { - kn_one = (16. / 15.) * bulkmodulus_one; //assuming poisson ratio = 1/4 for 3d - } else { - kn_one = 0.251856195 * (2. / 3.) * bulkmodulus_one; //assuming poisson ratio = 1/3 for 2d - } + // set short-range force constant + double kn_one = 0.0; + if (domain->dimension == 3) { + kn_one = (16. / 15.) * bulkmodulus_one; //assuming poisson ratio = 1/4 for 3d + } else { + kn_one = 0.251856195 * (2. / 3.) * bulkmodulus_one; //assuming poisson ratio = 1/3 for 2d + } - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo, i); j <= jhi; j++) { - bulkmodulus[i][j] = bulkmodulus_one; - kn[i][j] = kn_one; - setflag[i][j] = 1; - count++; - } - } + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { + bulkmodulus[i][j] = bulkmodulus_one; + kn[i][j] = kn_one; + setflag[i][j] = 1; + count++; + } + } - if (count == 0) - error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); + if (count == 0) + error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- @@ -373,26 +374,26 @@ void PairTriSurf::coeff(int narg, char **arg) { double PairTriSurf::init_one(int i, int j) { - if (!allocated) - allocate(); + if (!allocated) + allocate(); - if (setflag[i][j] == 0) - error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); - bulkmodulus[j][i] = bulkmodulus[i][j]; - kn[j][i] = kn[i][j]; + bulkmodulus[j][i] = bulkmodulus[i][j]; + kn[j][i] = kn[i][j]; - // cutoff = sum of max I,J radii for - // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen + // cutoff = sum of max I,J radii for + // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen - double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; - cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); - cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); + double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; + cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); + cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); - if (comm->me == 0) { - printf("cutoff for pair smd/smd/tri_surface = %f\n", cutoff); - } - return cutoff; + if (comm->me == 0) utils::logmesg(lmp, "cutoff for pair smd/smd/tri_surface = {}\n", cutoff); + + return cutoff; } /* ---------------------------------------------------------------------- diff --git a/src/MACHDYN/pair_smd_ulsph.cpp b/src/MACHDYN/pair_smd_ulsph.cpp index 20897a7852..7cbd8c1192 100644 --- a/src/MACHDYN/pair_smd_ulsph.cpp +++ b/src/MACHDYN/pair_smd_ulsph.cpp @@ -29,6 +29,7 @@ #include "comm.h" #include "domain.h" #include "error.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -932,385 +933,385 @@ void PairULSPH::settings(int narg, char **arg) { ------------------------------------------------------------------------- */ void PairULSPH::coeff(int narg, char **arg) { - int ioffset, iarg, iNextKwd, itype, jtype; - std::string s, t; + int ioffset, iarg, iNextKwd, itype, jtype; + std::string s, t; - if (narg < 3) utils::missing_cmd_args(FLERR, "pair ulsph", error); + if (narg < 3) utils::missing_cmd_args(FLERR, "pair ulsph", error); - if (!allocated) allocate(); + if (!allocated) allocate(); + + /* + * if parameters are give in i,i form, i.e., no a cross interaction, set material parameters + */ + + if (utils::inumeric(FLERR, arg[0], false, lmp) == utils::inumeric(FLERR, arg[1], false, lmp)) { + + itype = utils::inumeric(FLERR, arg[0],false,lmp); + eos[itype] = viscosity[itype] = strength[itype] = NONE; + + if (comm->me == 0) { + printf("\n>>========>>========>>========>>========>>========>>========>>========>>========\n"); + printf("...SMD / ULSPH PROPERTIES OF PARTICLE TYPE %d\n\n", itype); + } + + /* + * read parameters which are common -- regardless of material / eos model + */ + + ioffset = 2; + if (strcmp(arg[ioffset], "*COMMON") != 0) error->all(FLERR, "common keyword missing!"); + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *COMMON"); + + if (iNextKwd - ioffset != 5 + 1) + error->all(FLERR, "expected 5 arguments following *COMMON but got {}\n", iNextKwd - ioffset - 1); + + Lookup[REFERENCE_DENSITY][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + Lookup[REFERENCE_SOUNDSPEED][itype] = utils::numeric(FLERR, arg[ioffset + 2],false,lmp); + Q1[itype] = utils::numeric(FLERR, arg[ioffset + 3],false,lmp); + Lookup[HEAT_CAPACITY][itype] = utils::numeric(FLERR, arg[ioffset + 4],false,lmp); + Lookup[HOURGLASS_CONTROL_AMPLITUDE][itype] = utils::numeric(FLERR, arg[ioffset + 5],false,lmp); + + Lookup[BULK_MODULUS][itype] = Lookup[REFERENCE_SOUNDSPEED][itype] * Lookup[REFERENCE_SOUNDSPEED][itype] + * Lookup[REFERENCE_DENSITY][itype]; + + if (comm->me == 0) { + printf("material unspecific properties for SMD/ULSPH definition of particle type %d:\n", itype); + printf(FORMAT1, "reference density", Lookup[REFERENCE_DENSITY][itype]); + printf(FORMAT1, "reference speed of sound", Lookup[REFERENCE_SOUNDSPEED][itype]); + printf(FORMAT1, "linear viscosity coefficient", Q1[itype]); + printf(FORMAT1, "heat capacity [energy / (mass * temperature)]", Lookup[HEAT_CAPACITY][itype]); + printf(FORMAT1, "bulk modulus", Lookup[BULK_MODULUS][itype]); + printf(FORMAT1, "hourglass control amplitude", Lookup[HOURGLASS_CONTROL_AMPLITUDE][itype]); + } + + /* + * read following material cards + */ + + while (true) { + if (strcmp(arg[iNextKwd], "*END") == 0) { + break; + } + + ioffset = iNextKwd; + if (strcmp(arg[ioffset], "*EOS_TAIT") == 0) { /* - * if parameters are give in i,i form, i.e., no a cross interaction, set material parameters + * Tait EOS */ - if (utils::inumeric(FLERR, arg[0], false, lmp) == utils::inumeric(FLERR, arg[1], false, lmp)) { - - itype = utils::inumeric(FLERR, arg[0],false,lmp); - eos[itype] = viscosity[itype] = strength[itype] = NONE; - - if (comm->me == 0) { - printf("\n>>========>>========>>========>>========>>========>>========>>========>>========\n"); - printf("...SMD / ULSPH PROPERTIES OF PARTICLE TYPE %d\n\n", itype); - } - - /* - * read parameters which are common -- regardless of material / eos model - */ - - ioffset = 2; - if (strcmp(arg[ioffset], "*COMMON") != 0) error->all(FLERR, "common keyword missing!"); - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *COMMON"); - - if (iNextKwd - ioffset != 5 + 1) - error->all(FLERR, "expected 5 arguments following *COMMON but got {}\n", iNextKwd - ioffset - 1); - - Lookup[REFERENCE_DENSITY][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - Lookup[REFERENCE_SOUNDSPEED][itype] = utils::numeric(FLERR, arg[ioffset + 2],false,lmp); - Q1[itype] = utils::numeric(FLERR, arg[ioffset + 3],false,lmp); - Lookup[HEAT_CAPACITY][itype] = utils::numeric(FLERR, arg[ioffset + 4],false,lmp); - Lookup[HOURGLASS_CONTROL_AMPLITUDE][itype] = utils::numeric(FLERR, arg[ioffset + 5],false,lmp); - - Lookup[BULK_MODULUS][itype] = Lookup[REFERENCE_SOUNDSPEED][itype] * Lookup[REFERENCE_SOUNDSPEED][itype] - * Lookup[REFERENCE_DENSITY][itype]; - - if (comm->me == 0) { - printf("material unspecific properties for SMD/ULSPH definition of particle type %d:\n", itype); - printf(FORMAT1, "reference density", Lookup[REFERENCE_DENSITY][itype]); - printf(FORMAT1, "reference speed of sound", Lookup[REFERENCE_SOUNDSPEED][itype]); - printf(FORMAT1, "linear viscosity coefficient", Q1[itype]); - printf(FORMAT1, "heat capacity [energy / (mass * temperature)]", Lookup[HEAT_CAPACITY][itype]); - printf(FORMAT1, "bulk modulus", Lookup[BULK_MODULUS][itype]); - printf(FORMAT1, "hourglass control amplitude", Lookup[HOURGLASS_CONTROL_AMPLITUDE][itype]); - } - - /* - * read following material cards - */ - - while (true) { - if (strcmp(arg[iNextKwd], "*END") == 0) { - break; - } - - ioffset = iNextKwd; - if (strcmp(arg[ioffset], "*EOS_TAIT") == 0) { - - /* - * Tait EOS - */ - - eos[itype] = EOS_TAIT; - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_TAIT"); - - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *EOS_TAIT but got {}\n", iNextKwd - ioffset - 1); - - Lookup[EOS_TAIT_EXPONENT][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "Tait EOS"); - printf(FORMAT1, "Exponent", Lookup[EOS_TAIT_EXPONENT][itype]); - } - } // end Tait EOS - - else if (strcmp(arg[ioffset], "*EOS_PERFECT_GAS") == 0) { - - /* - * Perfect Gas EOS - */ - - eos[itype] = EOS_PERFECT_GAS; - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_PERFECT_GAS"); - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *EOS_PERFECT_GAS but got {}\n", iNextKwd - ioffset - 1); - - Lookup[EOS_PERFECT_GAS_GAMMA][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "Perfect Gas EOS"); - printf(FORMAT1, "Heat Capacity Ratio Gamma", Lookup[EOS_PERFECT_GAS_GAMMA][itype]); - } - } // end Perfect Gas EOS - else if (strcmp(arg[ioffset], "*EOS_LINEAR") == 0) { - - /* - * Linear EOS - */ - - eos[itype] = EOS_LINEAR; - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_LINEAR"); - if (iNextKwd - ioffset != 0 + 1) - error->all(FLERR, "expected 0 arguments following *EOS_LINEAR but got {}\n", iNextKwd - ioffset - 1); - - if (comm->me == 0) { - printf(FORMAT2, "Linear EOS"); - printf(FORMAT1, "Bulk modulus", Lookup[BULK_MODULUS][itype]); - } - } // end Linear EOS - else if (strcmp(arg[ioffset], "*STRENGTH_LINEAR_PLASTIC") == 0) { - - if (!velocity_gradient) { - error->all(FLERR, "A strength model was requested but *VELOCITY_GRADIENT is not set"); - } - - /* - * linear elastic / ideal plastic material model with strength - */ - - strength[itype] = STRENGTH_LINEAR_PLASTIC; - velocity_gradient_required = true; - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *STRENGTH_LINEAR_PLASTIC"); - if (iNextKwd - ioffset != 3 + 1) - error->all(FLERR, "expected 3 arguments following *STRENGTH_LINEAR_PLASTIC but got {}\n", iNextKwd - ioffset - 1); - - Lookup[SHEAR_MODULUS][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - Lookup[YIELD_STRENGTH][itype] = utils::numeric(FLERR, arg[ioffset + 2],false,lmp); - Lookup[HARDENING_PARAMETER][itype] = utils::numeric(FLERR, arg[ioffset + 3],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "linear elastic / ideal plastic material mode"); - printf(FORMAT1, "yield_strength", Lookup[YIELD_STRENGTH][itype]); - printf(FORMAT1, "constant hardening parameter", Lookup[HARDENING_PARAMETER][itype]); - printf(FORMAT1, "shear modulus", Lookup[SHEAR_MODULUS][itype]); - } - } // end *STRENGTH_LINEAR_PLASTIC - else if (strcmp(arg[ioffset], "*STRENGTH_LINEAR") == 0) { - - if (!velocity_gradient) { - error->all(FLERR, "A strength model was requested but *VELOCITY_GRADIENT is not set"); - } - - /* - * linear elastic / ideal plastic material model with strength - */ - - strength[itype] = STRENGTH_LINEAR; - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *STRENGTH_LINEAR"); - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *STRENGTH_LINEAR but got {}\n", iNextKwd - ioffset - 1); - - Lookup[SHEAR_MODULUS][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "linear elastic strength model"); - printf(FORMAT1, "shear modulus", Lookup[SHEAR_MODULUS][itype]); - } - } // end *STRENGTH_LINEAR - else if (strcmp(arg[ioffset], "*VISCOSITY_NEWTON") == 0) { - - if (!velocity_gradient) { - error->all(FLERR, "A viscosity model was requested but *VELOCITY_GRADIENT is not set"); - } - - /* - * linear elastic / ideal plastic material model with strength - */ - - viscosity[itype] = VISCOSITY_NEWTON; - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *VISCOSITY_NEWTON"); - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *VISCOSITY_NEWTON but got {}\n", iNextKwd - ioffset - 1); - - Lookup[VISCOSITY_MU][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "Newton viscosity model"); - printf(FORMAT1, "viscosity mu", Lookup[VISCOSITY_MU][itype]); - } - } // end *STRENGTH_VISCOSITY_NEWTON - - else if (strcmp(arg[ioffset], "*ARTIFICIAL_PRESSURE") == 0) { - - /* - * use Monaghan's artificial pressure to prevent particle clumping - */ - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *ARTIFICIAL_PRESSURE"); - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *ARTIFICIAL_PRESSURE but got {}\n", iNextKwd - ioffset - 1); - - artificial_pressure[itype][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "Artificial Pressure is enabled."); - printf(FORMAT1, "Artificial Pressure amplitude", artificial_pressure[itype][itype]); - } - } // end *ARTIFICIAL_PRESSURE - - else if (strcmp(arg[ioffset], "*ARTIFICIAL_STRESS") == 0) { - - /* - * use Monaghan's artificial stress to prevent particle clumping - */ - - t = string("*"); - iNextKwd = -1; - for (iarg = ioffset + 1; iarg < narg; iarg++) { - s = string(arg[iarg]); - if (s.compare(0, t.length(), t) == 0) { - iNextKwd = iarg; - break; - } - } - - if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *ARTIFICIAL_STRESS"); - if (iNextKwd - ioffset != 1 + 1) - error->all(FLERR, "expected 1 arguments following *ARTIFICIAL_STRESS but got {}\n", iNextKwd - ioffset - 1); - - artificial_stress[itype][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); - - if (comm->me == 0) { - printf(FORMAT2, "Artificial Stress is enabled."); - printf(FORMAT1, "Artificial Stress amplitude", artificial_stress[itype][itype]); - } - } // end *ARTIFICIAL_STRESS - - else error->all(FLERR, "unknown *KEYWORD: {}", arg[ioffset]); - } - - /* - * copy data which is looked up in inner pairwise loops from slow maps to fast arrays - */ - - rho0[itype] = Lookup[REFERENCE_DENSITY][itype]; - c0_type[itype] = Lookup[REFERENCE_SOUNDSPEED][itype]; - setflag[itype][itype] = 1; - - /* - * error checks - */ - - if ((viscosity[itype] != NONE) && (strength[itype] != NONE)) - error->all(FLERR, "cannot have both a strength and viscosity model for particle type {}", itype); - - if (eos[itype] == NONE) - error->all(FLERR, "must specify an EOS for particle type {}", itype); - - } else { - /* - * we are reading a cross-interaction line for particle types i, j - */ - - itype = utils::inumeric(FLERR, arg[0],false,lmp); - jtype = utils::inumeric(FLERR, arg[1],false,lmp); - - if (strcmp(arg[2], "*CROSS") != 0) - error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, *CROSS keyword is missing", - itype, jtype); - - if (setflag[itype][itype] != 1) - error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, properties of type {} have not yet been specified", itype, jtype, itype); - - if (setflag[jtype][jtype] != 1) - error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, properties of type {} have not yet been specified", itype, jtype, jtype); - - setflag[itype][jtype] = 1; - setflag[jtype][itype] = 1; - - if ((artificial_pressure[itype][itype] > 0.0) && (artificial_pressure[jtype][jtype] > 0.0)) { - artificial_pressure[itype][jtype] = 0.5 * (artificial_pressure[itype][itype] + artificial_pressure[jtype][jtype]); - artificial_pressure[jtype][itype] = artificial_pressure[itype][jtype]; - } else { - artificial_pressure[itype][jtype] = artificial_pressure[jtype][itype] = 0.0; - } - - if ((artificial_stress[itype][itype] > 0.0) && (artificial_stress[jtype][jtype] > 0.0)) { - artificial_stress[itype][jtype] = 0.5 * (artificial_stress[itype][itype] + artificial_stress[jtype][jtype]); - artificial_stress[jtype][itype] = artificial_stress[itype][jtype]; - } else { - artificial_stress[itype][jtype] = artificial_stress[jtype][itype] = 0.0; - } - - if (comm->me == 0) { - printf(">>========>>========>>========>>========>>========>>========>>========>>========\n"); - } - + eos[itype] = EOS_TAIT; + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_TAIT"); + + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *EOS_TAIT but got {}\n", iNextKwd - ioffset - 1); + + Lookup[EOS_TAIT_EXPONENT][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "Tait EOS"); + printf(FORMAT1, "Exponent", Lookup[EOS_TAIT_EXPONENT][itype]); + } + } // end Tait EOS + + else if (strcmp(arg[ioffset], "*EOS_PERFECT_GAS") == 0) { + + /* + * Perfect Gas EOS + */ + + eos[itype] = EOS_PERFECT_GAS; + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_PERFECT_GAS"); + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *EOS_PERFECT_GAS but got {}\n", iNextKwd - ioffset - 1); + + Lookup[EOS_PERFECT_GAS_GAMMA][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "Perfect Gas EOS"); + printf(FORMAT1, "Heat Capacity Ratio Gamma", Lookup[EOS_PERFECT_GAS_GAMMA][itype]); + } + } // end Perfect Gas EOS + else if (strcmp(arg[ioffset], "*EOS_LINEAR") == 0) { + + /* + * Linear EOS + */ + + eos[itype] = EOS_LINEAR; + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *EOS_LINEAR"); + if (iNextKwd - ioffset != 0 + 1) + error->all(FLERR, "expected 0 arguments following *EOS_LINEAR but got {}\n", iNextKwd - ioffset - 1); + + if (comm->me == 0) { + printf(FORMAT2, "Linear EOS"); + printf(FORMAT1, "Bulk modulus", Lookup[BULK_MODULUS][itype]); + } + } // end Linear EOS + else if (strcmp(arg[ioffset], "*STRENGTH_LINEAR_PLASTIC") == 0) { + + if (!velocity_gradient) { + error->all(FLERR, "A strength model was requested but *VELOCITY_GRADIENT is not set"); + } + + /* + * linear elastic / ideal plastic material model with strength + */ + + strength[itype] = STRENGTH_LINEAR_PLASTIC; + velocity_gradient_required = true; + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *STRENGTH_LINEAR_PLASTIC"); + if (iNextKwd - ioffset != 3 + 1) + error->all(FLERR, "expected 3 arguments following *STRENGTH_LINEAR_PLASTIC but got {}\n", iNextKwd - ioffset - 1); + + Lookup[SHEAR_MODULUS][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + Lookup[YIELD_STRENGTH][itype] = utils::numeric(FLERR, arg[ioffset + 2],false,lmp); + Lookup[HARDENING_PARAMETER][itype] = utils::numeric(FLERR, arg[ioffset + 3],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "linear elastic / ideal plastic material mode"); + printf(FORMAT1, "yield_strength", Lookup[YIELD_STRENGTH][itype]); + printf(FORMAT1, "constant hardening parameter", Lookup[HARDENING_PARAMETER][itype]); + printf(FORMAT1, "shear modulus", Lookup[SHEAR_MODULUS][itype]); + } + } // end *STRENGTH_LINEAR_PLASTIC + else if (strcmp(arg[ioffset], "*STRENGTH_LINEAR") == 0) { + + if (!velocity_gradient) { + error->all(FLERR, "A strength model was requested but *VELOCITY_GRADIENT is not set"); + } + + /* + * linear elastic / ideal plastic material model with strength + */ + + strength[itype] = STRENGTH_LINEAR; + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *STRENGTH_LINEAR"); + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *STRENGTH_LINEAR but got {}\n", iNextKwd - ioffset - 1); + + Lookup[SHEAR_MODULUS][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "linear elastic strength model"); + printf(FORMAT1, "shear modulus", Lookup[SHEAR_MODULUS][itype]); + } + } // end *STRENGTH_LINEAR + else if (strcmp(arg[ioffset], "*VISCOSITY_NEWTON") == 0) { + + if (!velocity_gradient) { + error->all(FLERR, "A viscosity model was requested but *VELOCITY_GRADIENT is not set"); + } + + /* + * linear elastic / ideal plastic material model with strength + */ + + viscosity[itype] = VISCOSITY_NEWTON; + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *VISCOSITY_NEWTON"); + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *VISCOSITY_NEWTON but got {}\n", iNextKwd - ioffset - 1); + + Lookup[VISCOSITY_MU][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "Newton viscosity model"); + printf(FORMAT1, "viscosity mu", Lookup[VISCOSITY_MU][itype]); + } + } // end *STRENGTH_VISCOSITY_NEWTON + + else if (strcmp(arg[ioffset], "*ARTIFICIAL_PRESSURE") == 0) { + + /* + * use Monaghan's artificial pressure to prevent particle clumping + */ + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *ARTIFICIAL_PRESSURE"); + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *ARTIFICIAL_PRESSURE but got {}\n", iNextKwd - ioffset - 1); + + artificial_pressure[itype][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "Artificial Pressure is enabled."); + printf(FORMAT1, "Artificial Pressure amplitude", artificial_pressure[itype][itype]); + } + } // end *ARTIFICIAL_PRESSURE + + else if (strcmp(arg[ioffset], "*ARTIFICIAL_STRESS") == 0) { + + /* + * use Monaghan's artificial stress to prevent particle clumping + */ + + t = string("*"); + iNextKwd = -1; + for (iarg = ioffset + 1; iarg < narg; iarg++) { + s = string(arg[iarg]); + if (s.compare(0, t.length(), t) == 0) { + iNextKwd = iarg; + break; + } + } + + if (iNextKwd < 0) error->all(FLERR, "no *KEYWORD terminates *ARTIFICIAL_STRESS"); + if (iNextKwd - ioffset != 1 + 1) + error->all(FLERR, "expected 1 arguments following *ARTIFICIAL_STRESS but got {}\n", iNextKwd - ioffset - 1); + + artificial_stress[itype][itype] = utils::numeric(FLERR, arg[ioffset + 1],false,lmp); + + if (comm->me == 0) { + printf(FORMAT2, "Artificial Stress is enabled."); + printf(FORMAT1, "Artificial Stress amplitude", artificial_stress[itype][itype]); + } + } // end *ARTIFICIAL_STRESS + + else error->all(FLERR, "unknown *KEYWORD: {}", arg[ioffset]); + } + + /* + * copy data which is looked up in inner pairwise loops from slow maps to fast arrays + */ + + rho0[itype] = Lookup[REFERENCE_DENSITY][itype]; + c0_type[itype] = Lookup[REFERENCE_SOUNDSPEED][itype]; + setflag[itype][itype] = 1; + + /* + * error checks + */ + + if ((viscosity[itype] != NONE) && (strength[itype] != NONE)) + error->all(FLERR, "cannot have both a strength and viscosity model for particle type {}", itype); + + if (eos[itype] == NONE) + error->all(FLERR, "must specify an EOS for particle type {}", itype); + + } else { + /* + * we are reading a cross-interaction line for particle types i, j + */ + + itype = utils::inumeric(FLERR, arg[0],false,lmp); + jtype = utils::inumeric(FLERR, arg[1],false,lmp); + + if (strcmp(arg[2], "*CROSS") != 0) + error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, *CROSS keyword is missing", + itype, jtype); + + if (setflag[itype][itype] != 1) + error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, properties of type {} have not yet been specified", itype, jtype, itype); + + if (setflag[jtype][jtype] != 1) + error->all(FLERR, "ulsph cross interaction between particle type {} and {} requested, however, properties of type {} have not yet been specified", itype, jtype, jtype); + + setflag[itype][jtype] = 1; + setflag[jtype][itype] = 1; + + if ((artificial_pressure[itype][itype] > 0.0) && (artificial_pressure[jtype][jtype] > 0.0)) { + artificial_pressure[itype][jtype] = 0.5 * (artificial_pressure[itype][itype] + artificial_pressure[jtype][jtype]); + artificial_pressure[jtype][itype] = artificial_pressure[itype][jtype]; + } else { + artificial_pressure[itype][jtype] = artificial_pressure[jtype][itype] = 0.0; + } + + if ((artificial_stress[itype][itype] > 0.0) && (artificial_stress[jtype][jtype] > 0.0)) { + artificial_stress[itype][jtype] = 0.5 * (artificial_stress[itype][itype] + artificial_stress[jtype][jtype]); + artificial_stress[jtype][itype] = artificial_stress[itype][jtype]; + } else { + artificial_stress[itype][jtype] = artificial_stress[jtype][itype] = 0.0; + } + + if (comm->me == 0) { + printf(">>========>>========>>========>>========>>========>>========>>========>>========\n"); + } + + } } /* ---------------------------------------------------------------------- @@ -1319,17 +1320,19 @@ void PairULSPH::coeff(int narg, char **arg) { double PairULSPH::init_one(int i, int j) { - if (!allocated) allocate(); + if (!allocated) allocate(); - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); // cutoff = sum of max I,J radii for // dynamic/dynamic & dynamic/frozen interactions, but not frozen/frozen - double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; - cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); - cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); - return cutoff; + double cutoff = maxrad_dynamic[i] + maxrad_dynamic[j]; + cutoff = MAX(cutoff, maxrad_frozen[i] + maxrad_dynamic[j]); + cutoff = MAX(cutoff, maxrad_dynamic[i] + maxrad_frozen[j]); + return cutoff; } /* ---------------------------------------------------------------------- diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 4a3c3351ba..705fa34f8b 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "my_page.h" @@ -259,7 +260,9 @@ void PairAIREBO::init_style() double PairAIREBO::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); // convert to C,H types diff --git a/src/MANYBODY/pair_atm.cpp b/src/MANYBODY/pair_atm.cpp index 3d7e5e2600..03f11c1625 100644 --- a/src/MANYBODY/pair_atm.cpp +++ b/src/MANYBODY/pair_atm.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -269,7 +270,7 @@ void PairATM::coeff(int narg, char **arg) void PairATM::init_style() { if (force->newton_pair == 0) - error->all(FLERR,"Pair style ATM requires newton pair on"); + error->all(FLERR, Error::NOLASTLINE, "Pair style ATM requires newton pair on"); // need a full neighbor list @@ -283,7 +284,9 @@ void PairATM::init_style() double PairATM::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); // set all 6 symmetric permutations of I,J,K types to same nu value diff --git a/src/MANYBODY/pair_bop.cpp b/src/MANYBODY/pair_bop.cpp index ae50736455..a158b91f03 100644 --- a/src/MANYBODY/pair_bop.cpp +++ b/src/MANYBODY/pair_bop.cpp @@ -42,6 +42,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "neigh_list.h" @@ -437,7 +438,9 @@ void PairBOP::init_style() double PairBOP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); int itype = map[i]; int jtype = map[j]; diff --git a/src/MANYBODY/pair_comb.cpp b/src/MANYBODY/pair_comb.cpp index 609e4efcf8..f3cd29b43d 100644 --- a/src/MANYBODY/pair_comb.cpp +++ b/src/MANYBODY/pair_comb.cpp @@ -26,6 +26,7 @@ #include "error.h" #include "force.h" #include "group.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "math_special.h" @@ -466,11 +467,11 @@ void PairComb::coeff(int narg, char **arg) void PairComb::init_style() { if (atom->tag_enable == 0) - error->all(FLERR,"Pair style COMB requires atom IDs"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR,"Pair style COMB requires newton pair on"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB requires newton pair on"); if (!atom->q_flag) - error->all(FLERR,"Pair style COMB requires atom attribute q"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB requires atom attribute q"); // ptr to QEQ fix @@ -509,7 +510,9 @@ void PairComb::init_style() double PairComb::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_comb3.cpp b/src/MANYBODY/pair_comb3.cpp index 3a02ed73b1..bc74bf6361 100644 --- a/src/MANYBODY/pair_comb3.cpp +++ b/src/MANYBODY/pair_comb3.cpp @@ -25,6 +25,7 @@ #include "error.h" #include "force.h" #include "group.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "math_special.h" @@ -208,11 +209,11 @@ void PairComb3::coeff(int narg, char **arg) void PairComb3::init_style() { if (atom->tag_enable == 0) - error->all(FLERR,"Pair style COMB3 requires atom IDs"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB3 requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR,"Pair style COMB3 requires newton pair on"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB3 requires newton pair on"); if (!atom->q_flag) - error->all(FLERR,"Pair style COMB3 requires atom attribute q"); + error->all(FLERR, Error::NOLASTLINE, "Pair style COMB3 requires atom attribute q"); // need a full neighbor list neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); @@ -243,7 +244,9 @@ void PairComb3::init_style() double PairComb3::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cutghost[j][i] = cutghost[i][j] = cutmax; return cutmax; } diff --git a/src/MANYBODY/pair_edip.cpp b/src/MANYBODY/pair_edip.cpp index 1eac053ebd..b94e743f8e 100644 --- a/src/MANYBODY/pair_edip.cpp +++ b/src/MANYBODY/pair_edip.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -740,7 +741,8 @@ void PairEDIP::coeff(int narg, char **arg) void PairEDIP::init_style() { - if (force->newton_pair == 0) error->all(FLERR, "Pair style edip requires newton pair on"); + if (force->newton_pair == 0) + error->all(FLERR, Error::NOLASTLINE, "Pair style edip requires newton pair on"); // need a full neighbor list @@ -753,7 +755,9 @@ void PairEDIP::init_style() double PairEDIP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_edip_multi.cpp b/src/MANYBODY/pair_edip_multi.cpp index 32e21861f3..e8bca44ac4 100644 --- a/src/MANYBODY/pair_edip_multi.cpp +++ b/src/MANYBODY/pair_edip_multi.cpp @@ -25,6 +25,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_extra.h" #include "memory.h" #include "neigh_list.h" @@ -570,7 +571,9 @@ void PairEDIPMulti::init_style() double PairEDIPMulti::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_extep.cpp b/src/MANYBODY/pair_extep.cpp index 607106b4ce..6915ee81cb 100644 --- a/src/MANYBODY/pair_extep.cpp +++ b/src/MANYBODY/pair_extep.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "memory.h" @@ -498,7 +499,9 @@ void PairExTeP::init_style() double PairExTeP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutmax ; cutghost[j][i] = cutghost[i][j]; diff --git a/src/MANYBODY/pair_gw.cpp b/src/MANYBODY/pair_gw.cpp index 471896851a..5255cf4905 100644 --- a/src/MANYBODY/pair_gw.cpp +++ b/src/MANYBODY/pair_gw.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "memory.h" @@ -279,9 +280,9 @@ void PairGW::coeff(int narg, char **arg) void PairGW::init_style() { if (atom->tag_enable == 0) - error->all(FLERR,"Pair style GW requires atom IDs"); + error->all(FLERR, Error::NOLASTLINE, "Pair style GW requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR,"Pair style GW requires newton pair on"); + error->all(FLERR, Error::NOLASTLINE, "Pair style GW requires newton pair on"); // need a full neighbor list @@ -294,7 +295,9 @@ void PairGW::init_style() double PairGW::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index 75fd0f441e..3e8020c3af 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -20,13 +20,14 @@ #include "pair_lcbop.h" #include "atom.h" -#include "force.h" #include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "my_page.h" -#include "memory.h" #include "error.h" +#include "force.h" +#include "info.h" +#include "memory.h" +#include "my_page.h" +#include "neigh_list.h" +#include "neighbor.h" #include #include @@ -180,7 +181,9 @@ void PairLCBOP::init_style() double PairLCBOP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); // cut3rebo = 3 SR distances diff --git a/src/MANYBODY/pair_nb3b_harmonic.cpp b/src/MANYBODY/pair_nb3b_harmonic.cpp index 51e554694c..db7e6ea080 100644 --- a/src/MANYBODY/pair_nb3b_harmonic.cpp +++ b/src/MANYBODY/pair_nb3b_harmonic.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -208,7 +209,9 @@ void PairNb3bHarmonic::init_style() double PairNb3bHarmonic::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_polymorphic.cpp b/src/MANYBODY/pair_polymorphic.cpp index 535fb766bc..bdda442497 100644 --- a/src/MANYBODY/pair_polymorphic.cpp +++ b/src/MANYBODY/pair_polymorphic.cpp @@ -26,6 +26,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_extra.h" #include "memory.h" #include "neigh_list.h" @@ -529,7 +530,9 @@ void PairPolymorphic::init_style() double PairPolymorphic::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_rebomos.cpp b/src/MANYBODY/pair_rebomos.cpp index b8f3c6fde5..d912c37290 100644 --- a/src/MANYBODY/pair_rebomos.cpp +++ b/src/MANYBODY/pair_rebomos.cpp @@ -33,6 +33,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_special.h" #include "memory.h" #include "my_page.h" @@ -242,7 +243,9 @@ void PairREBOMoS::init_style() double PairREBOMoS::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); // convert to Mo,S types diff --git a/src/MANYBODY/pair_sw.cpp b/src/MANYBODY/pair_sw.cpp index a28e523831..0c864bf292 100644 --- a/src/MANYBODY/pair_sw.cpp +++ b/src/MANYBODY/pair_sw.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -334,7 +335,9 @@ void PairSW::init_style() double PairSW::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_tersoff.cpp b/src/MANYBODY/pair_tersoff.cpp index e3c8c83416..f0d52d3075 100644 --- a/src/MANYBODY/pair_tersoff.cpp +++ b/src/MANYBODY/pair_tersoff.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "math_special.h" @@ -405,7 +406,9 @@ void PairTersoff::init_style() double PairTersoff::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_tersoff_table.cpp b/src/MANYBODY/pair_tersoff_table.cpp index b2aec2653c..3e26682300 100644 --- a/src/MANYBODY/pair_tersoff_table.cpp +++ b/src/MANYBODY/pair_tersoff_table.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -750,7 +751,9 @@ void PairTersoffTable::init_style() double PairTersoffTable::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_threebody_table.cpp b/src/MANYBODY/pair_threebody_table.cpp index 20b26edbfa..1fa771a6d0 100644 --- a/src/MANYBODY/pair_threebody_table.cpp +++ b/src/MANYBODY/pair_threebody_table.cpp @@ -22,6 +22,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -263,7 +264,9 @@ void PairThreebodyTable::init_style() double PairThreebodyTable::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MANYBODY/pair_vashishta.cpp b/src/MANYBODY/pair_vashishta.cpp index 79df1f36d7..a65bce917f 100644 --- a/src/MANYBODY/pair_vashishta.cpp +++ b/src/MANYBODY/pair_vashishta.cpp @@ -23,6 +23,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neighbor.h" #include "neigh_list.h" @@ -278,7 +279,9 @@ void PairVashishta::init_style() double PairVashishta::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MISC/pair_agni.cpp b/src/MISC/pair_agni.cpp index cbc6cf6c92..041302b702 100644 --- a/src/MISC/pair_agni.cpp +++ b/src/MISC/pair_agni.cpp @@ -21,8 +21,9 @@ #include "atom.h" #include "citeme.h" #include "comm.h" -#include "force.h" #include "error.h" +#include "force.h" +#include "info.h" #include "math_const.h" #include "math_special.h" #include "memory.h" @@ -254,7 +255,9 @@ void PairAGNI::init_style() double PairAGNI::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index 1fe19bc30c..c81fd3c969 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -35,6 +35,7 @@ Please contact Timothy Sirk for questions (tim.sirk@us.army.mil). #include "error.h" #include "fix_srp.h" #include "force.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -493,7 +494,9 @@ void PairSRP::init_style() double PairSRP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"PairSRP: All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; a0[j][i] = a0[i][j]; diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index b72e9bd481..b379501c4d 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -35,6 +35,7 @@ #include "atom.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neighbor.h" @@ -357,7 +358,10 @@ void PairMLIAP::init_style() double PairMLIAP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); + double cutmax = sqrt(descriptor->cutsq[map[i]][map[j]]); cutghost[i][j] = cutghost[j][i] = 2.0 * cutmax + neighbor->skin; return cutmax; diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index e9bd25f9d7..56dd34916f 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -31,6 +31,7 @@ Copyright 2021 Yury Lysogorskiy^1, Cas van der Oord^2, Anton Bochkarev^1, #include "atom.h" #include "comm.h" #include "error.h" +#include "info.h" #include "force.h" #include "math_const.h" #include "memory.h" @@ -387,7 +388,9 @@ void PairPACE::init_style() double PairPACE::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); //cutoff from the basis set's radial functions settings scale[j][i] = scale[i][j]; return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index ec42d232af..957e53d0ad 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -27,6 +27,7 @@ Copyright 2022 Yury Lysogorskiy^1, Anton Bochkarev^1, Matous Mrovec^1, Ralf Drau #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -439,7 +440,9 @@ void PairPACEExtrapolation::init_style() double PairPACEExtrapolation::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); //cutoff from the basis set's radial functions settings scale[j][i] = scale[i][j]; return aceimpl->basis_set->radial_functions->cut(map[i], map[j]); diff --git a/src/ML-POD/pair_pod.cpp b/src/ML-POD/pair_pod.cpp index f76191328f..6762653413 100644 --- a/src/ML-POD/pair_pod.cpp +++ b/src/ML-POD/pair_pod.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_special.h" #include "memory.h" @@ -335,7 +336,9 @@ void PairPOD::init_style() double PairPOD::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); double rcut = 0.0; rcut = fastpodptr->rcut; diff --git a/src/ML-SNAP/pair_snap.cpp b/src/ML-SNAP/pair_snap.cpp index 5011256dd2..3e7d1aaa42 100644 --- a/src/ML-SNAP/pair_snap.cpp +++ b/src/ML-SNAP/pair_snap.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -453,10 +454,11 @@ void PairSNAP::init_style() double PairSNAP::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); scale[j][i] = scale[i][j]; - return (radelem[map[i]] + - radelem[map[j]])*rcutfac; + return (radelem[map[i]] + radelem[map[j]])*rcutfac; } /* ---------------------------------------------------------------------- */ diff --git a/src/MOFFF/pair_buck6d_coul_gauss_dsf.cpp b/src/MOFFF/pair_buck6d_coul_gauss_dsf.cpp index ced0528ac6..a4fcfa4ebd 100644 --- a/src/MOFFF/pair_buck6d_coul_gauss_dsf.cpp +++ b/src/MOFFF/pair_buck6d_coul_gauss_dsf.cpp @@ -25,6 +25,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -327,7 +328,9 @@ void PairBuck6dCoulGaussDSF::init_style() double PairBuck6dCoulGaussDSF::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/MOFFF/pair_buck6d_coul_gauss_long.cpp b/src/MOFFF/pair_buck6d_coul_gauss_long.cpp index 72919312e5..6bb6357775 100644 --- a/src/MOFFF/pair_buck6d_coul_gauss_long.cpp +++ b/src/MOFFF/pair_buck6d_coul_gauss_long.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "memory.h" #include "neigh_list.h" @@ -365,7 +366,9 @@ void PairBuck6dCoulGaussLong::init_style() double PairBuck6dCoulGaussLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/PERI/pair_peri_eps.cpp b/src/PERI/pair_peri_eps.cpp index fccfee60c7..c0732d48e4 100644 --- a/src/PERI/pair_peri_eps.cpp +++ b/src/PERI/pair_peri_eps.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "fix_peri_neigh.h" #include "force.h" +#include "info.h" #include "lattice.h" #include "math_const.h" #include "math_special.h" @@ -397,7 +398,9 @@ void PairPeriEPS::coeff(int narg, char **arg) double PairPeriEPS::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); bulkmodulus[j][i] = bulkmodulus[i][j]; shearmodulus[j][i] = shearmodulus[i][j]; diff --git a/src/PERI/pair_peri_lps.cpp b/src/PERI/pair_peri_lps.cpp index 34420b6ef2..b7b7e6577a 100644 --- a/src/PERI/pair_peri_lps.cpp +++ b/src/PERI/pair_peri_lps.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "fix_peri_neigh.h" #include "force.h" +#include "info.h" #include "lattice.h" #include "math_const.h" #include "memory.h" @@ -341,7 +342,9 @@ void PairPeriLPS::coeff(int narg, char **arg) double PairPeriLPS::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); bulkmodulus[j][i] = bulkmodulus[i][j]; shearmodulus[j][i] = shearmodulus[i][j]; diff --git a/src/PERI/pair_peri_pmb.cpp b/src/PERI/pair_peri_pmb.cpp index 85c16f6ff8..0bacb3a2f0 100644 --- a/src/PERI/pair_peri_pmb.cpp +++ b/src/PERI/pair_peri_pmb.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "fix_peri_neigh.h" #include "force.h" +#include "info.h" #include "lattice.h" #include "memory.h" #include "neigh_list.h" @@ -278,7 +279,9 @@ void PairPeriPMB::coeff(int narg, char **arg) double PairPeriPMB::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); kspring[j][i] = kspring[i][j]; alpha[j][i] = alpha[i][j]; diff --git a/src/PERI/pair_peri_ves.cpp b/src/PERI/pair_peri_ves.cpp index 24f6deb2d8..d814ce6f05 100644 --- a/src/PERI/pair_peri_ves.cpp +++ b/src/PERI/pair_peri_ves.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "fix_peri_neigh.h" #include "force.h" +#include "info.h" #include "lattice.h" #include "memory.h" #include "neigh_list.h" @@ -385,7 +386,9 @@ void PairPeriVES::coeff(int narg, char **arg) double PairPeriVES::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); bulkmodulus[j][i] = bulkmodulus[i][j]; shearmodulus[j][i] = shearmodulus[i][j]; diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index b36d9e79aa..dd48b836fd 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -30,6 +30,7 @@ #include "error.h" #include "fix_reaxff.h" #include "force.h" +#include "info.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -442,7 +443,9 @@ void PairReaxFF::setup() double PairReaxFF::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cutghost[i][j] = cutghost[j][i] = cutmax; return cutmax; diff --git a/src/SMTBQ/pair_smatb.cpp b/src/SMTBQ/pair_smatb.cpp index 0b97a62c32..f0449f8619 100644 --- a/src/SMTBQ/pair_smatb.cpp +++ b/src/SMTBQ/pair_smatb.cpp @@ -20,6 +20,7 @@ #include "atom.h" #include "comm.h" #include "error.h" +#include "info.h" #include "force.h" #include "memory.h" #include "neigh_list.h" @@ -352,7 +353,8 @@ double PairSMATB::init_one(int i, int j) cutOffStart[i][j] = MIN(cutOffStart[i][i], cutOffStart[j][j]); cutOffEnd[i][j] = MAX(cutOffEnd[i][i], cutOffEnd[j][j]); - error->all(FLERR, "All pair coeffs are not set"); + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); } double es = cutOffEnd[i][j] - cutOffStart[i][j]; diff --git a/src/SMTBQ/pair_smatb_single.cpp b/src/SMTBQ/pair_smatb_single.cpp index fb72971c90..b509955a5e 100644 --- a/src/SMTBQ/pair_smatb_single.cpp +++ b/src/SMTBQ/pair_smatb_single.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -296,7 +297,9 @@ void PairSMATBSingle::init_style() double PairSMATBSingle::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); //calculating the polynomial linking to zero double es = cutOffEnd - cutOffStart; diff --git a/src/SMTBQ/pair_smtbq.cpp b/src/SMTBQ/pair_smtbq.cpp index 78ac34aea4..6d5008c637 100644 --- a/src/SMTBQ/pair_smtbq.cpp +++ b/src/SMTBQ/pair_smtbq.cpp @@ -47,6 +47,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "math_extra.h" #include "math_special.h" @@ -306,7 +307,9 @@ void PairSMTBQ::init_style() double PairSMTBQ::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); return cutmax; } diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index 8e5c125895..867a3dbe8e 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -127,7 +128,9 @@ void PairSpinDipoleCut::coeff(int narg, char **arg) double PairSpinDipoleCut::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cut_spin_long[j][i] = cut_spin_long[i][j]; diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index 8f03c37b7c..12f278cfb2 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -24,6 +24,7 @@ #include "error.h" #include "ewald_const.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "memory.h" @@ -140,7 +141,9 @@ void PairSpinDipoleLong::init_style() double PairSpinDipoleLong::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); cut_spin_long[j][i] = cut_spin_long[i][j]; diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 6dec238163..1170413fe0 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -135,7 +136,9 @@ void PairSpinDmi::coeff(int narg, char **arg) double PairSpinDmi::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); DM[j][i] = DM[i][j]; v_dmx[j][i] = v_dmx[i][j]; diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index b0c9edef27..a807e303a5 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -27,6 +27,7 @@ #include "atom.h" #include "comm.h" #include "error.h" +#include "info.h" #include "force.h" #include "memory.h" #include "neigh_list.h" @@ -143,7 +144,9 @@ void PairSpinExchange::coeff(int narg, char **arg) double PairSpinExchange::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); J1_mag[j][i] = J1_mag[i][j]; J1_mech[j][i] = J1_mech[i][j]; diff --git a/src/SPIN/pair_spin_exchange_biquadratic.cpp b/src/SPIN/pair_spin_exchange_biquadratic.cpp index 7c50659b45..24e75f9c2c 100644 --- a/src/SPIN/pair_spin_exchange_biquadratic.cpp +++ b/src/SPIN/pair_spin_exchange_biquadratic.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -153,7 +154,9 @@ void PairSpinExchangeBiquadratic::coeff(int narg, char **arg) double PairSpinExchangeBiquadratic::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); J1_mag[j][i] = J1_mag[i][j]; J1_mech[j][i] = J1_mech[i][j]; diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 3d22a652b3..daba2564d6 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -130,7 +131,9 @@ void PairSpinMagelec::coeff(int narg, char **arg) double PairSpinMagelec::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status\n" + Info::get_pair_coeff_status(lmp)); ME[j][i] = ME[i][j]; ME_mech[j][i] = ME_mech[i][j]; diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index a9ed7d6966..320bc001a4 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -135,7 +136,9 @@ void PairSpinNeel::coeff(int narg, char **arg) double PairSpinNeel::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); g1[j][i] = g1[i][j]; g1_mech[j][i] = g1_mech[i][j]; diff --git a/src/pair.cpp b/src/pair.cpp index 652f231908..52fea894df 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -24,6 +24,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "kspace.h" #include "math_const.h" #include "math_special.h" @@ -247,10 +248,15 @@ void Pair::init() // I,I coeffs must be set // init_one() will check if I,J is set explicitly or inferred by mixing - if (!allocated) error->all(FLERR,"All pair coeffs are not set"); - - for (i = 1; i <= atom->ntypes; i++) - if (setflag[i][i] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (!allocated) { + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); + } else { + for (i = 1; i <= atom->ntypes; i++) + if (setflag[i][i] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); + } // style-specific initialization diff --git a/src/pair_born.cpp b/src/pair_born.cpp index fe041b2ada..a881bc18db 100644 --- a/src/pair_born.cpp +++ b/src/pair_born.cpp @@ -18,16 +18,17 @@ #include "pair_born.h" -#include -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "math_const.h" #include "memory.h" #include "error.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -237,7 +238,9 @@ void PairBorn::coeff(int narg, char **arg) double PairBorn::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); rhoinv[i][j] = 1.0/rho[i][j]; born1[i][j] = a[i][j]/rho[i][j]; diff --git a/src/pair_buck.cpp b/src/pair_buck.cpp index 660a4b32ec..f06ccbf223 100644 --- a/src/pair_buck.cpp +++ b/src/pair_buck.cpp @@ -14,16 +14,17 @@ #include "pair_buck.h" -#include -#include #include "atom.h" #include "comm.h" #include "force.h" +#include "info.h" #include "neigh_list.h" #include "math_const.h" #include "memory.h" #include "error.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -225,7 +226,9 @@ void PairBuck::coeff(int narg, char **arg) double PairBuck::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); rhoinv[i][j] = 1.0/rho[i][j]; buck1[i][j] = a[i][j]/rho[i][j]; diff --git a/src/pair_buck_coul_cut.cpp b/src/pair_buck_coul_cut.cpp index cf342b4302..9b6ed918f9 100644 --- a/src/pair_buck_coul_cut.cpp +++ b/src/pair_buck_coul_cut.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "neigh_list.h" @@ -274,7 +275,9 @@ void PairBuckCoulCut::init_style() double PairBuckCoulCut::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j], cut_coul[i][j]); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 4fb757cbab..a90f0ea3e2 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -19,6 +19,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_request.h" #include "neighbor.h" @@ -718,7 +719,8 @@ double PairHybrid::init_one(int i, int j) if (setflag[i][j] == 0) { if (nmap[i][i] != 1 || nmap[j][j] != 1 || map[i][i][0] != map[j][j][0]) - error->one(FLERR,"All pair coeffs are not set"); + error->one(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); nmap[i][j] = 1; map[i][j][0] = map[i][i][0]; } diff --git a/src/pair_hybrid_molecular.cpp b/src/pair_hybrid_molecular.cpp index ec68cefafb..6750cf397d 100644 --- a/src/pair_hybrid_molecular.cpp +++ b/src/pair_hybrid_molecular.cpp @@ -15,6 +15,7 @@ #include "atom.h" #include "error.h" +#include "info.h" #include "neigh_request.h" #include "neighbor.h" @@ -31,9 +32,11 @@ PairHybridMolecular::PairHybridMolecular(LAMMPS *lmp) : PairHybridOverlay(lmp) { void PairHybridMolecular::init_style() { if (!atom->molecule_flag) - error->all(FLERR, "Pair style hybrid/molecular requires atom attribute molecule"); + error->all(FLERR, Error::NOLASTLINE, + "Pair style hybrid/molecular requires atom attribute molecule"); if (manybody_flag) - error->all(FLERR, "Pair style hybrid/molecular is not compatible with manybody potentials"); + error->all(FLERR, Error::NOLASTLINE, + "Pair style hybrid/molecular is not compatible with manybody potentials"); PairHybridOverlay::init_style(); @@ -62,7 +65,9 @@ double PairHybridMolecular::init_one(int i, int j) // plus I,I and J,J need the same number of substyles if (setflag[i][j] == 0) { - if (nmap[i][i] != nmap[j][j]) error->one(FLERR, "All pair coeffs are not set"); + if (nmap[i][i] != nmap[j][j]) + error->one(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); int num = 0; for (int k = 0; k < nmap[i][i]; ++k) { for (int l = 0; l < nmap[j][j]; ++l) { @@ -73,7 +78,9 @@ double PairHybridMolecular::init_one(int i, int j) } } } - if (nmap[i][i] != nmap[i][j]) error->one(FLERR, "All pair coeffs are not set"); + if (nmap[i][i] != nmap[i][j]) + error->one(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); } nmap[j][i] = nmap[i][j]; diff --git a/src/pair_morse.cpp b/src/pair_morse.cpp index 83ca375818..48b8a046e3 100644 --- a/src/pair_morse.cpp +++ b/src/pair_morse.cpp @@ -17,6 +17,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -209,7 +210,9 @@ void PairMorse::coeff(int narg, char **arg) double PairMorse::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); morse1[i][j] = 2.0 * d0[i][j] * alpha[i][j]; diff --git a/src/pair_table.cpp b/src/pair_table.cpp index 730107c856..32186d0f36 100644 --- a/src/pair_table.cpp +++ b/src/pair_table.cpp @@ -21,6 +21,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "table_file_reader.h" @@ -341,7 +342,9 @@ void PairTable::coeff(int narg, char **arg) double PairTable::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); tabindex[j][i] = tabindex[i][j]; @@ -1035,7 +1038,9 @@ double PairTable::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, void *PairTable::extract(const char *str, int &dim) { if (strcmp(str, "cut_coul") != 0) return nullptr; - if (ntables == 0) error->all(FLERR, "All pair coeffs are not set"); + if (ntables == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); // only check for cutoff consistency if claiming to be KSpace compatible @@ -1043,7 +1048,8 @@ void *PairTable::extract(const char *str, int &dim) double cut_coul = tables[0].cut; for (int m = 1; m < ntables; m++) if (tables[m].cut != cut_coul) - error->all(FLERR, "Pair table cutoffs must all be equal to use with KSpace"); + error->all(FLERR, Error::NOLASTLINE, + "Pair table cutoffs must all be equal to use with KSpace"); dim = 0; return &tables[0].cut; } else From 73585e1dccba74bea161acb96ea2a16ed5e5349e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 21:17:00 -0400 Subject: [PATCH 21/99] revert broken change to print angstrom character --- doc/utils/sphinx-config/conf.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/utils/sphinx-config/conf.py.in b/doc/utils/sphinx-config/conf.py.in index 12e5c57f78..073143a7e9 100644 --- a/doc/utils/sphinx-config/conf.py.in +++ b/doc/utils/sphinx-config/conf.py.in @@ -288,7 +288,7 @@ rst_prolog = r""" .. only:: html - :math:`\renewcommand{\AA}{\textup{\r{A}}` + :math:`\renewcommand{\AA}{\text{â„«}}` .. role:: lammps(code) :language: LAMMPS From 035aefcc263ac725684b9f5206779fb013192e28 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 21:38:18 -0400 Subject: [PATCH 22/99] address issues flagged by coverity scan --- src/BPM/bond_bpm_spring_plastic.cpp | 4 ++-- src/EXTRA-COMPUTE/compute_stress_mop.cpp | 6 +----- src/fix_halt.cpp | 1 + src/utils.cpp | 8 +++++++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/BPM/bond_bpm_spring_plastic.cpp b/src/BPM/bond_bpm_spring_plastic.cpp index 35df659992..5f22fb41b8 100644 --- a/src/BPM/bond_bpm_spring_plastic.cpp +++ b/src/BPM/bond_bpm_spring_plastic.cpp @@ -440,7 +440,7 @@ double BondBPMSpringPlastic::single(int type, double rsq, int i, int j, double & double r = sqrt(rsq); double rinv = 1.0 / r; - double e = (r - r0) / r0; + double e = (r0 != 0.0) ? (r - r0) / r0 : 0.0; if (normalize_flag) fforce = -k[type] * (e - ep); @@ -460,7 +460,7 @@ double BondBPMSpringPlastic::single(int type, double rsq, int i, int j, double & fforce *= rinv; if (smooth_flag) { - double smooth = (r - r0) / (r0 * ecrit[type]); + double smooth = (r0 != 0.0) ? (r - r0) / (r0 * ecrit[type]) : 0.0; smooth *= smooth; smooth *= smooth; smooth *= smooth; diff --git a/src/EXTRA-COMPUTE/compute_stress_mop.cpp b/src/EXTRA-COMPUTE/compute_stress_mop.cpp index 4dcab3e322..6f96debd40 100644 --- a/src/EXTRA-COMPUTE/compute_stress_mop.cpp +++ b/src/EXTRA-COMPUTE/compute_stress_mop.cpp @@ -882,7 +882,7 @@ void ComputeStressMop::compute_dihedrals() double x_atom_4[3] = {0.0, 0.0, 0.0}; // initialization - for (int i = 0; i < nvalues; i++) { dihedral_local[i] = 0.0; } + for (int i = 0; i < nvalues; i++) dihedral_local[i] = 0.0; double local_contribution[3] = {0.0, 0.0, 0.0}; for (atom2 = 0; atom2 < nlocal; atom2++) { @@ -1118,10 +1118,6 @@ void ComputeStressMop::compute_dihedrals() df[2] = sgn * (f1[2] + f3[2]); } - // no if matches - else { - df[0] = df[1] = df[2] = 0.0; - } local_contribution[0] += df[0] / area * nktv2p; local_contribution[1] += df[1] / area * nktv2p; local_contribution[2] += df[2] / area * nktv2p; diff --git a/src/fix_halt.cpp b/src/fix_halt.cpp index 2139242169..a1cd921cd4 100644 --- a/src/fix_halt.cpp +++ b/src/fix_halt.cpp @@ -294,6 +294,7 @@ void FixHalt::end_of_step() for (int i = 0; i < universe->nworlds; ++i) { if (universe->me == universe->root_proc[i]) continue; MPI_Wait(req + i, MPI_STATUS_IGNORE); + MPI_Request_free(req + i); } } diff --git a/src/utils.cpp b/src/utils.cpp index 8ab757ac44..3ed67e59c6 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -281,7 +281,13 @@ void utils::fmtargs_print(FILE *fp, fmt::string_view format, fmt::format_args ar std::string utils::errorurl(int errorcode) { - return fmt::format("\nFor more information see https://docs.lammps.org/err{:04d}", errorcode); + std::string url; + try { + url = fmt::format("\nFor more information see https://docs.lammps.org/err{:04d}", errorcode); + } catch (std::exception &) { + url = std::string("\nFor more information see https://docs.lammps.org/Errors_details.html"); + } + return url; } void utils::flush_buffers(LAMMPS *lmp) From afbae53a0aaeb19dd1b107b823dc1ec10967c14d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 16 Mar 2025 06:03:23 -0400 Subject: [PATCH 23/99] convert remaining errors to print coeff status --- src/ASPHERE/pair_line_lj.cpp | 16 +++++++++------ src/DPD-MESO/pair_mdpd_rhosum.cpp | 7 ++++--- src/EXTRA-PAIR/pair_born_coul_dsf.cpp | 6 ++++-- src/RHEO/pair_rheo.cpp | 5 ++++- src/SPH/pair_sph_heatconduction.cpp | 8 +++++--- src/SPH/pair_sph_idealgas.cpp | 8 +++++--- src/SPH/pair_sph_lj.cpp | 29 ++++----------------------- src/SPH/pair_sph_rhosum.cpp | 13 +++++++----- src/SPH/pair_sph_taitwater.cpp | 5 ++++- src/SPH/pair_sph_taitwater_morris.cpp | 10 ++++++--- src/angle.cpp | 9 +++++++-- src/bond.cpp | 9 +++++++-- src/dihedral.cpp | 10 +++++++-- src/improper.cpp | 10 +++++++-- 14 files changed, 85 insertions(+), 60 deletions(-) diff --git a/src/ASPHERE/pair_line_lj.cpp b/src/ASPHERE/pair_line_lj.cpp index a9db2a21ca..aa0a04954f 100644 --- a/src/ASPHERE/pair_line_lj.cpp +++ b/src/ASPHERE/pair_line_lj.cpp @@ -13,15 +13,17 @@ ------------------------------------------------------------------------- */ #include "pair_line_lj.h" -#include + #include "atom.h" #include "atom_vec_line.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" #include "error.h" +#include "force.h" +#include "info.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" +#include using namespace LAMMPS_NS; @@ -414,7 +416,9 @@ void PairLineLJ::init_style() double PairLineLJ::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); cutsubsq[i][j] = cutsub[i][j] * cutsub[i][j]; diff --git a/src/DPD-MESO/pair_mdpd_rhosum.cpp b/src/DPD-MESO/pair_mdpd_rhosum.cpp index 0e25b16352..7526ea75d7 100644 --- a/src/DPD-MESO/pair_mdpd_rhosum.cpp +++ b/src/DPD-MESO/pair_mdpd_rhosum.cpp @@ -25,6 +25,7 @@ #include "atom.h" #include "comm.h" #include "error.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -218,9 +219,9 @@ void PairMDPDRhoSum::coeff(int narg, char **arg) { ------------------------------------------------------------------------- */ double PairMDPDRhoSum::init_one(int i, int j) { - if (setflag[i][j] == 0) { - error->all(FLERR,"All pair mdpd/rhosum coeffs are not set"); - } + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, "All pair mdpd/rhosum coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; diff --git a/src/EXTRA-PAIR/pair_born_coul_dsf.cpp b/src/EXTRA-PAIR/pair_born_coul_dsf.cpp index e22b40c598..b7ca3ae841 100644 --- a/src/EXTRA-PAIR/pair_born_coul_dsf.cpp +++ b/src/EXTRA-PAIR/pair_born_coul_dsf.cpp @@ -279,7 +279,7 @@ void PairBornCoulDSF::coeff(int narg, char **arg) void PairBornCoulDSF::init_style() { if (!atom->q_flag) - error->all(FLERR,"Pair style born/coul/dsf requires atom attribute q"); + error->all(FLERR, Error::NOLASTLINE, "Pair style born/coul/dsf requires atom attribute q"); neighbor->add_request(this); @@ -296,7 +296,9 @@ void PairBornCoulDSF::init_style() double PairBornCoulDSF::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair coeffs are not set. Status:\n" + Info::get_pair_coeff_status(lmp)); double cut = MAX(cut_lj[i][j],cut_coul); cut_ljsq[i][j] = cut_lj[i][j] * cut_lj[i][j]; diff --git a/src/RHEO/pair_rheo.cpp b/src/RHEO/pair_rheo.cpp index 5e06c45a3c..be2dfc6ecf 100644 --- a/src/RHEO/pair_rheo.cpp +++ b/src/RHEO/pair_rheo.cpp @@ -28,6 +28,7 @@ #include "fix_rheo.h" #include "fix_rheo_pressure.h" #include "force.h" +#include "info.h" #include "math_extra.h" #include "memory.h" #include "modify.h" @@ -527,7 +528,9 @@ void PairRHEO::setup() double PairRHEO::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR, "All pair rheo coeffs are not set"); + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, "All pair rheo coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); return cutk; } diff --git a/src/SPH/pair_sph_heatconduction.cpp b/src/SPH/pair_sph_heatconduction.cpp index 0bff61d190..bb163c0eff 100644 --- a/src/SPH/pair_sph_heatconduction.cpp +++ b/src/SPH/pair_sph_heatconduction.cpp @@ -18,6 +18,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -204,9 +205,10 @@ void PairSPHHeatConduction::coeff(int narg, char **arg) double PairSPHHeatConduction::init_one(int i, int j) { - if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/heatconduction coeffs are not set"); - } + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/heatconduction coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; alpha[j][i] = alpha[i][j]; diff --git a/src/SPH/pair_sph_idealgas.cpp b/src/SPH/pair_sph_idealgas.cpp index 97cbda2ab3..963579aee3 100644 --- a/src/SPH/pair_sph_idealgas.cpp +++ b/src/SPH/pair_sph_idealgas.cpp @@ -18,6 +18,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -243,9 +244,10 @@ void PairSPHIdealGas::coeff(int narg, char **arg) double PairSPHIdealGas::init_one(int i, int j) { - if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/idealgas coeffs are not set"); - } + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/idealgas coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; diff --git a/src/SPH/pair_sph_lj.cpp b/src/SPH/pair_sph_lj.cpp index 6f05c45638..533cd06a29 100644 --- a/src/SPH/pair_sph_lj.cpp +++ b/src/SPH/pair_sph_lj.cpp @@ -18,6 +18,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -256,7 +257,9 @@ void PairSPHLJ::coeff(int narg, char **arg) double PairSPHLJ::init_one(int i, int j) { if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/lj coeffs are not set"); + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/lj coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); } cut[j][i] = cut[i][j]; @@ -265,30 +268,6 @@ double PairSPHLJ::init_one(int i, int j) return cut[i][j]; } -/*double PairSPHLJ::LJEOS2(double rho, double e, double cv) { - - - double T = e / cv; - if (T < 1.e-2) T = 1.e-2; - //printf("%f %f\n", T, rho); - double iT = 0.1e1 / T; - //double itpow1_4 = exp(0.25 * log(iT)); //pow(iT, 0.1e1 / 0.4e1); - double itpow1_4 = pow(iT, 0.1e1 / 0.4e1); - double x = rho * itpow1_4; - double xsq = x * x; - double xpow3 = xsq * x; - double xpow4 = xsq * xsq; - double xpow9 = xpow3 * xpow3 * xpow3; - - - return (0.1e1 + rho * (0.3629e1 + 0.7264e1 * x + 0.104925e2 * xsq + 0.11460e2 - * xpow3 + 0.21760e1 * xpow9 - itpow1_4 * itpow1_4 * (0.5369e1 + 0.13160e2 - * x + 0.18525e2 * xsq - 0.17076e2 * xpow3 + 0.9320e1 * xpow4) + iT - * (-0.3492e1 + 0.18698e2 * x - 0.35505e2 * xsq + 0.31816e2 * xpow3 - - 0.11195e2 * xpow4)) * itpow1_4) * rho * T; -}*/ - - /* --------------------------------------------------------------------------------------------- */ /* Lennard-Jones EOS, Francis H. Ree diff --git a/src/SPH/pair_sph_rhosum.cpp b/src/SPH/pair_sph_rhosum.cpp index 97062b16c1..e4c2b7c918 100644 --- a/src/SPH/pair_sph_rhosum.cpp +++ b/src/SPH/pair_sph_rhosum.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "domain.h" #include "error.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" #include "neighbor.h" @@ -30,7 +31,8 @@ using namespace LAMMPS_NS; PairSPHRhoSum::PairSPHRhoSum(LAMMPS *lmp) : Pair(lmp) { if (atom->rho_flag != 1) - error->all(FLERR, "Pair sph/rhosum requires atom attribute density, e.g. in atom_style sph"); + error->all(FLERR, Error::NOLASTLINE, + "Pair sph/rhosum requires atom attribute density, e.g. in atom_style sph"); restartinfo = 0; @@ -206,7 +208,7 @@ void PairSPHRhoSum::allocate() void PairSPHRhoSum::settings(int narg, char **arg) { if (narg != 1) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Illegal number of arguments for pair_style sph/rhosum"); nstep = utils::inumeric(FLERR,arg[0],false,lmp); } @@ -247,9 +249,10 @@ void PairSPHRhoSum::coeff(int narg, char **arg) double PairSPHRhoSum::init_one(int i, int j) { - if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/rhosum coeffs are not set"); - } + if (setflag[i][j] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/rhosum coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); cut[j][i] = cut[i][j]; diff --git a/src/SPH/pair_sph_taitwater.cpp b/src/SPH/pair_sph_taitwater.cpp index 442ac833cb..892146f367 100644 --- a/src/SPH/pair_sph_taitwater.cpp +++ b/src/SPH/pair_sph_taitwater.cpp @@ -19,6 +19,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -264,7 +265,9 @@ void PairSPHTaitwater::coeff(int narg, char **arg) double PairSPHTaitwater::init_one(int i, int j) { if (setflag[i][j] == 0) { - error->all(FLERR, "All pair sph/taitwater coeffs are not set"); + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/taitwater coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); } cut[j][i] = cut[i][j]; diff --git a/src/SPH/pair_sph_taitwater_morris.cpp b/src/SPH/pair_sph_taitwater_morris.cpp index 48493a1e09..e05b7c1283 100644 --- a/src/SPH/pair_sph_taitwater_morris.cpp +++ b/src/SPH/pair_sph_taitwater_morris.cpp @@ -19,6 +19,7 @@ #include "domain.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neigh_list.h" @@ -31,7 +32,8 @@ using namespace LAMMPS_NS; PairSPHTaitwaterMorris::PairSPHTaitwaterMorris(LAMMPS *lmp) : Pair(lmp) { if ((atom->esph_flag != 1) || (atom->rho_flag != 1) || (atom->vest_flag != 1)) - error->all(FLERR, "Pair sph/taitwater/morris requires atom attributes energy, density, and velocity estimates, e.g. in atom_style sph"); + error->all(FLERR, Error::NOLASTLINE, "Pair sph/taitwater/morris requires atom attributes " + "energy, density, and velocity estimates, e.g. in atom_style sph"); restartinfo = 0; first = 1; @@ -214,7 +216,7 @@ void PairSPHTaitwaterMorris::allocate() void PairSPHTaitwaterMorris::settings(int narg, char **/*arg*/) { if (narg != 0) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Illegal number of arguments for pair_style sph/taitwater/morris"); } @@ -265,7 +267,9 @@ void PairSPHTaitwaterMorris::coeff(int narg, char **arg) double PairSPHTaitwaterMorris::init_one(int i, int j) { if (setflag[i][j] == 0) { - error->all(FLERR,"All pair sph/taitwater/morris coeffs are not set"); + error->all(FLERR, Error::NOLASTLINE, + "All pair sph/taitwater/morris coeffs are not set. Status:\n" + + Info::get_pair_coeff_status(lmp)); } cut[j][i] = cut[i][j]; diff --git a/src/angle.cpp b/src/angle.cpp index ccb53dc84f..2bbe8eb129 100644 --- a/src/angle.cpp +++ b/src/angle.cpp @@ -17,6 +17,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "math_const.h" #include "memory.h" #include "suffix.h" @@ -70,9 +71,13 @@ Angle::~Angle() void Angle::init() { - if (!allocated && atom->nangletypes) error->all(FLERR, "Angle coeffs are not set"); + if (!allocated && atom->nangletypes) + error->all(FLERR, Error::NOLASTLINE, + "Angle coeffs are not set. Status:\n" + Info::get_angle_coeff_status(lmp)); for (int i = 1; i <= atom->nangletypes; i++) - if (setflag[i] == 0) error->all(FLERR, "All angle coeffs are not set"); + if (setflag[i] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All angle coeffs are not set. Status:\n" + Info::get_angle_coeff_status(lmp)); init_style(); } diff --git a/src/bond.cpp b/src/bond.cpp index d42dd6fd24..802ac2b6c1 100644 --- a/src/bond.cpp +++ b/src/bond.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "neighbor.h" #include "safe_pointers.h" @@ -80,9 +81,13 @@ Bond::~Bond() void Bond::init() { - if (!allocated && atom->nbondtypes) error->all(FLERR, "Bond coeffs are not set"); + if (!allocated && atom->nbondtypes) + error->all(FLERR, Error::NOLASTLINE, + "Bond coeffs are not set. Status:\n" + Info::get_bond_coeff_status(lmp)); for (int i = 1; i <= atom->nbondtypes; i++) - if (setflag[i] == 0) error->all(FLERR, "All bond coeffs are not set"); + if (setflag[i] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All bond coeffs are not set. Status:\n" + Info::get_bond_coeff_status(lmp)); init_style(); } diff --git a/src/dihedral.cpp b/src/dihedral.cpp index 2f591b1fc1..14b59d2542 100644 --- a/src/dihedral.cpp +++ b/src/dihedral.cpp @@ -17,6 +17,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "suffix.h" #include "update.h" @@ -68,9 +69,14 @@ Dihedral::~Dihedral() void Dihedral::init() { - if (!allocated && atom->ndihedraltypes) error->all(FLERR, "Dihedral coeffs are not set"); + if (!allocated && atom->ndihedraltypes) + error->all(FLERR, Error::NOLASTLINE, + "Dihedral coeffs are not set. Status:\n" + Info::get_dihedral_coeff_status(lmp)); for (int i = 1; i <= atom->ndihedraltypes; i++) - if (setflag[i] == 0) error->all(FLERR, "All dihedral coeffs are not set"); + if (setflag[i] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All dihedral coeffs are not set. Status:\n" + + Info::get_dihedral_coeff_status(lmp)); init_style(); } diff --git a/src/improper.cpp b/src/improper.cpp index 3476bcdb50..02158dfff1 100644 --- a/src/improper.cpp +++ b/src/improper.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "info.h" #include "memory.h" #include "suffix.h" #include "update.h" @@ -67,9 +68,14 @@ Improper::~Improper() void Improper::init() { - if (!allocated && atom->nimpropertypes) error->all(FLERR, "Improper coeffs are not set"); + if (!allocated && atom->nimpropertypes) + error->all(FLERR, Error::NOLASTLINE, + "Improper coeffs are not set. Status:\n" + Info::get_improper_coeff_status(lmp)); for (int i = 1; i <= atom->nimpropertypes; i++) - if (setflag[i] == 0) error->all(FLERR, "All improper coeffs are not set"); + if (setflag[i] == 0) + error->all(FLERR, Error::NOLASTLINE, + "All improper coeffs are not set. Status:\n" + + Info::get_improper_coeff_status(lmp)); init_style(); } From d65b0ce6666e18c6a2b4ba5e0e4effa0e89759d8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 16 Mar 2025 17:25:55 -0400 Subject: [PATCH 24/99] update to WHAM version 2.1.0 --- tools/lammps-gui/CMakeLists.txt | 6 +- ...m-2.0.11.patch => update-wham-2.1.0.patch} | 366 +++--------------- 2 files changed, 62 insertions(+), 310 deletions(-) rename tools/lammps-gui/{update-wham-2.0.11.patch => update-wham-2.1.0.patch} (64%) diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index b09c6c26d9..e41cf90a78 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -94,8 +94,8 @@ endif() option(BUILD_WHAM "Download and compile WHAM executable from Grossfield Lab" YES) if(BUILD_WHAM) - set(WHAM_URL "http://membrane.urmc.rochester.edu/sites/default/files/wham/wham-release-2.0.11.tgz" CACHE STRING "URL for WHAM tarball") - set(WHAM_MD5 "f56751ac71a8d1c485b9ebd4ccff8dbe" CACHE STRING "MD5 checksum of WHAM tarball") + set(WHAM_URL "http://membrane.urmc.rochester.edu/sites/default/files/wham/wham-release-2.1.0.tgz" CACHE STRING "URL for WHAM tarball") + set(WHAM_MD5 "4ed6e24254925ec124f44bb381c3b87f" CACHE STRING "MD5 checksum of WHAM tarball") mark_as_advanced(WHAM_URL) mark_as_advanced(WHAM_MD5) @@ -122,7 +122,7 @@ if(BUILD_WHAM) if(PATCH_FOUND) message(STATUS "Apply patch to customize WHAM using ${Patch_EXECUTABLE}") execute_process( - COMMAND ${Patch_EXECUTABLE} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/update-wham-2.0.11.patch + COMMAND ${Patch_EXECUTABLE} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/update-wham-2.1.0.patch WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/_deps/src/wham/ ) endif() diff --git a/tools/lammps-gui/update-wham-2.0.11.patch b/tools/lammps-gui/update-wham-2.1.0.patch similarity index 64% rename from tools/lammps-gui/update-wham-2.0.11.patch rename to tools/lammps-gui/update-wham-2.1.0.patch index b884c25336..dff9dcffeb 100644 --- a/tools/lammps-gui/update-wham-2.0.11.patch +++ b/tools/lammps-gui/update-wham-2.1.0.patch @@ -1,73 +1,29 @@ -diff --git a/.gitignore b/.gitignore -index 28ac6ef..a401160 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -6,6 +6,8 @@ doc.toc - wham-dist.tar.gz - - *.o -+*~ - - wham/wham - wham-2d/wham-2d -+/build diff --git a/CMakeLists.txt b/CMakeLists.txt -new file mode 100644 -index 0000000..b4f0fe6 ---- /dev/null +index b4f0fe6..a61cec8 100644 +--- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -0,0 +1,38 @@ -+# Custom minimal -*- CMake -*- file for wham -+ -+cmake_minimum_required(VERSION 3.16) -+project(wham VERSION 2.0.11 -+ DESCRIPTION "WHAM: a fast, memory efficient implementation of the Weighted Histogram Analysis Method" -+ LANGUAGES C -+ HOMEPAGE_URL http://membrane.urmc.rochester.edu/content/wham/) -+ -+include(GNUInstallDirs) -+ -+add_executable(wham -+ nr/ran2.c -+ nr/locate.c -+ wham/wham.c -+ wham/file_read.c -+ wham/histogram.c -+ wham/bootstrap.c -+) -+target_include_directories(wham PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/wham) -+target_link_libraries(wham PRIVATE m) -+install(TARGETS wham DESTINATION ${CMAKE_INSTALL_BINDIR}) -+ -+add_executable(wham-2d -+ nr/ran2.c -+ nr/locate.c -+ wham-2d/wham-2d.c -+ wham-2d/file_read.c -+ wham-2d/histogram.c -+ wham/bootstrap.c -+) -+target_include_directories(wham-2d PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/wham) -+target_link_libraries(wham-2d PRIVATE m) -+install(TARGETS wham-2d DESTINATION ${CMAKE_INSTALL_BINDIR}) -+ -+install(FILES doc/doc.pdf -+ TYPE DOC -+ PERMISSIONS OWNER_READ GROUP_READ WORLD_READ -+) -diff --git a/nr/locate.c b/nr/locate.c -index 9f92dc0..f3bf294 100644 ---- a/nr/locate.c -+++ b/nr/locate.c -@@ -11,7 +11,7 @@ void locate(double xx[], int n, double x, int *j) - ascnd=(xx[n] > xx[0]); // I think this makes it zero based - while (ju-jl > 1) { - jm=(ju+jl) >> 1; -- if (x > xx[jm] == ascnd) -+ if ((x > xx[jm]) == ascnd) - jl=jm; - else - ju=jm; +@@ -1,7 +1,7 @@ + # Custom minimal -*- CMake -*- file for wham + + cmake_minimum_required(VERSION 3.16) +-project(wham VERSION 2.0.11 ++project(wham VERSION 2.1.0 + DESCRIPTION "WHAM: a fast, memory efficient implementation of the Weighted Histogram Analysis Method" + LANGUAGES C + HOMEPAGE_URL http://membrane.urmc.rochester.edu/content/wham/) +diff --git a/doc/doc.tex b/doc/doc.tex +index cf36616..84ee891 100644 +--- a/doc/doc.tex ++++ b/doc/doc.tex +@@ -53,7 +53,7 @@ Suggestions and patches are welcome. + + + \subsection{New in release 2.1.0} +-Two changes, both contributed by Alex Kohlmeyer. First, we switched from old ++Two changes, both contributed by Axel Kohlmeyer. First, we switched from old + make to CMake for the build. Second, we changed how energy units are set; where + it used to be a compile-time option, now it is set on the command line. + diff --git a/wham-2d/histogram.c b/wham-2d/histogram.c index 1bd1329..b5d1c01 100644 --- a/wham-2d/histogram.c @@ -127,99 +83,10 @@ index 1bd1329..b5d1c01 100644 - - diff --git a/wham-2d/wham-2d.c b/wham-2d/wham-2d.c -index fb6e059..a6b8483 100644 +index 76389ac..05fe7cf 100644 --- a/wham-2d/wham-2d.c +++ b/wham-2d/wham-2d.c -@@ -25,7 +25,7 @@ - #include - #include "wham-2d.h" - --#define COMMAND_LINE "Command line: wham-2d Px[=0|pi|val] hist_min_x hist_max_x num_bins_x Py[=0|pi|val] hist_min_y hist_max_y num_bins_y tol temperature numpad metadatafile freefile use_mask\n" -+#define COMMAND_LINE "Command line: wham-2d [units ] Px[=0|pi|val] hist_min_x hist_max_x num_bins_x Py[=0|pi|val] hist_min_y hist_max_y num_bins_y tol temperature numpad metadatafile freefile use_mask\n" - double HIST_MAXx,HIST_MINx,BIN_WIDTHx; - double HIST_MAXy,HIST_MINy,BIN_WIDTHy; - double TOL; -@@ -35,7 +35,7 @@ int NUM_BINSx, NUM_BINSy; - int PERIODICx, PERIODICy; - double PERIODx, PERIODy; - double *data1,**num,***bias; -- -+double k_B = k_B_DEFAULT; - - int main(int argc, char *argv[]) - { -@@ -57,7 +57,7 @@ double sum; - int iteration; - int max_iteration = 100000; - int numpad; --int **mask; -+int **mask = NULL; - int use_mask; - - cpu1 = ((double) clock())/CLOCKS_PER_SEC; -@@ -76,6 +76,61 @@ for (i=0; i] [P|Ppi|Pval] hist_min hist_max num_bins tol temperature numpad metadatafile freefile [num_MC_trials randSeed]\n" - - double HIST_MAX,HIST_MIN,BIN_WIDTH,TOL; - double *HISTOGRAM; -@@ -29,6 +29,7 @@ double kT; - int NUM_BINS; - int PERIODIC; - double PERIOD; -+double k_B = k_B_DEFAULT; - - int main(int argc, char *argv[]) - { -@@ -41,7 +42,7 @@ int first; - int bin_min; +@@ -39,10 +39,9 @@ double kT; // temperature + int i,j; + int len; + int first; +-int bin_min; int have_energy; char *freefile; -FILE *METAFILE, *FREEFILE; @@ -467,69 +296,7 @@ index 487871b..edb8125 100644 struct hist_group *hist_group; struct histogram *hp; double coor; -@@ -82,6 +83,61 @@ for (i=0; inum_windows); +@@ -304,7 +303,7 @@ assert(i == hist_group->num_windows); // Figure out if we have trajectories at different temperatures. // Missing temperatures are set to -1 in read_metadata, and // since we require that either all trajectories specify a temperature @@ -563,7 +330,7 @@ index 487871b..edb8125 100644 // have to check one of them if (hist_group->kT[0] > 0) { -@@ -257,7 +313,7 @@ if (hist_group->kT[0] > 0) +@@ -313,7 +312,7 @@ if (hist_group->kT[0] > 0) else { have_energy = 0; @@ -572,7 +339,7 @@ index 487871b..edb8125 100644 { hist_group->kT[i] = kT; } -@@ -269,7 +325,7 @@ if (!final_f) +@@ -325,7 +324,7 @@ if (!final_f) { printf("couldn't allocate space for final_f: %s\n", strerror(errno)); exit(errno); @@ -581,7 +348,7 @@ index 487871b..edb8125 100644 free(HISTOGRAM); -@@ -305,7 +361,8 @@ while (! is_converged(hist_group) || first ) +@@ -361,7 +360,8 @@ while (! is_converged(hist_group) || first ) for (i=0; i< NUM_BINS; i++) { coor = calc_coor(i); @@ -591,7 +358,7 @@ index 487871b..edb8125 100644 } printf("\n"); -@@ -319,7 +376,7 @@ while (! is_converged(hist_group) || first ) +@@ -375,7 +375,7 @@ while (! is_converged(hist_group) || first ) } } // Cheesy bailout if we're going on too long @@ -600,7 +367,16 @@ index 487871b..edb8125 100644 { printf("Too many iterations: %d\n", iteration); break; -@@ -383,11 +440,11 @@ for (i=0; i< num_mc_runs; i++) +@@ -408,7 +408,7 @@ for (i=0; i < NUM_BINS; i++) + } + + // Compute the free energy from the normalized probability +-bin_min = calc_free(free_ene, prob,kT); ++ calc_free(free_ene, prob,kT); + + // Do the requested number of bootstrap monte carlo error analysis runs. + if (num_mc_runs <= 0) +@@ -439,11 +439,11 @@ for (i=0; i< num_mc_runs; i++) //printf("Faking %d: %d %d\n", i,j,hp->num_points); num_used = hp->last - hp->first + 1; mk_new_hist(hp->cum, hp->data, num_used, hp->num_mc_samples, &idum); @@ -614,7 +390,7 @@ index 487871b..edb8125 100644 // perform WHAM iterations on the fake data sets iteration = 0; first = 1; -@@ -403,7 +460,7 @@ for (i=0; i< num_mc_runs; i++) +@@ -459,7 +459,7 @@ for (i=0; i< num_mc_runs; i++) printf("Too many iterations: %d\n", iteration); break; } @@ -623,7 +399,7 @@ index 487871b..edb8125 100644 printf("#MC trial %d: %d iterations\n", i, iteration); printf("#PMF values\n"); // accumulate the average and stdev of the resulting probabilities -@@ -419,18 +476,19 @@ for (i=0; i< num_mc_runs; i++) +@@ -475,18 +475,19 @@ for (i=0; i< num_mc_runs; i++) for (j=0; j < NUM_BINS; j++) { pdf = -kT*log(prob[j]); @@ -647,7 +423,7 @@ index 487871b..edb8125 100644 for (i=0; i < NUM_BINS; i++) { ave_p[i] /= (double)num_mc_runs; -@@ -457,12 +515,12 @@ if (!FREEFILE) +@@ -513,12 +514,12 @@ if (!FREEFILE) for (i=0; i< NUM_BINS; i++) { coor = calc_coor(i); @@ -663,7 +439,7 @@ index 487871b..edb8125 100644 } exit(errno); -@@ -470,38 +528,37 @@ if (!FREEFILE) +@@ -526,38 +527,37 @@ if (!FREEFILE) else { // write out header @@ -714,7 +490,7 @@ index 487871b..edb8125 100644 } } -@@ -515,7 +572,7 @@ exit(0); +@@ -571,7 +571,7 @@ exit(0); /* * Perform a single WHAM iteration */ @@ -723,7 +499,7 @@ index 487871b..edb8125 100644 int have_energy) { int i,j; -@@ -535,9 +592,9 @@ for (i=0; ihists[j]),i); bias = calc_bias(hist_group,j,coor); bf = exp((hist_group->F_old[j] - bias) / hist_group->kT[j]); @@ -736,27 +512,3 @@ index 487871b..edb8125 100644 * number of points. */ if (have_energy) -diff --git a/wham/wham.h b/wham/wham.h -index aacc1e8..7d509f2 100644 ---- a/wham/wham.h -+++ b/wham/wham.h -@@ -15,14 +15,16 @@ extern double kT; - extern int NUM_BINS; - extern int PERIODIC; - extern double PERIOD; -+extern double k_B; -+ - - // Some predefined periodic units - #define DEGREES 360.0 - #define RADIANS 6.28318530717959 - --#define k_B 0.001982923700 // Boltzmann's constant in kcal/mol K --//#define k_B 0.0083144621 // Boltzmann's constant kJ/mol-K --//#define k_B 1.0 // Boltzmann's constant in reduced units -+#define k_B_DEFAULT 0.001982923700 // Boltzmann's constant in kcal/mol K -+//#define k_B_DEFAULT 0.0083144621 // Boltzmann's constant kJ/mol-K -+//#define k_B_DEFAULT 1.0 // Boltzmann's constant in reduced units - - - // global (untrimmed) histogram, global to prevent reallocation From 368e0a22a04904016d5f8fd2f0b982752db68a8e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 16 Mar 2025 19:21:08 -0400 Subject: [PATCH 25/99] adding WHAM dialog is postponed --- tools/lammps-gui/lammps-gui.appdata.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/lammps-gui/lammps-gui.appdata.xml b/tools/lammps-gui/lammps-gui.appdata.xml index 64d8892956..95032b961d 100644 --- a/tools/lammps-gui/lammps-gui.appdata.xml +++ b/tools/lammps-gui/lammps-gui.appdata.xml @@ -61,7 +61,6 @@ Highlight warnings and error messages in Output window Make Tutorial wizards more compact Include download and compilation of WHAM software from Alan Grossfield - Add dialog to run WHAM directly from LAMMPS-GUI Add entry to Run menu to restart the LAMMPS instance Use mutex to avoid corruption of thermo data From 0a7b528d396bad365a5ace8d7a2030aa30e44738 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 11:01:16 -0400 Subject: [PATCH 26/99] don't silence format errors --- src/utils.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 3ed67e59c6..f6208acb58 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -272,11 +272,7 @@ void utils::print(FILE *fp, const std::string &mesg) void utils::fmtargs_print(FILE *fp, fmt::string_view format, fmt::format_args args) { - try { - print(fp, fmt::vformat(format, args)); - } catch (fmt::format_error &) { - ; // do nothing - } + print(fp, fmt::vformat(format, args)); } std::string utils::errorurl(int errorcode) From d42330edbd3052ee805dca32dfa52917d44cba07 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 11:40:36 -0400 Subject: [PATCH 27/99] consolidate errors #6 and #7 plus handle non-numeric box. add missing entries. --- doc/src/Errors_details.rst | 28 +++++++++++++++++----------- src/BOCS/fix_bocs.cpp | 4 ++-- src/DRUDE/fix_tgnh_drude.cpp | 4 ++-- src/EXTRA-FIX/fix_npt_cauchy.cpp | 4 ++-- src/INTEL/pppm_disp_intel.cpp | 2 +- src/INTEL/pppm_intel.cpp | 2 +- src/KOKKOS/pppm_kokkos.cpp | 2 +- src/KSPACE/msm.cpp | 2 +- src/KSPACE/msm_cg.cpp | 2 +- src/KSPACE/pppm.cpp | 2 +- src/KSPACE/pppm_cg.cpp | 2 +- src/KSPACE/pppm_disp.cpp | 2 +- src/KSPACE/pppm_disp_tip4p.cpp | 2 +- src/KSPACE/pppm_stagger.cpp | 2 +- src/KSPACE/pppm_tip4p.cpp | 2 +- src/OPENMP/domain_omp.cpp | 2 +- src/OPENMP/msm_cg_omp.cpp | 2 +- src/OPENMP/pppm_disp_tip4p_omp.cpp | 2 +- src/OPENMP/pppm_tip4p_omp.cpp | 2 +- src/fix_box_relax.cpp | 4 ++-- src/fix_nh.cpp | 4 ++-- src/npair.cpp | 4 ++-- 22 files changed, 44 insertions(+), 38 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index d0e6233fb2..aebdcebdbe 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -372,20 +372,22 @@ warning or turned off using the *lost/bond* keyword in the :doc:`thermo_modify .. _err0006: -Non-numeric atom coords - simulation unstable ---------------------------------------------- -This error usually occurs due to issues with system geometry or the potential in -use. See :ref:`Pressure, forces, positions becoming NaN or Inf ` above in the -general troubleshooting section. +Non-numeric atom coords or pressure or box dimensions - simulation unstable +--------------------------------------------------------------------------- -.. _err0007: +This kind of error usually occurs due to issues with system geometry or +the potential in use, or too aggressive simulation settings. See +:ref:`Pressure, forces, positions becoming NaN or Inf ` above in +the general troubleshooting section. It is more likely to happen during +equilibration, so it can help to do a minimization before or even add a +second or third minimization after running a few equilibration MD steps. +It also is more likely when using a Nose-Hoover barostat directly, and +thus it may be advisable to run with only a thermostat for a bit until +the potential energy has stabilized. -Non-numeric pressure - simulation unstable ------------------------------------------- -This error usually occurs due to issues with system geometry or the potential in -use. See :ref:`Pressure, forces, positions becoming NaN or Inf ` above in the -general troubleshooting section. +.. _err007: +.. currently unused .. _err0008: @@ -436,6 +438,10 @@ If this error is occurring with an executable that the user does not control (e.g., through a module on HPC clusters), the user will need to get in contact with the relevant person or people who can update the executable. +.. _err011: + +.. currently unused + .. _err0012: fmt::format_error diff --git a/src/BOCS/fix_bocs.cpp b/src/BOCS/fix_bocs.cpp index 0c4d6a41ad..80c6789575 100644 --- a/src/BOCS/fix_bocs.cpp +++ b/src/BOCS/fix_bocs.cpp @@ -1089,7 +1089,7 @@ void FixBocs::couple() } if (!std::isfinite(p_current[0]) || !std::isfinite(p_current[1]) || !std::isfinite(p_current[2])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); // switch order from xy-xz-yz to Voigt @@ -1099,7 +1099,7 @@ void FixBocs::couple() p_current[5] = tensor[3]; if (!std::isfinite(p_current[3]) || !std::isfinite(p_current[4]) || !std::isfinite(p_current[5])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); } } diff --git a/src/DRUDE/fix_tgnh_drude.cpp b/src/DRUDE/fix_tgnh_drude.cpp index 503cac604a..fa6dbb62fd 100644 --- a/src/DRUDE/fix_tgnh_drude.cpp +++ b/src/DRUDE/fix_tgnh_drude.cpp @@ -1063,7 +1063,7 @@ void FixTGNHDrude::couple() } if (!std::isfinite(p_current[0]) || !std::isfinite(p_current[1]) || !std::isfinite(p_current[2])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); // switch order from xy-xz-yz to Voigt @@ -1073,7 +1073,7 @@ void FixTGNHDrude::couple() p_current[5] = tensor[3]; if (!std::isfinite(p_current[3]) || !std::isfinite(p_current[4]) || !std::isfinite(p_current[5])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); } } diff --git a/src/EXTRA-FIX/fix_npt_cauchy.cpp b/src/EXTRA-FIX/fix_npt_cauchy.cpp index e94177233f..bb5d863e5d 100644 --- a/src/EXTRA-FIX/fix_npt_cauchy.cpp +++ b/src/EXTRA-FIX/fix_npt_cauchy.cpp @@ -1036,7 +1036,7 @@ void FixNPTCauchy::couple() } if (!std::isfinite(p_current[0]) || !std::isfinite(p_current[1]) || !std::isfinite(p_current[2])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); // switch order from xy-xz-yz to Voigt @@ -1046,7 +1046,7 @@ void FixNPTCauchy::couple() p_current[5] = tensor[3]; if (!std::isfinite(p_current[3]) || !std::isfinite(p_current[4]) || !std::isfinite(p_current[5])) - error->all(FLERR,"Non-numeric pressure - simulation unstable"); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); } } diff --git a/src/INTEL/pppm_disp_intel.cpp b/src/INTEL/pppm_disp_intel.cpp index 8053036112..8816ed553b 100644 --- a/src/INTEL/pppm_disp_intel.cpp +++ b/src/INTEL/pppm_disp_intel.cpp @@ -723,7 +723,7 @@ void PPPMDispIntel::particle_map_intel(double delx, double dely, double delz, int nthr = comm->nthreads; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; diff --git a/src/INTEL/pppm_intel.cpp b/src/INTEL/pppm_intel.cpp index 8d46cc28e9..8b75b86e07 100644 --- a/src/INTEL/pppm_intel.cpp +++ b/src/INTEL/pppm_intel.cpp @@ -356,7 +356,7 @@ void PPPMIntel::particle_map(IntelBuffers *buffers) int flag = 0; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); #if defined(_OPENMP) #pragma omp parallel LMP_DEFAULT_NONE \ diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 34c3d7579e..40faaed8d5 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1138,7 +1138,7 @@ void PPPMKokkos::particle_map() k_flag.template sync(); if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index 72e35ae9f3..c4008967f8 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -1442,7 +1442,7 @@ void MSM::particle_map() int flag = 0; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR, Error::NOLASTLINE, "Non-numeric box dimensions - simulation unstable"); + error->one(FLERR, Error::NOLASTLINE, "Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); for (int i = 0; i < nlocal; i++) { diff --git a/src/KSPACE/msm_cg.cpp b/src/KSPACE/msm_cg.cpp index 60aebc0f60..62e23c564c 100644 --- a/src/KSPACE/msm_cg.cpp +++ b/src/KSPACE/msm_cg.cpp @@ -310,7 +310,7 @@ void MSMCG::particle_map() int i; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); for (int j = 0; j < num_charged; j++) { i = is_charged[j]; diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 611e29360b..aeaf53f4e1 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1803,7 +1803,7 @@ void PPPM::particle_map() int flag = 0; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); for (int i = 0; i < nlocal; i++) { diff --git a/src/KSPACE/pppm_cg.cpp b/src/KSPACE/pppm_cg.cpp index 5e244c8a37..5f474efd54 100644 --- a/src/KSPACE/pppm_cg.cpp +++ b/src/KSPACE/pppm_cg.cpp @@ -278,7 +278,7 @@ void PPPMCG::particle_map() double **x = atom->x; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; for (int j = 0; j < num_charged; j++) { diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index 8ff2ae2635..1e6aec5029 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -4227,7 +4227,7 @@ void PPPMDisp::particle_map(double delx, double dely, double delz, int nlocal = atom->nlocal; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; for (int i = 0; i < nlocal; i++) { diff --git a/src/KSPACE/pppm_disp_tip4p.cpp b/src/KSPACE/pppm_disp_tip4p.cpp index a07387443b..1542304e35 100644 --- a/src/KSPACE/pppm_disp_tip4p.cpp +++ b/src/KSPACE/pppm_disp_tip4p.cpp @@ -71,7 +71,7 @@ void PPPMDispTIP4P::particle_map_c(double delx, double dely, double delz, int nlocal = atom->nlocal; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; for (int i = 0; i < nlocal; i++) { diff --git a/src/KSPACE/pppm_stagger.cpp b/src/KSPACE/pppm_stagger.cpp index 4d0fb7f20a..4a1946e32b 100644 --- a/src/KSPACE/pppm_stagger.cpp +++ b/src/KSPACE/pppm_stagger.cpp @@ -674,7 +674,7 @@ void PPPMStagger::particle_map() int nlocal = atom->nlocal; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; for (int i = 0; i < nlocal; i++) { diff --git a/src/KSPACE/pppm_tip4p.cpp b/src/KSPACE/pppm_tip4p.cpp index 0ece29768e..d1e723a60f 100644 --- a/src/KSPACE/pppm_tip4p.cpp +++ b/src/KSPACE/pppm_tip4p.cpp @@ -68,7 +68,7 @@ void PPPMTIP4P::particle_map() int nlocal = atom->nlocal; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; for (int i = 0; i < nlocal; i++) { diff --git a/src/OPENMP/domain_omp.cpp b/src/OPENMP/domain_omp.cpp index 32eebe45e9..668a26ce78 100644 --- a/src/OPENMP/domain_omp.cpp +++ b/src/OPENMP/domain_omp.cpp @@ -55,7 +55,7 @@ void DomainOMP::pbc() #endif // clang-format on for (int i = 0; i < n3; i++) if (!std::isfinite(coord[i])) flag = 1; - if (flag) error->one(FLERR, "Non-numeric atom coords - simulation unstable"); + if (flag) error->one(FLERR, "Non-numeric atom coords - simulation unstable" + utils::errorurl(6)); auto *_noalias const x = (dbl3_t *) atom->x[0]; auto *_noalias const v = (dbl3_t *) atom->v[0]; diff --git a/src/OPENMP/msm_cg_omp.cpp b/src/OPENMP/msm_cg_omp.cpp index 111d2bf4e4..48ce876e1e 100644 --- a/src/OPENMP/msm_cg_omp.cpp +++ b/src/OPENMP/msm_cg_omp.cpp @@ -330,7 +330,7 @@ void MSMCGOMP::particle_map() int i; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR, Error::NOLASTLINE, "Non-numeric box dimensions - simulation unstable"); + error->one(FLERR, Error::NOLASTLINE, "Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); // XXX: O(N). is it worth to add OpenMP here? for (int j = 0; j < num_charged; j++) { diff --git a/src/OPENMP/pppm_disp_tip4p_omp.cpp b/src/OPENMP/pppm_disp_tip4p_omp.cpp index d3a9c9528c..a62e1cb6f3 100644 --- a/src/OPENMP/pppm_disp_tip4p_omp.cpp +++ b/src/OPENMP/pppm_disp_tip4p_omp.cpp @@ -354,7 +354,7 @@ void PPPMDispTIP4POMP::particle_map_c(double dxinv, double dyinv, const int nzhi_out = nzhi_o; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; #if defined(_OPENMP) diff --git a/src/OPENMP/pppm_tip4p_omp.cpp b/src/OPENMP/pppm_tip4p_omp.cpp index 640b7d4d35..167c722a0e 100644 --- a/src/OPENMP/pppm_tip4p_omp.cpp +++ b/src/OPENMP/pppm_tip4p_omp.cpp @@ -350,7 +350,7 @@ void PPPMTIP4POMP::particle_map() const int nlocal = atom->nlocal; if (!std::isfinite(boxlox) || !std::isfinite(boxloy) || !std::isfinite(boxloz)) - error->one(FLERR,"Non-numeric box dimensions - simulation unstable"); + error->one(FLERR,"Non-numeric box dimensions - simulation unstable" + utils::errorurl(6)); int flag = 0; #if defined(_OPENMP) diff --git a/src/fix_box_relax.cpp b/src/fix_box_relax.cpp index c8540e1d9c..3778847ef5 100644 --- a/src/fix_box_relax.cpp +++ b/src/fix_box_relax.cpp @@ -700,7 +700,7 @@ void FixBoxRelax::couple() } if (!std::isfinite(p_current[0]) || !std::isfinite(p_current[1]) || !std::isfinite(p_current[2])) - error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(7)); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); // switch order from xy-xz-yz to Voigt ordering @@ -710,7 +710,7 @@ void FixBoxRelax::couple() p_current[5] = tensor[3]; if (!std::isfinite(p_current[3]) || !std::isfinite(p_current[4]) || !std::isfinite(p_current[5])) - error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(7)); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); } } diff --git a/src/fix_nh.cpp b/src/fix_nh.cpp index d13ddcb819..7e7e6410a1 100644 --- a/src/fix_nh.cpp +++ b/src/fix_nh.cpp @@ -1045,7 +1045,7 @@ void FixNH::couple() } if (!std::isfinite(p_current[0]) || !std::isfinite(p_current[1]) || !std::isfinite(p_current[2])) - error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(7)); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); // switch order from xy-xz-yz to Voigt ordering @@ -1055,7 +1055,7 @@ void FixNH::couple() p_current[5] = tensor[3]; if (!std::isfinite(p_current[3]) || !std::isfinite(p_current[4]) || !std::isfinite(p_current[5])) - error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(7)); + error->all(FLERR,"Non-numeric pressure - simulation unstable" + utils::errorurl(6)); } } diff --git a/src/npair.cpp b/src/npair.cpp index c60d37208e..e1ceeb5c41 100644 --- a/src/npair.cpp +++ b/src/npair.cpp @@ -239,7 +239,7 @@ int NPair::exclusion(int i, int j, int itype, int jtype, int NPair::coord2bin(double *x, int &ix, int &iy, int &iz) { if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2])) - error->one(FLERR,"Non-numeric positions - simulation unstable" + utils::errorurl(7)); + error->one(FLERR,"Non-numeric positions - simulation unstable" + utils::errorurl(6)); if (x[0] >= bboxhi[0]) ix = static_cast ((x[0]-bboxhi[0])*bininvx) + nbinx; @@ -282,7 +282,7 @@ int NPair::coord2bin(double *x, int ic) int ibin; if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2])) - error->one(FLERR,"Non-numeric positions - simulation unstable" + utils::errorurl(7)); + error->one(FLERR,"Non-numeric positions - simulation unstable" + utils::errorurl(6)); if (x[0] >= bboxhi[0]) ix = static_cast ((x[0]-bboxhi[0])*bininvx_multi[ic]) + nbinx_multi[ic]; From 68c92f32675b627a92197fd023456443358843f5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 12:18:32 -0400 Subject: [PATCH 28/99] add new explanation for warning about multiple time integrations --- doc/src/Errors_details.rst | 12 ++++++++++++ src/modify.cpp | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index aebdcebdbe..31babe9bc6 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -868,3 +868,15 @@ keyword, LAMMPS stops with the 'Invalid thermo keyword' error. But it is also possible, that there is just a typo in the name of a valid variable function. Thus it is recommended to check the failing variable expression very carefully. + +.. _err0032: + +One or more atoms are time integrated more than once +---------------------------------------------------- + +This is probably an error since you typically do not want to advance the +positions or velocities of an atom more than once per timestep. This +typically happens when there are multiple fix commands that advance atom +positions with overlapping groups. Also, for some fix styles it is not +immediately obvious that they include time integration. Please check +the documentation carefully. diff --git a/src/modify.cpp b/src/modify.cpp index 9908b96d79..e571440ddd 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -295,7 +295,8 @@ void Modify::init() int checkall; MPI_Allreduce(&check, &checkall, 1, MPI_INT, MPI_SUM, world); if (comm->me == 0 && checkall) - error->warning(FLERR, "One or more atoms are time integrated more than once"); + error->warning(FLERR, "One or more atoms are time integrated more than once" + + utils::errorurl(32)); } /* ---------------------------------------------------------------------- From afaf440895d51f05db88bcfee5d406981cdb619c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 12:20:07 -0400 Subject: [PATCH 29/99] expand/clarify some discussions --- doc/src/Errors_details.rst | 71 +++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 31babe9bc6..6daf14f91a 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -395,44 +395,52 @@ Lost atoms ... -------------- A simulation stopping with an error due to lost atoms can have multiple -causes. In the majority of cases, lost atoms are unexpected and a result -of extremely high velocities causing instabilities in the system, and -those velocities can result from a variety of issues. For ideas on how -to track down issues with unexpected lost atoms, see :ref:`Fast moving -atoms ` and :ref:`Neighbor list settings ` in the -general troubleshooting section above. In specific situations however, -losing atoms is expected material behavior (e.g. with sputtering and -surface evaporation simulations) and an unwanted crash can be resolved -by changing the :doc:`thermo_modify lost ` keyword from -the default 'error' to 'warn' or 'ignore' (though heed the advice in -:ref:`Ignoring lost atoms ` above!). +causes. By default, LAMMPS checks for whether the total number of atoms +is consistent with the sum of atoms "owned" by MPI processors every time +that thermodynamic output is written. In the majority of cases, lost +atoms are unexpected and a result of extremely high velocities causing +instabilities in the system, and those velocities can result from a +variety of issues. For ideas on how to track down issues with +unexpected lost atoms, see :ref:`Fast moving atoms ` and +:ref:`Neighbor list settings ` in the general troubleshooting +section above. In specific situations however, losing atoms is expected +material behavior (e.g. with sputtering and surface evaporation +simulations) and an unwanted crash can be resolved by changing the +:doc:`thermo_modify lost ` keyword from the default +'error' to 'warn' or 'ignore' (though heed the advice in :ref:`Ignoring +lost atoms ` above!). .. _err0009: Too many neighbor bins ---------------------- -The simulation box has become too large relative to the size of a -neighbor bin and LAMMPS is unable to store the needed number of -bins. This typically implies the simulation box has expanded too far. -This can happen when some atoms move rapidly apart with shrink-wrap boundaries -or when a fix (like fix deform or a barostat) excessively grows the simulation -box. +The simulation box is or has become too large relative to the size of a +neighbor bin (which in turn depends on the largest pair-wise cutoff by +default) and LAMMPS is unable to store the needed number of bins. This +typically implies the simulation box has expanded too far. That can +happen when some atoms move rapidly apart with shrink-wrap boundaries or +when a fix (like fix deform or a barostat) excessively grows the +simulation box. This can also happen, if the largest pair-wise cutoff +is small. In this case, the error can be avoided by using the +:doc:`neigh_modify command ` to set the bin width to a +suitably large value. .. _err0010: -Unrecognized pair style ... is part of ... package which is not enabled in this LAMMPS binary ---------------------------------------------------------------------------------------------- +Unrecognized ... style ... is part of ... package which is not enabled in this LAMMPS binary +-------------------------------------------------------------------------------------------- -The LAMMPS executable (binary) being used was not compiled with a package -containing the specified pair style. This indicates that the executable needs to -be re-built after enabling the correct package in the relevant Makefile or CMake -build directory. See :doc:`Section 3. Build LAMMPS ` for more details. -One can check if the expected package and pair style is present in the -executable by running it with the ``-help`` (or ``-h``) flag on the command -line. One common oversight, especially for beginner LAMMPS users, is to enable -the package, but to forget to run commands to rebuild (e.g., to run the final -``make`` or ``cmake`` command). +The LAMMPS executable (binary) being used was not compiled with a +package containing the specified style. This indicates that the +executable needs to be re-built after enabling the correct package in +the relevant Makefile or CMake build directory. See +:doc:`Section 3. Build LAMMPS ` for more details. One can check +if the expected package and pair style is present in the executable by +running it with the ``-help`` (or ``-h``) flag on the command line. One +common oversight, especially for beginner LAMMPS users, is to enable the +package, but to forget to run commands to rebuild (e.g., to run the +final ``make`` or ``cmake`` command). If this error is occurring with an executable that the user does not control (e.g., through a module on HPC clusters), the user will need to get in contact @@ -770,9 +778,10 @@ with periodic boundaries or larger than the box with non-periodic boundaries. It means that the positions and image flags have become inconsistent. LAMMPS will still compute bonded interactions based on the closest periodic images of the atoms and thus in most cases the -results will be correct. Nevertheless, it is good practice to update -the system so that the message does not appear. It will help with -future manipulations of the system. +results will be correct. However they can cause problems when such +atoms are used with the fix rigid or replicate commands. Thus, it is +good practice to update the system so that the message does not appear. +It will help with future manipulations of the system. There is one case where this warning *must* appear: when you have a chain of connected bonds that pass through the entire box and connect From aee02c7ed4fa4b86d63a8b02dace0bbbbe07cbbd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 12:20:30 -0400 Subject: [PATCH 30/99] remove entries that are now covered by Errors_details.rst --- doc/src/Errors_messages.rst | 261 ------------------------------------ doc/src/Errors_warnings.rst | 21 --- 2 files changed, 282 deletions(-) diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index a63d72b027..776207fb05 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -74,18 +74,6 @@ Please also see the page with :doc:`Warning messages `. a particular processor. The pairwise cutoff is too short or the atoms are too far apart to make a valid angle. -*Angle atoms %d %d %d missing on proc %d at step %ld* - One or more of three atoms needed to compute a particular angle are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the angle has blown apart and an atom is - too far away. - -*Angle atoms missing on proc %d at step %ld* - One or more of three atoms needed to compute a particular angle are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the angle has blown apart and an atom is - too far away. - *Angle coeff for hybrid has invalid style* Angle style hybrid uses another angle style as one of its coefficients. The angle style used in the angle_coeff command or read @@ -305,26 +293,11 @@ Please also see the page with :doc:`Warning messages `. bond on a particular processor. The pairwise cutoff is too short or the atoms are too far apart to make a valid bond. -*Bond atom missing in image check* - The second atom in a particular bond is missing on this processor. - Typically this is because the pairwise cutoff is set too short or the - bond has blown apart and an atom is too far away. - *Bond atom missing in set command* The set command cannot find one or more atoms in a particular bond on a particular processor. The pairwise cutoff is too short or the atoms are too far apart to make a valid bond. -*Bond atoms %d %d missing on proc %d at step %ld* - The second atom needed to compute a particular bond is missing on this - processor. Typically this is because the pairwise cutoff is set too - short or the bond has blown apart and an atom is too far away. - -*Bond atoms missing on proc %d at step %ld* - The second atom needed to compute a particular bond is missing on this - processor. Typically this is because the pairwise cutoff is set too - short or the bond has blown apart and an atom is too far away. - *Bond coeff for hybrid has invalid style* Bond style hybrid uses another bond style as one of its coefficients. The bond style used in the bond_coeff command or read from a restart @@ -1070,11 +1043,6 @@ Please also see the page with :doc:`Warning messages `. This is a current limitation of the GPU implementation in LAMMPS. -*Cannot use neighbor bins - box size << cutoff* - Too many neighbor bins will be created. This typically happens when - the simulation box is very small in some dimension, compared to the - neighbor cutoff. Use the "nsq" style instead of "bin" style. - *Cannot use non-zero forces in an energy minimization* Fix setforce cannot be used in this manner. Use fix addforce instead. @@ -1217,12 +1185,6 @@ Please also see the page with :doc:`Warning messages `. *Compute chunk/atom bin/sphere radius is too large for periodic box* Radius cannot be bigger than 1/2 of any periodic dimension. -*Compute chunk/atom compute array is accessed out-of-range* - The index for the array is out of bounds. - -*Compute chunk/atom fix array is accessed out-of-range* - The index for the array is out of bounds. - *Compute chunk/atom ids once but nchunk is not once* You cannot assign chunks IDs to atom permanently if the number of chunks may change. @@ -1333,30 +1295,12 @@ Please also see the page with :doc:`Warning messages `. Only inputs that generate the same number of datums can be used together. E.g. bond and angle quantities cannot be mixed. -*Compute reduce compute array is accessed out-of-range* - An index for the array is out of bounds. - *Compute reduce compute calculates global values* A compute that calculates peratom or local values is required. -*Compute reduce fix array is accessed out-of-range* - An index for the array is out of bounds. - *Compute reduce fix calculates global values* A fix that calculates peratom or local values is required. -*Compute slice compute array is accessed out-of-range* - An index for the array is out of bounds. - -*Compute slice compute vector is accessed out-of-range* - The index for the vector is out of bounds. - -*Compute slice fix array is accessed out-of-range* - An index for the array is out of bounds. - -*Compute slice fix vector is accessed out-of-range* - The index for the vector is out of bounds. - *Compute stress/atom temperature ID does not compute temperature* The specified compute must compute temperature. @@ -1654,11 +1598,6 @@ Please also see the page with :doc:`Warning messages `. *Delete_bonds command with no atoms existing* No atoms are yet defined so the delete_bonds command cannot be used. -*Did not assign all atoms correctly* - Atoms read in from a data file were not assigned correctly to - processors. This is likely due to some atom coordinates being - outside a non-periodic simulation box. - *Did not assign all restart atoms correctly* Atoms read in from the restart file were not assigned correctly to processors. This is likely due to some atom coordinates being outside @@ -1697,18 +1636,6 @@ Please also see the page with :doc:`Warning messages `. on a particular processor. The pairwise cutoff is too short or the atoms are too far apart to make a valid dihedral. -*Dihedral atoms %d %d %d %d missing on proc %d at step %ld* - One or more of 4 atoms needed to compute a particular dihedral are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the dihedral has blown apart and an atom is - too far away. - -*Dihedral atoms missing on proc %d at step %ld* - One or more of 4 atoms needed to compute a particular dihedral are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the dihedral has blown apart and an atom is - too far away. - *Dihedral charmm is incompatible with Pair style* Dihedral style charmm must be used with a pair style charmm in order for the 1-4 epsilon/sigma parameters to be defined. @@ -1769,11 +1696,6 @@ Please also see the page with :doc:`Warning messages `. This should not normally occur. It is likely a problem with your model. -*Domain too large for neighbor bins* - The domain has become extremely large so that neighbor bins cannot be - used. Most likely, one or more atoms have been blown out of the - simulation box to a great distance. - *Dump atom/gz only writes compressed files* The dump atom/gz output file name must have a .gz suffix. @@ -1855,11 +1777,6 @@ Please also see the page with :doc:`Warning messages `. There is no variable syntax that uses empty brackets. Check the variable doc page. -*Energy was not tallied on needed timestep* - You are using a thermo keyword that requires potentials to - have tallied energy, but they did not on this timestep. See the - variable page for ideas on how to make this work. - *Epsilon or sigma reference not set by pair style in ewald/n* The pair style is not providing the needed epsilon or sigma values. @@ -1955,12 +1872,6 @@ Please also see the page with :doc:`Warning messages `. *Fix ave/chunk does not use chunk/atom compute* The specified compute is not for a compute chunk/atom command. -*Fix ave/correlate compute vector is accessed out-of-range* - The index for the vector is out of bounds. - -*Fix ave/correlate fix vector is accessed out-of-range* - The index for the vector is out of bounds. - *Fix ave/histo inputs are not all global, peratom, or local* All inputs in a single fix ave/histo command must be of the same style. @@ -1973,18 +1884,6 @@ Please also see the page with :doc:`Warning messages `. *Fix ave/time cannot use variable with vector mode* Variables produce scalar values. -*Fix ave/time compute array is accessed out-of-range* - An index for the array is out of bounds. - -*Fix ave/time compute vector is accessed out-of-range* - The index for the vector is out of bounds. - -*Fix ave/time fix array is accessed out-of-range* - An index for the array is out of bounds. - -*Fix ave/time fix vector is accessed out-of-range* - The index for the vector is out of bounds. - *Fix balance rcb cannot be used with comm_style brick* Comm_style tiled must be used instead. @@ -2560,18 +2459,6 @@ Please also see the page with :doc:`Warning messages `. on a particular processor. The pairwise cutoff is too short or the atoms are too far apart to make a valid improper. -*Improper atoms %d %d %d %d missing on proc %d at step %ld* - One or more of 4 atoms needed to compute a particular improper are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the improper has blown apart and an atom is - too far away. - -*Improper atoms missing on proc %d at step %ld* - One or more of 4 atoms needed to compute a particular improper are - missing on this processor. Typically this is because the pairwise - cutoff is set too short or the improper has blown apart and an atom is - too far away. - *Improper coeff for hybrid has invalid style* Improper style hybrid uses another improper style as one of its coefficients. The improper style used in the improper_coeff command @@ -2681,10 +2568,6 @@ Please also see the page with :doc:`Warning messages `. *Incorrect element names in EAM potential file* The element names in the EAM file do not match those requested. -*Incorrect format of ... section in data file* - Number or type of values per line in the given section of the data file - is not consistent with the requirements for this section. - *Incorrect format in COMB potential file* Incorrect number of words per line in the potential file. @@ -3213,9 +3096,6 @@ Please also see the page with :doc:`Warning messages `. The template indices must be between 1 to N, where N is the number of molecules in the template. -*Invalid thermo keyword in variable formula* - The keyword is not recognized. - *Invalid threads_per_atom specified.* For 3-body potentials on the GPU, the threads_per_atom setting cannot be greater than 4 for NVIDIA GPUs. @@ -3378,13 +3258,6 @@ Please also see the page with :doc:`Warning messages `. *Lost atoms via balance: original %ld current %ld* This should not occur. Report the problem to the developers. -*Lost atoms: original %ld current %ld* - Lost atoms are checked for each time thermo output is done. See the - thermo_modify lost command for options. Lost atoms usually indicate - bad dynamics, e.g. atoms have been blown far out of the simulation - box, or moved further than one processor's subdomain away before - reneighboring. - *MEAM library error %d* A call to the MEAM Fortran library returned an error. @@ -3445,9 +3318,6 @@ Please also see the page with :doc:`Warning messages `. The IDs must not be larger than can be stored in a 32-bit integer since chunk IDs are 32-bit integers. -*Molecule auto special bond generation overflow* - Counts exceed maxspecial setting for other atoms in system. - *Molecule file shake flags not before shake atoms* The order of the two sections is important. @@ -3460,16 +3330,6 @@ Please also see the page with :doc:`Warning messages `. *Molecule file special list does not match special count* The number of values in an atom's special list does not match count. -*Molecule topology/atom exceeds system topology/atom* - The number of bonds, angles, etc per-atom in the molecule exceeds the - system setting. See the create_box command for how to specify these - values. - -*Molecule topology type exceeds system topology type* - The number of bond, angle, etc types in the molecule exceeds the - system setting. See the create_box command for how to specify these - values. - *More than one fix deform* Only one fix deform can be defined at a time. @@ -3749,17 +3609,9 @@ Please also see the page with :doc:`Warning messages `. Swap frequency in temper command must evenly divide the total # of timesteps. -*Non-numeric box dimensions - simulation unstable* - The box size has apparently blown up. - *Number of core atoms != number of shell atoms* There must be a one-to-one pairing of core and shell atoms. -*Numeric index is out of bounds* - A command with an argument that specifies an integer or range of - integers is using a value that is less than 1 or greater than the - maximum allowed limit. - *One or more Atom IDs is negative* Atom IDs must be positive integers. @@ -3778,51 +3630,6 @@ Please also see the page with :doc:`Warning messages `. Any rigid body defined by the fix rigid command must contain 2 or more atoms. -*Out of range atoms - cannot compute MSM* - One or more atoms are attempting to map their charge to a MSM grid point - that is not owned by a processor. This is likely for one of two - reasons, both of them bad. First, it may mean that an atom near the - boundary of a processor's subdomain has moved more than 1/2 the - :doc:`neighbor skin distance ` without neighbor lists being - rebuilt and atoms being migrated to new processors. This also means - you may be missing pairwise interactions that need to be computed. - The solution is to change the re-neighboring criteria via the - :doc:`neigh_modify ` command. The safest settings are - "delay 0 every 1 check yes". Second, it may mean that an atom has - moved far outside a processor's subdomain or even the entire - simulation box. This indicates bad physics, e.g. due to highly - overlapping atoms, too large a timestep, etc. - -*Out of range atoms - cannot compute PPPM* - One or more atoms are attempting to map their charge to a PPPM grid - point that is not owned by a processor. This is likely for one of two - reasons, both of them bad. First, it may mean that an atom near the - boundary of a processor's subdomain has moved more than 1/2 the - :doc:`neighbor skin distance ` without neighbor lists being - rebuilt and atoms being migrated to new processors. This also means - you may be missing pairwise interactions that need to be computed. - The solution is to change the re-neighboring criteria via the - :doc:`neigh_modify ` command. The safest settings are - "delay 0 every 1 check yes". Second, it may mean that an atom has - moved far outside a processor's subdomain or even the entire - simulation box. This indicates bad physics, e.g. due to highly - overlapping atoms, too large a timestep, etc. - -*Out of range atoms - cannot compute PPPMDisp* - One or more atoms are attempting to map their charge to a PPPM grid - point that is not owned by a processor. This is likely for one of two - reasons, both of them bad. First, it may mean that an atom near the - boundary of a processor's subdomain has moved more than 1/2 the - :doc:`neighbor skin distance ` without neighbor lists being - rebuilt and atoms being migrated to new processors. This also means - you may be missing pairwise interactions that need to be computed. - The solution is to change the re-neighboring criteria via the - :doc:`neigh_modify ` command. The safest settings are - "delay 0 every 1 check yes". Second, it may mean that an atom has - moved far outside a processor's subdomain or even the entire - simulation box. This indicates bad physics, e.g. due to highly - overlapping atoms, too large a timestep, etc. - *Overflow of allocated fix vector storage* This should not normally happen if the fix correctly calculated how long the vector will grow to. Contact the developers. @@ -4342,19 +4149,9 @@ Please also see the page with :doc:`Warning messages `. *Per-atom compute in equal-style variable formula* Equal-style variables cannot use per-atom quantities. -*Per-atom energy was not tallied on needed timestep* - You are using a thermo keyword that requires potentials to - have tallied energy, but they did not on this timestep. See the - variable page for ideas on how to make this work. - *Per-atom fix in equal-style variable formula* Equal-style variables cannot use per-atom quantities. -*Per-atom virial was not tallied on needed timestep* - You are using a thermo keyword that requires potentials to have - tallied the virial, but they did not on this timestep. See the - variable page for ideas on how to make this work. - *Per-processor system is too big* The number of owned atoms plus ghost atoms on a single processor must fit in 32-bit integer. @@ -4717,10 +4514,6 @@ Please also see the page with :doc:`Warning messages `. See the extra/improper/per/atom keyword for the create_box or the read_data command to set this limit larger -*Substitution for illegal variable* - Input script line contained a variable that could not be substituted - for. - *Support for writing images in JPEG format not included* LAMMPS was not built with the -DLAMMPS_JPEG switch in the Makefile. @@ -4924,10 +4717,6 @@ Please also see the page with :doc:`Warning messages `. *Too many molecules for fix rigid* The limit is 2\^31 = ~2 billion molecules. -*Too many neighbor bins* - This is likely due to an immense simulation box that has blown up - to a large size. - *Too many timesteps* The cumulative timesteps must fit in a 64-bit integer. @@ -5019,57 +4808,12 @@ Please also see the page with :doc:`Warning messages `. A universe or uloop style variable must specify a number of values >= to the number of processor partitions. -*Unrecognized angle style* - The choice of angle style is unknown. - -*Unrecognized atom style* - The choice of atom style is unknown. - -*Unrecognized body style* - The choice of body style is unknown. - -*Unrecognized bond style* - The choice of bond style is unknown. - -*Unrecognized command: %s* - The command is not known to LAMMPS. Check the input script. - -*Unrecognized compute style* - The choice of compute style is unknown. - -*Unrecognized dihedral style* - The choice of dihedral style is unknown. - -*Unrecognized dump reader style* - The choice of dump reader style via the format keyword is unknown. - -*Unrecognized dump style* - The choice of dump style is unknown. - -*Unrecognized fix style* - The choice of fix style is unknown. - -*Unknown identifier in data file: %s* - A section of the data file cannot be read by LAMMPS. - -*Unrecognized improper style* - The choice of improper style is unknown. - *Unknown keyword in thermo_style custom command* One or more specified keywords are not recognized. -*Unrecognized kspace style* - The choice of kspace style is unknown. - -*Unrecognized pair style* - The choice of pair style is unknown. - *Unknown pair_modify hybrid sub-style* The choice of sub-style is unknown. -*Unrecognized region style* - The choice of region style is unknown. - *Unknown table style in pair_style command* Style of table is invalid for use with pair_style table command. @@ -5260,11 +5004,6 @@ Please also see the page with :doc:`Warning messages `. This is so there is an equal number of Rspace processors for every Kspace processor. -*Virial was not tallied on needed timestep* - You are using a thermo keyword that requires potentials to - have tallied the virial, but they did not on this timestep. See the - variable page for ideas on how to make this work. - *Voro++ error: narea and neigh have a different size* This error is returned by the Voro++ library. diff --git a/doc/src/Errors_warnings.rst b/doc/src/Errors_warnings.rst index f152e66f4a..c99b3f6b7c 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -270,23 +270,6 @@ Please also see the page with :doc:`Error messages ` The topology contains impropers, but there are no improper forces computed since there was no improper_style command. -*Inconsistent image flags* - The image flags for a pair on bonded atoms appear to be inconsistent. - Inconsistent means that when the coordinates of the two atoms are - unwrapped using the image flags, the two atoms are far apart. - Specifically they are further apart than half a periodic box length. - Or they are more than a box length apart in a non-periodic dimension. - This is usually due to the initial data file not having correct image - flags for the two atoms in a bond that straddles a periodic boundary. - They should be different by 1 in that case. This is a warning because - inconsistent image flags will not cause problems for dynamics or most - LAMMPS simulations. However they can cause problems when such atoms - are used with the fix rigid or replicate commands. Note that if you - have an infinite periodic crystal with bonds then it is impossible to - have fully consistent image flags, since some bonds will cross - periodic boundaries and connect two atoms with the same image - flag. - *Increasing communication cutoff for GPU style* The pair style has increased the communication cutoff to be consistent with the communication cutoff requirements for this pair style when run on the GPU. @@ -346,10 +329,6 @@ Please also see the page with :doc:`Error messages ` The temperature computation used by the velocity command will not be on the same group of atoms that velocities are being set for. -*Molecule attributes do not match system attributes* - An attribute is specified (e.g. diameter, charge) that is - not defined for the specified atom style. - *Molecule has bond topology but no special bond settings* This means the bonded atoms will not be excluded in pairwise interactions. From b329d01e5eacab2d8c7f336a9dbbeaf1c2a09b11 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 12:25:06 -0400 Subject: [PATCH 31/99] small clarification --- doc/src/Build_manual.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index 0e8b34dcc7..73f2875a5d 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -221,9 +221,10 @@ HTML as a quick-n-dirty way of checking your manual page. This translation uses `Pandoc `_ instead of Sphinx and thus all special Sphinx features (cross-references, advanced tables, -embedding of Python docstring and doxygen documentation, and so on) will -not render correctly. But this is a **very fast** way to check the content -as HTML while writing the documentation. +embedding of Python docstrings or doxygen documentation, and so on) will +not render correctly. Most embedded math should render correctly. This +is a **very fast** way to check the syntax and layout of a documentation +file translated to HTML while writing it. To translate **all** manual pages, you can type ``make fasthtml`` at the command line. The translated HTML files are then in the ``fasthtml`` From f0b988904dd430fe124c2eb05fde336d011c6ae5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 17:59:32 -0400 Subject: [PATCH 32/99] add some notes about releasing a stable release update --- .github/release_steps.md | 47 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/.github/release_steps.md b/.github/release_steps.md index 857acfdb85..1ffd3cb291 100644 --- a/.github/release_steps.md +++ b/.github/release_steps.md @@ -216,7 +216,7 @@ and using the CMake settings: ``` sh -D CMAKE_OSX_ARCHITECTURES=arm64;x86_64 --D CMAKE_OSX_DEPLOYMENT_TARGER=11.0 +-D CMAKE_OSX_DEPLOYMENT_TARGET=11.0 ``` This will add the compiler flags `-arch arm64 -arch x86_64 @@ -324,6 +324,47 @@ At this point it should be possible to do a fast-forward merge of ### Push branches and tags - - ## LAMMPS Stable Update Release + +After making a stable release, bugfixes from the 'develop' branch +are selectively backported to the 'maintenance' branch. This is +done with "git cherry-pick \' wherever possible. +The LAMMPS\_UPDATE define in "src/version.h" is set to "Maintenance". + +### Prerequesites + +When a sufficient number of bugfixes has accumulated or an urgent +or important bugfix needs to be distributed a new stable update +release is made. To make this publicly visible a pull request +is submitted that will merge 'maintenance' into 'stable'. Before +merging, set LAMMPS\_UPDATE in "src/version.h" to "Update #" with +"#" indicating the update count (1, 2, and so on). +Also draft suitable release notes under https://github.com/lammps/lammps/releases + +### Fast-forward merge of 'maintenance' into 'stable', apply tag, and publish + +Do a fast-forward merge of 'maintenance' to 'stable' and then +apply the stable\_DMmmYYYY\_update# tag and push branch and tag +to GitHub. The corresponding pull request will be automatically +closed. Example: + +``` +git checkout maintenance +git pull +git checkout stable +git pull +git merge --ff-only maintenance +git tag -s -m 'Update 2 for Stable LAMMPS version 29 August 2024' stable_29Aug2024_update2 +git push git@github.com:lammps/lammps.git --tags maintenance stable +``` + +Associate draft release notes with new tag and publish as "latest release". + +On https://ci.lammps.org/ go to "dev", "stable" and manually execute +the "update\_release" task. This will update https://docs.lammps.org/stable +and prepare a stable tarball. + +### Build and upload binary packages and source tarball to GitHub + +The build procedure is the same as for the feature releases, only +that packages are built from the 'stable' branch. From 7d6c19f51b3744e6009c8b394bded8de14d25629 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 18:12:33 -0400 Subject: [PATCH 33/99] adjust for macos_arm64 arch --- unittest/force-styles/tests/mol-pair-tip4p_table.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/tests/mol-pair-tip4p_table.yaml b/unittest/force-styles/tests/mol-pair-tip4p_table.yaml index e76ecdf0f0..5826e5f1c5 100644 --- a/unittest/force-styles/tests/mol-pair-tip4p_table.yaml +++ b/unittest/force-styles/tests/mol-pair-tip4p_table.yaml @@ -2,7 +2,7 @@ lammps_version: 17 Feb 2022 tags: unstable date_generated: Fri Mar 18 22:17:36 2022 -epsilon: 2.5e-13 +epsilon: 1.0e-11 skip_tests: prerequisites: ! | atom full From 4aece11628c05a8c9147c8642e2800ace607cc2e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 23:33:39 -0400 Subject: [PATCH 34/99] add note about need to run `ldconfig` on Linux system after make install --- doc/src/Build_cmake.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/src/Build_cmake.rst b/doc/src/Build_cmake.rst index a38b42b4f4..2349eebf62 100644 --- a/doc/src/Build_cmake.rst +++ b/doc/src/Build_cmake.rst @@ -119,6 +119,13 @@ configured) and additional files like LAMMPS API headers, manpages, potential and force field files. The location of the installation tree defaults to ``${HOME}/.local``. +.. note:: + + If you have set `-D CMAKE_INSTALL_PREFIX` to install LAMMPS into a + system location on a Linux machine , you may also have to run (as + root) the `ldconfig` program to update the cache file for fast lookup + of system shared libraries. + .. _cmake_options: Configuration and build options From 69881baa0c2312d0d2fd334f0eb7fa12bd787109 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 17 Mar 2025 23:33:47 -0400 Subject: [PATCH 35/99] add false positives --- doc/utils/sphinx-config/false_positives.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 084f7c0ec1..fee9b97c8e 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -856,6 +856,7 @@ DNi Dobnikar Dobson docenv +docstrings Dodds dodgerblue dof @@ -3261,6 +3262,7 @@ resquared REsquared restartfile restartinfo +reStructuredText Restrepo rethrowing Revenga From d02e26d3ba752ad177b29f2c7649002e717d9c18 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Mar 2025 19:49:04 -0400 Subject: [PATCH 36/99] document DOWNLOAD_POTENTIALS with CMake --- doc/src/Build_settings.rst | 26 +++++++++++++++++++++++--- doc/src/Tools.rst | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index 7717618f12..acb9aa7535 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -13,7 +13,8 @@ explains how to do this for building both with CMake and make. * `Size of LAMMPS integer types and size limits`_ * `Read or write compressed files`_ * `Output of JPEG, PNG, and movie files`_ via the :doc:`dump image ` or :doc:`dump movie ` commands -* `Support for downloading files`_ +* `Support for downloading files from the input`_ +* `Prevent download of large potential files`_ * `Memory allocation alignment`_ * `Workaround for long long integers`_ * `Exception handling when using LAMMPS as a library`_ to capture errors @@ -509,8 +510,8 @@ during a run. .. _libcurl: -Support for downloading files ------------------------------ +Support for downloading files from the input +-------------------------------------------- .. versionadded:: 29Aug2024 @@ -553,6 +554,25 @@ LAMMPS is compiled accordingly which needs the following settings: ---------- +.. _download_pot: + +Prevent download of large potential files +----------------------------------------- + +.. versionadded:: 8Feb2023 + +LAMMPS bundles a selection of potential files in the ``potentials`` +folder as examples of how those kinds of potential files look like and +for use with the provided input examples in the ``examples`` tree. To +keep the size of the distributed LAMMPS source package small, very large +potential files (> 5 MByte) are not bundled, but only downloaded on +demand when the :doc:`corresponding package ` is +installed. This automatic download can be prevented when :doc:`building +LAMMPS with CMake ` by adding the setting `-D +DOWNLOAD_POTENTIALS=off` when configuring. + +---------- + .. _align: Memory allocation alignment diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index d13a6d384f..11468787f1 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -930,7 +930,7 @@ dependencies and redirects the download to the local cache. mkdir build cd build - cmake -D LAMMPS_DOWNLOADS_URL=${HTTP_CACHE_URL} -C "${LAMMPS_HTTP_CACHE_CONFIG}" -C ../cmake/presets/most.cmake ../cmake + cmake -D LAMMPS_DOWNLOADS_URL=${HTTP_CACHE_URL} -C "${LAMMPS_HTTP_CACHE_CONFIG}" -C ../cmake/presets/most.cmake -D DOWNLOAD_POTENTIALS=off ../cmake make -j 8 deactivate_caches From 90cd786c2d39d42ebe3d7fb287b96d874aa89052 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Mar 2025 20:20:56 -0400 Subject: [PATCH 37/99] document how to address "externally managed environment" errors with install-python --- doc/src/Build_settings.rst | 2 +- doc/src/Howto_python.rst | 31 +++++++++++++++++++++++++++---- doc/src/Python_install.rst | 4 ++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index acb9aa7535..3f956d551d 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -566,7 +566,7 @@ folder as examples of how those kinds of potential files look like and for use with the provided input examples in the ``examples`` tree. To keep the size of the distributed LAMMPS source package small, very large potential files (> 5 MByte) are not bundled, but only downloaded on -demand when the :doc:`corresponding package ` is +demand when the :doc:`corresponding package ` is installed. This automatic download can be prevented when :doc:`building LAMMPS with CMake ` by adding the setting `-D DOWNLOAD_POTENTIALS=off` when configuring. diff --git a/doc/src/Howto_python.rst b/doc/src/Howto_python.rst index bfb182d989..ee919e96e7 100644 --- a/doc/src/Howto_python.rst +++ b/doc/src/Howto_python.rst @@ -62,17 +62,17 @@ with :ref:`PNG, JPEG and FFMPEG output support ` enabled. cd $LAMMPS_DIR/src - # add packages if necessary + # add LAMMPS packages if necessary make yes-MOLECULE make yes-PYTHON # compile shared library using Makefile make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG" JPG_LIB="-lpng -ljpeg" -Step 2: Installing the LAMMPS Python package -"""""""""""""""""""""""""""""""""""""""""""" +Step 2: Installing the LAMMPS Python module +""""""""""""""""""""""""""""""""""""""""""" -Next install the LAMMPS Python package into your current Python installation with: +Next install the LAMMPS Python module into your current Python installation with: .. code-block:: bash @@ -89,6 +89,29 @@ privileges) or into your personal Python module folder. Recompiling the shared library requires re-installing the Python package. +.. _externally_managed: + +.. admonition:: Handling an "externally-managed-environment" Error + :class: Hint + + Some Python installations made through Linux distributions + (e.g. Ubuntu 24.04LTS or later) will prevent installing the LAMMPS + Python module into a system folder or a corresponding folder of the + individual user as attempted by ``make install-python`` with an error + stating that an *externally managed* python installation must be only + managed by the same package package management tool. This is an + optional setting, so not all Linux distributions follow it currently + (Spring 2025). The reasoning and explanations for this error can be + found in the `Python Packaging User Guide + `_ + + These guidelines suggest to create a virtual environment and install + the LAMMPS Python module there (see below). This is generally a good + idea and the LAMMPS developers recommend this, too. If, however, you + want to proceed and install the LAMMPS Python module regardless, you + can install the "wheel" file (see above) manually with the ``pip`` + command by adding the ``--break-system-packages`` flag. + Installation inside of a virtual environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/src/Python_install.rst b/doc/src/Python_install.rst index 1e53a99914..561e4a2f92 100644 --- a/doc/src/Python_install.rst +++ b/doc/src/Python_install.rst @@ -198,6 +198,10 @@ folder that the dynamic loader searches or inside of the installed The ``PYTHONPATH`` needs to point to the parent folder that contains the ``lammps`` package! +In case you run into an "externally-managed-environment" error when +trying to install the LAMMPS Python module, please refer to +:ref:`corresponding paragraph ` in the Python HOWTO +page to learn about options for handling this error. To verify if LAMMPS can be successfully started from Python, start the Python interpreter, load the ``lammps`` Python module and create a From 4cd3fa1e388ff689647ae04910e837ac652e2e6d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 18 Mar 2025 20:24:04 -0400 Subject: [PATCH 38/99] spelling --- doc/src/Build_settings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Build_settings.rst b/doc/src/Build_settings.rst index 3f956d551d..226e19bfc3 100644 --- a/doc/src/Build_settings.rst +++ b/doc/src/Build_settings.rst @@ -565,7 +565,7 @@ LAMMPS bundles a selection of potential files in the ``potentials`` folder as examples of how those kinds of potential files look like and for use with the provided input examples in the ``examples`` tree. To keep the size of the distributed LAMMPS source package small, very large -potential files (> 5 MByte) are not bundled, but only downloaded on +potential files (> 5 MBytes) are not bundled, but only downloaded on demand when the :doc:`corresponding package ` is installed. This automatic download can be prevented when :doc:`building LAMMPS with CMake ` by adding the setting `-D From b936673935688a6744611dcfca3e2da049bea446 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 19 Mar 2025 02:23:10 -0400 Subject: [PATCH 39/99] consolidate calls to utils::errorurl() with corresponding error class calls. --- doc/src/Errors_details.rst | 4 ++-- src/GPU/pppm_gpu.cpp | 2 +- src/INTEL/pppm_disp_intel.cpp | 2 +- src/INTEL/pppm_intel.cpp | 2 +- src/KOKKOS/fix_shake_kokkos.cpp | 4 ++-- src/KOKKOS/pppm_kokkos.cpp | 2 +- src/KSPACE/msm.cpp | 4 ++-- src/KSPACE/msm_cg.cpp | 2 +- src/KSPACE/pppm.cpp | 2 +- src/KSPACE/pppm_cg.cpp | 2 +- src/KSPACE/pppm_disp.cpp | 2 +- src/KSPACE/pppm_disp_tip4p.cpp | 2 +- src/KSPACE/pppm_stagger.cpp | 2 +- src/KSPACE/pppm_tip4p.cpp | 2 +- src/OPENMP/msm_cg_omp.cpp | 4 ++-- src/OPENMP/pppm_disp_omp.cpp | 4 ++-- src/OPENMP/pppm_disp_tip4p_omp.cpp | 8 ++++++-- src/OPENMP/pppm_tip4p_omp.cpp | 2 +- src/RIGID/fix_shake.cpp | 16 ++++++++-------- src/balance.cpp | 4 ++-- src/change_box.cpp | 4 ++-- src/compute_pressure.cpp | 24 +++++++++++++++--------- src/displace_atoms.cpp | 4 ++-- src/variable.cpp | 6 +++--- 24 files changed, 60 insertions(+), 50 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 6daf14f91a..72148c2626 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -347,8 +347,8 @@ long-range solver. .. _err0005: -Bond (or angle, dihedral, or improper) atoms missing ----------------------------------------------------- +Bond (or angle, dihedral, improper, cmap, or shake) atoms missing +----------------------------------------------------------------- The second atom needed to compute a particular bond (or the third or fourth atom for angle, dihedral, or improper) is missing on the indicated timestep diff --git a/src/GPU/pppm_gpu.cpp b/src/GPU/pppm_gpu.cpp index 593aed827c..47fe71e872 100644 --- a/src/GPU/pppm_gpu.cpp +++ b/src/GPU/pppm_gpu.cpp @@ -197,7 +197,7 @@ void PPPMGPU::compute(int eflag, int vflag) if (!success) error->one(FLERR,"Insufficient memory on accelerator"); if (flag != 0) - error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } // convert atoms from box to lamda coords diff --git a/src/INTEL/pppm_disp_intel.cpp b/src/INTEL/pppm_disp_intel.cpp index 8816ed553b..3af670d325 100644 --- a/src/INTEL/pppm_disp_intel.cpp +++ b/src/INTEL/pppm_disp_intel.cpp @@ -777,7 +777,7 @@ void PPPMDispIntel::particle_map_intel(double delx, double dely, double delz, } } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPMDisp" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPMDisp" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/INTEL/pppm_intel.cpp b/src/INTEL/pppm_intel.cpp index 8b75b86e07..1ebfc29b99 100644 --- a/src/INTEL/pppm_intel.cpp +++ b/src/INTEL/pppm_intel.cpp @@ -404,7 +404,7 @@ void PPPMIntel::particle_map(IntelBuffers *buffers) } } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } diff --git a/src/KOKKOS/fix_shake_kokkos.cpp b/src/KOKKOS/fix_shake_kokkos.cpp index 52826d7b04..05873120d7 100644 --- a/src/KOKKOS/fix_shake_kokkos.cpp +++ b/src/KOKKOS/fix_shake_kokkos.cpp @@ -257,8 +257,8 @@ void FixShakeKokkos::pre_neighbor() nlist = h_nlist(); if (h_error_flag() == 1) { - error->one(FLERR,"Shake atoms missing on proc " - "{} at step {}",comm->me,update->ntimestep); + error->one(FLERR,"Shake atoms missing on proc {} at step {}{}", + comm->me,update->ntimestep, utils::errorurl(5)); } } diff --git a/src/KOKKOS/pppm_kokkos.cpp b/src/KOKKOS/pppm_kokkos.cpp index 40faaed8d5..84bff03c80 100644 --- a/src/KOKKOS/pppm_kokkos.cpp +++ b/src/KOKKOS/pppm_kokkos.cpp @@ -1147,7 +1147,7 @@ void PPPMKokkos::particle_map() k_flag.template modify(); k_flag.template sync(); if (k_flag.h_view()) - error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } template diff --git a/src/KSPACE/msm.cpp b/src/KSPACE/msm.cpp index c4008967f8..2cdeb74ec0 100644 --- a/src/KSPACE/msm.cpp +++ b/src/KSPACE/msm.cpp @@ -1466,8 +1466,8 @@ void MSM::particle_map() } if (flag) - error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute MSM{}", - utils::errorurl(4)); + error->one(FLERR, Error::NOLASTLINE, + "Out of range atoms - cannot compute MSM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/msm_cg.cpp b/src/KSPACE/msm_cg.cpp index 62e23c564c..9ba52a68d5 100644 --- a/src/KSPACE/msm_cg.cpp +++ b/src/KSPACE/msm_cg.cpp @@ -335,7 +335,7 @@ void MSMCG::particle_map() flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute MSM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute MSM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index aeaf53f4e1..8eaa60ac92 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -1830,7 +1830,7 @@ void PPPM::particle_map() flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm_cg.cpp b/src/KSPACE/pppm_cg.cpp index 5f474efd54..fe0176bf13 100644 --- a/src/KSPACE/pppm_cg.cpp +++ b/src/KSPACE/pppm_cg.cpp @@ -304,7 +304,7 @@ void PPPMCG::particle_map() flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index 1e6aec5029..f2882582bb 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -4252,7 +4252,7 @@ void PPPMDisp::particle_map(double delx, double dely, double delz, flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPMDisp" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPMDisp" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm_disp_tip4p.cpp b/src/KSPACE/pppm_disp_tip4p.cpp index 1542304e35..1417aca4a3 100644 --- a/src/KSPACE/pppm_disp_tip4p.cpp +++ b/src/KSPACE/pppm_disp_tip4p.cpp @@ -100,7 +100,7 @@ void PPPMDispTIP4P::particle_map_c(double delx, double dely, double delz, flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm_stagger.cpp b/src/KSPACE/pppm_stagger.cpp index 4a1946e32b..9681351ec1 100644 --- a/src/KSPACE/pppm_stagger.cpp +++ b/src/KSPACE/pppm_stagger.cpp @@ -699,7 +699,7 @@ void PPPMStagger::particle_map() flag = 1; } - if (flag) error->one(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag) error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/pppm_tip4p.cpp b/src/KSPACE/pppm_tip4p.cpp index d1e723a60f..631eebc65c 100644 --- a/src/KSPACE/pppm_tip4p.cpp +++ b/src/KSPACE/pppm_tip4p.cpp @@ -98,7 +98,7 @@ void PPPMTIP4P::particle_map() int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); - if (flag_all) error->all(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag_all) error->all(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/msm_cg_omp.cpp b/src/OPENMP/msm_cg_omp.cpp index 48ce876e1e..008d27f99a 100644 --- a/src/OPENMP/msm_cg_omp.cpp +++ b/src/OPENMP/msm_cg_omp.cpp @@ -357,8 +357,8 @@ void MSMCGOMP::particle_map() } if (flag) - error->one(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute MSM{}", - utils::errorurl(4)); + error->one(FLERR, Error::NOLASTLINE, + "Out of range atoms - cannot compute MSM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/pppm_disp_omp.cpp b/src/OPENMP/pppm_disp_omp.cpp index 6fceca6a14..e7f8d1c360 100644 --- a/src/OPENMP/pppm_disp_omp.cpp +++ b/src/OPENMP/pppm_disp_omp.cpp @@ -358,7 +358,7 @@ void PPPMDispOMP::particle_map(double dxinv, double dyinv, const int nzhi_out = nzhi_o; if (!std::isfinite(boxlo[0]) || !std::isfinite(boxlo[1]) || !std::isfinite(boxlo[2])) - error->one(FLERR,"Non-numeric box dimensions. Simulation unstable."); + error->one(FLERR,"Non-numeric box dimensions. Simulation unstable."+utils::errorurl(6)); int flag = 0; #if defined(_OPENMP) @@ -388,7 +388,7 @@ void PPPMDispOMP::particle_map(double dxinv, double dyinv, int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); - if (flag_all) error->all(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag_all) error->all(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/pppm_disp_tip4p_omp.cpp b/src/OPENMP/pppm_disp_tip4p_omp.cpp index a62e1cb6f3..7cadbbb2ac 100644 --- a/src/OPENMP/pppm_disp_tip4p_omp.cpp +++ b/src/OPENMP/pppm_disp_tip4p_omp.cpp @@ -392,7 +392,9 @@ void PPPMDispTIP4POMP::particle_map_c(double dxinv, double dyinv, int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); - if (flag_all) error->all(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag_all) + error->all(FLERR, Error::NOLASTLINE, + "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- @@ -460,7 +462,9 @@ void PPPMDispTIP4POMP::particle_map(double dxinv, double dyinv, int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); - if (flag_all) error->all(FLERR,"Out of range atoms - cannot compute PPPM"); + if (flag_all) + error->all(FLERR, Error::NOLASTLINE, + "Out of range atoms - cannot compute PPPM", utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/OPENMP/pppm_tip4p_omp.cpp b/src/OPENMP/pppm_tip4p_omp.cpp index 167c722a0e..e2cf98b0d2 100644 --- a/src/OPENMP/pppm_tip4p_omp.cpp +++ b/src/OPENMP/pppm_tip4p_omp.cpp @@ -388,7 +388,7 @@ void PPPMTIP4POMP::particle_map() int flag_all; MPI_Allreduce(&flag,&flag_all,1,MPI_INT,MPI_SUM,world); - if (flag_all) error->all(FLERR,"Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); + if (flag_all) error->all(FLERR, Error::NOLASTLINE, "Out of range atoms - cannot compute PPPM" + utils::errorurl(4)); } /* ---------------------------------------------------------------------- diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 41708823bb..89b8ffd942 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -596,8 +596,8 @@ void FixShake::pre_neighbor() atom1 = atom->map(shake_atom[i][0]); atom2 = atom->map(shake_atom[i][1]); if (atom1 == -1 || atom2 == -1) - error->one(FLERR,"Shake atoms {} {} missing on proc {} at step {}",shake_atom[i][0], - shake_atom[i][1],comm->me,update->ntimestep); + error->one(FLERR,"Shake atoms {} {} missing on proc {} at step {}{}",shake_atom[i][0], + shake_atom[i][1],comm->me,update->ntimestep,utils::errorurl(5)); atom1 = domain->closest_image(i, atom1); atom2 = domain->closest_image(i, atom2); if (i <= atom1 && i <= atom2) { @@ -611,9 +611,9 @@ void FixShake::pre_neighbor() atom2 = atom->map(shake_atom[i][1]); atom3 = atom->map(shake_atom[i][2]); if (atom1 == -1 || atom2 == -1 || atom3 == -1) - error->one(FLERR,"Shake atoms {} {} {} missing on proc {} at step {}",shake_atom[i][0], - shake_atom[i][1],shake_atom[i][2], - comm->me,update->ntimestep); + error->one(FLERR,"Shake atoms {} {} {} missing on proc {} at step {}{}",shake_atom[i][0], + shake_atom[i][1],shake_atom[i][2],comm->me,update->ntimestep, + utils::errorurl(5)); atom1 = domain->closest_image(i, atom1); atom2 = domain->closest_image(i, atom2); atom3 = domain->closest_image(i, atom3); @@ -630,9 +630,9 @@ void FixShake::pre_neighbor() atom3 = atom->map(shake_atom[i][2]); atom4 = atom->map(shake_atom[i][3]); if (atom1 == -1 || atom2 == -1 || atom3 == -1 || atom4 == -1) - error->one(FLERR,"Shake atoms {} {} {} {} missing on proc {} at step {}",shake_atom[i][0], - shake_atom[i][1],shake_atom[i][2], - shake_atom[i][3],comm->me,update->ntimestep); + error->one(FLERR,"Shake atoms {} {} {} {} missing on proc {} at step {}{}", + shake_atom[i][0],shake_atom[i][1],shake_atom[i][2],shake_atom[i][3], + comm->me,update->ntimestep,utils::errorurl(5)); atom1 = domain->closest_image(i, atom1); atom2 = domain->closest_image(i, atom2); atom3 = domain->closest_image(i, atom3); diff --git a/src/balance.cpp b/src/balance.cpp index 3e45efed49..5ebe242bfb 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -377,8 +377,8 @@ void Balance::command(int narg, char **arg) bigint nblocal = atom->nlocal; MPI_Allreduce(&nblocal,&natoms,1,MPI_LMP_BIGINT,MPI_SUM,world); if (natoms != atom->natoms) - error->all(FLERR,"Lost atoms via balance: original {} current {}"+utils::errorurl(8), - atom->natoms,natoms); + error->all(FLERR,Error::NOLASTLINE,"Lost atoms via balance: original {} current {}" + +utils::errorurl(8),atom->natoms,natoms); // imbfinal = final imbalance // set disable = 1, so weights no longer migrate with atoms diff --git a/src/change_box.cpp b/src/change_box.cpp index dd6c427a18..5223218f3d 100644 --- a/src/change_box.cpp +++ b/src/change_box.cpp @@ -380,8 +380,8 @@ void ChangeBox::command(int narg, char **arg) bigint nblocal = atom->nlocal; MPI_Allreduce(&nblocal,&natoms,1,MPI_LMP_BIGINT,MPI_SUM,world); if (natoms != atom->natoms && comm->me == 0) - error->warning(FLERR,"Lost atoms via change_box: original {} " - "current {}"+utils::errorurl(8),atom->natoms,natoms); + error->warning(FLERR,"Lost atoms via change_box: original {} current {}"+utils::errorurl(8), + atom->natoms,natoms); } /* ---------------------------------------------------------------------- diff --git a/src/compute_pressure.cpp b/src/compute_pressure.cpp index 91a9cb531d..7843caecba 100644 --- a/src/compute_pressure.cpp +++ b/src/compute_pressure.cpp @@ -92,7 +92,7 @@ ComputePressure::ComputePressure(LAMMPS *lmp, int narg, char **arg) : nsub = utils::inumeric(FLERR,arg[iarg],false,lmp); ++iarg; if (nsub <= 0) - error->all(FLERR,"Illegal compute pressure command"); + error->all(FLERR, iarg, "Illegal compute pressure hybrid sub-style index {}", nsub); } } @@ -105,7 +105,8 @@ ComputePressure::ComputePressure(LAMMPS *lmp, int narg, char **arg) : } if (!pairhybrid) - error->all(FLERR,"Unrecognized pair style in compute pressure command"); + error->all(FLERR, iarg - (nsub ? 1 : 0), + "Unrecognized pair style {} in compute pressure command", pstyle); pairhybridflag = 1; } @@ -120,7 +121,7 @@ ComputePressure::ComputePressure(LAMMPS *lmp, int narg, char **arg) : pairflag = 1; bondflag = angleflag = dihedralflag = improperflag = 1; kspaceflag = fixflag = 1; - } else error->all(FLERR,"Illegal compute pressure command"); + } else error->all(FLERR, iarg, "Unknown compute pressure keyword {}", arg[iarg]); iarg++; } } @@ -128,7 +129,8 @@ ComputePressure::ComputePressure(LAMMPS *lmp, int narg, char **arg) : // error check if (keflag && id_temp == nullptr) - error->all(FLERR,"Compute pressure requires temperature ID to include kinetic energy"); + error->all(FLERR, Error::NOLASTLINE, + "Compute pressure requires temperature ID to include kinetic energy"); vector = new double[size_vector]; nvirial = 0; @@ -164,7 +166,8 @@ void ComputePressure::init() if (keflag) { temperature = modify->get_compute_by_id(id_temp); if (!temperature) - error->all(FLERR,"Could not find compute pressure temperature ID {}", id_temp); + error->all(FLERR, Error::NOLASTLINE, + "Could not find compute pressure temperature ID {}", id_temp); } // recheck if pair style with and without suffix exists @@ -178,7 +181,8 @@ void ComputePressure::init() } if (!pairhybrid) - error->all(FLERR,"Unrecognized pair style in compute pressure command"); + error->all(FLERR, Error::NOLASTLINE, + "Unrecognized pair style {} in compute pressure command", pstyle); } // detect contributions to virial @@ -235,7 +239,8 @@ double ComputePressure::compute_scalar() { invoked_scalar = update->ntimestep; if (update->vflag_global != invoked_scalar) - error->all(FLERR, Error::NOLASTLINE, "Virial was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, "Virial was not tallied on needed timestep" + + utils::errorurl(22)); // invoke temperature if it hasn't been already @@ -274,10 +279,11 @@ void ComputePressure::compute_vector() { invoked_vector = update->ntimestep; if (update->vflag_global != invoked_vector) - error->all(FLERR, Error::NOLASTLINE, "Virial was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Virial was not tallied on needed timestep" + utils::errorurl(22)); if (force->kspace && kspace_virial && force->kspace->scalar_pressure_flag) - error->all(FLERR,"Must use 'kspace_modify pressure/scalar no' for " + error->all(FLERR, Error::NOLASTLINE, "Must use 'kspace_modify pressure/scalar no' for " "tensor components with kspace_style msm"); // invoke temperature if it hasn't been already diff --git a/src/displace_atoms.cpp b/src/displace_atoms.cpp index 6f237c03c9..f930fa0980 100644 --- a/src/displace_atoms.cpp +++ b/src/displace_atoms.cpp @@ -363,8 +363,8 @@ void DisplaceAtoms::command(int narg, char **arg) bigint nblocal = atom->nlocal; MPI_Allreduce(&nblocal,&natoms,1,MPI_LMP_BIGINT,MPI_SUM,world); if (natoms != atom->natoms && comm->me == 0) - error->warning(FLERR,"Lost atoms via displace_atoms: original {} " - "current {}"+utils::errorurl(8),atom->natoms,natoms); + error->warning(FLERR,"Lost atoms via displace_atoms: original {} current {}"+utils::errorurl(8), + atom->natoms,natoms); } /* ---------------------------------------------------------------------- diff --git a/src/variable.cpp b/src/variable.cpp index 5ca3dbc2fb..4e1306e893 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -188,8 +188,8 @@ void Variable::set(int narg, char **arg) if (strcmp(arg[1], "delete") == 0) { if (narg > 2) - error->all(FLERR, 2, "Illegal variable delete command: expected 2 arguments but found {}", - narg); + error->all(FLERR, 2, "Illegal variable delete command: expected 2 arguments but found {}{}", + narg, utils::errorurl(3)); if (find(arg[0]) >= 0) remove(find(arg[0])); return; @@ -278,7 +278,7 @@ void Variable::set(int narg, char **arg) copy(num[nvar], &arg[2], data[nvar]); } else if (strcmp(arg[1], "uloop") == 0) { if (narg < 3 || narg > 4) - error->all(FLERR, 1, "Illegal variable command: expected 3 or 4 arguments but found {}: {}", + error->all(FLERR, 1, "Illegal variable command: expected 3 or 4 arguments but found {}{}", narg, utils::errorurl(3)); if (narg == 4 && strcmp(arg[3], "pad") != 0) error->all(FLERR, 3, "Invalid variable uloop argument: {}", arg[3]); From ee78e3e2019cef3c0164cee9ce16b75a22417d8b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 19 Mar 2025 03:06:23 -0400 Subject: [PATCH 40/99] add -f option to install.py to install into externally-managed environments --- doc/src/Python_install.rst | 9 ++++++--- python/install.py | 12 ++++++++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/doc/src/Python_install.rst b/doc/src/Python_install.rst index 561e4a2f92..1bb0768d62 100644 --- a/doc/src/Python_install.rst +++ b/doc/src/Python_install.rst @@ -110,13 +110,16 @@ folder that the dynamic loader searches or inside of the installed .. code-block:: bash - python install.py -p -l -v [-n] + python install.py -p -l -v [-n] [-f] * The ``-p`` flag points to the ``lammps`` Python package folder to be installed, * the ``-l`` flag points to the LAMMPS shared library file to be installed, * the ``-v`` flag points to the LAMMPS version header file to extract the version date, - * and the optional ``-n`` instructs the script to only build a wheel file - but not attempt to install it. + * the optional ``-n`` instructs the script to only build a wheel file but not attempt + to install it, + * and the optional ``-f`` argument instructs the script to force installation even if + pip would otherwise refuse installation with an + :ref:`error about externally managed environments `. .. tab:: Virtual environment diff --git a/python/install.py b/python/install.py index fd9f95f1bf..352225e49d 100644 --- a/python/install.py +++ b/python/install.py @@ -27,6 +27,8 @@ parser.add_argument("-w", "--wheeldir", required=False, help="path to a directory where the created wheel will be stored") parser.add_argument("-v", "--versionfile", required=True, help="path to the LAMMPS version.h source file") +parser.add_argument("-f", "--force", action="store_true", required=False, default=False, + help="force installation of LAMMPS Python package") args = parser.parse_args() @@ -145,7 +147,10 @@ else: py_exe = sys.executable try: - txt = subprocess.check_output([py_exe, '-m', 'pip', 'install', '--force-reinstall', wheel], stderr=subprocess.STDOUT, shell=False) + if args.force: + txt = subprocess.check_output([py_exe, '-m', 'pip', 'install', '--force-reinstall', '--break-system-packages', wheel], stderr=subprocess.STDOUT, shell=False) + else: + txt = subprocess.check_output([py_exe, '-m', 'pip', 'install', '--force-reinstall', wheel], stderr=subprocess.STDOUT, shell=False) print(txt.decode('UTF-8')) sys.exit(0) except subprocess.CalledProcessError as err: @@ -154,7 +159,10 @@ except subprocess.CalledProcessError as err: sys.exit(errmsg + "You need to uninstall the LAMMPS python module manually first.\n") try: print('Installing wheel into system site-packages folder failed. Trying user folder now') - txt = subprocess.check_output([sys.executable, '-m', 'pip', 'install', '--user', '--force-reinstall', wheel], stderr=subprocess.STDOUT, shell=False) + if args.force: + txt = subprocess.check_output([sys.executable, '-m', 'pip', 'install', '--user', '--force-reinstall', '--break-system-packages', wheel], stderr=subprocess.STDOUT, shell=False) + else: + txt = subprocess.check_output([sys.executable, '-m', 'pip', 'install', '--user', '--force-reinstall', wheel], stderr=subprocess.STDOUT, shell=False) print(txt.decode('UTF-8')) except: sys.exit('Failed to install wheel ' + wheel) From db8abdb59258d3503c3c6b1cf8d3fd2a9dcccd13 Mon Sep 17 00:00:00 2001 From: Francois-Xavier Coudert Date: Wed, 19 Mar 2025 13:57:49 +0100 Subject: [PATCH 41/99] Update macOS info --- doc/src/Install_mac.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/Install_mac.rst b/doc/src/Install_mac.rst index 452a8fd460..c8e21e8cfe 100644 --- a/doc/src/Install_mac.rst +++ b/doc/src/Install_mac.rst @@ -5,8 +5,7 @@ LAMMPS can be downloaded, built, and configured for macOS with `Homebrew `_. (Alternatively, see the installation instructions for :doc:`downloading an executable via Conda `.) The following LAMMPS packages are unavailable at this time because of -additional requirements not yet met: GPU, KOKKOS, MSCG, POEMS, -VORONOI. +additional requirements not yet met: GPU, KOKKOS. After installing Homebrew, you can install LAMMPS on your system with the following commands: From 6700a3bed1c081b39bad929c7b9effff4d534788 Mon Sep 17 00:00:00 2001 From: Andrew Jewett Date: Wed, 19 Mar 2025 13:36:09 -0400 Subject: [PATCH 42/99] Fixed the Moltemplate HowTo docs. (I also added a very simple polymer example.) This needed to be done because the file names and @atom types in the old version of this HowTo are no longer accurate. OPLSAA has changed. Now this HowTo is compatible with the latest version of OPLSAA. More importantly, after this update, the HowTo documentation should never need to be updated again because OPLSAA force field files are named according to the OPLSAA version/date. For example, the "oplsaa.lt" file has been renamed to "oplsaa2024.lt". Future OPLSAA updates will go in other files with different names. So the @atom types in this HowTo example should never need to be updated in the future, regardless what happens with OPLSAA. --- doc/src/Howto_moltemplate.rst | 266 ++++-- doc/src/JPG/PolyNIPAM.jpg | Bin 41505 -> 96641 bytes doc/src/JPG/butane.jpg | Bin 0 -> 22449 bytes tools/moltemplate/tutorial-files/PolyNIPAM.lt | 792 +++++++++--------- tools/moltemplate/tutorial-files/formamide.lt | 33 +- tools/moltemplate/tutorial-files/sample01.lt | 44 +- tools/moltemplate/tutorial-files/solv_01.lt | 88 +- 7 files changed, 692 insertions(+), 531 deletions(-) create mode 100644 doc/src/JPG/butane.jpg diff --git a/doc/src/Howto_moltemplate.rst b/doc/src/Howto_moltemplate.rst index 1b34169a4f..a1c3b06a1e 100644 --- a/doc/src/Howto_moltemplate.rst +++ b/doc/src/Howto_moltemplate.rst @@ -1,30 +1,33 @@ Moltemplate Tutorial ==================== -In this tutorial, we are going to use the tool :ref:`Moltemplate -` to set up a classical molecular dynamic simulation using -the :ref:`OPLS-AA force field `. The first +In this tutorial, we are going to use the tool :ref:`Moltemplate` +to set up a classical molecular dynamic simulation using +the :ref:`OPLS-AA force field `. The first task is to describe an organic compound and create a complete input deck -for LAMMPS. The second task is to map the OPLS-AA force field to a +for LAMMPS. The second task is to use moltemplate to build a polymer. +The third task is to map the OPLS-AA force field to a molecular sample created with an external tool, e.g. PACKMOL, and exported as a PDB file. The files used in this tutorial can be found in the ``tools/moltemplate/tutorial-files`` folder of the LAMMPS source code distribution. +Many more examples can be found here: https://moltemplate.org/examples.html + + Simulating an organic solvent """"""""""""""""""""""""""""" This example aims to create a cubic box of the organic solvent formamide. -The first step is to create a molecular topology in the -LAMMPS-template (LT) file format representing a single molecule, which -will be stored in a Moltemplate object called ``_FAM inherits OPLSAA {}``. +The first step is to create a molecular topology in the LAMMPS-template +(LT) file format representing a single molecule, which will be +stored in a Moltemplate object called ``_FAM inherits OPLSAA {}``. This command states that the object ``_FAM`` is based on an existing object called ``OPLSAA``, which contains OPLS-AA parameters, atom type definitions, partial charges, masses and bond-angle rules for many organic and biological compounds. - The atomic structure is the starting point to populate the command ``write('Data Atoms') {}``, which will write the ``Atoms`` section in the LAMMPS data file. The OPLS-AA force field uses the ``atom_style full``, @@ -36,21 +39,23 @@ to the ``molID``, except that the same variable is used for the whole molecule. The atom types are assigned using ``@``-type variables. The assignment of atom types (e.g. ``@atom:177``, ``@atom:178``) is done using the OPLS-AA atom types defined in the "In Charges" section of the file -``oplsaa.lt``, looking for a reasonable match with the description of the atom. +``oplsaa2024.lt``, looking for a reasonable match with the description of the atom. The resulting file (``formamide.lt``) follows: .. code-block:: bash + import /usr/local/moltemplate/moltemplate/force_fields/oplsaa2024.lt # defines OPLSAA + _FAM inherits OPLSAA { # atomID molID atomType charge coordX coordY coordZ write('Data Atoms') { - $atom:C00 $mol @atom:177 0.00 0.100 0.490 0.0 - $atom:O01 $mol @atom:178 0.00 1.091 -0.250 0.0 - $atom:N02 $mol @atom:179 0.00 -1.121 -0.181 0.0 - $atom:H03 $mol @atom:182 0.00 -2.013 0.272 0.0 - $atom:H04 $mol @atom:182 0.00 -1.056 -1.190 0.0 - $atom:H05 $mol @atom:221 0.00 0.144 1.570 0.0 + $atom:C00 $mol @atom:235 0.00 0.100 0.490 0.0 + $atom:O01 $mol @atom:236 0.00 1.091 -0.250 0.0 + $atom:N02 $mol @atom:237 0.00 -1.121 -0.181 0.0 + $atom:H03 $mol @atom:240 0.00 -2.013 0.272 0.0 + $atom:H04 $mol @atom:240 0.00 -1.056 -1.190 0.0 + $atom:H05 $mol @atom:279 0.00 0.144 1.570 0.0 } # A list of the bonds in the molecule: @@ -64,16 +69,17 @@ The resulting file (``formamide.lt``) follows: } } -You don't have to specify the charge in this example because they will -be assigned according to the atom type. Analogously, only a -"Data Bond List" section is needed as the atom type will determine the -bond type. The other bonded interactions (e.g. angles, -dihedrals, and impropers) will be automatically generated by +You don't have to specify the charge in this example because the OPLSAA +force-field assigns charge according to the atom type. (This is not true +when using other force fields.) A "Data Bond List" section is needed as +the atom type will determine the bond type. The other bonded interactions +(e.g. angles, dihedrals, and impropers) will be automatically generated by Moltemplate. If the simulation is non-neutral, or Moltemplate complains that you have -missing bond, angle, or dihedral types, this means at least one of your -atom types is incorrect. +missing bond, angle, or dihedral types, this probably means at least one +of your atom types is incorrect (or perhaps there is no suitable atom +type currently defined in the ``oplsaa2024.lt`` file). The second step is to create a master file with instructions to build a starting structure and the LAMMPS commands to run an NPT simulation. The @@ -81,14 +87,12 @@ master file (``solv_01.lt``) follows: .. code-block:: bash - # Import the force field. - import /usr/local/moltemplate/moltemplate/force_fields/oplsaa.lt - import formamide.lt # after oplsaa.lt, as it depends on it. + import formamide.lt # Defines "_FAM" and OPLSAA - # Create the input sample. + # Distribute the molecules on a 5x5x5 cubic grid with spacing 4.6 solv = new _FAM [5].move( 4.6, 0, 0) - [5].move( 0, 4.6, 0) - [5].move( 0, 0, 4.6) + [5].move( 0, 4.6, 0) + [5].move( 0, 0, 4.6) solv[*][*][*].move(-11.5, -11.5, -11.5) # Set the simulation box. @@ -98,8 +102,11 @@ master file (``solv_01.lt``) follows: -11.5 11.5 zlo zhi } - # Create an input deck for LAMMPS. - write_once("In Init"){ + # Note: The lines below in the "In Run" section are often omitted. + + write_once("In Run"){ + # Create an input deck for LAMMPS. + # Run an NPT simulation. # Input variables. variable run string solv_01 # output name variable ts equal 1 # timestep @@ -109,12 +116,6 @@ master file (``solv_01.lt``) follows: variable equi equal 5000 # Equilibration steps variable prod equal 30000 # Production steps - # PBC (set them before the creation of the box). - boundary p p p - } - - # Run an NPT simulation. - write_once("In Run"){ # Derived variables. variable tcouple equal \$\{ts\}*100 variable pcouple equal \$\{ts\}*1000 @@ -143,7 +144,7 @@ master file (``solv_01.lt``) follows: unfix NPT } -The first two commands insert the content of files ``oplsaa.lt`` and +The first two commands insert the content of files ``oplsaa2024.lt`` and ``formamide.lt`` into the master file. At this point, we can use the command ``solv = new _FAM [N]`` to create N copies of a molecule of type ``_FAM``. In this case, we create an array of 5*5*5 molecules on a cubic @@ -153,21 +154,37 @@ the sample was created from scratch, we also specify the simulation box size in the "Data Boundary" section. The LAMMPS setting for the force field are specified in the file -``oplsaa.lt`` and are written automatically in the input deck. We also +``oplsaa2024.lt`` and are written automatically in the input deck. We also specify the boundary conditions and a set of variables in -the "In Init" section. The remaining commands to run an NPT simulation +the "In Init" section. + +The remaining commands to run an NPT simulation are written in the "In Run" section. Note that in this script, LAMMPS variables are protected with the escape character ``\`` to distinguish them from Moltemplate variables, e.g. ``\$\{run\}`` is a LAMMPS variable that is written in the input deck as ``${run}``. +(Note: Moltemplate can be slow to run, so you need to change you run +settings frequently, I recommended moving those commands (from "In Run") +out of your .lt files and into a separate file. Moltemplate creates a +file named ``run.in.EXAMPLE`` for this purpose. You can put your run +settings and fixes that file and then invoke LAMMPS using +``mpirun -np 4 lmp -in run.in.EXAMPLE`` instead.) + + Compile the master file with: .. code-block:: bash - moltemplate.sh -overlay-all solv_01.lt + moltemplate.sh solv_01.lt + cleanup_moltemplate.sh # <-- optional: see below -And execute the simulation with the following: +(Note: The optioinal "cleanup_moltemplate.sh" command deletes +unused atom types, which sometimes makes LAMMPS run faster. +But it does not work with many-body pair styles or dreiding-style h-bonds. +Fortunately most force fields, including OPLSAA, don't use those features.) + +Then execute the simulation with the following: .. code-block:: bash @@ -180,15 +197,116 @@ And execute the simulation with the following: Snapshot of the sample at the beginning and end of the simulation. Rendered with Ovito. + +Building a simple polymer +""""""""""""""""""""""""" +Moltemplate is particularly useful for building polymers (and other molecules +with subunits). As an simple example, consider butane: + +.. figure:: JPG/butane.jpg + +The ``butane.lt`` file below defines Butane as a polymer containing +4 monomers (of type ``CH3``, ``CH2``, ``CH2``, ``CH3``). + +.. code-block:: bash + + import /usr/local/moltemplate/moltemplate/force_fields/oplsaa2024.lt # defines OPLSAA + + CH3 inherits OPLSAA { + + # atomID molID atomType charge coordX coordY coordZ + write("Data Atoms") { + $atom:c $mol:... @atom:54 0.0 0.000000 0.4431163 0.000000 + $atom:h1 $mol:... @atom:60 0.0 0.000000 1.0741603 0.892431 + $atom:h2 $mol:... @atom:60 0.0 0.000000 1.0741603 -0.892431 + $atom:h3 $mol:... @atom:60 0.0 -0.892431 -0.1879277 0.000000 + } + # (Using "$mol:..." indicates this object ("CH3") is part of a larger + # molecule. Moltemplate will share the molecule-ID with that molecule.) + + # A list of the bonds within the "CH3" molecular subunit: + # BondID AtomID1 AtomID2 + write('Data Bond List') { + $bond:ch1 $atom:c $atom:h1 + $bond:ch2 $atom:c $atom:h2 + $bond:ch3 $atom:c $atom:h3 + } + } + + CH2 inherits OPLSAA { + + # atomID molID atomType charge coordX coordY coordZ + write("Data Atoms") { + $atom:c $mol:... @atom:57 0.0 0.000000 0.4431163 0.000000 + $atom:h1 $mol:... @atom:60 0.0 0.000000 1.0741603 0.892431 + $atom:h2 $mol:... @atom:60 0.0 0.000000 1.0741603 -0.892431 + } + + # A list of the bonds within the "CH2" molecular subunit: + # BondID AtomID1 AtomID2 + write('Data Bond List') { + $bond:ch1 $atom:c $atom:h1 + $bond:ch2 $atom:c $atom:h2 + } + } + + Butane inherits OPLSAA { + + create_var {$mol} # optional:force all monomers to share the same molecule-ID + + # - Create 4 monomers + # - Move them along the X axis using ".move()", + # - Rotate them 180 degrees with respect to the previous monomer + monomer1 = new CH3 + monomer2 = new CH2.rot(180,1,0,0).move(1.2533223,0,0) + monomer3 = new CH2.move(2.5066446,0,0) + monomer4 = new CH3.rot(180,0,0,1).move(3.7599669,0,0) + + # A list of the bonds connecting different monomers together: + write('Data Bond List') { + $bond:b1 $atom:monomer1/c $atom:monomer2/c + $bond:b2 $atom:monomer2/c $atom:monomer3/c + $bond:b3 $atom:monomer3/c $atom:monomer4/c + } + } + +Again, you don't have to specify the charge in this example because OPLSAA +assigns charges according to the atom type. + +This ``Butane`` object is a molecule which can be used anywhere other molecules +can be used. (You can arrange ``Butane`` molecules on a lattice, as we did previously. +You can also modify individual butane molecules by adding or deleting atoms or bonds. +You can add bonds between specific butane molecules or use ``Butane`` as a +subunit to define even larger molecules. See the moltemplate manual for details.) + + + + + + +How to build a complex polymer +"""""""""""""""""""""""""""""""""""""""""" +A similar procedure can be used to create more complicated polymers, +such as the NIPAM polymer example shown below. For details, see: + +https://github.com/jewettaij/moltemplate/tree/master/examples/all_atom/force_field_OPLSAA/NIPAM_polymer+water+ions + + + + Mapping an existing structure """"""""""""""""""""""""""""" Another helpful way to use Moltemplate is mapping an existing molecular -sample to a force field. This is useful when a complex sample is -assembled from different simulations or created with specialized -software (e.g. PACKMOL). As in the previous example, all molecular -species in the sample must be defined using single-molecule Moltemplate -objects. For this example, we use a short polymer in a box containing +sample to a force field. This is useful when a complex sample is assembled +from different simulations or created with specialized software (e.g. PACKMOL). +(Note: The previous link shows how to build this entire system from scratch +using only moltemplate. However here we will assume instead that we obtained +a PDB file for this system using PACKMOL.) + +As in the previous examples, all molecular species in the sample +are defined using single-molecule Moltemplate objects. +For this example, we use a short polymer in a box containing water molecules and ions in the PDB file ``model.pdb``. It is essential to understand that the order of atoms in the PDB file @@ -246,25 +364,25 @@ The resulting master LT file defining short annealing at a fixed volume .. code-block:: bash # Use the OPLS-AA force field for all species. - import /usr/local/moltemplate/moltemplate/force_fields/oplsaa.lt + import /usr/local/moltemplate/moltemplate/force_fields/oplsaa2024.lt import PolyNIPAM.lt # Define the SPC water and ions as in the OPLS-AA Ca inherits OPLSAA { write("Data Atoms"){ - $atom:a1 $mol:. @atom:354 0.0 0.00000 0.00000 0.000000 + $atom:a1 $mol:. @atom:412 0.0 0.00000 0.00000 0.000000 } } Cl inherits OPLSAA { write("Data Atoms"){ - $atom:a1 $mol:. @atom:344 0.0 0.00000 0.00000 0.000000 + $atom:a1 $mol:. @atom:401 0.0 0.00000 0.00000 0.000000 } } SPC inherits OPLSAA { write("Data Atoms"){ - $atom:O $mol:. @atom:76 0. 0.0000000 0.00000 0.000000 - $atom:H1 $mol:. @atom:77 0. 0.8164904 0.00000 0.5773590 - $atom:H2 $mol:. @atom:77 0. -0.8164904 0.00000 0.5773590 + $atom:O $mol:. @atom:9991 0. 0.0000000 0.00000 0.0000000 + $atom:H1 $mol:. @atom:9990 0. 0.8164904 0.00000 0.5773590 + $atom:H2 $mol:. @atom:9990 0. -0.8164904 0.00000 0.5773590 } write("Data Bond List") { $bond:OH1 $atom:O $atom:H1 @@ -285,8 +403,15 @@ The resulting master LT file defining short annealing at a fixed volume 0 26 zlo zhi } - # Define the input variables. write_once("In Init"){ + boundary p p p # "p p p" is the default. This line is optional. + neighbor 3 bin # (This line is also optional in this example.) + } + + # Note: The lines below in the "In Run" section are often omitted. + + # Run an NVT simulation. + write_once("In Run"){ # Input variables. variable run string sample01 # output name variable ts equal 2 # timestep @@ -294,13 +419,6 @@ The resulting master LT file defining short annealing at a fixed volume variable p equal 1. # equilibrium pressure variable equi equal 30000 # equilibration steps - # PBC (set them before the creation of the box). - boundary p p p - neighbor 3 bin - } - - # Run an NVT simulation. - write_once("In Run"){ # Set the output. thermo 1000 thermo_style custom step etotal evdwl ecoul elong ebond eangle & @@ -314,8 +432,8 @@ The resulting master LT file defining short annealing at a fixed volume write_data \$\{run\}.min # Set the constrains. - group watergroup type @atom:76 @atom:77 - fix 0 watergroup shake 0.0001 10 0 b @bond:042_043 a @angle:043_042_043 + group watergroup type @atom:9991 @atom:9990 + fix 0 watergroup shake 0.0001 10 0 b @bond:spcO_spcH a @angle:spcH_spcO_spcH # Short annealing. timestep \$\{ts\} @@ -327,7 +445,7 @@ The resulting master LT file defining short annealing at a fixed volume In this example, the water model is SPC and it is defined in the -``oplsaa.lt`` file with atom types ``@atom:76`` and ``@atom:77``. For +``oplsaa2024.lt`` file with atom types ``@atom:9991`` and ``@atom:9990``. For water we also use the ``group`` and ``fix shake`` commands with Moltemplate ``@``-type variables, to ensure consistency with the numerical values assigned during compilation. To identify the bond and @@ -336,19 +454,20 @@ are: .. code-block:: bash - replace{ @atom:76 @atom:76_b042_a042_d042_i042 } - replace{ @atom:77 @atom:77_b043_a043_d043_i043 } + replace{ @atom:9991 @atom:9991_bspcO_aspcO_dspcO_ispcO } + replace{ @atom:9990 @atom:9990_bspcH_aspcH_dspcH_ispcH } From which we can identify the following "Data Bonds By Type": -``@bond:042_043 @atom:*_b042*_a*_d*_i* @atom:*_b043*_a*_d*_i*`` and -"Data Angles By Type": ``@angle:043_042_043 @atom:*_b*_a043*_d*_i* -@atom:*_b*_a042*_d*_i* @atom:*_b*_a043*_d*_i*`` +``@bond:spcO_spcH @atom:*_bspcO*_a*_d*_i* @atom:*_bspcH*_a*_d*_i*`` +and "Data Angles By Type": +``@angle:spcH_spcO_spcH @atom:*_b*_aspcH*_d*_i* @atom:*_b*_aspcO*_d*_i* @atom:*_b*_aspcH*_d*_i*`` Compile the master file with: .. code-block:: bash - moltemplate.sh -overlay-all -pdb model.pdb sample01.lt + moltemplate.sh -pdb model.pdb sample01.lt + cleanup_moltemplate.sh And execute the simulation with the following: @@ -363,8 +482,13 @@ And execute the simulation with the following: Sample visualized with Ovito loading the trajectory into the DATA file written after minimization. + ------------ -.. _OPLSAA96: +.. _oplsaa2024: -**(OPLS-AA)** Jorgensen, Maxwell, Tirado-Rives, J Am Chem Soc, 118(45), 11225-11236 (1996). +**(OPLS-AA)** Jorgensen, W.L., Ghahremanpour, M.M., Saar, A., Tirado-Rives, J., J. Phys. Chem. B, 128(1), 250-262 (2024). + +.. _Moltemplate: + +**(Moltemplate)** Jewett et al., J. Mol. Biol., 433(11), 166841 (2021) diff --git a/doc/src/JPG/PolyNIPAM.jpg b/doc/src/JPG/PolyNIPAM.jpg index 4ad3ce82746d1d56c1ecd17afe9ecabc2d80ca1b..372a712de10a47d7d8d753ebdfaf703c1e74925d 100644 GIT binary patch literal 96641 zcmeFYcU)83wm-V4f`C#4q>2bA(n9EUBOL+hAiX8@0Md&nHY`}^y{S~`y(0>WNbem4 zLNF6h;V&h=Y{~q?j~9L|RyqLs(K; z6d^4p0ag=a{LKqY<6xFX$H~XXQ(8#K-CNKWQplrxM!9Sv|-LZ4h+H&_2l3UJAwempq4TfOG)H z6NC1#ErC-&H+=jwe#@xk>dpW;~B$vYHR-?{4ZsI!NA<&W_$an_<_a$mBhRa13l3~ z`e<(tUoU&KiXYnD=gjZrDEmKaJ$=30a0fuy3!&Z67%blwbIDolwoLbKAz5$0<4V^J)10P#ha>5d#ND&bUaWN@zF$si-)Zq+cw3j!q z7nl^zn{doaD|w-9eLTDjJv`jxIR7{s{+>3lX_T#xt+K5T8Z7(cdxpP#PXHk*jR1Us zvr21wpqw27|GTNM7vWT=?(7Y=4LtM+1N4={k()CI&K{+0?P2SdM6yiU8H)*L!<7 z`1sp;p)WWBI|32_R)h;T9OrP-<^4U+-w6$i4#+?NAtE3wW+*HsEsT&B5j~WF(EmmL z#e{7|M8w7I1yJH>V0yL^NC7)ZF|d;u5-BR~U@Il*Ao829|Bw8O!~Ba#N{fmAFYu2N zmbA4+Iv@lbBpsv#L>(N^0+Ld|?uEe(G!iW=i4q1z^FNY5;9p!?R9IR>>VJWMF|>#{ zTGT-lFf0Y)2U=1}z|H{#5rmzn2ufT^5@{>u@IT~V!Vrm+Mo3AE{crG(ws!!rMi|&X z3K)^7t%$vVq^K}Tz}{9^!q#3wOjJzb{|f)WghUbl3-U*b3p+U2A`l>CI!FqL+Bt{_ z*x3r(3)rFTMTEsAMMOo#?Ei1bUs&RQNB+XLwrD9~2|EEhI}tkpQE?D@B+=qx0=7t$ ztt46uVQVY-Ked0!-!b?f?MDbM1@NI%=s!kT+`WG&8$h_iT>`ZTJp5DI$aDPr^=}FM zTLS-tE0L zPp?v;00;sAC=M_~!QRu$2aIjNSlr*o6CNjk@d?l{qQJNSjQPC)gJ3)gU$?`LSK+ZE zZcGS<&3~lEB+_znQ`lN!74kj z${Df;E0iG*2m{&T))BAGro*y08dUNi*lM;sjdczSTK z{|thNCLyTV{qOZ284x771FlE>eT^#}f{x#YpsLotui3>zQ1x91IyvTP>t&1E2gdsd z9ROUonFB#orVvEe3qeQC@p1$A;QP??5ePB_veN2;pu{8y;&BADE&h{p!puvb7%HOkfZ zZQFQDQov4F&v*;gKFhMGW^CJaQB_YUvtiXnP+cI%pYKx43=x2 zUt08!3G`DfHp2uNZJp`SdA3Gn6*aZCc1d7mDA_#n&9XrEv&nUgK+*zs(J`~Sk>h*e z#g*;2ui5FsyA3}#_XIlUzzv7m5Tn}K6ibHnRSB89L0@_-vM0Pe10QYwpzp?ZO?{g6 zDyEhmaO~N5w))5{zC>)!_`P#KOTBhSp>J|d<0O^Cvd3AnK;Ipiq1VgWjds|*$jxb; z5chZ94ykgr6GIH zZtn^94q*kRrw8Yz8%--~S*@N;E{^Yw4XmvRW>0=&PnLT>vi_ubd;0OQ`~E*x(#um` z$~J|k1^6%il~H$6eC5f&MBVq^B+L<^Qn788#yVC@{S}WKqKLp7Z{*6np0F28EROG^ z%O{djEi1ca&szwc++Iv$H6KZJeN44Mzk*52o|x)B1r*qrBG@{d7jN$7t#j&8dS^#@ zWm$^(2seLI)hX|uVsZH}+2o$v!INzpwyzuOMGW;j3dMuz%=KkhC#Qtv32`l7R%HZhnGOmb9_16vK|=v=fZzKAS7;vXh3Yg&jAsWhe8}$ z5J9LqWb^8#13@T31Vl<13UR6f54HiMsCgi$padfP{NrTEFMsS-1_5CUNMH#NAxFf~ zXbFA|3NYaY0$zkVi9i8&=YWoe;z(;i1S1kZ>#iHLIC_fb%*T`w&=GeMaljObAk)pD zp5o4y0SVRw=p-EP38J~kPeMe*4j-slHXtCN8jyp)9@IR@y2aA0 z$?v~@X6IxdEi*rd+Xl}*L=rfkFS8eHy%@xU@H=N=WsW1oPnc?IbJtFeW|)u%o+-dl|C8?k*H+AQxF7~A$kU230iaepO-B| zLT!0_kb0`yM+Rw(TEj$7}$A9$ft8@D+ks! zmZg+HM5GEhVctLxfa(F2TX7O-#5jMCO)h6^LcRUIYx`%R$0nbopEf>G$r+&qW*r#; zA%OKGQXPXkKJ8qQExs;bzLSLX7?SwGldH!->&sq z3nvxq>Wx?mrb>tlEbh}$8Ls%%=YbRz8fX+qH$*-~NyAk~>mRr>Tb8mWBEx1`UR`|F zu67ifKQ1X4Bgf#8IlR9wkobD4oHEmv@2taxTRgzxf!1!3UbqQ+C#*Ibs4|^&B;9ak zbB)!*gIx$2)VcTQh|C1d^D)7flAA-_@zYxy7;-Ku=_a(e9`^R9_TqHM>%8S2GNEbv z^o^w+GH9t@dBa|{bjASo`#KGgz0!M)#cDIrLp#vLIf#(!AqY{;Hn>>SjB}{UvA3An z+^U~HXWB-$se&klbNjnz#@n8CZD`D-^cvJJX}-Ft4Snw-Zt{~TU21t8jLjQaeRQqm zs+b{mZKZu(Tkg!+qF@8!szK6#V872>0rWozjqaI}%Ffs4vwhRLjwa<#SdI z9q+kA^Y|4YdNwCu6sVnx`@Re1XLAQ^6A{E@bXHFXhJMJFuLiLI5`r8MuqZf+!*K*6 zxJeR9bVt^qu}sc#MQqVg&CxT6sUX2t&zm!pgctn&om=y&@Hl0$U$K7nAmS1*^~A#Z zx{x1{poVSO|0SWLc$2uhW`N>Jq9w{EkYtY3PNEpm71- zCVRdqv)n!baS?(P$J+CL#p}3U9iB|2)FkY<2SOy?o64F2F)})YQ%jfTs(~FBdD2K@ z-b_vXUykt^7Uu;hn}y*h1l;Y5{+@J|qAKud`p&xPU&Sr!>kS9c)$e@|y>6geaajw_ zWTqhKmk>miIlc>I3b~Xr8%6wBWae1v@aNGKfwz|*bX++>c(gr~^5(MvjxTn5;#KEW zksxc)h?(?z?-uvCcd(Yb(A-r0j`OL$r&xCTib@5|cN>@**PE2nG4b z1`v7$awKrKBi2)&mr`|(t#wbVvTkS=;E!L{e4Jh=lYcau0|i}es#%fmuIia{n|bog z4i^qV*g+_i;HE-=2q39NKp)gy+PE+lI6cz*J3j>Eg`9SHBTU2rm6p?X;gt1vK*i|{ zca4@8oC!`x1tmmpG_e#w3V%BaoY_Gt!zWd^Xdv#qb(oi%Vd4EbF?A;@<vw@h- z<2VD0ZrB`oVA8i!+Anb$dIU~XbBJUA%9uE zAyOgc3A_ausOjFxVW{ zb|A?DLh$aWT)bI;@3^xsrm|T}r`|6d6S|9b^&A+<7q6C^-|vwGa{Ffz1k?~84`t{f zE5M-ML9a}0BLXTzXdK?@-Bf^Rh2eY;wDfmG0`*B$FRGcCf)a1F#GRqX&TYQm{kUx- z>h(RYQ82k75fr1Gs-UvGfv_P0a%aLhxNRuJLkS!vlnKhL0a^qh6X@VomJUMjtBy)c zx^r}qNwmoWIj7X#_6P#9l2;Lwhb0w48J7DzkULz{66iVoKKb(9sJND4=P@eQz`T&9 zl-g+0=f%85^E#U8p3rR&R6q~~GRMVbI2z#$-Yn6Vbi~EgES*Tu=q~BbchgCYU+!Y^y$?@L7v3#0NQY>O?`_#(pATtNQzo1_R2?zil5#5mF(7WjZNCk|ugi3< zFDrZv@@pnBDC}x*&qmkL{$>c_D$?Fjc3dxq$C;>86Kgo#{0?g7@riCX-fYW{E~B{* zdoZ3ypcq3CdtreRc-9s9G*!uEuLLe^pR(B6OZaO3wA!LBJoE^4pluNO3TiZmIPml} zgAwPRxI_fRX_LTL$l8RGBTc&{9|_34=DARGyk@->)K)P3ARkAD$;x4}%i9IzFNG z_X|)7{NyK~qd+`75YiY($kYbK#}Pv5!cVG2q@8xzTA5{^2Svyg3Y{c1^l@0gb~Xfw z1lw8ptGauOSXVd5LXDZb$N-w_iUu8;?^sC0nD>w5bqP!F^EQq#Pv&>jPRRvIe65_P zBg5Gsh~X&M8cEH_wgN9S8T7x&Jwh8O6*RVzxei8{3@}Z(;v*)zC6vIN^2cn z(Jo9648HU3=T|-K;MV4kQrWk4ZX0)x`V$T1y^*UpvA+8$yTa#d<*aLB?>5zJ^gr*! zd?!As$L*B!oJgO;wB3=!k#)IaH-V+XThW>^Io%(hsE$3O+1-P7@nKYp4cI&X^XsD5 zUa4$Ez1Hr)K5&&o2rU>%Uci4yh19?~ot^k&;Ep+H_n?Rv}Ha zyckS=j|jS93la%;Xft$@3p6S`bf6j1B2?B&r+Jl{5<#XPS0xU|bXflie89$Uh-j5< zwPVlJrLoIJ_Y=aI0HA?y_BUk<|ouI|Gr5zfzW(t_g?NEe`S zh1vcu=~Ghw$?FgSq)rP;4hJow7T4wN^)TS9;OO@`2qFvt;di(`k&hqLJ_;a8=s8nE z9A-cp2|Pe}aWu%|R6_X!wNaoWRt9YePzQpH4m1lmjzG@~YBd{(k`^3H3m6+r+J>kl zf4O!2HqaXoHsG6>Jb_e!3&%bjhC%4Z8996^5DuXG2!h$z9WQ@HKnFXo7P9GXIbHu#92xfkX{U3RnhwR$0-e;!7XFcAz@>Ekt}Zceoks z3b41>;I;L+f3Hy{5>%pGoqt#0e>4H-9$@@%)+N5c0lMhO2vB(EN7ur8gYpiX5qAi9 z76MeNy@&Oh2nU??;g%U!%mZC~1VSREi~toZsvrTBE}&Qia=p)C!vxnSpzgtMLe7LB z2!-w9G7#;`a>Y8T6GAlug{T)qKukb$l(#^00EaJJjdi$;1l5@UwL@AEYzoW|$8yFg z=@335+CsT>JVgAZys(%67{o;Sw;dh^1)L-Rx&ita=~s&+1rxm0Pne6d2WnV_XMOhx zv~qba&!(xvagzZU^kMagmkAfnG9gX|S6bx@!{)5XZLxtLR?dc*^s8umM1OrBION|~ z9z8Eh{PHO|_j?f952F+=q5l>t08(HU6yEPR3`eFGwg>Dr`4nDi82fG-Wc+i6fAh;5Owgf@83!J83fY@%6W z;GTbV)|?CP5P-%C#KLoyWwz+gE|&ee%N<5ZD_d4~b-Zml@Y_C%X1u11oIGYVM@H3?+&Wb2QDe2>Ic0)vh&cM-!0T^P+Vgrl|`N;TVX%P7IJq>^&{k+U=y(s&_Q}0?4H>y8mz5l~3d?Ji;&O}uq$GGkFnR@|A2BWv;qg2N z1?YZkr2^rdS<|g2G;<4UZQ0S8?AF$oc#5np&tPwD_3jhNXU#cQrTSJ)#1>i#z8xN8 zRIECw3&9p)^IK0iSnNDM5=8`CJtu?BIl_u0oA1Z@iZZ0O2C$V>iVbycp4a?~m!v~n z-?+{8*416<3JZ*`_7)Eoj8n*f%^PnrfTnsT&KZydH*wx@hKC>;csta-$t0g)(|#+H zZ7?#KBAg=X$75po6+adLimrFF`19Tzp_41{RlQVU-Z9As>2Nq^MM`1QdO^paUER-jIgF4EQ7i z5vdj}zN5e|ghRut1>fZ(YPa9Mt{6oC|#F8@Tpy4}xxvW zSAzpkJZuy2R4aX0*RK>?9Y8+PT9e<>(rz}KYWxVm#A6wL&zEqy0wxFWXu`^^)s3H> zRkz{`*@Tz!x4v+N0$P7KgX8O)?~J#Dc8@${G-<3Vf9(XF;-y>W!B=6hLNeIsgWtOm zg-H=DNzz@GImNm?Z>t$#y|Ng? zXc8%ri2aC5BcQS)QY=oVs!J;Lmm1KnO1=jm3@Q1zuNaq=c(tYqsho$vBl&?scn%c^ zcQ^w_2m?Yw=F%YR-rJE80g-+*Sk$aGSyO@n{-hiPuh@@S2j}qn%=b|2uuw_p&5`WL zuz%K2z=daAy8YeRofky-M8DTuQ~r$nbu;=xpANTBeU!3#Gz8~%01uExh;8mw@(?VL z+@CT~5Gon{8d`&d^APk8W&zMsL4?cmH!D4-%r=M~YCnicN(}M31*02qe|U?7sB5ve z>5fKdpi0nM6OAp`=c$o11NGzPG3sT~ z_aGO)gE=~q7Jpw38HG^a)L)~!l5=BZIB$WjPqVi7pQ|IhxyxoZF36mI$`rKyS*lt` zpZ$m&ZEB+IdgJG9Ko3|w0Eds21UQE%T*YR@4>~Wt*_L*Ln-IdlhSkLe-G4#S`BrQA za^~<6vX1_{QC-)9KQ8AaJ-I#MT;D;*fvbnOLZK1W$JP~-&ZS+<^&wJcy7ONewDGm4 zH7nq9*hyUQ1tk(LI+UDx-(2J5z@WeBR8biH9P{tG- z&s(HF1Ux8WA&C4oumm{u{p%Ir`2jLgf(Up9<9U#Fgm1tFEZCef)L4rN-U|QQi9#ay z8H6|y6$yx4R)I+M0XZ!uirAA7l%NjIrT`LSC<pb0RsLNp$>kI15Cq33IJP3fxbx$2NkJu`Y0vuW;0}71X zo{qUXv;?r64~HIp0wUH`hps+s%6xsr!<6;;JJc(vTuV?ts}kX>I^yOM3UJF$=t4Gu z%ulF-?};Iuq?M^`w|wN|I0!b&`ir`ooxGnMBPg93x3n#Px)?kl@yY#C+QiLWzp7dv z@mtAXiWpbz^}py?`F;R}Kx}IA$xR{ohcgrYk(1*ImR>WXU6eWRJ9MRgcC@4gc=5{{ zUlt=?S!Zd(Qmw^&!Um4be7&W=QrkNwk=n~LWsLC;&dJWPzdFtEEY)%$put;CNJeJ) z^RF-tGCI-fi&%P0IL~>+( zORcENZ|$Rt>F~74{ZJG$`ScIRc;C7pKfmCG-udhhboJ-*?fvhM<*->fjy9IZA|-TsG^pCb4TX$}_38@?i`_IpW*ft8OOZi~5ksNpTlRF;3tm+qFQnl8AQIno1`f_bpj=p||S^B7d0BO(gR;f&~=4_BB zRT}q7r>q=NfOrPLLw&@*TBU7Pzm)oEKQI^M)gvUO^L%^i`y(+KnZ3`>q!-@E`OZI| z95+78zxmDdv-XqH#WCh#@EFHjT4PrJRzVk|3=r6_Fj=LE726%*_7e$`q-~R1KQ60t zbwbA@(<*%G^EFGw_C$hfEB2K9D=VcKQy4>oSH3D;kz&${JZ~MDKHaPUo;6tQpS6O| zKoo#fAlACc*V-6(_udWLKJ&)YFRNJ7s5YjUjZY$fw{Xb7b^m>W01<^hB@++ub`ZEw zuRwiE7F+lZmu3qpn&EVGSlEzWl1k_JyHo--5ialXz(F45Ex2x@1`Rc+Y7R5+A-sFT zmo9$?@$s^cbA7!K^6Qn{wRL3 zWf5IuN%eT~iief+d{OGLZ+&~0w@G&yZ7RU8j&Pd#D4yR&y2 z)mlCM5(t{Gtc9Z) ze{ce`&i7=rK;7UC?f~$!8A)LFF$tF};O8$8pc?!;#o()X(hCr{L#u$pKa?Y&lbpbC zz%3&16qYzOP$Lm|EQ=UC1qPnF0x$eiSR6F8$RpHrr#TVAiYMsBl`b%Fi=E*T5oP32 zumMkKkr9CZCzXWo0NM?YLu;s;xtuwG!YW-b*y^iOGY1g+9LqZam5TafdWlBe2T;WN zcxjzkO&OkQys^?}etz?yZmN8WQ2pFJ6-`Hx|*#j9LEh1Z{jL z$UW~!aju%~)4wj~uuS$9J-WR`ez7}MA2luSobn=Rvb5O3u-2Z}C`V6BceaZsX29nS zualVz_iDcS>?Q1j7rcYoD2jfsNYT3(8nZj5JP2+1Z*5Cs@=woPn0m$f#x0vkoz3N) zhf3-j)?ZnCkHsq;`wP!##6+8N?Hav!aH4zp0e7{x#*h?KSmc?FPWi}(9lU4iK^uWx z{8@}PQ#dY9>Q0vj%#;qy1vLvo@_FD>${A%r=*O=d*9!E+`w&oTdVaM zb8pG@Hb0Y}Rl9eeWe*oNOkbgite7+1o%A||xf@nJ*-dg8Nv<7n0AacJ?rNA#d<{0H z8QI2M`o;M*qgy)m{D|nn0rZO{=Kz`)eEH7Z`m>ze0aQO`mG{=7zJcVN!*Y9Hw zpl^?#1)E-fVkKP3Wrqn)q>foe@v*E*yo1DX5HN)>FXJiY{y$`bj!6i9AiA^Gd8h!FSnj{ z#G7HfuoYWg-FHbNwUkfB4AW`ZM@2oApJZ_5QM}o3YHd-SH*Xn9W2QRy{vIl%p*gF*~t0hUWpSr4eOx7vpalx2}G8#7Ru_t$Dr(UvtcY8Xfmg;iuipp&wviJRn&IRpc zX)Tt%s`*^$)qE9tY-;`qSNHK~vk>Losx!&z6K=MNs>xL`>D7d*H)1r^$o_3fB76AeT0-TJzlT~A(q19)x?1b;rEj5qSv&&MYT^-^u6|-kZ(Q{S z8?BeV-C(2cKX+?b6lGp|-<9d2DpN{cxueD{@2cm9tM6ir1k{sWxC}@096&#d1Zo!D zo%)o5Yzr%y+uIHx!{5gM);4b~ZuY%Q-t^pdm)bM0zwCC~<$2$g^B+Jdm0LmR4xu!C zT0{E>cYJD}KPb0mjeR5QrNf52gx-it#HNLb3O{{BiP7bh8$a3m7WeH1GyDDvX842j3tv#31cltyyE|n7WKaQtqc3t%X+rP!4cl3tmX9^#_D;K(2 z`K7~JBHN;DKQ-R<`55zHqR6Uzppe*?b_;_x`ivJmBE4@k!r47V*x<_9&0ndR$KFZN<-$ZD{F~1%Iz(ssryP;QyS08(wR?PAsi3PZZyx zIw7lAIrE9#7WZdU*wPvRU{zVQ1jDIn+)8+{+1jQ0t9U{!o!m(wZkWt3My7`ZZ_xfG z9B^|Gzxdu4lA;Zm%Dpe_XWFiVeeZ1@M{J?eOs~BPs9hgZuHL)+YskAju=w%CxiqP> zWAVH7$$GhiE@C8!4i;tK_kfv=o;`r3dT20$L*5i-&e_-VspivO=~SkpM;k`kxUcB2 zMp-dpl&k~6v|lct#trl^qn!t-(36DCRDP(XT70h3fs*@DCVJ2WO#-oeUcfM@o(TA1qH)DM0qxr5BO=7p*X#CC~J8RKf z+kkrME39Id(6Nb*T!9af7aC$`d7UnIVP0I;p3wVBA`_o|{FyS<;#oK2YUw*H@|T4| zU(6-@q_(rFDb}$Lc&$fEyRC-_SvU%L3g3Eu#n*ITuyw+#S}9@0A%^vlC{L1%0basp zHy4VmCE6-uldRVihm#C9tg_u1-lXkfeaYR+LorvT#5hyVuf-M!+-H1(weYpp_0SKx zQfeNrnWwhGNFT}O`E0f%b8ToML?iO1Bukz2Y|dyC=Xz1Kx8W+YL&CdlRk6nVJ(H)R znNRSy9}!CY@Jpk@lHy6ei-^lxvz0*1_S14?#&oiaiI+^>c5G9+iyTg}vX#0+N=8(M zVu)DwwYOrzHE-ux9=h0jRlny|Ipwgd#kG*!QqdsvRf2YPJ;f+m{E_ba8;Max-Ura= z0rbKS%UjTLmQ?8OQg(NDIM0<8k&(_5suhz{;%FpyVXe7QSM`tyf2+m3MiPZde5*x4 z>WQx-mr59R-re_VLdnz_30xd}UQlcO0y9Uh>VO?*(y!SoSE+e1XSNoM*-lnye{^z> zcPje@;{z(aFR{lmuVstr4!&|xGGI;^e48yMoOe@s@Wf0rUvtCtAgk?U?EQokb`+*M_3`#%8_ERBhy=(muWL(U}TuHvMN) zrEKk2o^svJFTd1Al_#C$wVihBss6*t%)QCw_bzl2F{k>H%pYjEOd)+D9Tkfk>M~4( zG^jVb^UbTUinPnwQG)V$!VhT;%Bs!tJu-Ku$a0N!D`ed&}Mm2C1bSLXSWYP3| zzF&m}v|-&LjB%%FK|oH}G1Ko5bVqOw$(9V%0pm&nTY_0Ba>~ z7r3*4sqjCzEgRg4i^ahvVD|?1t#$mpGC@=4#np88+%cZV5no=~{`lB1)K;!Hl>R;_ z_k7W-nko_APqe6Fn-C4{W=GI z%Xy5{H+*j1QkF0J8H5Dn*Nz1&5M4;wmlF%;B%*>n@(Nqq`&?g?fmA#(RQ$d!u@G!di8Uj27R>IsJ*Gi1%s}@;=5p<^SFKDS$%rXK2}L| zu=;*=AD(??A!^I|*mU7Fqk)Z9f-izn|J7X~x9B#`PLN`o0zK5HBd4i1$o%gUmrXUE z2~rD)oaXYs&o-yJIfEY@USa9*+kS*)>6gd^OCl<%rRb~x$8yj8H25Gc0~`EJPO0HEj)&Vaui0j)K3)VY z;dsDp?Jn>GziA|3&r65DDex43d{PaS>ht`+Vt}bqUu&O_lAO=w@0j5P2@}>(IV=s6 zW77q{3}9*epm8!i`&gq({yQW8OGmgqNrXv!^V@+9=^BR%7rn;ri8!MOpL}b|Ji`a+ zu7ZLrv55J-ab*QfLDLK!*65^=O+nLZJ#gkk%9{#_eO_DcS&;kdr{V{1&R>cSqlQWp ziq%7k7WdH%yNpeRLcy8X_dMGUF>htvcS?S*$7yQy-FH;ONJ}-I`J?$cDiZvg*)Jwm zfA!EVo3RH5?QSN-{NL0MTmq8FZ3aXThlJ#IwD&{dx8oG;HRSbXQ}z=DOClSym^7sfri zJVrpbf-78`^wx!pUZ)FO=02x0a4Vk@M}i&j)O&Bxz4@lCjj_gd$ZIL)=R+641K!E4Xt(`Br4baIs0s@@Vbs?a)HHfm!S zc(aYyqVIYbrT9D60D$K;D&eg% ze%@GxR{8nG@Z%1NZOJnC!}mZ?FExF`Ggy?C&l7=W;q_NHn-WDIHKQTF|H)IJsQZ~r znv6lt@w3M`sZvIV4v1pApmm~%VrZ!4 zX>pJH?0)`Dw?&CyR=%cU5haf!cCAMJj>Tj9HPXKBSDWvbn&#KGFHL#*8zh@&`KI3c zHr$693^wrd<*kt7)sMfOS~wuyC)%$Z_2#NUtA%(Zl5Q0GZrO65A3ohUFeD+= zN|Mg)V_da*?}uOf7a{R}n#zemfA704+dFH`xtB>1RLfUDKe9HO88zVJ^D6VHq%)t> zJ99Rp%nuTUml`Rf$BHqF0nY|JoGnG&v&lOfH}}&Ly-9_5u_^l7${dkq5>Vi^+IZOh1{ok2Q@nugMWIi}C7(`K=CvaND zY_s}yY}UY0n&v1CPKw=jtM=X37kM-5gLATqPKICGh^};gM{)c&<0Z z+sl(@uV}v_wOHDORdRWsSa4>k>E&fpYxDB_dNnk&IhYmFxQHbn?* z{}(j+WWa)wu-7bPZXB6$_cfg1F>L;K{S@a*?bpxy1KGNoU@^^m4sov;F)kgoZW>A6 zao;0pLM&ZI^l8n5s+p%A=4kvJE_%&osX<@acXOzn!q0KK*N5+STiA%fwJnGLib;jjO7Yy8Da=P>G`cWUS9_{rS&cBYD@G>L&9LaqZ`0 zs4C|2^P~TQ%ggV(R+gGt+7~y=8L7|)@poi|@+$d;M-0}YVqK}H*Opxq4XXInMmRsL zg&D87#kX+>pB=R@oHBayxcXeVv)kF1HASB~cjW?x3z;c`^~Z87pD|xPQK8TfJ7ek3 zuVNl#{HQz8J>6%jdT^?xkYtv`;hlwcp3gNSwAc1>V=4ZiT)j!6jiBX8k-_zM(}9iOCMY)?+^%RW-Zl#UIlZ`V~xD=hU% zgr$ae=in3@Q0=#Hi^W~Pr0PTF8EefFDIUWDM+a>Ad5l?8sgp_GaYs(!{wFTZ2T*OT zZq(QyOTdS-($d$b+e{Cj|2xU#|IKoZ`duTUjBPdO1Q=J6dizu_@n1edI2;6LCjR7H+=K@5m8`p z>q3PSnUg3yQc(HSb|EL-3GBv9g#@*ptp;~auK4-c$x2_-SQkTdQCpSK4b@4ZMZj?w z3}l=MW77{dHL=XGbT1qPISVfNgBP||^EK%6^0TR5Tpf!gbw1MZd-~ZhHr=0f9X~A( zn=nv{Zh{0Uoq`0Fb33c&^4*1D>p5&EeC&OYLlz@Jtvomz)fl}NB{@5Eyrbadn}NeN zX9His=C#1kNMzfw+-sKTUxF!z1$2|OY%JVeNb!xykDZw~yqkXNG6>FzxYLG)cfn$1 zraIDt6A?2BV={g~bQ*tyFdP;dn32)(US$C{BE3QW86F(cGkb(D6L8W4i)jKYa1zZJ z=)tcZ&GaZ|)lYB~*3*F z+AIvf{k>GD092!C|JhwYICue+eT#6}_pxEw69&?_uC%;36+d=8JO_E0oM6(Rq4;u1 zt+nQ3nxwDN<_iDI9WQ)=kB1k}1>79*1Ayk7tSSs^eogv~Hd3B@0$&HPCx9&}&ftJc z+}CqYbN~bfqh?A+>Yd#u=6+8iKQn=!4Qv1XnP0J|@n2cAFuJ{M05XHIxH-CdYa9*- zP&TKKMHol}l)55MB@2zgW{~?6Df0QuX8@ToKT^%6cB}^QSwQ&n9E_kTDL+=NT(HHI ztJ6iuxo-C-RqUYuCLKv!M&*dm7&cz^rGr`z_oqW!c(OGncLiB(_Hu=8$jEhAVo8!c z`_08do{NIHb^fZ@3KSzBhCInR?>LG*-sQ?bN%&v?fkev{KjwQk&OKD0)S5q!jL6tb z-xTCsW>__k*O!RtJfblw=Hcx#$5vr{vsEe6Y~Sh(Uwrn98K)!d)9;5&2Bvs-;D!QN z;VB%1S&aH&;jp!omXc3+EAGYKiLp*CqpGyprvi!((CEjttqu1*tKE(moqeq8n$1vW zZ%+`(q*wi%*Kn5&m6O?c*XQkPGo!j{3az1`Z&}&WwI}xF+lqNhJ*=+jqu&%8tG8Be z8lG3MBH=dw=VLqwNik7!xnyBdmo+Am#qi!?Be!li#!UW&e!EK0m%fkdR!K*bT!+q| zFdZ;lXj4tp%Nc!QJAB*Oim)fD=D}T6OQ!3yH}tA|we{rmg%(}Umku0%eon9E*DL}0 zjls3L6T0K8J-gT0BYzt)j3PhkVzas=C%)R?c|YUJB*0uY^IJg(#smtR*E}rAja9Sm zOuCebDVpUM^vO5eJ=;=VNb>86+F!4CFMYGBn=u8GWjo zt38W9?eS>tvm3P4OHZHS!P&3}8#q%0Hl#u{RsRRs4Z?xFz`AV8jMMNKuvzRE%AfBm89b9HQ<~2^NR_plqp&mbduM;Z+97yfCKw3EJ^n3R zVFEhq(s?tTB}+D5ukmMdpDw4Ugo{WSk7HMTm_>W*?mA1>j*rH5nLC^*GcjS5BkWIz zDm1OPZs$7#vy{l@)N8`mq!~pyN zB0t9UGgWc<_*MR3hQc?d^+A|(emg`tQ&>}pLRZ^~voV=0HuzkCQ$LJc0QFC>so&Wj zWdANM@W^$w zx>VCUROt7I&ErAM7c4PkgJAyS44)rO3`Q$fqh9ShQl#Sv_z(u0A^AdNdivkcXMB%P znpy{U(EB-yU@=a%3$W14X|via>x0~u&OBBYTm8zWh}{U_ukUXx!G@3PQ-zCezU%10 z{@ncj@oJfg^Wa6bmzhP}%}h(uw+7jNULF?Hd{FMUJ+4bOA9ZD!QK!BS7T;YhDp zoZhM$YjnJBUGQ``&rY#xormSIT)Q-oh5t&kmIWQ?QGttj`)Lcs*G#57EL21^7E~-G z=tm~SZk9x$PXXoLH56i`Vzj?pDJZ?RWZw!2;z!sTw&Lkc$&V=m85PK#>H+UHH2mM=wuG+%>AN8eaLzSMPBE73R5(=S%x@#=h_eFl7k0 zqHtl~&{;1EkK;np?ws6D)pY7^ekz}u$HABZia7KVK$0IW!uX>HOPiiY%LDC3=XX;^ zJqHMtf@HR5bdOTv70L+Xw`b1C26*gR}C(= zZm|6Pf#>#TI8Lz_*HQ~7UylwpJzEQ&>!19Yb&YqV+>#>K-)!;Ys(XsTdZe~!UUyqc zflBOve`LAjGF=%Xnf7%*i-aA=22Hi4c)W_H6&cQ(yNqzhx|^FYKz# z1%MUT%3ASJaE)rp8GcRg10nllyv;O&|P0xP0 z^8!dxbKZiHP~RYHew}FDJ$+Mj*FY(sWnEaF&aT~3{~Ib&C8B7W+NgIaEmo-(;>cHe zJ#VTN0!{l%BO>hiaoy6AoI&~3Y1CqiGR`obCvRLH3;$3G)38(l6ON&_)P+?2vfi^nCoZQr@besu( zb8*6uJ=;We5s27}X#}Y%CmDP9;_%`W}E8BP!`SA?Q zY3@BsW+RF)N^s*{=a}I`7t9^1Jtz01q;saI^B7?BP|x}$-xWwh`m?&3&IFsQWU`>6CuZNBpR3wZ&~x#8*hB0BcpBs; z+$uqib=1QdwIb|}xCQypzV88^0a_(a(0CzVh-b80{(DYhNzw|Tjs;T14P>%H%#C=W zVr+q?vv6o~IhoCl)bwi04LFO|&naI-AnL_wJ(K0XOqtxc;ZG*ddA&3Gn z;KCW~kjPDB@ZY)MljX*z<#J%MF5B$ewLDFdCH6#;i`i@oW!mg`BXzlVo6-87HX?1b z+hr7I4Qa5)Hk>eWn`zC_G<`j8@ztFIx6d&8+1?E=+qTNy8w8{|p&41kHnw67tf z;x8jsTKyj(&P5n@`5z$;rWScY*DoabqXm5nB%ye@iN{~E{JOAy{|~CpWhah*X523z z8Y2FAz2Wc2YvY!GNi-xG*5fm(ex}>G&%pT^fqe*jCce-1_A`UF{fnO=X9%r}5@ydx zcp`8L?iBI?F&j}P=)!Ee@WlKzh|sRyTR@UO^JFy9hCk6DJd0TJnH;}>Ei1_PY_X8{ zWM$houX4k*Y6--i!W4 zb~ebJ;PbMcapv>0X?pl&1qdOrS72VnSuC_|kk2UByiXxAI)_~R6<(NPh5n2r6$))c z)8K|q3;vw61&TUrh^C<;WzFYHf%?cVU}neJu;^z^VPm`N{iLI36D0~KIdx1K9k|Vc z)A9WY^kPWZ`&leG8=)QYa+fOU;HJf4HJ9TQ8uBlS+O;M2c%fe|#gBGDSfBviUXB4% zj?qiG-m4`}z>i;1HE5Sc3?2@}&RPa0T-q_Jd4PY?{a4O%o6z_rxb0-kR6F8K;a$ol z*LC9Lv|L0s0Y`(X!&QwY(?~xUn2-97g{({Iv97_hc8?&k`9iFUok5yHdtIzZ;1HTsd{;wWIAVB(*L9MlqIO+Kq%PULUP*kaSTQ%zZjq4q*H7#zo7qZ`;-iM1$OiVfOG zSfX}*Oiwn| zs=IXT*F-~h#R1u8ds5Y=mG(}pR*z<)AzduFS?(V6nDZ1~Cz?H#!z4>$5F$f9aLFz9 zF2<-&cC>J>YX|89<%kG_zoW}-R&{j9SMMb=1%lhtBv z#U&f&BC}m>xQ<_O1E5JuRYU8F7pC5#omZl(2x~@boNQ}z15YehRY@V}GLx2KjFq~0 zaG1<%mV`MPNqLd_D%^^v4-#E~kV}V04Kf;qu2}w$l%0amO z^A&NIs67yY0`D7O6_a&#(IE+^6@}(3#a@ooM!olb;Z;63zsFxm4!qBRP4JKTk2~NI z;AQ=QhpI3p%tCy*KyHsT@3pFkak*kOm91Qo4nUQ^NUSt%Ol2VKCF1;tD6K=1O5egf zkulto_h~P+ZMZhaCZkOzH8*Ne4tcxbN@SzmVJgvZII1l^-7n8%S!}vpFVDnI(#Wi zUXBFMWp6VqgqBlJyi=rW;rA;6@i+BLD#YY5IyQuqx*o_@PP6Tp;qJ=jgIb)}r&6@5 zi=^-U_~HD97-ZB+6E3Db>p6AzrBciTf%_rDr8&BsC98_qB4Iz+$~^tICqrH=>gQEv zzQp^d|7}oqS_HKyCq*Yx0;xtw|ClN8yPPsbm0ew zpSs-9Ak~nC56b9iRL;kdS`lNe`b3qWiC&Gv`)1ZeU5_#PJU(Uk)|ikV3n}jRF@CQX z&sR*;C(`PeP=(&cK(x94GmhUu%;(X7QtG7ROK$}W*@OV#%_ zTy-^CLl!y$>6Hcx8#9N@Yw;bj=Xo1&c(vA}iEzz2XAHyoFo>pU2@=1M+ptGx;TlgE zY{@OknM+WRpt0>M$Z83SO8pbjfUYGcjt1EjLH~l--w9afm@Pcxa)_fz4n#l5cRxms z$y#eXvB_F$9>g3o9%?2DQarJV+*^)k23%_m$4HGG_%{ZLfbQSqWD(D4A#&Kze5omt zU(#E@&LH@E8M0ao*{#`GX+01*{<2OFS>^|9d;vrN&N`K9UKY zyenhms*^;BcI|RzE47h(Pa?~V-HU1sXDJ;4!d3;%^;#vPL%biDn-ED6`x$nHzS14B zo0Qq>yq0Z79aPxR!X}letS>rrGR3C&NPB6iydEQP`T-m7^_{yRww+kI0)y6b`qwwB zL~iy_v3kv=Kia8B={X#L*uzWk(G(imDmO-vt(ZjP7JEc_ER=)GZ>L5C;tdd^@{%5@ zPX`Ih@nPut_v8a5F6|V*euA#oH38ATN3mj;X^RW*+z#ae28MxAZy%dD#=?Jqhk9c6~bi#YQFMk^s8WdR06)j|~lUgN@nnnv6$#RdXrg`FpVL$Upa3Q$!Z zAZD}3u}de`;Z*#QID~7BEm7;D+eM8aH(E4>ip+YYG}~^nv3*zUv-&jq+ST0$tTvch ze^31h5Z+j5nR*@AXwxjjoEr)fP~n7D>DJ6JGk;)+3fGX_$$sS8wh24XEW(y|v0>n& zGI4C1i&9mU|8`U7+ooan(L^fo4pa?wJ>RK{cD_My#b&r?>@_ojoR3{7hJsLTl$H9I9J z6?U;1-^^HMlBNgb8MWKnEUD%-NOgrS& zhXG?3)A@qP6k-cdR+KjRQx^7o@$Pvf$yPJhwQpgL=gKFz-CNOcV_Bh}txW|^(&qZr zyT748K3#jrNrGLuw}>jM+$Fi5WgC;D1(o;IMHx^niQ2iVs`)k~W;1Vrb^H@YO} z;y1bkmo%&Cs`$R#&gZHs`40F~MeF+`+?XRfGeO=5xdQ6Hnt4rW#?!Ys_d0-VEJ5Ny zN#Z%n2|=PNX9!%sq2QmJSi;0xhK2&ptVL9rmnUi)(!@ZxuM@k#{fyGjtE8H9s>&vI z_<1sORrOIz`6#sP_r>`mYur-F6^7O%O-c>i!`|DXP~Y0pW@=+c4pW63Wf&Wh zxm656mC!(WWIX!~B^AD)@2oDfcc_)CAJJPd4^;25=_RX(TmBiOm56VfZ5f8R(7g1c zUI#{{dtc5oqa+k4F7hYFHcP%5CsrD|j)nuAw7K(?_9vJ^C1mySO>5lsf04jwS)|j#g#Ucn~b5%E-}jANOa}7PuJoA)8D5@vuha zl|3Z6wZUzZ2nVkz$rUQJX}jFQ7)8_gzZVH&ql@B4zo&8eer(jWu+%2|iH+Cf*N?SmBAL{I%GIvN>N1N)%GieuXKW&C*RcO_|m}pS`j=@r zjWa+8vA>}lUJj07V{$Ullh;ztA{7%YUrUm+zn3=&UQEj0+&Y=qg=5QE*#_hWblbO$ut1~tD31+0kAk~@$38d_nt zn#Q>5?N;oQaDhLt%;c2&^#u^iI6sOTv&Oz5`N!JJF~wGE<>K&?G%hhK1ajOKe+391mHq5D(YY8qULX7gLs2-{ivs%?Dgm5BB4G zYC{|{~F%3fh zy8QB>kj>(q{<36skP&|ZLal7(xx2CemqBM}^tbVrc&jdPgVkUMf+-MkMsG%A=COxm zKv&4hrwIYGq4TD*I#?MM{zVUSMcX4}0**ZKh62uN^~9{}u|hL`o|m5Szt&{)@QN7F zDNHMC{M;X_UwjMvpgrH*k;i+O&NRzDC*pRyyoEvEue{HQ8=;JZm*2?Sx0`xE5k5Ku zkXMRt0JC9bo+`}sHetnp7Cn+Cxs3cjkQ6-Vzs-arF5x{xR4Y+|hxq42Mj3FfZiunQ z0AeeBziAnQbL423E)snla`Ts~6bw|Zr(jJwnqk+O+cZ{NGNwsMrnQa9!0KI8;i>9$ zrWV*2;|?5qVA9zw%G?4P&YbKF+NEHeTJ)}lt@sb>qH-^ZlIl)iBe+3rsGy?wZNNc1pF+KCFjTsyFS zZ6JfviE?_N(?JlSAh`-Js`>mRJ1twoJ;+&}*ISJmf-i#T%?S3`a4RjCv|F>Xa=WgIJ$tgC z2>9=!xp)+lL+j3T4F2F%ESg}AVHCebK5ol^vbEK19*CvQcd3 zls}ZCW$&Z)>h5(P2Z%4NIYC^)W*Z+Eex*wHOX7fE5Nl>X->Y=icU=|9h}%mHArb8#euCXr(PuD;@aAQMy^& zKoiLOsGWhI&RC-GIGT8U?y5uM#yuwMi@ogUOlLxA;DbbXm)^#99kgBvk5xuC?t!P&arHIvuXs(@;R|h*LE9fv?)u^ex zdyx6CC=!-Jd{#rsGi-D`dpfWenb{Fy#>d^jlOd|2JG%r{3CyAx?`HKj`&*C;c>Mz~ zx=lYb`0_qf`@Vo;GGRC|#u0S)6*i{WSJG$_>n$<8V34m^7Tn;6YGe{H%-pJV?6z0h z=5MG133KkUL1*M;oJiJ$yzrhwDU9}?NnVI#uasRW-fRPiqd$V2O*I>sSdRT~t8 z@#SjN(kmB1Hbd8=iXFJnp=FW8gczBZdap= z8)wA4S*gO*&bHxDRKrEAQtiwPvq{k!{>PZDi^53d+)>vDs-M50x+xx3#KD+*$0mgq zoJkX^&KI>&jQ>-@cK=C-#7n6LHv7gr1^lcTiV86js~&?3Z{Ct`^Bhz>4QU09cD&7F z#`FJ)of=sZ(H3PDLg{pZ;&S=1q2A>|c8Q_9;zrS2)^^#ZQqZTzs$TpP>}O?Q6c1#N z7<%NzYJXN>Y#-N1V5b15nAJ&u4PTJ{$PKZPRYATLv)|7{18Z-l>315kmm&sMU-Er7 z^-_cuU4X?Nu0sAcr0efB-!CG1r{o0rExdEprgCR>=W><6wq6ho#Ga?S0RxQ8b zI^=?q`zC;0qmFEm4&oF~nVI~6>w+nx*U%~(nEq+MC|u-0yLSeNy2Dj#WECX-I0TA~ zTU>T_b+`@1xsB{q5gqa-QSLHvj;j`zS$dxna87_;$ZUO_bdFb!DS<9Lg8wQ#RqXqE zSHeH6b*c;@5!;nCW=$2<+uzTJmHPe8270V0g zybtzG(p)SfOB7XqYhC$nv@fAQ0=|qq-qJpCAv4%@DCXVDgKr5}cUXf;=G%`n)b2-i zGLh7F%EJRSIK_~y>BOeY>&4lQuq_b+>VqpZp-k_MXwt>yNsz#5Of0hK(4zc9n9-xUb|Mq@e9z72lE#D|Qg`Yij9$LsZyze1Ib(G{<5~k zx}Bj~4!eF@MFz}FTSc`IW8yyFCZF^_f{TcY3yqxozh>hM{G&WZQrA_=EgYpXDRSl- zPY-~1h+tYfRdsYQ^QjX#%%PWaR^U*s{&W%2tn35#^(t85tA&&k`MJqaT#qDbzrXEv z3vmXX#bT_hd``6Qeu5g7!&0^tbMpvI!%nfbBog^Q@^ZzLKY6cIDhI6=R3-6Cc%AyT ztWxQ$4@Ko}oh>3F@~l@>L@P4Lb%{L>xt5*tMR5?81=J;1_+CMjE1K~*mSxyRD^>K= zotTY$ch5oU0v=tij|%-YiKMSU{3_+h?j(u`hGYeL<{aHLV^09r!fd}C75-q`XbVcWSJ>cSFZwrOg?sAlTN%Y1L z_c9K#y-|5&vvRSKTNNL4@C>Om1R-t3xvqgfP3kGyyF5)(czu~lzZO*Y!fHWxo?E?A z8rhRw?s^{!FCntDtUU9}iI*}p&Aty`xX+U&G=J0Idu*8V%Z;Bgxn%UWyidDQhjza{ z)YDi$p>I3(M%KvFlJaL}=!{rRBs~zt6c+x>fS0!^{lfAD#23o|_KLp2r_8JP=jI1z5e8`xKE~e_5FeMj! zJC(odwWO*PaKC%2G<0NDWDo;bfXj|da-ISiN0-Etxme|Q{^o;pwy zRb<4{LRw_FBZ297y!Jga&kR?pm}z{um|ve$+!=;9cZMd^+YC#o$G|x>+wV6NiK;vZ z(p5QuPiKQMa8WzibO$s+4tj`iAgqBdsZg|QuxeEmcVlt;4Dp>GkzY0Z!;5@Nqop|sMJ%c&OKPJ6` zc@6#Sx8pxxP5}m;^utFCMHB#wzC9VMP^FSy)C-P#^^D_wLuIsMFeS&P*sN8Ioykk> zEr)d#CUB+r(kn;Wdy=5WitK12P9Lk12|&CO7%MA~>_%W?n<$QIH<0eXYm$<{rE>!p zzhCD$j;b88qYk6e-<{$P!}P*$aMWyym&5_G0^%wd$$JUQca2Yx zs?9MmI-GBX`Mc)e(gh4lOL9?bMbINZd$3rnPwB@dY-?jv5BIH27q5@(v0(BxO*z7m zAf4`jtcl%JWiL@3QMom2pm(e7E-vcT=c$NB!Yd2?ORPq^Kg(>Jg61#Dk^VO zFQnTV#ie-G>j}Z?*Cgq@J~_?QJm)5c5bxopqbv74)L{ z4YkUvf2H!spd+K%$xEp}f8*k)tJZ>%dsNCn(`pdTk3YamglsCEp65a;x3oT<|JgdE zO_cTGqQ{*|$Isc=y4qK|&yYr9L@DJ^rE-&|Sx4^sj8DIfuP{c}P&4s8e^EDI0;aLe z1$=5OR9@(lBBu-aLzS0RSsk*oG;s_xUY!zC-{It!`@6Rc4{{SU;HJpNC4;!02YqRr zG83-Esl&G$Z(EU0h*?!m1q||{E5(NmnkXIe3Y`TdCV6ly-camEU_@ZkqJOM9Uif~! zlV51f<`TgpbiqkW(Ka&aam%!>m2z#$e*1K>n`0TNWKB-_%i*H7{a|X^Gkn2lECvc$JoxG#{zt#$dN|RR;pLQmzFKa#WFSHT6CBQ$Va(@q z$eUaUNu+}T9FFqLDJYNlhQ{V9U?O0~B-`bxGs|3+plI-TbinaFr-nNK>-`tN_feVL zFUmW~U{d3ybf)S(Y0hS{FUopB=pc0sBfCeei1~qYS8E~+!hYDwqu2IYlDSqgNAB6f zd*Kys#9j)H5{|OLpKA?pQTg62)EnYH=?PiRuU+w)*;Va$!@cV;8+%;_bv)g$mhLW& zO^0T(ThH9RriR6xPZvp{F=);Xh4eio^dcdcpptu$rgq+S4^T!cMLJj|V;Qi(5q+xC zy`c$cOBZ~7Ys9V5m&kQZ$$~H82wLhZqt86oqSyp5Hn{d8LtK)meP3M*tDNRgV3fn( z{>3NO>B==h*Pb+V^PYr^g+q-Pyac&-0v!?}}yGb|WakOc1X@0PFnt>7q8(782>yBwR+u$SE>f zZp;^Pz{A{4O1Jb|4~`wey8aa+VRX+VI*nf<}|W1goP;9eY$ge)8+ zGcM%Cdl8NIURkA@Rjp}*!p-HWQ4G#JSe6e_cAx7BAs~jc76(g{(iE<qy<`6_+HhbEgHyQ|gFy>rk1YjglzVFda%c(5-4OI(0qGc1$ zm>4u@1k{CYkxmtytrCXTO)E7sbG79xs2iV_CAR#=kLObzW4=nO17`V>OyJk#;3yhs z{}e~wD+|!mr;iA~tq|`T*dL})IJZNbsgVbO@pR+f=)_|Ms$+4P7`Ex<_wat1H{Cgd z@?YX`#CuyZaHtUc>AG6%?)p=5c+YU!BbLG`9!H@D;*z1O4{zlxDGv4I5r3g+j|4M$ zD|H;kfaEU!9W`Eem7d`EZ>Z3VaG9w$D)k(drBxCZLjs&63CW-?AmV+ z;-Bkw^1|HvyxN z_p|$Its^skLm?48ooLYUMo1v~6Lq0$Op4Viz+jPb{B*JzO{}$7(my>Nm>Xb;C8v6o zfwL}VJlW7u$3HFhImiq2@g~52ig#C3 z`H%%GM~P+PNPCW_;sZ{unagXFaxXxNw-KZ;=H8}YpM@szWJP)m7K9B#(eE}}Djm*f z69bev$xx)lFBI_Q_BCf3F`DSFR>7{FZXj@3bs zmvMmav~=)gJ=O3(45a0jIemq^)b@r#;YZtLp>es8&%?=+C3>7%oa?B;>%-^`DP?g{ zLJFp}L5{Bn`|L@D7ZK)#xWRXn;sIeIbNKz{f}gCpx|MXm=djJcA%BJo;uyxg)WNb9 zSv(-jDH{th((4cv0Z;F8WJh-{cxrT&nq^kt3SsOXh0)BE8t#vyY0N3 z)_o}-sJ0Wa;ZMm6j}$V7!B6VldRv9#GH_zizm@tx$3w}bklOR8#`@-Zj~Ult_gBhI zk$nXLR(SXs1Wz45SyAo?3e^HT`%_x`GCM#2WRMOhb)8nxc$sI0& z?y;V4(=|#PI66vP>>G=6WXIu18d{g3YqO`(*rv z!VI#Zz#96;nbmHgB(S@l(^Fj#U-v*Y-5Xm!<$p#EC|V3t9M#gDFI;Szf(!&T_i#OWdO1zqo36RCBIR)r*& zPs4cbXxif3kqD}SnxUVWU_ft&Q1WZ~L3BFW&n>*D40wFy3zGIvMOA&@`#46;z$4)G z?ydNG7gwUW6RV5D+9uk>T=7W`1YS0Kc(^%;ZkXmn?{W}HbVD-7^Q3Foywj}i29*rp z)S)dETnjpG8Fsg&-)@bRd_FcL{94ie^Fu?zm3u@|Ame*Eb(^|3wG%LZE)F>TFN*Vj zqB}b~vDLg$*Q>yM{;_#g``|_Df8>>yKcA?p(`@UM#6K(4P3pAIaoS3qAL<-!C0w=I zIPs>)F0_=z6B^I%)77m!U1}?Y`(|op9p)|PGTL}Q4=euSn=E@bUsRH5asZ*Vi<{TN zAFoChrotHoEwM)1-0!FB9_mQ9Zah6Ct5`-mSRpaWJ$8mTgqiQMWF5=BFOGZ|+$o$v z81rC`Mi58q(VQ)?=^*U;UhmXXk$-v$53J5XdUKj#-9yuQ7pvtKuZkkF3X;n~L%+^t zZ+TU7#@hp~!#SRxItRDTz`0*P8F>xE6q}FE=J>tw@JH8N@}(BJ)HM#$94odfI_-3@ zVLG{Aj*x@LT0yKy-=WfYpSYvljx8t5^Yz!OggL%zjSTR<>*Igo+bQ)sO8MW&U5Ju+Q6Vx?_?0dLz@t}T;_rUZUO4E93o#M?# zF9(vUiSWY>#7P`^_YgSAtu|{z;Dl;pIg1IsE(MO>Dck)wR6OB~q2&mUH>y|)UD<^U z^JO|m#%nfI)0A-Fg2(ks9ezX6(Bg5FC%Br#&IapbrLYE=<0Gu4gl#L3#o2Uzcguvz zBna*e3#ehb|Hxw_xv>Ac&F-1JUVE)p_t zmXiyDHMiXiJ%0p5?zvvRkITcS%!I4CtPr?S?{BE=-FM7Ncx^vqGvdn7}ee>J6F3cp}rF+QhKkRw~!Xx%O{TKd0fksDD1a3>FSoh zar-f!j!D_|uqv08y(4T3cNFgKA?54R;;E-qd=^ zt{d=2L;$Qrf4?j^r`m`wcU1zo@L7X|0Znaym$sIcma?5{$+9jNCf7Tb>Ih!!EXKZ* z6)_6!iQGdoKA~L2Zab?yvdRkH8Q0X&AXs;ds(UbeYS5asL2a6WK^+hNHMmK2_BYf& zL6<^we24*leriWvKlaV@(led;KQwq-y6*frsO>LnmpI!zOzuAXI2pD1&tbY*kiF$x zyW_uy?z;cR_;E6>x$q>7dJD&xw38GYL*me^nM*bqRo}^qJESKW+@ilW`>`guL>fW# z2;f^zmLTWJMYU!*T)19mYCn&sRJ&x6F62zoDp(BjrMuV235c3DZy=k9drt=YZIz1i9lY?(fNML?xjP+4 z*4dm(OWi|rza@_(K2F~eSqkOaE&U8|ETf?lUlpF|a1Zx$uMD)9)!b(BjK;cJI$UXY zbvwLX_8uD%q5bBJaqkECjwFUO4*089uEiQRx^Kr`I{NX(3>Q`(TFBT$cy!qwNFyzn znV%wp*741xi7%`K8_0){Lg~q77U@#tl_@t!^g9n{1bB|;AWu|{BXt92hqv?eE8)y) z_yjIY_KF)#viV$`DX1;2YJn7QHwR_13`zN$%jO9ARbmDS1NCV0!WFrzS`%s~cn0_* z==@jA(TzO6Frpr{5BUx_b9r$s=OAwLa4a{ZH9T)+8m6a!$_v$z*wcrLV%%ieJP zYtM)EQixjMW`70;cM(gjzZ*TaY`;01;WRt=8!9&GhNL38;3#h%%k}9_w?J+8vj5Kn z$(tRen#cPt__4Dl3Sh=J3h6Y>YgwI)Tkg>Jed4QMk3OY^5*cx7Igdx`I6n`!n*~&06(2r0y4a*F|#y_gY?9f#Z z(q#&X{sTD^JmUYAFJ<_%$ynyi-%=$&yp~6*eVJCLe3COqnaT?KR|9yGr91d@DY?8g5I=di%Ze=Von`T?BBcP z|5NpW92UA=<{9U$>H%%-+ zUJGUYV8xuGKhFqdNGEK+w6n7}+`0~JfL%G(sq8{IW>=#+Cr=6Dr1^JJjXuPhZL{Ksxg!{1HSOpjV3NTd9K%nX#WkBQ1t@4`1q#MmjLX2&dAv4D0JvK3=h6!qz#!3 zwT|WpdE$9rIpNS4oN*NLqXZgKP^c4xW4&txs*s8=eW2r008#`pd1SH2%H!KO`z?zu zk7oA?5zVi+q8D_jV+I@(P?W)^ns(cV%Du%Q&uukuIXwV2y%;?ZvjB1nxDTHxLp`BJ zY@{KOtyi{p+bEl)H|j9fu20d52lzuD2!@EHynYa*obpnwO)pUdNCx*1)Lp3&;%20a zi9ttt=WP2UP%xy7R(+g;?Ue;58>GO}It86~q3ds1O{UZH>(9BojQNt}V?=@j@!a#Z znx50MrQ+*1z{}{yKx`LvP^`>*PpnXCi>EP@gGh`$^61it279^gUlL;nxZ}IcuViF^ z{L}>cJ1GJTNu}!E2VPOohC-|c+m^6z&K#U@Jk~3{2Y7WiQUoX(b;$3u$7F-vp@iG> z$yJ4+;u(jBaZws@Q<_02+4ydl#%K7HHuz}+P?C&#^=9Rbv#IU^#H1*7DYXvOiNJ<0 zV4m`n(9iNtAU(`uo*YhKwo|d4t~;TemFeZX_+@pbG#cXQ$E$2=xwNsUp4@!vXnw{= zYP;|E>Dq`Q+?Q=hoCY01eIhK5q+4iSgNt3IVEvS>XX8+Jzs}>PR5&t9wr6uMq-T|~ zcm@hQ6CDhUIgM}W#C?whKr>!H$&-LD7x3 z>>~)?oOa6fLURFsUUE;K6eeP7!)<82A!$4;No?|rs?)z5@7+9Ss{b@}V3(&{ODjsy zJ9zDdV{*dMy6@Zt-{eyMkzoLUFLeU-9_U7S@#&PA9*WtNH00>Kl#L?R4_zj9(t>pM zzdP}`n^4laDF9gUa^eFcf%S5KCV5TGpvQI1b#<{$r8B$6a<_Sb%g5kufY{ z4Ri|4#TP=oRVz(a)Eq!wa$gE}%9tb@K^_kRBC|$``m6SOllQ9!7 zi#fWIIieCDm8{^S-(vx`bxN5EkBrK3ji|2)Wt@3%`i7utAruuXRK*;Qy+XYj;Y4mm ztYxt84x8Qr1x)AFy!d> zj%e`BY=n-0w)#7PN~^V2T>%b>Teka=D`^#S7TcJoI}6{v68gTakF2dlGq1HBTtsv^e}8iGm>+@|E%y8(%ruKZf&F}^UP{O|k34^mK#2k(?uWzs zZ;{s(4^&k-fc{rCBPZm-=%AGu3gq{^vpDIi64t@_J?q~>Dr*T!U!^YPonYrknZKdU zSv!VDC8;sAzomm}H}Blp`ss~LDH`5e4ZEk~&{Cy5rSltVsAq`-bqe?Ow`GdyI)}t< z)BRA-6naBSQ%R9I!2$&fEZhfawRg!8Iv64#kgC*AzG<7WoEJl!x6&&uK}TYK4-ph$ zoPoC4Sw|(c9@>>Yt&r@yt*+8yXnJxY!^ch_K%BHHQKs$7=T@t2L}SUySA ze*esU88VMWa@m1oqj-|!Pp!rdHV#>359{5zcM;MgKB?~VMi{?!bg=9Y+)d*^V5%w~ za^#6qjd25<7jq5TBP8bH#pl#Hgn4RApHt@A`pPfDYP$CSao@Av!ulJ%W%)d30m_wJij}<-9%C z(`yP2VUQR1WOExRS~?))CY(b7TKjwchPztKs6Ev3TlTNa+22Vvud(@eBH)E_hl600 z;7m3YE>bu{BW^TV(Og1jvHGjJchJEhah;5?c0v>#yzhn;`%}&t`s82Brs7B}_n$*{xV~e|_r-DBg(y z2}T~qgAoYPM~>-DaImfSpsMSD0c`~a4C(UKdBqv#ywF(va_4B^!|Gjvc`T@+Dq>A2 z)dbs}k~?uiSn@KsI9LZAe46neG6i3mwzxp3+eid9y`X4dz=R;HJyeUS{?24|dOWri z>*{=7?Bkd zWn;zQy1!c7c#n2>r_EbDmIL%`9TG7c$gB#|8_y2<)sxs@UA{FG#v%us#NfiIqW2X&&*%`+Wu+Q?pa20;j_Z(y7EPK@b+#!aA%81G4Y z9ggFruz;81MkyZ}%VLGI2^2aj|2=Md5V zitJBv{wg3=-B$kjq@>sW=91x$$~vMY`ms^IUmr);&%FqGhC24cwKzal7?g6qWYlkB zsMiKSm8{BjXYJ(Fal2fR9xjb;7Ea)3pgPpaAOntEi_myQ&p|Z0mmxj2!=H8N(gk;s zhTgZZ>(@+6hf+;(#ipDL>Fx4gpL9(CzZ!O%IG6mL$NpHWx0VfmrS^EMJz`VbM?sXB z7X$JS$8FmXr1cJq{W2h~bI|f)jJ&A*D`!OU9ioHnTYz%s7hAC0rtyA-@?YWOz@|UC zpvqj+3xkb&Ca^CscIySk()>&={uj*>{twbN|Bdqp*uMPyM?VdDD7#~jy(S^}Um{-B z7Y%cA;jaeTsrv`?j@A6pzPztP|4rjq{>LPGscC;FGExoZt@edZ%CXS@*y@~3ir@B*k?8{%Io_I&v9FCPEHzBMw2R-tRs-qVvzBt*O+IyL~EJtr0Zy$;^y zI0G%x$kYrQ8mEc|o%jFa>MH=^=(VD@f0tJ`~;nKqFh1m z=;ALK7}m4?Ga*vCnw>3_Fk_FrS{BWnF8!o|>7V}T3@f4Q_<;OcZbk`@2A!l#}$I^A>lp9>#eWr z7o-hEyfgF50|V(}xAkubZp;$dWOz#%M!{7UlIBBbwm2Oke;fZOQ1LH5#%)Sizka_`;Eu;>~ga;69^YP?njyf{GA!dF< z08{R^yq#;IyO{6D-X2ASxTI5Q>!N308md;|F-eHbRvi>Dl+?9E>tm|}RXP6|CH}PC zPs1;lrM9yfq&hyYRHVWwW!B|O8NzkOEw~(cop~6=9`LKtQ=_a^bsY)X!l5Wvu^Vji z&crn11oZA1_1m9#&oh4kgIU{~{ZYueJ(bYjWC@C#ZG8AeMa(Ef?xk9G^C@RyokxJA zu-kDJ{=-KA_GkbX@w16~S=WzPQ0mV)WW%7^T(?raszO*ix%r)+>5+kX>olB2SMPJT zp4EKbSw}f`H)Y-CM@gn)w-oJDTTh<_F;(arv1ChhRvigrAvWFb)4y{Jn!=%WYroWL z@!`MR?eiJQEcx_hhZVG?5nB0_(O5F^O6hoWDdS^8c}OY~|Mu9rjlxSsn6LiPNap~2 z`32l~uXK=!OwP)vh{@!@cA>f4<>RL)O+k`txOsx;KvLU6O)xCfvq(acZ`htp+US?H zz@JFC{$Z7obMMTH1rNu zd}7uU+|h12be4|@(F($5-)PTK1wa_RBKU>>#Y@%zBcnd1Jb@qx%?B7ewYs(keOy8^!X`*1gCMwx694z&t1`I!7(6Azj6wt{~c}KE6v5l zxw9$O*3~vf+lgU?LN!5Wau-NoyrD2j;S1$ej5FH*VUEx813S#J{q?Wu=*3fb0dW*` z3DQ#O-Isfuuc@h7)h%8nN%IAlZI%iuTMI>! ziyuGDFkv?5b?{tn9s$*qBn&llDRT1}0d|;9`|Hhr+5jES5I_#Ui~JWH z8?WzhHbHjhWsfs{;FslhyMbiY%F_M<%))y_S1sPr$D#D9yCN?Bj!Q7ty6WXY<2izS z-S_*CZURPtCKWwblKda2ZRCg=={tj|$cbaab+ZJ)YVs(744#CES3FNML$)h2tlT(j zg_7pEih~(7=-MUG^!x;_DNTv>r;g{=iF_C}wB+Qw$qr{J?Z?8wvi%QQy8Yjn2%SNk_>u!s%6jvwcylUOLa5w0)>|Udj_4Y&V5Fwjeww@^T~OEFBD)#W2-wZWVVL z1g%;QJmV7q411m!qYj{FzNYR4UK8`IH>G?hy=m)14fu{ileMeNdzLUN+dj04MKgvbxN=1h#WU7l)KG_mbM|XLy#bm z$rOc-z>Svaw|*AOKLTE@63(0x{$~ht52yP0`SbLL6@JS)c}GVSC8DCxFO%mZnZcbh z(_xi0=ANAUlp_((G|FCSWpNiRMb7+3b`re6+83mIDxfGY5CKNSz z%~D}cd8ALJl7RPH{n1|(oBw}s@qZ!i)T)1AZw*>&0C_LgZ#06_(uS;<67ni&L_l9b zAl^-X%(Yb?-06|SDtdv#6?-=Ha|2Ul!<+w2+bH&^;VpPsQ1@WHn7tEvlWINRe60ipED{2y|0N zB~vDDj{-QkyqRV)%9=8d>G5ho_#{^UK=?03M*Wd2D|g2ueT)_E8DYMS6x^8YRr&lP zsmNYR4+`9!$l@?3u0B>ax>HVGIWFr?MIOomOkHxn)by_7JG5yi@p9utPXtN%!T~qhGmum`+y}3rF7vLglrZDY*3FhJ>WOp37z2;t$?=!5rSl{UOm#1); zsgS?1y{`n!3sC@Qk*+f1iJq~rNlXvld&{DKrf{A7`2D$n%QQuxk-~FE zKHe-$xZdtqjj$J`xrStS2&U7hI{s-{3?_vyE%jve>O*k&G|VnbDS=YkI6`QQ%LGMa z_ly*yO_pn?gMKsqe_zjY;gI^`DFdpv1M5j|k0eb;!;;KEy?yZ;Rm2x1?+LZ2WigqD zc6n#0thd@9){eg8O|&9}=8J)f9O9}5W+R2yQ7TvOc)Yp2!wFB%eZ-Fy6o6aGjtIvd z@G!}*;qSIPmIqsy_ZQjirCZR zAj}l)T?lYpe^eD>Pk|3Br373wD1>*k1nKoT+lb|e_~cvwfk-x{*dsmP9U|NlvML*% zgc0Jne{D_a6y5pp(isoVUT{XMkKM~3qzE|&s&4Yltu)w8!V9U0V(r=nVJZv3ePu{^ zlv+7cMNv^f`T9OP@T!FJ38Vfk;!(hpDoQ;=G&k*yP$tzE7j8JnWV@r%E%WlG__vP< zL1BcH{Oo;0W`f1jG6I>ZkFyZwj3|~#croTY0K0B&5#5~P24@B)^*V=WkwGb zi0n$|eMB6-=qk9s1Bwf;qcNVcHr6*}EEGu>kGLOh_xh%PcI<%I^ny#~^ zmy>kYMix|rl&E`eor_27$F!nUz|98WW;}h}6SoMwg%9-I3vNu*dc@=~%IB@o4rM#$ zlp8C_ZQIV&j#C1W7H3Q$jrH3&Qfq4zSF0Sp3$4F6%&)D!~{40#RZ=poaWT8EiR=wqI z{(#Gld==R3!zH%{71fKj(2<_$l4_ZE=|#D)>w}Ev!E~-A_=X|Z+m#r?(VUe$z{c9& zz386fOkoT!)Iu$0eS@g^@ScpBODr4ZbDr-c7k90Vm&}fTaGL$uIOS?#|lRqLg0lf zqPx&U=pO3A7a2y**bW7ln%>obZ~c?&7n~Kjy(|Coo+kq86mR~xFWqyR=^i3cHP5(F7PtjUO3V7p=#8%bNqnRvLK^>_G0z*9n zPHMlvD}2*M6zJvyOD$TNv132dGA4H>2W!$qjTu*MOY8rUAN1M;Z95eV`y)mLu(g(O z`CF#{vCILaeZXw#&(Q~f2`eov1pZ&b*$Wf)!i-_K04&%aY7Ev!^WT$LUG1uWPyR(a zq%8kD&3`v8vv!Ssf4DS;f4>ahsl@>Gu`KN`KUEGKy#(qbjoBJvfw>nU69}_>iGM!- z-_48tNBOMr_8&^iWb02305c31_ihOR{X>XWlR#rtGJdv0cxKRr3-jZRkK7j-3k~ zBGReP0>>e}*B_>=BRH+<($VJAA5*+T9ZU&$>!XI}UXM6PG<5cVe+uKWN#cc4Cks4i7|H1!Jt~Z$kygSH_{+Umv z%zd(cjVgu*2N@PFGl_K}JB2BEZyWCzzhW1a<2b(9ej1+lTEWTI&MXo_VTzxl%w&#q zqi|1ko{5Bl)L?=)dSKWEF4p4F^uB=j zCDBd=Dktk?rVYbL~@=i|A#_DHvS%EP=Zgt5$5aX+l8%IW>5w4c4nTXo~pRMWC2DW0@6c|u%)06X) z;3fOcR&rW3BImIXsPTen>Y!AO`YuzBQzdBg&6kr~F&E4{mPXPdM%+YBd6BppiqAeu z&^fI?3m;UCA1zcx3MhAp=`j}OY2Z!yjn*&uo~XP#p_`B!nWUC{lcHB^c{!lX&~;B+Kr1P!G!0{|pw2 zGTrqtw6a_9%+m3NCDH`RSgXiVI3%SfNZ3e5VyOsYI!Ni3h~ZjXH~m8YHMyyFaZK#J z^@MX$q;4D-C74IM8N`Z9UJypwLBBJTpm}5)TUv){??x(JZoV8qPOjsoEJau`@=T8{ zRo`ve3(JiJ8^}!AE@XvlW~4PTGOAOwNcj%?904UFGO*9z3^j;YQlRb`^S0t?qdJEB zCW|QSleCpTeh@aQL$GhXI6qs#t!0M8PFR~@$$Q8jCBn7`F3KL%^K9`;c}~V@Peq$z z*ZTDC-QHJk4d06$$~0@#BSsy7KGVA&kLM=W6BSLlnuzxyq`4*R>j>9tn|yRT)q$za zViKp!b|;>SQk`Txdgp>{DUWS?NolP|wxkX=+Jq|fLySz;UBLY4O08VCP*ywm=Kaa6 zbdHq(_C#55SWOK|3SSdrRS$mA&a4tV`JcWn6QgWhTp@i%EkeETgno$5ackHvrGtw@ znN3RpBpStwY{sFdtu0_6>=8sm0I=;PVyVhM8s3fj(k>|sKW~_-9F{V$P#KR)#!)fTf8F206H)92Ccem5{S|XZ)ceA9g&iqW)VSvw>fdbu=4hq!KDF*@SXKzpD7@r=*u^4V3y3dEdA|As8>{ ztQOS`tMFqWvbD1FxRfJ~vh{a2vzY?bO;Np-Nt)W8?Blwv1SY&7x@{`E4e2iK^$>#R zW9QNft$ynk|5y<1-BHjdTU(Wo)uH9lsfpLFm!O>Z$y#~tQpI3^TJ#6JRCE6N-audC zZKY_)vS-2UXcC53aT6}{;iQ4d=(OEPz?xt2#gJ9}j+Tq~QP~DYo^|!dP zsfv_UBmisw3n-^Z6Pgn?Y!IC(i(!Jk$P#?V`v6U^a+7TEXyg6 zSv#-f!&oI7KkmfRPruEvk3*frRhA0oO_^WCj=bZ7w2y^PvYk&w6jYm&=o5mM7tp?S zqrq)3Zepl2yMugfA4{q)A1GrF)?jU^5$))^p=mKq691)BRM0VW`leGth{i~s&@#&! zhX38qWW2VhFzMA=PMw@j>p48Z(!?-OAXk$;@F)DGehO{=lj!0f zyZp+(;!8A1TLxfxX7$H=n;sS7^((-2`!z5_BH-@&5?-N^v66}aey*s#)o0-Bx1Hyc z>+e4PZR|EE2zIA&g-3CMXVd{Q_(T7 zOp1?;>HCvLRLl>f$nnj6-%KEpEN++c^D(+ztI2@h*qbjk9+5sx7(0-6k;mzW;7$1<~hRkY} zBV?;XZPD{pvD``P!xwPC;*YG;1~p%*GxY zd}sH4APS-GHn;je#DT6tysoI>kCXZzY_wR7yRD_~+vn=l%U-B?AUh(!!9wk(!`p)G(zbL7JomN}osU!YLCTmxT@>coX%*$AW`=3IHTFxoXKHC3lOn=j#?1|)QkrZw zH$rw0+jQ)lnA;eW6S1KYsVeI;!+NV<-6+Wt`p+3bRAI&m!P@rF{%5g7*v2E`+!R4I zxRX3-1S$o@z%6{J@9mK zdEbXOTP|5OExYp>(>ukSY_dKFQ&p_kVlKR%i+N`m7iV~1b?tECH$=hgRT>+fXsFV2 z+=_HBbeZhPkY2E!U0C)Aj*Hht05KA<4x!GNB{kz1@PMvSC+VWKfCnV8bbITrL~#0` zDS+mFRGatAvQPnm+PcNJkg0B5O1(qpazv3R!7V{D@&BLZGxbE0R{8V>a*p7AgpMpX zM!j{82uePDUANJ8*qEivMaZ`;4_n4q`NPY%7q?1NJ9nR&874Ys6bO&2D)Q9)ZS}da z51m3%a>%|T*pSx6?=3|f8>B0+i@0klua}U)MU)PROJsA>Q8ihHfj%jG`3jwu7;2ng zv4~fcI;;~qGYSvVD&sCd3~5HFn+X%ZEVIWkE0mCqFyC-wl^9O&Q$fcRuTXF=PK#4&WT{D8!I5&caz7!|JMjzJ z^h$g77b_U|e9A;hTt&61uYOt6DhWOvfpp%+bjO7UZSUhc^?;47iPEQYm<``$26Cvx zBimwMvQl$>+bFAhyiiIIt<0d)z-PnG;$q8@`45cfDH$OW%eh}u6GM_-*{V?umpV>m z!N-l*(KhG6ds`;N*Ywl`6>*McQVPk#dO?@{`kWZ3a9xAG?CjiXLgJM^M0-%)jV@&< zwM_L$4awR7LTOWjzSbyDpV&E3b`r=3ns87oL0vaTU0miAyZL}yts`c(j-^qG^9gaF zh@PB{Q#%L6w}0aC=g}awbep!LU0rd>D5@v2Q1C8{DTqy+1&^yteB|n8>8oKfoTKae z9=#=GYG1>-+VI4LSH*}(G74Y+8D;Jjhp^+uQ90Iw|f3Zp@ zT^r6$zQH{fw5mh@h{H#%G+s_fzAj(){Jv(5lD190g3!=PyXoVK$ zTBkBFOGh%OmFNPlND6Sj8M2eyvIQa!9S)9Czhg6k3U*FtQ*64U;ns;OfBM)KmfUX$ z3C=@#8B3J}+PORj&rF)Z3qHmHxjAdkD6plD#8)^D?Qh8elkn4{T32L>7kFMF z*Az?9GB}S@3@g3Zl(7;FE~y{&?~~Mt;QNCq<4zGEUK2l9c&DF@7AxxX z*)EUx!If)Sv%yg&P4`jyy%iARU%_qyzFy!G7_C@st3UOs!&%M<%a@g0JeJY3oo8|7 zi4lG95tI3Fpxh5cgQ#?mK+@>IFqbcBtru&hlc*P>tkS<|)CRZj3eCT8YB&6z5tSVq zm}Dg<#)iu@EPgF7bjZFj7st@G-8SN46!fS;llM-Mpl zd|rwC8?FB6kN7u;^L}8zE+ZdWySvo6U>MeVr30HL8XRZIYImW^>^U=5Z82^iCgXCy9(+ zZvMJgXhAf1)vD}u#ZN4K8g_yxduCD@#3aDz)CrQZ@@WIG(yzkf0g4iIf3+oQ!SD3ClCf9}&ETMuV1p=P> z8Kb8m1kvlz9UIv}2^1-#s-ID?KrFA<D9{XAn4NL2QogO+cawlN}*PUqF*6TS+?WpfkH7S5td zuAhPQ4Bd9^Fz;?PNn4NfKk#P?=a~d%(5TO5tlmq=wJ6XL98jhq-keUd8$T0it>SGZ zRla#-T#Sdbd=}x5f#(ApFPlMoLBi*T<~7MIU&3eUJtWrr;FJwUn!6e8s`-fx>}Q^7 zRLAw9Ht(wniZz>0zAES!c6K@04fC`|9Osc0-~|+2pW{whJl(3DuUHh1MZ{ zvCF{W(`k-QWb+ksp1ybqgcTz)YK#Z4+lurR1{Uoq!D4KVi6ojf!L*d0OT3)bM`tb5 zUQ`D@3}&k!o0u%i#!2!?ti4Gzf6ex$9O*51gHUR8_Wk5fG+P-p_bYc#6pSBUC5hiR zc-&CBuP4e<#oi0phOH+Y7au?&TTIj>Fp0j8%2F-&LXt13K+yQ$c~rKD&`+&8jA_Aj(d%d zN)oI=#6r;w7T1ctjbM(Gn^z+?iD-(Wx zSsKYaV52`Q;w4bvd_c#EvM{aKn^vXb$BXQksXNBUEs+?;$h{%_;Y>{%e-l5D+gVYK zaG*zq{rcpLN{81_X=PP!%SoG?vEvoUCkMrvlBcXg@iH4jn=b1PPSY-1bSA05hPlq$&Oa32=$NqrXr z)$UM3#L3ZM{fF-4q3(N>$dhPWI zquTf>oY0)b-zr$s!i*-(TXCv?-RS!Cb_(O*Fb#RIyj<{_+{;s5mg+eSz3Hai+7Alp zO({LS_WSU>(5 z`+9K9xb-V~@LubY(R=kb1ik=s9H=JL+B!}x^B!xzR*l_+~qegC9SnzPHPMV?Sh6=vJYtN4^|QY+4iyZ~`yr4(^h~T~^;}J+*FL zQ!GRq0v_ySKCc!dT4;!UOZI%LC*?WFPdOzU9p|Dg+36+476NN53K>`r;!LQMABnd- z&|D9Q28~&E1P5*?R-zq9e&Jh|zU;glFGT!!^K7k1l9lub=hIrLPv580k@s5*%b%Qp3^ASYxddS^ zDJG&t1!1o#YLbZqJka)}vVjlO0pJWvr@A_MtUk^M+ADzrRmavlG7b0E^n1BMb(Ci6 zV}{^D&4;L6$L5t2S8fL&>!g6MoC3-k^keK5AYJY{HkArIgY{$%G*wy>W*keYyte-ARpdJ}6x~!U&&FPv zIRE`~Q(iZ^IWc9`RSt`6X`34{P@>`h?HZj`OHW|rQ2NiBd+1)?k0|=0DOCv8t16Igjpr0%;vA8*@wrW{8gsdN+qL$Omdg|+N0Qd;o11ULrF8lAO6 zm$f_~p~!kC-C;LrX{A6k$8qLc%1nrvkl`74vF!Yc<`&Km&43pE@EanMOsLHJ`^bGu z6w_g!?3LqNSe#sh24RFVnc>Q+iOa@)9{@NH5)O#lllaDx|MuHQQPF{KCtPo{~jv zG>99xFl}B4Y>tla8=Vc1tzVzsQA#r|wrCUR2ibVzoyy%5e4ZBEPZ?6Sb^uY>=z{9G z3TBp4RV_`M%OVqr8Wz#0!D0qg`vs7IfwD&FbBn?PxrSX!XNzrWZqSxa+Gm@3dD}IS zW4Y^s&#HpO88ZXA6+XF6tK9O_POCx?HbQt+w`SSIJ>!OE)ok|`B!HH2c0WiNE7h>$ zrX%Fv@A@iXkwxW0-gl5kc%m6xQ!^9DQs4m-zs+YaPMkw#xD2=udqq^CMb$e9>`)!Z z&d75!d4|61BozbS%=gU9fhF~WMdRahPAa8381w*MvC9)zGnYTnHN2<)aAh1pC>1Cw z5o=oG@PtFq=AN=;w1_yq#9B(4BDbn8*+7%g^V{ZwaDH?TAS(my`Ss}`dEG2C>f{Y0 ztzr56in+&fbSVRuXI~!k0zTYIz&i!}PZIGE4k-hr9K2B@)o4XWx@_H8|484_J$>JK zaW>CcA8y#Y#)XMiptUq5bSs-CZW;+Ec*3HaanVEvDi(DW{7ZtlWAQ;LTuY2ynbm^H zqRJRwqGk0-U6_&$Mrz}JMIQnECkFoYmOfCiQ{XlP9$oG54D_&U+cw4KRt$@%n!4gO z5)4YDpsQ&U)B;GmNR<}$Lvf@Ky~7VEX*Z=T*rZ=7mTX3|OS169=uIuG0JuT_&C4u3 z>KVAb8V2VZeBy>pf2O^aiBW3hw_E266tg-ic}HT@@%H^c)!&;Szl)~d{(2S^@*kobuF=70HeT zf;S&2`LLdlf(L;DIu=mg*^|DUdnu3u!HArkJOH)j3xR=)6Hvy>n`zpY(WBz~CQ@Fclx3xwBDX;Bnhvu% zfT@30D0*FoX&>cAOC>i}ddH27wk*V)EGx*5j9680UD|N)$u}u1bC^O{;dv`a_s^~=+xCZyi z)yH`=&t4OeRZyDUBujsw?7F4QIFN(*(H&YfrCfxuOce;MRnb`6 zQ#7>W$G$@irOZfl@V0MXyR7Eoo{#e4rg?dX`8R)^-|8`IzGG=p+Q*w*W2ev?pHi09 zS6AdG%8^NaiYcd}^9tKUv!HAG4e>@xh;W^V(xXIHm5_uU*Vw}OaV_Uf-K4QY;4rUh zE?C{!h0%e`;N`6ZM#bcxMwh2|0&=h>@;ej!^%dlP-Se#9Gu*h`HXV0lzP2*f(q?3M z3&W}yC#_S|Z&>*X6hZ%n7!a4z7DDWjfclt#&b-SeTPI!q9I9-KwNes`Q8Ns-KB#6~ zT`#PT3B>rSF#q{Uj4tp|s3+Gn>Bo9DT_M+6u9HcWI3pKuqkwdSfRAz5zrS|j_7#ot zl`d)16ypw+n8r{K~wG#07+Mk11sX zd-2Hy_CXHp9Tje@jIKNW{;OZ#hGLf{&tmEgJHNSC(*jG4(z@9K8Zreh&b2@(Fk>i) zfmbE!kldAnCpf>FjZV#Ow3i66dLS@pOmR$@X5YZ*MQi>IK@%DnX{=XWZ*N@zB|eWr zxhxjSUgbx{=~qwT_rRF$!u=?eX(~cQgmIsOun>o$*_WF@K$!XyQg_nL(~?0>zrvj6 z^?aB@D;!eFkYrrb1ZcS6duFXkr>t{qgbYMduK4^w~Oy+KR@C=7S+bf~#`nAbIOkASRp>QvR zse*LRmX*xevFa(p;#2cNELUW5y z6WSr$IJ>dNJIo^uG}v)+c$)76%@Qh_IK5uvx$6Gf5z8wcn|sJU1)lfl;GmjN0` z+O?l%K1^q=Vi7??>6-@aAe4N^2O;+j)>x-f4`yGE{#`fC2-*D1e)q~=Kd%eBq144% z0{anFcx_H{dBiE%f?-~CypzgnZ7;+pq&1dE1s2|&({P#$j!`Ky@~u8rwcdK7n;tP zKIS34W##Zy97AO*eNI^Ns7Z12mh?9{xCb&l0xoLAasFo>(X*cGoPkT2I<}Q0Cb?TkaDZ4+AF&;2%61&g2F zRu>0TLnQ=l>@C&44y@JbdpWE;RabdMNLA6F-#C$af2|a*v!W(cY(rCtaz|xGg90CW zP!G+nsAeL0ClL=EoHTr~uV~4KC}v{Tk?`0=8s6Rtd2D3QRID+Ue{4wEHI4C8^<45vPTdJ*9eQ1mB&bd!Uk@}=)mG#LKjL9UEIfXZnVF8_;uYE}a z5}hDJmq8ysdvJYp&+Y8bob7cq(7YteD<)CnP$_wk$i*{*IRB?v^nDl9n?J7Ubsd_( z5yn}Pp{TEvS7D)p(qDUSR7SZ zE=t~l(Jy^%FIzManji5Q9ROG)_asjO067)>90H(>Ea2fShdYGh+{^*TJ7gcS@h#rR z0M0wu!;_VOwJj_?+d$WJlmPDc%7%e~%yWI)h*afu(k<_Mn^`U`rp&E&5r~7v#mu;e zDcXn0+6PA;Qv#Et9k*lFwxoQ(M9<=`cW7%{)YicTV$&3r17i9yLG5HDdul(%xvVs1 zH`P_j_)*ukww|RwUGVuDMh}y5a{9VdMDDnHrmxX(UpU^O&Tj!ZqnloOd`CliNhanK zOYj(-G%)QGr!~yRduQx;F|fN09v`O2OypSG`T|_%e*~{>0Y3PYu6GpeV=Q^q?Ft^W zDrX~;P;7#yb6XMO;MapRI3!dtHMhq7AGvP~Vr6-t&);`a#&UWF{v(V_}_N{wag3H|!41X!QLVFdMX9((j43U`&*2NA1P1YY< zTI-?9dFB4g=0d^|7s5P`Yx#i@fS~O9mIc_;0&w$7%wYXz2i!F8gw}?O zaYEt1{Wl5>NEfT*gBT*v{-gv0`aQNr52{kONIns6u|nnE7U$Z?kmXp9ovV}+5b5>y z4L><{)6&vq75Mr2TQQ=8cw81!dEJecZE|dVCT$69%3IlKG6WlzxK*p8=cC%nv+(!0@ZHzuD+y#9WBFPaMZ~w15FnAg+GwL!Ybk*W!%J` z;E$IUb7h$#N+gVaga08l*_$!?4dH{WNsuBp(W4{)lq@_?+{*#!&pe1=S|@-fHlMkV z0uQXucHEq_F>uCu@5mKXTU-Afv~^X znbbMOZ7Q&HKE2FtaAqxp6x>;LOYHyi1X{BD=Yl5zivK@n7b3!E^u_*@gnmix>+~(f zEjUZk7ynHFW2%I|dAv{O!3(_N5wrdq0_KtK?*UjY-sQ8TuH4oUg=%&Ub?0x0z3~7+ z#r`Lpp=rbM3(m)ZXG%n*(@UXO;A5CN;)!?tfNT~*A^S6WN9xxhra2J+j5M<-gU|la zgI_f0jP!dDW!&Vx!wXDI;Uzu`^kT7mhPKSIofNwrw`bB|a`9l)DU3v52iv9FZwu5@ zX|2iMxCOS5(^;flBNt_$mZCFNtl{IKGps90F&$cI$W+qlqvFrL#Dl)O$VZ38!0Me#+?xr zR<7Bh2PEMqh!B?t7I_S*Z7{d#510q9 zUj3}AQpwz-?>EC548*EnojpA53TZ@2}Y({TUYhEcIvo-?dok0q5o zQfEN;7ETTLq>(k_3ci|vP2~xGG4Jn-O2)IdFgEd6DLuIQr9#Bq*poXK%eY zn{nt>+po{jA5@sMl6ys%P0$!4+F>ev20rED-)w1pi*U6w(h0Pto6%`9sX)WyNlSxL zrEI(H4)9SW>5Z+nOA>s-WDO9VbOEH}p-q5G#%2>JT(mY2DX5m?kXJ zs^%$OwiXM|Ht-`(N}PTc(Vh$0LB^${hHCDNv9I5u?h);@jRW8Uv8ULmCA+xLUX0Ib z;5%Qv!WYM0xHDLAAqqBFct@Qc{KDl~Ea}B;_Q1V+36hmc-M%mmxsvogx65K2k{P{FA$*TPt0{~T##0eK z5BOg~Qc=-~jOnl$d3`n^L?a9o;ZdhAE|d@?7eu5^zn3*5|_`+bu-i;CK@dN zM&JhlR1qkUCzQ-jvqJBbs6H>xGFSUc@mNKvB8}e5|yfnPjfiXBC5%i&~Vz0XLz?Q8K)L5HQ%hky#uQCP+|LkffUoL#z^ldGV89W&Y zjJe*wA)<1;h$x(W2lWIWE-g1xz^a>Dw|5w_Y#_>vM!QQrZLpI@Pv#q;*uK1x6ZHs< zMj38?c?s%e(~>2oz>j%}=(45dQ=TF1h6EgsIePQkYf~VL!;|(ORU%tYd<=Ai|7Y*?&WL ztO6Dk)xe1Mun7=v<5q%<%a4ghWVHkajRf|MC~_QGYUTv?N2U|j&@0*_eI3@&e}4lR@--b88GUW<#@Ifn$zls-)hBAe|+|kPEj*)evV|X zePRSrboP^pK5B<|MlUy&hY$6PV^prOV}R&OUpKInjTf~rSx#+7o5~!YE>Zgvh)wCD zA-i_TLx-DwEdxv=I7fA0UFpnRk&RScDW7LBmX|MUL{|m-Y8Q!x=>YVI=iOW>d|YuN{*|r z3@zwD8&z9RBM3x~;pM?u>SUfhX1`jVxSEA`iEuQJpgps1SCF`^#qlR;wAaN+i0&ax z$$=%2*c$>>m}Y!X*Ma6N!UkbiV+Pyz$a9i6FsuNBL?{xOvqk~|UI2}FB7O0_N@!k>;Q`GXFj5?Psl08HqV2~2w$+9m(_VtV>%)VL{5mwg&GLWrBOszIm{-R+r~^c z0j8mbuRc;94Ml)&5Nr*{sV46EjCLgMv*p6@mqYqPC9yj&!MsRA;6HMZD+0w#w2Gkg z)yoI}ps|;M@;xjWg}QuRbP3H0U(VMH@VE-8QbFfVUYCtVz>o=BSkEQP1HI?ESLhSW z2TK>Qq|5vv_%>z$>2=AIIB-3gPgv>yX#47bs-C7{I;Fe2ySqVJq+0}}yQHMMB&0!* zZV;p;M7op`flHSn-HqS57yaq)d7teFO<2K>S$h3yH)iOh2GK^`|=fpo`eixoJXxu=ruRbC5mbG`t zst9XQBtMFluL?PX=0t;q2cHBq!K%9u<*8j)8qo7XeOtZ?@|cl)m6?^BivPl4(+p(P z1qxiaL-vVHiqc?X;dw#OmUoHDGK8cvP&)E@W}OsU14N=s&t$Pz6;Z~Wme{@?wq2?m zYNYq-fsH=J$utG>?j-n*85!)Dsy_J6S<>Kk))CN+4MmE{;#cO8x)rxV?buLGC683yJ*G zfQ}@5e_0h!vVbs_INfA~LiqY`tOW8(YGg}M1wI4}-3~GIFaL8*p z;)_Kej1BW9NMsMz@|WpU&gSk%#i@15_P+FYW_kU&|7pE#pFj1{Eh}D*TD9^9p0r)r zwu|z0J71YZs$vo&@cgvV{7#_USA$cBZTWFn`I>;iW%Kj>_@RC)XmKB1>i}9RrsDX~ zY()fPIqWj=s03iA^P-QF1h2HEBTKdJq*HnM4ZZ8R@ci22^B!BRB6@YfL$e6S?T(&{aEz;DF3 zg8bv9z(_K;CIwqS@M4POOuB<@=MQcuqXTFgJo{L@kNAbxK`ji)U|i*1;10{=c47Ou$VURtE$!s@yx zd9cV74ik&8;=rC7r@ZV@nM7YxhQdqdso+jPYN9i7ayE>H31k(XcU2h6uL)Z`D_CWU zD!iRs%{HtlFlnr0I>)qTJfLvXX-%oyslLmMMZB4eL4Cwno169x{W1~{lQldlJzNQe zqf24ccD?_IU>V-fzK(SMoqZ^7z9z{?b)$1Z(Ym|#NCErW%U7#(@umF^y6*=u544<* zY&O1t9ga2%*fk}0Dz4iZ=u%>$F3h2z*sm3v9X(*bh`|}u;W;{GOw*APy(Recy0LGR zNa!{9qC>lqM@nd_MygCJA{*vUC_B7Do&8}`s_^aM46(=%PQ%x!(a6+39)`0Fb!yLE za$M2aojCcCY+iP-X^bjGZ{DmZGPsw9J2*#Qr&^&#BVYLeyE(}O+~DHJW$dch=_n=Z z;GtxQR}T>rk{6eV$|pr>ncW7yZ!u#^PM&HOYgjnp)egr>d} z!8xR%3bA_7vFVe3M99EaNKSj*`pksA4p=w^rdBcCalXgk_JDv-{dNj#JU^a&5vhM9 ziPZJ$FbySX>{#_w%HxI5`sL^NNt~OpH=TmCSmk|bRN7+?S}=#vC{J7AJQW|QWXQ2z zc0m?^E>1;B?Uu6rbtF(xS)Z^{8e`L4@zEIC##r#aoh2+6V-P~^IdT{?Ur0|~L^N9x zqzvI1xmlKr)(`)zD=l5kMP08SmGDLH@#*t)#gWU=l>@E{F{9x_(a(s)=iew&;y--s zGhzK6nrN#f7v?hXg|bbutlM~6_L1s@`Ku?7yo_UB0I%Euo>_drIz>1kL-e7dvGjXs zdx27O4E)=Yimg?1oh#rjg?A1*-~J~F7K)&-*bX{j_DDS&z7|tKcXg3)V3#*r_Uhga z=K}6eYMJmQ5?H0du*jIJUWpllkz5!btos zt{Rv^Z;X0X0x;wmGyY4@K8wlkPIx_|$F}HP4Eo)#krPwZjtU=}? zOfG8|djt0?Y+jHkFVC4EOkD6&z|aQkkSM&24;B_j`hEetz`^o!2--Qz3#WSqCN}8rZ*~NAS#^;>);ecU?9hUU#y!^|E3in`*xcd+rTO3$PgU^pZ+D@h zsl}MRKUzswJ-`C zD9d?g>{gor40XBt2DcD%W!Et(O0rHOq*0>`oY%dK4Jvtih^gnov<%RtZOU}8g(-@? z`)Uk^Ygt*3k}`Xee~i@Oh~lz~^1^#K3m4%IM)N(zQ^}BJu+^3lTp>Xv-=9$1JPI!o zPDjemZlvBQGQ-y|PD z4F;tLH0EazQkuf8IqKeSX-dDK$WQ%}?@gdVdj_iyGBbPz952ny~vIIU04#Y5EeRZrAU+(K0JXqN0}F2FC{ICUR}MS$Rro) z${3{YPs=X2#yf>;hWSi>NlWD+OW|Cp=w5?+tsBo9L*o@&T#K?UWTVne6<_3cX29#A zW8GA!JE}q^wS`CKvMo>OYe^Yoed)>Ze9Zzbl|@?B5TAOi zN)TI<+Hz*1{8BylEBXYJ5}gS0(4d^`Idyq->@jk;jkf7QYs0f2Q3A!XtmKXuTvnu# z+9kc|KDrXr)HPAcyYzv3jNIIJQAOSfim&8a(&w_FU{o=rZ za*fgWDCR8p)NY0Y_F8Qij;LDt=M)ApMB(CO>K@OU>EP8LL`*x&xqV8Fc*Rcew6Ca~ zN&OUs=p`!r1stXnVzk;@wYR*l5*1M`-5<)JE5C-}wtt6sI$4Xi15&W;kJ13CH@Vj3 z<;5L`2osrLB!}4T1dKV{W(8P&%oomwR@jA8z!f0f;^9q%$4Sr)OV?{br=7yzj#62p z9YKv=GBbNzU;d~(Kk>t2-YCH;56XuMm@jq)dvsXR{drlST4IDQQKcp<>0ta9@bK5< z;dWS2iIlspq680VsWYi59|IlG_?}f>PPh+|0E%fb<#d?Tl0AZNdht46qLQRiq~u~# z#-nf{BNsRg9_-khu|B6=1Z5`|Dp`^Md(brtXh&6E;E^T+m;cv9r4vxL2*~EBBs)uXr3~kRJn{lJbRmeQ5Ajup!Q?Wj^Q`- zVvG2+Z)Ct7_I=1E2XZ59wkh^eCpOgyw0QQ8#F%BmlQ}#}2q^90TAy z{v}M5C#-!_Wa!ANsz%zu+9>T-ku`uUYwbyG^=xzXx+kM#TfZYJanH19q#R`H!7O0nZAhH4c;<{s_eNTx zGUI_%x75}t+e@U)mj=k^DOXV`O1xfV8J$Ef)LY*)GJ<&ZV=;?tQ$=uI6?w{3z)XBY zj|hsBQ0={V_qX99U>?y?l!sul9G4d8M6HJzu^)wzjSH@q&L&wLt=m$;ix?9|J`5@L zXp3@LOYtJJagCqlU9rGA!7}tuY2qO#wfYehyg7=8R@VweD(wX`TK%d8j7YWO4>O(kF=AucM|ISybXey&iLY$9o#`E5v%Vk>l&7L$ zz!IOVs~z6rGl?H4(k4jJ-bsV!pe%c`2|Se9#pMbJ(TvWRt=@?UAf&19_^FbQQpp=1 zg+?pV&`msNa-HJVe(ItAn46Q%RAGrFe^DXGX*kY~a&)JZf|CDP^#uJuHilE2EBB`q zE$T;ZTD)cxMM#BmD3#XdrkLYfkCBB?NZSqvX)`{SO+VC_>VSKjrR*eMrCU9{y2^U7$4X>)lhW42mt=v z`~Vhs)h`tI4c5Sz|Nlp5_?zjK$=@m9_3#1UG!Mz%CdKVfD1Lvzh*giw?{2r^X&QLK z+15##xVf{sKcNDx>kcfgxS#@w;I4b{oP(Kn{w`r39Jy@-Zb|-xy8aFP``id}0I&{?jSd|^4E%NJ zyatYbjZ5Hc4)?SGKftU%p(LI!?Vl}yV;~0;;N4dp*A4(`zXRk4hV4S~TfAfO0~Eh) z1c70>xd1JI0E_{00O|=$9{@(|Pjh#kFM(s=a0c8w==q(vKSM9?GKQ32z-LZ5*k1i!(5pN9>m2557^kbS4R0ASTLFc4sT z_lE>rEFc50*Uqlf^=$({dWJ#Z1jzdN8K5NKBY?WUMA`5B2^IYDokx6(oxoiWYruYG zC#E=P{|*G$UR#hten1>LFc z5cu%+rZHF;9GqEH<4@mysgKCr~gB=H;*X;uL zB%lfvCBlC%gwmI69+_sq=Oy(^wyJb`M17~{WK z{mIKe%7zoG<-qXh0Ka1cBSnpK#~&r`rNU zuL06uLfisAdk1d7yI{|?%o!91H);qgFbdqh|9jZKOEqqUINo3CfJq^+|DFeeREm<) z1oZuvLjRroUnErz7Hff${==OArM3U7{0U~U7Z5f9|GkJm(0?hq<=3?c;R6WzKLfZ? zIzYNZphtANIZRSO1$u@6NKFE^12AX5D+40#ImmBsar7Tnew|>y1G+{qXTZilhu{Z} z{t~gV^ELrO`a zbTKtcC0V!aAYacVpp)F+S=v8e8U$GF-}~A%;B%^XS|&}$0UTh)fI;s-pTB)ou9~IE zhICMn`n)f5&)c%*tO{#&BI&pQwkH35|e7G|16BID9;TA3Tf z5%4$Fef((H=}rwCg_Pygue8;0bosp4P!1^PKf|R%+P`Y1sagj4iMKm2?}|MGO8U=m z(+Tmke+r$uc4%4XE zi+5M;m;x%AeNO`~kA{L~7I0M;r z{%X&^ncbfubqk;X|NJFT0KgXbfx`*-@Rx1?-M<3__nXD-FZ2~8_b(RzrvEzyk$nl^ z5B$L4Rswv4w3ffg{@-!G#?IeFf64kkT;Vqj_zaW+TxL`omjb{ZzqAYF1Ns4=TLqi8 z5f}u3iS7UiHzC4ZgH;181iJ5R@4($KK&oPOKj@4_G~zyKf< zz~kEg{nkdSK0i>&|2_Oujn^QHqT8Kw#fCGG{XZ)H&pdz>zr%8|%~I}eN$W+CqsedB z|2#u14+fu~PS*T{QahVge&I>O@tY8AgAT~`1Z<3@9~%z2n?Ip!IfXSXxBaW*6furKjivydj`(93ycQ<>j0xhz<9^EtaAZ-t+fdE7kK~&?mOc zP{0jv?)--dL|pKs15(u>NE3r}GXL~6N04m50O+1^BM7*#`~m^~dwaeFPAq~=b_>Wd z3oh_(4h*|Cbf_ETzbF2EgeVGZbq44HbOF1TKxV+iyBt8KDo8#2CcHmG+~%wv2AtYI z&Am4h*rLF0FaO2gemTwKN(sPk<^uk4y8QrPPV)lYLl3R!AuQUyER ze};Q&oz{J>fgphckntAKNg41Jr~jn>bv-+u@aA8FaK6tDc;Ri)(f0qO{v{dcvb|B+ z1CZuVxaK|I2KEy99sa3>dwFl?25FlDz`EW+#A@=so&HUFwsZ^3lAAzIo!5RAsrn2M z9j|X2CsY9dm%(J zPNg0Iot^xsQKih0a@uq5dfyKw`PN0Z43LOqn+;1KRIUR(lIZ#VTURYNi7i#Xg=0V! zPiI>QrQqt<{@fx{Yl-uxW8F7-Ri1p~fLTDcAivrbO7qTuglGAC^hNme#?AgtjVrNK z;)w$D!x8)rO;>1lvbmjqM7>M<6Nh-}ufrec-)$G-efKDgKNPK^8`2Tq z&k+8mKCyQDau=*uqQ-P`+&%icj{s8uju7xSHld+_T{fjK)lDTIy9DLcQgS{`>>58B)cZFebMee{m9}I$<^O!F`ymNPCZITNY=q9hrCZ`I;*fl-cPo<1)arot1m0W8xl%mGZF||3qK0*5I@S;#M^G$3 z8(;piWbbi#J}(npI)_4B%yn@sp2}3Ct=-ZbHOeDI_wZ~xkCH_UD4mwJf1 z>{s?yb2&N)~$nLEGp!mfp(KDBd=GH2h+?y1OGQKl-inT+xzu_?i`hsheveSURoE@WAjR_RIJ~UPO8)M%-Z>32<5Jq`h$4cb7OeHR$&$hk57w7O z;f02rIoLC$1K}4r&W458#;?yT2Hyd@Lb2`JahDA64+aVh{KxMb~Nsg!Wej2Of$GPr~RPv8w zCYww%tm#~3q?e9Y^(*e=*rcM{>)deQm`hiilI7Rj;Ze&y{JZQQEr!)i&~>OQS9)CoJa^{b21k7aSfz(Jnft%h;rfx-kj9^a90+Gf2q3@%=ew5MYAgH zRn01e2}T?0)HeYiFUh>DcQt~1Wlx*}7;WbWe*lBDZSwWIy~^{Pom1LV3@nD}9FHdl z-DpRh<7^1rqH4!;ZsadMEqO&5)WYWRot=iw)%D&L1iMvSgySMVL3@1n6b)@aaNNDX z3C2``1I=$AhsScx_)__W*u}J0fR%=i{CmF30G^p^9N{r$I4YD8Uc44>JVy4&8fX~n z3$ct{0OyON+jX&uy;P9xQ^MY4;xwXXRD_=CtLkquBCR|hFg&MQ&)r!X=~y#wnJcmS zcQKNPc$YQ4rx8_)TQz6{-{?L$w)&gPzdj%J>7L$q{~EsTmh?@)Sb_^-I{rO5!sWv4 z_Z(R}>w}*6^I3iyQg+{u{0hF}m)5MJ7;+vjTAISRavbBoaRqHh9+iWDyW?*9g_Ff=S>Ozb87WJJjv z%v&*S zKbP;<)ZYbN<&H_HUm5gN#Usg;U;8>UML+F=z-sGS5u0G`6mQ$$O+_(m{MCJy{RV<| zC4Wqm7pMwJRVK6&ycS>gPi;@9Qy)98c!~ctWV<5oYS+_?!w93zwGo(Kou(1@P+42O z8=KHiR@!$6Mtc{yb5hIsglJzxr9%@yKYj%$`b(ea3Ulj>^B_!voG=bDUe&h0? zn-kPmJ2EVRF7q~}?gv_3ubX*PY0E`Ep2@aSJ(e-9H$!Ni+gNzt^#%Bwhw|=a&fy3) z+LT@zXkOP1&Cx{p`DCG3#N;5@vZgT6~z zx{N?5r?k46hygOK+tTogHOVEa5g2mLNOh);dnmHn6G+u*U4b|-p26-FK5SU{QpNXzIi!NQRGVGjg3}U886#r|$7n-o zKVI2U-^kQl<%acfdUAAYm#Vn6mX1+pnjEo=@tn0~rTc~Z^9@+zIro?c(@V$?4qNA1=KS53iKMZqzY>-disf!M!o;ssDgE`tZHqLD3?Nq4W39 z$Go5ItHw^`0@IaJn6=7`XCIM#c98xO8H=pG&*`Cxoc(fo6IY(Q^N7&+sVX&J;DjzT z-<61ntnV=P)O>+`O#!q4C9el7|1?}T7b#7&wKEai75B&zZSQv#l0GzU!Z7NlV?4)N zUsLp^@h~Qsz6`%2SRM?f)ZWOpJXGyA8xQeVujE}$@j^T4U6zLFSK{hJ+$~>2U?PT3 z)cZDu)7T9;enR0S;vs3RMB79K%Iau$yVE1a=MO}86Ew3V=kvk0q(@K1eRAjVPM0x} zOW=T0jf{FrN%KtlXz`VSZu;1Zc_fVdsC*R+Da67WBr?yHQAB;$b{v!@Y*bH=d!6%v za@f9o>^qvv*@K^;*Xwb|$5fWWBDUarL4HvxhC;`a$jIA)R5#4SRis39tnjRVBJ}xy z9q~gAf$+Q>45u>VTm|S!BvWds)o-5O33~}5&8HDzmW!I3VL}N-KEr;x1onoN3VfOj z6{O_nJXjyY3{zK48hW53cQ=jP6JRYEMmTMWj7+EDV%y9#Wt&MPVY8=Bmd`+GbGEhO z{q*|Df?6MWjb%!4i=XDTXyLvXrJJjpzd*4$5Zl{6OjkIQZ=9;0^vsRBJSB0$UR|a; z@6G04Pm5Vz)30pZM@^gC7U0w(Uhl@iZ%)NdC%y1ZH!aaqC4wvWXg^QnK7pN?HiuJPWf;WlwHEqE|)a!9N!;rv|Q)AjH48E{c$(=;mS-d!b8n%A{2JJeOwoYPBNnB z5O^L-$xV%njC^*YUVyP-HpKJ@sk586>enbz+WqE1K~C0#j@v%=!pQ|wW}L?l4j+Xu z#a_DJ`dtgonr~$AYkjrnu7Kf zmQk^9GQDUYP?54nE9`ZQwUKvxmNp*;QejWim}ap>Z}a4ekebkVB=m9}wwjtJGv0N{ zy};5^GtG`iRr%#Y?h~z=D)eLEPu8Ajz@L(qPg#E0rWo(K-r+Zolj~#fL?qQs&OH8( zJu5xn+Q5e!zAjs31Jn^rX1T~3NsiY;YoZ=qnYUVO=Gs^~NXk6z!!9(@<530eF%@3M z(^Le=-Q{|XPnV}Tr{5#EI1+AWgixbd(DF)$p_$=z z=udTtCsk{i@@m0p2Q5br>{diQcn-TxtGJl{!pGnm`iS{(F)jLHCxtCFHT5!LpyOch$R3iBl0L_8~e9e$uT}-swk!&(|JVH5SZL4~%D3SILqs zE@tK8M#kdow{9kfKK$;HxP~;UF*C%b;>-glwvXM+NVfX8r{N-k8cS@M+sswjTc7Q2 z+5nw~z6EJlChS#UV?n%USJ;877rlNS0(271Cx#(f17%y|hr1Ux6qJpnniG_7n~mg9 z(S=%7aMVa!rVT{zX!UIhT~od>kuMW&b1?R_^dd|%gfBDOFiRI>53u#-_f3>rD|qcp zWAQnUY4o6#5o%Id+0*S_5a>j6Xc51*Tvi{p$b1;TI+Bc?Gubua5uGyChM8h3=?O#R zSaoC#JnZn$O~of$R+;I$5>%VA z+X|uBjH4T^!-2jjeAF8h)rps|i~*5dHq<=!Y>s_~2qIp69$7Rt(8p0KE;AuHc`Rcu zpA@i$+ii-)6b?S|KRmRaAR%zBQkeR})&XsZ1>ca&kJ=1vFBpByLMrgw8D*RTb*g*} zKOwEY^u`IhN}JbR*MT>Li%8vPN{HurLDqEQ1Jkfy*L5dM7J?Bkq05;o1I4Zh^!-%y=48&!=sy{B9=+JQeZL~2=$emIVwqcMbRwGL7lKXk96UD6GbxY z3O^)vb*r<(hVWHu1WoV5lRadNUA5QBz{nmQ%iBXBQt-_G&{9k@Er?1hR2$vRE^dQ0vL)ziEb0Kaqk!-|k@0DcU3OQuC#QppYyQ-=NgH7U z(oWQuR$>P;!V(310m@`9KPcs1=QZ^e!(n&?@9I~K`_is$%c#Enj`mLyp4xGgt9flw z6)H76I+_PDEk+;}WiW6`l%o8I^-NmRW3>q5VJAS-#`9PW zVn=OjqkBgfnPA+b`UyG8963stH$MdCBc*i*Num)E$c`zvCcKwAyN(UbENTn>+dhe9 z`v<-xmRF||z|5Wz3z*o$!ok46LIDquK|at}n7|7(B&8m6K21}spjw(Xke_B7#bDrsJepqdd?08Iv9`7cCl|^&6a8L1G{9L_}40x6qT^= zMz|icRLmzPX9;kJJabcEh_v)2u#^d&R}0!5zF4+V#;JFFEb`Ja6#+4snpUc2h9xMH zsEd^X27fCZgEi+vztj=!)O)174`Cl(RkiS;db&siwItzID_m2yehVUgWUp~(|H_p< zlp>P3K?u@bE=*-JtR(OD&N>Lp}Rxe^yc0&*9Ofr5N?$QFNZ@Fm zzs8|E>x0}k_Pxw@m^PTVQqh%3N4VDt4+rX$L;hW`i2NL;R(Rx(ZY(;^(}#V4;EJ@b zxl{TLNLr8;vkLUY5e>CaM(R3{)F0$4f(C^rRF&~R49F}aenlA}toz^xH;1SUM-L}W zmD7?DPm?YFuoSt7!(YrUk>$VPXmuFuFNtVXieMD?ye^(?qvAfl4^+Y%L==- z1I&Yk`=2nKUtlZlm&oQnXEX*?U>ALQjsm|}6~k(l9YY4pxUG>-HVq#=m#FnYK<6j@ zzSiPC`lSC=Q1(@5zPc>~y_k@u+aUa1h?~W@p&p{|AMojU4XP92`Q#&Ok2Q5e-Xu*&(Vs7*|x7Wm)*5r6BNd) z-f*Z~+--%LTW{fM_3EY&7UYkg>jAZOHRGlmFM%k$S>fP-sx(d_pjU{V?e#Rei z0u7D@6LKpJ4gvDU8gPSy+)7iIGEE%Eq;v^7ILuq&tnHF~{O64|zyqB-Qz-SsmDZy& zPU>x3Ct6>ELS<#Ae?qP1rCE}}e8A63(+b*<;}p=>cK@>T6RIztGQFfLgWeSHZInR{ z>b|AqjV$N;{sYs#5#r=0%Fcz$ea?RH;>VKG38*+zrdq?v*bm_CsDWE*(lfbgGLKiE zukZ={FmoKvGaOm{aRb~cWW0cR?f+qDeX6*_LJNiFVQZz*u@M4`q=q0T$5mWnIWfYD zMzzK?|0lnM&uDSoyjg;e$cYh2uO8PA4{;!SpJWa`iHnYS8;OJN=3$BIErp{?B96bPz!EA@Ci%~AHot(2b^0c)u%+A6$^6%%-4V)0>; zdz_84PM(g3^7!-|e7TJwn-{-*RJji<=Sy_dl&R1~C0w;ts;sw~PpQ^NI`LzO>v7LA zK2fr1!PKKl*3Ew(l`MkEe(K5`oeA~eJ=ea40*@AoP-x}FJb{fuUFN%pI4Z{Fz2YeM zn6Jwi=PHCj+=r|l{IR@xHv!_ac!Oj?iB) zyUNr%SYbAH(z9Hh>YJQK)0&k~nw*JheF(#*J%-L@Yi_fRP;Q@FWV0jVvZ_c=)fmpy zT>3xuiXBS$-bA~+@e=Cg!=@KrP(ss~ zQ<{`MNLXQsNfT4KC5JjkDqc;{t(R6evoN@THR1@>S7Iz(uIPSw9Q%UwT&h!rCY9u^ znHWBKOFD-Z>x7TGcxllh5o>K|d$q7j+CDMNq5>P6d$j-uOJ6Pg4%_tVp;>UEb;YJm znohGIoN29ubv_J}lbqB&ts|BMd0tytjGIZqwK@-;Rf)2T z*h!^FdZyOYZKY(terVhwVkUu%qXA{2`1r(5*%*q|##ZRfOZ~)fJSbz%z>ExbbbfBz z3{2R-g@ekkWe>|jBnzG*((@SLb3SGxg*Wl4JRH>vDsWE=D$b0+OONVHd!o#z7u@|rN z_^I)adIH;^d)xY$EuZv3JUB5e%;MCBC+EE)6>kw*I@87( z0BpN4HN(m=e^(F+)nEXFxSB5*HfE{9tdj@}zm5ZKQ~uz6d0p|4ISHbL{(wQHh4e~h zqZlD+Nc4r^%|6C};+t0vZ7<8y9#VNfuq0Ig;2eystNqbpMmqbbT(~d zCh0io+6lqYG#Cw)uA??PRgd}9U&jo+2RiJ{v2;$EyrC1J!2_&*q^u!)G6!hGiLIUp zWel{+!N+LmX?;Zj@@&E=lfketc3zSwP)PoE-E;>a(Zt6q-=O5##>EsZQ)I@aEM}Hf zc9K;ptar*7S=$<-o62by-?R}ia>9-w<;`Q~$-o+(#(61!i-TEIWM$>+z+++Q%VXPP zTKwS*ywj7{&kfnGP(}115)^IqhQpS^_qTOSPc2Vj<0xHNO_7X;nJ41ClWi!+i^VK- zqTjC|AvfX=)plyTmiKzI@m;)bLzoX&E`nPPhh<056P;HsrDwC)dVg|OUo5vSTMl*Y$%nTpfs4JkNNTghp&Wt!-V= zfgLDayhoVrg8yZX9+&UOSZqxB%a_?|^30`=IoK-?r^EAT!*(d~*10(IYIH)M8Ed(_ zulfjSO9y#-SiP)A#wguI;=rGJmpME!22U!JLKr^_gZC5a%bPcCSS;H_Hi3eoPcX4L zxI`SLnQhN_Uc|qJH7jH>x2CuQM=f|hnkNJ`xhVQz$ z9bv=mNrO_pOq%}zj*0Jams;ZslX13vY<_0+XHBE#Fxsfu$%AX*Resa>WbSx=&CsT{R%=C)5f#lxEEWkr62Q>j*RS zGiz;+jQS*eoq9q-;+~osD@Fv&57v(&ThHFA3epxFn&rLCBLejtTvR`sGY|5@OpsMy6M4$w8s`9eP8pYe%nJ)mq6~6Au;Dz8 z!rOzoiOZ9{^ku1%ZJ+t1YZIrA=V^fySw$gxBV%t14_&(=`?>c6YXr2ieri_R4E4ZR z`8H;Fj7fIy3%dzhET*1;l=6)OO#;c{@5-YY{wx|~%EZ1S-!Snjkd$$2i5#ABvoc9e zS=L}rg>mwFrA!)5_$C{DVXn7WW0NCPWS(ix*7h31j71;9N>OaT1C}eb2BTy+@I!RH z4@IOOf7TQjfAUc-@fkO9YS7RR-PdvOZj^7F4^j_of*N~uCK_Tlo~M7o(tZ9oGJ5<( ztp}Rcnm&%XF^0n-(Wx-;n?kfU^F|Fi=St*ilw4BBHvSV3^^zjZr$pRx?cpb+<`s|D zH8#qPmm~-&E6cl>S<8o957StbNuGBu({7MG8ypZ5<+C!0euLRy0Cf;N8kmuzt_#y} z@MUp-Vmi`$Nc}mzB#C-R2;;zPkW5c?=HjcRca~+^1sp_$Cu;$7VcM>xQG|jaq4L16 zsQ%0b!^|j{>x(jTU2Eqth1ZNV%x5?*jr94$=dg&ty+t{V0X>84fNiS$uiv;#h)*&@ zm0Y;#Y+C}Zov(Hioik_+;W=Q=4MnQfmzrU5%)y zsCcP6@^C)cib{*Xb{54C8xz+2lq6J6rgoau_MQgXC1mOIl+w4*h0PN&hP*8?48`w0 zN_L-=b4@5YP?MSPA%6uyc0A(?Nzvh8$6QTLkV+fbVw(T; zg?AB_W@$H6$kTC8-uv?n+(6rr)~WaTi^Yi;bro=ZsL_w3>tQA#vycIx9f!Mfr}|9ov7&xlDzm{%Q!Hd0IyS-**0C3PU1z|{o1 z`Y|v}Ko0(CLgRIRl0d9arF>o~Tl==;7lo@IRW{7@TK;?2X&e^fG1q08Ql(|&Bb?-y z8bS&K8iE9vb`OQvUnOk`IlfBWdLVeF*6;W)hT~EsVwex(WiJPhUwxwnW-10JRC+Ld z-Al2Bg}x6(IEoHs*VkUX#E-*2p*OrzOV8yJH+#`@8IK$>q86J=w7kT{`?jBP=xo|1 z=9;eaS<_DHZPHR5=er%zfmQ)yKmCB&6<)LtIO31?fSZd-{lfC`flNRoWm%Z>M@J;- zo>rMUb9BFcFJHm&M?^l$qxY$y1z!xpNYmr_D---MVwfglJ!o!}a`)rGDMdxV)DINoKKBp<$)4DbKPueYfPUDC*K0i@N zHrTH`w|dX>o};bf2zXe7C9ZDSE7TXUW1K6*oE`Ss=|L%Ql@~t_=K=5 z_&@M|)jW&Ysy5~js6DsDb2u+oi=BOk&(uw>{AaU|& ze=r;9PS4Z*36+f0GzD`}udS8r$H}sq4Y}@{+fU8w?}C_U&ipbN^{#n;LUo^7l=Of< zoiJRG4^N|BGP5;aW2w1bL84yHC1-&p=PPWG1%2VF8SpU)Vg;JIiqcR&4){Y(jT{C3 zM2Z|}554y>#cUYP61e~~V&l3;493tyKDFT7W@c^{Q9b>y(k9NcJJQ-VPTIe56zvO< zVR)B|6}t+PA198TXTOYSTXz@xMw7QMB!=PLIj)QHKBMMJY%MtGLiB03vS8rn0F2@9 zzTF?p&`8CL_Qe3At?#~{)npcRe?YSFjb=Wq?*y>Y;(~t9%le&&n&8zm!eb6^I$+h+KY>Xf00I~$E6NmTKmhX^&1xa1p z?8E(FYjF!V3rDX`KJLg54+Lp2^2f{&EAB*91@O*=L&IZ7zECOP$et=7E!zB{zT&vg zX-S|SJ96p8&BO>V*Ui2Z3iUxeL8}xI*%%hfSw$7+`bmFLutDmaai-r`@eApnP!@dJ z=qw+6jru*l!L7MJq9YKlfd|&$EJQFQFo%WbMVXp~-}$7Q#k?#|$ybMVSa3dVr!Nd_ z9~Km=){Bpj+VNL^o#r6JuxM#%X*JwWf^#3@2S~+5-JHTcWVNw%9tE1NRyrLdOK^RT zpa?zHFhm$6NG+j^(5!Q5vW%dl8T+a{jR1YZgxQaEH(2;as^H7J$}+w{N1H-k&&)Dj zlMRMveb4>QWVXMODm5hI>-X~o63Wc3c^DUm3uHzMcfVa^wPE;G}N4@Oo; zO}@sY!&RUWg!|FMt%_tab!VcC!#WffqwKwRb1|8FY!W6pgNAOPY)OeNlo>H$d^iYw zVCPy#20!!!XQGJEaY;s3bFW1~MuGH|$ugS}g0|xoqPL3GbP>C|Q|v?h#3!|}8Zh43 zDa>%N7A2(39|C#^hOAArU|$#o=3iz1C|a(>f0fWLV)x)!I--z2a9jlscwx%X0}{6k zQg~74tfQkt;MGt-a9c;GAQyW7h3F;ShpbB;@Mk4CWuIo-g#ZfI?(H_& zBMwf1C-1!k#c||I@uV#j@|U55l|8ETU2)#|bpCkof?VBaA3;8_a9Vjy^WF7fD@^7> zbDg;uo){X4j67~lf}p+cG%)D0&6g7PgAoJ$TkOS`66QGSHXqg1Cp6q)uTzJf-;5|b zZXa{&*&icveQa9}yDaPA)jE3lqOH=kcBr3)Lg!EpajJx6e9pC<41DtArs5s-_~ybL z?#GpAh5G>B0a{gE?Hgip-E|ehiK}a>zlE41!JFeim1>xH8NEh*RICQ61U4=Bk1kNV zCI*>g$?9|Yh?Im^&~*beE+j8SX_4^Z2n&>EGlkNluLF;<)1%^|3DWMgprj1Gj-5xf zs>X>ekbn1>e=IN+t7Il?lXpUh+rYu*LJ`4&k4T}15=)Bni4l>tWdNOd#e*CZ9gE3G zRnN0U0qt9Mk!CeC{-YD<495=z`?pjQoBk6<{dJ>PHI=b`gp#qcFaN z=FbkTT$jwWX^@1)WvF*Q%d8X2x;*_JfvTXl`6<3~=mSbIu+ylb1|Q;AP92Z%0hiMH zgh>O!&`*jZ#$Y~yj+uQ&LGRqWljA#ba1n$gd-V^wooVEk(yw~ItEnID7?}MaPuP!KiL!Ha8LA?rkooYJ`Kd6okn=9gLD@EMoQA-DTbGnP0C3uNx7?4 z(|U|9kHQsxyT$)$>nz~n=($F}6e#ZQEfjZmx8m;Z?o!;{DNeVzyO!ea6qiELQrz9? z9opx8-tW8j?l~lx%p^GpzulS1{O1JOR=`Yrtxya!Y2UO(NE43}&$Udko0jlMEbO=N z3>CtVmW3%x`=M`dj~-!FV%B<)D+GC2M?GzH2Z?YK{#D&spnJp559i4-Xgs7$j;tm$ ztf}&EGF#LYXIb8KLBj+O(y!{4LZ{hT+0A;j3VC_?n-Btv_c2%3L8>l5j9gIAkF|Q< z#{34IVtV36S+PW3@u(skb4LDbHqcbljBso7LsKmrh&58sQ?T*{ZF}n1Ic$dHrxTRl zM;4|S=#a$U$4`b109Tda->{|(;hvO#Nhji+RDJWMLAib{5>Q-|O8iDuT(!$f*{YhJ zOkul`Gisv&1m{Jc34m_5!weE(#0hoPT4)v4qwk?d3erLXvckh>?JNX6CbG6qZ#_{(ANxwa!Ul_hgh%K@`E1kWFzD`o+2a=!l_ z0(*B5l@-O#%yaCPdN9QectDa6DpktP=lXRrJ~_jtF|@Qpc1CZw`E}E`uex(;3elTK z%Bi$(`>#%yoF}3yM_2kX4_v#ZbGZXNJs_}8CxKabU3~a%OM2*>26&;7<#Oh{oC>U< z8fD|C=`an9;W=vEA!a|>K&iT44|y|PuF`S}3}^&md!*etlFm6Xk@`3B@57g10`Q5m zM4;>me<2~6K2#Z8jtc*&5pFpA`w=a>dBt32J$n*&CHyz7@;_VICqLH03`SX5nHvUX z2xR0fww)rHK2*rGC{OjAICojO=h{8?x8=+P3)Iie(M7w=5C2L%K47=g(B~bzW#4{O zz$IshSmUPM>MHtaBe1L0KX2hWzV~^CH{StA%SEX>6}an?E96LCGO^lsOJ13aZdIrQ zU$Sf90=GMcJy{I3oIebR@>tlMR#mLzihCAMzxdEcNH?jH4g_lRqR4H3w$?E*2-eDO zn^>|qV!cj2K0uw_t=|Rr{b{7=gX}Tb`t0CzUjJA7u=mFs@?&v~`oflfw`7(BCn|Ro ziO~#>WS&a>8yTOpEP0Va6$a1s?!at zKt` z)DgEpyw&ifx4c6Bk~0zU)UQ$~pWw&rH-InFx2Id&DB;vYKHT!68zVNAw+PLnuHN!G zz=12oGpW1R;3mn2trq^m_cijAv;4*XTl3xA^7n~nQh>v%fy2D`f$NVW>_h(i55>;K zHpDZ)zNFpj*oje9GmTurV#x+Aos`T~nmkM^9~dc*&WccqS33GG4Ob z7f>Y`P$hA^B|+1ofYq}H^@y80IJ`IcmjGcg&|j`_N%;@||7L)%4WQ#ETAx?zdD{&^ zxgcmOo~zGZqxOGg#6;XoZ8s%vwQkkdtnGee`zqzz0oBi|bX@4gSTh%|zZtZj<~2Ag zsvNX(2f{uscfQ-^88@l;6UZ#bT~;S@MgQHh!HOf22;-!&Yn{iC3fXHgUL;JR-4cL-bPs4?9b3{INPlv z`7@pf7>TTB&>HcLAB?H=>HBB%=BeKxuJG392z~DGJi(Mz5^j0wSG4*;uimnYU$Ci& zeD7UZ2}`!N?#YcJJuTogQ+I0Yy-JOdgLT1qgiB658$AE?n9K+;}KQ za6o5ziT;R4qMlI_&l0+JL;4WJ(jn%CRfRI}l#)2_Om#kybbhCLGSv@S&w&m$7f<6|9hQocCY}_q+Q$&FFHC~IIA~0yK z0835Y(POFyrLYQZRr8cq=qf~R0RL-s(3pqDlM7nxv-k1N%0zv(g}_=b+V#cJ&hkWa zwu`{FjkC2rdvhl61xsUP)<1k+Z+klNUR^X-3p1*o5IFW-erUdNO z0H&{04vQBh5Shyfv5Mi;;-m+57v}IezUi63XjZ`LYsC^UB0j)fV;u4!7d#E7_)jop z`T$M0W`7VkHt(FEj-#321D0av{BuZ?I5t~+XmsE1;I0X!+LD- zkAbd!C-}<`Bf>2-o%{^2>Q7I~F)K-K}DhgKWD zO0Ak8yh!3i1?iyN(d<2Mh%^T|Rl)k8esQp~Fj1YYnXUObCHy(do!Hms#faUVg%O32 z+TCnnfgoSLd(X>@gKfRIdmnbdn5;h;=k0#nPdWnFB9~0iM#@i#GCc<{UhNtOzf_wc#Ds=2EUKk zBo`~#zvH~kP~F9HqER&HQSp5DLfQ@f!56z@j!Iep1djD+#QxX?B()JHsH0OVsmXHZk4H3Q{30wVHE* zb|@?FkdpU63>QJ4t0l8)HRP=qXF9!8bTS}pTOLKBWT_|G_zh9d04+2!wC=w_;LX=I_g$0M(WL0O*BqIZ63PD3$@xo$ClTzo$ibiHnM9*A$|6*x)n_;C ziqvNF!hdvUnU++(uBc}EDa*`)k30aykfWHsC;sCTKI+U5kwgO4)GFHO1LR+hmTNqy zyQLx52u*LvR_HLZqVpEOY(n}pmtNnu*znS)u7>)C2-ec^abXc?)yhw=(|2kG-_=i! zX8#Z)RG^)A=eJc6YlyvRCuEzhW;@veH3ks zYo2CA^8o}xbOTpf&xQm?4F6F`iH>7e@dY(!zj(z8;#?!N2K%j8mkA8upNWwR=~aH#bV3Hp@9N;Ov;ub&TwXu@*2 zgzzHjMAZ(~!2w#Ox&0u)Pn%O|j`WvLN{F%f8}>6+%??MKAUqhSg;mQE#S2jdJK2y% zXm3m6+V9e>wUc;F{BI*h47p*AaWC*9lhHF@`*V1tNXF_Kv|xIT^gRUQBU=|2C*#GL zWFxk{d^%5g>@Sm7_NZH@RX!9HoxCrnu4nnwPR{8i4dfH*CzMjbDWH;1a?pwnXLJZ9 zdh3!i2CIn@U#Kh_x)dIv2+LWCD~;RCt&o`{vw2Z7Om>;>i_GrIyA^D<;B#{zhvhJbFtPt%* zB-5$UGkhxSMr(>Z%+Y8H#!%s`RCRFFo*$C7;Sx7JB;9bS}wO8m#IDGrhxmiejmY3ZTl-qbL0u( z1EzD3n!fes3|I8?pdUeMC!r`u@1gyt97&$18AJ#q)d?#)F^7xJxKk&91@~NZ!kbDYm@pa*-*s@UMKJ72 z_ZPia-;pbnzIXAnsd{L?`m(*jznchO9xkY*qaIRJb~xC657duk*}=%c5d9%9M~xsm z%uunmmxh&OeHC~Qa#Aba!7Z*d*_~m)W@;VnXnm6ue53BNqBY@W!9NEiEj_cRePjg8 zvRNiFEXL}88qhxCu_PU=b#qV|AD=$-l*P(2&Tr-M<6p}5s^6|}{KBeUgzp!Ekh4mE zg@)be)!fw`{Xp34$7(?t0+Eo+A$Ur?hSgrTbzF|Wlu7+_NyPE@|0iu zmU_5aB<$23Oqk^Sl`M3Blp6l%@9(Z*430Dvlm1Sil9sqE-TMJD64$)HxN`lMP=p&# z7KkHohr@5}QJPyUp++V6ZoGLQk)4XZuwS;+9|3o#6>jed*Crp$rI;q@gj9Snkj}bB zb;udd{Q;9Zux-RNNoZ3aJ07h^bNV(M(7wydB?}{r|2f~ zI9aY?DH8Ytqubz>bTPZWR!KR{PwOOyr$!+Z)r_wS!?d&5G}*Hv61DOO(=brEj2W<2 z+;K^jIn1n**7tz5jb3{C@etC#=yQ6j^CB^s{iY!4Dz=t6VXEGZvz%IwxKe+AeSC%F z9(ft#)ABYk`?TT>t(EL(jI&eWZBT`H-}-A{q*Wl9=WvoNj+6-@ZNX!;nIx$Yamrx#0Cz$b4M z@y;P_tTeMAHE}IUV%-W#Eq^~~%~YVt4;AXbz7|~kNd1hM4X<5^)vcXX*J;TUO*xsa z_sfk0L^fEvgt|XNNb5tEjmeQ~W)*%0LK!Yt(7o@Ip<~ScM6#j5HBD1*4|Nk!_bTLm z-ds2l%HZ|qH>0wdC6%cL?hx?v@%w6==ypjgbfc5wn;x*%D~D!}A|244Z&t!pnN~RzX z6_*4RHfRQ-rsOpWj>4_VBc1?e;UP`6Rac3DaXi*lRAr67b9ALSmp|lJ;B;T*R8Ss3 ztfSpn(!}Vgpno^*XT~k*VT@naS05HmQ)O3m)L$SLN7$;R5r2701KlnOoziE_m^eU& zr%@avQmQ)Le~)Q{MnKv;{QN=sv14ZC?udUaYkHoKxVB2K?`ust z<@w$|-dXDX*SiV|JsC=&sx?D zuOIQhf3v&SnGVs>gG-j%3OL~nY~vjtAZhC_mQ<7-*RSJt%@NqO^&Yx{91fP0%fsl# z{RxfK6dC%#4pw{54?^!7obA4?{0deR;%Mw&vEt9pnu4+lw(lN9M(m48=5B*7bs|Z! zU{KyA@VZVr^DTTdu=2-QdUJanLBG~8O~Ku&AbGRoCD<`D^>m#Tf6{R2?_0=GebP{j zQa`@s{`@jp)18bB)uTtWe}`_}cc<%NBJw61<3xaR71DrELS^0GIUDjJ`Icn4xa)aK z0OkhsmL#LH(`{G)^?BmCi*^L zc*pK&s>iv5!6oI)B^$-d=V@>3;3nm%DSuf9dFX+u|j;afWWWYhXlNZ{jQOY zj=hP45*I8pH+Z79X)FE5`JHIAM8OBR(sh%OLiABj=uulI?6>W;1o-Z4^qHL>5uL^b zxwwCWKAU{yFEfHYfdrX}y4N(GKnBoEZU@S$H!);oeUe4EMc#bY%YU{W`LZ8)gx~p* zc@Ve}IDw99lJP@96%62wf7Y|1xqche_APbpF)@xC@TrlEK=e}R*7cEhe9!X-efb?3 zq0_{(BAqj`%VV?ln@WMV62pKDjkDmO(TabJOt6>UdzmRcmG80 z_pwvz1_Y#Wdcky3?j;Al3Vuqtm;S)>ugchAh`j8Q{!b|`+JQdFeJ??bsoSjh zzDqyyFONcv$s_;S4G=%91>|<24V;;7h3p(>2Ts%Kn+27FQvLqutzOc0d$dl|CTUWD zkE4jJxf5(%qd}eET28=`hqsU81u)+k>ifQK|ugr6A!~c$07K2%Df*T(GhpGvd zH&|eQDo|fb`2RIBRZ*Yrc%2sYxi`My0rEwgj(KJLHeVvilku5L+xu#(Ym0w0e@UYk zKI)7p>erHQ_mXeopAbm=QBjzZ<#0lywvB8sm^{GU*E!x zj_EZ6D~IZariCS)gCn#rx>e&+KApw?>BV0I9w3|2;-5Vl34nW~ku+_ce#TM!aExn_ zXV?Rjdw%Wh8L1uE>QB3+X{_UepUAK;3cB^}11S}=KFCbWrdIPAx93a~cskRV4PS(4 z0362II*qKwpIz%gPIn&u=SH`uS>YF|SI|7KE?V^c3K~5(aPcRoBSidnvg2WN`EDgp zc=2z!($i1p>|u=A{h@?W9y0~&`7;hD%q`2jq}Mrz=~lJciq1cca;7@aZ}QigZN*EO zpMTo|GLl#Ey@%_x+Uh<3$p~h6DwQrzb$BUK@A0UDlXXOr)1t^!`@7mVLb#7{@vt`mm2eu;c6#$*o$>H+@h|ZRI+f5zCP98idfi=t`h)i2Y9@HKg+&ImJ<%&qL&8X4?S2>Imd_>R{8MFh}&-eL4k zTUk9+nd@2p@+u~qqoEBxENuNFyhW+Q4Fkht^2RP0>EOO?^2aA&!v10O1c1BFG-4#S zN&lwLfrubVz36rsV7^}V&N(jrq_-MR9W|?!Qqei{qi9-x>>6p_yUfa#`V(BD_sJg0 zaxjm0`BD~7yTm2vX$Na#1V-n8hv2b48@n|sY(QZ-6`Q$`+EN(H#lg4Bt`&L^!WCa& z+j2!PX(PQCR|^hN7YOeKOKaR=dE9E?v{>xuEA8ih;;#S1z`#I1cp>Gx!^|D&FAPjM zb?k`Vxj2;HEs{Nhs~qv7Dlp?DOTgRt;2(JrhzuCUB+LylNyFL%-FfXIN)cFfA4fbE z^D)EkHMJr8zXmFaFHz1Hp{LNi&1*F7_Nxo)Qru3F#cCsD^0B5375JK3mArJ);Aq1r zRkq2KqJ15eeHpl|w56~$)}yQ8zfC=|$%Z{ChAQq#mmaU&3L(fM9IvDuay*}S5mH>- z6i0+60rd=nbDuV%xH^j%+8^*a*hEdnMV(2j<4dUU^;=KORuh#_ZUbfHh5>cLRMk(= zQ2b#mj$|3Gz`E)AT)$|SjA&N5%bvfZRKuEQ0e)qmk$g(4Kc99=K8NYV(Y8&0Sq;Y$ zx|n3m=aHt6bwp(4CWR3168VH5A}^I!i%2@D>tBE-)9940pRTUbvo2lm%}l8bH7AX! zRcL^2G&O~)tino{+$NTTm!GVgyVl4Z6(%lFNDV}QFA3|yne8eQ(g9C3JC&jSAbcU< z9BP>-2<`{@BjP`@(&CLAAgZigV2wDt*@{qpAYHV)(AtGsSbF!&vTcjsSC4sOk+k0O z8#FtX)%qJ$PN+l8tc5$`eK-}F21(tYA%Dm?-R4fO2?L)*DbDQ@7@E^R+qRV#`w_WJ zrc)fhB1=v$rcK%7?IlEd67g=%TfLEtf)TI2i-*ni@`Z;?MUnEW5L_EiPK$o9<^|kny>=Phc1xUhYkewgQzc}8P%XZ)`2Jev{ z0C$)b-qvCzmV zlmkQMFSF`$uYZvZboM!|Z3pQ4ABylW-`&L3nYqQpwaWHIc4VD8#CVMQUefsvh(->u zFTfx5O7ii@2QwGLDO>4vmb$vS$b33hXTWy_ zx)|?NCMp;i-N#)Aayb3DDCZMW=7$-@WmLE0z zSSe8>iD&n-4%w5TM2x|E347Iq;QG_vQ&$>|bcG&+eU(I28oPhmJON5P7xD@e3nQ&^ zMzOmF$6s-b*}ALVLbDBC%@@CU1?V@}s=%zCO zZLBUVI$!OstqVOg!3vq{Md{_O&{>VPI6#j%`Ni=wMkGqFn3#tPp#md8+sS%NF~OPBH>>zZGVZLQrNN-dA{FYa zuyiomFv#l&lXlCV!3&X3=n^T%ef7 zH3mWbocj^eK`U<<;9QN$E17V;cjNdLx7{O!<#5M3Io^4Eor_nn#DR{VAlxFkn+fwA zxKY?adI9CqHCbts0S6a$+a6ymJqTBIzu7it73ui*0j}L5edU8EKDIHC5DVV2lT}%E z*Hz$mfVW!%!S6sH;Gz41fpwX_a4dpaP{U3c?yxFsqji@-``H`E+5+`KoJ9oW* z*f?0fY*JUyeZzghi###&8m#{Oz?XF3lCqaAeuR2tF~4&ql`Z!_WO^P=7zx5wnjAe+ zERPRCm$BrPF9;o$cmglvnKC>(`0?7GvI=O|5e{Miu=ct4C-x};nd~r zFC_S?Z46(RbaSBn6|6>FuffItMzz2e^R9nilYb=oJL}pMJo4#yRP0ui_ePTCKE{5? zsArMC`~-@LlzjACu07}=;Cg=?Yx%fjN%zi=(3XA9(X}^yTxMQkJR!< z9*Q+fV9L7khcx+jGtT7xtAt0BX*JgurQJo`7z9M*z*8?GQeqf@(E8W{Q>S%Lo}Kqk zK#JV=HfI9a$+&W3XKUgw^_Fj}>h*+SpjEu>963S`yi}_etT6*Ne(M-=*5tE!#)2?C zuvJb%oSBur1=}5!DZ9tToJKuUus7|x$KwiiAflv>gDPEjP5Y4((naN%&cnYAm&&`y zzKefavI|hBHC)1oxf>v=gS$$J7R@*i|`9pq}gLI(68vyRz^%I~#GfD$RdfC?org3NW7~<2y{9wQgb)&yQkZ>_)iH@pdY>x=7iSguKbgI|WSh2a<%aUHc zBcr#WYTcFMR_HayyPNEfv=K0xsQCRXaOH7oh>AVobNhpXVuI6zBp}D^><#ZY>kD!J z7QlI?@@lqU;TP^U8^W9~Q?sb9d~K|!qz57hlceMw-=D?Wnd6ZJ_VlTP<{{4 z)upl2YuhQ(3uAZuY|wW@IJXn(F{I5$$jCEV$-Ko(r<>P~q{^^IQ1ZQ(`v@9TNk;fi z;@K6883cvb!&Gz^*nva1q$_x{!92Kr;F?(rRs9el44u>$WXy(yk;Jm-l~D0hkKY&> zvyY2ge<%dT>AWFb+FI@T9`UMWet&VAwhc}iSY9kb$W9iesAE^$67Y|*>_VA|I;A=4 z!|k^%cU;tfiNxpB4|VNdCGyQ0W9|;IHm@xhPeU|m#OOf5@?)Ul&sm{!yjmF~@<4iG=(oH+0>`y#yCXhNwmHj_ z!tJ3($qhqtjC>n9QG;^|W!Y*1WptYa6h>q~@s~|(Yw2jsP8C1tvbG+0d$tcLmtEMR zb4}63=*Zu{lvl~W-*8OhZn_(63dfAjQi*dRGTN=2Mv&BI&qyd5r5`s@??Od2q;l0r zZu{V4GZh6n7ql7B_*thX@PulKpm4V`e~KuKw?WeZ0~w?_zp#90XkhL~Mze#3z6 z<$Uu8L{o5Ar9VzP-+FBJXD}H3ljw{ynEogEH*a&!SNWmc?8a;K_$qDXfU$Mn;6sHx zr^wsV-u_oK(?`@Y!H$o$uR<<`(jGzz(VM?{Ep9+z&=A&yM{>H?5*Vo7;i_|z3*qS} z%0VPqf9Gl7LM=xjl8-9=g*C9HMARN^vjm4TQe-Ii{CN-1F&Ut0UthHtI zgByUsVZ>47&+F(N(67wvv;y#tmi=)(`;U2(>RhP_@ZCgO3$2QJQ09%2PnGp@@XW68 zG>&i`%qy_%$nzW2k+b5f0;D{UsST*9%DWG=q}8QpiM@Ho;HJAWgHLBUPv1J1?gO2e zJ59!eT)%G7I`7>M1l&Il=*NGIoP3t~W5NGuxpU-OM+xhlKb<$=r^64zN&_d8v*Nmg3h~w>BU#OCv`?-f6mmr8BT&~wSRx>VL3550D zs@#2Z>W7P++{0d!SZiYoN%2(fRMN`RC#zKqMx|E99XULMF>G@%%v{(Zw5u(;?acHs zfUBIfE~QooU3qCch}!R7EKu6`-V0n+-4K&0nsW8gh-??%QV-Woj)i(T)q-%-+tBj>aRija)beB5rw-Lsu-OZx6#z69^SXrhcMyQj2t zqx_T2D%_BR344K|9>w)zP+#cC0R=@SL>^maM(qhxQdtoU|73I|=u`>#;(uF>V4m(w zMXLBj-4ql$w(F5~Hj;@|DI`;>t%qA-9OG2|{uU;ICVZQgg;Vah&)_}9vf*w37Bbak z8VJ?C#q5hw+5Wrah8_F5-H^}^xJqIUkL`RovZec&SoF>AkpWg3AOn7_BGbSrrvLHyH`cFV2=!Z%TRORxX@KUWdW`mm)77j!v=(u`O1`t zA&tLp>yr2CTEIdO_8EHe(0WraD5JoQUa6YjcB3nVuiXc^Kntlknv)juV@t`O#q2`xdnRzfkv7&_-==xuqSj6Wh|GwN>B`?4~~1l zULK|<2GT0JQ~zxG2wr3!AIYAB=34KqEB@Tqh3;25*T@$o9TC;jMNQLJ>#E(mg~?@o z&QYGD5UU%f6PO<^et$Y4r#;GF#);eJK6y9p`4a zfFGR&vt|+>0pfC}LBBYE$zG2V-wSOBKu1LZ(}{>@l6S8|w0<-#!GoLtOgK=pHm6=@ zDm~!MbSw{Q8-44S3C&ZIHC>%=^q`vjb=+kO`oj zK&IVl{$exK}rw%#HUTZ9bbw$r7&^3%rY7UGZ&~LpW*YhkB`8hI%SIo!%mKXv;Gl|KQ29;&TvCINdFch1D64Ikw=NA%8 zY)siOiXk*akp5V&)e^U(Oi-rCg7v#R7^SaJQ&h=f)puOWUK9rBVX>6{jDti;ua^ux zJ=i5>_ZZ4XJiSB>qlrF83=(aKQy0+>ydsPJ5Y|CB(KNJjH9b{lD{Hj5RlKx|tSRgr_3UYb_0FH7Glg(Xs3@1rWkeR+h$>8O4< z3NrQK1_O7iwT~Og-Q58a&LGz#7cr4OVfy4(J+D`7aIuQE?-6fog$MJt4SKRsGL5Pq z>EH5hsUdVW6n!VhWsfW+XSq_I{Rk)nV%XStgc-Se>M&7aDHofVKV<= zF9W@U&MGIqo^P9lH55G}>>Rs*+rKLM2v`6#z#dk2HPLal13tXkdh17 zKe(t17KhE_g|pB5KYZuL!`&72W$D%4mDT0mi-e~NY{MCCU;LuC(aF2<0Q@?Iuimr+ z&a|_21nR6T>U;?SvJzwW1@FwNNzn)BOn{OE@J{6btlKHUK+5UjIm*8>pC3TQmMt!j z@<$2<<;DC%U(uc_RK#gkj)@gHU?l_*KH0x@;8!AxB1IvT)NZ8pSSwJT*hH@@vof2g zQ~*SNwfJ@wfH?s$b9cvTTl&%Ej4(bwTT&nnutVx8??`MrD?Y3SdG>x7z(gtM&i2bmat+rg zBNxYc+qGA^M+I?_SN5ieftc2pXy??eZT_{>Eh+hoQp@w^2%5BKHgA->>0hL0o!jJu zKEQGuFoO~XkqFbO=7EBnl8OCr05Q{cOl&GzzYo%%d<#Vr2qy)oq2bgfMG4H2*!1SCv7T*q1=ePCr84-labA&jebz{ESpu=)l% zids4aWE?kJRBp<*6!&676k;l#Hb`XoD6w+ri$-_+^wO|y6GY1qx|ZkoD=bk#3~o?2`E z5c8zYSX2IJV{3*Xmd5d|Vlx9=-5QOA*)12tVMj>yx-OAos1@h5`&QxQa<@&;xI36k$4&=6lD=<&P+W^|q*u!88LUz|Uhy zSJab`Y#hhnsTo3@BJI>5+n|1|?|b0k9*L%|Ej(UT>l|~UquWge50aCqR8=DkixI3) zH8O+|+YCZvvW|WfB9SF|CALW*CLMSa^)X_argIM~k#P{Xc(G8Y~1j>{1ldEX>r**uuBcGCQ zb<(u#^~^cFWbH3wUQZ(ODRvrwMB$@MH55M|%~MX#Z-&esys^h3IW#`Q4#qbkRilIS zlqR38j6cS3oT`-hI;4WT%NB9J{xdB%{IN7ZmjOy{&$}>@mzi%6HQ{|^tXF@;cON^B zbLjG{Q);SuNYk!D_53evsSW!Zeb@;^?K9SdY;?ACg}qihZl8HZIw-u*9B(zKe_oQO zEney*p;i{KE6S+G5|}Fs-Qx{}PtNCyu$Ve@aT#OWLh;XA_zz>JCgZxq`Rd?LygxI4 z9or};mVo6wnt(kpswfwVNdBeg=M1j2cE4G0eu$Jx4-T2G6NOr7g70FM>4Z$r);D<3 z)Yos_w_#$*2qCqbC=`QCVr`2NT%(kO6_FzwT3|4~msUQ0&SRg32CucH7P940#70Sn z!tBSOvDMIb$bM5oO|h)YrIp-M;_3*ew)Z7(zD(Vj*2#YVX?7fAj<{rAmyQz8;wk!< z;PqxIN3K!h05Za`q~`Niwx4=vYcoXn88J++c6(zD@Kl)X?Omy7lih|vEBq^ztaA_# zl!9}sE>C)!nZdR?U%NoYEDfh$%@RLbVRt-A?W>M7u+D}T9UScTTG2h(3^NjdR7AjjQcZWH-+`dA5RVhjb(bsPha*MgTk5qAu zr$UfqMfaL%5*rpLVcwLhxwxy)FBA!X33Id6#(P2szW~)jOek&+ktg;HE|5v&FQP6ReP_(14t` zhBmPhX8by6!Xi0}I^3OUT<~ptE88b?tGJyyiDAR)6k$*x^njAbz6!Fh?OP9tQHeM4 zGGd^nxYM_OtpM7=@;K6MP5D5?Rsem~+&d!_i664IkR4E%8U-DR)^h^U zr@hB;v7mNdlE7qqXB2>NR~FdW5)J#-H>UM-^-9MI&}g98S)+b zG)KufJe6l=%F`|(y=?#{PsUtyH`O}9t}^1Dw}5{qBR;|2ICIz*=+U^w853<-6HO(o z{ja-H4cMI6MxXP3gV@w0agx@XN((p+;8vCn0sjC98X-j6^!Z;%i4kcev|5rTvyx~? zGTLWUje4-kg@QD3q!xOO-7z^$&Qhdha(#`;YHGu~)T>{q9CmZ;tV_fD1w`rrv#2ECGJS z>NHnw(JC3e#6CA5a*`BUsf_t&PU(BXjUTX1@_U!Ehs$6v5c2_KvQkGanpT*{@>|K-04zYqY3}9K4`OEK@>M z)XAKREpIs?g0K)p&ihIRC<60yA{9|rP@06@d%gqM0EziRHxSG4H_XIWbYfM zYy^sTL(P$u4v9wUhI$pE2^IB1hIEo75QHIW-A+&|r#B8`#%DG-$YX<|9EnOBE>?*K zCE8XfRuT*pkeX?qc5Fvc-e(ktD&Z26YL)PQtRW%=yXup{#Sy*^+rdXw&lD4aM$RXr z-xZI6a_G$6l>FcWF;_&0LtwyB1@^Y?} zXc)U^*Vs7XH;4vf1Yr>>L_Fs1uZ(mOJzX3Dv}1Jmx(mIH-QQ4y`fU$3GjX zO1}>7osIn2-7rrYbY+Cm*n?S4`{rtu#&fi;Z{AeXX!YwYjUsV9PYmyIdYRUsC7qZj%~bRGB)Kw@}b%N#&a8 ze@8_T4FpmO-`$g+!Yxaz`cdwn;2d+GU#b!O?j8oXlXVY;e;l+ruivs58GW8<=se<; zy|Sl7u^cTN<9bkN;e9!@`0ziG!eZRa6N7u;#?$z8cFoa?NeZEq0|_0XVh_CyfZnMz zOtk$63yZo+$t5uXv;AC$cv1-E{Z}Q*9>cBD50Gaz8|OWuBqy-s;;WpKeK;UL1^M4pG81WP#_Q#@CW*{01^bfgoA$p5BKr~{0oGa zFAD>Bjdh*OZfKv|L4!2b`bhYm?P+D7${N@G&&RvI@F&o5D^$vXc#cQ z|N1~f!N9+G2?q;YRYC(nLBqhnBO*YD$0-G+qJgiz!x@#Z()VcKwgkX%z>xnn zCI|`!78(v7xWw&$7$i)Xq@U!Nb+E`-zyp%A3RH}(oeIh; zeEaoh9)t`7d<`829rO`&e5%Jew81&FnW=eHGg>GH-%@m1o6 zCAZJM>>1i;s&e(=Pub+%XNkP|iIpR?8Pnet&>|Lu^V-DTry4UQphd*?^%b-aSFhWo z5y^?{yMKXT7=(w)x}P`cx45G&(}n2EOxe-rxw`;P9#Z@2ZX*7_*Kp z12&%o;{>!ql0qWouTm67_{~UJvfyhm(?*>AX3(`LjlIL2dF4NJW>j&KCOaJ%)t^6$ zl^+y$>I!D<&9_CeUx$wa^aK9k{<}7z^_PmZXYn#6oBnQ6Qo)1L6Lr1C03sgQ)iWuE zX8`@!9mD_Cu@b-kWBIT{a-V1&VZ81rN|H#FUFd8!Kz>;&?x79tp?{zC7M@-kBwd6J zAB+iH6feVn3O(Qe{(U0#{`S+y8?JJOc?--CL_rtPYn&X87_YB5kO>2g8GG+OFe`4` zCX=WEftZs#7V$_WqgZXJ&BJ*^KnY0;7bIemQWkfSIS@cnZ&)9-Npav}l+RZP;Qh0d zYYa=Ybk3{InF2vB)_s0vFdSDF=_f)!mp~A3c$*UEb9+gFw^;i*PvJwrvLch{`cBw`abjE39`x@E-Vppivw|)v*SO{W=Vgb`?GTV? zE%?FzmJmRIZTW))#bPnv=sQRowtIRc5ph;h)BG;7#2XC4R6}o|plAC*7$r*w=>q?z zuW3tmSgMWY#ku93B1^PYzqda43PT32EGAO4K#*Tw3>1hT=IcB=N(NfoKJd6P{)7dt zGw1O9;C>*Tq@|fne@8sSI)^)wRBtc{!3zJ$&w`@a=o*S2+y+t21MD^bTS5Sk0t)gl zj5;V=+Oz-gDZ=9NF1|eY-YS2v#T(oS!HM=&b(Us-=Mgld4HD7>c-Z1AJiU^LGz;zl z1%4X&3GjpcLl>RLq^oyEl&NBG`hewQYclDr56~DoD+78T9#<9*cpyoNO9Mq{kT?9V z>YiWK$eI4&$NG+!$rLY(XGt_KQe8D=v8W3)!z$Y#?wIfB;o61fE@vQ%pi@(Q1vdqntVDmwtvrim5ESbo6)zV2& zK86;C{eK_lKS&q>7mc`Dc3w5dH)ycW5n_%HDhF?l2e!eSYiV@8o=SQ~*I`m_#_hHW zPyIdLq++P`I{@V*M=d|AXt~i1ZAFr;QyY`fOYFHYZ^C3sTX!e~|NOlscd^(lCNW2P zHs{bTi~QJiFDWWFxk0_F*%z&tb`M(>H89hV0dN5o+-?Jon8~tsvm~UqcRV8^dRTku;C6rmh zWo5-C8z_7WmQ<#M%a#KbTkO2;S++$++0JNRHU)vJ00gLlA>gV?UCMVDm!H^S+ZlL) z+pFqaY%eV>VT+<=1E<&2+1OrMSYj0^$l?#PxFT{rox1Z;j@5-CF?L^K)|eX=il6#W zLJA1%Ooxo*6H+TshJKag($2LYvz7cR$W$HbBm|WQ*nRFivmV zmwMrC>VTV_7`HDC;Sn}~dTbh5tK%9HR&tvVhw74iYf5^K5XupImX7ciTC&-fhVW~T zjgdE8hVXkXl2|OZs|^>1{IQ&q~CPs(&C z&_v!a;>srE0tOv2ZeKRz2j*u6utGABy@54lPSRX-A30Y(y{z;k_AjYmc6k>EmUBbN z{Ous94y&3L9CGE^IQa&>ZgnB$`bez@Mk?bRvOQi@V zB};na3KgnYX%6M63M!j zN_7j%;{$Z`pXQoh8Op79L7)r}LP$wEGZsXgW&o&yU`5uc^+nd-{iBFWqE*l%wFZXa4!{Lr< z@-@j{ips*KoZST^h~tqV)Wqm&=+u)@7NiVlv34yIGl$tz-wA!u?R_I?cmh$Xg6WKDNOFLfncek6N6K8oWkOi!o4M-nPo>zl3FZQJ#>OF zaW=jexP3!Om9_Fi!ZM#(57iwebo%dyK4^(;pB~J&d@L-snMiUQfUo;6-dNXEICwX< zivf5+>mC>l`eEW~@aaP&GBi42w2iTlrBu5r1Z#vKKm!E2Cpo2KxCE^QbkQx%P+RhzFm+j2MiMc0zcK6>QiKxG7T_ z+VT_a2cl!LvBK--Tw3EU;KTTxY+jPUI9iHIyMWiRtWMexFZq&-UI0I zLbF2ocqK<@RbrUYF#S@Y0+ldE4K6~zBlTMfmx_tvjQAf=!OijHg9Q(cmTrw}ZNz~T zqUFd{eL?(btm65+>HSwFI7wQ58X7=VPafAi#%hw+$cGB#g{`YHpsq%8<&zoX<2~JtK{FA8V zt0WhB>&CX#p-!!GI>{|B2j&ZBge2!pmOa0u^^&)I>kXI2a!?JKD!-ePNw8P>tadsh zDV7lX0d4EryivSY;+Lr$J_=_0(npm}A+JWKJDTtYN{{3VbNqS(B@V<#WLmUh3#@>O zhFOoit*M^@=jE4HXhZZ(q-JYvAoU3nq zn+1hmYx%xBv3?FPciCFPhRS69r?)45)~5g_SwLUDJQUa8p}k)Yaaa#=*n9<_Ri*N> zI`(1Cr2Cm21?ZZE3Wap*s@J(VgUczYihmyD5ylS5z;Si)F`Bd=>1$xVdvB=l9o0ku z=ZO0wRfiN0V_df1Iv#=tV0;JL3(N8_udivzX)8;($UI z;4N~!*=h+*kK4$&YDe=9wA#p7%3luESr66Oczpk#H5+>WMXRy;`JB4&=XR!K%e7?7 z^>(z#h5BKOreJ>9?S=Y|PRsQUpCb0f>oUdS1$$$bBhPeZ@6ZLapN0$d*>6QmlKoAR zL$Gdr@bfJHDnKlfpuIPr0rW5$ZwsAGxXx4H zkN<#LwfAlha!HDQw!YwFKl9+CJwnS%tHf7;SL`a+6gTst86KaJk9<~sW9(Z?{oAVK zqO#N@rAj$PahQ<`s;Dz)(q=G!OIl!0z&W3MCJHW^@yj>wTa6Tm6x7i{ygNmh(+ESLiD-nIq{A28-xfyF@(q z>}#pIo!-dr>dSXk9g23;k>ng6b~;3RHwa7In+Adv~9*vda%H1MJM_F}c zP&Pzfgcpquo-I#{HA|`yK4zzPlX;`*cI0CDVZS3T42KY}nM-xIaCvLeX{l=f+s{QV zYWn;5P^u=LE|2%sEhlO>L~#o)&g5_~$qm`o$SIiO@Pp}yi5vAUp*a#?N=%2txKxO~}G9n<+v z#XYZklH+rgMyC|2#Br@}HU~5~n=LDw+SsF~KU8tBLF?3bAU~Xen>UmZiVnpM^nv- zZz9FeGX)QAx=d>*Kwzc0S|jehRlTpo1SZOLX=~y!V{scI&&fS*i-6+;w(XI@Y^lMhJ~ z(;kF~2m)@yO0Xaah*EZ0|NI66b`GFEv`Zu^`Yp0A9cjPI}OeFI-2XE+&Xr_uaUxmnYz}8>& z)K4!x)!>kSFkvVyHmOfi*qF}GXRsKmWbjCTFr!4pZHmC3*LtquD~T}Zo5Og&c{q#g z15F@@H<|gs?&B+t4??B(VD|c|wM!G{TcyS#jqGgVxA&aSzfv5zP^Wp45Uo3pL7hw5 zA&sf99#E*ny7zvwD>z(Ia@)5#)0Vl&nW1Wq@ionGADbKt`ciK7V&mu~N^ifEk6R|0 zfgy&LZ3?w>k*LaA^PS2Kc^t}?>7azbXM~;7z{se;qH)2@GE12g`o83mZr`hK-9?lc z%4r1NSGymktj||WXXhFuJa9&1tl(ZZXDgJMtZ-=EsMh5vk*Q%uu5-uQQ_;U3u7)}O z_aeheiiDl?M&=sQRXP^Q@9HG&@WLR|JTIi4QkfsGwu0NR_@Uor+iroESTkBw^QEBv z_Q&dc9ryD0S2u~hQ>KN2frT+jlbNk4xNNQq3MRX&DGHsB+*zC@SBq>kN6K~hG`GDNHIZ^N`)oBI&#!+elFOJfnzG%_|4{S@iOb{gc z^MfsHR_S30F^NW9#}Axns!Uw zQuB7Qxod2=5=)YrpR4yIuHxgnRQi@U5vTW`CiSzP=($^U9nV*aRFG0xjDNfC>Y4eq zBt;%cghg6P+g^(lnmy%EJl3NkJ}`{8M#)P>ndMQDmYArMmI5+|fk8l@T%KrZE9jxY zcOt=xGSzLQ#$2tk&hT>1t22XHOFb}fnu2vY*inJAC2yH=s4sf?V^pywhqj4vRCN3g z?_LaRd}u<9Fmu){(l;5uq7gSt&}w)}yeN)HUxV$}n0I(A{7}NkvdAaU-pCy4SAe_6 zpCC!4tPlAR1PAzvKk>r?O0VOmgu?j8azyAPIMCbofrj4D!FY-=uV;2IXnZHepZE+w znwbLL;N^~mMaD7i4!jlw&9PyN6Gw4!i&_W zWE>Mti!2^g9_^}R?9DqKo#5hMb>ORuFw!m#Htr)s7Ca~stWB9srA`0e zguvE`YS;Iu4W`+qsf%fQelBOS>ddv*Bc)%e4Y^_tXrMFlcAeR28)!661)Noo{2Gj-P5#I(L}4%i#o=m z(&>+!EXQhO1{fKgZGD`}tGIZ$@J(+RaR}U$7L8PbvyYiNzow#;kRn zP#mt+`5t3C`rKMkG|@U8UL_|N<{D4eX~e7!#D)`O%~cx?zmC2%NWzR7{-OOjcfZlW z^ds`68MM}#pdBGR`J}2dCL$%BhLY>|iM2Dm(*rXVJLa7m%ca<695W*dY&lxLLC4zC zjn$Rp6&9xwd{x=6Y@_Rx94!m-jdHI#f6Q@~R2pWt44ZR~teTf#il?*C%~O$M`gJ)G z7L&au@Sy5UtC*ULVnN`bMdiUM37oWbOul-<{>$hO2rg=kC(3fg=i!u!o67lX!sH-2 zyL+$X;7b-+O?X30(hgfW)yqPfm!ab+RAy4SU#0CHI^z|z2Lt9DYqw{} z3YEt~hcBtwE({c9{)Bnvx2H=T{`=XQa|Qg@p97l{CuVRNa6IypW11bJ64fa^aK{>) zN;hhCM8C7q%#Qz9c#S!RP4s&TxBk_5Qslr~P`Fj$rVxo*73M<^YVt$-UelPt$d>`T zn>hCY_1<9>=F&A%hHgHOl~f;Ntz8z!OBDu=>{i61*juCtHXPoA@CO4jZY<8~&I0Sa zoKIXh#H)1_Z&k;Uph`qKO&MZG8z=dqDw=JERy3DJ%ogO?g_5@ovnzh~=!&R_A7@TR zm4&!l*-DNGiOH9EQuI^{>6%)m?oc*2@TS+4yjm1YGwoEa^T8+*7Rvj+E!d}-U+am% zu{wo}_W{{qsAdTd^oi@O%8+u~u$#cC+`n=Y$Ktm`R7MvZm8 zg6vM+8xn=8hK8aM-0MhOnWNceHksf>@@H?+dQHBEU+&8#@3pw`uc^re_^V4BU`lcZry0Gk zTF)`TcMi%YVsC2SQ2QL$?R1t^xE8$R#+I&r(8lYuxfHbcPHLe6CH}&?I^85zY0o8K z=7dE-*(&D`sNV2i<{?xfnWxXM+X;xz3|*$*AoHX=nN_0%zWg=ra(h(&chKccTlF#ENNdzR5?p zROqnwWmc)`Tax8zbKl%}3RHOkn791?F=py90>g|)#d^0o=f@snm8D?`eLM^>>igE~ zh1SbWQ!>q8`%-6jG*zE>y6j`C9*gsA&5%*W53gC75+F(Z_oel!Am5_xZHc7xoT!?7yT@jrQ?= zXCa|wG9F@6y$dEocbM=p$)=Y*pd!PxTTFveqHL2o_ev$2KH=fg5o>a%e14VXt`U#P z*EE_1 zxwJlSGEY>V4QbAX7)wy5jPC|^U2s~=w9Z6rNfqN8pQ-lnjEnb_5?oOqk_E1~r>o+Y zYOb`#m~%xa>tg7*I-J04e)&+Y>J)}g|KYOANJZpj_-czMDi1m~QQ&rooPAc_ME}eV zdEC>CTb_Y>)wz^fEpfHBOcr zxmL^SM15UueLDicTKYWh;m(5J&X3;yrryaEM*rfCM*w)VD73m zQjm6}Q6gx;N&PlW%7$KI%Em?}67Z^li?!)S8dIB|ZZ4>$VuM0c+kYcrPY4u=^b>B9 zKjDi&Z8TE!J5;V1%Jn9udj`|n{`SuJLaC5a2h&D;$V`pJ_-ueYk87_hDOenlIw^AfDe0Lj7+24F19Jpo=! zxhHRkLjv^j8i>ETi9t$82XH44r~}fEgdT{dz|+G+T4WVO*Fztecm%hfW9s zXNv*&{c$Sf$IYB^9--Sq^U}g*@fsu!C)z%vQOX``{n+b{7P`_>!VbE^9@d>w`%P#l zH>H;gGtcvePF%Qz>S35Lgm-89>hNa90 z65)O*1+f@&wMOwQ6gY9%5*<@0C8#9(CJpE7`RO-OP*8ofBURik__?ZrvQpVx8ya#+ zn^G7wZ#T(i(`LbPQlJ#Drr-CSQh1QEnyo3~RW(=w9Dm>&-Kvlyim_FCHC)MD_-IBC zr#ajn`;i~PUp{O!0BV56Mm1_AABXYBh|GZTTxDENtF9}eaDe)lli#cr-nsD3*g3PC ziYCIV=)q0OL>FiI@?>Z&LY)r41#6ijXszOAr*84O#D=YIThOrc3pj>7SIz|{E~Z*3 zBf3;j@eFQYhPkb-IFD~~%)!7_6fOJ(+XcpG)JU3R$|iZXlB<{_9!xK8<(d{xEJtb> zDouy(RJ1I%^-W%O+~SA2c}F_(*yeW!BANvvTsS`nr<-Ji=56;_j0Oc%C4gI^Le&Cd2J>=&Re=u0~924zds+S;xk`KYZ*JV`R@R`Nc zI@fLz9*O;qV*vORbeT)BjufhF1*0S=Co1%h9(2j_qPX?+Tl4a@E}HfAbItD@`J>|X zn<**KBgX^94hVnzpe5+?ohz~!s?L`~w=NB|(Eet@BcP1MiAGXMNYDeU1~d6U|Jfv+ zGWmpnzPbWX26#&b3E2DfWong~yl-HoojQUEF`(hIJT@G&?+%>2;LDxxd2nl?LXEjJ zZn>9c^vY@+t=*&xr0ozTZQ!G6+qEljw)hSgIUgfZgO2%gA&!gFRb|CCuf);z>FoQgyHFdNjvw+VYm( zDwpi&Wr$4?qeAc6Tef)+}sjR`}0fTKj?9)KyJJjw}I8=|k>=aP4- z#w4U-zL?J^7-B#$__P!m{r-ntWq){~S>D9n5}`1?1O}{wdY9=}FLgpY4?_a|2=uF=x2F%EZD&CU-XIJRG{L%=)u8{7e?2&fqv|V|aF;`22o>jN)YU^yXLfoW%Hr|$qiq})* zPX1sMj;@*`D}uf_U#!<)<4B=Kmwssc-aNNpl1K*hw_rone@~_<0umatZKd~+QCQVo422C5D_KfLBxlndB-t>c6lS|ed%PYn2 z#2y5tg@-3R$m=T4Jwa^H#M$qr)Pf8|>DdZNs{E=gZ5C?U(zBX>Jj(5Eagw@?Kz*ZX zKILN@uG27|D-kWB)S<+!aeS0%Hfk{<&Z`YCU3ba0o(v7rQfQB7nw{I@IOIrL`fX&= zFJ#uTj zpE!g-u>AY0Q_hvsOAAN%d#U6QFUpfxNx^lFf|q#z;w2%7;IwVo%U1_Xb%d&NN2oHS zr=43#T5V~CN6O`2voAIh!skA7{>W;LTx0uEB~h7DG*=G9P=Hh$rvJM9fB06e`r*mD6fKh~q?UCjxGlbP=1CN1P4ECt%`(;H zu#nS#*Z&6WNl*Z*zI+dv4P1&v2ohNyRdop-f&~ z@|Oupg`3^NbBZk6zs$L}uddZJgqt|L5jDZ`fRwT5f<#{!Y^Q^pQ0NWJKt>ysNdZVo z4D?$2N$d~k{nAtQ$6xy}1Au~fvrX7m8*mHL#LW0uUD1}iZ71lrseNan=OrQ2D1oQUq6vvc}S_cB_VQ$Nt1EzT*?Ic%0rGX}|j#bZd8@uQV`NE=o z%8i)J_jj!CiYPx1SejAR1owDDX=J=Z1jQYI6>E@Xo%_JuKgnJ?O|FlTef~#)EPM+_ zNC$`{EP*2l{|S`?enq+nvrCsa@b$kRC}gr_=T5 zAJB`RuNa?myb>%S%lz=)YZ?{zhu2na*b^g562|*uDNm)pMCEWV#0O%ZXpoFTAWKu9 zA%pS_r61<2Xs{y`4vHUR$?`7#T#kMkY;i;E2|xpYvj*QUwRnm_cmW-?%<_OJuhH{w z4FJ)=9bi46)egoM_#}1hItK%Xk2?G}UMj&ZSLuL290@MbYrM zw!A{$bAA0*mF-?DAP{Jwv7;UH@JPC91qAsG>seUut3y?zt0pI|(_(_}EUas36j%%l z1pNy;s3DECf`g?CR$FCTU`Wp9)VXoA^o?K_671>yYqEgRGiaX=d;x)Lmmm0Z0fJ`( z5GG85ssR6V5IbdwV0p}M8HKKqR{$O||DpTk9}oZmxI!H9l*#bn+Vdt;L6Y0b&g_wmRk6khnE7oB=r7p8*b`nCk7?#lsE~D$v0j` zfLy?X;UE-i9-d)`w4}Y2)fAd$xOPrZ3Xw8Dg8|RksaITn)c$?|(r;y{03?Y3q_GeH zv_%0-;4oG+wzYeK)@MsQLt<0-cA4B==ZMc>dLqK!%iMdCjeAW1kIEPQoE~_Ye)-5h z;0WmVXziS?>dvxWSLujALa4HFdw0>C-CLh>f+s3bfP(-K0hsl^_tFtT5uZ~WsLN57 zf~ijxv~w0m(DwkMB4Lq@TLrB1Qr>#L)r5O_nY?xz@wxR);45&}lxfjLYl*Rvu04b! z_8)}*Z)*GyaVW?omg*Nd%=7S19uWG`b2{_&kE7=Z=4)?YZb8MeHN^x>=5<3(8Gj|_ z%aD>bX58|?M!+(21J6JZ2|5?XXhL%!R+2YhmTmn3O?q7*KYivp)Pzv5W6>i%|}0OBjowq_iJP7rll7^h&47Q;MI-X z+ON`L@gR9(DSBeoC;rC*lU|-69)`9*pbCVVlFu5H!|s=h;-3sy^O9zipayuWpS;&z z_4@@c$!;_iAobbq6qKo_X8g(p74PVG8y z-Wud9e+x8##z-V7PS;RhApkOP?(@;#5)6Q$G4rAZ_Lg~d=aCQm5EMY@xEh}Nj5_EJ zb=v~hkZ%c)o>OF^yP(mtfs(wzGXCcu&^9Jm$n)|8YXUGxAd(8?r1c-_S{H}>0nr^= z?YX2({+PHEv^qRF#2a;{x$?i#4zo`gzFnfyQkDOq#+K;LE*~5#TpAr@V3T0Qnj&?Y zyt+}HgNqf@SlYbc1uHl{6gBxf`0AvGp9tG0oyIj z2ZpZX6!Ywg4*$a7GEKKvu|HH%yNxAXn{gcX6rv3nSTYvx8tIveG}hf0BR+{}&W_2k zc7@g)3J~>3X!upnJ2luvf|=y|6R8N*&vqU|EW#^}#TIb1CYlGeZpAPQ$^vM{=Kzgcjk)YdcFj z)o{`5%wUs!7vc8=I;NW*Bm%$4r~wH{bLWnp5CRA1q`0iq(A)3f8K{xrfNFF4my66 z7^^p4gw^$GIwJ{pl^Z zBgpt0RLXF<w4cIyytL3AX&&-=k$V#fZ^ZHlzA zwyRKRyUQ}5u7Ll5DAYip%TK3oY2lNX0TaU_+PaVytn^Z_6VbcETjN`MyDzcA!ctU; zw%>mYXdSj()N1hvj0l%f=I8jQV_kei>F951vd>~y*Evaz6wYc7Zd6Uh))b0RY&lV8 zgfTor8OgGCwBpvGF^pmQXnA;PuNRO3SAGCvD-j*A(|vbpMTLGla+;^3d|rd zC)btWKq)dep5zspgY!*NzExnc15fj86j*eZM&S)+@85o^(7;513>*gvZj;Hrs(XZ| zy7(Y&R08&~h61+$_YL|AnIG%mzHuNwm5Jyxio!>kOSjr&#kjNdS@{1YeD zqokd>PFbQvQ}+KpS(~I!|EhLDKoZjVgC(IiWbMrW_5h0xM5ncb0kAwV0rP68TO`;2 zyg~EdTN2ixp@BY$R$W_`x4(3iMqJ0x_RO;khOy{2{U%I>J!91B@_g?UtW=59-A+^G-*i&z8yfRvH!Tb9IJR^H)j)LLn*(39?{UAvZGU~yQdq*8D`#p*3kn!~e0)j(8Px}h^Pzq=qXHq#*u%Xa&gSizcE*g`9y(s4|*x0hy0mzUE9 zb2WY674`7T0>S>=9(-Sn*&CtX*z;Of%Z0Xh<|27Gq@8bN15~xl8&uhO3!`kUN$1h#3uh}bn~)TWTqa%k z`%`P&^;(r-(y5IajOQE~;vf5yMoOYX!_?XLD_xhmDM&YqR2xZ!4rjexx%<-NYs~Ll z_C%GjIx)!18szi$Kk}whzz;|HQPT~geeD!8m+DP=H3}V|vGs!Nns-NZNQ}(MM7>@RvoiHZsxtw~ux9Lg6dxSe$j9sBu4QzW_==7Tx#z(5L-<2;n zbBiNJBak8yQ$CL3}z+HJrX2ORN!Ay9M zp|jvTC~ogSn~TheNnHF)nfp9K#(yK|%VPR6(h)~`0LoyTT@i*Qo5@+;6*QyALo>&= z2Z=}!ChLwoRu1As16#o`vrFXNz^Bpt6Y)l6ZNVtDW+xy)k+{Hy*+gdv-?3E-QF6G@ zI!`wj9KcGv|x~5XoQn)btSaJ=DU0g8Xl)4r91)XV%1<>~mi_%N8P~%@j!FLPPA1RmR{|UotE;_ zY)poway&*POFju1lGg|o*ev`{+PiZI@P-IFcO)u{2Lqg++tyT^ZzHpA3VxtP_QFE- zMafg2MU&kIpCO?(2WfYap$_R(8?!mDfjk*gg-#=pGTWi8oSb|O|A*hvk5%e3E^5@~ zv`6^xr_K_4B>BG_(|j9e3V*j?&?i+ICSqfAN|wAH`Igzv9PmSedtNNM&I#Ffe`?t8 zaJfYTH9Rr4xej{HEUhmD7_M*zcn{@KK{tvwM#q7A{El}ZrTW@b_<^DQg%MA7!TVMUjwh${<|tFBe-e+E*zh*kcKi9Eby|bNmx|6oDcfsvH{RiaSpN*+WNs!v>xZgHDgSgM#N*~X6 znD4o9{lkuykSjciT54_Pg>mt`(Y&UQONkf`Tf}QiZqjV|Fw-N)F7CYjrJpw)u7;MT zg% z#%v#^mf0^ZgyEN1l;dkc0T)i1%XLAp-AL*=+8lpBFVbb-oymf3+AF2h(RE9i!^JLB z3FuzYO3MkoO>%70QdjGBs$c951-lZt_Qh@`Q@1qt6{;MCZWt!0rn>eP^31VUe z?MB5{i-9lZ+!j!RcNz#L#S068q#^g5tt^3Vb2X&q;?y)LB+M_IX50Dd2AH&t-TQ8v zhdY3PD3V;j4M69X*fgSYA*->X6OmRg4xupOk*1=`37QPKg9+{U?tK2;(psK3lMUUz z!OSn{RtT^)xQMDO_XSgH$EvOa@X?(k<5!ba*6l*d9E*#p-p*-|N-$4KV~%l3YwkD6 zl$Px_)g$Mk69BRMlF6X*gn6A3%+E0%xDvSa3E^E+qZ#JHqlP(Tmo_T(db?%T*mCkr zmw&6c|EXeKtuo3d7y(kFbERDirp6N43yPCrsvhZQ0p2~sG5CNUNwk{9(Oivk&n=-w z)y0gSmI7WHdzBrLb-V@~s~yq5nfM5YsqHGiJ6lR_n_`J} z#pxAb$nyfCe2do(m^Ifa1kanpoh{|**rzzs9tz)?5Pk+1jZ0-%*5gZ*pSU;aNc4PG z+qd4zD#2;Np0`u@ebc(OOc>3T8i8`>U!pV2uhhAm6tkVkH{kvh7rAN0L(D~&f|X$E zDw6-(g>20Gt`=prs$>sGT8%{t$h(_fQF5X&SJ>49DCWbzS9BKFTZ?iKWFXet8OBI= zsqfU%AFi|@PF!U$QaM(&wL`*mSAV*IUL<8)Ap21VVn-zQr2KXw{_YGFr6izx40scX+#Q62Xwf4Gxt=?{QX**sGSO-Ez)|7qZzaxrV!e3Cj(nG@5BR zY6ck5$1>q)DU++P^Q_ThYf2-kI97ek582{%rkfjJm<+x>%du|xkyfLmJ0ozV!~UH6 z<`1Y>Hra3G%zS2YBj`EKUR`-39^?Mq=j@Vprw51?G#xS8jBB=Z3M}g5RXX&4F_XbN zbe|=hJiJ+;{mm4|EYKqE?g9SIb zI`Q7%Td73%gM~~l%lUlQ(MKFZEry)U4uSBw0+F&Z^jH}Xk5IgAX|KzIeepj-k@9D^Syp;T4;)R&KrTk>^byCrEsZyoccS$^3p;5$PZ&3(v3{Bl_P*$o?g_!erYwj1-LgPU+K8^u1kov&#h<5OjB{L znq5BC#Y?)})rV+>vOba$g-|6@)|3g(aTv3mvzx`zqVIJErea<25<4*D{&2|Apw;iM z#2~fKk}m_o=`cR}8)WPb-y(NP9v3ff@Cgc3t!Gw~6^{&SN_5#uM6ygxLGb(_gs{E> zp`Oi2L@9pC46sgw2S=)rf$i!GAapIr83er44pEhj-eUyHT8?sGhd${WGYXp}TozJK zBntGJH!oz#Xj0`g8(GIGJqqt@2H1bvl#JpodwWAL-)K=yN#FSCX&9$7UUWvuS=_OL zQtUNHzkS5%!ISxb5iut6Ks;v6-o&<()86n^<4jY9xk>(dLRG=HqFf#G<4OA-mGlT| zob^AT`v8J-CuhCIfgM^dbfw4zOcv&;ZJIH+8lOYFlV8wecO@!LBpVV;>0MTfm6Rz@ z86nH}Y4vsVFC`nJFHUtyJAvpW-sWU8oZ^Rqs9q$l7&q+dvWHW&l3>q=(YB0GP?U>BQyT{ z(V^jqQ#+p6%dIlj*~%g%ioI#I6-FyUNT1v^E7$Ql)#qOI4=B9uV?NUPD$gDGcMtp+ zu@N9Yd?3-y&%JGUGwc_OWQ7y)=j7L?_h43z8MwQ3k?;|B|rTI&UFF1 z`EGM5n)zK};YG&|MwF!h*`*L}*SqC>^{U>sIzRL`=#Iwg6{yS7JWbHy?6f#xqT0&+ z!3j`4Nx=yq!>l|II{0POUT_-NSIGQ?6#r)tGW}PQOuyKwvA{Q@8HwQKK__YV?siLQ zilEzKd^eqXS)IyAw_9#L-Gq#XtW@+&D`lGh;Ym^pctu6|q`zA^dxD1;)715+r}jj5 z=XdU@=Gq)0bG`EZioL9Yl3xtG_LU^g7QHA*>2`FxjN(~B!YXBkox97DKI)Yi(h>T@ zl^%!U#cYNz80B_1r$lyzCIdm|*uPtGS~}{+N>#(WXI2wqJ#&R-G974MmsD7MHZvWG zt|m_pM|O5zI34@B_i8eBGJyWI`f1-UksPI=K^-Z}*+LJQ38^*rsYEv2->!xIZ9IrY z1w|!1?Z@RcXOi3*{T?7n~7jOy8Jw^n4Q#1 zMM0PA^>!IHH9a?gUs*HS*&Xx z$O$nh4pQzc1QJ!1jy3o5m(O67O^M!_2OtFYu=NH8#;~861-LLhX(u8sLwJ+0m=q&v zDaD^N32h1i=m63}c9_)Rtrt4*iztDqV(_B4p@-CGFHrjj#YT@8G@;2d@0GKE?klnS zCG4$h(H?K}if#oN_X&i~%29r;r786<8gKcHP5icU6yzu+Al=(An?-Z6h4DZLG|nMUy`4GY4#)I+ftz6`inJV{F~r=H!-CIyg?FU_RgKr&j>w* zEpeH#?(N1>_r?CUq<39|iG?EyYJ5A`j?p>hlXhEqmhy_95@T(3EklCwrjkbs8aAfO ztyJ{4da7N%&6LqKQZ5_7T!rzMWMmZ5E&Bg*?3Fzwo`76+53K-3&9i1V#@!m6OH~e3 zS9IaE!Nz@0rg;#>$PAo>9!7r|*&MIqWXTC&3iEN8%DMWlv$jXNUb`by!_KSh@%e#k zEi!M9k7vgNlmMBM8PcVF4oaEw)5g_3D4ZXTXfQ; z9f7G9*r{#*SLP91pWBSoIOGLg04mL{C(xm2VB1(f>RvxOurxq$dNODJy59_ zvJ&;#Zyid;y?gDl{L}7EF%mHpl4$M5FTQQt!ykaZ2ivz36%dhhu~?FquW~j(YAnF1 z@Yhs&o&{D{4QDjzQO%9hZRo?QUa~p{Yk5-FczuLZ}bdni1PAU2k$PkH1zPFBUlpUF$Y3kI zB_rZ+G|f|1y0xe+ZRJjvr#72l5;)-@T+JPyEQcR)}$p7v~{+_{LMES2cTtc61*7UB*;q}a4 z6n-3ah__s9n)>Jox8lOL{wiR|>%>E!I;xBmSvs0@;@m;-)84Qv^&=!IHfe;75_UJ@ zf2!r(serqE9~X@5I8xd&pkX4c)3VkZ3(c~f+S69}BqzMNqfk^?_K2OAuRHSF{@$^5 z*tt-G$lGqA{IdabCpnn`1XL#P`NSko$i%p$64fR&cp^_{)<*aw@8AVd*(_m#pO>0& z*Jj2K&d|f8dOTghPx9eJbj7lwQW5U=+|zEZbn+D+2hFek5Z1GKKCSLx!CY3g_mu;G zq!OwnY4EI6VCt0mvFYdjXTdX*`DLT`7i&pIm&ywY8m--V2`K|d6zBwegM$x;;@2A7 z&8!S4L!DLndOCu7O;ToJ1n5{PS820#xZduvO(6_N(meoREckr-m~m5E*pl07oRGkx z@~^2~t06LHI^r>d<2P1{DiV5PhT^;ALHhR6uuRoGZ1AnEV|o{HD@%z6xa!6Yhr!NF zOSx^s;kC;IdI9R=2FXMFs-U_5Hlv`Ae`ks1!Vif^~0Td>!Z#k75dCQ%^pab@{JwY6y~Q9mxwEC!zL?s zwj>9tOii9N|7<$227mNZ_g_?kONuoNEN={Q@eZYywW zPV`6kjkfu)sVrh|aq9$#3F<9G>Fj5rDF*uOxjy(X2Lil1>R&Vr3ndwRv<|a6`W{n7 z@X$MV+k$5@962#6@077>xarwl)V%UB54RKFdrP`}sV-vK@PmeRxl5i?A3V%8!*C11 zYauFas_1A?yODqBBAjHr0UL(z8+Sw`S&LvRSi-Oy3&71yWf3_%L#havda*`q>q(ux z`kE9(+5f(QJmOA?j`I8nd^_8$Nf~BvsIBx1Qk&qZajKAf{gvJbLCTN!O=YPa1_{@e z;GDuSN=b>@8@apEe^qK7wUST~@;-p-A&6laV>Lt@u(%%wg9e2Aqu;x0<7{Qd^E^|_ z%54kuNc*G0BmKh{K38I?5ib@K%!jS+s)2tE5%*Bh7V^$-?#$qyCFLGYM+)Z(`S917 z99303C;ey#s*ohScY8^-^1+4#z5ea_#Ltp;G)TTTjWT2KgYCb2jJzLkOFv9Vdq0uL z_6}|A;XXcPNfAGPoc9Z2iM^x(N`mO6_b780VUQRoi6=wnnq}CHea#JadeN;UAE-J; zYZV)Xa7QwNnw7ILw2tbd7ryKJanrQM*%mWL5R109jKb`NyT(Y3yM^}1!sKq16*DQB zUQ)*iguOm1D{LSsWJRbh21iY|^{Q{b>z@{ODbmj$Ju6h*y+_H?J{QGH)2Q#cI-5^s z->*eK#@;5=PD;n`a{Lmn+HbsUZI$$4UmD&ZHDUtF`l`9^&BK+3DF@!sv*K=+r(y=Q z-A}7=iA~788$h))C!oU$N;!_@b_F#r?OcWjle~R=CJR)`1flysdUArD?c&``x5>W| zjuQ6wsfWnSs|t^CHm%%*zjQ5W7k`xS2y?h{LAgi#4*9lxh{1Y+#!=-MV62drf-8V4 zOa2=F#*5s=MKJq<0{FN zz$pu!X2(x20hV$UIN-H;=VEYaEqWlu z1XpJUH<1JRyOpV;lh7I^2yKJ=F|DcK`^#+1X3#Pr5XnQZPBGRnGKwQn`}wCNgI5-2vp4^misHSsG$+3u z9Vb)R^7cdO^43T|rnBRLam$R?Ms|8!U;PPQio5NJ{3K7W@0B3s8&=QWm5hqR^YBt~ zTYj5{V54s1_vjfxrr~YMA%RLDyc?T>3Qu*aNpRx-y!+YVkG9Lfk8h&T1^C-<0f_6-W=&hJ{~@lQM~Ul!Wmr1u=D-rq`~P0z0gTj7 zd0o7(9}E82kKJlOS*YXo0Jn$NsBhiB$P!gRZT{F#5uzVgKDYoFU#Fu^xE|KcVk);B z{l{L0TPXOShX(AJHsx%zGzxPQ!xiJ!2fqm1K%l3_>PgGLyQ;Z&wD=1WLjXq`Lvgi z^NruY3Znnzi7`TcL*g*PO;7~9kh#~U{s;3TegNcl-6SdWhwA{|YXBS_0LPFn?qu^L z01%bnL2=%$f>azsZD6J1=j>c}q*@FvM1lR){D^$A5t6P9*m(e%cQf)*EhX1U(1Xj_ zIb^uuf4vqu18uw_9EUwg!z_d$T};HnUEI9MuT}rvQ6v0*pEsysnUOxR_$x*k`5)XJ z#Z_?MZ@}#X+U8e5fU*-zzn+{p4hOs}4LG^iw4dej2>I%wLM=arM2CQLIKZ?)3NNmB zV}G?j0z^2lf0K26#DvN{UAsDQ0GpFBvwD-i#mmt~@}RnI;O6*(C{D-hIv~zr$i;}O ziuV@GZ?yh`u+kKOR1fWAtc#x1%VhDxbegx_u)K4zKLuqd2)k6~imYJ*Df~Vyy!&uV zdk0+NB!ooMrwL_7=Wt{5BOtI$Xv`uOth#}{WPTE&I5%(;U1_-mm17SYLYC}NXCyUV zW!#fsCJw3}Fa`f|*wz3r!D_PY+@ivMLK4$qF1v zbXI{GIscNwE?cn7jkekKE0|7|o;PjhK!#FzbaB_9au)2M8^aaa20-LervjYQKh+io zRpGbq3xo0gH*!D9t{RiJeW1 zEka)aMk{WN=_KUhPC{x8u!Z|QFCn)_13Uwt*P(cx+P`mX0?j6S{vT|z|LgfsHwDbK zZUJ7O-!_2v{cAr81VJZganNszMOpwR9qLB$JpZg{xLqq(C9Bc!Fg7F9MX*sh@D!aH ze{wV6Zz!qnMN$*6rk*}bM|V>wKS%7AC6X$Xuj6ab@%?XEfbRH+&t<*w7113Z#h;EZ z?M)OfYUDzjze2EZP#VgZ2PiWH3RTqYTt}I}a9p1nObtDIZA0Jrq}$1v%(9D4n>={P|ZFltp>5qLm_eCfle$-V_R0X{a-C^T`b)jLB{xvRe!>^iW*0Ytg?Tpn=u?g8Xh_#RdOe z2mWUUkpE|cL-mY*OnhR00BcCtCN0W~jRfsx@EhfN3#F?4T}ytK=YNzc1WZTQ?zI8* zCi~1ATtLtK=g9v-B^)C$PZ-BKS8zY-xeis9)Ds)3&>7Ng%yPyfF!Q~6b7s&tDe)@z z?;|{LRG)a&>AyZ}Q0m`O=1Qm}(uNWG)?TtYJw=f|+mZ&1mDV2!CJy>GjJ^J^Bj1oG zjW}LOp@|w+3LW2IPbX$<7iuiYf&|mSX@D}Bh2??3_+O4N>1rFOSvn-aEi$rEeOjmq z@msJ@#dZDfU-_R$F=KDrogFzei}6ZHfS_%`0PoK;k^{IVFL*30B8SI8pp%_;zt>j- z$4GwCc#{p}065gK%gu(I3S#aj<#YEnCo^sm_|M=LshSEbD8XL$2m=;u(ie&FX(c5z ze)CW6PP_A&PuHe%3nu%M^yN|9T%E4XcwU{Dh%M!e>VE~3-&RmLT3dMlVkbGOY{1w0 zYMf>5z>N@lbp7sqQ&7Ec#%3|N*5UXjr4}E1mg1vURIlcXV?k1Vj)srm?$$hDx#}~#wRWhCE`nmezkO69epCM@ zKkJdlKmS@>UAXRr()hBOe)LyC-M2O#q2tRIH#FW203NPo$DFewo8E7F=of}HK4WEP zMI(E_$gPDGKY=dt`3rN4zn%3nveTB5H=zppK~;v^mb@DB*aQ3Y7bT;_VK%8}IRqrA~bkP@g<2+0C-B7ko%%o+nVy90Bmjb@+(QpR+pML95{wLs>7 zy@sTxLztgyJO*~pfh^6E8!hTa2e&@zO0)wekF+>R28(&`qp+%b3hiD*#V+R6h|Pl0 z1ntjv*hm>{=(daKzf`^#E;<79(k~Os=YYMFKp1bgjzu2}c4zL#H(1i_llSxaf zy!kjnppwjbW+uC5Ao@JkEVDdQk(I8IwxR&Pt|)ss&U_}SL5mMrU?F}R$KTk_HFHPi zEHf4UQ}#2@Rkgc>MJ-`m`1Ezh9vB-5Pd*S2sWPq@hP|QAKeJatXckf_Q$$$q#&_qu zTYp#L^_C!Q@w16zG8lx)Z5V!A z&zeHoGZsa`Fm0?a)N-w|W9f`RwcrJwZGM2|2iRr+odjrp=&JFLHz%sFF;HA=-T#1N zzg+>o7{j_apMk$XF1kC$7LBp6G6kEzhZSSgumVO@@83LB48j-hbix0X+;n2}kcRo} ze`*n5Qq6nj><-`aUc&t1e>bS|F+T73wrzvqnS~um`G9^uB>Y)08ND=>iDZ83zbA`vUtBdWntlZ4eO3(AK zm-_1Z`19x8P3Cc(PN-jRe0LLIkkQH_bhVn|G(!^2mnDdD#$k)%?8nOkA9bauuIZT#T}aoRzGARF zi?^dV(n7-Op7Yw&jciAC)#}t_8hU+yMDku+DuC={U#}vtO8FS`P|tDIp|9%VJh}Ti zXFE4l$}=dLXKG%Vt*A(IhR{lzN4qP#{jT;Z!u5klbGkB`4Z$#1-sg)5Txyw$D)#5J22hSs@3N${T z9fg+PFTtC6TI6b4oNPtJKw8+?U0_(J-?%1ynVVtMR1x8E7`hKnjn?RYRw&O`y&c%F z;VxJ^e~MLJafMhoN>rq7s+?-(SomP2J|$*yI?H8I=S2T4bGgoGqe&;c@V-`+w3OnQ z9#^p|)bxn_dOdBkLn1Rxb`?c(Qd0h#M+M!EFIH>mhCFd9A;K>t}@6+J%DwE zY8Pu~=_za!+6~y)tCij%X{S*p&iFBrUZl~mddhhGsUe&$Q=+%`Q)Uyjb+kb~g){7I z>mz>M#Y_r61gitp$kFuv$*DhYs1)$}P4>O+z(Wsw7YzznWLQnvyD^%Dof&U06%&z-Duh^%bG7Bg&Uof^M$-HtKguV=W zHl^MzY@zs>Euwba-alq8KmWz5I$wKV)BaM2f9;ltb%}8fHyu|Z#`ej5s;mNxZ=9pG z_g~mrc`5XTL>S3hbF~*C$(90!^U1k!-!As3$M*(!hr5G9aoHo3v*>sLOFG)Kv6w*I1^dw0z>N6F(J-`McjQfg{lA zwO^2A0+S~kM&;gk7qlM+?|t0eztjSv6})4t6~lTpcAKmAu0*9KmTeoHZ$)DF3@Eln zxr8k(rtu~|aQaliH#Djo`eG=j>Z5ofXG#J?l{RPjc0@MU=Pkz#VH`=Kbfx}bg}LmU z)+JT2fV`HztlMYLNPj^jyBkP%decl}5LfnMWR~Z1SQ<-21tj~*mlUf&)lXmg3Sp?Uu7+>+hTm+rY1>wOZ9 zV)j1yR70zks#E8uoq|lXCVg^A&VVYiEDdLj$$hIlTw1|#1=K$d^7YhES|swUaO7gY zdnos!On_Jb=H{q ztTd*eDWP!Kpd~;2d@NsR0am|T>3ZS4qJemp$ z051+i7P@>7Bu+A41Q+_}opOo)1N8_k@&na~-dXTSMzZv#1S3NO6H;xvEoP)nkq4VmAjF;~ zTVMnO@tj{hNsOtlqU1Qvv{yQmo_WHF?jW}Cl`6HfqHLx<{MZ2JY1?;qxnNShA4kW$glLJ|zN=72(kGbZ^LWYcKyPNP+UmvU9gPZ6cHI~8t6 z_XEo5Bw%OEci&%_^;mmSt=Lx;cD1_sC3wdNk0gdKXv5d$^matnBh?Rbp`SMxO<1!C zy*V{%OR6P`gRb|**H}EW6s}t+e;~Cp)wpIeS)o4mvgp2PI?qjVR~tRN{J@}zYj?Us z2ZNkTs@MeVpEJ^bb&-EJRip-WWl|fzTWBj@Q#SbVSofOsNq>*lob+1{9=~DshN)iJl>lFj* z!n%#p%?pMW1b@y-<-OM#H)k{s~xF22^TbB0;MJFFeJvt z_p3E003m&O>nBAnA!jdMYhUII+A2Kj4#7p0pl=q%HbevPIyel*c06ij`0Yq9*8MLOmo2-VDhV^Si@kN9}Q55l~`J2dN`7nw2N>UU;Utk8by}))|Uw2kyN;n)84^ z#Pwo|E4op%ytZ;zOIWC!YW3Z1d6|Y1-wq^e-s>}Q9XgS|&nAL--AyZ~N5=!xtEUVXS za+f1xn-&z)RTcl`1YEf$*%iF`r%=6e9qahQjwEq+)rUTw$jK}b<1>y<@G2U4IgRp(<| z&*;aKLrZTHQVJ_AYip0fC~t?DA|J%qlFitSdhDtqzG1h}LU%(s9=#ho%>g#kszdh+ zNQ5}Xr9cb`AMtvU7yHk8rxjD{6O6QT88r%I|m4OQp{ccoV zAo{lAMWf4j^6a{INT$A?*txC^rWL|Z7>C4cRZU0{buA>pgI`=6?y!C)j<_h>r+(*o%hle^o8>Huz;WhZGQB73vTrG6$pyQ-vX2X|9Ez% z*&TUAgYYE}dr)}`mfMdd0o~Fag&|%57zGrSnDnmF&jkZACp;B}pI%oTvM&#*2!=ks z-2s%${CYn!CyJ(|CVjmmmnLEH1X=(DQES+ipru{ngLQrA&cS; z#aB0P5GJC&P!e^y!1>o(^EyD=v_YMZo1TG6Tts~eIU4;&YoqaWadS~TB(>azKyp8= zH2KP#eOPsLOcd55%f40Gp#tbo;}e8Rg!#N4rne3EjR7y39h_uqB#HNpj2V;0ti8wiRZhLRzSlB!+~CA33GWp)%Uf1|UO~ z_rR0aHx-KZDjVD00Z&9W|-)ury%XRF7g zF16#nYt^QJtQ*3#msxu$@dY%Ot9wsdt2y%Rf~>&@g)#DX36hrF3K`#M3Mn9DYU^pJGUa%mZ@>$G#)5Z}cDgl~(MdQy(LpJzwmdhw#w67d#^e1%D$uLu zzAKGNi*bc5FExI|+fjWKiBA|s^%Jz}D*dHq(5+gm99WeK*H7i~%fAwIe~s1>>7klO zsZaA4JK_F45V^2w?PG)aaO&kgGjWo#*LjDX@ZKI~5YPy}5lCK7SuSr7bWEwVq{3)( zKpe)^huJm=G#T4%=<{cC3$Pw1%aUqxXf>9E(O(%zu8Yu56xqxux{DKc-y@Uy13{?k z&ZKBN?RkRSqZ0doR_M^E*p<_!`DP2B=l5|;`uGX;%SjwFZATH3b&HLq-GrlGFh=g~ z(Chn^;&xNp;Yl$zu+>^E29bR}JA})X@rA>oN~`hJZ30wJV5Rj# z0je!~7)kS<_q>%c2?I3l^A3mH%Y7@OkSXW+IbN%NpBIv!C{WLeR`XEFD+86+4y`a4 z;*HQ<2-=J<0|jLRNC(u5b|y>oDQfdu$Cl1aNDSCQbyjptz~|EXnzG@VY)$E=?qHU1 zcqHp%V|%5>Lhs;nc(yGY>+S6j`48n;`r`;2gZ!7lpYaDOxZbRBFv`55w}7p#w~YW{ z$lct7Ig0u{>(5V~NV+idOWO(p3vzqa(+xcjVW!W7qenYQp5`Wu>Q;o8vAo|n-9}{- z>b^gWLKf?Kd=L7tKTkmd4H;EfAM=Mtm{oVwlS+q(u?w;m?!l}y4s^cD$5(8BAR;=v zr9Z*Z8rlylbi3jjtjw`+oB;2B88=}k{YA{2zKJt$5&yBNjymbhs0H0JXefLMUJHe4 z7k`a=#$0jI_LU(oXGn_=nsp~wt8jNNfIqlP=;8KBzwYv99+avRBN}8A2Dh-FE3*Z| zTsGm~JD9JDMzN#xgLSRu04u$2x%g4`?^&ITZ>mU ze*sd3?b-C2_579x>-ehE0-(g?CRN!%=Zr6(v4It=UY~Q~(d&}Fo*rHW#vLlC@@CiS zQ`*^DH`v%P6&Ts3KofrAVh}WhB~00E%7(;)Lu z0N%{hw}$-e83`Eu?9rwCJQ0L~WK`ru1>3p_COsO=r=2x!Dfd0ZXZ=E^7zuevdz{iGJ>h9i92x_@UIDa-pymK z!3Woo0)7n7m0M+gHuNyYa)Rqr9bTX>QUY3TD!S#iIV5Qkm;t~Epk=jGJd4I*+cAgU znIKIj&6Imxl&4JrW<}^3hTq#z zR{TNR+sb0`v2BH<=FrHv((SWxwdTWG7BhiYl@D@x-9m|laf0-plj^^@dMvPMFs=A300608NH#xr)>wiZ#dDzLm-GGKfoT%pP66!H9 z&3j1>Tp+GJ?4Ds`B$)}gpq?0{rp;V!I!lhk3?*W>MI}ooc0Ql^2K@YoPdXbZ)s)HrSOW>RBtrh99bUG5}?nY>iojr zlW1806@@ofk&c#UuR$LazmPw+UzuJa=QXMpY0sPvI`QsdbVor$fc0D~g#@}pQ5(E$ zCLn)12~YkHjW)1*8CLuMZr?y*BYQUi*X=L5jn;3p_CwcH=C%w68^_aqbJu&QoO;q1 z3pV3P_yENX?2vj`TPABcS=-i_{+2b#msqzEWPDUoiMg`i#CnJCT zz4Q9z*5C`<^Geh9DuhnKjhhS$)eTG~9hvA++5t66pZp%Bb!Dw`Tv4O++I+qq&9^D{ zRNac9DCbystF?qJx%Fz+PwQdzagWb%!N@LcIJT(q%-f0Tq#=ayhCEKK$g^AA5e+e) z>Q!l{#zq9%k#zTAqeGGF^~5;`qT2bLYT>`3pAQpBKE$IosGG%%w*X+nDAwm_`v}zJ z8>5{k*va;M$BdoAzxw7j12ir{dZ>M-eyaXGXw+3!UOr4U zLjMEZhF(QaIg9r0`xzYO%}Ki7yBsO_PAYJXIk;=tVD7n5Rq8QN1*_?XMZuPZPgOZN zW8JMBq`C>!t?q<+P{a1ZEuorA;-(2+;fW9YKJAWHb9d%Gd-kUQxGI7 z0PUvOhZ;-EI_9qo1dX{}8Hsx7H(R-4?3D4zo)bBgM^r~4@-t+bX(vB4j3hWHd^!i= zb_^YJBUWWy;!$VO7g}>d+tA7be&5R;i57GYp*MD@v6rms?SI6NMUj6J15xfrR{5xN zfR>d4rDdh~jraqsy};DcUcUlDz&XdA!j^k;;~{?l4HX@?E3#YjK%4=WvNtv;B`!Sn z?a^@p9-+^*-3M#PkhVQ2Ytg<$e8T(Q?Q4d*x+e9pDeF&(h#7TC1Isdcg^96J>UDd$ zWa^pRwuO_lJVyLDrxvG0fBr29rUZm|M=XseJPnKv(XT;1fR`*e zkO*Sl{Mr+#aWMNW49P@2Z;s0Lx0G5mli4ZXnxkkkM7KBePF zfKaq5@iPhn5Y=;(l{o(b*u8okTx|j}jsoD40}?Kl5tbn;DUSOL&AGjW67D__pL=nW z;4~FrYO#K13hMu7SIZz^A#$&sg0LD{758r%fBGp+m=A66@m|lvsjI5zE5BjL)b=uBP%4U zS>eY8XK#~tu=P?F;WWqNV|p@A(A{hIWL>~4g;$iP%8v_Y&|oA;ql@%smesTA)w8bm z!Q8?Ww4eMF)es0mkqAiOK`EoE!_}BD%P$=UHyucV_9p@Z%ysVO1?3O*1=~;K#RM*w zSYtnQG3Z&*ltRKi;HI2*!8c$qDg(YFnfUhwErIneyGnuZvWF|LDoD35TN06`JJp>5 z%eDmH^U=+!~wVaGhJS}D^tbWL6aAQPaRAa$2b0FGRoSsJAE{MpG zm!#BqQ!}H3(@oiab|m%X&p6hjFp>{WGM@D}I6KBw?;t3DSOw+fqaGgMim5?0xaQRl zDvvL~=(62a)@ZK8&Bt?$UpDqs!7LLg+IV=gb%|C_6Htgf79NPsy#T6!zjM*(dh_OC z>Q(Yijp*qQWj!yz)YQla)TO(74{r?cVF-bDbOM*ez||%ym$e7O3juKz(>^A1!A>W( z*=Cm{49Bwkb(xR&*y4Pe_g_Fawzg;3Sth+87TYwaA?2m7vgNa zJSDbJYxRNN{oWV!vq9w>ZSOCL()?$jOXFb*r%v#_JiTCw1$K8IduvPA0T7#&ChuYS z5C2QEFFvwl-*4d`cWu|Fn@+VV9y>{Vu^xp&^MZPrcYS=@50x%Hl=)OW?`a{HJMYH; z|G@T?C=s+}axK8-CR0=8TlDsdo-FZO^l98j%{JN5!0iPk zTS}sp#a%#S+>GV{L$JLZvU;lyfoPJ(EH50@YXK!O?|;c6O9a6p6#24Gtr3L$C|bRW zPaP|qHf6dx{>thd5pSdFDiiE7(|qU|lhbppU~cMA<(_&bFUUHYoiDgR>#ILN5JlDd#nZLIV0+)X&9*Rbs0%X zNa>0O^G6JzP>s~KF4qFniD3aG((r`{MC2DR z@$9VWROT1te5G(N7HF9_-SB1LarXB&V#^T;>y;Iit|nSMOD=-ybtEotMa8*@%NgKy zmgZx@6uob&W{UFmUCB1;`T|5>W%jn&`B-q4IDFEUWSR2GcN6|D{C@RE`9#rZHc+u( zO-=V(mA?RUYtcK`vLFVmkT&Hfp3$u@f=2v}51)?YQvH|hIw~A-0$?2~SKdPv%S~Pf z*rnp`gFc`(#sVqWW7kx?^H%3?Z0klMT!|hI)pj>h&Y!0V9wF)4Q5^SyI5_z zoMZY9R8vn`1Y#^mPTuEFJnrj~meJ)npQ746!hfk-t@0^EB7MXX) zCWlPshuX@AWDc?br)tR7lj4$jkN9^h)k~7=t#8{@KJAy<)jWD(u`s1o^esxwh@a+% z1}TYF<|!QwGNxAB5E^f`jmuvJWHNovdT1;^`(HI<9rC*p8gPTuo=T@pS~ioLkM17z zR+L`KFmm-Eiv zFW|5mb*Tag4-G1cLl{pps_=fl(5BDf!2bCkGhvih$v+-n0F;L^(u)4aNQ-V07-{Vo zR-oU96<&+z9ZQLXl(X0J8E~5jZ>C{O)u{+v=In6I7*6VvBJ?;gNIYkdSW(__4By-g z5F!Pg?U6*03H;Z4RKs zjpz*=afS+HCK0gAG?W{P7FqCoF)>o^X&LC~lxb_5c`t(?C>Q_nrlFE(3twGU7P_^= zyjJMO`c^cIEiRQ~tTu`l?zGsF>Y2?kr@QJ6HjW#1e|koF+egU>B3+YM)pJULJ2ryE_=sBD!pW!>^`Mct86 zI@3^hO;gx0WE1$NtGdHRBhnG)IaC;}RcIrl^v*+UYsRMk6%%h{Wcd>J)&>(J2?!ai z%^9=(NHnTGV_8Yh;1*PN1|5WWYX^gccaAnCuZo0{B>=Lzh zXD1eF2$Rwe?`j^3_#Bf^9KfRVz@4slNBMX5?u|!o zek#AGL+bK%+7e;h@x$0yIU+ir+FW%+)$ zx|HMKRe@QbgiAvoDWgYE@Qp;$ASGt^X9QW`Chy)7zcO1fX*?0BWqZGEQb)=E{k*iu z^zmI&*h!3^MO{y9FfZm!Z4q8te*I;r60Y=wTPJur^DuCaqtEh+iiC|Oh@Hox8=kxv zE|oE%yMHG{dZ21jBk@_%SJRm-VMaS05MJjKPWZI;BMqn1{kEC8HVuC>*#)VOq_)=` z5`SiUSg<7!5))aCz4PUa>*3V3d)kLLM5-vL8;QSA_r6#ss20l4^od|Hyf;N<%B`(& zp(>;4N*eoxqnZo5`*vRIlJj{=_&I*tyY6}go~elG94e9rtuo&=o>`})T_sL$m3fvX37J8TH@6ZBdSxcnR zQ-D_g!taa5$N^@?p{2!#Q9L^H;dk2E>%K-|PeA!cq01kj?0YOk#O`S=>D3^7=!Yzq zB1eMqfZuHn!4o^mPMu(jc^f zc*fE-!ual2J@Fyy@9PgkJ?k3oC@C*%N*zy5KC06)H4SAllCPk%c1{S@Xv(`M9o(|C zb;!FRLUT`_+|Cb=0-usUD1)#-dY4VMCvli&MvT#l(ADSwYZZ2C-(JmluXifewrb|Z z9r*~_%tE&`rBGS!{IM)p5TG(i-wqnM9fW52i`{G=tRE&_JFp67R2zFk!a~uz2<7Ko zc@}ia0&+I!Mp(zTkQ+wk*vnojM!Q4yPM!%B7sfqLe#eYu`3k}6?{n8$LowaF2ej2D zrm6z+>|FQ>p8v292sF9#g_sKO0}{dSJMMA6+Xc~UtTH9Uhw+{jaH=<2FryC;#gq2h8lJNoSpg0@N)!8b2WiZz(h}0&@QT|1qOx$V`{ucP;A0x=3bp?&x)lcBt~lfbT|L0t99fOXD+N8 zU>!i3%$Xxm?P&JyTc3rp@~#q?D+_}NOmT3VkzCpXsu5p>*Wf46j-DXs0uSw>CAc!m zlJ0r*Fp$cMs>YTy0n2C!kO;Xr30W2ulYKa2uZ&BwHQ{>qAZgMokFKuQ#k|El_p$d? zB$+zvdZB;F!$%cuUyg6>3ZPt%O*dkY4xz*G0Yn2j{r*KVrWO|DpiAZ8GaRle*{S8Q z*S%SFZ!{z?TjrRAKlAO%BI3Pp&4=$|=|UHyC-p;vq<5amQZ_c&a%gKH2~~eqLl-OT z%w)S%Btwpmxz%PrOO&>B6ZY|^h{Z$L1fmE+E?cTm+h#w!=-=6ia-iZhQ}Ra9%2AK; z`-Qnf+fc0BGH!+U|Epwvr16kSKhs#1Y(@tYVIi#L=a3KW&Zkh4A-B(>rENJZa8T40 zkQO3R(Qz`5Q8NsdkfQGtmSCsl@ssHyKL3hL3>&F#Jyqx7=DH!%Um#^?XUG z)Vj4LpZ%4l$4Kg$By3f@eKbw?g?l37a}%;u*aqSGW;DK$aneCFOg@0WVZ1|qPvNnt zi;LBV@IhzAfdb93qOv8Hn4oM;=}KC9;>*JE{g=~X23%sQ^a8Io*R2Tmv>aqN9n_}w zxApidHt-nkmo4Uy68jAB7(UoPAdIX}*!=D;`~8WbqG|@xNQs}dEOisujP3~24r@44 zxmCpAL)x9`(g+d^S=`?^db#aC=ygp&@59#Hkw#` z1(o*ILoSpOZ!kp%M_)eFU42VvS0>>J%UZD(>!Y28JPHzG*aiNl0pf|{E!KNM?tv1nb-uBdleRm z>`KrGfeb4+`Ieziz?L}{Gi48K%IgK7K*$Zq6*@u2oC44eFo#tiB!;{V zxZR`lk+iLRFtSMgn?kWk4dbY=?s%T3l=oJ6>1dN{XVKY}|%f%u+vtr$|3J-X? z@>7l?+sa3&GJTTXDR)*5#k5p88`#RZxgMFxy%chybA$!Am_#Z2&A^iiytgg2u&XG# zwlMh`_>9Zdw5q0}rGn;c4EawRhz{Lcm@a3F`~vIN>t^cT40Z~y@%7bdiF1fkPo%jf zd9CCzYG5(Clxhs?&ONX!oBD_?GS4h1qidp|I5{x77x^|klU_psDR6R^b=Qp2x;Hu) zbI@jugzqte7>`&zADTusl*wbVx7~iEnb4zoT{W`AR!7OO@tQ;Hz|>3pobHtrUI)X# z>X~K!-d4|#lt20n8F@BNxs=s`-!*X6gqAFgwNz}dvol4{_T8A0O*0VM88DOTSEZf2e{A#H&gL-U&HaOMF2Waz$$hy; zN%gY6R9a40m#3OyLHEi1CVOYCsny?S!ZGT8oxP|xWMPYyZs|j>C#k7d{VzQuOB0!S zI;vU$DNi=_3=0}%qC7S1tWGb$#*2ES9|vw1|?f$)TD zG=~CeXb0ME7A(2>D@uh3USZi$rF0_N+-g|igB67jY)QHh^#$sT5uRd=^2dx0n3&Fh zsZa&p1Y_hFkS^X@@%({PFajpy)QyFUWOY)6v@JC*!>a4|-=`xOg=IT(I{NewZi9LQ zJ7okdE>|amx$^XgxycwyP+t&VVZB6ibk6}DCV&po^wRDsM>s+TE0s6Z%&-0HPbr?% zFIz%m(s8Kvd*qkT}Aio=J++gj4fQmQGrf>`HY0^b$9 zxVYInxhPH6%QNXhsk?@a&5&6K26YrkQ8!<06qN$LTat4`21usy<~_>Rogn#mTi0(Q zTbZ3tp6PS%7M)-6UE~-FdrQR?*7h)Iiuum*Qx;VsbT;ptiFO z*##rM99rHdNC_SGoV1W#?Vge_iT+94^*6krL@tUV`kQeXHv1Ff(E6UF4-O(8010t3 zk%l=A_+ICkdKPTCGrw@dh4iG<;8yBYyZ3gU}XhTI5Y^Z@$7PoTMw zG^sDRozC$)x6UsB?&!4W#zZ|~f+1490_2hL&tL|`uR>V?au|^CO1{E0gAMwDTrNlx zY=5)?XO}=Q?Oi251Y+xBF-y^XMoZ@;P4f`D^R$K^Y z;`xf=u#@aQs~ZfsRAOw}7b~&4aP|U5M1DTg6D2AnMvTgXPBlcl%{8w(xSPLsaf>v5 zf1gFCj_GvP^K#oTz{gFcczf!HmQMxFKw!RW?j3=3W%a%|A32>WB&Xp68#e*EvBFw_Hpg9+#4nQy3KB9sI7G4J4Rb$D&s`c^-V&c4M5muP{-{n=dssQ%4J+Ic$;U}T(IORol=?TP1h>OR zzJSq^hK^cg(XGsB``lGegMf;+4VG0Zi$Qhl;euA!q1Y5xx@SrQ#l{;r*01N(05o1qO%4N7L78!PxKudqe*h-6ORl53)T^f$hV95nRiED;*xo%Dje5 z@Sv-XJlr6_GW`H5w5B+X%P{WS7WxDFrJ33ljQ1*-E-GrIq;x?7D$Q&`J>(o%ZB-}| ztlZ-plnBBaFV0)Z0NUQ7^Nj*iAfvT|i z3{aU>I0(yVdE21Xi|YauBJKKg2n1|+rsZF@nTym*R*O7q6iWjJoJ*s?(VLG|u@_WZW6CU@_71=w7**o8EkLAeljU)KRk=BrQV^T`nq<|FfsPo%~-WTiVCW@uDkJnOgL%dBO!Ini0Q2B!j*m6Kf!PinZV zWQ#Kknd`AuX78dfH24M?iqv?85f(k@PLsM~j-Wl*SlP+6-?diGB~w!U-YYl^Aa`Ff zL1$&F6_v#_$dU|olCQDyULU_ht2#^z*7Io-{tR$ zbzmyx_y8G>v}IY#ATqnt{9edWf(w(~&Sp?J(iOqHvglnT$}_$ZqLI2Pve@k`HgJ2z zz7lsEg=hNm-X{xIo@2x#=vFlI;edYPH$GR15!!cw-pq$r1T3JjJISCqb$Y`*Yh6lh zC#ANVHq#YKIYQqWSBoG9yncKyBlAn~6cobiP1DaX0HZE96w>gw*9?&?|G&fl&95Jg!9SpWtG79a)xfZKJTR>sH9 z8UPd&7y)De0FVG|7&rh1r0%}NFbMZ&bC4$aL)(Ki{T~@PkmdlvFu=1L_~is?T<{zS ze(fUQ?{!l_`Y!Ro0{3};o#hl%)S;ZL9PF%Iyr3pKCyyXImmr4#l!H@{lUES=4*SS_3#*?i1g*f?0(*#KcN9~U!=CsrO%b1NG= zClSi8ue&Irc9tTPdORxZDlSr1ws!JQ-K?~ps%l$2ePSVCNhu}@74{MIaddIC@-Tz? zI664F3;Kvq-h&H*^c|ax5_&J<@kE4DA2eIa+06>d&C1Qn&H}p6i<1(>aI>@))RdO} zg8*KMQ2sI1+uNJfn~T-i&4!IbKtODECXt0KY(#{s1cZDcOi%{Mn30gW^*jWnRll&Ik))qYGJS+n2yqqlD z{8pAMX6C$RAjQtk$;)eLDZpv<7mk9HyN8*Rh1DGnh|FpSg7EQM3UG0A3$SpSahbDl zbFy2q2=McBv2dAja9VM4Seuz!oBgG)=4JPqU94;B%8F1b+c|mq{NZZbIa+CXnB94fgO8h&o1KG`hns^Nq(Jn07+otj zcd))j%h?q*(A zmXv>(7Pe+iHdf#`1^dcxF}wfJbXM%_)&iF1)+}ZMe3qc2xw*lnH?wA8w>IOk=C(BB zw6Ns*OW)nu+QZw-%}T-s>_?ynz+QBJyMfZ*dzaxaId5C5JJ*3eU}5KC;Sl)C2i$*r zzy{jSb~hA%SB35WUd#Kue+=8d#KC*P9r^dIMHKqq^j{DB*8~6cz<)jPUl07(1ONZ? zz`qtJR!-nd#~WOF+-|_uD@aK_R@YRMRZx}zS7rbJo9|%Z=nl^g0FF)`ZklqEP<;bK zDAFzf2jBn@a1BLlX5sE4p{}lcwHF;c+6$Osxx@O;GXEnN!xCJCfD1q1vQ>b^{Fr>G?ap`EUB*j<&g{!F3-4mfpxoE z9YSsXL7V@Bwyge6Oz#YMFytc7O$_Aq_YKj)2*{ zK5*9tpbVJ)VE&);i94zeJ z2Tbtb2LTxY0UjO!6$uFu866cJ9Ss!?4FeM!f`N&JiG~KjhhX90;^E<;KOi8)$0fwZ z#lyV=fq?^c;1N&|5KwS2&@gcSU#Ht101Fw036=&91`B}2f`P+=x$Ofh0|UUq!Q2g` zzY;tG93m1d@?9=5$p80D00tHg0Uq&o5kQ9nH6d^iuqR&@|E2qX?)>~={{IA4!4onB zePK?4jUuxP4tp?h5Vw;i8xkN=8FM6~adzMHejgANKEzE|!e@3)Djd z`y!ugU;guU;yT&cOxqJ(@#9er!&(_rbV$>k63pP3a0hD)HcACS|49>Mc(QpRuKX_J zcY+y;)2+;PJYV(yF52Q(*3p6xwHB_I7U6l94VO;3+{rVgNJ+-OsHC|TFU=I!xg7Xg z@$N{R_K^3);`G9tApFIM!h32wa7 zRnOmUz6U^JIavyEV`CCHM<>tRA-gWgMTgfco@s9#S#O=aS+1_VlXCsGoh*@h>?Av2 zEd~=gqY`=ZNUrdOu|MbZ`Vb<*RQ0h}5@eW@wlUN;j^|WXrAJ;O(Mo{9t3i1bQ zVTk;I#livHP;9&(E6Q`bofj{86a2XoXeyt5W27@*&ha6LS^qI!aE;0a>12?0>b z5ZOmrUOrZQa;6!ehKME;KJi$g@!JRc%FF4Pqq<$ls0~-TOcJDsDb{qroDa5oPB~)N z)X7GSI=La|7i}_^TyqkaK!!{#3&m!6nq!8)pwkSsx~XS zaOdDlWwQfqVIA#MmD?hZu+0|}t8+19bHA!fGtOibL<^1=ec}|UeIdt3U&hM{BTH#> zC{nlO#(o*3j7*6-cv+-{E3}UeH%T#zAvZ=@s*nVXTe(+zNrH0>#1{9)zC?4zVaoEo zG8wR^QRMNzh&;BWP9A|(2#hu3AXH55yKLS8dmRGVLl$>7iP)%xv2Z0tl^2jObVLEO zRKM2Rw*eA<`>CMvwEz+6s09=k$$&2qyo5O>x|FBJi3zqd(Zw3I39jFdn1+JFSV z=CQco$=Od(25Iy;ntL8u$rn!B4DHL&&qOA&8BqySxE)^0a7-WZ~LWQ5+pM6{$=uJ<8!xrb|6-4wIWS zes)PvdWZBUxo`z%DF?n1+^xq)+O2sgmiVA0?(T*GTbPi*e`)o>T_?G2gpYjI&*a4A z(ZdM7(~n}uj}KG_eD6l_p9I_dvpLXD_@(p`n%m&0E~)zbgNnN>1ek9G(bF%MwyVyv z4r@P8m+acB&_LGnPIMW4!Tugr3?bfk3a?z{n zY)i&nWlEB+jRf0TFdgJ~xqlL_4GtrwgWgNrg|Xs!wB*t07^%BE6F@3l%!zAaFe6M5 zCA+)$VRfv29&OUM2EX*fUz*^#iofFE*xr)Mi?`>v0YO6Cvk2@z01`X*)WW4N{Wpmw z+a@bs&G|Z}Q98MQs9{R#kfU2-k9YA(ju$fxb5*26!CXi@yN{T%CFfZ!o6<&K6-B1% zKc0O6MAc9`FO;&ogDz{ZSTpu;z!X%0fuBHiGw8ra!evz`YeGSu$BYNLeWx_%0^6YdtZi==iB>VMX-GNH?1*CY_Il$y5WD~-}? z#(&gBU4*QZv;4+0M9RxmeKYX7IMED+OZn?L(GaGruDWr&%`Z3_-*R1824rJdh2prP zWM>_2$)Hr=L$$cDd^8HfBa$R<Z<~@Jw zRc`(DK87-7ZL#Tx6+4z_T2iVcglEK|fOJDjzsS z>@G(;Y+y7(q&J~{QLGGC-cPT;L9CzeQBLk(-e*xEAp}U`Cu#9ri zVvEMNxI&b7XS3W}SZ?f+)VB1LCnhbv?ZQL%G@2^O%F!i3eETt3+Qnkwk7=&LEbO(0 z?;@G4r<9u6uQ*{gUix_Zy?nm?s_Ps>k)g9id+X_>92H?xDYb01a?jMrY+BU2lZ;1H z@fRub6e^pr;oLa5j{7iV`MRvZKloIe$uc6;zi;x!Vru4UsBAI^;##Uh2M69* z3aO=p;^masP1QX(5WaM7XO-<_JGcFT9!i__<7lgEMs`PwRy=4zthv13b!Dp1kmVLQ z6zQxTi$PM(;zZI&cKe<-(YV0nFf-n}Ff89>t-(qm~i^oLnP;@@`@W5rGa?nabu- z)Leu>hwJAn!w~44MJOsBT)BUu{=7p5jqH2LIjfbhI%}f|4Lh9f#?1Ex&<>kNHFMNo zw>rF~6(zNy*RH-#`0eUDf?Mpx-h8s2zWiw>(>ZW*5G^t#X!#*)j;1RIl-!Yu+p}iD_FDyx$;YahaKr!@w2%n06M2A?QGn^{y~3+zfu|ve&tAycBjmc z-cxeuXBL_AS1+sg>r1VAy-anf7Pv~UUQP(slE$UEeBmV#v%sL0>!UMosN_svIaH(S z_Zn3!tr*hQIbRcYGfts*9SDTP4`#ja*OM9kNPSwd^}U=GPjsnOGF8hcd%u}EoGdXK zqLsoxZ4jN?@mlo5ht@|mQ(#5qhqOY9QSCY;E(>u-v(iVRcMB1&jQq!=1NtK;MEAeH z7F=-#U8lP5WQozA#=e1SeI1tA2r;JCsGPMdqd}u^gBZ2QF*aVcY6y>zplxzKw9Apj zF<|;mg-cnuki_1g#->u7MpVR;8B)fDz2elWx)VioP$hN5*0^=Z{ZdPlpovy;n0>`V zq$I-9yoeQHB!)DnjQS{!tJJe&#p&hTkxy?7SLKAKg4?503h`kIDI7;;MG0+Za?w8B zVB2U*w+bsY)?wtW*Q`|d{2jM|Q$bEyLT!;o|7*fyUD`Dk$1mpGZVc8kngiOF@rsjf zMk(38c+5J>RdH_N8mGDMX@-RAmJhN}qoxR&E43Z6{Xws&DxnlL8U}J2I@3k?&(REN zzF!<7{q=C0@_mepa$(%2i#4LT=1>PNbC~Q7wI=zVw$cOt{XxwNI*r(tt(u~xr>O-+ z1S=IwmmKslR`8=^=GLAr7nGt&sg(w^bgCcIw0ET>NqC@b_#Wi6-eMTLf(gC$$`v~Y zDty*v4%=B3FVNo-&!QSQx`Az!N6nDJX{~(4TF8KPRjBDlLVmDZEW)-v$4%MI_yLW~ zl{~tKI7Z2wf`0>9!rl?<5pRvT!)J%^p5>&Wepp1wK^eZr?ObWqDB?Qr8bm%KQA4BW zoamOuaS}+6$gn7=ClBJSsH!jvxYCtH(+JU;oL=zl@A)I}^0=$|6}0j${+3qoZc zyVJ1^gfYH3g3hv9-4AS7!mG0D@&;~@80Mso)`~Qu2`6Bwk6wcJ0WoYMg^fsPLgPW- z0;)`0BW*h+4FwZY#}uL7z`NzlTqW3{#PVt77R{nZ7lJhFW+xxMpMU>a(Vy6eM;r!s zCBG-9x}UrvRQJI6#@lJk_ORa@$-L;?r(LzM#{9&bdt6iW;N+~j(Q=SXj&h%YT3X2y zY_Lw2glAuz`{YeT#Obvt#QkWqNC!97D7V|`JlCiFMplxMx1}WOuQ803#_eU5v$#rA ztV|ecUOF92==gRZCgrEY#RMnvAkdEnT-?;(J6o%)>vdv;bRFcdk%<-Z|I=29w{=8u) zmS7yJw__Pz6{E-Y@mIAs*BS17$(L5l`M8sK!~dcs8uZcoknfDDh_lh*{;(bhf{;d?L|oPli>wB|&!!~?g07~O;N_c2b( zUUGzkyv-}VI;0LiH%dtj@ij1aBcd7Jl=@FM3S*;iBslBpd^R<3J*BX*+v%1!wM{cq zuY5Oz`%FJdUNQBhaKy(EjWYtAXfG|!+F?2!h1AexOK!^=f)=4q50~22S!bJc6?sX9 z7I2(?)XT`>8Ov6wy(6ocFIgd~WSbs(c9r`14aT*@{3&=F(|m4^B)&tlkvmeBMp|j^ zt4MgM;mtA?eW1(T*HG5GN)VyCoMln(VlhIaHK!5dGt4PzHzpiyke*e0`tcfl-rl`! zcaiy6Gq`eC{h4Pyci)R7>~!PwocEWn#U6-+d-HEeKFJoqQ*^UD(5}SYzXed-UU(O@ z$2P>fW_fCiHvA+yML?%8VT(%ae&@M4)k-B5{8sU8=5>A@ne8nQexp5a=wA18Mr41( zUMJxCH8`K7zyc?Sa0p=h?XL+b7`J0rhlN1JO|dBwIqv6=U~os?+#74OI?G>^Dl)RidhhEEdG!zN>Qm-Po`@tirvw=> zdeN4amf2O59Q1$b*&8MBv_|V_LK0Z@cK?XO>*D*t!TTBM^e?gi&?IIo&>~nc3<*XI ze;aidJjB9=hd?QCIK(B?DcLzqHOz1|16}W}gT1rv7VyDF;+{i#_B>P`wnQQ3pzjNT zyS}(|fP{Mpf?~QB#h_E>k|D_%QOU-`Sszye#P)~1j@mencfGUv-p)>tZg|EcnJ_F( zAgNE&c5Kg$s_y4%3|d8GubWMNL5xoQVe%v$Zwddxy-`py0ax~er0vRz$){nD1G4EU zBCcLyp^?`c8gj-u?x+tkPrrCF^B!S+@39EA-U!0PBRBV{UUrjPKt`Z?O~2(~V}%>6 zJMBrm$f(Y<>{*P2ipT6l><49wtfXx>Te7sM=o6eD4)>P11#lW3&j@%=5~F%+_#_UPv-5~3BBXC)J*6geX9 zR`WJXW2#s0?{O4-A>GM)_)%1TFI99X* zB_bCcz!v!*B8{{MZGsetsc;M3xJ(T0bDP^ z!XhHVqr)P@Bi(f;FtiL{!DB-yI3yroPtq{Mk<@g>rQ#AdcMD1?Xm~e)piZsj9$eUX ze1gZ#BPH$P5tux={%0M9CVr@$&463)8HEfKIt zEfKG>yT=*1lbh3CeXNr#FH+X`p9d@sTB2?bpT zO-C)#De-*ua?%IX*(dZHs>upikKiqtXC;zDbqVN=3R*O$?Tby6)eyrs94gqV)KQ9W zC_9eSbV!-cR7p-XKAyt2&Nw_%3C;H$tIw^!#(%Y0!alzNZsq$=~hMqPG(wODp2i67UXxe$dBg$yrMtksEODt^I9 z;J87qE`m~4!I~sRwKX=4zT0-3Sn6YVC-RCo8DXwKZtHx)K$;qT6n8?)==)5l&zIDO zg>JtB2BK~?w3^PhOc{A?WwRtzPal-@u&oT*sWCk%rMGXbjK2l;zqEM8S5=`Uz+tw^ zPiy(~mFZL`6}KN?4KAX{XUBC*F~3~ndHwC%MhOv&FS|UohK9TC<*uXfnX*~W*j(l< z@W3aqfpg;Xh=XY;J))o$HE)H2NXRQ`3TE_4nWOXI92I420zL1&?ZY z>@i*SpYXj8pQ)4@WKx7#=`*HRs;=f=7!%^*UEj51QW-6J=#0@C$YP8KZPR8lZ9o3f zbZjqpZc|$jw1utrc92YG*-JVF%Ed7;QM>VF5w+u5)kU*lm9i0LN9TBv0FyELfc10d z!iu&%aYFGEZr6F`WeRQQo@r8d1WiuzIzr85nkPD2ik&YBESh1lWUi&tir~94zlPSJ zqDj`F5-l-#N}!OM7BoJxNN1b~eafr;b{xsnddmv4(mBpiw^4jbl)ZErN3lSK30>1C zE>Zk@Hylhp|6(+L+zcH(`Y(EWez6Up?MEa-fkvAA+42llQe#cxxX4M>XZkPr zQ5P=J&5V3syS_u7XwC+`d!wJ7>naze5mlJDC!&){E>@~$H6a$y{`4sa=9c<%JQEZx_mwt<(fECU=!223L;b# zp-&CKPTbVAESDxeVd|LBj7^3g3f`;Vi-+x>U_S7uc&Gp4fT@Z!JZq~lsn?F8^k$;e zt7qVgfv_2qM0Lu`#3_c_qT}eM>b*L{8lACz_yxL9<*)j#m0XOz;<_`zOJfx!v6>B3 z*4l<#2~Wk1zlI@cYHlb;s~XyuVQ|e)3+V3>iCZV6d^CFC@jOl1P~)<1pKg^|yKrLp z*(J)0q8=p$#<5VMS`7yIom6?-N?sAzR=fzRV(ww37y)F|;z`uDf(Eu&Z7UeKFODH; zew&{qDdUm zN@X#N#{f1Q1$>PN9#!S3%&%1r-Q+xi84ssQ>KELn3u@w$Fq)~BKwppD;}{go8iHHE zxf#A#fpQHoWJ=xk2q()ymF-%j%Z!qV?s!l5qR<7hC<$R#lnxJj+gE-z<^L?>(~sbO zmd23~`oxKk)@h{fQM`=Jd@uNsD<_@znK!%`p~@{!meBL@s$XhHDxD4SZ&TD(KEI-A zkarNAJW(vrPU!8az%^Rxx4nvMm5{b=tNx(yHE^9AOKEH-R>XvaH9C34&Z(|CcgGl~ z1T&BcZsdh=vtP;MXnX0RS7L`Kj?JMI{4kA4orG1tCYE)wkhSWHeU$Qg_#KTjV}~?^ z3^j$c-2x&V8E_5?O%7|=B4kDVB$q0xGjp{3-|9yuwH*rrW+kk?!(X2v?ZONG?Do`Z z@kGKckE>yLMt}N?q8Y72l{@7diJ|)oSgmhMJ_D0o`l_r&%|eO7JujjZ7$3`vv@Vtp zqmIH}o%`b=cXkvFH2Y+{P<$iwc_6Czd@4NKkvW0Be$hYglbv))P+Q^Ro36zf?WoM0 zy_%iKX*&jC@tAIQ%lJ6|;&*nVa__}8`(pN4F%RCF1jt^?h&4PO^>-NdROeuaEZWDQ zN=_NjlG>gt!x!VxF9RRwr&Swqc=F^|y%Hw$LZV(L4dXBN>*UWsHyz~Vid}i1TEG-2$1k z0oTE4uxaS=i5?1YO9bVaJ**vYm`p_q>L0wHeiw3d@G{ahKL@COzs%D7jFz)CkiMr(dvvwWbc?F^1IH;-r}Og=})^ zE4*I%BjS9kGXgM7q$I$m_z3H)r5PE3eU; zIxlj`6VhvoeD{Wjr}Oe!5LWJjLLcD1o@nBbxk-NhNT#t957q9SPxlEvbrKIL5Gwj5 zgB7*6k*!rutwd}P%?Yhh7&?o$cw;(69hD0^FX^3XNr6nJ!BQiq#gQ~B!7NBhmS$vb zg6Y4(v)3q))$htjeppFv!-MwvG&l`~-bkj5fzDMhr0bNSBJct33eL`OJ09VQ3I$mY zdPJ1*j+l}OZWryu%yu2O4oeW%oZRe3>6PBGB%;)5R649$LDj>f zfGr%y&@flNyo<+oO9BYE1h|WOgE8;lZxO%%Sl|Rs17gPR`g_)P3>9BjcRBex;4MZ0 zPK$Y@g>QjtqMQ{H)vs8x?+>VQ4bu2LmGyl_b6wYcI^RnF>?&Hcf7U*5=3;s^z*tmO zaf4wipEQ;{H>1si_a@jTk)N&EymoKv=Z=Rbq>c1vg0256V)~14R4@{B>`i#lH8L0} zC#F5T7UdEIyz+|eF1Q8k)IHAml^}AwYJuHvIZ}w@V4qx_-k6-0^BN6N9ZKg{sSgB- zU_971rx}`*VI^q&XmgDw6_TK}s}5IO{ES3v@P?MEB&C#wfSE(fyZ>{@_w$pNvw@%V zf0zemrjdPx@c4}x=pQK+JX?P^9xBB&(57MT$en%mV&@j{kHdLvuST&Ws`8YQ)tvkB zp|YekmG3*diGG6W(6=9BgB;#mmZsK~O3udHq$i>sNO14)Eu7FJGs?&dE72m_+}r~0 z*T1gvq~6RwjMRs-GDl}4_ec43YK-$l2_;wuewO!FIHJxoc(2ZDpJ8bHP?rRLXpJJW zfYL(;XOXFdu*i;GKPfl`Q<{k=m67bT9a{J$;qm7IUF~)quaR=qUKTKopUP7~tV@w? zeqv?@#oNCUu=Yt-N%5GfR`;$>KEuQ5tCRMs zdFUXtUmQ3*JxkgQlZt_pDi+IJO2wTedxFdp-GoQLyJA@PT!^pz=FEwxez*GRtAk#6 zm-Z*NXs2nA=&QELpjE_gN9lQ_pQ6+Hp6_IC(785EH1#VX+RpDEP3%tNFe|<6U6Z6 z@$<1}ysz`+p3!qSrB&1#PjqU63+EXu4~)E zvl5Vse03VP&79KXOgrK>E9))a6QxS;dWT@RqdfU(WqV&yiy_mh!KjMEgFe@8bzADw zww=^$Q*Y<>1D@<--%E5y^r3OhEbR%___a}!a6)P|VQr@Guz)Dr z;Y#?!4zLLqPaQ36V9AT^vmFdCr{6w0{(04UI`y%7w?sX!Ww)Gj zYb0h`^Q*$tSAM;!;KefmBn*PZgSBfep5w^w3T{dEs(FYHu3sCeqRsxPpLg^B<*z zYbb7`UFgciRlNYtJM6paj`u-*$$;plcdr2nj zdns%9hU3g3VtQ@d8^)f+!=3n?*)-a$OU&SQ7Q~b9aFWJ~PhO*Q&U45W>h_M4Un@#Z zHx(Yd?eJKQ(}#&MvBIHR_72e~AQ^v(*e4!Z63JNF@_rlQI#2i1o0d5IMgNbUsdlf- zA#K0cNER2y>2F}F&Mtz3ZHyTTPkd$c5z7=SbWhG$NSI!qt=g}Zu*p8`r7dI_CtjRy zS1==E-rT0=Jj~qth74)Jh$a-Yi$Is>8uzsJcE2XD(&WXP)q2QK{YlG)SRmD-Rk$~Q zI1+NUyNfzf7{vTuBXzeEHvNI^4!qlj#$$_?DcGv#iXHZR{G&oZ z?TZUZ_hx`Br1U0}#dO?6IO|&$I_gAI5_@treW+%UHbI6-+6@+hAi6_BFRjD7>K8%CBq_)>gyBsfZ3C%f|G8e?T5NGKrHtC)}CU;kZZ#yS>u>KW) z4r%X~g+D7?RtfhGio;vGUB;c-9DL`WyiU5~^ZdG02Vk6_ryRk)zIK0n;G7u>v)&Tn z;h?MhDqbI&G3r*4pzSVASD5yC=xrY|P%uu8lL#Zf^Bz~HdHM6`?(UARs(KroPk_?) z!FRz=W#mi_Mn;Bj;3g_@WfWyHd-^#;mSKNhzokPYPwqPCpTr}Tg^JJVnC(>hZ+qW} zLf4($+Zlf_U%lU8!4RfUKzx-hlV&9Pl-7p+ap8}XOjsK1X0wpeENPeYv(!0KKeXA4iur8Cd?gMWOD;nB2IhMB zX#k3x#1{LR@JflP+pE)Gv}oxV*N~4vrq5x~%aDgQcU~CV7uDcB&vV9JodGt&^7Oin zsnn}k%f@L830TNaD3EnXexyzaB_*~Dyct`&cr*}_QWz4c+6uRlQTJm4Rb%_8ORiP( zlGB~FD;VJV93WaV?i`WyvLtu=6Bb=2S;aWAl9swtp2i7AFN~=DnIx^J>>&3`w0uo8 zV>-sbz0%mW)S~obU+-V0mD7*Q3-$E#0F9gLz6VPY6Q$Umj)t^FdsK)<>RL61TdNk7 z@%AWegd6owFY^NIyqG@99r;%ElU_aCoEuCyOW!wLXZ1C}SBS>3CHpcFjpx4`J0x!} z#s6*nGP`xE>l(w=CRMSrThQQ_M|NO01I;Mb29`>cOV2XaXzgxZ+u{k6Im&BaS{<9Q z>JDEcI0T%%AD$+^Sgh0nlCJ#3wUvlGJCMGrmVb5Foq}-+bvacjp@Mwj(*TUuM=}os z8~DWD4p?5OU!Aqsuzy|He$4OT_Qre|ZusmLplSQS7mR=%qG0zQY;HV%58KRm`qfRVv|%s(g{pCz`a<1h>?uWn?3fvizK;`0Y521pHSPhm2sm z2E!5_-cg0jv=KUzXN_HJELh1)?Ylp-KM*F-GodO9tpfx|f(urb!B!#q!_<2%*^G|$y0}MTCBjcd=br7Na zzJmBQmdp=1wia<#-*Cr#V_rvMR&!q9ZM+q$CXL+)_SaG?ZX`SSb=?%RnHPiS)717)`b3G(izYZc z4Xqq4L}wqC<|XXWau3;m_g|;T%1fzl0& zd@E}2(8K$8hBy&Nh7LLcw!nz*pEri@U%G}QD^UL*{)qoifKZ48{GYNUsDXc$D-J-! z@3Z8o6OjSze`Ey%)QP_@VW5c;|3H?fet``CTM|H~#zy&9R-&bF@NX4l0FZ$G1C6dU z5&FAaY=AoWpJ?>V!N|0Cw#mZ>%0usnzdi`(P>A&A-6ae>1R4HsezN?-TRnJXjeB z3P=EuJ4|TS`Nh~GFsVQd{r~|Y5047Mf^Jfv4o0D@edx?Ax&}y4Ltx+m3G~Kyo3Jn- z8W0E|9kqnmiUXh|HVl9*+SR;7os2>q4F19$^YDZV9#$L*(%8sw-)pamfI9;cC4gqU z1#SQur~n^`3tny5gfjJiV8d8dOdPYrrHQ5+uh zB`j!`;vz`u(3oZ6%=MszwAb@YT{YhX< z00QMur(hSCFx3dW-?6#dxrF>Wk^Z#SnpX`hI{k#S%jz!uBt|wno5i0lsu<027H=}h z=__pyl8w&&EN_I${`3>K6_tNslrm1fK`G-ty!HBkSG`*Cr zm(9B7=d}^e$xg5jmSJEu@S}NieD-pC*32VP={wmcA(2y`FJJMa8#Qb$@9?PS`1C51 zF1Hn+FN~i`u4%XX=XodD`TE+xLW!KEhFD-*#=Qs`YK`nMMuz5n(?QGC%x?O zeYUh+V4!rZ7A4#{A zTSat!?VbC+!97>^uuC5!-PiSqKaIODjY&KRp0sg{kW!AK*ZarZ7)^h_DT#;uXb zrDU?xLnAs48pSkN_}AjzA>vNmM=vg3=Flz8Qln_spp}e-a%XOaW4|BS84fRi-$-il z3Q_cQdS7<6?R)WVmEywy(+aNsPh{0;{)-D&Tcch)a=hT-QPp7Yg|A%ZsKeh6w_Pzl ze`(Qf)kp}9<@JoQk2Uc)mvfAhx@BM z&yCF|ir*^+BQCsUI?IfV6bLlW-ISxmaesOFPG}pCiZHpTiHgD6_nD9!-G)FWK55e7S zz~4vP{si01?m}%4_J()j6VUZzbr;iAIiHF%*b;WudC;Nfgr^XvlszBKS1kZ6g-VyDG;DfN5C zKa(d2d@f5TDEK^&E?|uyxC1y`Ik1X~hCL8OrFip(-JZGJhtQ}0dYGLx?5ivpj%j;S z-csH8`AuWU&G&@R)K!9d8cj*s;rSw!fiG!^RfJM?4Q_^4lOw+)VSkMkWEVWGn-Bju3INA!bZoy2OE^@S_@kzA%T)wC zx%^in6R-@gIzL&&`+lY;wu0-dMvGQPsOVOL#6X&B3Ui>^0)|bT*R%{U>A0?*c#E3u zNS5=o?c)y@fBAiR_BqTs=;#~U9?}|>198r$Kwsy+K`RaIlcy6E8VoOoVJ;{%&03kP zu?IFrT8NS<3WV+V1Nc@;7id!wX2rQSbjm-VyfT7+!w6OStRvhwtEv!G943I~!}4-w zzj$qs#ct$~1A;4vh>TrMC}5_!Zkja8Gb*=d$p4J#vDinPis1S1q%={qW(Glr#~OP- zQnBYT+9;@kOr42h5o*o3(D{fu`&g}A`UH_Eqh+FmHRdj|{%u z!V-+^XFP(ru72z!_>Nmv>sR{R=Y@>M=(_x0w}5&!k&Ct2vg}ec7uuIkPt-{(Lp7XE zEM8LZB9nz&3_{As(R6mOPb8rf5lVhl@M|@e*zYTc2m%d%21i*wD`;wmD^O#%W$(QO z7OlnAO)yV@#zdW+3XPspq+0T*7?Gt>~5;2x}vzlUiXN&|Ne#D?br3rhnO$M?xGDTpCcXs#yeK z$yfzk7|&?HSn&M%+}j%q19U&c_p6wNGjJpqLp#5od{HCAeT(9(sH!=)k~#ejA)gZu zyKgXuFbNG|=V7}v%-PMvm4=?@oPL-wmCf5y#;~em?=&0&c?wA-`d|U^`1JED+bx=T zQ$0pRO!Wi~VZ%mIotPa{r9Mt`_7Td9UkRM=X3Hw<~a6ya+HKWsUSicGDD$axBe-Zpm>&`Qs1w;+86u%QA2lF4S8q1lGF}! z4?G}Ut~%YUAj{!r4v&bA17B?s$GzwC>+&kR(e{(ue#%l-5JvTla6Jq%7M80zwoQJj z$=4DEW=byh(xZ!}sl$@ix1q0009Hetycfd3JV!gIfzXC1OPUQTha3~k74k1N1M?dQ zZV_F}{Te@<3@{Pw@CF##tXx95eiEDb3mUJD%8fTMI6ZD|+}5|!OZgcF^p(GBAJgzE z&L1DvLdy=Eb(r20!ATnWK7snYLi{knN3y-!*3W8Zn0}pC%%I*{j|=~h%bi7uZPGkV z`Czn0NjxylcFLzp_w8_CmBeU8ygOX75Q4HrL-=+JepfjU;jXop4kq@iP>H%jp7kqL zNko7}XPmVA`2ivkgtqG!27647p#!H;opH|w?Ivv!)pzERmDQI7UCIlOCCke=p1574 zWN8SU76hZ1$9k|Ke5$&P!sjt27jO+nK+jNQWTX{c_C9lal6dvtT45Zc>fHk~tug;b z7XJEEf_?8fL*B}kDpw9GyJ*IO_xg(tzM^p)s;2SgoI@H~=zaZCEd?_#z;XUYUxMs~ zAP{_0`E3w-j<}t~8<2%U)5O@!+kvPLgNmG>JI0#uXhUAzk^#r1j3py}6zw@pH)l?k zB!&>S=F?f-2$QaD^g#UDNa%Tq>Uz*=8fS{>N6A}Y+=ZwK8Op)b8|M4)N1vnJa}l}F z_2?N@o#nTsSb_<-BV!|ykQ=YfYA17dHs18!ii}_T3`v1&6p{G@dV=+{PP`sm8;^_` z;h9p>lIg83Dk*1KRtuDL58lt6QYZ;&?A24gq4Xkk`mypr#X=ozNoNmlIA(aMAGYgf z>TF0Jfb;GlUjgSUGZ(knM%L~g`s`9eu3o@08)f`@gwA{Sp+vT|fc$VucHPHInb=_r z#>KYkJRX)4$B;MQworYEAq|EToz?VauWEN0yl5yI8+NE=1#~HdNYpDGokkzn$Uh5^ zKR5C)hfkVJYGoxCu`XE_g5Bvm`q#a$LV^kAik=P+*Zz85Y{H$6?sjg zB7=m*T(zwzX?e&}t$J#Y*P}<8pl{OlKFUW~y_x2c_&qys*fHc;fdul?AZBvJt^i0H zp$bC4S9xR6sC{Yd@z=@6)dDmhBietJ#C?+W^zZpdBiu8@SD}*;mC>}G6C6J~(8;rj z%~CKT)rD~jr03My;@1_BZL?IbkzJVRoA#lb<1;=Tkwh9}+aVVsvl>Q!VogT5fdOqs z3OW~6JzXm``!u!s(%Na1yM={|1Vix6=g%;*2vxz1&oGnD>d6zzCRz$8bV@Zc@8x1)!HpKdx4*6XILb$+W8)9%{k?#~@eM71Fka8(bTpc*D}8kj9@ z9b)f^4&bsyXLNpjlHiOC4W-#&3{uqnnvkVoTj-yMm8J`E2O1usWn#+Y8>SkbA>{F> zS-?he>O=Y@{Qbr0I4mM0O)JYNdKJ8L7Q^c-Cgq9jzU)0#Ft2Je6|JT$nRS94^!{y$-( zGT4EVX%z+HBHxFceT{{iSw7f(KB0yLOO{2i!y`(JLa9g^tm_}!q8Y8lLy(ZGU1b|{ zkCVJiOZ$3#y9rb zARKmAfU%yQUlZTDatWyCWdVSbGXkXw2;t^uBuzWCMtsD{Xu+7WVrh#FZ6}PdJwb1C zOG8I}Tn_v~jmUOcq1c=(-z+0sfmz(BVhg+IhV_U~&l{JKbYwOUetI>Nq)i!=N~FCT zqvwk4va~?tExDwG_|dYA&O;AdxzL`B!f|&wL0bcVJo8D@mq1eYg(FJ{0sr{~@q?yJ zZc|dK`gtsfw7k?gsr>l3CF#6IAwva9-tu{x_5^bZ8l*PKF*2TN^sOc5Bx$wj{}q7- ze)(Ojj=HBsOkUkZ^mqfxF@^J$TdW^tXd=G^y^`{2MU4`s2}Ex}poVJ3#}`6uPIw_h zsM^0m${{ln;?$zGGPAoamfSX@;z1D92e?*Wm`qFCgdb@KuzLpxj>x-qQuJDTmER9A z(9Am0!ORrQWkTvJQ=lM_QjG>|tcs}T2kwkQxsaJdH!H5eA zUJ%@kon>BSrsfwj5T?3`K9%?T*iaQlSD}`p1d*kcw|FQ3&=h_9=Y8M_j;U}7@HO=? zC8(UBy0+61>XZy}!9bGiKM--t_bl8MtQe}HJL~$2!cI!}5MNvLgNoLQy-Entr_$+` zzVj3+p~@p>G@)YKsagALj3T2mJcal?LqP_n^06rHY8>v^bB6MVrQp7m>nZ)g74%#0 zIj$5*DY?40v5(8V-Xog^laux*6B7VQS3x_#r?G#Z#=iHq4yv~=Q=TQ%FpYVS-2fJU z1-}rSR)$wqweHLVFo;2EL~MK{ct?^KPGP%Tzf?z}wp~yeRX_-XaKS>CkU)9{wf8Ly zFC|-NRPR+y)L3|+M1j&GMRK-lACu@Duq#GVnecXk7RWahhT*-C!7kx!IC^6)2i4FB zMVnKwFQftn7!<*PG#dVWr1uV9$G8V@hL+*k0Q&&*_3Op2NG*H8+umX!(aR4RmlUYY zu!Lsg9WHzZ*VLz?B1$+Z15R9vba$V0cDUf6(lOu{z7B3)QHWPk?c>FCgo7W@Xn`&~ zzv|jQIJ+41gDYQVJUMW8YMu0CX%5911i9DJ^J)HiFHE2dPIO%#C8v>X#>5n3{{X_ zE=Dd_vAAG#&^H2|@vw$&{&x(IYhldf+VWjO@sf>kzR&p6-?8l>8gI*G+m4;=%; zzR!eK>ONgi=MEZsONpD7H$4S>hzeHR^?#^(0R$r!6&|2nLKqSxu5H2@M)N~vG;|+y z>(m#rkJJXMgAAe7kuz^5Xa4}4dqShxrIW3Z1u7fWjmz>~PH(51#3-Ap!xkpGCDg@= zuA#$WiQ=1{8}KOlx*yMQbQVQNs1Q-bMzXW`gpw%JcN{SV#(94wo{8cK4a>rzY{icY zp$w%^K@^QzAnH_Yd`zO|VCu81s_P^8l?0OI7Cz71P>s03Ess=t;XtzTH&ca)x->3Z zu;!=ZGN3dDs&enWO0_X45)c~L#CsPAIf8>odELY1KkzM+QWzhVI_UL84Pm$kM`%1( zth2T+d;LO8yBQ=w;FnPGFcq1#M@3Z%^YO768|e zyOknC3M-<2=HbIDL5{QwPntr?6-j%oj36<1sP=0woxs>V3EI42i_1z~DHt>=#R?I6 zW_GwDp88Ue?jlM9GJ_1E8wL!(WU^h_BgP-={{Vsv0u+v!e1udgwy42;j8nsv&tzX# z0d+$Hcy>$}ULu?@T7wM+tkK%L!9_C;<-~BKQ5HTgNv`}9e7z6x3lnc>tTmRj?Pott z3O5e75iw?}6gTqpdO1A{LU0|cJkNEt^Zx*gPHdz&f_0@bCUqR?S`Blq-ZOaaz#DqY zh-m->iz4oj!QG7D%2Vq3K>q-;ysz Date: Wed, 19 Mar 2025 13:58:46 -0400 Subject: [PATCH 43/99] tried to minimize the differences between my version and the existing version --- doc/src/Howto_moltemplate.rst | 16 ++--- tools/moltemplate/tutorial-files/formamide.lt | 16 ++--- tools/moltemplate/tutorial-files/solv_01.lt | 70 +++++++++---------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/doc/src/Howto_moltemplate.rst b/doc/src/Howto_moltemplate.rst index a1c3b06a1e..97294f629b 100644 --- a/doc/src/Howto_moltemplate.rst +++ b/doc/src/Howto_moltemplate.rst @@ -50,12 +50,12 @@ The resulting file (``formamide.lt``) follows: # atomID molID atomType charge coordX coordY coordZ write('Data Atoms') { - $atom:C00 $mol @atom:235 0.00 0.100 0.490 0.0 - $atom:O01 $mol @atom:236 0.00 1.091 -0.250 0.0 - $atom:N02 $mol @atom:237 0.00 -1.121 -0.181 0.0 - $atom:H03 $mol @atom:240 0.00 -2.013 0.272 0.0 - $atom:H04 $mol @atom:240 0.00 -1.056 -1.190 0.0 - $atom:H05 $mol @atom:279 0.00 0.144 1.570 0.0 + $atom:C00 $mol @atom:235 0.00 0.100 0.490 0.0 + $atom:O01 $mol @atom:236 0.00 1.091 -0.250 0.0 + $atom:N02 $mol @atom:237 0.00 -1.121 -0.181 0.0 + $atom:H03 $mol @atom:240 0.00 -2.013 0.272 0.0 + $atom:H04 $mol @atom:240 0.00 -1.056 -1.190 0.0 + $atom:H05 $mol @atom:279 0.00 0.144 1.570 0.0 } # A list of the bonds in the molecule: @@ -91,8 +91,8 @@ master file (``solv_01.lt``) follows: # Distribute the molecules on a 5x5x5 cubic grid with spacing 4.6 solv = new _FAM [5].move( 4.6, 0, 0) - [5].move( 0, 4.6, 0) - [5].move( 0, 0, 4.6) + [5].move( 0, 4.6, 0) + [5].move( 0, 0, 4.6) solv[*][*][*].move(-11.5, -11.5, -11.5) # Set the simulation box. diff --git a/tools/moltemplate/tutorial-files/formamide.lt b/tools/moltemplate/tutorial-files/formamide.lt index a78e0f0e89..60924b0593 100644 --- a/tools/moltemplate/tutorial-files/formamide.lt +++ b/tools/moltemplate/tutorial-files/formamide.lt @@ -15,21 +15,21 @@ import /usr/local/moltemplate/moltemplate/force_fields/oplsaa2024.lt _FAM inherits OPLSAA { - # atomID molID atomType charge coordX coordY coordZ + # atomID molID atomType charge coordX coordY coordZ write('Data Atoms') { - $atom:C00 $mol @atom:235 0.00 0.100 0.490 0.0 - $atom:O01 $mol @atom:236 0.00 1.091 -0.250 0.0 - $atom:N02 $mol @atom:237 0.00 -1.121 -0.181 0.0 - $atom:H03 $mol @atom:240 0.00 -2.013 0.272 0.0 - $atom:H04 $mol @atom:240 0.00 -1.056 -1.190 0.0 - $atom:H05 $mol @atom:279 0.00 0.144 1.570 0.0 + $atom:C00 $mol @atom:235 0.00 0.100014490 0.490422099 0.0 + $atom:O01 $mol @atom:236 0.00 1.091153187 -0.250749643 0.0 + $atom:N02 $mol @atom:237 0.00 -1.121616690 -0.181085754 0.0 + $atom:H03 $mol @atom:240 0.00 -2.013715893 0.272535813 0.0 + $atom:H04 $mol @atom:240 0.00 -1.056768463 -1.190185868 0.0 + $atom:H05 $mol @atom:279 0.00 0.144676387 1.570292021 0.0 } # Note: You don't have to specify the charge in this example because we are # using the OPLSAA force-field which assigns charge according to # atom-type. Just leave these numbers as 0.00 for now. # Note: LAMMPS expects an integer in the 2nd column (the Molecule-ID number). - # If we put "$mol:." there, moltemplate will generate this integer for you + # If we put "$mol" there, moltemplate will generate this integer for you # A list of the bonds in the molecule: # BondID AtomID1 AtomID2 diff --git a/tools/moltemplate/tutorial-files/solv_01.lt b/tools/moltemplate/tutorial-files/solv_01.lt index 9d39e94b8d..42fd239d17 100644 --- a/tools/moltemplate/tutorial-files/solv_01.lt +++ b/tools/moltemplate/tutorial-files/solv_01.lt @@ -2,8 +2,8 @@ import formamide.lt # Defines "_FAM" and OPLSAA # Distribute the molecules on a 5x5x5 cubic grid with spacing 4.6 solv = new _FAM [5].move( 4.6, 0, 0) - [5].move( 0, 4.6, 0) - [5].move( 0, 0, 4.6) + [5].move( 0, 4.6, 0) + [5].move( 0, 0, 4.6) solv[*][*][*].move(-11.5, -11.5, -11.5) # Set the simulation box. @@ -16,42 +16,42 @@ write_once("Data Boundary") { # Note: The lines below in the "In Run" section are often omitted. write_once("In Run"){ - # Create an input deck for LAMMPS. - # Run an NPT simulation. - # Input variables. - variable run string solv_01 # output name - variable ts equal 1 # timestep - variable temp equal 300 # equilibrium temperature - variable p equal 1. # equilibrium pressure - variable d equal 1000 # output frequency - variable equi equal 5000 # Equilibration steps - variable prod equal 30000 # Production steps + # Create an input deck for LAMMPS. + # Run an NPT simulation. + # Input variables. + variable run string solv_01 # output name + variable ts equal 1 # timestep + variable temp equal 300 # equilibrium temperature + variable p equal 1. # equilibrium pressure + variable d equal 1000 # output frequency + variable equi equal 5000 # Equilibration steps + variable prod equal 30000 # Production steps - # Derived variables. - variable tcouple equal \$\{ts\}*100 - variable pcouple equal \$\{ts\}*1000 + # Derived variables. + variable tcouple equal \$\{ts\}*100 + variable pcouple equal \$\{ts\}*1000 - # Output. - thermo \$d - thermo_style custom step etotal evdwl ecoul elong ebond eangle & - edihed eimp ke pe temp press vol density cpu - thermo_modify flush yes + # Output. + thermo \$d + thermo_style custom step etotal evdwl ecoul elong ebond eangle & + edihed eimp ke pe temp press vol density cpu + thermo_modify flush yes - # Trajectory. - dump TRJ all dcd \$d \$\{run\}.dcd - dump_modify TRJ unwrap yes + # Trajectory. + dump TRJ all dcd \$d \$\{run\}.dcd + dump_modify TRJ unwrap yes - # Thermalisation and relaxation, NPT ensemble. - timestep \$\{ts\} - fix NPT all npt temp \$\{temp\} \$\{temp\} \$\{tcouple\} iso \$p \$p \$\{pcouple\} - velocity all create \$\{temp\} 858096 dist gaussian - # Short runs to update the PPPM settings as the box shinks. - run \$\{equi\} post no - run \$\{equi\} post no - run \$\{equi\} post no - run \$\{equi\} - # From now on, the density shouldn't change too much. - run \$\{prod\} - unfix NPT + # Thermalisation and relaxation, NPT ensemble. + timestep \$\{ts\} + fix NPT all npt temp \$\{temp\} \$\{temp\} \$\{tcouple\} iso \$p \$p \$\{pcouple\} + velocity all create \$\{temp\} 858096 dist gaussian + # Short runs to update the PPPM settings as the box shinks. + run \$\{equi\} post no + run \$\{equi\} post no + run \$\{equi\} post no + run \$\{equi\} + # From now on, the density shouldn't change too much. + run \$\{prod\} + unfix NPT } From 37248a011e2dd2e9239e9e0c5c62e6b739075275 Mon Sep 17 00:00:00 2001 From: Andrew Jewett Date: Wed, 19 Mar 2025 15:30:06 -0400 Subject: [PATCH 44/99] deleted trailing whitespace in the Howto_moltemplate.rst file (for PR #4508) --- doc/src/Howto_moltemplate.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Howto_moltemplate.rst b/doc/src/Howto_moltemplate.rst index 97294f629b..b8c021ceef 100644 --- a/doc/src/Howto_moltemplate.rst +++ b/doc/src/Howto_moltemplate.rst @@ -182,7 +182,7 @@ Compile the master file with: (Note: The optioinal "cleanup_moltemplate.sh" command deletes unused atom types, which sometimes makes LAMMPS run faster. But it does not work with many-body pair styles or dreiding-style h-bonds. -Fortunately most force fields, including OPLSAA, don't use those features.) +Fortunately most force fields, including OPLSAA, don't use those features.) Then execute the simulation with the following: @@ -251,7 +251,7 @@ The ``butane.lt`` file below defines Butane as a polymer containing } Butane inherits OPLSAA { - + create_var {$mol} # optional:force all monomers to share the same molecule-ID # - Create 4 monomers @@ -287,7 +287,7 @@ subunit to define even larger molecules. See the moltemplate manual for details How to build a complex polymer """""""""""""""""""""""""""""""""""""""""" A similar procedure can be used to create more complicated polymers, -such as the NIPAM polymer example shown below. For details, see: +such as the NIPAM polymer example shown below. For details, see: https://github.com/jewettaij/moltemplate/tree/master/examples/all_atom/force_field_OPLSAA/NIPAM_polymer+water+ions From 04bb57f8e263f89ac2be56a2681b9410c4b88ea0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 19 Mar 2025 17:17:47 -0400 Subject: [PATCH 45/99] update a bunch more error messages --- doc/src/Errors_details.rst | 12 ++- src/OPENMP/reaxff_forces_omp.cpp | 10 +- src/compute_chunk_atom.cpp | 164 +++++++++++++++++------------- src/compute_chunk_spread_atom.cpp | 62 ++++++----- src/compute_chunk_spread_atom.h | 1 + src/compute_global_atom.cpp | 115 ++++++++++++--------- src/compute_global_atom.h | 1 + src/compute_reduce.cpp | 128 +++++++++++++++-------- src/compute_reduce.h | 1 + src/compute_reduce_chunk.cpp | 64 +++++++----- src/compute_reduce_chunk.h | 1 + src/compute_slice.cpp | 76 +++++++++----- src/compute_slice.h | 1 + src/dump_custom.cpp | 54 ++++++---- src/dump_local.cpp | 70 ++++++++----- src/fix_ave_atom.cpp | 33 ++++-- src/fix_ave_chunk.cpp | 39 ++++--- src/fix_ave_correlate.cpp | 16 ++- 18 files changed, 521 insertions(+), 327 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 72148c2626..9af9b984fb 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -387,7 +387,17 @@ the potential energy has stabilized. .. _err007: -.. currently unused +Fix used in ... not computed at compatible time +----------------------------------------------- + +Many fix styles are invoked only every *nevery* timesteps, which means +their data is only valid on those steps. When data from a fix is used +as input for a compute, a dump, another fix, or thermo output, it must +read that data at timesteps when the fix in question was invoked, i.e. +on timesteps that are multiples of its *nevery* setting. If this is +not the case, LAMMPS will stop with an error. To remedy this, it may +be required to change the output frequency or the *nevery* setting of +the fix. .. _err0008: diff --git a/src/OPENMP/reaxff_forces_omp.cpp b/src/OPENMP/reaxff_forces_omp.cpp index ce8ad0716f..e27460c425 100644 --- a/src/OPENMP/reaxff_forces_omp.cpp +++ b/src/OPENMP/reaxff_forces_omp.cpp @@ -37,6 +37,7 @@ #include using namespace LAMMPS_NS; +using utils::errorurl; namespace ReaxFF { /* ---------------------------------------------------------------------- */ @@ -182,8 +183,8 @@ namespace ReaxFF { if (End_Index(i, bonds) > comp) system->error_ptr->one(FLERR, fmt::format("step {}: bondchk failed: " - "i={} end(i)={} str(i+1)={}\n", - step,i,End_Index(i,bonds),comp)); + "i={} end(i)={} str(i+1)={}{}", + step,i,End_Index(i,bonds),comp,errorurl(18))); } } @@ -207,8 +208,9 @@ namespace ReaxFF { if (End_Index(Hindex, hbonds) > comp) system->error_ptr->one(FLERR, fmt::format("step {}: hbondchk failed: " - "H={} end(H)={} str(H+1)={}\n", - step, Hindex,End_Index(Hindex,hbonds),comp)); + "H={} end(H)={} str(H+1)={}{}", + step, Hindex,End_Index(Hindex,hbonds),comp, + errorurl(18))); } } } diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index a1d595a086..f8ea7d9efa 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -56,7 +56,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : fchunk(nullptr), varatom(nullptr), id_fix(nullptr), fixstore(nullptr), lockfix(nullptr), chunk(nullptr), exclude(nullptr), hash(nullptr) { - if (narg < 4) error->all(FLERR, "Illegal compute chunk/atom command"); + if (narg < 4) utils::missing_cmd_args(FLERR, "compute chunk/atom", error); peratom_flag = 1; scalar_flag = 1; @@ -101,7 +101,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : which = ArgInfo::BINSPHERE; ncoord = 1; iarg = 4; - if (iarg + 6 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 6 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom bin/sphere", error); sorigin_user[0] = utils::numeric(FLERR, arg[iarg], false, lmp); sorigin_user[1] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); sorigin_user[2] = utils::numeric(FLERR, arg[iarg + 2], false, lmp); @@ -126,7 +126,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : cdim1 = 0; cdim2 = 1; } - if (iarg + 5 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 5 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom bin/cylinder", error); corigin_user[dim[0]] = 0.0; corigin_user[cdim1] = utils::numeric(FLERR, arg[iarg], false, lmp); corigin_user[cdim2] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); @@ -151,7 +151,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : cfvid = argi.copy_name(); if ((which == ArgInfo::UNKNOWN) || (which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, 3, "Invalid compute chunk/atom argument {}", arg[3]); iarg = 4; } @@ -178,40 +178,42 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg], "region") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom region", error); if (!domain->get_region_by_id(arg[iarg + 1])) - error->all(FLERR, "Region {} for compute chunk/atom does not exist", arg[iarg + 1]); + error->all(FLERR, iarg + 1, "Region {} for compute chunk/atom does not exist", + arg[iarg + 1]); idregion = utils::strdup(arg[iarg + 1]); regionflag = 1; iarg += 2; } else if (strcmp(arg[iarg], "nchunk") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom nchunk", error); if (strcmp(arg[iarg + 1], "once") == 0) nchunkflag = ONCE; else if (strcmp(arg[iarg + 1], "every") == 0) nchunkflag = EVERY; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg + 1, "Unknown compute chunk/atom nchunk argument {}", arg[iarg + 1]); nchunksetflag = 1; iarg += 2; } else if (strcmp(arg[iarg], "limit") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom limit", error); limit = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); - if (limit < 0) error->all(FLERR, "Illegal compute chunk/atom command"); + if (limit < 0) + error->all(FLERR, iarg + 1, "Illegal compute chunk/atom limit value {}", limit); if (limit && !compress) limitfirst = 1; iarg += 2; if (limit) { - if (iarg > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom limit", error); if (strcmp(arg[iarg], "max") == 0) limitstyle = LIMITMAX; else if (strcmp(arg[iarg], "exact") == 0) limitstyle = LIMITEXACT; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg, "Unknown compute chunk/atom limit keyword {}", arg[iarg]); iarg++; } } else if (strcmp(arg[iarg], "ids") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom ids", error); if (strcmp(arg[iarg + 1], "once") == 0) idsflag = ONCE; else if (strcmp(arg[iarg + 1], "nfreq") == 0) @@ -219,14 +221,14 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg + 1], "every") == 0) idsflag = EVERY; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg + 1, "Unknown compute chunk/atom ids argument {}", arg[iarg + 1]); iarg += 2; } else if (strcmp(arg[iarg], "compress") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom compress", error); compress = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; } else if (strcmp(arg[iarg], "discard") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom discard", error); if (strcmp(arg[iarg + 1], "mixed") == 0) discard = MIXED; else if (strcmp(arg[iarg + 1], "no") == 0) @@ -234,11 +236,12 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg + 1], "yes") == 0) discard = YESDISCARD; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg + 1, "Unknown compute chunk/atom discard argument {}", + arg[iarg + 1]); discardsetflag = 1; iarg += 2; } else if (strcmp(arg[iarg], "bound") == 0) { - if (iarg + 4 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 4 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom bound", error); int idim = 0; if (strcmp(arg[iarg + 1], "x") == 0) idim = 0; @@ -247,7 +250,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg + 1], "z") == 0) idim = 2; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg + 1, "Unknown compute chunk/atom bound argument {}", arg[iarg + 1]); minflag[idim] = COORD; if (strcmp(arg[iarg + 2], "lower") == 0) minflag[idim] = LOWER; @@ -260,7 +263,7 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : maxvalue[idim] = utils::numeric(FLERR, arg[iarg + 3], false, lmp); iarg += 4; } else if (strcmp(arg[iarg], "units") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom units", error); if (strcmp(arg[iarg + 1], "box") == 0) scaleflag = BOX; else if (strcmp(arg[iarg + 1], "lattice") == 0) @@ -268,14 +271,14 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg + 1], "reduced") == 0) scaleflag = REDUCED; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg + 1, "Unknown compute chunk/atom units argument {}", arg[iarg + 1]); iarg += 2; } else if (strcmp(arg[iarg], "pbc") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal compute chunk/atom command"); + if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, "compute chunk/atom pbc", error); pbcflag = utils::logical(FLERR, arg[iarg + 1], false, lmp); iarg += 2; } else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg, "Unknown compute chunk/atom keyword {}", arg[iarg]); } // set nchunkflag and discard to default values if not explicitly set @@ -309,74 +312,82 @@ ComputeChunkAtom::ComputeChunkAtom(LAMMPS *lmp, int narg, char **arg) : // error checks if (which == ArgInfo::MOLECULE && !atom->molecule_flag) - error->all(FLERR, "Compute chunk/atom molecule for non-molecular system"); + error->all(FLERR, Error::NOLASTLINE, "Compute chunk/atom molecule for non-molecular system"); if (!binflag && discard == MIXED) - error->all(FLERR, - "Compute chunk/atom without bins " - "cannot use discard mixed"); + error->all(FLERR, Error::NOLASTLINE, + "Compute chunk/atom without bins cannot use discard mixed"); if (which == ArgInfo::BIN1D && delta[0] <= 0.0) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/1d command"); if (which == ArgInfo::BIN2D && (delta[0] <= 0.0 || delta[1] <= 0.0)) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/2d command"); if (which == ArgInfo::BIN2D && (dim[0] == dim[1])) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/2d command"); if (which == ArgInfo::BIN3D && (delta[0] <= 0.0 || delta[1] <= 0.0 || delta[2] <= 0.0)) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/3d command"); if (which == ArgInfo::BIN3D && (dim[0] == dim[1] || dim[1] == dim[2] || dim[0] == dim[2])) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/3d command"); if (which == ArgInfo::BINSPHERE) { if (domain->dimension == 2 && sorigin_user[2] != 0.0) - error->all(FLERR, "Compute chunk/atom sphere z origin must be 0.0 for 2d"); + error->all(FLERR, Error::NOLASTLINE, "Compute chunk/atom sphere z origin must be 0.0 for 2d"); if (sradmin_user < 0.0 || sradmin_user >= sradmax_user || nsbin < 1) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/sphere command"); } if (which == ArgInfo::BINCYLINDER) { - if (delta[0] <= 0.0) error->all(FLERR, "Illegal compute chunk/atom command"); + if (delta[0] <= 0.0) + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/cylinder command"); if (domain->dimension == 2 && dim[0] != 2) - error->all(FLERR, "Compute chunk/atom cylinder axis must be z for 2d"); + error->all(FLERR, Error::NOLASTLINE, "Compute chunk/atom cylinder axis must be z for 2d"); if (cradmin_user < 0.0 || cradmin_user >= cradmax_user || ncbin < 1) - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, Error::NOLASTLINE, "Illegal compute chunk/atom bin/cylinder command"); } if (which == ArgInfo::COMPUTE) { cchunk = modify->get_compute_by_id(cfvid); - if (!cchunk) error->all(FLERR, "Compute ID {} for compute chunk /atom does not exist", cfvid); + if (!cchunk) + error->all(FLERR, 3, "Compute ID {} for compute chunk /atom does not exist", cfvid); if (cchunk->peratom_flag == 0) - error->all(FLERR, "Compute chunk/atom compute does not calculate per-atom values"); + error->all(FLERR, 3, "Compute chunk/atom compute {} does not calculate per-atom values", + cfvid); if ((argindex == 0) && (cchunk->size_peratom_cols != 0)) - error->all(FLERR, "Compute chunk/atom compute does not calculate a per-atom vector"); + error->all(FLERR, 3, "Compute chunk/atom compute {} does not calculate a per-atom vector", + cfvid); if (argindex && (cchunk->size_peratom_cols == 0)) - error->all(FLERR, "Compute chunk/atom compute does not calculate a per-atom array"); + error->all(FLERR, 3, "Compute chunk/atom compute {} does not calculate a per-atom array", + cfvid); if (argindex && argindex > cchunk->size_peratom_cols) - error->all(FLERR, "Compute chunk/atom compute array is accessed out-of-range"); + error->all(FLERR, 3, "Compute chunk/atom compute {} array is accessed out-of-range{}", cfvid, + utils::errorurl(20)); } if (which == ArgInfo::FIX) { fchunk = modify->get_fix_by_id(cfvid); - if (!fchunk) error->all(FLERR, "Fix ID {} for compute chunk/atom does not exist", cfvid); + if (!fchunk) error->all(FLERR, 3, "Fix ID {} for compute chunk/atom does not exist", cfvid); if (fchunk->peratom_flag == 0) - error->all(FLERR, "Compute chunk/atom fix does not calculate per-atom values"); + error->all(FLERR, 3, "Compute chunk/atom fix {} does not calculate per-atom values", cfvid); if (argindex == 0 && fchunk->size_peratom_cols != 0) - error->all(FLERR, "Compute chunk/atom fix does not calculate a per-atom vector"); + error->all(FLERR, 3, "Compute chunk/atom fix {} does not calculate a per-atom vector", cfvid); if (argindex && fchunk->size_peratom_cols == 0) - error->all(FLERR, "Compute chunk/atom fix does not calculate a per-atom array"); + error->all(FLERR, 3, "Compute chunk/atom fix {} does not calculate a per-atom array", cfvid); if (argindex && argindex > fchunk->size_peratom_cols) - error->all(FLERR, "Compute chunk/atom fix array is accessed out-of-range"); + error->all(FLERR, 3, "Compute chunk/atom fix {} array is accessed out-of-range{}", cfvid, + utils::errorurl(20)); } if (which == ArgInfo::VARIABLE) { int ivariable = input->variable->find(cfvid); - if (ivariable < 0) error->all(FLERR, "Variable name for compute chunk/atom does not exist"); + if (ivariable < 0) + error->all(FLERR, 3, "Variable name {} for compute chunk/atom does not exist", cfvid); if (input->variable->atomstyle(ivariable) == 0) - error->all(FLERR, "Compute chunk/atom variable is not atom-style variable"); + error->all(FLERR, 3, "Compute chunk/atom variable {} is not atom-style variable", cfvid); } // setup scaling if (binflag) { if (domain->triclinic == 1 && scaleflag != REDUCED) - error->all(FLERR, "Compute chunk/atom for triclinic boxes requires units reduced"); + error->all(FLERR, Error::NOLASTLINE, + "Compute chunk/atom for triclinic boxes requires units reduced"); } if (scaleflag == LATTICE) { @@ -512,20 +523,27 @@ void ComputeChunkAtom::init() if (regionflag) { region = domain->get_region_by_id(idregion); - if (!region) error->all(FLERR, "Region {} for compute chunk/atom does not exist", idregion); + if (!region) + error->all(FLERR, Error::NOLASTLINE, "Region {} for compute chunk/atom does not exist", + idregion); } // set compute,fix,variable if (which == ArgInfo::COMPUTE) { cchunk = modify->get_compute_by_id(cfvid); - if (!cchunk) error->all(FLERR, "Compute ID {} for compute chunk/atom does not exist", cfvid); + if (!cchunk) + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute chunk/atom does not exist", + cfvid); } else if (which == ArgInfo::FIX) { fchunk = modify->get_fix_by_id(cfvid); - if (!fchunk) error->all(FLERR, "Fix ID {} for compute chunk/atom does not exist", cfvid); + if (!fchunk) + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute chunk/atom does not exist", + cfvid); } else if (which == ArgInfo::VARIABLE) { int ivariable = input->variable->find(cfvid); - if (ivariable < 0) error->all(FLERR, "Variable name for compute chunk/atom does not exist"); + if (ivariable < 0) + error->all(FLERR, Error::NOLASTLINE, "Variable name for compute chunk/atom does not exist"); vchunk = ivariable; } @@ -540,7 +558,8 @@ void ComputeChunkAtom::init() if (molecule[i] > maxone) maxone = molecule[i]; tagint maxall; MPI_Allreduce(&maxone, &maxall, 1, MPI_LMP_TAGINT, MPI_MAX, world); - if (maxall > MAXSMALLINT) error->all(FLERR, "Molecule IDs too large for compute chunk/atom"); + if (maxall > MAXSMALLINT) + error->all(FLERR, Error::NOLASTLINE, "Molecule IDs too large for compute chunk/atom"); } // for binning, if nchunkflag not already set, set it to ONCE or EVERY @@ -560,7 +579,7 @@ void ComputeChunkAtom::init() // can't check until now since nchunkflag may have been adjusted in init() if (idsflag == ONCE && nchunkflag != ONCE) - error->all(FLERR, "Compute chunk/atom ids once but nchunk is not once"); + error->all(FLERR, Error::NOLASTLINE, "Compute chunk/atom ids once but nchunk is not once"); // create/destroy fix STORE for persistent chunk IDs as needed // need to do this if idsflag = ONCE or locks will be used by other commands @@ -658,9 +677,8 @@ void ComputeChunkAtom::lock(Fix *fixptr, bigint startstep, bigint stopstep) } if (startstep != lockstart || stopstep != lockstop) - error->all(FLERR, - "Two fix commands using " - "same compute chunk/atom command in incompatible ways"); + error->all(FLERR, Error::NOLASTLINE, + "Two fix commands using same compute chunk/atom command in incompatible ways"); // set lock to last calling Fix, since it will be last to unlock() @@ -910,7 +928,9 @@ void ComputeChunkAtom::assign_chunk_ids() if (regionflag) { region = domain->get_region_by_id(idregion); - if (!region) error->all(FLERR, "Region {} for compute chunk/atom does not exist", idregion); + if (!region) + error->all(FLERR, Error::NOLASTLINE, "Region {} for compute chunk/atom does not exist", + idregion); region->prematch(); } @@ -989,9 +1009,9 @@ void ComputeChunkAtom::assign_chunk_ids() } else if (which == ArgInfo::FIX) { if (update->ntimestep % fchunk->peratom_freq) - error->all(FLERR, - "Fix used in compute chunk/atom not " - "computed at compatible time"); + error->all(FLERR, Error::NOLASTLINE, + "Fix used in compute chunk/atom not computed at compatible time" + + utils::errorurl(7)); if (argindex == 0) { double *vec = fchunk->vector_atom; @@ -1245,7 +1265,7 @@ int ComputeChunkAtom::setup_xyz_bins() hi = origin[m] - n * delta[m]; } - if (lo > hi) error->all(FLERR, "Invalid bin bounds in compute chunk/atom"); + if (lo > hi) error->all(FLERR, Error::NOLASTLINE, "Invalid bin bounds in compute chunk/atom"); offset[m] = lo; nlayers[m] = static_cast((hi - lo) * invdelta[m] + 0.5); @@ -1324,9 +1344,8 @@ int ComputeChunkAtom::setup_sphere_bins() if (periodicity[1] && sradmax > prd_half[1]) flag = 1; if (domain->dimension == 3 && periodicity[2] && sradmax > prd_half[2]) flag = 1; if (flag) - error->all(FLERR, - "Compute chunk/atom bin/sphere radius " - "is too large for periodic box"); + error->all(FLERR, Error::NOLASTLINE, + "Compute chunk/atom bin/sphere radius is too large for periodic box"); } sinvrad = nsbin / (sradmax - sradmin); @@ -1388,9 +1407,8 @@ int ComputeChunkAtom::setup_cylinder_bins() if (periodicity[cdim1] && sradmax > prd_half[cdim1]) flag = 1; if (periodicity[cdim2] && sradmax > prd_half[cdim2]) flag = 1; if (flag) - error->all(FLERR, - "Compute chunk/atom bin/cylinder radius " - "is too large for periodic box"); + error->all(FLERR, Error::NOLASTLINE, + "Compute chunk/atom bin/cylinder radius is too large for periodic box"); } cinvrad = ncbin / (cradmax - cradmin); @@ -2002,7 +2020,7 @@ void ComputeChunkAtom::atom2bincylinder() void ComputeChunkAtom::readdim(int narg, char **arg, int iarg, int idim) { - if (narg < iarg + 3) error->all(FLERR, "Illegal compute chunk/atom command"); + if (narg < iarg + 3) utils::missing_cmd_args(FLERR, "compute chunk/atom", error); if (strcmp(arg[iarg], "x") == 0) dim[idim] = 0; else if (strcmp(arg[iarg], "y") == 0) @@ -2010,10 +2028,10 @@ void ComputeChunkAtom::readdim(int narg, char **arg, int iarg, int idim) else if (strcmp(arg[iarg], "z") == 0) dim[idim] = 2; else - error->all(FLERR, "Illegal compute chunk/atom command"); + error->all(FLERR, iarg, "Illegal compute chunk/atom dimension {}", arg[iarg]); if (dim[idim] == 2 && domain->dimension == 2) - error->all(FLERR, "Cannot use compute chunk/atom bin z for 2d model"); + error->all(FLERR, iarg, "Cannot use compute chunk/atom bin z for 2d model"); if (strcmp(arg[iarg + 1], "lower") == 0) originflag[idim] = LOWER; diff --git a/src/compute_chunk_spread_atom.cpp b/src/compute_chunk_spread_atom.cpp index 53b8517c22..5c47b7770e 100644 --- a/src/compute_chunk_spread_atom.cpp +++ b/src/compute_chunk_spread_atom.cpp @@ -34,7 +34,7 @@ ComputeChunkSpreadAtom:: ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), idchunk(nullptr) { - if (narg < 5) error->all(FLERR,"Illegal compute chunk/spread/atom command"); + if (narg < 5) utils::missing_cmd_args(FLERR,"compute chunk/spread/atom", error); // ID of compute chunk/atom @@ -43,10 +43,12 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : // expand args if any have wildcard character "*" - int iarg = 4; + const int ioffset = 4; + int iarg = ioffset; int expand = 0; char **earg; - int nargnew = utils::expand_args(FLERR,narg-iarg,&arg[iarg],1,earg,lmp); + int *amap = nullptr; + int nargnew = utils::expand_args(FLERR,narg-iarg,&arg[iarg],1,earg,lmp,&amap); if (earg != &arg[iarg]) expand = 1; arg = earg; @@ -60,11 +62,13 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : value_t val; val.which = argi.get_type(); val.argindex = argi.get_index1(); + if (expand) val.iarg = amap[iarg] + ioffset; + else val.iarg = iarg + ioffset; val.id = argi.get_name(); val.val.c = nullptr; if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR,"Illegal compute chunk/spread/atom argument: {}", arg[iarg]); + error->all(FLERR, val.iarg, "Illegal compute chunk/spread/atom argument: {}", arg[iarg]); values.push_back(val); } @@ -84,41 +88,48 @@ ComputeChunkSpreadAtom(LAMMPS *lmp, int narg, char **arg) : if (val.which == ArgInfo::COMPUTE) { auto icompute = modify->get_compute_by_id(val.id); if (!icompute) - error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", val.id); + error->all(FLERR, val.iarg, "Compute ID {} for compute chunk/spread/atom does not exist", + val.id); if (!utils::strmatch(icompute->style,"/chunk$")) - error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate per-chunk values", + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom compute {} does not calculate per-chunk values", val.id); if (val.argindex == 0) { if (!icompute->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate global vector", + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom compute {} does not calculate global vector", val.id); } else { if (!icompute->array_flag) - error->all(FLERR,"Compute chunk/spread/atom compute {} does not calculate global array", + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom compute {} does not calculate global array", val.id); if (val.argindex > icompute->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom compute {} array is accessed out-of-range", - val.id); + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom compute {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } val.val.c = icompute; } else if (val.which == ArgInfo::FIX) { auto ifix = modify->get_fix_by_id(val.id); if (!ifix) - error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", val.id); + error->all(FLERR, val.iarg, + "Fix ID {} for compute chunk/spread/atom does not exist", val.id); if (val.argindex == 0) { if (!ifix->vector_flag) - error->all(FLERR,"Compute chunk/spread/atom {} fix does not calculate global vector", - val.id); + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom {} fix does not calculate global vector", val.id); } else { if (!ifix->array_flag) - error->all(FLERR,"Compute chunk/spread/atom {} fix does not calculate global array", - val.id); + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom {} fix does not calculate global array", val.id); if (val.argindex > ifix->size_array_cols) - error->all(FLERR,"Compute chunk/spread/atom fix {} array is accessed out-of-range", - val.id); + error->all(FLERR, val.iarg, + "Compute chunk/spread/atom fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } } } @@ -158,12 +169,14 @@ void ComputeChunkSpreadAtom::init() if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR,"Compute ID {} for compute chunk/spread/atom does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, + "Compute ID {} for compute chunk/spread/atom does not exist", val.id); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) - error->all(FLERR,"Fix ID {} for compute chunk/spread/atom does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, + "Fix ID {} for compute chunk/spread/atom does not exist", val.id); } } } @@ -174,10 +187,12 @@ void ComputeChunkSpreadAtom::init_chunk() { cchunk = dynamic_cast(modify->get_compute_by_id(idchunk)); if (!cchunk) - error->all(FLERR,"Chunk/atom compute {} does not exist for compute chunk/spread/atom " + error->all(FLERR, Error::NOLASTLINE, + "Chunk/atom compute {} does not exist for compute chunk/spread/atom " "or is of invalid style", idchunk); if (strcmp(cchunk->style,"chunk/atom") != 0) - error->all(FLERR,"Compute chunk/spread/atom {} does not use chunk/atom compute", idchunk); + error->all(FLERR, Error::NOLASTLINE, + "Compute chunk/spread/atom {} does not use chunk/atom compute", idchunk); } /* ---------------------------------------------------------------------- */ @@ -273,8 +288,9 @@ void ComputeChunkSpreadAtom::compute_peratom() } else if (val.which == ArgInfo::FIX) { Fix *fix = val.val.f; if (update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix {} used in compute chunk/spread/atom not computed at compatible time", - val.id); + error->all(FLERR, Error::NOLASTLINE, + "Fix {} used in compute chunk/spread/atom not computed at compatible time{}", + val.id, utils::errorurl(7)); if (val.argindex == 0) { int nfix = fix->size_vector; diff --git a/src/compute_chunk_spread_atom.h b/src/compute_chunk_spread_atom.h index 4ea88e89ec..7ec646d0e5 100644 --- a/src/compute_chunk_spread_atom.h +++ b/src/compute_chunk_spread_atom.h @@ -36,6 +36,7 @@ class ComputeChunkSpreadAtom : public Compute { struct value_t { int which; int argindex; + int iarg; std::string id; union { class Compute *c; diff --git a/src/compute_global_atom.cpp b/src/compute_global_atom.cpp index f968d0c014..a68260067e 100644 --- a/src/compute_global_atom.cpp +++ b/src/compute_global_atom.cpp @@ -37,16 +37,18 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) : // process index arg - int iarg = 3; + const int ioffset = 3; + int iarg = ioffset; ArgInfo argi(arg[iarg]); reference.which = argi.get_type(); reference.argindex = argi.get_index1(); reference.id = argi.get_name(); + reference.iarg = iarg; if ((reference.which == ArgInfo::UNKNOWN) || (reference.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR,"Illegal compute global/atom index property: {}", arg[iarg]); + error->all(FLERR, iarg, "Illegal compute global/atom index property: {}", arg[iarg]); iarg++; @@ -54,7 +56,8 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) : int expand = 0; char **earg; - int nargnew = utils::expand_args(FLERR,narg-iarg,&arg[iarg],1,earg,lmp); + int *amap = nullptr; + int nargnew = utils::expand_args(FLERR,narg-iarg,&arg[iarg],1,earg,lmp,&amap); if (earg != &arg[iarg]) expand = 1; arg = earg; @@ -69,12 +72,14 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) : value_t val; val.which = argi2.get_type(); val.argindex = argi2.get_index1(); + if (expand) val.iarg = amap[iarg] + ioffset; + else val.iarg = iarg + ioffset; val.id = argi2.get_name(); val.val.c = nullptr; if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi2.get_dim() > 1)) - error->all(FLERR,"Illegal compute global/atom global property: {}", arg[iarg]); + error->all(FLERR, val.iarg, "Illegal compute global/atom global property: {}", arg[iarg]); values.push_back(val); } @@ -91,85 +96,92 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) : if (reference.which == ArgInfo::COMPUTE) { reference.val.c = modify->get_compute_by_id(reference.id); if (!reference.val.c) - error->all(FLERR,"Compute ID {} for compute global/atom index", reference.id); + error->all(FLERR,reference.iarg,"Compute ID {} for compute global/atom index",reference.id); if (!reference.val.c->peratom_flag) - error->all(FLERR,"Compute global/atom compute {} does not calculate a per-atom " - "vector or array", reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom compute {} does not calculate a " + "per-atom vector or array", reference.id); if ((reference.argindex == 0) && (reference.val.c->size_peratom_cols != 0)) - error->all(FLERR,"Compute global/atom compute {} does not calculate a per-atom " - "vector", reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom compute {} does not calculate a " + "per-atom vector", reference.id); if (reference.argindex && (reference.val.c->size_peratom_cols == 0)) - error->all(FLERR,"Compute global/atom compute does not calculate a per-atom " + error->all(FLERR, reference.iarg, "Compute global/atom compute does not calculate a per-atom " "array", reference.id); if (reference.argindex && (reference.argindex > reference.val.c->size_peratom_cols)) - error->all(FLERR, "Compute global/atom compute array {} is accessed out-of-range", - reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom compute array {} is accessed " + "out-of-range{}", reference.id, utils::errorurl(20)); } else if (reference.which == ArgInfo::FIX) { reference.val.f =modify->get_fix_by_id(reference.id); if (!reference.val.f) - error->all(FLERR,"Fix ID {} for compute global/atom does not exist", reference.id); + error->all(FLERR, reference.iarg, "Fix ID {} for compute global/atom does not exist", + reference.id); if (!reference.val.f->peratom_flag) - error->all(FLERR,"Compute global/atom fix {} does not calculate a per-atom vector " - "or array", reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom fix {} does not calculate a per-atom " + "vector or array", reference.id); if (reference.argindex == 0 && (reference.val.f->size_peratom_cols != 0)) - error->all(FLERR,"Compute global/atom fix {} does not calculate a per-atom vector", - reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom fix {} does not calculate a per-atom " + "vector", reference.id); if (reference.argindex && (reference.val.f->size_peratom_cols == 0)) - error->all(FLERR,"Compute global/atom fix {} does not calculate a per-atom array", - reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom fix {} does not calculate a per-atom " + "array", reference.id); if (reference.argindex && (reference.argindex > reference.val.f->size_peratom_cols)) - error->all(FLERR, "Compute global/atom fix {} array is accessed out-of-range", reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom fix {} array is accessed " + "out-of-range{}", reference.id, utils::errorurl(20)); } else if (reference.which == ArgInfo::VARIABLE) { reference.val.v = input->variable->find(reference.id.c_str()); if (reference.val.v < 0) - error->all(FLERR,"Variable name {} for compute global/atom index does not exist", - reference.id); + error->all(FLERR, reference.iarg, "Variable name {} for compute global/atom index does " + "not exist", reference.id); if (input->variable->atomstyle(reference.val.v) == 0) - error->all(FLERR,"Compute global/atom index variable {} is not atom-style variable", - reference.id); + error->all(FLERR, reference.iarg, "Compute global/atom index variable {} is not atom-style " + "variable", reference.id); } for (auto &val : values) { if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR,"Compute ID {} for compute global/atom does not exist", val.id); + error->all(FLERR, val.iarg, "Compute ID {} for compute global/atom does not exist", val.id); if (val.argindex == 0) { if (!val.val.c->vector_flag) - error->all(FLERR,"Compute ID {} for global/atom compute does not calculate " + error->all(FLERR, val.iarg, "Compute ID {} for global/atom compute does not calculate " "a global vector", val.id); } else { if (!val.val.c->array_flag) - error->all(FLERR,"Compute ID {} for global/atom compute does not calculate " + error->all(FLERR, val.iarg, "Compute ID {} for global/atom compute does not calculate " "a global array", val.id); if (val.argindex > val.val.c->size_array_cols) - error->all(FLERR,"Compute global/atom compute {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute global/atom compute {} array is accessed " + "out-of-range{}", val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR,"Fix ID {} for compute global/atom does not exist", val.id); + if (!val.val.f) + error->all(FLERR, val.iarg, "Fix ID {} for compute global/atom does not exist", val.id); if (val.argindex == 0) { if (!val.val.f->vector_flag) - error->all(FLERR,"Fix ID {} for compute global/atom compute does not calculate " - "a global vector", val.id); + error->all(FLERR, val.iarg, "Fix ID {} for compute global/atom compute does not " + "calculate a global vector", val.id); } else { if (!val.val.f->array_flag) - error->all(FLERR,"Fix ID {} for compute global/atom compute does not calculate " - "a global array", val.id); + error->all(FLERR, val.iarg, "Fix ID {} for compute global/atom compute does not " + "calculate a global array", val.id); if (val.argindex > val.val.f->size_array_cols) - error->all(FLERR,"Compute global/atom fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute global/atom fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR,"Variable name {} for compute global/atom does not exist", val.id); + error->all(FLERR, val.iarg, "Variable name {} for compute global/atom does not exist", + val.id); if (input->variable->vectorstyle(val.val.v) == 0) - error->all(FLERR,"Compute global/atom variable {} is not vector-style variable", val.id); + error->all(FLERR, val.iarg, "Compute global/atom variable {} is not vector-style variable", + val.id); } } @@ -203,33 +215,38 @@ void ComputeGlobalAtom::init() if (reference.which == ArgInfo::COMPUTE) { reference.val.c = modify->get_compute_by_id(reference.id); if (!reference.val.c) - error->all(FLERR,"Compute ID {} for compute global/atom index does not exist", reference.id); + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute global/atom index does not " + "exist", reference.id); } else if (reference.which == ArgInfo::FIX) { reference.val.f = modify->get_fix_by_id(reference.id); if (reference.val.f) - error->all(FLERR,"Fix ID {} for compute global/atom index does not exist", reference.id); + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute global/atom index does not exist", + reference.id); } else if (reference.which == ArgInfo::VARIABLE) { reference.val.v = input->variable->find(reference.id.c_str()); if (reference.val.v < 0) - error->all(FLERR,"Variable name {} for compute global/atom index does not exist", - reference.id); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for compute global/atom index does " + "not exist", reference.id); } for (auto &val : values) { if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR,"Compute ID {} for compute global/atom does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute global/atom does not exist", + val.id); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) - error->all(FLERR,"Fix ID {} for compute global/atom does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute global/atom does not exist", + val.id); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR,"Variable name {} for compute global/atom does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for compute global/atom does not " + "exist", val.id); } } } @@ -288,8 +305,8 @@ void ComputeGlobalAtom::compute_peratom() } else if (reference.which == ArgInfo::FIX) { if (update->ntimestep % reference.val.f->peratom_freq) - error->all(FLERR,"Fix {} used in compute global/atom not computed at compatible time", - reference.id); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute global/atom not computed at " + "compatible time{}", reference.id, utils::errorurl(7)); if (reference.argindex == 0) { double *fix_vector = reference.val.f->vector_atom; @@ -334,8 +351,8 @@ void ComputeGlobalAtom::compute_peratom() } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR,"Fix {} used in compute global/atom not computed at compatible time", - val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute global/atom not computed " + "at compatible time{}", val.id, utils::errorurl(7)); vmax = reference.val.f->size_vector; if (vmax > maxvector) { @@ -401,8 +418,8 @@ void ComputeGlobalAtom::compute_peratom() } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR,"Fix {} used in compute global/atom not computed at compatible time", - val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute global/atom not computed " + "at compatible time{}", val.id, utils::errorurl(7)); vmax = val.val.f->size_array_rows; if (vmax > maxvector) { diff --git a/src/compute_global_atom.h b/src/compute_global_atom.h index b8d49bf7a5..909be7b20b 100644 --- a/src/compute_global_atom.h +++ b/src/compute_global_atom.h @@ -36,6 +36,7 @@ class ComputeGlobalAtom : public Compute { struct value_t { int which; int argindex; + int iarg; std::string id; union { class Compute *c; diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 6c4bafab4f..622e568200 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -79,7 +79,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(style, "reduce/region") == 0) { if (narg < 6) utils::missing_cmd_args(FLERR, "compute reduce/region", error); if (!domain->get_region_by_id(arg[3])) - error->all(FLERR, "Region {} for compute reduce/region does not exist", arg[3]); + error->all(FLERR, 3, "Region {} for compute reduce/region does not exist", arg[3]); idregion = utils::strdup(arg[3]); iarg = 4; } @@ -105,7 +105,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg], "minabs") == 0) mode = MINABS; else - error->all(FLERR, "Unknown compute {} mode: {}", style, arg[iarg]); + error->all(FLERR, iarg, "Unknown compute {} mode: {}", style, arg[iarg]); iarg++; if (mode == SUM || mode == SUMSQ || mode == SUMABS) { @@ -124,9 +124,12 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : // expand args if any have wildcard character "*" + int ioffset = iarg; int expand = 0; char **earg; - int nargnew = utils::expand_args(FLERR, narg - iarg, &arg[iarg], 1, earg, lmp); + char **oarg = arg; + int *amap = nullptr; + int nargnew = utils::expand_args(FLERR, narg - iarg, &arg[iarg], 1, earg, lmp, &amap); if (earg != &arg[iarg]) expand = 1; arg = earg; @@ -140,6 +143,8 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : val.id = ""; val.val.c = nullptr; + if (expand) val.iarg = amap[iarg] + ioffset; + else val.iarg = iarg + ioffset; if (strcmp(arg[iarg], "x") == 0) { val.which = ArgInfo::X; @@ -180,7 +185,7 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : val.id = argi.get_name(); if ((val.which == ArgInfo::UNKNOWN) || (argi.get_dim() > 1)) - error->all(FLERR, "Illegal compute {} argument: {}", style, arg[iarg]); + error->all(FLERR, val.iarg, "Illegal compute {} argument: {}", style, arg[iarg]); if (val.which == ArgInfo::NONE) break; } @@ -196,31 +201,42 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : std::string mycmd = "compute "; mycmd += style; + for (int i = 0; i < narg; ++i) { + if (strcmp(oarg[i],arg[nvalues]) == 0) + ioffset = i - nvalues; + } for (int iarg = nvalues; iarg < nargnew; iarg++) { + int errptr = iarg + ioffset; if (strcmp(arg[iarg], "replace") == 0) { - if (iarg + 3 > narg) utils::missing_cmd_args(FLERR, mycmd + " replace", error); + if (iarg + 3 > nargnew) utils::missing_cmd_args(FLERR, mycmd + " replace", error); if (mode != MINN && mode != MAXX) - error->all(FLERR, "Compute {} replace requires min or max mode", style); + error->all(FLERR, errptr, "Compute {} replace requires min or max mode", style); int col1 = utils::inumeric(FLERR, arg[iarg + 1], false, lmp) - 1; int col2 = utils::inumeric(FLERR, arg[iarg + 2], false, lmp) - 1; if ((col1 < 0) || (col1 >= nvalues)) - error->all(FLERR, "Invalid compute {} replace first column index {}", style, col1); + error->all(FLERR, errptr + 1, "Invalid compute {} replace first column index {}", + style, col1); if ((col2 < 0) || (col2 >= nvalues)) - error->all(FLERR, "Invalid compute {} replace second column index {}", style, col2); - if (col1 == col2) error->all(FLERR, "Compute {} replace columns must be different"); + error->all(FLERR, errptr + 2, "Invalid compute {} replace second column index {}", + style, col2); + if (col1 == col2) error->all(FLERR, errptr, "Compute {} replace columns must be different"); if ((replace[col1] >= 0) || (replace[col2] >= 0)) - error->all(FLERR, "Compute {} replace column already used for another replacement"); + error->all(FLERR, errptr, + "Compute {} replace column already used for another replacement"); replace[col1] = col2; iarg += 2; } else if (strcmp(arg[iarg], "inputs") == 0) { - if (iarg + 2 > narg) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); + if (iarg + 2 > nargnew) utils::missing_cmd_args(FLERR, mycmd + " inputs", error); if (strcmp(arg[iarg + 1], "peratom") == 0) input_mode = PERATOM; else if (strcmp(arg[iarg + 1], "local") == 0) input_mode = LOCAL; + else + error->all(FLERR, errptr + 1, "Unknown compute {} inputs argument: {}", style, + arg[iarg + 1]); iarg += 1; } else - error->all(FLERR, "Unknown compute {} keyword: {}", style, arg[iarg]); + error->all(FLERR, errptr, "Unknown compute {} keyword: {}", style, arg[iarg]); } // delete replace list if not set @@ -244,72 +260,87 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : for (auto &val : values) { if (val.which == ArgInfo::X || val.which == ArgInfo::V || val.which == ArgInfo::F) { - if (input_mode == LOCAL) error->all(FLERR, "Compute {} inputs must be all local"); + if (input_mode == LOCAL) + error->all(FLERR, Error::NOPOINTER, "Compute {} inputs must be all local"); } else if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); + error->all(FLERR, val.iarg, "Compute ID {} for compute {} does not exist", val.id, style); if (input_mode == PERATOM) { if (!val.val.c->peratom_flag) - error->all(FLERR, "Compute {} compute {} does not calculate per-atom values", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate per-atom values", + style, val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate a per-atom vector", + style, val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a per-atom array", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate a per-atom array", + style, val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) - error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} array is accessed out-of-range{}", + style, val.id, utils::errorurl(20)); } else if (input_mode == LOCAL) { if (!val.val.c->local_flag) - error->all(FLERR, "Compute {} compute {} does not calculate local values", style, val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate local values", + style, val.id); if (val.argindex == 0 && val.val.c->size_local_cols != 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local vector", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate a local vector", + style, val.id); if (val.argindex && val.val.c->size_local_cols == 0) - error->all(FLERR, "Compute {} compute {} does not calculate a local array", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} does not calculate a local array", + style, val.id); if (val.argindex && val.argindex > val.val.c->size_local_cols) - error->all(FLERR, "Compute {} compute {} array is accessed out-of-range", style, val.id); + error->all(FLERR, val.iarg, "Compute {} compute {} array is accessed out-of-range{}", + style, val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR, "Fix ID {} for compute {} does not exist", val.id, style); + if (!val.val.f) + error->all(FLERR, val.iarg, "Fix ID {} for compute {} does not exist", val.id, style); if (input_mode == PERATOM) { if (!val.val.f->peratom_flag) - error->all(FLERR, "Compute {} fix {} does not calculate per-atom values", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate per-atom values", + style, val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a per-atom vector", style, - val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a per-atom vector", + style, val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a per-atom array", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a per-atom array", + style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) - error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", + style, val.id, utils::errorurl(20)); } else if (input_mode == LOCAL) { if (!val.val.f->local_flag) - error->all(FLERR, "Compute {} fix {} does not calculate local values", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate local values", + style, val.id); if (val.argindex == 0 && (val.val.f->size_local_cols != 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a local vector", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local vector", + style, val.id); if (val.argindex && (val.val.f->size_local_cols == 0)) - error->all(FLERR, "Compute {} fix {} does not calculate a local array", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local array", + style, val.id); if (val.argindex && (val.argindex > val.val.f->size_local_cols)) - error->all(FLERR, "Compute {} fix {} array is accessed out-of-range", style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", + style, val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::VARIABLE) { - if (input_mode == LOCAL) error->all(FLERR, "Compute {} inputs must be all local"); + if (input_mode == LOCAL) + error->all(FLERR, Error::NOPOINTER, "Compute {} inputs must be all local"); val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute {} does not exist", val.id, style); + error->all(FLERR, val.iarg, "Variable name {} for compute {} does not exist", val.id, + style); if (input->variable->atomstyle(val.val.v) == 0) - error->all(FLERR, "Compute {} variable {} is not atom-style variable", style, val.id); + error->all(FLERR, val.iarg, "Compute {} variable {} is not atom-style variable", style, + val.id); } } @@ -365,16 +396,20 @@ void ComputeReduce::init() if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR, "Compute ID {} for compute {} does not exist", val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute {} does not exist", + val.id, style); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR, "Fix ID {} for compute {} does not exist", val.id, style); + if (!val.val.f) + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute {} does not exist", + val.id, style); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute {} does not exist", val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for compute {} does not exist", + val.id, style); } } @@ -382,7 +417,9 @@ void ComputeReduce::init() if (idregion) { region = domain->get_region_by_id(idregion); - if (!region) error->all(FLERR, "Region {} for compute reduce/region does not exist", idregion); + if (!region) + error->all(FLERR, Error::NOLASTLINE, "Region {} for compute reduce/region does not exist", + idregion); } } @@ -586,7 +623,8 @@ double ComputeReduce::compute_one(int m, int flag) } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute {} not computed at " + "compatible time{}", val.id, style, utils::errorurl(7)); if (input_mode == PERATOM) { if (aidx == 0) { diff --git a/src/compute_reduce.h b/src/compute_reduce.h index f8b652e00c..ce575a4368 100644 --- a/src/compute_reduce.h +++ b/src/compute_reduce.h @@ -41,6 +41,7 @@ class ComputeReduce : public Compute { struct value_t { int which; int argindex; + int iarg; std::string id; union { class Compute *c; diff --git a/src/compute_reduce_chunk.cpp b/src/compute_reduce_chunk.cpp index 9ba0e30a8d..133932bb63 100644 --- a/src/compute_reduce_chunk.cpp +++ b/src/compute_reduce_chunk.cpp @@ -52,15 +52,17 @@ ComputeReduceChunk::ComputeReduceChunk(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[4], "max") == 0) mode = MAXX; else - error->all(FLERR, "Unknown compute reduce/chunk mode: {}", arg[4]); + error->all(FLERR, 4, "Unknown compute reduce/chunk mode: {}", arg[4]); - int iarg = 5; + const int ioffset = 5; + int iarg = ioffset; // expand args if any have wildcard character "*" int expand = 0; char **earg; - int nargnew = utils::expand_args(FLERR, narg - iarg, &arg[iarg], 1, earg, lmp); + int *amap = nullptr; + int nargnew = utils::expand_args(FLERR, narg - iarg, &arg[iarg], 1, earg, lmp, &amap); if (earg != &arg[iarg]) expand = 1; arg = earg; @@ -74,11 +76,13 @@ ComputeReduceChunk::ComputeReduceChunk(LAMMPS *lmp, int narg, char **arg) : value_t val; val.which = argi.get_type(); val.argindex = argi.get_index1(); + if (expand) val.iarg = amap[iarg] + ioffset; + else val.iarg = iarg + ioffset; val.id = argi.get_name(); val.val.c = nullptr; if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR, "Illegal compute reduce/chunk argument: {}", arg[iarg]); + error->all(FLERR, val.iarg, "Illegal compute reduce/chunk argument: {}", arg[iarg]); values.push_back(val); } @@ -96,40 +100,46 @@ ComputeReduceChunk::ComputeReduceChunk(LAMMPS *lmp, int narg, char **arg) : if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR, "Compute ID {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, val.iarg, "Compute ID {} for compute reduce/chunk does not exist", + val.id); if (!val.val.c->peratom_flag) - error->all(FLERR, "Compute reduce/chunk compute {} does not calculate per-atom values", - val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk compute {} does not calculate per-atom " + "values", val.id); if ((val.argindex == 0) && (val.val.c->size_peratom_cols != 0)) - error->all(FLERR, "Compute reduce/chunk compute {} does not calculate a per-atom vector", - val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk compute {} does not calculate a " + "per-atom vector", val.id); if (val.argindex && (val.val.c->size_peratom_cols == 0)) - error->all(FLERR, "Compute reduce/chunk compute {} does not calculate a per-atom array", - val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk compute {} does not calculate a " + "per-atom array", val.id); if (val.argindex && (val.argindex > val.val.c->size_peratom_cols)) - error->all(FLERR, "Compute reduce/chunk compute array {} is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk compute array {} is accessed " + "out-of-range{}", val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) - error->all(FLERR, "Fix ID {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, val.iarg, "Fix ID {} for compute reduce/chunk does not exist", val.id); if (!val.val.f->peratom_flag) - error->all(FLERR, "Compute reduce/chunk fix {} does not calculate per-atom values", val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk fix {} does not calculate per-atom " + "values", val.id); if ((val.argindex == 0) && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, "Compute reduce/chunk fix {} does not calculate a per-atom vector", - val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk fix {} does not calculate a per-atom " + "vector", val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) - error->all(FLERR, "Compute reduce/chunk fix {} does not calculate a per-atom array", - val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk fix {} does not calculate a per-atom " + "array", val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) - error->all(FLERR, "Compute reduce/chunk fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute reduce/chunk fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, val.iarg, "Variable name {} for compute reduce/chunk does not exist", + val.id); if (input->variable->atomstyle(val.val.v) == 0) - error->all(FLERR, "Compute reduce/chunk variable is not atom-style variable"); + error->all(FLERR, val.iarg, "Compute reduce/chunk variable {} is not atom-style variable", + val.id); } } @@ -186,17 +196,20 @@ void ComputeReduceChunk::init() if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR, "Compute ID {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, + "Compute ID {} for compute reduce/chunk does not exist", val.id); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) - error->all(FLERR, "Fix ID {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute reduce/chunk does not exist", + val.id); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute reduce/chunk does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for compute reduce/chunk does not " + "exist", val.id); } } } @@ -317,7 +330,8 @@ void ComputeReduceChunk::compute_one(int m, double *vchunk, int nstride) } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR, "Fix used in compute reduce/chunk not computed at compatible time"); + error->all(FLERR, Error::NOLASTLINE, "Fix used in compute reduce/chunk not computed at " + "compatible time{}", utils::errorurl(7)); if (val.argindex == 0) { double *vfix = val.val.f->vector_atom; diff --git a/src/compute_reduce_chunk.h b/src/compute_reduce_chunk.h index 4055956d2d..18cbe40526 100644 --- a/src/compute_reduce_chunk.h +++ b/src/compute_reduce_chunk.h @@ -38,6 +38,7 @@ class ComputeReduceChunk : public ComputeChunk { struct value_t { int which; int argindex; + int iarg; std::string id; union { class Compute *c; diff --git a/src/compute_slice.cpp b/src/compute_slice.cpp index 9851c430c4..8a44d2bc8e 100644 --- a/src/compute_slice.cpp +++ b/src/compute_slice.cpp @@ -34,9 +34,10 @@ ComputeSlice::ComputeSlice(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, nar nstop = utils::inumeric(FLERR, arg[4], false, lmp); nskip = utils::inumeric(FLERR, arg[5], false, lmp); - if (nstart < 1) error->all(FLERR, "Invalid compute slice nstart value {} < 1", nstart); - if (nstop < nstart) error->all(FLERR, "Invalid compute slice nstop value {} < {}", nstop, nstart); - if (nskip < 1) error->all(FLERR, "Invalid compute slice nskip value < 1: {}", nskip); + if (nstart < 1) error->all(FLERR, 3, "Invalid compute slice nstart value {} < 1", nstart); + if (nstop < nstart) + error->all(FLERR, 4, "Invalid compute slice nstop value {} < {}", nstop, nstart); + if (nskip < 1) error->all(FLERR, 5, "Invalid compute slice nskip value < 1: {}", nskip); // parse values @@ -47,11 +48,12 @@ ComputeSlice::ComputeSlice(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, nar value_t val; val.which = argi.get_type(); val.argindex = argi.get_index1(); + val.iarg = iarg; val.id = argi.get_name(); val.val.c = nullptr; if ((val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR, "Illegal compute slice argument: {}", arg[iarg]); + error->all(FLERR, iarg, "Illegal compute slice argument: {}", arg[iarg]); values.push_back(val); } @@ -61,49 +63,63 @@ ComputeSlice::ComputeSlice(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, nar for (auto &val : values) { if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); - if (!val.val.c) error->all(FLERR, "Compute ID {} for compute slice does not exist", val.id); + if (!val.val.c) + error->all(FLERR, val.iarg, "Compute ID {} for compute slice does not exist", val.id); if (val.val.c->vector_flag) { if (val.argindex) - error->all(FLERR, "Compute slice compute {} does not calculate a global array", val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} does not calculate a global array", + val.id); if (nstop > val.val.c->size_vector) - error->all(FLERR, "Compute slice compute {} vector is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.val.c->array_flag) { if (val.argindex == 0) - error->all(FLERR, "Compute slice compute {} does not calculate a global vector", val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} does not calculate a global vector", + val.id); if (val.argindex > val.val.c->size_array_cols) - error->all(FLERR, "Compute slice compute {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nstop > val.val.c->size_array_rows) - error->all(FLERR, "Compute slice compute {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else { - error->all(FLERR, "Compute slice compute {} does not calculate global vector or array", - val.id); + error->all(FLERR, val.iarg, "Compute slice compute {} does not calculate global vector or " + "array", val.id); } } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR, "Fix ID {} for compute slice does not exist", val.id); + if (!val.val.f) + error->all(FLERR, val.iarg, "Fix ID {} for compute slice does not exist", val.id); if (val.val.f->vector_flag) { if (val.argindex) - error->all(FLERR, "Compute slice fix {} does not calculate a global array", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} does not calculate a global array", + val.id); if (nstop > val.val.f->size_vector) - error->all(FLERR, "Compute slice fix {} vector is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.val.f->array_flag) { if (val.argindex == 0) - error->all(FLERR, "Compute slice fix {} does not calculate a global vector", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} does not calculate a global vector", + val.id); if (val.argindex > val.val.f->size_array_cols) - error->all(FLERR, "Compute slice fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nstop > val.val.f->size_array_rows) - error->all(FLERR, "Compute slice fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else { - error->all(FLERR, "Compute slice fix {} does not calculate global vector or array", val.id); + error->all(FLERR, val.iarg, "Compute slice fix {} does not calculate global vector or " + "array", val.id); } } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute slice does not exist", val.id); + error->all(FLERR, val.iarg, "Variable name {} for compute slice does not exist", val.id); if (val.argindex == 0 && input->variable->vectorstyle(val.val.v) == 0) - error->all(FLERR, "Compute slice variable {} is not vector-style variable", val.id); + error->all(FLERR, val.iarg, "Compute slice variable {} is not vector-style variable", + val.id); if (val.argindex) - error->all(FLERR, "Compute slice vector variable {} cannot be indexed", val.id); + error->all(FLERR, val.iarg, "Compute slice vector variable {} cannot be indexed", val.id); } } @@ -195,14 +211,18 @@ void ComputeSlice::init() for (auto &val : values) { if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); - if (!val.val.c) error->all(FLERR, "Compute ID {} for compute slice does not exist", val.id); + if (!val.val.c) + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute slice does not exist", + val.id); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR, "Fix ID {} for compute slice does not exist", val.id); + if (!val.val.f) + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute slice does not exist", val.id); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, "Variable name {} for compute slice does not exist", val.id); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for compute slice does not exist", + val.id); } } } @@ -267,7 +287,8 @@ void ComputeSlice::extract_one(int m, double *vec, int stride) } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->global_freq) - error->all(FLERR, "Fix {} used in compute slice not computed at compatible time", val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute slice not computed at " + "compatible time{}", val.id, utils::errorurl(7)); if (val.argindex == 0) { int j = 0; @@ -289,7 +310,8 @@ void ComputeSlice::extract_one(int m, double *vec, int stride) } else if (val.which == ArgInfo::VARIABLE) { double *varvec; int nvec = input->variable->compute_vector(val.val.v, &varvec); - if (nvec < nstop) error->all(FLERR, "Compute slice variable {} is not long enough", val.id); + if (nvec < nstop) + error->all(FLERR, Error::NOLASTLINE, "Compute slice variable {} is not long enough", val.id); int j = 0; for (int i = nstart; i < nstop; i += nskip) { vec[j] = varvec[i - 1]; diff --git a/src/compute_slice.h b/src/compute_slice.h index c1575f4fc8..ddb8a7b45e 100644 --- a/src/compute_slice.h +++ b/src/compute_slice.h @@ -36,6 +36,7 @@ class ComputeSlice : public Compute { struct value_t { int which; int argindex; + int iarg; std::string id; union { class Compute *c; diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 5c86b390ac..56836b8446 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -68,13 +68,15 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : clearstep = 1; nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal dump {} command: output frequency must be > 0", style); + if (nevery <= 0) + error->all(FLERR, 3, "Illegal dump {} command: output frequency must be > 0", style); // expand args if any have wildcard character "*" // ok to include trailing optional args, // so long as they do not have "*" between square brackets // nfield may be shrunk below if extra optional args exist + int ioffset = 5; expand = 0; nfield = nargnew = utils::expand_args(FLERR,narg-5,&arg[5],1,earg,lmp); if (earg != &arg[5]) expand = 1; @@ -446,7 +448,8 @@ void DumpCustom::init_style() fix[i] = modify->get_fix_by_id(id_fix[i]); if (!fix[i]) error->all(FLERR,"Could not find dump {} fix ID {}", style, id_fix[i]); if (nevery % fix[i]->peratom_freq) - error->all(FLERR,"Dump {} and fix not computed at compatible times", style); + error->all(FLERR,"Dump {} and fix not computed at compatible times{}", style, + utils::errorurl(7)); } for (i = 0; i < nvariable; i++) { @@ -460,7 +463,7 @@ void DumpCustom::init_style() for (int i = 0; i < ncustom; i++) { icustom = atom->find_custom(id_custom[i],flag,cols); if (icustom < 0) - error->all(FLERR,"Could not find dump {} atom property name", style); + error->all(FLERR, "Could not find dump {} atom property name", style); custom[i] = icustom; if (!flag && !cols) custom_flag[i] = IVEC; else if (flag && !cols) custom_flag[i] = DVEC; @@ -482,7 +485,8 @@ void DumpCustom::init_style() void DumpCustom::write_header(bigint ndump) { - if (!header_choice) error->all(FLERR, "Must not use 'run pre no' after creating a new dump"); + if (!header_choice) + error->all(FLERR, Error::NOLASTLINE, "Must not use 'run pre no' after creating a new dump"); if (multiproc) (this->*header_choice)(ndump); else if (me == 0) (this->*header_choice)(ndump); @@ -742,7 +746,8 @@ int DumpCustom::count() if (ncompute) { for (i = 0; i < ncompute; i++) { if (!compute[i]->is_initialized()) - error->all(FLERR,"Dump compute ID {} cannot be invoked before initialization by a run", + error->all(FLERR, Error::NOLASTLINE, + "Dump compute ID {} cannot be invoked before initialization by a run", compute[i]->id); if (!(compute[i]->invoked_flag & Compute::INVOKED_PERATOM)) { compute[i]->compute_peratom(); @@ -800,7 +805,7 @@ int DumpCustom::count() nstride = 1; } else if (thresh_array[ithresh] == MOL) { if (!atom->molecule_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); tagint *molecule = atom->molecule; for (i = 0; i < nlocal; i++) dchoose[i] = molecule[i]; @@ -1074,39 +1079,44 @@ int DumpCustom::count() } else if (thresh_array[ithresh] == Q) { if (!atom->q_flag) - error->all(FLERR,"Threshold for an atom property that isn't allocated"); + error->all(FLERR, Error::NOLASTLINE, + "Threshold for an atom property that isn't allocated"); ptr = atom->q; nstride = 1; } else if (thresh_array[ithresh] == MUX) { if (!atom->mu_flag) - error->all(FLERR,"Threshold for an atom property that isn't allocated"); + error->all(FLERR, Error::NOLASTLINE, + "Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][0]; nstride = 4; } else if (thresh_array[ithresh] == MUY) { if (!atom->mu_flag) - error->all(FLERR,"Threshold for an atom property that isn't allocated"); + error->all(FLERR, Error::NOLASTLINE, + "Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][1]; nstride = 4; } else if (thresh_array[ithresh] == MUZ) { if (!atom->mu_flag) - error->all(FLERR,"Threshold for an atom property that isn't allocated"); + error->all(FLERR, Error::NOLASTLINE, + "Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][2]; nstride = 4; } else if (thresh_array[ithresh] == MU) { if (!atom->mu_flag) - error->all(FLERR,"Threshold for an atom property that isn't allocated"); + error->all(FLERR, Error::NOLASTLINE, + "Threshold for an atom property that isn't allocated"); ptr = &atom->mu[0][3]; nstride = 4; } else if (thresh_array[ithresh] == RADIUS) { if (!atom->radius_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = atom->radius; nstride = 1; } else if (thresh_array[ithresh] == DIAMETER) { if (!atom->radius_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); double *radius = atom->radius; for (i = 0; i < nlocal; i++) dchoose[i] = 2.0*radius[i]; @@ -1114,55 +1124,55 @@ int DumpCustom::count() nstride = 1; } else if (thresh_array[ithresh] == OMEGAX) { if (!atom->omega_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->omega[0][0]; nstride = 3; } else if (thresh_array[ithresh] == OMEGAY) { if (!atom->omega_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->omega[0][1]; nstride = 3; } else if (thresh_array[ithresh] == OMEGAZ) { if (!atom->omega_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->omega[0][2]; nstride = 3; } else if (thresh_array[ithresh] == ANGMOMX) { if (!atom->angmom_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->angmom[0][0]; nstride = 3; } else if (thresh_array[ithresh] == ANGMOMY) { if (!atom->angmom_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->angmom[0][1]; nstride = 3; } else if (thresh_array[ithresh] == ANGMOMZ) { if (!atom->angmom_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->angmom[0][2]; nstride = 3; } else if (thresh_array[ithresh] == TQX) { if (!atom->torque_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->torque[0][0]; nstride = 3; } else if (thresh_array[ithresh] == TQY) { if (!atom->torque_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->torque[0][1]; nstride = 3; } else if (thresh_array[ithresh] == TQZ) { if (!atom->torque_flag) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Threshold for an atom property that isn't allocated"); ptr = &atom->torque[0][2]; nstride = 3; diff --git a/src/dump_local.cpp b/src/dump_local.cpp index 7394ec4481..ac09768422 100644 --- a/src/dump_local.cpp +++ b/src/dump_local.cpp @@ -19,6 +19,7 @@ #include "domain.h" #include "error.h" #include "fix.h" +#include "input.h" #include "memory.h" #include "modify.h" #include "update.h" @@ -43,10 +44,10 @@ DumpLocal::DumpLocal(LAMMPS *lmp, int narg, char **arg) : clearstep = 1; nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal dump local command"); + if (nevery <= 0) error->all(FLERR, 3, "Dump local nevery value {} must be > 0", nevery); if (binary) - error->all(FLERR,"Binary files are not supported with dump local"); + error->all(FLERR, 2, "Binary files are not supported with dump local"); nfield = narg - 5; @@ -170,7 +171,7 @@ void DumpLocal::init_style() columns = utils::strdup(combined); if (sort_flag && sortcol == 0) - error->all(FLERR,"Dump local cannot sort by atom ID"); + error->all(FLERR, Error::NOLASTLINE, "Dump local cannot sort by atom ID"); // format = copy of default or user-specified line format @@ -185,7 +186,7 @@ void DumpLocal::init_style() auto words = utils::split_words(format); if ((int) words.size() < size_one) - error->all(FLERR,"Dump_modify format line is too short: {}", format); + error->all(FLERR, Error::NOLASTLINE, "Dump_modify format line is too short: {}", format); int i=0; for (const auto &word : words) { @@ -218,14 +219,17 @@ void DumpLocal::init_style() for (i = 0; i < ncompute; i++) { compute[i] = modify->get_compute_by_id(id_compute[i]); - if (!compute[i]) error->all(FLERR,"Could not find dump local compute ID {}",id_compute[i]); + if (!compute[i]) + error->all(FLERR, Error::NOLASTLINE, "Could not find dump local compute ID {}",id_compute[i]); } for (i = 0; i < nfix; i++) { fix[i] = modify->get_fix_by_id(id_fix[i]); - if (!fix[i]) error->all(FLERR,"Could not find dump local fix ID {}", id_fix[i]); + if (!fix[i]) + error->all(FLERR, Error::NOLASTLINE, "Could not find dump local fix ID {}", id_fix[i]); if (nevery % fix[i]->local_freq) - error->all(FLERR,"Dump local and fix {} not computed at compatible times", id_fix[i]); + error->all(FLERR, Error::NOLASTLINE, "Dump local and fix {} not computed at " + "compatible times{}", id_fix[i], utils::errorurl(7)); } // open single file, one time only @@ -237,13 +241,17 @@ void DumpLocal::init_style() int DumpLocal::modify_param(int narg, char **arg) { + // determine offset in list of arguments for error pointer. also handle the no match case. + int argoff = 0; + while (input && input->arg[argoff] && (strcmp(input->arg[argoff], arg[0]) != 0)) argoff++; + if (strcmp(arg[0],"label") == 0) { - if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); + if (narg < 2) utils::missing_cmd_args(FLERR,"dump_modify label", error); delete[] label; label = utils::strdup(arg[1]); return 2; } else if (strcmp(arg[0],"format") == 0) { - if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); + if (narg < 2) utils::missing_cmd_args(FLERR, "dump_modify format", error); if (strcmp(arg[1],"none") == 0) { // just clear format_column_user allocated by this dump child class @@ -262,7 +270,7 @@ int DumpLocal::modify_param(int narg, char **arg) // use of &str[1] removes leading '%' from BIGINT_FORMAT string char *ptr = strchr(format_int_user,'d'); if (ptr == nullptr) - error->all(FLERR, "Dump_modify int format does not contain d character"); + error->all(FLERR, argoff + 2, "Dump_modify int format does not contain d character"); char str[8]; snprintf(str,8,"%s",BIGINT_FORMAT); *ptr = '\0'; @@ -276,7 +284,7 @@ int DumpLocal::modify_param(int narg, char **arg) } else { int i = utils::inumeric(FLERR,arg[1],false,lmp) - 1; if (i < 0 || i >= nfield) - error->all(FLERR,"Illegal dump_modify command"); + error->all(FLERR, 1, "Illegal dump_modify format column number {}", i); delete[] format_column_user[i]; format_column_user[i] = utils::strdup(arg[2]); } @@ -330,8 +338,9 @@ int DumpLocal::count() if (ncompute) { for (i = 0; i < ncompute; i++) { if (!compute[i]->is_initialized()) - error->all(FLERR,"Dump compute ID {} cannot be invoked before initialization by a run", - compute[i]->id); + error->all(FLERR, Error::NOLASTLINE, + "Dump compute ID {} cannot be invoked before initialization by a run", + compute[i]->id); if (!(compute[i]->invoked_flag & Compute::INVOKED_LOCAL)) { compute[i]->compute_local(); compute[i]->invoked_flag |= Compute::INVOKED_LOCAL; @@ -347,14 +356,14 @@ int DumpLocal::count() for (i = 0; i < ncompute; i++) { if (nmine < 0) nmine = compute[i]->size_local_rows; else if (nmine != compute[i]->size_local_rows) - error->one(FLERR, + error->one(FLERR, Error::NOLASTLINE, "Dump local count is not consistent across input fields"); } for (i = 0; i < nfix; i++) { if (nmine < 0) nmine = fix[i]->size_local_rows; else if (nmine != fix[i]->size_local_rows) - error->one(FLERR, + error->one(FLERR, Error::NOLASTLINE, "Dump local count is not consistent across input fields"); } @@ -442,11 +451,16 @@ void DumpLocal::write_lines(int n, double *mybuf) void DumpLocal::parse_fields(int narg, char **arg) { + // determine offset in list of arguments for error pointer. + int argoff = 0; + while (input && input->arg[argoff] && (strcmp(input->arg[argoff], arg[0]) != 0)) argoff++; + int computefixflag = 0; // customize by adding to if statement for (int iarg = 0; iarg < narg; iarg++) { + int errptr = iarg + argoff; if (strcmp(arg[iarg],"index") == 0) { pack_choice[iarg] = &DumpLocal::pack_index; @@ -470,15 +484,16 @@ void DumpLocal::parse_fields(int narg, char **arg) pack_choice[iarg] = &DumpLocal::pack_compute; icompute = modify->get_compute_by_id(name); - if (!icompute) error->all(FLERR,"Could not find dump local compute ID {}",name); + if (!icompute) error->all(FLERR, errptr, "Could not find dump local compute ID {}", name); if (icompute->local_flag == 0) - error->all(FLERR,"Dump local compute {} does not compute local info", name); + error->all(FLERR, errptr, "Dump local compute {} does not compute local info", name); if (argi.get_dim() == 0 && icompute->size_local_cols > 0) - error->all(FLERR,"Dump local compute {} does not calculate local vector", name); + error->all(FLERR, errptr, "Dump local compute {} does not calculate local vector", name); if (argi.get_index1() > 0 && icompute->size_local_cols == 0) - error->all(FLERR,"Dump local compute {} does not calculate local array", name); + error->all(FLERR, errptr, "Dump local compute {} does not calculate local array", name); if (argi.get_index1() > 0 && argi.get_index1() > icompute->size_local_cols) - error->all(FLERR,"Dump local compute {} vector is accessed out-of-range", name); + error->all(FLERR, errptr, "Dump local compute {} vector is accessed out-of-range{}", + name, utils::errorurl(20)); field2index[iarg] = add_compute(name); break; @@ -490,15 +505,16 @@ void DumpLocal::parse_fields(int narg, char **arg) pack_choice[iarg] = &DumpLocal::pack_fix; ifix = modify->get_fix_by_id(name); - if (!ifix) error->all(FLERR,"Could not find dump local fix ID {}", name); + if (!ifix) error->all(FLERR, errptr, "Could not find dump local fix ID {}", name); if (ifix->local_flag == 0) - error->all(FLERR,"Dump local fix {} does not compute local info", name); + error->all(FLERR, errptr, "Dump local fix {} does not compute local info", name); if (argi.get_dim() == 0 && ifix->size_local_cols > 0) - error->all(FLERR,"Dump local fix {} does not compute local vector", name); + error->all(FLERR, errptr, "Dump local fix {} does not compute local vector", name); if (argi.get_index1() > 0 && ifix->size_local_cols == 0) - error->all(FLERR,"Dump local fix {} does not compute local array", name); + error->all(FLERR, errptr, "Dump local fix {} does not compute local array", name); if (argi.get_index1() > 0 && argi.get_index1() > ifix->size_local_cols) - error->all(FLERR,"Dump local fix {} vector is accessed out-of-range", name); + error->all(FLERR, errptr, "Dump local fix {} vector is accessed out-of-range{}", name, + utils::errorurl(20)); field2index[iarg] = add_fix(name); break; @@ -506,14 +522,14 @@ void DumpLocal::parse_fields(int narg, char **arg) case ArgInfo::NONE: // fallthrough case ArgInfo::UNKNOWN: // fallthrough default: - error->all(FLERR,"Invalid attribute {} in dump local command",arg[iarg]); + error->all(FLERR, errptr, "Invalid attribute {} in dump local command",arg[iarg]); break; } } } if (computefixflag == 0) - error->all(FLERR,"Dump local attributes contain no compute or fix"); + error->all(FLERR, Error::NOPOINTER, "Dump local attributes contain no compute or fix"); } /* ---------------------------------------------------------------------- diff --git a/src/fix_ave_atom.cpp b/src/fix_ave_atom.cpp index 1a578f527e..bd30509e0f 100644 --- a/src/fix_ave_atom.cpp +++ b/src/fix_ave_atom.cpp @@ -127,29 +127,40 @@ FixAveAtom::FixAveAtom(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); - if (!val.val.c) error->all(FLERR, val.iarg, "Compute ID {} for fix ave/atom does not exist", val.id); + if (!val.val.c) + error->all(FLERR, val.iarg, "Compute ID {} for fix ave/atom does not exist", val.id); if (val.val.c->peratom_flag == 0) - error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate per-atom values", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate per-atom values", + val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate a per-atom vector", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate a per-atom vector", + val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate a per-atom array", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom compute {} does not calculate a per-atom array", + val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) - error->all(FLERR, val.iarg, "Fix ave/atom compute {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom compute {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); - if (!val.val.f) error->all(FLERR, val.iarg, "Fix ID {} for fix ave/atom does not exist", val.id); + if (!val.val.f) + error->all(FLERR, val.iarg, "Fix ID {} for fix ave/atom does not exist", val.id); if (val.val.f->peratom_flag == 0) - error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate per-atom values", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate per-atom values", + val.id); if (val.argindex == 0 && val.val.f->size_peratom_cols != 0) - error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate a per-atom vector", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate a per-atom vector", + val.id); if (val.argindex && val.val.f->size_peratom_cols == 0) - error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate a per-atom array", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom fix {} does not calculate a per-atom array", + val.id); if (val.argindex && val.argindex > val.val.f->size_peratom_cols) - error->all(FLERR, val.iarg, "Fix ave/atom fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/atom fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->peratom_freq) - error->all(FLERR, val.iarg, "Fix {} for fix ave/atom not computed at compatible time", val.id); + error->all(FLERR, val.iarg, "Fix {} for fix ave/atom not computed at compatible time{}", + val.id, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); diff --git a/src/fix_ave_chunk.cpp b/src/fix_ave_chunk.cpp index e713842872..f2d324a073 100644 --- a/src/fix_ave_chunk.cpp +++ b/src/fix_ave_chunk.cpp @@ -262,32 +262,40 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : if (!val.val.c) error->all(FLERR, val.iarg, "Compute ID {} for fix ave/chunk does not exist",val.id); if (val.val.c->peratom_flag == 0) - error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate per-atom values",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate per-atom values", + val.id); if (val.argindex == 0 && (val.val.c->size_peratom_cols != 0)) - error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate a per-atom vector",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate a per-atom vector", + val.id); if (val.argindex && (val.val.c->size_peratom_cols == 0)) - error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate a per-atom array",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk compute {} does not calculate a per-atom array", + val.id); if (val.argindex && (val.argindex > val.val.c->size_peratom_cols)) - error->all(FLERR, val.iarg, "Fix ave/chunk compute {} vector is accessed out-of-range",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk compute {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) error->all(FLERR, val.iarg, "Fix ID {} for fix ave/chunk does not exist",val.id); if (val.val.f->peratom_flag == 0) - error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate per-atom values",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate per-atom values", + val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) - error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate a per-atom vector",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate a per-atom vector", + val.id); if (val.argindex && (val.val.f->size_peratom_cols == 0)) - error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate a per-atom array",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk fix {} does not calculate a per-atom array", + val.id); if (val.argindex && val.argindex > val.val.f->size_peratom_cols) - error->all(FLERR, val.iarg, "Fix ave/chunk fix {} vector is accessed out-of-range",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); if (val.val.v < 0) - error->all(FLERR, val.iarg, "Variable name {} for fix ave/chunk does not exist",val.id); + error->all(FLERR, val.iarg, "Variable name {} for fix ave/chunk does not exist", val.id); if (input->variable->atomstyle(val.val.v) == 0) - error->all(FLERR, val.iarg, "Fix ave/chunk variable {} is not atom-style variable",val.id); + error->all(FLERR, val.iarg, "Fix ave/chunk variable {} is not atom-style variable", val.id); } } @@ -297,8 +305,8 @@ FixAveChunk::FixAveChunk(LAMMPS *lmp, int narg, char **arg) : cchunk = dynamic_cast(modify->get_compute_by_id(idchunk)); if (!cchunk) - error->all(FLERR, 6, "Chunk/atom compute {} does not exist or is incorrect style for fix ave/chunk", - idchunk); + error->all(FLERR, 6, "Chunk/atom compute {} does not exist or is incorrect style for " + "fix ave/chunk", idchunk); if ((nrepeat > 1) || (ave == RUNNING) || (ave == WINDOW)) cchunk->lockcount++; lockforever = 0; @@ -445,7 +453,8 @@ void FixAveChunk::init() if (biasflag) { tbias = modify->get_compute_by_id(id_bias); if (!tbias) - error->all(FLERR,"Could not find compute ID {} for temperature bias", id_bias); + error->all(FLERR, Error::NOLASTLINE, "Could not find compute ID {} for temperature bias", + id_bias); } for (auto &val : values) { @@ -460,8 +469,8 @@ void FixAveChunk::init() error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for fix ave/chunk does not exist", val.id); if (nevery % val.val.f->peratom_freq) - error->all(FLERR, Error::NOLASTLINE, "Fix {} for fix ave/chunk not computed at compatible time", - val.id); + error->all(FLERR, Error::NOLASTLINE, "Fix {} for fix ave/chunk not computed at " + "compatible time{}", val.id, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); diff --git a/src/fix_ave_correlate.cpp b/src/fix_ave_correlate.cpp index a48788b777..9b2291b3d9 100644 --- a/src/fix_ave_correlate.cpp +++ b/src/fix_ave_correlate.cpp @@ -55,9 +55,10 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : // expand args if any have wildcard character "*" - const int ioffset = 6; + int ioffset = 6; int expand = 0; char **earg; + char **oarg = arg; int *amap = nullptr; int nargnew = utils::expand_args(FLERR, narg - ioffset, &arg[ioffset], 0, earg, lmp, &amap); @@ -99,7 +100,12 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : char *title2 = nullptr; char *title3 = nullptr; + for (int i = 0; i < narg; ++i) { + if (strcmp(oarg[i],arg[iarg]) == 0) + ioffset = i - iarg; + } while (iarg < nargnew) { + int errptr = iarg + ioffset; if (strcmp(arg[iarg],"type") == 0) { if (iarg+2 > nargnew) utils::missing_cmd_args(FLERR, "fix ave/correlate type", error); if (strcmp(arg[iarg+1],"auto") == 0) type = AUTO; @@ -109,13 +115,13 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg+1],"auto/lower") == 0) type = AUTOLOWER; else if (strcmp(arg[iarg+1],"full") == 0) type = FULL; else if (strcmp(arg[iarg+1], "first") == 0) type = FIRST; - else error->all(FLERR, iarg+1, "Unknown fix ave/correlate type: {}"); + else error->all(FLERR, errptr + 1, "Unknown fix ave/correlate type: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"ave") == 0) { if (iarg+2 > nargnew) utils::missing_cmd_args(FLERR, "fix ave/correlate ave", error); if (strcmp(arg[iarg+1],"one") == 0) ave = ONE; else if (strcmp(arg[iarg+1],"running") == 0) ave = RUNNING; - else error->all(FLERR, iarg+1, "Unknown fix ave/correlate ave mode: {}", arg[iarg+1]); + else error->all(FLERR, errptr+1, "Unknown fix ave/correlate ave mode: {}", arg[iarg+1]); iarg += 2; } else if (strcmp(arg[iarg],"start") == 0) { if (iarg+2 > nargnew) utils::missing_cmd_args(FLERR, "fix ave/correlate start", error); @@ -130,7 +136,7 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : if (comm->me == 0) { fp = fopen(arg[iarg+1],"w"); if (fp == nullptr) - error->one(FLERR, iarg+1, "Cannot open fix ave/correlate file {}:"" {}", arg[iarg+1], + error->one(FLERR, errptr+1, "Cannot open fix ave/correlate file {}:"" {}", arg[iarg+1], utils::getsyserror()); } iarg += 2; @@ -152,7 +158,7 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : delete[] title3; title3 = utils::strdup(arg[iarg+1]); iarg += 2; - } else error->all(FLERR, iarg, "Unkown fix ave/correlate keyword: {}", arg[iarg]); + } else error->all(FLERR, errptr, "Unkown fix ave/correlate keyword: {}", arg[iarg]); } // setup and error check From 643afe6eff03abcc183a4abf58a7569af3396763 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 19 Mar 2025 20:28:42 -0400 Subject: [PATCH 46/99] fix segfault issue for optional arguments --- src/compute_reduce.cpp | 62 +++++++++++++++++++++------------------ src/fix_ave_correlate.cpp | 10 +++++-- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/compute_reduce.cpp b/src/compute_reduce.cpp index 622e568200..385e6f300b 100644 --- a/src/compute_reduce.cpp +++ b/src/compute_reduce.cpp @@ -143,8 +143,10 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : val.id = ""; val.val.c = nullptr; - if (expand) val.iarg = amap[iarg] + ioffset; - else val.iarg = iarg + ioffset; + if (expand) + val.iarg = amap[iarg] + ioffset; + else + val.iarg = iarg + ioffset; if (strcmp(arg[iarg], "x") == 0) { val.which = ArgInfo::X; @@ -201,9 +203,11 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : std::string mycmd = "compute "; mycmd += style; - for (int i = 0; i < narg; ++i) { - if (strcmp(oarg[i],arg[nvalues]) == 0) - ioffset = i - nvalues; + // get argument offset if optional arguments are present + if (nvalues < nargnew) { + for (int i = 0; i < narg; ++i) { + if (strcmp(oarg[i], arg[nvalues]) == 0) ioffset = i - nvalues; + } } for (int iarg = nvalues; iarg < nargnew; iarg++) { int errptr = iarg + ioffset; @@ -214,15 +218,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : int col1 = utils::inumeric(FLERR, arg[iarg + 1], false, lmp) - 1; int col2 = utils::inumeric(FLERR, arg[iarg + 2], false, lmp) - 1; if ((col1 < 0) || (col1 >= nvalues)) - error->all(FLERR, errptr + 1, "Invalid compute {} replace first column index {}", - style, col1); + error->all(FLERR, errptr + 1, "Invalid compute {} replace first column index {}", style, + col1); if ((col2 < 0) || (col2 >= nvalues)) - error->all(FLERR, errptr + 2, "Invalid compute {} replace second column index {}", - style, col2); + error->all(FLERR, errptr + 2, "Invalid compute {} replace second column index {}", style, + col2); if (col1 == col2) error->all(FLERR, errptr, "Compute {} replace columns must be different"); if ((replace[col1] >= 0) || (replace[col2] >= 0)) - error->all(FLERR, errptr, - "Compute {} replace column already used for another replacement"); + error->all(FLERR, errptr, "Compute {} replace column already used for another replacement"); replace[col1] = col2; iarg += 2; } else if (strcmp(arg[iarg], "inputs") == 0) { @@ -304,8 +307,8 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : if (input_mode == PERATOM) { if (!val.val.f->peratom_flag) - error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate per-atom values", - style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate per-atom values", style, + val.id); if (val.argindex == 0 && (val.val.f->size_peratom_cols != 0)) error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a per-atom vector", style, val.id); @@ -313,22 +316,22 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a per-atom array", style, val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) - error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", - style, val.id, utils::errorurl(20)); + error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", style, + val.id, utils::errorurl(20)); } else if (input_mode == LOCAL) { if (!val.val.f->local_flag) - error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate local values", - style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate local values", style, + val.id); if (val.argindex == 0 && (val.val.f->size_local_cols != 0)) - error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local vector", - style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local vector", style, + val.id); if (val.argindex && (val.val.f->size_local_cols == 0)) - error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local array", - style, val.id); + error->all(FLERR, val.iarg, "Compute {} fix {} does not calculate a local array", style, + val.id); if (val.argindex && (val.argindex > val.val.f->size_local_cols)) - error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", - style, val.id, utils::errorurl(20)); + error->all(FLERR, val.iarg, "Compute {} fix {} array is accessed out-of-range{}", style, + val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::VARIABLE) { @@ -396,14 +399,14 @@ void ComputeReduce::init() if (val.which == ArgInfo::COMPUTE) { val.val.c = modify->get_compute_by_id(val.id); if (!val.val.c) - error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute {} does not exist", - val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Compute ID {} for compute {} does not exist", val.id, + style); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); if (!val.val.f) - error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute {} does not exist", - val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for compute {} does not exist", val.id, + style); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); @@ -623,8 +626,9 @@ double ComputeReduce::compute_one(int m, int flag) } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute {} not computed at " - "compatible time{}", val.id, style, utils::errorurl(7)); + error->all(FLERR, Error::NOLASTLINE, + "Fix {} used in compute {} not computed at compatible time{}", val.id, style, + utils::errorurl(7)); if (input_mode == PERATOM) { if (aidx == 0) { diff --git a/src/fix_ave_correlate.cpp b/src/fix_ave_correlate.cpp index 9b2291b3d9..bc936ae515 100644 --- a/src/fix_ave_correlate.cpp +++ b/src/fix_ave_correlate.cpp @@ -100,10 +100,14 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : char *title2 = nullptr; char *title3 = nullptr; - for (int i = 0; i < narg; ++i) { - if (strcmp(oarg[i],arg[iarg]) == 0) - ioffset = i - iarg; + // get argument offset if optional arguments are present + if (iarg < nargnew) { + for (int i = 0; i < narg; ++i) { + if (strcmp(oarg[i],arg[iarg]) == 0) + ioffset = i - iarg; + } } + while (iarg < nargnew) { int errptr = iarg + ioffset; if (strcmp(arg[iarg],"type") == 0) { From ca575e395e875d59300e11520cc8e634cf1d1283 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 19 Mar 2025 20:39:06 -0400 Subject: [PATCH 47/99] fix spelling and duplicate references issues --- doc/src/Howto_moltemplate.rst | 30 ++++++++++----------- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/doc/src/Howto_moltemplate.rst b/doc/src/Howto_moltemplate.rst index b8c021ceef..470f76ded0 100644 --- a/doc/src/Howto_moltemplate.rst +++ b/doc/src/Howto_moltemplate.rst @@ -1,16 +1,16 @@ Moltemplate Tutorial ==================== -In this tutorial, we are going to use the tool :ref:`Moltemplate` -to set up a classical molecular dynamic simulation using -the :ref:`OPLS-AA force field `. The first -task is to describe an organic compound and create a complete input deck -for LAMMPS. The second task is to use moltemplate to build a polymer. -The third task is to map the OPLS-AA force field to a -molecular sample created with an external tool, e.g. PACKMOL, and -exported as a PDB file. The files used in this tutorial can be found -in the ``tools/moltemplate/tutorial-files`` folder of the LAMMPS -source code distribution. +In this tutorial, we are going to use the tool :ref:`Moltemplate +` from https://moltemplate.org/ to set up a classical +molecular dynamic simulation using the :ref:`OPLS-AA force field +`. The first task is to describe an organic compound and +create a complete input deck for LAMMPS. The second task is to use +moltemplate to build a polymer. The third task is to map the OPLS-AA +force field to a molecular sample created with an external tool, +e.g. PACKMOL, and exported as a PDB file. The files used in this +tutorial can be found in the ``tools/moltemplate/tutorial-files`` folder +of the LAMMPS source code distribution. Many more examples can be found here: https://moltemplate.org/examples.html @@ -179,7 +179,7 @@ Compile the master file with: moltemplate.sh solv_01.lt cleanup_moltemplate.sh # <-- optional: see below -(Note: The optioinal "cleanup_moltemplate.sh" command deletes +(Note: The optional "cleanup_moltemplate.sh" command deletes unused atom types, which sometimes makes LAMMPS run faster. But it does not work with many-body pair styles or dreiding-style h-bonds. Fortunately most force fields, including OPLSAA, don't use those features.) @@ -201,7 +201,7 @@ Then execute the simulation with the following: Building a simple polymer """"""""""""""""""""""""" Moltemplate is particularly useful for building polymers (and other molecules -with subunits). As an simple example, consider butane: +with sub-units). As an simple example, consider butane: .. figure:: JPG/butane.jpg @@ -224,7 +224,7 @@ The ``butane.lt`` file below defines Butane as a polymer containing # (Using "$mol:..." indicates this object ("CH3") is part of a larger # molecule. Moltemplate will share the molecule-ID with that molecule.) - # A list of the bonds within the "CH3" molecular subunit: + # A list of the bonds within the "CH3" molecular sub-unit: # BondID AtomID1 AtomID2 write('Data Bond List') { $bond:ch1 $atom:c $atom:h1 @@ -242,7 +242,7 @@ The ``butane.lt`` file below defines Butane as a polymer containing $atom:h2 $mol:... @atom:60 0.0 0.000000 1.0741603 -0.892431 } - # A list of the bonds within the "CH2" molecular subunit: + # A list of the bonds within the "CH2" molecular sub-unit: # BondID AtomID1 AtomID2 write('Data Bond List') { $bond:ch1 $atom:c $atom:h1 @@ -489,6 +489,6 @@ And execute the simulation with the following: **(OPLS-AA)** Jorgensen, W.L., Ghahremanpour, M.M., Saar, A., Tirado-Rives, J., J. Phys. Chem. B, 128(1), 250-262 (2024). -.. _Moltemplate: +.. _Moltemplate1: **(Moltemplate)** Jewett et al., J. Mol. Biol., 433(11), 166841 (2021) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 084f7c0ec1..baf20a8ebf 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1336,6 +1336,7 @@ Gflop gfortran ghostneigh ghostwhite +Ghahremanpour Giacomo GiB gif From e4c96459e53804653b2486dbedeee0f2eb6eb5bb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 20 Mar 2025 06:16:59 -0400 Subject: [PATCH 48/99] flag some more compatible time and out-of-bounds errors with errorurl()s --- src/ADIOS/dump_custom_adios.cpp | 4 +-- src/EXTRA-FIX/fix_ave_correlate_long.cpp | 4 +-- src/VTK/dump_vtk.cpp | 3 ++- src/fix_ave_histo.cpp | 27 ++++++++++++++------- src/fix_ave_time.cpp | 22 +++++++++-------- src/fix_store_state.cpp | 9 ++++--- src/fix_vector.cpp | 11 ++++++--- src/library.cpp | 10 +++++--- src/thermo.cpp | 4 +-- src/utils.cpp | 10 +++++--- src/variable.cpp | 31 ++++++++++++++++-------- 11 files changed, 84 insertions(+), 51 deletions(-) diff --git a/src/ADIOS/dump_custom_adios.cpp b/src/ADIOS/dump_custom_adios.cpp index 4c38a0513b..060a5493f2 100644 --- a/src/ADIOS/dump_custom_adios.cpp +++ b/src/ADIOS/dump_custom_adios.cpp @@ -273,8 +273,8 @@ void DumpCustomADIOS::init_style() fix[i] = modify->get_fix_by_id(id_fix[i]); if (!fix[i]) error->all(FLERR, "Could not find dump custom/adios fix ID {}", id_fix[i]); if (nevery % fix[i]->peratom_freq) - error->all(FLERR, "dump custom/adios and fix {} with ID {} not computed at compatible times", - fix[i]->style, id_fix[i]); + error->all(FLERR, Error::NOLASTLINE, "dump custom/adios and fix {} with ID {} not " + "computed at compatible times{}", fix[i]->style, id_fix[i], utils::errorurl(7)); } int ivariable; diff --git a/src/EXTRA-FIX/fix_ave_correlate_long.cpp b/src/EXTRA-FIX/fix_ave_correlate_long.cpp index 4b4ba462b1..8407f62aac 100644 --- a/src/EXTRA-FIX/fix_ave_correlate_long.cpp +++ b/src/EXTRA-FIX/fix_ave_correlate_long.cpp @@ -244,8 +244,8 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS *lmp, int narg, char **arg) : "Fix ave/correlate/long fix {} vector is accessed out-of-range", val.id); if (nevery % val.val.f->global_freq) error->all(FLERR, val.iarg, - "Fix {} for fix ave/correlate/long not computed at compatible time", - val.id); + "Fix {} for fix ave/correlate/long not computed at compatible time{}", + val.id, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index b59ec5beba..8fe8c0f5fb 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -224,7 +224,8 @@ void DumpVTK::init_style() error->all(FLERR,"Could not find dump vtk fix ID {}", id_fix[i]); } else { if (nevery % fix[i]->peratom_freq) - error->all(FLERR,"Dump vtk and fix ID {} not called at compatible times", id_fix[i]); + error->all(FLERR,"Dump vtk and fix ID {} not called at compatible times{}", id_fix[i], + utils::errorurl(7)); } } diff --git a/src/fix_ave_histo.cpp b/src/fix_ave_histo.cpp index 5059e998fe..f660567545 100644 --- a/src/fix_ave_histo.cpp +++ b/src/fix_ave_histo.cpp @@ -283,7 +283,8 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.c->size_local_cols == 0) error->all(FLERR, val.iarg, "{} compute {} does not calculate a local array", mycmd, val.id); if (val.argindex && val.argindex > val.val.c->size_local_cols) - error->all(FLERR, val.iarg, "{} compute {} array is accessed out-of-range", mycmd, val.id); + error->all(FLERR, val.iarg, "{} compute {} array is accessed out-of-range{}", mycmd, + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX && kind == GLOBAL && mode == SCALAR) { if (val.argindex == 0 && val.val.f->scalar_flag == 0) @@ -291,9 +292,11 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->vector_flag == 0) error->all(FLERR, val.iarg, "{} fix {} does not calculate a global vector", mycmd, val.id); if (val.argindex && val.argindex > val.val.f->size_vector) - error->all(FLERR, val.iarg, "{} fix {} vector is accessed out-of-range", mycmd, val.id); + error->all(FLERR, val.iarg, "{} fix {} vector is accessed out-of-range{}", mycmd, + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time", val.id, mycmd); + error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time{}", + val.id, mycmd, utils::errorurl(7)); } else if (val.which == ArgInfo::FIX && kind == GLOBAL && mode == VECTOR) { if (val.argindex == 0 && val.val.f->vector_flag == 0) @@ -301,9 +304,11 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->array_flag == 0) error->all(FLERR, val.iarg, "{} fix {} does not calculate a global array", mycmd, val.id); if (val.argindex && val.argindex > val.val.f->size_array_cols) - error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range", mycmd, val.id); + error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range{}", mycmd, val.id, + utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time", val.id, mycmd); + error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time{}", + val.id, mycmd, utils::errorurl(7)); } else if (val.which == ArgInfo::FIX && kind == PERATOM) { if (val.val.f->peratom_flag == 0) @@ -313,9 +318,11 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->size_peratom_cols == 0) error->all(FLERR, val.iarg, "{} fix {} does not ""calculate a per-atom array", mycmd, val.id); if (val.argindex && val.argindex > val.val.f->size_peratom_cols) - error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range", mycmd, val.id); + error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range{}", mycmd, val.id, + utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time", val.id, mycmd); + error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time{}", val.id, + mycmd, utils::errorurl(7)); } else if (val.which == ArgInfo::FIX && kind == LOCAL) { if (val.val.f->local_flag == 0) @@ -325,9 +332,11 @@ FixAveHisto::FixAveHisto(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->size_local_cols == 0) error->all(FLERR, val.iarg, "{} fix does not calculate a local array", mycmd, val.id); if (val.argindex && val.argindex > val.val.f->size_local_cols) - error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range", mycmd, val.id); + error->all(FLERR, val.iarg, "{} fix {} array is accessed out-of-range{}", mycmd, + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time", val.id, mycmd); + error->all(FLERR, val.iarg, "Fix {} for {} not computed at compatible time{}", val.id, + mycmd, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE && kind == GLOBAL && mode == SCALAR) { if (val.argindex == 0 && input->variable->equalstyle(val.val.v) == 0) diff --git a/src/fix_ave_time.cpp b/src/fix_ave_time.cpp index 7b5d394cd4..e88ddb987b 100644 --- a/src/fix_ave_time.cpp +++ b/src/fix_ave_time.cpp @@ -148,8 +148,8 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, val.iarg, "Fix ave/time compute {} does not calculate a vector", val.id); if (val.argindex && (val.argindex > val.val.c->size_vector) && (val.val.c->size_vector_variable == 0)) - error->all(FLERR, val.iarg, "Fix ave/time compute {} vector is accessed out-of-range", - val.id); + error->all(FLERR, val.iarg, "Fix ave/time compute {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (val.argindex && val.val.c->size_vector_variable) val.varlen = 1; } else if ((val.which == ArgInfo::COMPUTE) && (mode == VECTOR)) { @@ -161,8 +161,8 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && (val.val.c->array_flag == 0)) error->all(FLERR, val.iarg, "Fix ave/time compute {} does not calculate an array", val.id); if (val.argindex && (val.argindex > val.val.c->size_array_cols)) - error->all(FLERR, val.iarg, "Fix ave/time compute {} array is accessed out-of-range", - val.id); + error->all(FLERR, val.iarg, "Fix ave/time compute {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if ((val.argindex == 0) && (val.val.c->size_vector_variable)) val.varlen = 1; if (val.argindex && (val.val.c->size_array_rows_variable)) val.varlen = 1; @@ -176,10 +176,11 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && (val.val.f->size_vector_variable)) error->all(FLERR, val.iarg, "Fix ave/time fix {} vector cannot be variable length", val.id); if (val.argindex && (val.argindex > val.val.f->size_vector)) - error->all(FLERR, val.iarg, "Fix ave/time fix {} vector is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/time fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for fix ave/time not computed at compatible time", - val.id); + error->all(FLERR, val.iarg, "Fix {} for fix ave/time not computed at compatible time{}", + val.id, utils::errorurl(7)); } else if ((val.which == ArgInfo::FIX) && (mode == VECTOR)) { val.val.f = modify->get_fix_by_id(val.id); @@ -193,10 +194,11 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, val.iarg, "Fix ave/time fix {} array cannot have variable row length", val.id); if (val.argindex && (val.argindex > val.val.f->size_array_cols)) - error->all(FLERR, val.iarg, "Fix ave/time fix {} array is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/time fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for fix ave/time not computed at compatible time", - val.id); + error->all(FLERR, val.iarg, "Fix {} for fix ave/time not computed at compatible time{}", + val.id, utils::errorurl(7)); } else if ((val.which == ArgInfo::VARIABLE) && (mode == SCALAR)) { int ivariable = input->variable->find(val.id.c_str()); diff --git a/src/fix_store_state.cpp b/src/fix_store_state.cpp index 92aee9c1c9..e0d650c4e3 100644 --- a/src/fix_store_state.cpp +++ b/src/fix_store_state.cpp @@ -263,7 +263,8 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.c->size_peratom_cols == 0) error->all(FLERR, "Fix store/state compute {} does not calculate per-atom array", val.id); if (val.argindex && (val.argindex > val.val.c->size_peratom_cols)) - error->all(FLERR, "Fix store/state compute array {} is accessed out-of-range", val.id); + error->all(FLERR, "Fix store/state compute array {} is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); @@ -276,9 +277,11 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->size_peratom_cols == 0) error->all(FLERR, "Fix store/state fix {} does not calculate per-atom array", val.id); if (val.argindex && (val.argindex > val.val.f->size_peratom_cols)) - error->all(FLERR, "Fix store/state fix {} array is accessed out-of-range", val.id); + error->all(FLERR, "Fix store/state fix {} array is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->peratom_freq) - error->all(FLERR, "Fix {} for fix store/state not computed at compatible time", val.id); + error->all(FLERR, "Fix {} for fix store/state not computed at compatible time{}", + val.id, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); diff --git a/src/fix_vector.cpp b/src/fix_vector.cpp index 3703e96130..275e40f9e2 100644 --- a/src/fix_vector.cpp +++ b/src/fix_vector.cpp @@ -35,7 +35,7 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : if (narg < 5) utils::missing_cmd_args(FLERR, "fix vector", error); nevery = utils::inumeric(FLERR, arg[3], false, lmp); - if (nevery <= 0) error->all(FLERR, "Invalid fix vector every argument: {}", nevery); + if (nevery <= 0) error->all(FLERR, 3, "Invalid fix vector every argument: {}", nevery); nmaxval = MAXSMALLINT; nindex = 0; @@ -91,7 +91,8 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && icompute->vector_flag == 0) error->all(FLERR, "Fix vector compute {} does not calculate a vector", val.id); if (val.argindex && (val.argindex > icompute->size_vector)) - error->all(FLERR, "Fix vector compute {} vector is accessed out-of-range", val.id); + error->all(FLERR, "Fix vector compute {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (val.argindex == 0) value = icompute->extscalar; @@ -109,9 +110,11 @@ FixVector::FixVector(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && ifix->vector_flag == 0) error->all(FLERR, "Fix vector fix {} does not calculate a vector", val.id); if (val.argindex && val.argindex > ifix->size_vector) - error->all(FLERR, "Fix vector fix {} vector is accessed out-of-range", val.id); + error->all(FLERR, "Fix vector fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % ifix->global_freq) - error->all(FLERR, "Fix for fix {} vector not computed at compatible time", val.id); + error->all(FLERR, "Fix for fix {} vector not computed at compatible time{}", + val.id, utils::errorurl(7)); if (val.argindex == 0) value = ifix->extscalar; diff --git a/src/library.cpp b/src/library.cpp index 0127a0e198..f1b0030380 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4401,7 +4401,8 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da } if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather: fix {} not computed at compatible time", fixid); + lmp->error->all(FLERR,"lammps_gather: fix {} not computed at compatible time{}", + fixid, utils::errorurl(7)); return; } @@ -4670,8 +4671,8 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, return; } if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather_concat(): fix {} not computed at compatible time", - fixid); + lmp->error->all(FLERR,"lammps_gather_concat(): fix {} not computed at compatible time{}", + fixid, utils::errorurl(7)); return; } @@ -4957,7 +4958,8 @@ void lammps_gather_subset(void *handle, const char *name, int type, int count, return; } if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather_subset(): fix {} not computed at compatible time", fixid); + lmp->error->all(FLERR,"lammps_gather_subset(): fix {} not computed at compatible time{}", + fixid, utils::errorurl(7)); return; } diff --git a/src/thermo.cpp b/src/thermo.cpp index 7e934ed985..caf5206b4a 100644 --- a/src/thermo.cpp +++ b/src/thermo.cpp @@ -311,8 +311,8 @@ void Thermo::init() error->all(FLERR, Error::NOLASTLINE, "Could not find thermo fix ID {}", id_fix[i]); if (output->thermo_every % fixes[i]->global_freq) - error->all(FLERR, Error::NOLASTLINE, "Thermo and fix {} not computed at compatible times", - id_fix[i]); + error->all(FLERR, Error::NOLASTLINE, "Thermo and fix {} not computed at compatible times{}", + id_fix[i], utils::errorurl(7)); } // find current ptr for each Variable ID diff --git a/src/utils.cpp b/src/utils.cpp index 8ab757ac44..94660f546a 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1244,8 +1244,8 @@ int utils::check_grid_reference(char *errstr, char *ref, int nevery, char *&id, lmp->error->all(FLERR, "{} compute {} data {} is not per-grid array", errstr, idcompute, dname); if (argi.get_dim() && argi.get_index1() > ncol) - lmp->error->all(FLERR, "{} compute {} array {} is accessed out-of-range", errstr, idcompute, - dname); + lmp->error->all(FLERR, "{} compute {} array {} is accessed out-of-range{}", errstr, + idcompute, dname, errorurl(20)); id = utils::strdup(idcompute); return ArgInfo::COMPUTE; @@ -1267,7 +1267,8 @@ int utils::check_grid_reference(char *errstr, char *ref, int nevery, char *&id, if (ifix->pergrid_flag == 0) lmp->error->all(FLERR, "{} fix {} does not compute per-grid info", errstr, idfix); if (nevery % ifix->pergrid_freq) - lmp->error->all(FLERR, "{} fix {} not computed at compatible time", errstr, idfix); + lmp->error->all(FLERR, "{} fix {} not computed at compatible time{}", errstr, idfix, + errorurl(7)); int dim; igrid = ifix->get_grid_by_name(gname, dim); @@ -1284,7 +1285,8 @@ int utils::check_grid_reference(char *errstr, char *ref, int nevery, char *&id, if (argi.get_dim() > 0 && ncol == 0) lmp->error->all(FLERR, "{} fix {} data {} is not per-grid array", errstr, idfix, dname); if (argi.get_dim() > 0 && argi.get_index1() > ncol) - lmp->error->all(FLERR, "{} fix {} array {} is accessed out-of-range", errstr, idfix, dname); + lmp->error->all(FLERR, "{} fix {} array {} is accessed out-of-range{}", errstr, idfix, + dname, errorurl(20)); id = utils::strdup(idfix); return ArgInfo::FIX; diff --git a/src/variable.cpp b/src/variable.cpp index 4e1306e893..226e886a91 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1880,7 +1880,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (!fix->scalar_flag) print_var_error(FLERR,"Mismatched fix in variable formula",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7), ivar); value1 = fix->compute_scalar(); argstack[nargstack++] = value1; @@ -1895,7 +1896,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Variable formula fix vector is accessed out-of-range" + utils::errorurl(20), ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7) ,ivar); // if index exceeds variable vector length, use a zero value // this can be useful if vector length is not known a priori @@ -1917,7 +1919,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Variable formula fix array is accessed out-of-range" + utils::errorurl(20), ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7), ivar); // if index exceeds variable array rows, use a zero value // this can be useful if array size is not known a priori @@ -1936,7 +1939,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Mismatched fix in variable formula",ivar); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7), ivar); peratom2global(1,nullptr,fix->vector_atom,1,index1,tree, treestack,ntreestack,argstack,nargstack); @@ -1953,7 +1957,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Variable formula fix array is accessed out-of-range" + utils::errorurl(20), ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7), ivar); if (fix->array_atom) peratom2global(1,nullptr,&fix->array_atom[0][index2-1], @@ -1980,7 +1985,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (fix->size_vector == 0) print_var_error(FLERR,"Variable formula fix vector is zero length",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at compatible time" + + utils::errorurl(7), ivar); int nvec = fix->size_vector; double *vec; @@ -2008,7 +2014,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Variable formula fix array is accessed out-of-range" + utils::errorurl(20), ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at a compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at a compatible time" + + utils::errorurl(7), ivar); int nvec = fix->size_array_rows; double *vec; @@ -2041,7 +2048,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (fix->size_peratom_cols) print_var_error(FLERR,"Mismatched fix in variable formula",ivar); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at compatible time" + + utils::errorurl(7), ivar); auto newtree = new Tree(); newtree->type = ATOMARRAY; @@ -2061,7 +2069,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) print_var_error(FLERR,"Variable formula fix array is accessed out-of-range" + utils::errorurl(20), ivar,0); if (update->whichflag > 0 && update->ntimestep % fix->peratom_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at compatible time" + + utils::errorurl(7), ivar); auto newtree = new Tree(); newtree->type = ATOMARRAY; @@ -4531,6 +4540,7 @@ int Variable::special_function(const std::string &word, char *contents, Tree **t std::string mesg = "Fix with ID '"; mesg += (args[0]+2); mesg += "' in variable formula not computed at compatible time"; + mesg += utils::errorurl(7); print_var_error(FLERR,mesg,ivar); } nvec = fix->size_vector; @@ -4540,7 +4550,8 @@ int Variable::special_function(const std::string &word, char *contents, Tree **t print_var_error(FLERR,"Variable formula fix array is accessed out-of-range" + utils::errorurl(20), ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); + print_var_error(FLERR,"Fix in variable not computed at compatible time" + + utils::errorurl(7), ivar); nvec = fix->size_array_rows; nstride = fix->size_array_cols; } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); From 3b61bcf8907292f55f8b3976af4392c9675ca903 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 20 Mar 2025 12:05:50 -0400 Subject: [PATCH 49/99] more error reporting updates --- src/compute_chunk_atom.cpp | 4 +- src/compute_global_atom.cpp | 4 +- src/compute_reduce_region.cpp | 5 +- src/dump.cpp | 45 +++++++----- src/dump_image.cpp | 129 ++++++++++++++++++---------------- src/fix_ave_correlate.cpp | 9 ++- 6 files changed, 110 insertions(+), 86 deletions(-) diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index f8ea7d9efa..7e6d1d41a9 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -1010,8 +1010,8 @@ void ComputeChunkAtom::assign_chunk_ids() } else if (which == ArgInfo::FIX) { if (update->ntimestep % fchunk->peratom_freq) error->all(FLERR, Error::NOLASTLINE, - "Fix used in compute chunk/atom not computed at compatible time" + - utils::errorurl(7)); + "Fix {} used in compute chunk/atom not computed at compatible time{}", + fchunk->id, utils::errorurl(7)); if (argindex == 0) { double *vec = fchunk->vector_atom; diff --git a/src/compute_global_atom.cpp b/src/compute_global_atom.cpp index a68260067e..b7bfc4a15e 100644 --- a/src/compute_global_atom.cpp +++ b/src/compute_global_atom.cpp @@ -170,8 +170,8 @@ ComputeGlobalAtom::ComputeGlobalAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, val.iarg, "Fix ID {} for compute global/atom compute does not " "calculate a global array", val.id); if (val.argindex > val.val.f->size_array_cols) - error->all(FLERR, val.iarg, "Compute global/atom fix {} array is accessed out-of-range{}", - val.id, utils::errorurl(20)); + error->all(FLERR, val.iarg, "Compute global/atom fix {} array is accessed " + "out-of-range{}", val.id, utils::errorurl(20)); } } else if (val.which == ArgInfo::VARIABLE) { diff --git a/src/compute_reduce_region.cpp b/src/compute_reduce_region.cpp index 6347bfe4c9..bd02fff9f7 100644 --- a/src/compute_reduce_region.cpp +++ b/src/compute_reduce_region.cpp @@ -34,7 +34,7 @@ ComputeReduceRegion::ComputeReduceRegion(LAMMPS *lmp, int narg, char **arg) : ComputeReduce(lmp, narg, arg) { if (input_mode == LOCAL) - error->all(FLERR, "Compute reduce/region cannot use local data as input"); + error->all(FLERR, Error::NOPOINTER, "Compute reduce/region cannot use local data as input"); } /* ---------------------------------------------------------------------- @@ -129,7 +129,8 @@ double ComputeReduceRegion::compute_one(int m, int flag) } else if (val.which == ArgInfo::FIX) { if (update->ntimestep % val.val.f->peratom_freq) - error->all(FLERR, "Fix {} used in compute {} not computed at compatible time", val.id, style); + error->all(FLERR, Error::NOLASTLINE, "Fix {} used in compute {} not computed at compatible" + " time{}", val.id, style, utils::errorurl(7)); if (aidx == 0) { double *fix_vector = val.val.f->vector_atom; diff --git a/src/dump.cpp b/src/dump.cpp index 3425b6d441..a75c8e441f 100644 --- a/src/dump.cpp +++ b/src/dump.cpp @@ -223,14 +223,15 @@ void Dump::init() if (sort_flag) { if (multiproc > 1) - error->all(FLERR, + error->all(FLERR, Error::NOLASTLINE, "Cannot sort dump when 'nfile' or 'fileper' keywords have non-default values"); if (sortcol == 0 && atom->tag_enable == 0) - error->all(FLERR,"Cannot sort dump on atom IDs with no atom IDs defined"); + error->all(FLERR, Error::NOLASTLINE, + "Cannot sort dump on atom IDs with no atom IDs defined"); if (sortcol && sortcol > size_one) - error->all(FLERR,"Dump sort column index {} is invalid", sortcol); + error->all(FLERR, Error::NOLASTLINE, "Dump sort column index {} is invalid", sortcol); if ((sortcol != 0) && (has_id == 0) && (me == 0)) - error->warning(FLERR,"Dump {} includes no atom IDs and is not sorted by ID. " + error->warning(FLERR, "Dump {} includes no atom IDs and is not sorted by ID. " "This may complicate post-processing tasks or visualization", id); if (nprocs > 1 && irregular == nullptr) irregular = new Irregular(lmp); @@ -290,16 +291,18 @@ void Dump::init() if (refreshflag) { irefresh = modify->get_compute_by_id(idrefresh); - if (!irefresh) error->all(FLERR,"Dump could not find refresh compute ID {}", idrefresh); + if (!irefresh) + error->all(FLERR, Error::NOLASTLINE, "Dump could not find refresh compute ID {}", idrefresh); } // if skipflag, check skip variable if (skipflag) { skipindex = input->variable->find(skipvar); - if (skipindex < 0) error->all(FLERR,"Dump skip variable not found"); + if (skipindex < 0) + error->all(FLERR, Error::NOLASTLINE, "Dump skip variable {} not found", skipvar); if (!input->variable->equalstyle(skipindex)) - error->all(FLERR,"Variable for dump skip is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable {} for dump skip is invalid style", skipvar); } // preallocation for PBC copies if requested @@ -389,7 +392,7 @@ void Dump::write() if (nmax*size_one > maxbuf) { if ((bigint) nmax * size_one > MAXSMALLINT) - error->all(FLERR,"Too much per-proc info for dump"); + error->all(FLERR, Error::NOLASTLINE, "Too much per-proc data for dump"); maxbuf = nmax * size_one; memory->destroy(buf); memory->create(buf,maxbuf,"dump:buf"); @@ -457,7 +460,8 @@ void Dump::write() nsme = convert_string(nme,buf); int nsmin,nsmax; MPI_Allreduce(&nsme,&nsmin,1,MPI_INT,MPI_MIN,world); - if (nsmin < 0) error->all(FLERR,"Too much buffered per-proc info for dump"); + if (nsmin < 0) + error->all(FLERR, Error::NOLASTLINE, "Too much buffered per-proc data for dump"); if (multiproc != nprocs) MPI_Allreduce(&nsme,&nsmax,1,MPI_INT,MPI_MAX,world); else nsmax = nsme; @@ -534,7 +538,8 @@ void Dump::write() if (filewriter && fp != nullptr) write_footer(); - if (fp && ferror(fp)) error->one(FLERR,"Error writing dump {}: {}", id, utils::getsyserror()); + if (fp && ferror(fp)) + error->one(FLERR, Error::NOLASTLINE, "Error writing dump {}: {}", id, utils::getsyserror()); // if file per timestep, close file if I am filewriter @@ -596,7 +601,9 @@ void Dump::openfile() fp = fopen(filecurrent,"w"); } - if (fp == nullptr) error->one(FLERR,"Cannot open dump file"); + if (fp == nullptr) + error->one(FLERR, Error::NOLASTLINE, "Cannot open dump file {}:{}", + filecurrent, utils::getsyserror()); } else fp = nullptr; // delete string with timestep replaced @@ -1068,7 +1075,7 @@ void Dump::modify_params(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify buffer", error); buffer_flag = utils::logical(FLERR,arg[iarg+1],false,lmp); if (buffer_flag && buffer_allow == 0) - error->all(FLERR,"Dump_modify buffer yes not allowed for this style"); + error->all(FLERR, iarg + 2, "Dump_modify buffer yes not allowed for this style"); iarg += 2; } else if (strcmp(arg[iarg],"colname") == 0) { @@ -1091,7 +1098,7 @@ void Dump::modify_params(int narg, char **arg) } } if ((icol < 0) || (icol >= (int)keyword_user.size())) - error->all(FLERR, "Incorrect dump_modify arguments: {} {} {}", + error->all(FLERR, Error::NOPOINTER, "Incorrect dump_modify arguments: {} {} {}", arg[iarg], arg[iarg+1], arg[iarg+2]); keyword_user[icol] = arg[iarg+2]; iarg += 3; @@ -1136,7 +1143,8 @@ void Dump::modify_params(int narg, char **arg) delta = 0.0; } else { delta = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (delta <= 0.0) error->all(FLERR, "Invalid dump_modify every/time argument: {}", delta); + if (delta <= 0.0) + error->all(FLERR, iarg + 1, "Invalid dump_modify every/time argument: {}", delta); } output->mode_dump[idump] = 1; output->every_time_dump[idump] = delta; @@ -1146,9 +1154,9 @@ void Dump::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"fileper") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify fileper", error); if (!multiproc) - error->all(FLERR,"Cannot use dump_modify fileper without % in dump file name"); + error->all(FLERR, iarg, "Cannot use dump_modify fileper without % in dump file name"); int nper = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - if (nper <= 0) error->all(FLERR, "Invalid dump_modify fileper argument: {}", nper); + if (nper <= 0) error->all(FLERR, iarg + 1, "Invalid dump_modify fileper argument: {}", nper); multiproc = nprocs/nper; if (nprocs % nper) multiproc++; @@ -1206,7 +1214,8 @@ void Dump::modify_params(int narg, char **arg) iarg += 3; } else { // pass other format options to child classes int n = modify_param(narg-iarg,&arg[iarg]); - if (n == 0) error->all(FLERR,"Unknown dump_modify format keyword: {}", arg[iarg+1]); + if (n == 0) + error->all(FLERR, iarg + 1, "Unknown dump_modify format keyword: {}", arg[iarg+1]); iarg += n; } @@ -1218,7 +1227,7 @@ void Dump::modify_params(int narg, char **arg) } else if (strcmp(arg[iarg],"maxfiles") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "dump_modify maxfiles", error); if (!multifile) - error->all(FLERR,"Cannot use dump_modify maxfiles without * in dump file name"); + error->all(FLERR, "Cannot use dump_modify maxfiles without * in dump file name"); // wipe out existing storage if (maxfiles > 0) { for (int idx=0; idx < numfiles; ++idx) diff --git a/src/dump_image.cpp b/src/dump_image.cpp index ee44db0945..609223a9ec 100644 --- a/src/dump_image.cpp +++ b/src/dump_image.cpp @@ -67,7 +67,8 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : gbuf(nullptr), avec_line(nullptr), avec_tri(nullptr), avec_body(nullptr), fixptr(nullptr), image(nullptr), chooseghost(nullptr), bufcopy(nullptr) { - if (binary || multiproc) error->all(FLERR, "Invalid dump image filename"); + if (binary || multiproc) + error->all(FLERR, 4, "Invalid dump image filename {}", filename); // force binary flag on to avoid corrupted output on Windows @@ -89,16 +90,18 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : #ifndef LAMMPS_JPEG if (filetype == JPG) - error->all(FLERR,"Support for writing images in JPEG format not included"); + error->all(FLERR, Error::NOLASTLINE, "Support for writing images in JPEG format not included"); #endif #ifndef LAMMPS_PNG if (filetype == PNG) - error->all(FLERR,"Support for writing images in PNG format not included"); + error->all(FLERR, Error::NOLASTLINE, "Support for writing images in PNG format not included"); #endif // atom color,diameter settings - if (nfield != 2) error->all(FLERR,"Illegal dump image command"); + if (nfield != 2) + error->all(FLERR, Error::NOPOINTER, + "Dump image command is missing attributes for color and size"); acolor = ATTRIBUTE; if (strcmp(arg[5],"type") == 0) acolor = TYPE; @@ -147,45 +150,48 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : int iarg = ioptional; while (iarg < narg) { if (strcmp(arg[iarg],"atom") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image atom", error); atomflag = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"adiam") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image adiam", error); adiam = NUMERIC; adiamvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (adiamvalue <= 0.0) error->all(FLERR,"Illegal dump image command"); + if (adiamvalue <= 0.0) + error->all(FLERR, iarg+1, "Illegal dump image adiam value {}", adiamvalue); iarg += 2; } else if (strcmp(arg[iarg],"bond") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image bond", error); if (atom->nbondtypes == 0) - error->all(FLERR,"Dump image bond not allowed with no bond types"); + error->all(FLERR, iarg, "Dump image bond not allowed with no bond types defined"); bondflag = YES; if (strcmp(arg[iarg+1],"none") == 0) bondflag = NO; else if (strcmp(arg[iarg+1],"atom") == 0) bcolor = ATOM; else if (strcmp(arg[iarg+1],"type") == 0) bcolor = TYPE; - else error->all(FLERR,"Illegal dump image command"); + else error->all(FLERR, iarg + 1, "Unknown dump image bond color setting {}", arg[iarg + 1]); if (!islower(arg[iarg+2][0])) { bdiam = NUMERIC; bdiamvalue = utils::numeric(FLERR,arg[iarg+2],false,lmp); - if (bdiamvalue <= 0.0) error->all(FLERR,"Illegal dump image command"); + if (bdiamvalue <= 0.0) + error->all(FLERR, iarg + 2,"Illegal dump image bond diameter value {}", bdiamvalue); } else if (strcmp(arg[iarg+2],"atom") == 0) bdiam = ATOM; else if (strcmp(arg[iarg+2],"type") == 0) bdiam = TYPE; else if (strcmp(arg[iarg+2],"none") == 0) bondflag = NO; - else error->all(FLERR,"Illegal dump image command"); + else error->all(FLERR, iarg + 2, "Unknown dump image bond diameter setting {}", arg[iarg+2]); iarg += 3; } else if (strcmp(arg[iarg],"grid") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image grid", error); gridflag = YES; char *id; int igrid,idata,index; int iflag = utils::check_grid_reference((char *) "Dump image", arg[iarg+1], nevery, id, igrid,idata,index,lmp); - if (iflag < 0) error->all(FLERR,"Invalid grid reference in dump image command"); + if (iflag < 0) + error->all(FLERR, iarg+1, "Invalid grid reference {} in dump image command", arg[iarg+1]); if (iflag == ArgInfo::COMPUTE) { delete[] id_grid_compute; @@ -201,7 +207,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"line") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image line", error); lineflag = YES; if (strcmp(arg[iarg+1],"type") == 0) lcolor = TYPE; else error->all(FLERR,"Illegal dump image command"); @@ -210,7 +216,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else if (strcmp(arg[iarg],"tri") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image tri", error); triflag = YES; if (strcmp(arg[iarg+1],"type") == 0) tcolor = TYPE; else error->all(FLERR,"Illegal dump image command"); @@ -219,7 +225,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"body") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image body", error); bodyflag = YES; if (strcmp(arg[iarg+1],"type") == 0) bodycolor = TYPE; else error->all(FLERR,"Illegal dump image command"); @@ -228,7 +234,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"fix") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+5 > narg) utils::missing_cmd_args(FLERR,"dump image fix", error); fixflag = YES; fixID = arg[iarg+1]; if (strcmp(arg[iarg+2],"type") == 0) fixcolor = TYPE; @@ -238,7 +244,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 5; } else if (strcmp(arg[iarg],"size") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image size", error); int width = utils::inumeric(FLERR,arg[iarg+1],false,lmp); int height = utils::inumeric(FLERR,arg[iarg+2],false,lmp); if (width <= 0 || height <= 0) error->all(FLERR,"Illegal dump image command"); @@ -252,7 +258,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else if (strcmp(arg[iarg],"view") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image view", error); if (utils::strmatch(arg[iarg+1],"^v_")) { delete[] thetastr; thetastr = utils::strdup(arg[iarg+1]+2); @@ -271,7 +277,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 3; } else if (strcmp(arg[iarg],"center") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+5 > narg) utils::missing_cmd_args(FLERR,"dump image center", error); if (strcmp(arg[iarg+1],"s") == 0) cflag = STATIC; else if (strcmp(arg[iarg+1],"d") == 0) cflag = DYNAMIC; else error->all(FLERR,"Illegal dump image command"); @@ -293,7 +299,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 5; } else if (strcmp(arg[iarg],"up") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image up", error); if (utils::strmatch(arg[iarg+1],"^v_")) { delete[] upxstr; upxstr = utils::strdup(arg[iarg+1]+2); @@ -309,7 +315,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"zoom") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image zoom", error); if (utils::strmatch(arg[iarg+1],"^v_")) { delete[] zoomstr; zoomstr = utils::strdup(arg[iarg+1]+2); @@ -321,14 +327,14 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"box") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image box", error); boxflag = utils::logical(FLERR,arg[iarg+1],false,lmp); boxdiam = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (boxdiam < 0.0) error->all(FLERR,"Illegal dump image command"); iarg += 3; } else if (strcmp(arg[iarg],"axes") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image axes", error); axesflag = utils::logical(FLERR,arg[iarg+1],false,lmp); axeslen = utils::numeric(FLERR,arg[iarg+2],false,lmp); axesdiam = utils::numeric(FLERR,arg[iarg+3],false,lmp); @@ -337,14 +343,14 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 4; } else if (strcmp(arg[iarg],"subbox") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+3 > narg) utils::missing_cmd_args(FLERR,"dump image subbox", error); subboxflag = utils::logical(FLERR,arg[iarg+1],false,lmp); subboxdiam = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (subboxdiam < 0.0) error->all(FLERR,"Illegal dump image command"); iarg += 3; } else if (strcmp(arg[iarg],"shiny") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image shiny", error); double shiny = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (shiny < 0.0 || shiny > 1.0) error->all(FLERR,"Illegal dump image command"); @@ -352,7 +358,7 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"fsaa") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal dump_modify command"); + if (iarg+2 > narg) utils::missing_cmd_args(FLERR,"dump image fsaa", error); int aa = utils::logical(FLERR, arg[iarg+1], false, lmp); if (aa) { if (!image->fsaa) { @@ -369,10 +375,10 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"ssao") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal dump image command"); + if (iarg+4 > narg) utils::missing_cmd_args(FLERR,"dump image ssao", error); image->ssao = utils::logical(FLERR,arg[iarg+1],false,lmp); int seed = utils::inumeric(FLERR,arg[iarg+2],false,lmp); - if (seed <= 0) error->all(FLERR,"Illegal dump image command"); + if (seed <= 0) error->all(FLERR, iarg + 2, "Illegal dump image ssao seed {}", seed); image->seed = seed; double ssaoint = utils::numeric(FLERR,arg[iarg+3],false,lmp); if (ssaoint < 0.0 || ssaoint > 1.0) @@ -388,17 +394,17 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : if (lineflag) { avec_line = dynamic_cast(atom->style_match("line")); if (!avec_line) - error->all(FLERR,"Dump image line requires atom style line"); + error->all(FLERR, Error::NOLASTLINE, "Dump image line requires atom style line"); } if (triflag) { avec_tri = dynamic_cast(atom->style_match("tri")); if (!avec_tri) - error->all(FLERR,"Dump image tri requires atom style tri"); + error->all(FLERR, Error::NOLASTLINE, "Dump image tri requires atom style tri"); } if (bodyflag) { avec_body = dynamic_cast(atom->style_match("body")); if (!avec_body) - error->all(FLERR,"Dump image body yes requires atom style body"); + error->all(FLERR, Error::NOLASTLINE, "Dump image body yes requires atom style body"); } extraflag = 0; @@ -406,7 +412,8 @@ DumpImage::DumpImage(LAMMPS *lmp, int narg, char **arg) : if (fixflag) { fixptr = modify->get_fix_by_id(fixID); - if (!fixptr) error->all(FLERR,"Fix ID {} for dump image does not exist", fixID); + if (!fixptr) + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for dump image does not exist", fixID); } @@ -507,8 +514,9 @@ DumpImage::~DumpImage() void DumpImage::init_style() { if (multifile == 0 && !multifile_override) - error->all(FLERR,"Dump image requires one snapshot per file"); - if (sort_flag) error->all(FLERR,"Dump image cannot perform sorting"); + error->all(FLERR, Error::NOLASTLINE, + "Dump image requires file name with '*' requesting one snapshot per file"); + if (sort_flag) error->all(FLERR, Error::NOLASTLINE, "Dump image cannot perform sorting"); DumpCustom::init_style(); @@ -519,12 +527,15 @@ void DumpImage::init_style() if (id_grid_compute) { grid_compute = modify->get_compute_by_id(id_grid_compute); if (!grid_compute) - error->all(FLERR,"Could not find dump image grid compute ID {}",id_grid_compute); + error->all(FLERR, Error::NOLASTLINE, + "Could not find dump image grid compute ID {}", id_grid_compute); } else if (id_grid_fix) { grid_fix = modify->get_fix_by_id(id_grid_fix); - if (!grid_fix) error->all(FLERR,"Could not find dump image fix ID {}",id_grid_fix); + if (!grid_fix) + error->all(FLERR, Error::NOLASTLINE, "Could not find dump image fix ID {}",id_grid_fix); if (nevery % grid_fix->peratom_freq) - error->all(FLERR,"Dump image and grid fix not computed at compatible times"); + error->all(FLERR, Error::NOLASTLINE, "Dump image and grid fix {} not computed at " + "compatible times{}", id_grid_fix, utils::errorurl(7)); } } @@ -533,65 +544,65 @@ void DumpImage::init_style() if (thetastr) { thetavar = input->variable->find(thetastr); if (thetavar < 0) - error->all(FLERR,"Variable name for dump image theta does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image theta does not exist"); if (!input->variable->equalstyle(thetavar)) - error->all(FLERR,"Variable for dump image theta is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image theta is invalid style"); } if (phistr) { phivar = input->variable->find(phistr); if (phivar < 0) - error->all(FLERR,"Variable name for dump image phi does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image phi does not exist"); if (!input->variable->equalstyle(phivar)) - error->all(FLERR,"Variable for dump image phi is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image phi is invalid style"); } if (cxstr) { cxvar = input->variable->find(cxstr); if (cxvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(cxvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (cystr) { cyvar = input->variable->find(cystr); if (cyvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(cyvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (czstr) { czvar = input->variable->find(czstr); if (czvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(czvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (upxstr) { upxvar = input->variable->find(upxstr); if (upxvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(upxvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (upystr) { upyvar = input->variable->find(upystr); if (upyvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(upyvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (upzstr) { upzvar = input->variable->find(upzstr); if (upzvar < 0) - error->all(FLERR,"Variable name for dump image center does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image center does not exist"); if (!input->variable->equalstyle(upzvar)) - error->all(FLERR,"Variable for dump image center is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image center is invalid style"); } if (zoomstr) { zoomvar = input->variable->find(zoomstr); if (zoomvar < 0) - error->all(FLERR,"Variable name for dump image zoom does not exist"); + error->all(FLERR, Error::NOLASTLINE, "Variable name for dump image zoom does not exist"); if (!input->variable->equalstyle(zoomvar)) - error->all(FLERR,"Variable for dump image zoom is invalid style"); + error->all(FLERR, Error::NOLASTLINE, "Variable for dump image zoom is invalid style"); } // set up type -> element mapping @@ -600,7 +611,7 @@ void DumpImage::init_style() for (int i = 1; i <= ntypes; i++) { colorelement[i] = image->element2color(typenames[i]); if (colorelement[i] == nullptr) - error->all(FLERR,"Invalid dump image element name"); + error->all(FLERR, Error::NOLASTLINE, "Invalid dump image element name"); } } @@ -608,7 +619,7 @@ void DumpImage::init_style() for (int i = 1; i <= ntypes; i++) { diamelement[i] = image->element2diam(typenames[i]); if (diamelement[i] == 0.0) - error->all(FLERR,"Invalid dump image element name"); + error->all(FLERR, Error::NOLASTLINE, "Invalid dump image element name"); } } } diff --git a/src/fix_ave_correlate.cpp b/src/fix_ave_correlate.cpp index bc936ae515..b3632e559a 100644 --- a/src/fix_ave_correlate.cpp +++ b/src/fix_ave_correlate.cpp @@ -187,7 +187,8 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.c->vector_flag == 0) error->all(FLERR, val.iarg, "Fix ave/correlate compute {} does not calculate a vector", val.id); if (val.argindex && val.argindex > val.val.c->size_vector) - error->all(FLERR, val.iarg, "Fix ave/correlate compute {} vector is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/correlate compute {} vector is accessed " + "out-of-range{}", val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); @@ -197,9 +198,11 @@ FixAveCorrelate::FixAveCorrelate(LAMMPS *lmp, int narg, char **arg) : if (val.argindex && val.val.f->vector_flag == 0) error->all(FLERR, val.iarg, "Fix ave/correlate fix {} does not calculate a vector", val.id); if (val.argindex && val.argindex > val.val.f->size_vector) - error->all(FLERR, val.iarg, "Fix ave/correlate fix {} vector is accessed out-of-range", val.id); + error->all(FLERR, val.iarg, "Fix ave/correlate fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) - error->all(FLERR, val.iarg, "Fix {} for fix ave/correlate not computed at compatible time", val.id); + error->all(FLERR, val.iarg, "Fix {} for fix ave/correlate not computed at compatible " + "time{}", val.id, utils::errorurl(7)); } else if (val.which == ArgInfo::VARIABLE) { val.val.v = input->variable->find(val.id.c_str()); From e9bc334a14423e620bc8a79b04fcc11f08489b98 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 20 Mar 2025 21:03:52 -0400 Subject: [PATCH 50/99] add some more missing errorurl() calls and error pointers --- src/EXTRA-COMPUTE/compute_slcsa_atom.cpp | 40 +-- src/EXTRA-FIX/fix_ave_correlate_long.cpp | 10 +- src/EXTRA-FIX/fix_controller.cpp | 50 ++-- src/VTK/dump_vtk.cpp | 9 +- src/fix_ave_grid.cpp | 9 +- src/set.cpp | 307 ++++++++++++++--------- 6 files changed, 259 insertions(+), 166 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_slcsa_atom.cpp b/src/EXTRA-COMPUTE/compute_slcsa_atom.cpp index e0b34b8ff1..7ca13cc77a 100644 --- a/src/EXTRA-COMPUTE/compute_slcsa_atom.cpp +++ b/src/EXTRA-COMPUTE/compute_slcsa_atom.cpp @@ -81,12 +81,12 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : int twojmax = utils::inumeric(FLERR, arg[3], false, lmp); if (twojmax < 0) - error->all(FLERR, "Illegal compute slcsa/atom command: twojmax must be a non-negative integer"); + error->all(FLERR, 3, "Illegal compute slcsa/atom command: twojmax must be >= 0"); ncomps = compute_ncomps(twojmax); nclasses = utils::inumeric(FLERR, arg[4], false, lmp); if (nclasses < 2) - error->all(FLERR, "Illegal compute slcsa/atom command: nclasses must be greater than 1"); + error->all(FLERR, 4, "Illegal compute slcsa/atom command: nclasses must be greater than 1"); database_mean_descriptor_file = arg[5]; lda_scalings_file = arg[6]; @@ -116,11 +116,12 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : val.which = argi.get_type(); val.argindex = argi.get_index1(); val.id = argi.get_name(); + if ((val.which == ArgInfo::FIX) || (val.which == ArgInfo::VARIABLE) || (val.which == ArgInfo::UNKNOWN) || (val.which == ArgInfo::NONE) || (argi.get_dim() > 1)) - error->all(FLERR, "Invalid compute slcsa/atom argument: {}", arg[0]); + error->all(FLERR, 10, "Invalid compute slcsa/atom argument: {}", arg[0]); - // if wildcard expansion occurred, free earg memory from exapnd_args() + // if wildcard expansion occurred, free earg memory from expand_args() if (expand) { for (int i = 0; i < nvalues; i++) delete[] earg[i]; @@ -128,15 +129,19 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : } val.val.c = modify->get_compute_by_id(val.id); - if (!val.val.c) error->all(FLERR, "Compute ID {} for fix slcsa/atom does not exist", val.id); + if (!val.val.c) error->all(FLERR, 10, "Compute ID {} for fix slcsa/atom does not exist", val.id); if (val.val.c->peratom_flag == 0) - error->all(FLERR, "Compute slcsa/atom compute {} does not calculate per-atom values", val.id); + error->all(FLERR, 10, "Compute slcsa/atom compute {} does not calculate per-atom values", + val.id); if (val.argindex == 0 && val.val.c->size_peratom_cols != 0) - error->all(FLERR, "Compute slcsa/atom compute {} does not calculate a per-atom vector", val.id); + error->all(FLERR, 10, "Compute slcsa/atom compute {} does not calculate a per-atom vector", + val.id); if (val.argindex && val.val.c->size_peratom_cols == 0) - error->all(FLERR, "Compute slcsa/atom compute {} does not calculate a per-atom array", val.id); + error->all(FLERR, 10, "Compute slcsa/atom compute {} does not calculate a per-atom array", + val.id); if (val.argindex && val.argindex > val.val.c->size_peratom_cols) - error->all(FLERR, "Compute slcsa/atom compute {} array is accessed out-of-range", val.id); + error->all(FLERR, 10, "Compute slcsa/atom compute {} array is accessed out-of-range{}", val.id, + utils::errorurl(20)); descriptorval = val; memory->create(database_mean_descriptor, ncomps, "slcsa/atom:database_mean_descriptor"); memory->create(lda_scalings, ncomps, nclasses - 1, "slcsa/atom:lda_scalings"); @@ -150,7 +155,7 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : if (comm->me == 0) { if (strcmp(database_mean_descriptor_file, "NULL") == 0) { - error->one(FLERR, + error->one(FLERR, Error::NOLASTLINE, "Cannot open database mean descriptor file {}: ", database_mean_descriptor_file, utils::getsyserror()); } else { @@ -165,8 +170,8 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : } if (strcmp(lda_scalings_file, "NULL") == 0) { - error->one(FLERR, "Cannot open database linear discriminant analysis scalings file {}: ", - lda_scalings_file, utils::getsyserror()); + error->one(FLERR, Error::NOLASTLINE, "Cannot open database linear discriminant analysis " + "scalings file {}: ", lda_scalings_file, utils::getsyserror()); } else { PotentialFileReader reader(lmp, lda_scalings_file, "lda scalings file"); int nread = 0; @@ -180,8 +185,8 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : } if (strcmp(lr_decision_file, "NULL") == 0) { - error->one(FLERR, "Cannot open logistic regression decision file {}: ", lr_decision_file, - utils::getsyserror()); + error->one(FLERR, Error::NOLASTLINE, "Cannot open logistic regression decision file {}: ", + lr_decision_file, utils::getsyserror()); } else { PotentialFileReader reader(lmp, lr_decision_file, "lr decision file"); int nread = 0; @@ -195,8 +200,8 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : } if (strcmp(lr_bias_file, "NULL") == 0) { - error->one(FLERR, "Cannot open logistic regression bias file {}: ", lr_bias_file, - utils::getsyserror()); + error->one(FLERR, Error::NOLASTLINE, "Cannot open logistic regression bias file {}: ", + lr_bias_file, utils::getsyserror()); } else { PotentialFileReader reader(lmp, lr_bias_file, "lr bias file"); auto values = reader.next_values(nclasses); @@ -207,7 +212,8 @@ ComputeSLCSAAtom::ComputeSLCSAAtom(LAMMPS *lmp, int narg, char **arg) : } if (strcmp(maha_file, "NULL") == 0) { - error->one(FLERR, "Cannot open mahalanobis stats file {}: ", maha_file, utils::getsyserror()); + error->one(FLERR, Error::NOLASTLINE, "Cannot open mahalanobis stats file {}: ", maha_file, + utils::getsyserror()); } else { PotentialFileReader reader(lmp, maha_file, "mahalanobis stats file"); int nvalues = nclasses * ((nclasses - 1) * (nclasses - 1) + nclasses); diff --git a/src/EXTRA-FIX/fix_ave_correlate_long.cpp b/src/EXTRA-FIX/fix_ave_correlate_long.cpp index 8407f62aac..e3ee7b2c34 100644 --- a/src/EXTRA-FIX/fix_ave_correlate_long.cpp +++ b/src/EXTRA-FIX/fix_ave_correlate_long.cpp @@ -225,8 +225,8 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS *lmp, int narg, char **arg) : "Fix ave/correlate/long compute {} does not calculate a vector", val.id); if (val.argindex && val.argindex > val.val.c->size_vector) error->all(FLERR, val.iarg, - "Fix ave/correlate/long compute {} vector is accessed out-of-range", - val.id); + "Fix ave/correlate/long compute {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); } else if (val.which == ArgInfo::FIX) { val.val.f = modify->get_fix_by_id(val.id); @@ -241,7 +241,8 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS *lmp, int narg, char **arg) : "Fix ave/correlate/long fix {} does not calculate a vector", val.id); if (val.argindex && val.argindex > val.val.f->size_vector) error->all(FLERR, val.iarg, - "Fix ave/correlate/long fix {} vector is accessed out-of-range", val.id); + "Fix ave/correlate/long fix {} vector is accessed out-of-range{}", + val.id, utils::errorurl(20)); if (nevery % val.val.f->global_freq) error->all(FLERR, val.iarg, "Fix {} for fix ave/correlate/long not computed at compatible time{}", @@ -257,8 +258,7 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS *lmp, int narg, char **arg) : "Fix ave/correlate/long variable {} is not equal-style variable", val.id); if (val.argindex && input->variable->vectorstyle(val.val.v) == 0) error->all(FLERR, val.iarg, - "Fix ave/correlate/long variable {} is not vector-style variable", - val.id); + "Fix ave/correlate/long variable {} is not vector-style variable", val.id); } } diff --git a/src/EXTRA-FIX/fix_controller.cpp b/src/EXTRA-FIX/fix_controller.cpp index d7989c79d7..90ebed801d 100644 --- a/src/EXTRA-FIX/fix_controller.cpp +++ b/src/EXTRA-FIX/fix_controller.cpp @@ -39,7 +39,7 @@ FixController::FixController(LAMMPS *lmp, int narg, char **arg) : extvector = 0; nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal fix controller command"); + if (nevery <= 0) error->all(FLERR, 3, "Illegal fix controller nevery value {}", nevery); alpha = utils::numeric(FLERR,arg[4],false,lmp); kp = utils::numeric(FLERR,arg[5],false,lmp); @@ -52,7 +52,7 @@ FixController::FixController(LAMMPS *lmp, int narg, char **arg) : if ((argi.get_type() == ArgInfo::UNKNOWN) || (argi.get_type() == ArgInfo::NONE) || (argi.get_dim() != 0)) - error->all(FLERR,"Illegal fix controller command"); + error->all(FLERR,8,"Illegal fix controller argument {}", arg[8]); pvwhich = argi.get_type(); pvindex = argi.get_index1(); @@ -60,48 +60,51 @@ FixController::FixController(LAMMPS *lmp, int narg, char **arg) : // setpoint arg - int iarg=9; - setpoint = utils::numeric(FLERR,arg[iarg],false,lmp); - iarg++; + setpoint = utils::numeric(FLERR,arg[9],false,lmp); // control variable arg - cvID = utils::strdup(arg[iarg]); + cvID = utils::strdup(arg[10]); // error check if (pvwhich == ArgInfo::COMPUTE) { Compute *c = modify->get_compute_by_id(pvID); - if (!c) error->all(FLERR,"Compute ID {} for fix controller does not exist", pvID); + if (!c) error->all(FLERR, 8, "Compute ID {} for fix controller does not exist", pvID); int flag = 0; if (c->scalar_flag && pvindex == 0) flag = 1; else if (c->vector_flag && pvindex > 0) flag = 1; if (!flag) - error->all(FLERR,"Fix controller compute does not calculate a global scalar or vector"); + error->all(FLERR, 8, "Fix controller compute {} does not calculate a global scalar or " + "vector", pvID); if (pvindex && pvindex > c->size_vector) - error->all(FLERR,"Fix controller compute vector is accessed out-of-range"); + error->all(FLERR, 8, "Fix controller compute {} vector is accessed out-of-range{}", + pvID, utils::errorurl(20)); } else if (pvwhich == ArgInfo::FIX) { Fix *f = modify->get_fix_by_id(pvID); - if (!f) error->all(FLERR,"Fix ID {} for fix controller does not exist", pvID); + if (!f) error->all(FLERR, 8, "Fix ID {} for fix controller does not exist", pvID); int flag = 0; if (f->scalar_flag && pvindex == 0) flag = 1; else if (f->vector_flag && pvindex > 0) flag = 1; - if (!flag) error->all(FLERR,"Fix controller fix does not calculate a global scalar or vector"); + if (!flag) + error->all(FLERR, 8, "Fix controller fix {} does not calculate a global scalar or vector", + pvID); if (pvindex && pvindex > f->size_vector) - error->all(FLERR,"Fix controller fix vector is accessed out-of-range"); + error->all(FLERR, 8, "Fix controller fix {} vector is accessed out-of-range{}", pvID, + utils::errorurl(20)); } else if (pvwhich == ArgInfo::VARIABLE) { int ivariable = input->variable->find(pvID); if (ivariable < 0) - error->all(FLERR,"Variable name for fix controller does not exist"); + error->all(FLERR, 8, "Variable name {} for fix controller does not exist", pvID); if (input->variable->equalstyle(ivariable) == 0) - error->all(FLERR,"Fix controller variable is not equal-style variable"); + error->all(FLERR, 8, "Fix controller variable {} is not equal-style variable", pvID); } int ivariable = input->variable->find(cvID); if (ivariable < 0) - error->all(FLERR,"Variable name for fix controller does not exist"); + error->all(FLERR, 10, "Variable name {} for fix controller does not exist", cvID); if (input->variable->internalstyle(ivariable) == 0) - error->all(FLERR,"Fix controller variable is not internal-style variable"); + error->all(FLERR, 10, "Fix controller variable {} is not internal-style variable", cvID); control = input->variable->compute_equal(ivariable); firsttime = 1; @@ -130,19 +133,26 @@ void FixController::init() { if (pvwhich == ArgInfo::COMPUTE) { pcompute = modify->get_compute_by_id(pvID); - if (!pcompute) error->all(FLERR,"Compute ID {} for fix controller does not exist", pvID); + if (!pcompute) + error->all(FLERR, Error::NOLASTLINE, + "Compute ID {} for fix controller does not exist", pvID); } else if (pvwhich == ArgInfo::FIX) { pfix = modify->get_fix_by_id(pvID); - if (!pfix) error->all(FLERR,"Fix ID {} for fix controller does not exist", pvID); + if (!pfix) + error->all(FLERR, Error::NOLASTLINE, "Fix ID {} for fix controller does not exist", pvID); } else if (pvwhich == ArgInfo::VARIABLE) { pvar = input->variable->find(pvID); - if (pvar < 0) error->all(FLERR,"Variable name for fix controller does not exist"); + if (pvar < 0) + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for fix controller does not exist", + pvID); } cvar = input->variable->find(cvID); - if (cvar < 0) error->all(FLERR,"Variable name for fix controller does not exist"); + if (cvar < 0) + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for fix controller does not exist", + cvID); // set sampling time diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index 8fe8c0f5fb..11cf79328c 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -1811,7 +1811,8 @@ int DumpVTK::parse_fields(int narg, char **arg) if (argi.get_dim() > 0 && ifix->size_peratom_cols == 0) error->all(FLERR,"Dump vtk fix {} does not compute per-atom array",aname); if (argi.get_dim() > 0 && argi.get_index1() > ifix->size_peratom_cols) - error->all(FLERR,"Dump vtk fix {} vector is accessed out-of-range",aname); + error->all(FLERR,"Dump vtk fix {} vector is accessed out-of-range{}", + aname, utils::errorurl(20)); field2index[ATTRIBUTES+iarg] = add_fix(aname); name[ATTRIBUTES+iarg] = arg[iarg]; @@ -1851,7 +1852,8 @@ int DumpVTK::parse_fields(int narg, char **arg) if (!flag || !cols) error->all(FLERR,"Property double array {} for dump vtk does not exist",aname); if (argindex[ATTRIBUTES+iarg] > atom->dcols[n]) - error->all(FLERR,"Dump vtk property array {} is accessed out-of-range",aname); + error->all(FLERR,"Dump vtk property array {} is accessed out-of-range{}",aname, + utils::errorurl(20)); } field2index[ATTRIBUTES+iarg] = add_custom(aname,1); name[ATTRIBUTES+iarg] = arg[iarg]; @@ -1874,7 +1876,8 @@ int DumpVTK::parse_fields(int narg, char **arg) if (flag || !cols) error->all(FLERR,"Property integer array {} for dump vtk does not exist",aname); if (argindex[ATTRIBUTES+iarg] > atom->icols[n]) - error->all(FLERR,"Dump vtk property array {} is accessed out-of-range",aname); + error->all(FLERR,"Dump vtk property array {} is accessed out-of-range{}",aname, + utils::errorurl(20)); } field2index[ATTRIBUTES+iarg] = add_custom(aname,0); name[ATTRIBUTES+iarg] = arg[iarg]; diff --git a/src/fix_ave_grid.cpp b/src/fix_ave_grid.cpp index 9ed91294c0..f2a3a5bc92 100644 --- a/src/fix_ave_grid.cpp +++ b/src/fix_ave_grid.cpp @@ -310,7 +310,8 @@ FixAveGrid::FixAveGrid(LAMMPS *lmp, int narg, char **arg) : "Fix ave/atom compute {} does not calculate a per-atom array", ids[i]); if (argindex[i] && (argindex[i] > icompute->size_peratom_cols)) error->all(FLERR, iarg_orig[i], - "Fix ave/atom compute {} array is accessed out-of-range", ids[i]); + "Fix ave/atom compute {} array is accessed out-of-range{}", ids[i], + utils::errorurl(20)); } else if (which[i] == ArgInfo::FIX) { auto ifix = modify->get_fix_by_id(ids[i]); @@ -327,10 +328,12 @@ FixAveGrid::FixAveGrid(LAMMPS *lmp, int narg, char **arg) : "Fix ave/atom fix {} does not calculate a per-atom array", ids[i]); if (argindex[i] && (argindex[i] > ifix->size_peratom_cols)) error->all(FLERR, iarg_orig[i], - "Fix ave/atom fix {} array is accessed out-of-range", ids[i]); + "Fix ave/atom fix {} array is accessed out-of-range{}", ids[i], + utils::errorurl(20)); if (nevery % ifix->peratom_freq) error->all(FLERR, iarg_orig[i], - "Fix {} for fix ave/atom not computed at compatible time", ids[i]); + "Fix {} for fix ave/atom not computed at compatible time{}", ids[i], + utils::errorurl(7)); } else if (which[i] == ArgInfo::VARIABLE) { int ivariable = input->variable->find(ids[i]); diff --git a/src/set.cpp b/src/set.cpp index 93d5068ef3..37aeb212be 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -57,10 +57,11 @@ enum{TYPE,TYPE_FRACTION,TYPE_RATIO,TYPE_SUBSET, void Set::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Set command before simulation box is defined"); + error->all(FLERR, Error::NOLASTLINE, "Set command before simulation box is defined" + + utils::errorurl(0)); if (atom->natoms == 0) - error->all(FLERR,"Set command on system without atoms"); - if (narg < 4) error->all(FLERR,"Illegal set command: need at least four arguments"); + error->all(FLERR, Error::NOLASTLINE, "Set command on system without atoms"); + if (narg < 4) error->all(FLERR, 1, "Illegal set command: need at least four arguments"); // style and ID info @@ -69,7 +70,7 @@ void Set::command(int narg, char **arg) else if (strcmp(arg[0],"type") == 0) style = TYPE_SELECT; else if (strcmp(arg[0],"group") == 0) style = GROUP_SELECT; else if (strcmp(arg[0],"region") == 0) style = REGION_SELECT; - else error->all(FLERR,"Unknown set command style: {}", arg[0]); + else error->all(FLERR, Error::ARGZERO, "Unknown set command style: {}", arg[0]); id = utils::strdup(arg[1]); select = nullptr; @@ -101,11 +102,13 @@ void Set::command(int narg, char **arg) fraction = utils::numeric(FLERR, arg[iarg+2], false, lmp); ivalue = utils::inumeric(FLERR, arg[iarg+3], false, lmp); if (newtype <= 0 || newtype > atom->ntypes) - error->all(FLERR,"Invalid type value {} in set type/fraction command", newtype); + error->all(FLERR, iarg + 1, "Invalid type value {} in set type/fraction command", newtype); if (fraction < 0.0 || fraction > 1.0) - error->all(FLERR,"Invalid fraction value {} in set type/fraction command", fraction); + error->all(FLERR, iarg + 2, "Invalid fraction value {} in set type/fraction command", + fraction); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed {} in set type/fraction command", ivalue); + error->all(FLERR, iarg + 3, "Invalid random number seed {} in set type/fraction command", + ivalue); setrandom(TYPE_FRACTION); iarg += 4; @@ -115,11 +118,13 @@ void Set::command(int narg, char **arg) fraction = utils::numeric(FLERR, arg[iarg+2], false, lmp); ivalue = utils::inumeric(FLERR, arg[iarg+3], false, lmp); if (newtype <= 0 || newtype > atom->ntypes) - error->all(FLERR,"Invalid type value {} in set type/ratio command", newtype); + error->all(FLERR, iarg + 1, "Invalid type value {} in set type/ratio command", newtype); if (fraction < 0.0 || fraction > 1.0) - error->all(FLERR,"Invalid fraction value {} in set type/ratio command", fraction); + error->all(FLERR, iarg + 2, "Invalid fraction value {} in set type/ratio command", + fraction); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed {} in set type/ratio command", ivalue); + error->all(FLERR, iarg + 3, "Invalid random number seed {} in set type/ratio command", + ivalue); setrandom(TYPE_RATIO); iarg += 4; @@ -129,11 +134,12 @@ void Set::command(int narg, char **arg) nsubset = utils::bnumeric(FLERR, arg[iarg+2], false, lmp); ivalue = utils::inumeric(FLERR, arg[iarg+3], false, lmp); if (newtype <= 0 || newtype > atom->ntypes) - error->all(FLERR,"Invalid type value {} in set type/subset command", newtype); + error->all(FLERR, iarg + 1, "Invalid type value {} in set type/subset command", newtype); if (nsubset < 0) - error->all(FLERR,"Invalid subset size {} in set type/subset command", nsubset); + error->all(FLERR, iarg + 2, "Invalid subset size {} in set type/subset command", nsubset); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed {} in set type/subset command", ivalue); + error->all(FLERR, iarg + 3, "Invalid random number seed {} in set type/subset command", + ivalue); setrandom(TYPE_SUBSET); iarg += 4; @@ -142,7 +148,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (!atom->molecule_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(MOLECULE); iarg += 2; @@ -193,7 +200,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->q_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(CHARGE); iarg += 2; @@ -202,7 +210,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->rmass_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(MASS); iarg += 2; @@ -215,7 +224,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+3],"^v_")) varparse(arg[iarg+3],3); else zvalue = utils::numeric(FLERR,arg[iarg+3],false,lmp); if (!atom->ellipsoid_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SHAPE); iarg += 4; @@ -224,7 +234,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->line_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(LENGTH); iarg += 2; @@ -233,7 +244,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->tri_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(TRI); iarg += 2; @@ -246,7 +258,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+3],"^v_")) varparse(arg[iarg+3],3); else zvalue = utils::numeric(FLERR,arg[iarg+3],false,lmp); if (!atom->mu_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(DIPOLE); iarg += 4; @@ -255,11 +268,12 @@ void Set::command(int narg, char **arg) ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); dvalue = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (!atom->mu_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed in set command"); + error->all(FLERR, iarg + 1, "Invalid random number seed in set command"); if (dvalue <= 0.0) - error->all(FLERR,"Invalid dipole length in set command"); + error->all(FLERR, iarg + 2, "Invalid dipole length in set command"); setrandom(DIPOLE_RANDOM); iarg += 3; @@ -276,11 +290,13 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+4],"^v_")) varparse(arg[iarg+4],4); else zvalue = utils::numeric(FLERR,arg[iarg+4],false,lmp); if ((xvalue == 0.0) && (yvalue == 0.0) && (zvalue == 0.0)) - error->all(FLERR,"At least one spin vector component must be non-zero"); + error->all(FLERR, Error::NOPOINTER, "At least one spin vector component must be non-zero"); if (!atom->sp_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (dvalue <= 0.0) - error->all(FLERR,"Invalid spin magnitude {} in set {} command", dvalue, arg[iarg]); + error->all(FLERR, iarg + 1, "Invalid spin magnitude {} in set {} command", dvalue, + arg[iarg]); set(SPIN_ATOM); iarg += 5; @@ -293,11 +309,14 @@ void Set::command(int narg, char **arg) error->warning(FLERR, "Set attribute spin/random is deprecated. " "Please use spin/atom/random instead."); if (!atom->sp_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed {} in set {} command", ivalue, arg[iarg]); + error->all(FLERR, iarg + 1, "Invalid random number seed {} in set {} command", ivalue, + arg[iarg]); if (dvalue <= 0.0) - error->all(FLERR,"Invalid spin magnitude {} in set {} command", dvalue, arg[iarg]); + error->all(FLERR, iarg + 2, "Invalid spin magnitude {} in set {} command", dvalue, + arg[iarg]); setrandom(SPIN_RANDOM); iarg += 3; @@ -306,7 +325,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->eradius_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(RADIUS_ELECTRON); iarg += 2; @@ -315,7 +335,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->spin_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SPIN_ELECTRON); iarg += 2; @@ -330,7 +351,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+4],"^v_")) varparse(arg[iarg+4],4); else wvalue = utils::numeric(FLERR,arg[iarg+4],false,lmp); if (!atom->ellipsoid_flag && !atom->tri_flag && !atom->body_flag && !atom->quat_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(QUAT); iarg += 5; @@ -338,9 +360,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set quat/random", error); ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (!atom->ellipsoid_flag && !atom->tri_flag && !atom->body_flag && !atom->quat_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed in set command"); + error->all(FLERR, iarg + 1, "Invalid random number seed in set command"); setrandom(QUAT_RANDOM); iarg += 2; @@ -349,7 +372,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = DEG2RAD * utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->line_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(THETA); iarg += 2; @@ -357,9 +381,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set theta/random", error); ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (!atom->line_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0) - error->all(FLERR,"Invalid random number seed in set command"); + error->all(FLERR, iarg + 1, "Invalid random number seed in set command"); set(THETA_RANDOM); iarg += 2; @@ -372,7 +397,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+3],"^v_")) varparse(arg[iarg+3],3); else zvalue = utils::numeric(FLERR,arg[iarg+3],false,lmp); if (!atom->angmom_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(ANGMOM); iarg += 4; @@ -385,7 +411,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+3],"^v_")) varparse(arg[iarg+3],3); else zvalue = utils::numeric(FLERR,arg[iarg+3],false,lmp); if (!atom->omega_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(OMEGA); iarg += 4; @@ -394,7 +421,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->radius_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(RADIUS_ATOM); iarg += 2; @@ -403,7 +431,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->radius_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(DIAMETER); iarg += 2; @@ -413,13 +442,14 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->rmass_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); - if (dvalue <= 0.0) error->all(FLERR,"Invalid density in set command"); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); + if (dvalue <= 0.0) error->all(FLERR, iarg + 1, "Invalid density in set command"); discflag = 0; if (strcmp(arg[iarg],"density/disc") == 0) { discflag = 1; if (domain->dimension != 2) - error->all(FLERR,"Density/disc option requires 2d simulation"); + error->all(FLERR, Error::NOLASTLINE, "Density/disc option requires 2d simulation"); } set(DENSITY); iarg += 2; @@ -429,7 +459,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->temperature_flag) - error->all(FLERR,"Cannot set this attribute for this atom style"); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(TEMPERATURE); iarg += 2; @@ -438,8 +469,9 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->vfrac_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); - if (dvalue <= 0.0) error->all(FLERR,"Invalid volume in set command"); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); + if (dvalue <= 0.0) error->all(FLERR, iarg + 1, "Invalid volume in set command"); set(VOLUME); iarg += 2; @@ -462,14 +494,11 @@ void Set::command(int narg, char **arg) else zimage = utils::inumeric(FLERR,arg[iarg+3],false,lmp); } if (ximageflag && ximage && !domain->xperiodic) - error->all(FLERR, - "Cannot set non-zero image flag for non-periodic dimension"); + error->all(FLERR, iarg + 1,"Cannot set non-zero image flag for non-periodic dimension"); if (yimageflag && yimage && !domain->yperiodic) - error->all(FLERR, - "Cannot set non-zero image flag for non-periodic dimension"); + error->all(FLERR, iarg + 2, "Cannot set non-zero image flag for non-periodic dimension"); if (zimageflag && zimage && !domain->zperiodic) - error->all(FLERR, - "Cannot set non-zero image flag for non-periodic dimension"); + error->all(FLERR, iarg + 3, "Cannot set non-zero image flag for non-periodic dimension"); set(IMAGE); iarg += 4; @@ -477,9 +506,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set bond", error); ivalue = utils::expand_type_int(FLERR, arg[iarg+1], Atom::BOND, lmp); if (atom->avec->bonds_allow == 0) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0 || ivalue > atom->nbondtypes) - error->all(FLERR,"Invalid value in set command"); + error->all(FLERR, iarg + 1, "Invalid value {} in set bond command", ivalue); topology(BOND); iarg += 2; @@ -487,9 +517,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set angle", error); ivalue = utils::expand_type_int(FLERR, arg[iarg+1], Atom::ANGLE, lmp); if (atom->avec->angles_allow == 0) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0 || ivalue > atom->nangletypes) - error->all(FLERR,"Invalid value in set command"); + error->all(FLERR, iarg + 1, "Invalid value {} in set angle command", ivalue); topology(ANGLE); iarg += 2; @@ -497,8 +528,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set dihedral", error); ivalue = utils::expand_type_int(FLERR, arg[iarg+1], Atom::DIHEDRAL, lmp); if (atom->avec->dihedrals_allow == 0) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0 || ivalue > atom->ndihedraltypes) + error->all(FLERR, iarg + 1, "Invalid value {} in set dihedral command", ivalue); error->all(FLERR,"Invalid value in set command"); topology(DIHEDRAL); iarg += 2; @@ -507,9 +540,10 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set improper", error); ivalue = utils::expand_type_int(FLERR, arg[iarg+1], Atom::IMPROPER, lmp); if (atom->avec->impropers_allow == 0) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); if (ivalue <= 0 || ivalue > atom->nimpropertypes) - error->all(FLERR,"Invalid value in set command"); + error->all(FLERR, iarg + 1, "Invalid value {} in set improper command", ivalue); topology(IMPROPER); iarg += 2; @@ -518,7 +552,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->rho_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SPH_RHO); iarg += 2; @@ -527,7 +562,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (!atom->rheo_status_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(RHEO_STATUS); iarg += 2; @@ -536,7 +572,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->esph_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SPH_E); iarg += 2; @@ -545,7 +582,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->cv_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SPH_CV); iarg += 2; @@ -554,7 +592,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->rho_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SPH_RHO); iarg += 2; @@ -564,10 +603,12 @@ void Set::command(int narg, char **arg) else if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else { dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + if (dvalue < 0.0) + error->all(FLERR, iarg + 1, "Invalid value {} in set edpd/temp command", dvalue); } if (!atom->edpd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(EDPD_TEMP); iarg += 2; @@ -577,10 +618,12 @@ void Set::command(int narg, char **arg) else if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else { dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + if (dvalue < 0.0) + error->all(FLERR, iarg + 1, "Invalid value {} in set edpd/cv command", dvalue); } if (!atom->edpd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(EDPD_CV); iarg += 2; @@ -592,9 +635,11 @@ void Set::command(int narg, char **arg) cc_index = utils::inumeric(FLERR,arg[iarg+1],false,lmp); dvalue = utils::numeric(FLERR,arg[iarg+2],false,lmp); if (cc_index < 1) error->all(FLERR,"Illegal set command"); + error->all(FLERR, iarg + 1, "Invalid index value {} in set cc command", cc_index); } if (!atom->tdpd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(CC); iarg += 3; @@ -603,7 +648,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->smd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SMD_MASS_DENSITY); iarg += 2; @@ -612,7 +658,8 @@ void Set::command(int narg, char **arg) if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (!atom->smd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(SMD_CONTACT_RADIUS); iarg += 2; @@ -622,10 +669,12 @@ void Set::command(int narg, char **arg) else if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else { dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + if (dvalue < 0.0) + error->all(FLERR, iarg + 1, "Invalid value {} in set dpd/theta command", dvalue); } if (!atom->dpd_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(DPDTHETA); iarg += 2; @@ -635,10 +684,12 @@ void Set::command(int narg, char **arg) else if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else { dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (dvalue < 0.0) error->all(FLERR,"Illegal set command"); + if (dvalue < 0.0) + error->all(FLERR, iarg + 1, "Invalid value {} in set epsilon command", dvalue); } if (!atom->dielectric_flag) - error->all(FLERR,"Cannot set attribute {} for atom style {}", arg[iarg], atom->get_style()); + error->all(FLERR, iarg, "Cannot set attribute {} for atom style {}", arg[iarg], + atom->get_style()); set(EPSILON); iarg += 2; @@ -652,26 +703,29 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "set", error); index_custom = atom->find_custom(argi.get_name(),flag,cols); if (index_custom < 0) - error->all(FLERR,"Set keyword or custom property {} does not exist",pname); + error->all(FLERR, iarg, "Set keyword or custom property {} does not exist", pname); switch (argi.get_type()) { case ArgInfo::INAME: if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - if (flag != 0) error->all(FLERR,"Set command custom property {} is not integer",pname); + if (flag != 0) + error->all(FLERR, iarg + 1, "Set command custom property {} is not integer", pname); if (argi.get_dim() == 0) { if (cols > 0) - error->all(FLERR,"Set command custom integer property {} is not a vector",pname); + error->all(FLERR, iarg, "Set command custom integer property {} is not a vector", + pname); set(IVEC); } else if (argi.get_dim() == 1) { if (cols == 0) - error->all(FLERR,"Set command custom integer property {} is not an array",pname); + error->all(FLERR, iarg, "Set command custom integer property {} is not an array", + pname); icol_custom = argi.get_index1(); if (icol_custom <= 0 || icol_custom > cols) - error->all(FLERR,"Set command per-atom custom integer array {} is accessed " - "out-of-range",pname); + error->all(FLERR, iarg, "Set command per-atom custom integer array {} is accessed " + "out-of-range{}", pname, utils::errorurl(20)); set(IARRAY); } else error->all(FLERR,"Illegal set command"); break; @@ -683,15 +737,15 @@ void Set::command(int narg, char **arg) if (argi.get_dim() == 0) { if (cols > 0) - error->all(FLERR,"Set command custom double property {} is not a vector",pname); + error->all(FLERR, iarg, "Set command custom double property {} is not a vector", pname); set(DVEC); } else if (argi.get_dim() == 1) { if (cols == 0) - error->all(FLERR,"Set command custom double property {} is not an array",pname); + error->all(FLERR, iarg, "Set command custom double property {} is not an array", pname); icol_custom = argi.get_index1(); if (icol_custom <= 0 || icol_custom > cols) - error->all(FLERR,"Set command per-atom custom double array {} is " - "accessed out-of-range",pname); + error->all(FLERR, iarg, "Set command per-atom custom double array {} is accessed " + "out-of-range{}", pname, utils::errorurl(20)); set(DARRAY); } else error->all(FLERR,"Illegal set command"); break; @@ -737,7 +791,7 @@ void Set::selection(int n) if (style == ATOM_SELECT) { if (atom->tag_enable == 0) - error->all(FLERR,"Cannot use set atom with no atom IDs defined"); + error->all(FLERR, Error::NOLASTLINE, "Cannot use set atom with no atom IDs defined"); bigint nlobig,nhibig; utils::bounds(FLERR,id,1,MAXTAGINT,nlobig,nhibig,error); @@ -748,7 +802,7 @@ void Set::selection(int n) } else if (style == MOL_SELECT) { if (atom->molecule_flag == 0) - error->all(FLERR,"Cannot use set mol with no molecule IDs defined"); + error->all(FLERR, Error::NOLASTLINE, "Cannot use set mol with no molecule IDs defined"); bigint nlobig,nhibig; utils::bounds(FLERR,id,1,MAXTAGINT,nlobig,nhibig,error); @@ -767,7 +821,7 @@ void Set::selection(int n) } else if (style == GROUP_SELECT) { int igroup = group->find(id); - if (igroup == -1) error->all(FLERR,"Could not find set group ID {}", id); + if (igroup == -1) error->all(FLERR, Error::NOLASTLINE, "Could not find set group ID {}", id); int groupbit = group->bitmask[igroup]; int *mask = atom->mask; @@ -777,7 +831,7 @@ void Set::selection(int n) } else if (style == REGION_SELECT) { auto region = domain->get_region_by_id(id); - if (!region) error->all(FLERR,"Set region {} does not exist", id); + if (!region) error->all(FLERR, Error::NOLASTLINE, "Set region {} does not exist", id); region->prematch(); double **x = atom->x; @@ -871,7 +925,7 @@ void Set::set(int keyword) if (keyword == TYPE) { if (ivalue <= 0 || ivalue > atom->ntypes) - error->one(FLERR,"Invalid value in set command"); + error->one(FLERR, Error::NOLASTLINE, "Invalid value {} in set type command", ivalue); atom->type[i] = ivalue; } else if (keyword == MOLECULE) atom->molecule[i] = ivalue; @@ -886,21 +940,25 @@ void Set::set(int keyword) // ensure that scaled charges are consistent the new charge value if (atom->epsilon) atom->q_scaled[i] = dvalue / atom->epsilon[i]; } else if (keyword == MASS) { - if (dvalue <= 0.0) error->one(FLERR,"Invalid mass in set command"); + if (dvalue <= 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid mass {} in set command", dvalue); atom->rmass[i] = dvalue; } else if (keyword == DIAMETER) { - if (dvalue < 0.0) error->one(FLERR,"Invalid diameter in set command"); + if (dvalue < 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid diameter {} in set command", dvalue); atom->radius[i] = 0.5 * dvalue; } else if (keyword == VOLUME) { - if (dvalue <= 0.0) error->one(FLERR,"Invalid volume in set command"); + if (dvalue <= 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid volume {} in set command", dvalue); atom->vfrac[i] = dvalue; } else if (keyword == RHEO_STATUS) { if (ivalue != 0 && ivalue != 1) - error->one(FLERR,"Invalid value {} in set command for rheo/status", ivalue); + error->one(FLERR, Error::NOLASTLINE, "Invalid value {} in set command for rheo/status", + ivalue); atom->rheo_status[i] = ivalue; } @@ -936,10 +994,12 @@ void Set::set(int keyword) else if (keyword == SHAPE) { if (xvalue < 0.0 || yvalue < 0.0 || zvalue < 0.0) - error->one(FLERR,"Invalid shape in set command"); + error->one(FLERR, Error::NOLASTLINE, "Invalid ellipsoid shape {} {} {} in set command", + xvalue, yvalue, zvalue); if (xvalue > 0.0 || yvalue > 0.0 || zvalue > 0.0) { if (xvalue == 0.0 || yvalue == 0.0 || zvalue == 0.0) - error->one(FLERR,"Invalid shape in set command"); + error->one(FLERR, Error::NOLASTLINE, "Invalid ellipsoid shape {} {} {} in set command", + xvalue, yvalue, zvalue); } avec_ellipsoid->set_shape(i,0.5*xvalue,0.5*yvalue,0.5*zvalue); } @@ -947,14 +1007,16 @@ void Set::set(int keyword) // set length of line particle else if (keyword == LENGTH) { - if (dvalue < 0.0) error->one(FLERR,"Invalid length in set command"); + if (dvalue < 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid length {} in set command", dvalue); avec_line->set_length(i,dvalue); } // set corners of tri particle else if (keyword == TRI) { - if (dvalue < 0.0) error->one(FLERR,"Invalid length in set command"); + if (dvalue < 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid length {} in set command", dvalue); avec_tri->set_equilateral(i,dvalue); } @@ -966,7 +1028,8 @@ void Set::set(int keyword) // else set rmass to density directly else if (keyword == DENSITY) { - if (dvalue <= 0.0) error->one(FLERR,"Invalid density in set command"); + if (dvalue <= 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid density {} in set command", dvalue); if (atom->radius_flag && atom->radius[i] > 0.0) if (discflag) atom->rmass[i] = MY_PI*atom->radius[i]*atom->radius[i] * dvalue; @@ -1013,7 +1076,8 @@ void Set::set(int keyword) else if (keyword == SPIN_ATOM) { if (dvalue < 0.0) - error->one(FLERR,"Incorrect value for atomic spin magnitude: {}", dvalue); + error->one(FLERR, Error::NOLASTLINE, "Incorrect value for atomic spin magnitude: {}", + dvalue); double **sp = atom->sp; double inorm = 1.0/sqrt(xvalue*xvalue+yvalue*yvalue+zvalue*zvalue); sp[i][0] = inorm*xvalue; @@ -1027,7 +1091,7 @@ void Set::set(int keyword) else if (keyword == RADIUS_ELECTRON) { atom->eradius[i] = dvalue; if (dvalue < 0.0) - error->one(FLERR,"Incorrect value for electron radius: {}", dvalue); + error->one(FLERR, Error::NOLASTLINE, "Incorrect value for electron radius: {}", dvalue); } // set electron spin @@ -1036,7 +1100,7 @@ void Set::set(int keyword) if ((dvalue == -1) || (dvalue == 1) || (dvalue == 0) || (dvalue == 2) || (dvalue == 3)) atom->spin[i] = (int)dvalue; else - error->one(FLERR,"Incorrect value for electron spin: {}", dvalue); + error->one(FLERR, Error::NOLASTLINE, "Incorrect value for electron spin: {}", dvalue); } // set quaternion orientation of ellipsoid or tri or body particle or sphere/bpm @@ -1054,9 +1118,10 @@ void Set::set(int keyword) else if (atom->quat_flag) quat2 = atom->quat; else - error->one(FLERR,"Cannot set quaternion for atom that has none"); + error->one(FLERR, Error::NOLASTLINE, "Cannot set quaternion for atom that has none"); if (domain->dimension == 2 && (xvalue != 0.0 || yvalue != 0.0)) - error->one(FLERR,"Cannot set quaternion with xy components for 2d system"); + error->one(FLERR, Error::NOLASTLINE, + "Cannot set quaternion with xy components for 2d system"); const double theta2 = MY_PI2 * wvalue/180.0; const double sintheta2 = sin(theta2); @@ -1083,7 +1148,7 @@ void Set::set(int keyword) else if (keyword == THETA) { if (atom->line[i] < 0) - error->one(FLERR,"Cannot set theta for atom that is not a line"); + error->one(FLERR, Error::NOLASTLINE, "Cannot set theta for atom that is not a line"); avec_line->bonus[atom->line[i]].theta = dvalue; } @@ -1104,7 +1169,8 @@ void Set::set(int keyword) // set temperature of particle else if (keyword == TEMPERATURE) { - if (dvalue < 0.0) error->one(FLERR,"Invalid temperature in set command"); + if (dvalue < 0.0) + error->one(FLERR, Error::NOLASTLINE, "Invalid temperature {} in set command", dvalue); atom->temperature[i] = dvalue; } @@ -1240,7 +1306,7 @@ void Set::setrandom(int keyword) nsubset = static_cast (fraction * allcount); } else if (keyword == TYPE_SUBSET) { if (nsubset > allcount) - error->all(FLERR,"Set type/subset value exceeds eligible atoms"); + error->all(FLERR, Error::NOLASTLINE, "Set type/subset value exceeds eligible atoms"); } // make selection @@ -1372,7 +1438,7 @@ void Set::setrandom(int keyword) else if (atom->quat_flag) quat2 = atom->quat; else - error->one(FLERR,"Cannot set quaternion for atom that has none"); + error->one(FLERR, Error::NOLASTLINE, "Cannot set quaternion for atom that has none"); ranpark->reset(seed,x[i]); s = ranpark->uniform(); @@ -1405,7 +1471,7 @@ void Set::setrandom(int keyword) else if (atom->quat_flag) quat2 = atom->quat; else - error->one(FLERR,"Cannot set quaternion for atom that has none"); + error->one(FLERR, Error::NOLASTLINE, "Cannot set quaternion for atom that has none"); ranpark->reset(seed,x[i]); theta2 = MY_PI*ranpark->uniform(); @@ -1431,7 +1497,7 @@ void Set::setrandom(int keyword) for (i = 0; i < nlocal; i++) { if (select[i]) { if (atom->line[i] < 0) - error->one(FLERR,"Cannot set theta for atom that is not a line"); + error->one(FLERR, Error::NOLASTLINE, "Cannot set theta for atom that is not a line"); ranpark->reset(seed,x[i]); avec_line->bonus[atom->line[i]].theta = MY_2PI*ranpark->uniform(); count++; @@ -1452,7 +1518,7 @@ void Set::topology(int keyword) // error check if (atom->molecular == Atom::TEMPLATE) - error->all(FLERR,"Cannot set bond topology types for atom style template"); + error->all(FLERR, Error::NOLASTLINE, "Cannot set bond topology types for atom style template"); // border swap to acquire ghost atom info // enforce PBC before in case atoms are outside box @@ -1481,7 +1547,9 @@ void Set::topology(int keyword) for (int i = 0; i < nlocal; i++) for (m = 0; m < atom->num_bond[i]; m++) { atom1 = atom->map(atom->bond_atom[i][m]); - if (atom1 == -1) error->one(FLERR,"Bond atom missing in set command"); + if (atom1 == -1) + error->one(FLERR, Error::NOLASTLINE, "Bond atom missing in set command" + + utils::errorurl(5)); if (select[i] && select[atom1]) { atom->bond_type[i][m] = ivalue; count++; @@ -1499,7 +1567,8 @@ void Set::topology(int keyword) atom2 = atom->map(atom->angle_atom2[i][m]); atom3 = atom->map(atom->angle_atom3[i][m]); if (atom1 == -1 || atom2 == -1 || atom3 == -1) - error->one(FLERR,"Angle atom missing in set command"); + error->one(FLERR, Error::NOLASTLINE, "Angle atom missing in set command" + + utils::errorurl(5)); if (select[atom1] && select[atom2] && select[atom3]) { atom->angle_type[i][m] = ivalue; count++; @@ -1518,7 +1587,8 @@ void Set::topology(int keyword) atom3 = atom->map(atom->dihedral_atom3[i][m]); atom4 = atom->map(atom->dihedral_atom4[i][m]); if (atom1 == -1 || atom2 == -1 || atom3 == -1 || atom4 == -1) - error->one(FLERR,"Dihedral atom missing in set command"); + error->one(FLERR, Error::NOLASTLINE, "Dihedral atom missing in set command" + + utils::errorurl(5)); if (select[atom1] && select[atom2] && select[atom3] && select[atom4]) { atom->dihedral_type[i][m] = ivalue; count++; @@ -1537,7 +1607,8 @@ void Set::topology(int keyword) atom3 = atom->map(atom->improper_atom3[i][m]); atom4 = atom->map(atom->improper_atom4[i][m]); if (atom1 == -1 || atom2 == -1 || atom3 == -1 || atom4 == -1) - error->one(FLERR,"Improper atom missing in set command"); + error->one(FLERR, Error::NOLASTLINE, "Improper atom missing in set command" + + utils::errorurl(5)); if (select[atom1] && select[atom2] && select[atom3] && select[atom4]) { atom->improper_type[i][m] = ivalue; count++; @@ -1554,9 +1625,9 @@ void Set::varparse(const char *name, int m) int ivar = input->variable->find(name+2); if (ivar < 0) - error->all(FLERR,"Variable name {} for set command does not exist", name); + error->all(FLERR, Error::NOLASTLINE, "Variable name {} for set command does not exist", name); if (!input->variable->atomstyle(ivar)) - error->all(FLERR,"Variable {} for set command is invalid style", name); + error->all(FLERR, Error::NOLASTLINE, "Variable {} for set command is invalid style", name); if (m == 1) { varflag1 = 1; ivar1 = ivar; From c037ec07a242fbd15b47241de566bd329afcc7dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 20 Mar 2025 22:45:41 -0400 Subject: [PATCH 51/99] make utils::errorurl() point to generic page with error code 0 --- src/utils.cpp | 6 +++++- src/utils.h | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 94660f546a..4c48069afb 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -281,7 +281,11 @@ void utils::fmtargs_print(FILE *fp, fmt::string_view format, fmt::format_args ar std::string utils::errorurl(int errorcode) { - return fmt::format("\nFor more information see https://docs.lammps.org/err{:04d}", errorcode); + if (errorcode == 0) + return "\nFor more information see https://docs.lammps.org/Errors_details.html"; + else if (errorcode > 0) + return fmt::format("\nFor more information see https://docs.lammps.org/err{:04d}", errorcode); + else return ""; // negative numbers are reserved for future use pointing to a different URL } void utils::flush_buffers(LAMMPS *lmp) diff --git a/src/utils.h b/src/utils.h index 39dd58a79e..b403d78061 100644 --- a/src/utils.h +++ b/src/utils.h @@ -173,11 +173,12 @@ output are compressed to a single blank by calling :cpp:func:`strcompress()` * * The LAMMPS manual contains detailed explanations for errors and * warnings where a simple error message may not be sufficient. These can - * be reached through URLs with a numeric code. This function creates the + * be reached through URLs with a numeric code > 0. This function creates the * corresponding text to be included into the error message that redirects - * the user to that URL. + * the user to that URL. Using an error code of 0 returns a message + * pointing to a URL discussing error messages in general. * - * \param errorcode number pointing to a paragraph in the manual */ + * \param errorcode non-negative number pointing to a paragraph in the manual */ std::string errorurl(int errorcode); From 3ab91e4e1a159572147ed6ce4ac44a40622aae79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 20 Mar 2025 23:12:21 -0400 Subject: [PATCH 52/99] fix up uses of errorurl(21) --- src/BPM/bond_bpm_spring_plastic.cpp | 4 +- src/DPD-MESO/pair_mdpd.cpp | 4 +- src/DPD-MESO/pair_mdpd_rhosum.cpp | 2 +- src/EXTRA-MOLECULE/improper_cossq.cpp | 41 ++-- src/EXTRA-MOLECULE/improper_ring.cpp | 320 +++++++++++++------------- src/MISC/pair_srp.cpp | 6 +- src/RHEO/pair_rheo.cpp | 4 +- src/SPH/pair_sph_idealgas.cpp | 10 +- 8 files changed, 191 insertions(+), 200 deletions(-) diff --git a/src/BPM/bond_bpm_spring_plastic.cpp b/src/BPM/bond_bpm_spring_plastic.cpp index 35df659992..b011df2f9b 100644 --- a/src/BPM/bond_bpm_spring_plastic.cpp +++ b/src/BPM/bond_bpm_spring_plastic.cpp @@ -296,7 +296,7 @@ void BondBPMSpringPlastic::allocate() void BondBPMSpringPlastic::coeff(int narg, char **arg) { if (narg != 5) - error->all(FLERR, "Incorrect args for bond coefficients"); + error->all(FLERR, "Incorrect args for bond coefficients" + utils::errorurl(21)); if (!allocated) allocate(); int ilo, ihi; @@ -319,7 +319,7 @@ void BondBPMSpringPlastic::coeff(int narg, char **arg) if (1.0 + ecrit[i] > max_stretch) max_stretch = 1.0 + ecrit[i]; } - if (count == 0) error->all(FLERR, "Incorrect args for bond coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for bond coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- diff --git a/src/DPD-MESO/pair_mdpd.cpp b/src/DPD-MESO/pair_mdpd.cpp index 8fcfa3d786..3e78804093 100644 --- a/src/DPD-MESO/pair_mdpd.cpp +++ b/src/DPD-MESO/pair_mdpd.cpp @@ -244,7 +244,7 @@ void PairMDPD::settings(int narg, char **arg) void PairMDPD::coeff(int narg, char **arg) { - if (narg != 7 ) error->all(FLERR,"Incorrect args for pair coefficients\n itype jtype A B gamma cutA cutB"); + if (narg != 7 ) error->all(FLERR,"Incorrect args for pair coefficients" + utils::errorurl(21)); if (!allocated) allocate(); int ilo,ihi,jlo,jhi; @@ -257,7 +257,7 @@ void PairMDPD::coeff(int narg, char **arg) double cut_one = utils::numeric(FLERR,arg[5],false,lmp); double cut_two = utils::numeric(FLERR,arg[6],false,lmp); - if (cut_one < cut_two) error->all(FLERR,"Incorrect args for pair coefficients\n cutA should be larger than cutB."); + if (cut_one < cut_two) error->all(FLERR, "Value for cutA should be larger than cutB."); int count = 0; for (int i = ilo; i <= ihi; i++) { diff --git a/src/DPD-MESO/pair_mdpd_rhosum.cpp b/src/DPD-MESO/pair_mdpd_rhosum.cpp index 7526ea75d7..ae96867c4a 100644 --- a/src/DPD-MESO/pair_mdpd_rhosum.cpp +++ b/src/DPD-MESO/pair_mdpd_rhosum.cpp @@ -64,7 +64,7 @@ PairMDPDRhoSum::~PairMDPDRhoSum() { void PairMDPDRhoSum::init_style() { if (!atom->rho_flag) - error->all(FLERR,"Pair style mdpd/rhosum requires atom attribute rho"); + error->all(FLERR, Error::NOLASTLINE, "Pair style mdpd/rhosum requires atom attribute rho"); // need a full neighbor list neighbor->add_request(this, NeighConst::REQ_FULL); diff --git a/src/EXTRA-MOLECULE/improper_cossq.cpp b/src/EXTRA-MOLECULE/improper_cossq.cpp index bcf9715990..5d7a425217 100644 --- a/src/EXTRA-MOLECULE/improper_cossq.cpp +++ b/src/EXTRA-MOLECULE/improper_cossq.cpp @@ -249,28 +249,29 @@ void ImproperCossq::allocate() void ImproperCossq::coeff(int narg, char **arg) { - /* Check whether there exist sufficient number of arguments. - 0: type of improper to be applied to - 1: energetic constant - 2: equilibrium angle in degrees */ - if (narg != 3) error->all(FLERR,"Incorrect args for cossq improper coefficients"); - if (!allocated) allocate(); + /* Check whether there exist sufficient number of arguments. + 0: type of improper to be applied to + 1: energetic constant + 2: equilibrium angle in degrees */ + if (narg != 3) error->all(FLERR,"Incorrect args for improper coefficients" + utils::errorurl(21)); + if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nimpropertypes,ilo,ihi,error); + int ilo,ihi; + utils::bounds(FLERR,arg[0],1,atom->nimpropertypes,ilo,ihi,error); - double k_one = utils::numeric(FLERR,arg[1],false,lmp); - double chi_one = utils::numeric(FLERR,arg[2],false,lmp); + double k_one = utils::numeric(FLERR,arg[1],false,lmp); + double chi_one = utils::numeric(FLERR,arg[2],false,lmp); - int count = 0; - for (int i = ilo; i <= ihi; i++) { - k[i] = k_one; - chi[i] = ((chi_one * MY_PI)/180.0); - setflag[i] = 1; - count++; - } + int count = 0; + for (int i = ilo; i <= ihi; i++) { + k[i] = k_one; + chi[i] = ((chi_one * MY_PI)/180.0); + setflag[i] = 1; + count++; + } - if (count == 0) error->all(FLERR,"Incorrect args for improper coefficients" + utils::errorurl(21)); + if (count == 0) + error->all(FLERR, "Incorrect args for improper coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- @@ -278,8 +279,8 @@ void ImproperCossq::coeff(int narg, char **arg) ------------------------------------------------------------------------- */ void ImproperCossq::write_restart(FILE *fp) { - fwrite(&k[1],sizeof(double),atom->nimpropertypes,fp); - fwrite(&chi[1],sizeof(double),atom->nimpropertypes,fp); + fwrite(&k[1],sizeof(double),atom->nimpropertypes,fp); + fwrite(&chi[1],sizeof(double),atom->nimpropertypes,fp); } /* ---------------------------------------------------------------------- diff --git a/src/EXTRA-MOLECULE/improper_ring.cpp b/src/EXTRA-MOLECULE/improper_ring.cpp index 8fee93055e..57adb50260 100644 --- a/src/EXTRA-MOLECULE/improper_ring.cpp +++ b/src/EXTRA-MOLECULE/improper_ring.cpp @@ -80,187 +80,176 @@ ImproperRing::~ImproperRing() void ImproperRing::compute(int eflag, int vflag) { - /* Be careful!: "chi" is the equilibrium angle in radians. */ - int i1,i2,i3,i4,n,type; + /* Be careful!: "chi" is the equilibrium angle in radians. */ + int i1,i2,i3,i4,n,type; - double eimproper ; + double eimproper ; - /* Compatibility variables. */ - double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; - double f1[3], f3[3], f4[3]; + /* Compatibility variables. */ + double vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z; + double f1[3], f3[3], f4[3]; - /* Actual computation variables. */ - int at1[3], at2[3], at3[3], icomb; - double bvec1x[3], bvec1y[3], bvec1z[3], - bvec2x[3], bvec2y[3], bvec2z[3], - bvec1n[3], bvec2n[3], bend_angle[3]; - double angle_summer, angfac, cfact1, cfact2, cfact3; - double cjiji, ckjji, ckjkj, fix, fiy, fiz, fjx, fjy, fjz, fkx, fky, fkz; + /* Actual computation variables. */ + int at1[3], at2[3], at3[3], icomb; + double bvec1x[3], bvec1y[3], bvec1z[3], + bvec2x[3], bvec2y[3], bvec2z[3], + bvec1n[3], bvec2n[3], bend_angle[3]; + double angle_summer, angfac, cfact1, cfact2, cfact3; + double cjiji, ckjji, ckjkj, fix, fiy, fiz, fjx, fjy, fjz, fkx, fky, fkz; - eimproper = 0.0; - ev_init(eflag,vflag); + eimproper = 0.0; + ev_init(eflag,vflag); - /* References to simulation data. */ - double **x = atom->x; - double **f = atom->f; - int **improperlist = neighbor->improperlist; - int nimproperlist = neighbor->nimproperlist; - int nlocal = atom->nlocal; - int newton_bond = force->newton_bond; + /* References to simulation data. */ + double **x = atom->x; + double **f = atom->f; + int **improperlist = neighbor->improperlist; + int nimproperlist = neighbor->nimproperlist; + int nlocal = atom->nlocal; + int newton_bond = force->newton_bond; - /* A description of the potential can be found in - Macromolecules 35, pp. 1463-1472 (2002). */ - for (n = 0; n < nimproperlist; n++) - { - /* Take the ids of the atoms contributing to the improper potential. */ - i1 = improperlist[n][0]; /* Atom "1" of Figure 1 from the above reference.*/ - i2 = improperlist[n][1]; /* Atom "2" ... */ - i3 = improperlist[n][2]; /* Atom "3" ... */ - i4 = improperlist[n][3]; /* Atom "9" ... */ - type = improperlist[n][4]; + /* A description of the potential can be found in + Macromolecules 35, pp. 1463-1472 (2002). */ + for (n = 0; n < nimproperlist; n++) { + /* Take the ids of the atoms contributing to the improper potential. */ + i1 = improperlist[n][0]; /* Atom "1" of Figure 1 from the above reference.*/ + i2 = improperlist[n][1]; /* Atom "2" ... */ + i3 = improperlist[n][2]; /* Atom "3" ... */ + i4 = improperlist[n][3]; /* Atom "9" ... */ + type = improperlist[n][4]; - /* Calculate the necessary variables for LAMMPS implementation. - if (evflag) ev_tally(i1,i2,i3,i4,nlocal,newton_bond,eimproper,f1,f3,f4, - vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z); - Although, they are irrelevant to the calculation of the potential, we keep - them for maximal compatibility. */ - vb1x = x[i1][0] - x[i2][0]; vb1y = x[i1][1] - x[i2][1]; vb1z = x[i1][2] - x[i2][2]; + /* Calculate the necessary variables for LAMMPS implementation. + if (evflag) ev_tally(i1,i2,i3,i4,nlocal,newton_bond,eimproper,f1,f3,f4, + vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z); + Although, they are irrelevant to the calculation of the potential, we keep + them for maximal compatibility. */ + vb1x = x[i1][0] - x[i2][0]; vb1y = x[i1][1] - x[i2][1]; vb1z = x[i1][2] - x[i2][2]; - vb2x = x[i3][0] - x[i2][0]; vb2y = x[i3][1] - x[i2][1]; vb2z = x[i3][2] - x[i2][2]; + vb2x = x[i3][0] - x[i2][0]; vb2y = x[i3][1] - x[i2][1]; vb2z = x[i3][2] - x[i2][2]; - vb3x = x[i4][0] - x[i3][0]; vb3y = x[i4][1] - x[i3][1]; vb3z = x[i4][2] - x[i3][2]; + vb3x = x[i4][0] - x[i3][0]; vb3y = x[i4][1] - x[i3][1]; vb3z = x[i4][2] - x[i3][2]; - /* Pass the atom tags to form the necessary combinations. */ - at1[0] = i1; at2[0] = i2; at3[0] = i4; /* ids: 1-2-9 */ - at1[1] = i1; at2[1] = i2; at3[1] = i3; /* ids: 1-2-3 */ - at1[2] = i4; at2[2] = i2; at3[2] = i3; /* ids: 9-2-3 */ + /* Pass the atom tags to form the necessary combinations. */ + at1[0] = i1; at2[0] = i2; at3[0] = i4; /* ids: 1-2-9 */ + at1[1] = i1; at2[1] = i2; at3[1] = i3; /* ids: 1-2-3 */ + at1[2] = i4; at2[2] = i2; at3[2] = i3; /* ids: 9-2-3 */ - /* Initialize the sum of the angles differences. */ - angle_summer = 0.0; - /* Take a loop over the three angles, defined by each triad: */ - for (icomb = 0; icomb < 3; icomb ++) + /* Initialize the sum of the angles differences. */ + angle_summer = 0.0; + /* Take a loop over the three angles, defined by each triad: */ + for (icomb = 0; icomb < 3; icomb ++) { - /* Bond vector connecting the first and the second atom. */ - bvec1x[icomb] = x[at2[icomb]][0] - x[at1[icomb]][0]; - bvec1y[icomb] = x[at2[icomb]][1] - x[at1[icomb]][1]; - bvec1z[icomb] = x[at2[icomb]][2] - x[at1[icomb]][2]; - /* also calculate the norm of the vector: */ - bvec1n[icomb] = sqrt( bvec1x[icomb]*bvec1x[icomb] - + bvec1y[icomb]*bvec1y[icomb] - + bvec1z[icomb]*bvec1z[icomb]); - /* Bond vector connecting the second and the third atom. */ - bvec2x[icomb] = x[at3[icomb]][0] - x[at2[icomb]][0]; - bvec2y[icomb] = x[at3[icomb]][1] - x[at2[icomb]][1]; - bvec2z[icomb] = x[at3[icomb]][2] - x[at2[icomb]][2]; - /* also calculate the norm of the vector: */ - bvec2n[icomb] = sqrt( bvec2x[icomb]*bvec2x[icomb] - + bvec2y[icomb]*bvec2y[icomb] - + bvec2z[icomb]*bvec2z[icomb]); + /* Bond vector connecting the first and the second atom. */ + bvec1x[icomb] = x[at2[icomb]][0] - x[at1[icomb]][0]; + bvec1y[icomb] = x[at2[icomb]][1] - x[at1[icomb]][1]; + bvec1z[icomb] = x[at2[icomb]][2] - x[at1[icomb]][2]; + /* also calculate the norm of the vector: */ + bvec1n[icomb] = sqrt( bvec1x[icomb]*bvec1x[icomb] + + bvec1y[icomb]*bvec1y[icomb] + + bvec1z[icomb]*bvec1z[icomb]); + /* Bond vector connecting the second and the third atom. */ + bvec2x[icomb] = x[at3[icomb]][0] - x[at2[icomb]][0]; + bvec2y[icomb] = x[at3[icomb]][1] - x[at2[icomb]][1]; + bvec2z[icomb] = x[at3[icomb]][2] - x[at2[icomb]][2]; + /* also calculate the norm of the vector: */ + bvec2n[icomb] = sqrt( bvec2x[icomb]*bvec2x[icomb] + + bvec2y[icomb]*bvec2y[icomb] + + bvec2z[icomb]*bvec2z[icomb]); - /* Calculate the bending angle of the atom triad: */ - bend_angle[icomb] = ( bvec2x[icomb]*bvec1x[icomb] - + bvec2y[icomb]*bvec1y[icomb] - + bvec2z[icomb]*bvec1z[icomb]); - bend_angle[icomb] /= (bvec1n[icomb] * bvec2n[icomb]); - if (bend_angle[icomb] > 1.0) bend_angle[icomb] -= SMALL; - if (bend_angle[icomb] < -1.0) bend_angle[icomb] += SMALL; + /* Calculate the bending angle of the atom triad: */ + bend_angle[icomb] = ( bvec2x[icomb]*bvec1x[icomb] + + bvec2y[icomb]*bvec1y[icomb] + + bvec2z[icomb]*bvec1z[icomb]); + bend_angle[icomb] /= (bvec1n[icomb] * bvec2n[icomb]); + if (bend_angle[icomb] > 1.0) bend_angle[icomb] -= SMALL; + if (bend_angle[icomb] < -1.0) bend_angle[icomb] += SMALL; - /* Append the current angle to the sum of angle differences. */ - angle_summer += (bend_angle[icomb] - chi[type]); + /* Append the current angle to the sum of angle differences. */ + angle_summer += (bend_angle[icomb] - chi[type]); } - if (eflag) eimproper = (1.0/6.0) *k[type] * powint(angle_summer,6); - /* - printf("The tags: %d-%d-%d-%d, of type %d .\n",atom->tag[i1],atom->tag[i2],atom->tag[i3],atom->tag[i4],type); - // printf("The coordinates of the first: %f, %f, %f.\n", x[i1][0], x[i1][1], x[i1][2]); - // printf("The coordinates of the second: %f, %f, %f.\n", x[i2][0], x[i2][1], x[i2][2]); - // printf("The coordinates of the third: %f, %f, %f.\n", x[i3][0], x[i3][1], x[i3][2]); - // printf("The coordinates of the fourth: %f, %f, %f.\n", x[i4][0], x[i4][1], x[i4][2]); - printf("The angles are: %f / %f / %f equilibrium: %f.\n", bend_angle[0], bend_angle[1], bend_angle[2],chi[type]); - printf("The energy of the improper: %f with prefactor %f.\n", eimproper,(1.0/6.0)*k[type]); - printf("The sum of the angles: %f.\n", angle_summer); - */ + if (eflag) eimproper = (1.0/6.0) *k[type] * powint(angle_summer,6); - /* Force calculation acting on all atoms. - Calculate the derivatives of the potential. */ - angfac = k[type] * powint(angle_summer,5); + /* Force calculation acting on all atoms. + Calculate the derivatives of the potential. */ + angfac = k[type] * powint(angle_summer,5); - f1[0] = 0.0; f1[1] = 0.0; f1[2] = 0.0; - f3[0] = 0.0; f3[1] = 0.0; f3[2] = 0.0; - f4[0] = 0.0; f4[1] = 0.0; f4[2] = 0.0; + f1[0] = 0.0; f1[1] = 0.0; f1[2] = 0.0; + f3[0] = 0.0; f3[1] = 0.0; f3[2] = 0.0; + f4[0] = 0.0; f4[1] = 0.0; f4[2] = 0.0; - /* Take a loop over the three angles, defined by each triad: */ - for (icomb = 0; icomb < 3; icomb ++) + /* Take a loop over the three angles, defined by each triad: */ + for (icomb = 0; icomb < 3; icomb ++) { - /* Calculate the squares of the distances. */ - cjiji = bvec1n[icomb] * bvec1n[icomb]; ckjkj = bvec2n[icomb] * bvec2n[icomb]; + /* Calculate the squares of the distances. */ + cjiji = bvec1n[icomb] * bvec1n[icomb]; ckjkj = bvec2n[icomb] * bvec2n[icomb]; - ckjji = bvec2x[icomb] * bvec1x[icomb] - + bvec2y[icomb] * bvec1y[icomb] - + bvec2z[icomb] * bvec1z[icomb] ; + ckjji = bvec2x[icomb] * bvec1x[icomb] + + bvec2y[icomb] * bvec1y[icomb] + + bvec2z[icomb] * bvec1z[icomb] ; - cfact1 = angfac / (sqrt(ckjkj * cjiji)); - cfact2 = ckjji / ckjkj; - cfact3 = ckjji / cjiji; + cfact1 = angfac / (sqrt(ckjkj * cjiji)); + cfact2 = ckjji / ckjkj; + cfact3 = ckjji / cjiji; - /* Calculate the force acted on the third atom of the angle. */ - fkx = cfact2 * bvec2x[icomb] - bvec1x[icomb]; - fky = cfact2 * bvec2y[icomb] - bvec1y[icomb]; - fkz = cfact2 * bvec2z[icomb] - bvec1z[icomb]; + /* Calculate the force acted on the third atom of the angle. */ + fkx = cfact2 * bvec2x[icomb] - bvec1x[icomb]; + fky = cfact2 * bvec2y[icomb] - bvec1y[icomb]; + fkz = cfact2 * bvec2z[icomb] - bvec1z[icomb]; - /* Calculate the force acted on the first atom of the angle. */ - fix = bvec2x[icomb] - cfact3 * bvec1x[icomb]; - fiy = bvec2y[icomb] - cfact3 * bvec1y[icomb]; - fiz = bvec2z[icomb] - cfact3 * bvec1z[icomb]; + /* Calculate the force acted on the first atom of the angle. */ + fix = bvec2x[icomb] - cfact3 * bvec1x[icomb]; + fiy = bvec2y[icomb] - cfact3 * bvec1y[icomb]; + fiz = bvec2z[icomb] - cfact3 * bvec1z[icomb]; - /* Finally, calculate the force acted on the middle atom of the angle.*/ - fjx = - fix - fkx; fjy = - fiy - fky; fjz = - fiz - fkz; + /* Finally, calculate the force acted on the middle atom of the angle.*/ + fjx = - fix - fkx; fjy = - fiy - fky; fjz = - fiz - fkz; - /* Consider the appropriate scaling of the forces: */ - fix *= cfact1; fiy *= cfact1; fiz *= cfact1; - fjx *= cfact1; fjy *= cfact1; fjz *= cfact1; - fkx *= cfact1; fky *= cfact1; fkz *= cfact1; + /* Consider the appropriate scaling of the forces: */ + fix *= cfact1; fiy *= cfact1; fiz *= cfact1; + fjx *= cfact1; fjy *= cfact1; fjz *= cfact1; + fkx *= cfact1; fky *= cfact1; fkz *= cfact1; - if (at1[icomb] == i1) {f1[0] += fix; f1[1] += fiy; f1[2] += fiz;} - else if (at2[icomb] == i1) {f1[0] += fjx; f1[1] += fjy; f1[2] += fjz;} - else if (at3[icomb] == i1) {f1[0] += fkx; f1[1] += fky; f1[2] += fkz;} + if (at1[icomb] == i1) {f1[0] += fix; f1[1] += fiy; f1[2] += fiz;} + else if (at2[icomb] == i1) {f1[0] += fjx; f1[1] += fjy; f1[2] += fjz;} + else if (at3[icomb] == i1) {f1[0] += fkx; f1[1] += fky; f1[2] += fkz;} - if (at1[icomb] == i3) {f3[0] += fix; f3[1] += fiy; f3[2] += fiz;} - else if (at2[icomb] == i3) {f3[0] += fjx; f3[1] += fjy; f3[2] += fjz;} - else if (at3[icomb] == i3) {f3[0] += fkx; f3[1] += fky; f3[2] += fkz;} + if (at1[icomb] == i3) {f3[0] += fix; f3[1] += fiy; f3[2] += fiz;} + else if (at2[icomb] == i3) {f3[0] += fjx; f3[1] += fjy; f3[2] += fjz;} + else if (at3[icomb] == i3) {f3[0] += fkx; f3[1] += fky; f3[2] += fkz;} - if (at1[icomb] == i4) {f4[0] += fix; f4[1] += fiy; f4[2] += fiz;} - else if (at2[icomb] == i4) {f4[0] += fjx; f4[1] += fjy; f4[2] += fjz;} - else if (at3[icomb] == i4) {f4[0] += fkx; f4[1] += fky; f4[2] += fkz;} + if (at1[icomb] == i4) {f4[0] += fix; f4[1] += fiy; f4[2] += fiz;} + else if (at2[icomb] == i4) {f4[0] += fjx; f4[1] += fjy; f4[2] += fjz;} + else if (at3[icomb] == i4) {f4[0] += fkx; f4[1] += fky; f4[2] += fkz;} - /* Store the contribution to the global arrays: */ - /* Take the id of the atom from the at1[icomb] element, i1 = at1[icomb]. */ - if (newton_bond || at1[icomb] < nlocal) { - f[at1[icomb]][0] += fix; - f[at1[icomb]][1] += fiy; - f[at1[icomb]][2] += fiz; - } - /* Take the id of the atom from the at2[icomb] element, i2 = at2[icomb]. */ - if (newton_bond || at2[icomb] < nlocal) { - f[at2[icomb]][0] += fjx; - f[at2[icomb]][1] += fjy; - f[at2[icomb]][2] += fjz; - } - /* Take the id of the atom from the at3[icomb] element, i3 = at3[icomb]. */ - if (newton_bond || at3[icomb] < nlocal) { - f[at3[icomb]][0] += fkx; - f[at3[icomb]][1] += fky; - f[at3[icomb]][2] += fkz; - } + /* Store the contribution to the global arrays: */ + /* Take the id of the atom from the at1[icomb] element, i1 = at1[icomb]. */ + if (newton_bond || at1[icomb] < nlocal) { + f[at1[icomb]][0] += fix; + f[at1[icomb]][1] += fiy; + f[at1[icomb]][2] += fiz; + } + /* Take the id of the atom from the at2[icomb] element, i2 = at2[icomb]. */ + if (newton_bond || at2[icomb] < nlocal) { + f[at2[icomb]][0] += fjx; + f[at2[icomb]][1] += fjy; + f[at2[icomb]][2] += fjz; + } + /* Take the id of the atom from the at3[icomb] element, i3 = at3[icomb]. */ + if (newton_bond || at3[icomb] < nlocal) { + f[at3[icomb]][0] += fkx; + f[at3[icomb]][1] += fky; + f[at3[icomb]][2] += fkz; + } } - if (evflag) ev_tally(i1,i2,i3,i4,nlocal,newton_bond,eimproper,f1,f3,f4, - vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z); + if (evflag) ev_tally(i1,i2,i3,i4,nlocal,newton_bond,eimproper,f1,f3,f4, + vb1x,vb1y,vb1z,vb2x,vb2y,vb2z,vb3x,vb3y,vb3z); } } @@ -285,31 +274,32 @@ void ImproperRing::allocate() void ImproperRing ::coeff(int narg, char **arg) { - /* Check whether there exist sufficient number of arguments. - 0: type of improper to be applied to - 1: energetic constant - 2: equilibrium angle in degrees */ - if (narg != 3) error->all(FLERR,"Incorrect args for RING improper coefficients"); - if (!allocated) allocate(); + /* Check whether there exist sufficient number of arguments. + 0: type of improper to be applied to + 1: energetic constant + 2: equilibrium angle in degrees */ + if (narg != 3) error->all(FLERR,"Incorrect args for improper coefficients" + utils::errorurl(21)); + if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nimpropertypes,ilo,ihi,error); + int ilo,ihi; + utils::bounds(FLERR,arg[0],1,atom->nimpropertypes,ilo,ihi,error); - double k_one = utils::numeric(FLERR,arg[1],false,lmp); - double chi_one = utils::numeric(FLERR,arg[2],false,lmp); + double k_one = utils::numeric(FLERR,arg[1],false,lmp); + double chi_one = utils::numeric(FLERR,arg[2],false,lmp); - int count = 0; - for (int i = ilo; i <= ihi; i++) { - /* Read the k parameter in kcal/mol. */ - k[i] = k_one; - /* "chi_one" stores the equilibrium angle in degrees. - Convert it to radians and store its cosine. */ - chi[i] = cos((chi_one/180.0)*MY_PI); - setflag[i] = 1; - count++; - } + int count = 0; + for (int i = ilo; i <= ihi; i++) { + /* Read the k parameter in kcal/mol. */ + k[i] = k_one; + /* "chi_one" stores the equilibrium angle in degrees. + Convert it to radians and store its cosine. */ + chi[i] = cos((chi_one/180.0)*MY_PI); + setflag[i] = 1; + count++; + } - if (count == 0) error->all(FLERR,"Incorrect args for improper coefficients" + utils::errorurl(21)); + if (count == 0) + error->all(FLERR,"Incorrect args for improper coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index c81fd3c969..65397aa22a 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -395,19 +395,19 @@ void PairSRP::settings(int narg, char **arg) void PairSRP::coeff(int narg, char **arg) { if (narg < 3 || narg > 4) - error->all(FLERR,"PairSRP: Incorrect args for pair coeff"); + error->all(FLERR,"Incorrect args for pair coefficients" + utils::errorurl(21)); if (!allocated) allocate(); if (btype_str.size() > 0) { btype = utils::expand_type_int(FLERR, btype_str, Atom::BOND, lmp); if ((btype > atom->nbondtypes) || (btype <= 0)) - error->all(FLERR,"Invalid bond type {} for pair style srp", btype); + error->all(FLERR, Error::NOLASTLINE, "Invalid bond type {} for pair style srp", btype); } if (bptype_str.size() > 0) bptype = utils::expand_type_int(FLERR, bptype_str, Atom::ATOM, lmp); if ((bptype < 1) || (bptype > atom->ntypes)) - error->all(FLERR,"Invalid bond particle type {} for pair style srp", bptype); + error->all(FLERR, Error::NOLASTLINE, "Invalid bond particle type {} for pair style srp", bptype); // reset cutoffs if explicitly set if (allocated) { diff --git a/src/RHEO/pair_rheo.cpp b/src/RHEO/pair_rheo.cpp index be2dfc6ecf..0fdd711ba5 100644 --- a/src/RHEO/pair_rheo.cpp +++ b/src/RHEO/pair_rheo.cpp @@ -452,7 +452,7 @@ void PairRHEO::settings(int narg, char **arg) void PairRHEO::coeff(int narg, char **arg) { - if (narg != 2) error->all(FLERR, "Incorrect number of args for pair_style rheo coefficients"); + if (narg != 2) error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); if (!allocated) allocate(); int ilo, ihi, jlo, jhi; @@ -467,7 +467,7 @@ void PairRHEO::coeff(int narg, char **arg) } } - if (count == 0) error->all(FLERR, "Incorrect args for pair rheo coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- diff --git a/src/SPH/pair_sph_idealgas.cpp b/src/SPH/pair_sph_idealgas.cpp index 963579aee3..fc4bd6a9da 100644 --- a/src/SPH/pair_sph_idealgas.cpp +++ b/src/SPH/pair_sph_idealgas.cpp @@ -31,7 +31,9 @@ using namespace LAMMPS_NS; PairSPHIdealGas::PairSPHIdealGas(LAMMPS *lmp) : Pair(lmp) { if ((atom->esph_flag != 1) || (atom->rho_flag != 1) || (atom->vest_flag != 1)) - error->all(FLERR, "Pair sph/idealgas requires atom attributes energy, density, and velocity estimates, e.g. in atom_style sph"); + error->all(FLERR, Error::NOLASTLINE, + "Pair sph/idealgas requires atom attributes energy, density, and velocity estimates," + " e.g. in atom_style sph"); restartinfo = 0; single_enable = 0; @@ -212,8 +214,7 @@ void PairSPHIdealGas::settings(int narg, char **/*arg*/) void PairSPHIdealGas::coeff(int narg, char **arg) { - if (narg != 4) - error->all(FLERR,"Incorrect number of args for pair_style sph/idealgas coefficients"); + if (narg != 4) error->all(FLERR,"Incorrect args for pair coefficients" + utils::errorurl(21)); if (!allocated) allocate(); @@ -234,8 +235,7 @@ void PairSPHIdealGas::coeff(int narg, char **arg) } } - if (count == 0) - error->all(FLERR,"Incorrect args for pair sph/idealgas coefficients"); + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients" + utils::errorurl(21)); } /* ---------------------------------------------------------------------- From 3834169c9245d7b630018c0159ffef38d8c7e070 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 21 Mar 2025 19:30:28 -0400 Subject: [PATCH 53/99] first attempt to implement a "jump to top" anchor in the sidebar --- doc/utils/sphinx-config/_themes/lammps_theme/layout.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/utils/sphinx-config/_themes/lammps_theme/layout.html b/doc/utils/sphinx-config/_themes/lammps_theme/layout.html index 83fdb7054b..69fc12652c 100644 --- a/doc/utils/sphinx-config/_themes/lammps_theme/layout.html +++ b/doc/utils/sphinx-config/_themes/lammps_theme/layout.html @@ -137,6 +137,7 @@ {# the master_doc variable was renamed to root_doc in Sphinx 4 (master_doc still exists in later Sphinx versions) #} {%- set _logo_url = logo_url|default(pathto('_static/' + (logo or ""), 1)) %} {%- set _root_doc = root_doc|default(master_doc) %} + {% if not theme_logo_only %}{{ project }}{% endif %} {%- if logo or logo_url %} @@ -172,6 +173,11 @@ {%- endblock %} +
From 649fd86e1131b5fcb2d7d0bd606763568bc3810b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 21 Mar 2025 19:57:57 -0400 Subject: [PATCH 54/99] add errorurl(11) with explanation to "Energy/Stess was not tallied by pair style" --- doc/src/Errors_details.rst | 15 ++++++++++++++- src/TALLY/compute_force_tally.cpp | 4 ++-- src/TALLY/compute_heat_flux_tally.cpp | 8 +++++--- src/TALLY/compute_heat_flux_virial_tally.cpp | 10 ++++++---- src/TALLY/compute_pe_mol_tally.cpp | 5 +++-- src/TALLY/compute_pe_tally.cpp | 10 ++++++---- src/TALLY/compute_stress_tally.cpp | 10 ++++++---- 7 files changed, 42 insertions(+), 20 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 9af9b984fb..a5b0d1b100 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -458,7 +458,20 @@ with the relevant person or people who can update the executable. .. _err011: -.. currently unused +Energy or stress was not tallied by pair style +---------------------------------------------- + +This warning will be printed by computes from the :ref:`TALLY package +`. Those use a callback mechanism that will only work for +regular pair-wise additive pair styles like :doc:`Lennard-Jones +`, :doc:`Morse `, :doc:`Born-Meyer-Huggins +`, and similar. Making these computes work for many-body +potentials will require to implement similar callbacks suitable for such +potentials, which has not been done (and may be difficult to do in a +generic fashion). Whether this warning indicates that contributions to +the computed properties are missing depends on the groups used. At any +rate, careful testing of the results is advised when this warning +appears. .. _err0012: diff --git a/src/TALLY/compute_force_tally.cpp b/src/TALLY/compute_force_tally.cpp index 6b09cac785..5dd3d1958d 100644 --- a/src/TALLY/compute_force_tally.cpp +++ b/src/TALLY/compute_force_tally.cpp @@ -182,7 +182,7 @@ double ComputeForceTally::compute_scalar() error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // sum accumulated forces across procs @@ -201,7 +201,7 @@ void ComputeForceTally::compute_peratom() error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // collect contributions from ghost atoms diff --git a/src/TALLY/compute_heat_flux_tally.cpp b/src/TALLY/compute_heat_flux_tally.cpp index 65b66db7d0..5c53328b32 100644 --- a/src/TALLY/compute_heat_flux_tally.cpp +++ b/src/TALLY/compute_heat_flux_tally.cpp @@ -69,7 +69,8 @@ ComputeHeatFluxTally::~ComputeHeatFluxTally() void ComputeHeatFluxTally::init() { if (force->pair == nullptr) - error->all(FLERR, "Trying to use compute heat/flux/tally without pair style"); + error->all(FLERR, Error::NOLASTLINE, + "Trying to use compute heat/flux/tally without pair style"); else force->pair->add_tally_callback(this); @@ -205,10 +206,11 @@ void ComputeHeatFluxTally::compute_vector() { invoked_vector = update->ntimestep; if ((did_setup != invoked_vector) || (update->eflag_global != invoked_vector)) - error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Stress was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // collect contributions from ghost atoms diff --git a/src/TALLY/compute_heat_flux_virial_tally.cpp b/src/TALLY/compute_heat_flux_virial_tally.cpp index a87732c15e..20b287dde4 100644 --- a/src/TALLY/compute_heat_flux_virial_tally.cpp +++ b/src/TALLY/compute_heat_flux_virial_tally.cpp @@ -191,10 +191,11 @@ double ComputeHeatFluxVirialTally::compute_scalar() invoked_scalar = update->ntimestep; if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) - error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Stress was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // sum heat flux across procs double hflux = 0.0; @@ -213,10 +214,11 @@ void ComputeHeatFluxVirialTally::compute_peratom() { invoked_peratom = update->ntimestep; if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) - error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Stress was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // collect contributions from ghost atoms diff --git a/src/TALLY/compute_pe_mol_tally.cpp b/src/TALLY/compute_pe_mol_tally.cpp index e5ddb57568..1aecc1165f 100644 --- a/src/TALLY/compute_pe_mol_tally.cpp +++ b/src/TALLY/compute_pe_mol_tally.cpp @@ -126,10 +126,11 @@ void ComputePEMolTally::compute_vector() { invoked_vector = update->ntimestep; if ((did_setup != invoked_vector) || (update->eflag_global != invoked_vector)) - error->all(FLERR, Error::NOLASTLINE, "Energy was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Energy was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Energy was not tallied by pair style"); + error->warning(FLERR, "Energy was not tallied by pair style" + utils::errorurl(11)); // sum accumulated energies across procs diff --git a/src/TALLY/compute_pe_tally.cpp b/src/TALLY/compute_pe_tally.cpp index d77cfe2646..6fde2126f7 100644 --- a/src/TALLY/compute_pe_tally.cpp +++ b/src/TALLY/compute_pe_tally.cpp @@ -167,10 +167,11 @@ double ComputePETally::compute_scalar() { invoked_scalar = update->ntimestep; if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) - error->all(FLERR, Error::NOLASTLINE, "Energy was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Energy was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Energy was not tallied by pair style"); + error->warning(FLERR, "Energy was not tallied by pair style" + utils::errorurl(11)); // sum accumulated energies across procs @@ -186,10 +187,11 @@ void ComputePETally::compute_peratom() { invoked_peratom = update->ntimestep; if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) - error->all(FLERR, Error::NOLASTLINE, "Energy was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Energy was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Energy was not tallied by pair style"); + error->warning(FLERR, "Energy was not tallied by pair style" + utils::errorurl(11)); // collect contributions from ghost atoms diff --git a/src/TALLY/compute_stress_tally.cpp b/src/TALLY/compute_stress_tally.cpp index c16e046dcf..3f264a92ce 100644 --- a/src/TALLY/compute_stress_tally.cpp +++ b/src/TALLY/compute_stress_tally.cpp @@ -202,10 +202,11 @@ double ComputeStressTally::compute_scalar() { invoked_scalar = update->ntimestep; if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) - error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Stress was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // sum accumulated forces across procs @@ -225,10 +226,11 @@ void ComputeStressTally::compute_peratom() { invoked_peratom = update->ntimestep; if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) - error->all(FLERR, Error::NOLASTLINE, "Stress was not tallied on needed timestep{}", utils::errorurl(22)); + error->all(FLERR, Error::NOLASTLINE, + "Stress was not tallied on needed timestep" + utils::errorurl(22)); if ((comm->me == 0) && !force->pair->did_tally_callback()) - error->warning(FLERR, "Stress was not tallied by pair style"); + error->warning(FLERR, "Stress was not tallied by pair style" + utils::errorurl(11)); // collect contributions from ghost atoms From 1b58a4695b33db76f08ade75a53a37109da2592f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 21 Mar 2025 20:17:17 -0400 Subject: [PATCH 55/99] add explanations for "before/after simulation box is defined" errors --- doc/src/Errors_details.rst | 26 ++++++++++++++++++ src/DIELECTRIC/pppm_dielectric.cpp | 8 +++--- src/DIELECTRIC/pppm_disp_dielectric.cpp | 8 +++--- src/KIM/kim_init.cpp | 2 +- src/PHONON/dynamical_matrix.cpp | 2 +- src/PHONON/third_order.cpp | 2 +- src/QEQ/fix_qeq.cpp | 3 ++- src/REPLICA/hyper.cpp | 2 +- src/REPLICA/neb.cpp | 2 +- src/REPLICA/prd.cpp | 2 +- src/REPLICA/tad.cpp | 2 +- src/REPLICA/temper.cpp | 2 +- src/REPLICA/temper_grem.cpp | 2 +- src/REPLICA/temper_npt.cpp | 2 +- src/SPIN/neb_spin.cpp | 2 +- src/angle_write.cpp | 4 +-- src/atom.cpp | 6 +++-- src/balance.cpp | 2 +- src/change_box.cpp | 2 +- src/create_atoms.cpp | 2 +- src/create_bonds.cpp | 2 +- src/create_box.cpp | 3 ++- src/delete_atoms.cpp | 2 +- src/delete_bonds.cpp | 2 +- src/dihedral_write.cpp | 4 +-- src/displace_atoms.cpp | 2 +- src/group.cpp | 2 +- src/input.cpp | 36 +++++++++++++------------ src/kspace.cpp | 8 +++--- src/label_map.cpp | 2 +- src/minimize.cpp | 2 +- src/output.cpp | 2 +- src/read_data.cpp | 6 +++-- src/read_dump.cpp | 2 +- src/read_restart.cpp | 2 +- src/replicate.cpp | 2 +- src/rerun.cpp | 2 +- src/reset_atoms_id.cpp | 2 +- src/reset_atoms_image.cpp | 2 +- src/reset_atoms_mol.cpp | 2 +- src/run.cpp | 2 +- src/velocity.cpp | 2 +- src/write_coeff.cpp | 2 +- src/write_data.cpp | 2 +- src/write_restart.cpp | 2 +- 45 files changed, 107 insertions(+), 73 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index a5b0d1b100..ae731a316b 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -912,3 +912,29 @@ typically happens when there are multiple fix commands that advance atom positions with overlapping groups. Also, for some fix styles it is not immediately obvious that they include time integration. Please check the documentation carefully. + +.. _err0033: + +XXX command before simulation box is defined +-------------------------------------------- + +This error happens, when trying to excute a LAMMPS command that requires +information about the system dimensions, or the number atom, bond, +angle, dihedral, or improper types, or the number of atoms or similar +data that is only available *after* the simulation box has been created. +See the paragraph on :ref:`errors before or after the simulation box is +created ` for additional information. + +.. _err0034: + +XXX command after simulation box is defined +-------------------------------------------- + +This error happens, when trying to excute a LAMMPS command that that +changes a global setting that will be locked in when the simulation box +is created (for instance defining the :doc:`atom style `, +:doc:`dimension `, :doc:`newton `, or :doc:`units +` setting). These settings may only be changed *before* the +simulation box has been created. See the paragraph on :ref:`errors +before or after the simulation box is created ` for additional +information. diff --git a/src/DIELECTRIC/pppm_dielectric.cpp b/src/DIELECTRIC/pppm_dielectric.cpp index 0a24c44bd6..e5b0c5abb1 100644 --- a/src/DIELECTRIC/pppm_dielectric.cpp +++ b/src/DIELECTRIC/pppm_dielectric.cpp @@ -306,10 +306,10 @@ void PPPMDielectric::qsum_qsq(int warning_flag) // so issue warning or error if (fabs(qsum) > SMALL) { - std::string message = fmt::format("System is not charge neutral, net " - "charge = {:.8}",qsum); - if (!warn_nonneutral) error->all(FLERR,message + utils::errorurl(29)); - if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message + utils::errorurl(29)); + std::string message = fmt::format("System is not charge neutral, net charge = {:.8}{}", + qsum, utils::errorurl(29)); + if (!warn_nonneutral) error->all(FLERR,message); + if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message); warn_nonneutral = 2; } } diff --git a/src/DIELECTRIC/pppm_disp_dielectric.cpp b/src/DIELECTRIC/pppm_disp_dielectric.cpp index 252a9386e3..052b617351 100644 --- a/src/DIELECTRIC/pppm_disp_dielectric.cpp +++ b/src/DIELECTRIC/pppm_disp_dielectric.cpp @@ -580,10 +580,10 @@ void PPPMDispDielectric::qsum_qsq(int warning_flag) // so issue warning or error if (fabs(qsum) > SMALL) { - std::string message = fmt::format("System is not charge neutral, net " - "charge = {:.8}",qsum); - if (!warn_nonneutral) error->all(FLERR,message + utils::errorurl(29)); - if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message + utils::errorurl(29)); + std::string message = fmt::format("System is not charge neutral, net charge = {:.8}{}", + qsum, utils::errorurl(29)); + if (!warn_nonneutral) error->all(FLERR,message); + if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message); warn_nonneutral = 2; } } diff --git a/src/KIM/kim_init.cpp b/src/KIM/kim_init.cpp index f7dd01be49..48b4d2eec2 100644 --- a/src/KIM/kim_init.cpp +++ b/src/KIM/kim_init.cpp @@ -86,7 +86,7 @@ void KimInit::command(int narg, char **arg) if ((narg < 2) || (narg > 3)) error->all(FLERR, "Illegal 'kim init' command"); if (domain->box_exist) - error->all(FLERR, "Must use 'kim init' command before simulation box is defined"); + error->all(FLERR, "Must use 'kim init' command before simulation box is defined" + utils::errorurl(33)); char *model_name = utils::strdup(arg[0]); char *user_units = utils::strdup(arg[1]); diff --git a/src/PHONON/dynamical_matrix.cpp b/src/PHONON/dynamical_matrix.cpp index a0199747c4..bdcf9c36f3 100644 --- a/src/PHONON/dynamical_matrix.cpp +++ b/src/PHONON/dynamical_matrix.cpp @@ -112,7 +112,7 @@ void DynamicalMatrix::command(int narg, char **arg) MPI_Comm_rank(world,&me); if (domain->box_exist == 0) - error->all(FLERR,"Dynamical_matrix command before simulation box is defined"); + error->all(FLERR,"Dynamical_matrix command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) error->all(FLERR,"Illegal dynamical_matrix command"); lmp->init(); diff --git a/src/PHONON/third_order.cpp b/src/PHONON/third_order.cpp index 378905bd29..e1d9161ef1 100644 --- a/src/PHONON/third_order.cpp +++ b/src/PHONON/third_order.cpp @@ -118,7 +118,7 @@ void ThirdOrder::command(int narg, char **arg) MPI_Comm_rank(world,&me); if (domain->box_exist == 0) - error->all(FLERR,"third_order command before simulation box is defined"); + error->all(FLERR,"third_order command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) error->all(FLERR,"Illegal third_order command"); // request a full neighbor list for use by this command diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index bbfb4d8a0b..8c54dc96cb 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -336,7 +336,8 @@ void FixQEq::init() MPI_Allreduce(&qsum_local,&qsum,1,MPI_DOUBLE,MPI_SUM,world); if ((comm->me == 0) && (fabs(qsum) > QSUMSMALL)) - error->warning(FLERR,"Fix {} group is not charge neutral, net charge = {:.8}", style, qsum); + error->warning(FLERR,"Fix {} group is not charge neutral, net charge = {:.8}{}", + style, qsum, utils::errorurl(29)); } /* ---------------------------------------------------------------------- */ diff --git a/src/REPLICA/hyper.cpp b/src/REPLICA/hyper.cpp index 2c7d13766f..df853642b4 100644 --- a/src/REPLICA/hyper.cpp +++ b/src/REPLICA/hyper.cpp @@ -52,7 +52,7 @@ void Hyper::command(int narg, char **arg) // error checks if (domain->box_exist == 0) - error->all(FLERR,"Hyper command before simulation box is defined"); + error->all(FLERR,"Hyper command before simulation box is defined" + utils::errorurl(33)); if (narg < 4) error->all(FLERR,"Illegal hyper command"); diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 4b242965c8..a65fc9a58f 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -113,7 +113,7 @@ NEB::~NEB() void NEB::command(int narg, char **arg) { if (domain->box_exist == 0) - error->universe_all(FLERR, "NEB command before simulation box is defined"); + error->universe_all(FLERR, "NEB command before simulation box is defined" + utils::errorurl(33)); if (narg < 6) error->universe_all(FLERR, "Illegal NEB command: missing argument(s)"); diff --git a/src/REPLICA/prd.cpp b/src/REPLICA/prd.cpp index 91150d8a38..493fb4da54 100644 --- a/src/REPLICA/prd.cpp +++ b/src/REPLICA/prd.cpp @@ -60,7 +60,7 @@ void PRD::command(int narg, char **arg) // error checks if (domain->box_exist == 0) - error->all(FLERR,"PRD command before simulation box is defined"); + error->all(FLERR,"PRD command before simulation box is defined" + utils::errorurl(33)); if (universe->nworlds != universe->nprocs && atom->map_style == Atom::MAP_NONE) error->all(FLERR,"Cannot use PRD with multi-processor replicas " diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 38ddfceb84..14f816b15e 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -74,7 +74,7 @@ void TAD::command(int narg, char **arg) // error checks if (domain->box_exist == 0) - error->all(FLERR,"Tad command before simulation box is defined"); + error->all(FLERR,"Tad command before simulation box is defined" + utils::errorurl(33)); if (universe->nworlds == 1) error->all(FLERR,"Cannot use TAD with a single replica for NEB"); if (universe->nworlds != universe->nprocs) diff --git a/src/REPLICA/temper.cpp b/src/REPLICA/temper.cpp index 77bc45e6e3..a7416418be 100644 --- a/src/REPLICA/temper.cpp +++ b/src/REPLICA/temper.cpp @@ -64,7 +64,7 @@ void Temper::command(int narg, char **arg) if (universe->nworlds == 1) error->universe_all(FLERR,"More than one processor partition required for temper command"); if (domain->box_exist == 0) - error->universe_all(FLERR,"Temper command before simulation box is defined"); + error->universe_all(FLERR,"Temper command before simulation box is defined" + utils::errorurl(33)); if (narg != 6 && narg != 7) error->universe_all(FLERR,"Illegal temper command"); int nsteps = utils::inumeric(FLERR,arg[0],false,lmp); diff --git a/src/REPLICA/temper_grem.cpp b/src/REPLICA/temper_grem.cpp index c4509791c3..9ef0fe8a4a 100644 --- a/src/REPLICA/temper_grem.cpp +++ b/src/REPLICA/temper_grem.cpp @@ -66,7 +66,7 @@ void TemperGrem::command(int narg, char **arg) if (universe->nworlds == 1) error->universe_all(FLERR,"More than one processor partition required for temper/grem command"); if (domain->box_exist == 0) - error->universe_all(FLERR,"Temper/grem command before simulation box is defined"); + error->universe_all(FLERR,"Temper/grem command before simulation box is defined" + utils::errorurl(33)); if (narg != 7 && narg != 8) error->universe_all(FLERR,"Illegal temper/grem command"); int nsteps = utils::inumeric(FLERR,arg[0],false,lmp); diff --git a/src/REPLICA/temper_npt.cpp b/src/REPLICA/temper_npt.cpp index aa72047fe7..4c04ecfe7b 100644 --- a/src/REPLICA/temper_npt.cpp +++ b/src/REPLICA/temper_npt.cpp @@ -66,7 +66,7 @@ void TemperNPT::command(int narg, char **arg) if (universe->nworlds == 1) error->universe_all(FLERR,"More than one processor partition required for temper/npt command"); if (domain->box_exist == 0) - error->universe_all(FLERR,"Temper/npt command before simulation box is defined"); + error->universe_all(FLERR,"Temper/npt command before simulation box is defined" + utils::errorurl(33)); if (narg != 7 && narg != 8) error->universe_all(FLERR,"Illegal temper/npt command"); int nsteps = utils::inumeric(FLERR,arg[0],false,lmp); diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 00b92b906a..34d5a37b17 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -95,7 +95,7 @@ NEBSpin::~NEBSpin() void NEBSpin::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"NEBSpin command before simulation box is defined"); + error->all(FLERR,"NEBSpin command before simulation box is defined" + utils::errorurl(33)); if (narg < 6) error->universe_all(FLERR,"Illegal NEBSpin command"); diff --git a/src/angle_write.cpp b/src/angle_write.cpp index 1c1601d002..4a328a9c98 100644 --- a/src/angle_write.cpp +++ b/src/angle_write.cpp @@ -43,11 +43,11 @@ void AngleWrite::command(int narg, char **arg) // sanity checks if (domain->box_exist == 0) - error->all(FLERR, "Angle_write command before simulation box is defined"); + error->all(FLERR, "Angle_write command before simulation box is defined" + utils::errorurl(33)); if (atom->avec->angles_allow == 0) error->all(FLERR, "Angle_write command when no angles allowed"); auto angle = force->angle; - if (angle == nullptr) error->all(FLERR, "Angle_write command before an angle_style is defined"); + if (angle == nullptr) error->all(FLERR, "Angle_write command before an angle_style is defined" + utils::errorurl(33)); if (angle && (force->angle->writedata == 0)) error->all(FLERR, "Angle style must support writing coeffs to data file for angle_write"); diff --git a/src/atom.cpp b/src/atom.cpp index bbc00dec75..3a95d65371 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -836,13 +836,15 @@ void Atom::modify_params(int narg, char **arg) if (strcmp(arg[iarg],"id") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "atom_modify id", error); if (domain->box_exist) - error->all(FLERR, idx, "Atom_modify id command after simulation box is defined"); + error->all(FLERR, idx, "Atom_modify id command after simulation box is defined" + + utils::errorurl(34)); tag_enable = utils::logical(FLERR,arg[iarg+1],false,lmp); iarg += 2; } else if (strcmp(arg[iarg],"map") == 0) { if (iarg+2 > narg) utils::missing_cmd_args(FLERR, "atom_modify map", error); if (domain->box_exist) - error->all(FLERR, idx, "Atom_modify map command after simulation box is defined"); + error->all(FLERR, idx, "Atom_modify map command after simulation box is defined" + + utils::errorurl(34)); if (strcmp(arg[iarg+1],"array") == 0) map_user = MAP_ARRAY; else if (strcmp(arg[iarg+1],"hash") == 0) map_user = MAP_HASH; else if (strcmp(arg[iarg+1],"yes") == 0) map_user = MAP_YES; diff --git a/src/balance.cpp b/src/balance.cpp index 5ebe242bfb..22a0938b3c 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -113,7 +113,7 @@ Balance::~Balance() void Balance::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, -1, "Balance command before simulation box is defined"); + error->all(FLERR, -1, "Balance command before simulation box is defined" + utils::errorurl(33)); if (comm->me == 0) utils::logmesg(lmp,"Balancing ...\n"); diff --git a/src/change_box.cpp b/src/change_box.cpp index 5223218f3d..e6b7b5cdc4 100644 --- a/src/change_box.cpp +++ b/src/change_box.cpp @@ -45,7 +45,7 @@ void ChangeBox::command(int narg, char **arg) int i; if (domain->box_exist == 0) - error->all(FLERR,"Change_box command before simulation box is defined"); + error->all(FLERR,"Change_box command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) utils::missing_cmd_args(FLERR, "change_box", error); if (comm->me == 0) utils::logmesg(lmp,"Changing box ...\n"); diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index dc00e2e1d1..7be67f4c49 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -73,7 +73,7 @@ CreateAtoms::CreateAtoms(LAMMPS *lmp) : Command(lmp), basistype(nullptr) {} void CreateAtoms::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Create_atoms command before simulation box is defined"); + error->all(FLERR, "Create_atoms command before simulation box is defined" + utils::errorurl(33)); if (modify->nfix_restart_peratom) error->all(FLERR, "Cannot create_atoms after reading restart file with per-atom info"); diff --git a/src/create_bonds.cpp b/src/create_bonds.cpp index 416884138b..28d6f4c136 100644 --- a/src/create_bonds.cpp +++ b/src/create_bonds.cpp @@ -44,7 +44,7 @@ CreateBonds::CreateBonds(LAMMPS *lmp) : Command(lmp) {} void CreateBonds::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Create_bonds command before simulation box is defined"); + error->all(FLERR, "Create_bonds command before simulation box is defined" + utils::errorurl(33)); if (atom->tag_enable == 0) error->all(FLERR, "Cannot use create_bonds unless atoms have IDs"); if (atom->molecular != Atom::MOLECULAR) error->all(FLERR, "Cannot use create_bonds with non-molecular system"); diff --git a/src/create_box.cpp b/src/create_box.cpp index 93e699e06b..52d56a4ea1 100644 --- a/src/create_box.cpp +++ b/src/create_box.cpp @@ -38,7 +38,8 @@ void CreateBox::command(int narg, char **arg) { if (narg < 2) utils::missing_cmd_args(FLERR, "create_box", error); - if (domain->box_exist) error->all(FLERR, "Cannot create_box after simulation box is defined"); + if (domain->box_exist) + error->all(FLERR, "Cannot create_box after simulation box is defined" + utils::errorurl(34)); if (domain->dimension == 2 && domain->zperiodic == 0) error->all(FLERR, "Cannot run 2d simulation with nonperiodic Z dimension"); diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index 35f608461b..96639ae85e 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -52,7 +52,7 @@ DeleteAtoms::DeleteAtoms(LAMMPS *lmp) : Command(lmp) {} void DeleteAtoms::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Delete_atoms command before simulation box is defined"); + error->all(FLERR, "Delete_atoms command before simulation box is defined" + utils::errorurl(33)); if (narg < 1) utils::missing_cmd_args(FLERR, "delete_atoms", error); if (atom->tag_enable == 0) error->all(FLERR, "Cannot use delete_atoms unless atoms have IDs"); diff --git a/src/delete_bonds.cpp b/src/delete_bonds.cpp index 056851bec1..95928138eb 100644 --- a/src/delete_bonds.cpp +++ b/src/delete_bonds.cpp @@ -40,7 +40,7 @@ DeleteBonds::DeleteBonds(LAMMPS *lmp) : Command(lmp) {} void DeleteBonds::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Delete_bonds command before simulation box is defined"); + error->all(FLERR,"Delete_bonds command before simulation box is defined" + utils::errorurl(33)); if (atom->natoms == 0) error->all(FLERR,"Delete_bonds command with no atoms existing"); if (atom->molecular != Atom::MOLECULAR) diff --git a/src/dihedral_write.cpp b/src/dihedral_write.cpp index 11d283dc27..24cae8db3b 100644 --- a/src/dihedral_write.cpp +++ b/src/dihedral_write.cpp @@ -42,12 +42,12 @@ void DihedralWrite::command(int narg, char **arg) // sanity checks if (domain->box_exist == 0) - error->all(FLERR, "Dihedral_write command before simulation box is defined"); + error->all(FLERR, "Dihedral_write command before simulation box is defined" + utils::errorurl(33)); if (atom->avec->dihedrals_allow == 0) error->all(FLERR, "Dihedral_write command when no dihedrals allowed"); auto dihedral = force->dihedral; if (dihedral == nullptr) - error->all(FLERR, "Dihedral_write command before an dihedral_style is defined"); + error->all(FLERR, "Dihedral_write command before an dihedral_style is defined" + utils::errorurl(33)); if (dihedral && (force->dihedral->writedata == 0)) error->all(FLERR, "Dihedral style must support writing coeffs to data file for dihedral_write"); diff --git a/src/displace_atoms.cpp b/src/displace_atoms.cpp index f930fa0980..b50090143b 100644 --- a/src/displace_atoms.cpp +++ b/src/displace_atoms.cpp @@ -63,7 +63,7 @@ void DisplaceAtoms::command(int narg, char **arg) int i; if (domain->box_exist == 0) - error->all(FLERR,"Displace_atoms command before simulation box is defined"); + error->all(FLERR,"Displace_atoms command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) error->all(FLERR,"Illegal displace_atoms command"); if (modify->nfix_restart_peratom) error->all(FLERR,"Cannot displace_atoms after " diff --git a/src/group.cpp b/src/group.cpp index 136faa4059..0b4ea743cf 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -92,7 +92,7 @@ void Group::assign(int narg, char **arg) { int i; - if (domain->box_exist == 0) error->all(FLERR, "Group command before simulation box is defined"); + if (domain->box_exist == 0) error->all(FLERR, "Group command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) utils::missing_cmd_args(FLERR, "group", error); // delete the group if not being used elsewhere diff --git a/src/input.cpp b/src/input.cpp index 6ea710f567..bc9a55052c 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -1347,7 +1347,7 @@ void Input::variable_command() void Input::angle_coeff() { if (domain->box_exist == 0) - error->all(FLERR,"Angle_coeff command before simulation box is defined"); + error->all(FLERR,"Angle_coeff command before simulation box is defined" + utils::errorurl(33)); if (force->angle == nullptr) error->all(FLERR,"Angle_coeff command before angle_style is defined"); if (atom->avec->angles_allow == 0) @@ -1382,7 +1382,7 @@ void Input::atom_style() { if (narg < 1) utils::missing_cmd_args(FLERR, "atom_style", error); if (domain->box_exist) - error->all(FLERR,"Atom_style command after simulation box is defined"); + error->all(FLERR,"Atom_style command after simulation box is defined" + utils::errorurl(34)); atom->create_avec(arg[0],narg-1,&arg[1],1); } @@ -1391,7 +1391,7 @@ void Input::atom_style() void Input::bond_coeff() { if (domain->box_exist == 0) - error->all(FLERR,"Bond_coeff command before simulation box is defined"); + error->all(FLERR,"Bond_coeff command before simulation box is defined" + utils::errorurl(33)); if (force->bond == nullptr) error->all(FLERR,"Bond_coeff command before bond_style is defined"); if (atom->avec->bonds_allow == 0) @@ -1429,7 +1429,7 @@ void Input::bond_write() void Input::boundary() { if (domain->box_exist) - error->all(FLERR,"Boundary command after simulation box is defined"); + error->all(FLERR,"Boundary command after simulation box is defined" + utils::errorurl(34)); domain->set_boundary(narg,arg,0); } @@ -1486,7 +1486,8 @@ void Input::dielectric() void Input::dihedral_coeff() { if (domain->box_exist == 0) - error->all(FLERR,"Dihedral_coeff command before simulation box is defined"); + error->all(FLERR,"Dihedral_coeff command before simulation box is defined" + + utils::errorurl(33)); if (force->dihedral == nullptr) error->all(FLERR,"Dihedral_coeff command before dihedral_style is defined"); if (atom->avec->dihedrals_allow == 0) @@ -1514,7 +1515,7 @@ void Input::dimension() { if (narg != 1) error->all(FLERR, "Dimension command expects exactly 1 argument"); if (domain->box_exist) - error->all(FLERR,"Dimension command after simulation box is defined"); + error->all(FLERR,"Dimension command after simulation box is defined" + utils::errorurl(34)); domain->dimension = utils::inumeric(FLERR,arg[0],false,lmp); if (domain->dimension != 2 && domain->dimension != 3) error->all(FLERR, "Invalid dimension argument: {}", arg[0]); @@ -1565,7 +1566,7 @@ void Input::group_command() void Input::improper_coeff() { if (domain->box_exist == 0) - error->all(FLERR,"Improper_coeff command before simulation box is defined"); + error->all(FLERR,"Improper_coeff command before simulation box is defined" + utils::errorurl(33)); if (force->improper == nullptr) error->all(FLERR,"Improper_coeff command before improper_style is defined"); if (atom->avec->impropers_allow == 0) @@ -1607,7 +1608,8 @@ void Input::kspace_style() void Input::labelmap() { - if (domain->box_exist == 0) error->all(FLERR,"Labelmap command before simulation box is defined"); + if (domain->box_exist == 0) + error->all(FLERR,"Labelmap command before simulation box is defined" + utils::errorurl(33)); if (!atom->labelmapflag) atom->add_label_map(); atom->lmap->modify_lmap(narg,arg); } @@ -1625,7 +1627,7 @@ void Input::mass() { if (narg != 2) error->all(FLERR,"Illegal mass command: expected 2 arguments but found {}", narg); if (domain->box_exist == 0) - error->all(FLERR,"Mass command before simulation box is defined"); + error->all(FLERR,"Mass command before simulation box is defined" + utils::errorurl(33)); atom->set_mass(FLERR,narg,arg); } @@ -1641,7 +1643,7 @@ void Input::min_modify() void Input::min_style() { if (domain->box_exist == 0) - error->all(FLERR,"Min_style command before simulation box is defined"); + error->all(FLERR,"Min_style command before simulation box is defined" + utils::errorurl(33)); update->create_minimize(narg,arg,1); } @@ -1682,7 +1684,7 @@ void Input::newton() force->newton_pair = newton_pair; if (domain->box_exist && (newton_bond != force->newton_bond)) - error->all(FLERR,"Newton bond change after simulation box is defined"); + error->all(FLERR,"Newton bond change after simulation box is defined" + utils::errorurl(34)); force->newton_bond = newton_bond; if (newton_pair || newton_bond) force->newton = 1; @@ -1696,8 +1698,8 @@ void Input::newton() void Input::package() { if (domain->box_exist) - error->all(FLERR,"Package command after simulation box is defined"); - if (narg < 1) error->all(FLERR,"Illegal package command"); + error->all(FLERR,"Package command after simulation box is defined" + utils::errorurl(34)); + if (narg < 1) utils::missing_cmd_args(FLERR, "package", error); // same checks for packages existing as in LAMMPS::post_create() // since can be invoked here by package command in input script @@ -1739,7 +1741,7 @@ void Input::package() void Input::pair_coeff() { if (domain->box_exist == 0) - error->all(FLERR,"Pair_coeff command before simulation box is defined"); + error->all(FLERR,"Pair_coeff command before simulation box is defined" + utils::errorurl(33)); if (force->pair == nullptr) error->all(FLERR,"Pair_coeff command without a pair style"); if (narg < 2) utils::missing_cmd_args(FLERR,"pair_coeff", error); if (force->pair->one_coeff && ((strcmp(arg[0],"*") != 0) || (strcmp(arg[1],"*") != 0))) @@ -1820,7 +1822,7 @@ void Input::pair_write() void Input::processors() { if (domain->box_exist) - error->all(FLERR,"Processors command after simulation box is defined"); + error->all(FLERR,"Processors command after simulation box is defined" + utils::errorurl(34)); comm->set_processors(narg,arg); } @@ -1850,7 +1852,7 @@ void Input::restart() void Input::run_style() { if (domain->box_exist == 0) - error->all(FLERR,"Run_style command before simulation box is defined"); + error->all(FLERR,"Run_style command before simulation box is defined" + utils::errorurl(33)); update->create_integrate(narg,arg,1); } @@ -2002,7 +2004,7 @@ void Input::units() { if (narg != 1) error->all(FLERR,"Illegal units command: expected 1 argument but found {}", narg); if (domain->box_exist) - error->all(FLERR,"Units command after simulation box is defined"); + error->all(FLERR,"Units command after simulation box is defined" + utils::errorurl(34)); update->set_units(arg[0]); } diff --git a/src/kspace.cpp b/src/kspace.cpp index bf5fdf8378..2de25d6e86 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -321,10 +321,10 @@ void KSpace::qsum_qsq(int warning_flag) // so issue warning or error if (fabs(qsum) > SMALL) { - std::string message = fmt::format("System is not charge neutral, net " - "charge = {:.8}",qsum); - if (!warn_nonneutral) error->all(FLERR,message + utils::errorurl(29)); - if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message + utils::errorurl(29)); + std::string message = fmt::format("System is not charge neutral, net charge = {:.8}{}", + qsum, utils::errorurl(29)); + if (!warn_nonneutral) error->all(FLERR,message); + if (warn_nonneutral == 1 && comm->me == 0) error->warning(FLERR,message); warn_nonneutral = 2; } } diff --git a/src/label_map.cpp b/src/label_map.cpp index 24cef51062..82d1eaac02 100644 --- a/src/label_map.cpp +++ b/src/label_map.cpp @@ -254,7 +254,7 @@ int LabelMap::find_or_create(const std::string &mylabel, std::vectorall(FLERR, "Topology type exceeds system topology type"); + error->all(FLERR, "Topology type exceeds system topology type" + utils::errorurl(25)); // never reaches here, just to prevent compiler warning diff --git a/src/minimize.cpp b/src/minimize.cpp index d13429804c..8fd90ade5f 100644 --- a/src/minimize.cpp +++ b/src/minimize.cpp @@ -35,7 +35,7 @@ void Minimize::command(int narg, char **arg) error->all(FLERR, "Illegal minimize command: expected 4 arguments but found {}", narg); if (domain->box_exist == 0) - error->all(FLERR, "Minimize command before simulation box is defined"); + error->all(FLERR, "Minimize command before simulation box is defined" + utils::errorurl(33)); // ignore minimize command, if walltime limit was already reached if (timer->is_timeout()) return; diff --git a/src/output.cpp b/src/output.cpp index 60d84e715d..0602c4f52d 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -896,7 +896,7 @@ void Output::create_thermo(int narg, char **arg) // don't allow this so that dipole style can safely allocate inertia vector if (domain->box_exist == 0) - error->all(FLERR,"Thermo_style command before simulation box is defined"); + error->all(FLERR,"Thermo_style command before simulation box is defined" + utils::errorurl(33)); // warn if previous thermo had been modified via thermo_modify command diff --git a/src/read_data.cpp b/src/read_data.cpp index 8d97b11243..79d88148c5 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -339,9 +339,11 @@ void ReadData::command(int narg, char **arg) "Reading a data file with shrinkwrap boundaries is not " "compatible with a MSM KSpace style"); if (domain->box_exist && !addflag) - error->all(FLERR, "Cannot use read_data without add keyword after simulation box is defined"); + error->all(FLERR, "Cannot use read_data without add keyword after simulation box is defined" + + utils::errorurl(34)); if (!domain->box_exist && addflag) - error->all(FLERR, "Cannot use read_data add before simulation box is defined"); + error->all(FLERR, "Cannot use read_data add before simulation box is defined" + + utils::errorurl(33)); if (offsetflag) { if (addflag == NONE) { error->all(FLERR, "Cannot use read_data offset without add keyword"); diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 59fe6c6767..0f5356ecd9 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -80,7 +80,7 @@ ReadDump::~ReadDump() void ReadDump::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Read_dump command before simulation box is defined"); + error->all(FLERR,"Read_dump command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) utils::missing_cmd_args(FLERR, "read_dump", error); diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 96f1c3d072..594ae377d3 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -52,7 +52,7 @@ void ReadRestart::command(int narg, char **arg) if (narg != 1 && narg != 2) error->all(FLERR,"Illegal read_restart command"); if (domain->box_exist) - error->all(FLERR,"Cannot read_restart after simulation box is defined"); + error->all(FLERR,"Cannot read_restart after simulation box is defined" + utils::errorurl(34)); MPI_Barrier(world); double time1 = platform::walltime(); diff --git a/src/replicate.cpp b/src/replicate.cpp index 97a7569f64..5b221fde1d 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -52,7 +52,7 @@ void Replicate::command(int narg, char **arg) int i,n; if (domain->box_exist == 0) - error->all(FLERR,"Replicate command before simulation box is defined"); + error->all(FLERR,"Replicate command before simulation box is defined" + utils::errorurl(33)); if (narg < 3 || narg > 4) error->all(FLERR,"Illegal replicate command"); diff --git a/src/rerun.cpp b/src/rerun.cpp index 96491bab36..8115b3d5d4 100644 --- a/src/rerun.cpp +++ b/src/rerun.cpp @@ -41,7 +41,7 @@ Rerun::Rerun(LAMMPS *lmp) : Command(lmp) {} void Rerun::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Rerun command before simulation box is defined"); + error->all(FLERR,"Rerun command before simulation box is defined" + utils::errorurl(33)); if (narg < 2) error->all(FLERR,"Illegal rerun command"); diff --git a/src/reset_atoms_id.cpp b/src/reset_atoms_id.cpp index 9992a49b28..b38b28b6a1 100644 --- a/src/reset_atoms_id.cpp +++ b/src/reset_atoms_id.cpp @@ -53,7 +53,7 @@ ResetAtomsID::ResetAtomsID(LAMMPS *lmp) : Command(lmp) void ResetAtomsID::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Reset_atoms id command before simulation box is defined"); + error->all(FLERR, "Reset_atoms id command before simulation box is defined" + utils::errorurl(33)); if (atom->tag_enable == 0) error->all(FLERR, "Cannot use reset_atoms id unless atoms have IDs"); for (const auto &ifix : modify->get_fix_list()) diff --git a/src/reset_atoms_image.cpp b/src/reset_atoms_image.cpp index 63030c632b..b57c98905f 100644 --- a/src/reset_atoms_image.cpp +++ b/src/reset_atoms_image.cpp @@ -39,7 +39,7 @@ ResetAtomsImage::ResetAtomsImage(LAMMPS *lmp) : Command(lmp) {} void ResetAtomsImage::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Reset_atoms image command before simulation box is defined"); + error->all(FLERR, "Reset_atoms image command before simulation box is defined" + utils::errorurl(33)); if (atom->tag_enable == 0) error->all(FLERR, "Cannot use reset_atoms image unless atoms have IDs"); if (atom->avec->bonds_allow == 0) diff --git a/src/reset_atoms_mol.cpp b/src/reset_atoms_mol.cpp index 66dd886059..54d3bbcc76 100644 --- a/src/reset_atoms_mol.cpp +++ b/src/reset_atoms_mol.cpp @@ -61,7 +61,7 @@ ResetAtomsMol::~ResetAtomsMol() void ResetAtomsMol::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Reset_atoms mol command before simulation box is defined"); + error->all(FLERR, "Reset_atoms mol command before simulation box is defined" + utils::errorurl(33)); if (atom->tag_enable == 0) error->all(FLERR, "Cannot use reset_atoms mol unless atoms have IDs"); if (atom->molecular != Atom::MOLECULAR) error->all(FLERR, "Can only use reset_atoms mol on molecular systems"); diff --git a/src/run.cpp b/src/run.cpp index 516bce5d0b..5444297e5d 100644 --- a/src/run.cpp +++ b/src/run.cpp @@ -39,7 +39,7 @@ void Run::command(int narg, char **arg) if (narg < 1) utils::missing_cmd_args(FLERR, "run", error); if (domain->box_exist == 0) - error->all(FLERR,"Run command before simulation box is defined"); + error->all(FLERR,"Run command before simulation box is defined" + utils::errorurl(33)); // ignore run command, if walltime limit was already reached diff --git a/src/velocity.cpp b/src/velocity.cpp index 1f0a757d7c..ba95fdc631 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -51,7 +51,7 @@ void Velocity::command(int narg, char **arg) if (narg < 2) utils::missing_cmd_args(FLERR, "velocity", error); if (domain->box_exist == 0) - error->all(FLERR,"Velocity command before simulation box is defined"); + error->all(FLERR,"Velocity command before simulation box is defined" + utils::errorurl(33)); if (atom->natoms == 0) error->all(FLERR,"Velocity command with no atoms existing"); diff --git a/src/write_coeff.cpp b/src/write_coeff.cpp index 5a7177f62f..19f512fab1 100644 --- a/src/write_coeff.cpp +++ b/src/write_coeff.cpp @@ -39,7 +39,7 @@ static constexpr int BUF_SIZE = 256; void WriteCoeff::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR, "Write_coeff command before simulation box is defined"); + error->all(FLERR, "Write_coeff command before simulation box is defined" + utils::errorurl(33)); if (narg != 1) utils::missing_cmd_args(FLERR, "write_coeff", error); diff --git a/src/write_data.cpp b/src/write_data.cpp index 85950f3b47..6f05ae1ac2 100644 --- a/src/write_data.cpp +++ b/src/write_data.cpp @@ -51,7 +51,7 @@ WriteData::WriteData(LAMMPS *lmp) : Command(lmp) {} void WriteData::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Write_data command before simulation box is defined"); + error->all(FLERR,"Write_data command before simulation box is defined" + utils::errorurl(33)); if (narg < 1) utils::missing_cmd_args(FLERR, "write_data", error); diff --git a/src/write_restart.cpp b/src/write_restart.cpp index a2022deeb9..ecf6b7bc08 100644 --- a/src/write_restart.cpp +++ b/src/write_restart.cpp @@ -59,7 +59,7 @@ WriteRestart::WriteRestart(LAMMPS *lmp) : Command(lmp) void WriteRestart::command(int narg, char **arg) { if (domain->box_exist == 0) - error->all(FLERR,"Write_restart command before simulation box is defined"); + error->all(FLERR,"Write_restart command before simulation box is defined" + utils::errorurl(33)); if (narg < 1) utils::missing_cmd_args(FLERR, "write_restart", error); // if filename contains a "*", replace with current timestep From 410d3e84b040b94457583e05223bc21445f9806c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 04:41:34 -0400 Subject: [PATCH 56/99] add a Howto demonstrating how to convert a bulk molecular system to a slab --- doc/src/Howto.rst | 1 + doc/src/Howto_bulk2slab.rst | 119 ++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 doc/src/Howto_bulk2slab.rst diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst index df42f6bd9d..ec90472c27 100644 --- a/doc/src/Howto.rst +++ b/doc/src/Howto.rst @@ -40,6 +40,7 @@ Settings howto Howto_walls Howto_nemd Howto_dispersion + Howto_bulk2slab Analysis howto ============== diff --git a/doc/src/Howto_bulk2slab.rst b/doc/src/Howto_bulk2slab.rst new file mode 100644 index 0000000000..c3322b9c77 --- /dev/null +++ b/doc/src/Howto_bulk2slab.rst @@ -0,0 +1,119 @@ +====================================== +Convert a bulk system to a slab system +====================================== + +A regularly encountered simulation problem is how to convert a bulk +system that has been run for a while into a slab system with some vacuum +space. The challenge here is that one cannot just change the box +dimensions with the :doc:`change_box command ` because some +atoms will have non-zero image flags. Changing the box dimensions +results in an undesired displacement of those atoms, since the image +flags indicate how many times the box length in x-, y-, or z-direction +needs to be added or subtracted to get the "unwrapped" coordinates. + +Below is a suggested workflow that can be applied to the :doc:`Rhodo +benchmark input `. The modifications to the ``in.rhodo`` +input file are discussed below. The first lines up to and including the +:doc:`read_data command ` remain unchanged. Then we insert +the following lines to add vacuum to the z direction above and below +the system: + +.. code-block:: LAMMPS + + variable delta index 10.0 + reset_atoms image all + write_dump all custom rhodo-unwrap.lammpstrj id xu yu zu + change_box all z final $(zlo-2.0*v_delta) $(zhi+2.0*v_delta) + set atom * image NULL NULL 0 + read_dump rhodo-unwrap.lammpstrj 0 x y z box no replace yes + change_box all boundary p p f + kspace_modify slab 3.0 + +The :doc:`variable delta ` (set to :math:`10 \AA`) represents +a distance that determines the amount of vacuum added: we add twice its +value in each direction to the z-dimension so in total :math:`40 \AA` +get added. The :doc:`reset_atoms image all ` command shall +reset any image flags to become either 0 or :math:`\pm 1`. + +The :doc:`write_dump command ` then writes out the resulting +"unwrapped" coordinates of the system. After expanding the box, coordinates +that were outside the box should now be inside. + +The first :doc:`change_box command ` adds the desired +distance to the low and high box boundary in z-direction as thus will +create an undesired displacement for the atoms with non-zero image +flags. With the :doc:`set command ` the image flags in z-direction +will be set to zero while preserving the values in x- and y-direction. + +With the :doc:`read_dump command ` we read back and replace +partially incorrect coordinates with the previously saved, unwrapped +coordinates. It is important to ignore the box dimensions stored in the +dump file. We want to preserve the expanded box. At this point it is +also possible to change the periodicity in z-direction with the second +:doc:`change_box command ` and turn on the slab correction +to the PPPM long-range solver with the :doc:`kspace_modify command +`. + +Next we replace the :doc:`fix npt command ` with: + +.. code-block:: LAMMPS + + fix 2 nvt temp 300.0 300.0 10.0 + +We now have an open system and thus the adjustment of the cell in +z-direction is no longer required. Since the splitting of the bulk +system where the vacuum is inserted, we reduce the thermostat time +constant from 100.0 to 10.0 to remove excess kinetic energy resulting +from that change faster. + +Since atoms and molecules at the interface will experience a large +change in potential energy due to the box expansion, and thus it is +possible that some of them will be ejected from the slab. In order to +suppress that, we add soft harmonic walls to push back any atoms that +want to leave the slab. To determine the position of the wall, we +first need to to determine the extent of the atoms in z-direction +and then place the harmonic walls based on that information: + +.. code-block:: LAMMPS + + compute zmin all reduce min z + compute zmax all reduce max z + thermo_style custom zlo c_zmin zhi c_zmax + run 0 post no + fix 3 all wall/harmonic zhi $(c_zmax+v_delta) 10.0 0.0 ${delta} & + zlo $(c_zmin-v_delta) 10.0 0.0 ${delta} + +The two :doc:`compute reduce ` command determine the +minimum and maximum z-coordinate across all atoms. In order to trigger +the compute commands we need to "consume" them. This is done with the +:doc:`thermo_style custom ` command followed by the +:doc:`run 0 ` command. This enables using the min/max values +determined by the compute commands to compute the location of the wall +in lower and upper direction. This uses the previously defined *delta* +variable to determine the distance of the wall from the extent of the +system and the cutoff for the wall interaction. This way only atoms +that move beyond the min/max values in z-direction will experience a +restoring force. The force constant of :math:`10.0 +\frac{\mathrm{kcal/mol}}{\AA}` was determined empirically. + +Finally, we replace the :doc:`run 100 ` of the original input with: + +.. code-block:: LAMMPS + + run 1000 post no + + unfix 3 + fix 2 all nvt temp 300.0 300.0 100.0 + run 1000 post no + + write_data data.rhodo-slab + +This runs the system converted to a slab first for 1000 MD steps using +the walls and stronger Nose-Hoover thermostat. Then the walls are +removed and the thermostat time constant reset to 100.0 and the system +run for another 1000 steps. Finally the resulting slab geometry is +written to a new data file ``data.rhodo-slab`` with a :doc:`write_data +command `. The number of MD steps required to reach a +proper equilibrium state is very likely larger. The number of 1000 +steps (corresponding to 2 picoseconds) was chosen for demonstration +purposes, so that the procedure can be easily and quickly tested. From 725b34a70a2da3369d79bee6db4aea5b68cb9ae8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 06:08:16 -0400 Subject: [PATCH 57/99] add snapshot images to show the initial and final geometry and box --- doc/src/Howto_bulk2slab.rst | 8 +++++++- doc/src/JPG/rhodo-both.jpg | Bin 0 -> 581942 bytes 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 doc/src/JPG/rhodo-both.jpg diff --git a/doc/src/Howto_bulk2slab.rst b/doc/src/Howto_bulk2slab.rst index c3322b9c77..58d22f8037 100644 --- a/doc/src/Howto_bulk2slab.rst +++ b/doc/src/Howto_bulk2slab.rst @@ -11,7 +11,13 @@ results in an undesired displacement of those atoms, since the image flags indicate how many times the box length in x-, y-, or z-direction needs to be added or subtracted to get the "unwrapped" coordinates. -Below is a suggested workflow that can be applied to the :doc:`Rhodo +.. figure:: JPG/rhodo-both.jpg + :figwidth: 80% + :figclass: align-center + + Snapshots of the bulk Rhodopsin system (right) and the slab geometry (left) + +Below is a suggested workflow that can be applied to the :doc:`Rhodopsin benchmark input `. The modifications to the ``in.rhodo`` input file are discussed below. The first lines up to and including the :doc:`read_data command ` remain unchanged. Then we insert diff --git a/doc/src/JPG/rhodo-both.jpg b/doc/src/JPG/rhodo-both.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47cc863d8f785759485948d15c81d879a782dfeb GIT binary patch literal 581942 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

dD@)=WE{m2_N|!RX^fO zFX8fNvZCP`j(7JGpjSFY{mt*=ZQKtc@$wwmbaX*fz=s$WI}yRl8NK|nocv6$s=n5* z*6u3`zYl-+Ug%ij=bWT+kW$ZLzUpZ&?+;Lq$Zjav?1!aiw!6IGA3a^>NyR{mECC@) z-b`C^MK}d%BxJj|X%zQ7Ce5D~1D0)YLe51Sdm~D_EOhaG>vm{x0-ZNSu7Q7F8d|tK ze9riMREtrxmf|Ll)6r#|(Gk$8nRa~RGe>=z|5%Ot8_-^X2+R|ppkWRq!TE?~(6Oyg ziP%D`c@2thjY1~9Jbh~d6lR(^K|DK{!On_N*!(9uYSj_@_5PrGuFqxOHMsaX1kSmy z=Wc8Xy)uxf&FCrhckDcUt}0qCm5X6NC%I7j!eR2aJf53j4|ebQHh&E6Md$YGVyqEA zB*&Jt8mQXH8j@O2{}iKPo)!fun8m*kBrCL>lA=aT6C*w#z&( zw5SNiw19jyvc*+8)1{x^#F1N@GgUFjUL5wh9;g}Xovop8zxLHr7z%Qo ze`cX)DQda_OS7{0m|BO9<$6|6D?D^TG)t^}+!mh)XsH>+hOGOXB1#cv0d$+c>HAiX_KMt^Qzbz3C-vS2g{2>7IG0EVOLxZdI*Ryn3xk%N#P@ zkO36OA_MgVzQxK*0=MYk%nDwNVccD(kybHS>1TfhU>4w+z`=W31Ne%|YQk?I`|g=r zitPByv`8K1dJ9co7i-XqmrBO0{&iA5i6e5JS&Kr*MMlV~bpEf_C*5=$nt>#>L`Ytv2YBS4}e>yd8jEkv>?GC7B(Vb z!t-x^*Kspd^^JaH022vkJ!?ExW%l>iVdY|!`bB033B<{s5U3EqwyeSQD|B0hQ47t? z4`Y(*Z(u%de04ZctS_Hv;Q6fTv)F2(>UK%>fEL1&KSg3wWYAmDp)PBoV6_F_HAVF< zWdRj23@=0vBmDh(G3Dxt0>f)Doi(dNf3v8iCG50bI|nv?D8xfU^5;WErHc5N7lFrF zdHItnX=ZRqyJ$?J^gjSdoXL~n$stw(6HceX}!YieS+ zA5R~{n_OO)916aU{(=X>5%`2^13DS_2G8L);yTu^ul=VV?Rh>yi=2|H=?Z|O^aj|& zN4xm-yqKtT@jJA9<0xz(NeRO%%T&_|=wfh&MM9JEejT{B0G}Pr*|L?N`mvVjtGn~wPBZ3g0MdvinTr7^Z4=Hj}D;eYPMOJ zm-p*q?GT67*rxMtQ=}kWbZU*;TQBBoOX-!;I%)f+GCS*W*m77DG(mLUg9Nn$EZjMc zBG2x2|0xjeH`i-R&R0@Es!f45O=}_r;SfTN^#5Ca{k}CB!_A3WQyN1ccJWnf=9auu z3%_H>8;-}j=%5Ac7G$r|D4Mg~U&NllGFCQX(bZMpRSPQ3UCeU=C=7L;IDZXRdgA-~ zPgO3jug}ej)~~sh)zZg$h~;Lv0Tci6g`4LrCFXtX7hufvte`Y)qawz$RFnh#oQzTU z(coI|$_U%loTG)x)9a89x~HFbvb?Tp&I#8LL`BD%7>VMo9^f5T4FW)C>@6l}M2F~~gM*H!HViT%02*Cg=#;#%wUxtUAe=J;evokX`E|zl zS?ciZbw+h`?QnN-EY|^P67riyer=8ABl6eLpDyRx2|r1n3WUD zGkAK+HraLXf|=lMEoSCU=AS|jl*yMLu-w<3SADKEkMtgLOij9JtxpFy;LSCe-l3)C z;)$u|d022uMKDB2MgZH?F+lPv(trAwEvzeoh(VYGIP0gEqe`e%Fi#EE^2|@1uKq6U zv)n_V@-bEXLO~Q`1>OTROYKm`OyX=zIaYP{2ZBTUBk-GI9d(PbI29Y_8-48(W|TgN1{Ftymn;-w_~~fW9)nG6oF( z_8WZ%m6D-xp7*o0xS`~Mn#BGe$myw{t7Nc_ME6=hEqMc$g>T}SNMN9QT4F?jiDkVU8Al1-+JPr~kRrhYQ>_Z-xy zO9q-aretwx$4;U9CN7Q&Nz7!RoM5Z)q}z-#s;5vO(s{23&bXT&eCEUzQzcN4{JPHy z?xU?h&8$uQJ@lQ7^ib#FKCMca=DixjYjm8$NcOBZk$FMtlX8t(MO6%{W`7U&`gjLU z>(!}}T>`cLA-|4^a+A0UzcNo-(t>=iRGS$r#RvEx`~AE99Pe-CsHY*CAR`#Y!w zKI6K!R>Ln{JI|W#_eDDTKWpBwfzdi+a{u|3%)fgXGJ>?u+3UEKxb%6U-pofy<=Sq>&A4N*6CygRI z?J+X3GL|d?gdga|&Ls1774u9ki3H-yKL&N+r`nNEasj8RpH0@-3}g&eY|=lKGRS;>0j>ToC^N-}({z{oXlbA^~! zh)p1x6G#~-9pZ3!sEh@QKt?56%n;rI(cGNL`s7-Gb+m>*Oo@67cenBO%e>L0qe46I z(eRJMfQDT51(Z9O%6f*lv9YtDxQvHR+GuYto_g7x3Y)Xyudeg9f`6J8;j7V*5>D4< zVHa9K4BMu+gN8Ve;e&@EQMS??j8KSOrUJ6a%df`B+;B#`R$d((5DE#YR9701&QIc`Tz!zSq4!b$ zO4~r84U(orQZW7^4w6hnp;$Uq+;ml+f%QT>=zaSN>vtDtpcZrNtaq^4K^;DW&@IjoXa|J$8_+I zBSY3QybNQ~j0Y3s?uP=7gY#x3S+JEz9#>(7R^$DgX?PdV+=xSZg~N{y^WR|VMt(VO z5c(R+Q1Pi*08W$fxP+(&Xyz{?%{SUhIuOV|9swzEpM>m~!1;F-!Wvzsf@+=LrWCP# zt6!FTro5izY?Z4YkF^DMhtQe_QgQY{VEy`4%)bi-nd`i~Oq+*?PYb#IB+68gr)v!I zz~976BzB9~;tB#)kVW?7mjZ^ zS%wOf^7(BQt_0xvh*3ds%p+-fneLcM8RDJx!oz)I6;X|A=I~I(vEa9;f0pLy!p?EA3=ZMmB;|AAK++zthBLcvO>qY}@=aZnxha)*F?!T7OnX+D_Y`_s57`e1Le#(B z(ra1|#QQ5i{L$4#JDJtc6cwerP!S}VgX{SU>~leXwH&V1B5YAJqN2DB$Lh~SPDb6x zD$eSzK|wDKEOJL>I#cDO%j@5=r{|M#_3IRkEj)zxFqOdLA7B9cG$@J)$>D^bVNl;ddYSRa#!J|m_MoFBd;z)tiKb16VLCsE$^aXgqSjwZU1@M|$Cv+!=}=q2foN0= z&)Yl23G=RnpU8biFWFrilG@00gPKS$Z9Q>a^x{*>#Qdy}C(J~*>41_0{MOJcM$3UZ zr~NIm&>!S7GqT1)cu<^PRHA2fwnjE-T^uRu%npXpfV2*j(V3Kul>sc1qXiCXL>J+n>xYP-&DG%H2&mhxOb0$Sy=c``3}*K zP9U)Xi^mQHv2mlU&a*%Dz_joCOmgz^omZX+O zURU?ps#nWf6)nQ4>@Yp|P3WAzId&Z1zH@HofSWpU31oW?s;_cJ-XusD>kc_8sa z<87Oq>TwP!6mKV%wiO1iEQcPDcM9x8d%4oKx5<$*8J@o<*oL~>Gsnz!+n=VjBZ=_9cl=FT1;6HJ8_HjsN^Wk`fB&n+Iot`@J{~8MNni+CiHQ%Yj2k?<2m67m(UCrg(4uPn7%)5?{a9If z^YHJU30_Z;H-<qRnCL$$dAX?MN$7E%+50yq=0^={DE8dxo+y|IuQ|xpPjf^xCJ< zF(D96FINdtYjF60zX?$k{vM_|f0YwebY8P?u8K;oDoMOPtm}qD^ZejB;a_GOjX*R$ zqQ}|v{>)0#X=$vCMMueyH?YgI5E(OyXjUaFcP8;28n{}78Z<`0Ps7IoN;$MhagEYR z8Q(PQO;v1U>`x`?ujMO~&M}FCof7;{4^7J$$c(QhX{#~26 z=brGR%%{#x;L)cg4*jMBr|R{Hj(0tK35YGg1}z1`BVD8J$DiFxixow868i?9XJJys zeZen+_r+1WQi{;w6s9g21uLT!WgH{DwE@f^#VB*?7+KO#JDv{GtDj`HZ3P~;Ywm;D z^WO~@E6eGpDT{9i9t?WR=9essd>ilrohTeIR>mDT2*l8`onqI=SVv|Qpmjzt+x}et zyzs$!ymNqXTa(^?_jBSTCa_y7c!j+;64bBqmw}nuzBw&1j(VYa0OHk|=L_MuSDsqE z6*y9gW&b`*U}ym^tn{qLBs^=stCB38W%;WaNt6FhY>F^GBagnfC?Cv6Rv2x6CM4M| z$6;XZm{<(vv!uiA=i2FX6q4niD#l;_GO#@(nrc-9oNdp^|A5Z76S0rDXn!}S1+OSZ zIKwP7fJy{6P4+r;kUKt_6-<3?UW0$;azKQ_|K(;B=s_?%{n2*y{XxNk{myV?f!crQ zB(WG;_3bI`>9bcRGet_|C+pfHE~^DfIze<|vR$)H0h0~F5P5uQvUe5sj~2TNE+Mg z=405qwdJ<~8x|L_%)pKYv(W}T<+Req?pZoIEDv6X?|`(sC(92J=n)~>EDb8W)Aaxc z9J&WT+mxC+qCW2uis4L*GMeu*tjyCFnn;9?(o|0_^AH3=5Q`e$n4P0D=6?TzuB*?g zy4kT$CbisZo1>waEznC!>0fu6Fc~G75Veb>Yd#1`6qX*l<4{<&Txb~QsW{4sl1VmE z;G!J2EkxhuBNZ#;kt+?J9fnp-7bKt!Qr%KTiQG{ZGz zN%)(vUoSgLd}ZI(8HP@$XsNMXC?vkkZn-VNzG?^oJ8Z(jyLcV7s=H9ZDnU$qv;?qs_q%?S~r z8rO0wnAhj*EEpfhuF5hkTSdo7EDJtQ07c1~K9zKbthx*+>k2=h83-kNdyfc_`y0i~ zpn@kICi%Y$5na%`)Mxh0t^5|2Gju)$H|WWRsi={Q<~2&I(|a@IBl=2W)GYeJ!9V!Q zS(0$A-HYd$Y8CXMk)zb}R2x7Y2R``AoR?ep%5hL+Q|_Au)e0f(SAE|e@EKdsExAHP@(5dv(qPl5nKEh8CnY1`Y zzPG{}(3VR1E1mA+#yZ=z5Jp60F81|_M7h{EV75LB^*j`o7UtdXs!!%$X>)m5*@KXH zr`;GZPy^EFuq+G{>^Tk3kmtu&Uzv0ND1o5aTcwVgjx9bq93&sDtyJOl>Nmc<#A*@< zef*zQLiALcFu-{-u6a002Nvd*+x! zwA;b;=$R=U4F34Ejb<$&s|cVMW_;QbaFA?ojA2Edio|gat1cEGQZ6P9aPzia_*v8& zji>bp?S{fCvH;3)F{G4%5qRJz90%tpJZbvX`95u}0j|>NF7uzbsYVt}pHf~x`|-^N zDU<2A1K+);=F)1nQITR|{rMR)N_}xeS--py-8F0o&1=0R&(fjSj|3I2-`^pbLq8b@ zNg7)iBg`29%9v>pecA1J$%El@jpsZX3K@JR$R`rYmVR643)>!Uzu6*|@ z@H`jPG|e6G++E|a7@xpML=K4~6i8TvURuvl#5XTlTMC#~VDx)Gkc{0o6@=IRo$J;b zl4NJPS#z(?pn{?T-M)-SG*7PhK-Lbmcp(aQ&MFxZadyox!Y`kAWJa0#7jtyCyhNQ@ z8XGy)ktLNwMKnkB>L+8ql-SI$%l}}r<#fc3;Un69Ho0)JE*=+oU3ZD zv8=vJ)u>}ulnGhN-uW8QC76QMt(9Jo{{&4%NzWf z#m<60FN<5`P&Qy@%{hs?UCc0(%@Tzw`VFA4%T_v~^fr%}h$}p$v-$KmW4h5qJXYIa zF-pP!+@&o+#TOBilXdhlDg%VDn{Ei(%jtpC!wuiNT-AOmldXLEZM>*$(L=;(RA*t{o5#H;Y3<*|4!1t7*yx+zTZ^u&;YDvVqXW^!&iVjuh6Op5@hXD-1o@DjHhx91SxB~fe9?`V6kkq9 z3_~m{`~Br~XH&%^dMn(N#Uj;NBcYhSc_jTu@sEK#&L9Bqzxi^g6zV)wq>Ezto+`3n zllHinf=4zI76yv`WX&?{b>yM`PS!Z6KF^>oD@ysfoh#X*G`IcwF=}p(aaPvwB&Big z*P#2~Jf|}IWpK<}w$MT3NMmS!W;J73weE9z`WiU7tMaemM=j+w%%{pT?eF{SYea}F zgTclGts%mSTHW{%d^En{M`w+k^^~UaM1faL*2IXU!*4R0U>1E8o${}5sFu_n8*8Dx zQ+jza-bwSiBztx4Og7(7hcPP_j5tm)7zFnUYHobDpK9l4xQjoMCVuUzBKg+buR!T{ z0V+oAGOjYvQ-4=3yOk$rk+$<&7FRw#cZ^u+%>&0k5rgN($A=oJZm08^hj(_Qb8oND ziKS+_Y3cuB?5(2Odc(I(C|00A(c)5|xLc4=q*y2x+)I(-?k>e41PD;HSa5eM?i464 z!JXi4rN7}nYYx7dS>KvD-)DR6ckTCi?)$o^oF6s6?5*xC2#Y%I7Yht26K3D)oasH8 zi7g}=G<}sT*2-_(%a!YMXd^;p17lHi0~o2dnUKq^pb3Nb)-e<3JF7Y>hhp07E3QF* z;CNLskKh?&*%Ao+ElwA{)Q+#8g+=FL_{c@us-}JZOmotxgU*fm$Y-%xCoc8`4I70& zhuEXa(K4&4x2q)%`(RuJP-XfatBe`c zvbm4kp%2f!%M&2N(W+>f(ld+(f#L2@NENX4K`gANI5kFzb#<+FY|PYH8)46C1%2WC_g3^ zQ{pc&I%aJJC$QuLtJtsH;y!B(d}>DryUWhv(vSYBk#phdn*TSR|NkdCQtpgTwn8b+ zN}))}11c~dF+%?E6i?{O^j47(-HY;liG*}$tz82JKIx=78a?qnfcEb`0}ugunNTxqKqx^- z@vliP%17#h7_rqk2gQ=nqEA(_N!Q$TT3)i1!ftWzG-2N)m*!EmapS{6*E}io1|!?} zQ4fC>b?z=$HZxUn4LPWm28FZIeEO$1?@^HdcM=!gRLqXY1qn%_R#TGLrruspnEV7b zV6Fz0&ln}yRn|Q@q={)^sqL;OuYb~jyJN7ix^TQ^W-8pVu#S26&x32fI?r5MJ?VtYWyJ#x67sye9|}0U+aauU0WYX5HjCR$DT?DKy+HEWYCeoptC@st!86P2sc8Hc zlN=30g=Ba6d9B9a7sM|8E1|6_@*Oj`!B}BpLk%@v2oa~M z*Gwr(ceZo)o+T4 zA^PNcMu0^SWo%qg0>0%pc8qji6&zhj9~2KEd1nNRIs)m=hnHH*h+P&YNb5Q(4mN!) z3&U@xJ<3ThS?=I(xAyuLo|$WUWucnGY%-rRBhx8O_Iqc{1)X`&7esBJn8n84L;Lr3 z)*ns2v(yZ;KdS^rg;r$I>&*D^)?M48(*+GnT}4$q3=#627R$S?uZ0u&mv0cFOeE*pWyp zi$yMlXqMk>MRl&7(0ris4hBgfHMKbl?PE9JJ4u!nT*CY{@sHHneDX#{z1-VHSy=6B zE%OoQj&DF2rvg4Y(uQRoyI7+ybtk5uT>4I}Co}QVlx-odTS+mI)*o$ z*WOS(%|$ypSx&VRv(JZv3wv2IKJ`)Bm0eD6^@?fE^GXfMKmgskXygKm9&Sj#B*@)> zhHw~qEWvwQ^A#4^zR9SkaVdMAw`T|eBckEY5m~y19J=brJBo?dSSv0UrChiBIWeUO zg&cD(?e4jdj!yamuF2pVb`q9UYFmj1ZiaR=8de<=WK@oQY=V4i{(f}OeHgP*9d9uVQ}Vh~g$Yvo z*xt)~s|wshd~VO;GmPkGz1HmCnGOh7m~F@rd*vuVFCMvG-M|uXwIYs4I3RL84r~KJ z=H%&g_0Y*}RC+8T($Qd4DIzJxhHZtKPnZ?71xU#&t;qI^I8Xjq~%Btis(+3yACH}fWu^GW-Ni3s>yTBD# z6Gg1HtTGKLZ~KUFXRyhgQM;*&eVg23+3ng%#-W)Db=)@of-$r>3C?URr^@vGr;Ibo zokX_WP*h#2%0Yh3jJ8$D(qS#T3yrqQ_}PQPa6%`p{_jF?;mPt@rb*SR+`Srw$%Cil=~fT5|%Vygng7SP_zQ%<@wOY9-FS&@~v0Oi~TEA ztYs6gA9`5M$7QCAkvULRRpl9QOYBXWZtr;qH@OsHq>-%@)AO}X&eYkPvVrMXvS#hi zJ)Fdte!0v_2WnvG9#;8u%G;_3>K*DLHJs{H*(Ft{;j;Oe4fomO+cJhW0EFU#xv17?J*8YAAI!db#9OmfxS_2(*<=kk78Svq?va?w{x(u$J&c}oD2n>Q26 ztLoE(W#||nJ6w!86n&7dPl~SM;fLrz?2KbfN`|QVe=f>y_H67@Xy%Sh{Zc7;5BoMp zhLk9pPEx1Be%%Y(&;UL&xnd9Ew7H>iF0`ztx2^TMV9rneV*2d(Lfy@!x<|rINbY1- z8%jRse~#F$yfbo@ZK2qJW) zSrSKEbG1{=VRHGGVcQVvsS={x@V(8$w~{g+8qVy-(#5Gr{f%Lll?CwcZO&gi8|dpH z_n-V~Lp%9KV2C@5UJR+O6^N+@yxE0n&vAB(+uw(uaD+9P5{T>${Ug4sGHR8c3SB;YFQbLGZUFa(z7X)kD=pdxx1IJlwzQfV=-zpY>BqZ@B~V9so{~dAFTpezARws{Zr?B zeX&2WFJ5wcl{wPTr>$LFFm0TklZ4btX@iv)07Zvz^eH4ZE`|s*rS@?=L-JlQpqz0F zzfNaGc#Qsm+5(%%o#3Co;6Kc9)i{wZF;yKSzBUa-0FT3+?)81M4WJ3dRt3N&F=&O4 zErYQ{66q0mLLLiniamFSVPi>ev!{!L5T)SeJf!N!{VPdkWC3~+fPCIx)(mRJuOz== znMvZiDh1nfmyJ^m_GpPSIDhQ$yK`zb%{UUARn}@bPufaKou0<|lbEnIDy;#0ps5kk z3iaW8Bi+6?P7$)1kMw8|yvIkS56>Ompxif{InkSrf=Ko{>FJO-We2E_bQlCzj&N zUTi<>KP)&JlS23}KV{gA12BPg!5Av;>KE@esD_83dTjy4|K$2F_WI4NkoPT3tGKK( z;)euYr^2|6q3ucDYGT^^1ZHI}_s9$bkj@e#fN_1BJ`w6OcL`~u+;i#;EI6BT{%wj; z(evTh7GZZF-2znjvv`GDbrfv_Z|my)osY_1;)XHiLavztuNe~D%>PBeH^J<&* zM_kxU3@solff=hbjZK__D*{VNwsUX>By51Ebe)eSm!CLTqJbzMQvk`rB9?5!WE9K3 zQhTe$xl>~2OMB+nxXXV0f;DLCAF=xEK4|G!l2e6dEd`E2VPFi)!4jQw^es}*fN}@X zbGI?$zvEItUFWh8uHg~Js-8ghR`T>WY_cy1;(U);kte%6ocbbqW1bCLY)0=R}-M1(((s=pFHZ*Ue-rxvE7Vx5CiJ9YAk}ohZun z3&)E(SSvYLk&!qb(`sy(@W`@}M#GZo5CU;i%k}ujU_n6B4wq_kEcAzk(_aIId*?)fht3Jym%(&!y zFvG+KCi_tqDlyQ~SP5brqfSntmG@{@P-ok;SH;{;iX1qgG1Ynev4-L@u{Xb2*6J_2 z(vJMM!md5`MW@u=2Ul7k3!5RF!3L~#pajmO`ShlOiB?K<$3aO)-*K~6>{7$oOeNFX zbG!w8kx1$NEgC)EBe5e$e3Q!V4Ai)`ifEZGnA)CIk6g8uB$W^*0wXL?WEsi9AwZJ~ z_nn;Vh#IVS2>ybd?9(qX&r`SB53Nt6o69lBpeI_+UmncyrCj8|Zb3Q@h4>+{`kyak82; z!#TxPO~I~d{%p6hYpd%~DJKWg*hwB?5nJdtS~5RQpFqlf+fL0WShgBA=zToDtZ zm+e%S0~ikt`T4dayD<5S>xg~!RcFO0JWL&NGSCeDIuTR!Gfdq)Pmeyh;iV;7LU?H4 zgZ>I%z6n=0Jm!!2D#e;jtzOk^t-sJ>YB+ad;1sDrv`&m^wCISd4x$8yAplbpq~6ey z@+wKJXP7B0xj@L6)8UnZg?r;a1{IA>y{t30+yuTvEU$Qo*$|{n-?Qni@58#$yR6uV zl~vJeKa8fnczIm>5#?45J=s%V^<@QBlH59=5+h^DG2do4u&UkRF5^!QBUSdB+C;AF z=~b?UgYq-V8(X;#JB>Sfe&3(xh!P0rL`554M!s2KX&jG&Kl%Q-s;^w;&T<65mBoCE z=)LF=r46DjbBx6+E%@G9N5mMYAIjy(lG;ienG_68G5+Zw)sA%iI_9V}MrWwOT%8Xzt>N>a2~7LcD>;iJ-+SND|+@A3?}7t)y}Fys~u7-;_b}py$o; zr_g?9A_A$4ZqPnR5P3js%Y5CQ7J_}DO*XuvkGDbj{re5B=&=tjrd>25WFt;0<*HTV z1=HVjbB7%`RV|GP#CotwQvhou4SpLrINn3_2VYaDU|ZhQJT8v(&(A5M^#Je8w*h$e z7O!UfLU9%UoHI()w}||9?e!zBx$C?+b8V`cibWkhNq%oM8Vuf+j!q0uQqtEgWqYl} z&T@nv)M-B{sI<1uJe7oKfbtB zZsY32RZ36o6k{Gbg4ntSVCv%85-pglhY~1xex=BqnX?qSu7U4kX3eI^&N@tr<9e*L z8W&IX_cht2a80wJ5qG`G;;rXLyJG0AY5x$Q#k-;H^w+&fzbQv)_`=4di-Q3T&TjqP zG?WSC^gEMAdar;N?hbQj^?2ysl}cLn!^cuf88`o^g9L0&3EJH!0)w|RAo zl1sQp6Qh{6KETAu7u~~|l|zv}mTykPc8}}bzR%Gdf>V9=+%ez_d)6qZH?^>3IRyO; z^yB9^mx-nDVY7U^pHA)QU`wc^30e~JbC_cd!)@GB*z zM=9jChJ5yFW$;G8rh$Hx!f|2i(rT;s+d$Ci`BXy^{p$7T{H*~&Zy}&NU`4(@^Yv*f<&za-Ht|>eCEU70)|{e^3-Wyji+GMZ=?^w!b;QJs^z`auadZ#lG~Je z+sWL6a@OXEI4b<3uY+YI~rBe`mRbqcN9Oc}62o&Os1Na*DOEo1P@al z15-JiK@^qY8~xGBY-oBB*lmN1T|#3K7WzXFbzn$c%)kC}#GNyKy3KQtT2TZWs=kU>_^!FHdvN|rE;8zf+H93sC%!D5_hEB$03%2- z^v(_6=C{Yw7Tjz6h-{>hrh3eQ4Yoz}<6>4`=P?+Sg|@F%^!Ou}Us=hm_2)vH3q9vi zw5WOhA5^d0fPkkIQRx-KWzIDASwwH8N-~4V*EzM+mV$DKlyxCN??>o@XnB7*6SQMk zA%r0?viH{Qb#XDFFec$#Zt|AO$P*>U<=BOQizDeT4hIoo84glR|5h!r`gjJOf&w@< ze;ripGOmR4F&YQS&J3vAAa9sc<<+9f!P?OkLHvRh_A!#q;;lLy@10M|@D%wNs&Kxl zzVqta7JqhLt}$xEz$oKL_{FcNU>F|$5C~&Q(APAFf7%3S^tMpe|H`~InrDmCrJhsr zb+VkXULk#M&DSMrxfYAdu(ictob?P7_y*Fn9lOuPlnj=T zkejR3KR#D?JRc)zdg4EISq+wo85_IuL(^XFZR?=62jHcG>7GlaJ;QGO+q13vQoPFW zI*r-WIjN%(dwqKQ{^eqCx*Y=>?8jQJ$+vR^18)+dAi89@Z}JBpGR7rLFlNN`d6UpU{BYCtMnCMq!F5g8qE`+WL&W*pTV%_d?Y3 zQ~;9(2vp=WwQA{G6BhZx;Bua#Q2WS)?M_kW(}PT z(w!G)eaEHcT$vO`=l!bD3ps93=oWMzSvouRUl$}NxS zIkQwtj~H~~NPN<$5J~&8Qb%P4RMl{0D%Sn}5R2kt3yc7HGhM>XSH5zf^nbUQ{_P=x zH5A(5ur?v)%qPa@JRiIviud|*zE9f2<$m1t&suhk{5oa%6f?!te$5kosRLW1Z_6+` z*=)mO9jZEjnUSnC&;EGDGd68%t~16=&^KJoUb|R%xlBBD7pG*4hCf-u@$&+}RW~(t zHhCHgqy>YB_K5C>R70gkJx}?3E2~mFRp%YtFQ3>4y8h}Klfk*%6>l*{xXUiJ5SUEP ze_fq<;bJc-#jLO-SAk)4a}%qqLGcQvd;fV5h)hfDETz(kNHtIvtmBAK#@~?Z6L;ll z_B~3G6FW-|c}fwhDkce9mWabgVRFm1QCBB7vHkG(^v?M6cFUFBdrOQD>NO~$nHG}w zS#v*2wRKefmr>OJW{UK`KJsqYv7uLavXa$?7GA1=!sNwr5-(^f#k9z?YdA<6W;L^* z+$=GAqE^@#HKI1nM0k35c5?r!D<{9K)|>6A@{Bgaw_Kj0&ZBWdQf;-ls`IBId)?|f ze1XSlF-`m}V@!S50goKGCXFP3i>D+j8Tu+hbesAjB9csq-w}i`Rhx4(_hbDn`Ln6W z$Hi$6b1i?R^;;Ts{dI@JyHCo_c_0w_K$5%^POr1~bKrj{3&xqZE^QX&o$X=!K}mb$ z11EGbEjQyN)6c>)2^@JvvyJ8e#gVCZ7fN6f^#)jpvoty5C)4p4ebqyAm4U1X=r9?& z9EC5$H51d`snS5|(n~@Kl67yXaSJO<7F}sv1e||DFh=6fjV~+d> zMB|M^>#vlEFsq*$AUk%tHiQwbQKH?0X+&A-O2F@*t?#Hq(}>t$m)mdk?akN~OeE%9 zUE$7d$Glh$?mw3rWy?PFQ>wWuKyM}ueV?_2r_3(Y!BYVIr=PCg=VRHSHMizo`6tE> zqY~d+el%Jzq`zsY-G!ewz<9{F>Dka<3Cs)J%eS23isxn4d+mA+oiR^)PDF^csabzH ztN%#Y@BcSJD3`_L+OR2)?$(a8;V>dCOWEIL2=I3@z%Y$PfBEk^D83or;YYKD2z#E; zaPsVQtmAuL9g~BJ*BnZRSerhR4mP@<-$RBH`eHJ=4{0>jjS$AIv4?^04umvmx-Js* z^YdaSs{Jl3*x5b&2P_fZbUaO*@6{8i$(dE3y7rdpJALQDqlr?{!4!=}Yp0Ge9 zR6Za5vONWM&uRP`6pni&eL>xNC>g3mC9dOhOsE^E%HTxZuriTinCGAmFl|{sNv%#T ztnZZRRpOSi1G74SkCuMdT_$M~BwxGSCNDJFUvb)2A0K@U9@VqF{Uejjpg`agAUoe^ zfj0OSwu1)!T4;A+5X$KBW9?&*r%r~=`z3z~G4H- zpy4~$H_(?;uin__V=ETQzncaR6aoO7F6}m!fb%Ca$3qt{NLiYp&hpT0sBq22Y76c6 zOdoFTYU|U0N{1CKyS;Y%sonJV%KU|&$5eP>|K8WZzQ3yBS2|g7o2)zeqZ}XFJN%>| zlo)E{je35m7d~K=Y3Ds0bt2DfrL6EFKv*M%QbUIXWIV(oI;oCD|Iarp!uqg?ha26c zwyj+Uto2p!D+5)AbPKwna;z^0+5B2&ljWFNvMVX2F-PfQt!tVX-QcT)kFgk1=FLah zzMfpznLhh%f@29n5MXKrNfAKmgvMbzkouQH5Jp3Z?!?Bz?MX&sqy4OD2>ZtzBq;Mp zkFFo);o;}Zmwb}_xsSu@OJWu|g z{qte2`tC$V4u$8{N)uFIw~)Bx!8|)>=+Vf#;wdBNfO5Ww9L)1G(@b}Q>96L;g7{RT4!$70x{h<7^L)~~uX5joP zXpUL$GBp{Y5s|d3PZ8r7uX_uubTw`UvPbKDDkHH?&Kpq68BKQ@0Y!q7bWrqnP*8Ug z5uMF8rHFTT5#3knixKpXdDfIh@;4~8c@|c_S5__WLw>sKipI8%&}Ws)q!M6;FFrU6LM-VuntyUG3rvP*Jfd4(X;C69PS&$=$E?A6*VeKfdd6KC`+FbKV@g zuiKLRJKw!LN$8--7S|i4`(8O3L@xU&9B#6RcD)UbuwLd?RCg>33EkaZ*eUcdv@LI4 z$flG$)VtA|wiK%dIthbQ=;^EBAnM{$X~ve1=(K;X6qt?8aWiBwuAZim%>uSZE>Tu? zM#D>i=PhEijJ)_VD;+w4h=6;z-i>d(7-Yu1g|Li>6t%Fk`E3Ml8JKv!4pj4cCrK?p zNmFrkb)59+ZOGGe>BNTV;Hag+1@*7ts_yz6SjtcZ$W~&A>Mz%j2CZ$^9ezQ)U;4Q7 z@qJcjISmyZ)pN1b@3UE(GvohI$l3?&9Q|OKs!W(h>7NbgT>a=7^HA9p?I1g0v(g*B z0h5F+jf&>t!f|u4mb}}7Mex1xnE~A=JF}NwOn#Vy)=_M+eAOr+`XDSttS<(g-n}GP zCT%+BVLvYC4IXpx4}}l9x)the5s5b>d%O9!lK-K2+Rm(qS?wJY*<^lYA2)it?lWlP z_5-!kNM9Frzz*aXg-MT)-(5pFdnR(DYePDm%=+fsz{3}#X|un!cu}}J1NbRSBY(zB z-gz`K+B-&awZ8l03tRe(?SU?5{jvw0V^gx`%&NF1DanCi>7fB{h)t<}xV_p>YTVEq z;P5LJxWG zih$XrKy6mjet7psZSKX&{3fJUpZfwg#dI#$fc#ep?Nk$oYy9H3TeV1XRyH<9QPDx6 zF9k&wCnr@3A$7UiFhRg^X_VP^j zrAtVFhDEqoyoIBiXxok-Z&1_ASRuy;_`-do6vH4G3JV%w!X;Gx^*p)3L4*O<=m=xk z3xD>v=-WUFuCPt~=X}I%2lfpMxh-6a*1gry6>hQ1Hlc)#J&3jElH}2XH!v%UXglJ* zixC^B?f8?+r%=%Exo@ScVdErg9iUw14D+$p4bsr@8TFoAH)u3F`DR16M|O2kSX2Dz z;WH`SY75nMP3K)o$NY=!gDQM;!P!FdbSyAWg~3eG<(LgW&%AmX$se9L3;^~_;CG^Y zP4*{_y--HyZCwiK}qtBAH9y(v&iuHvBl?v648v|jOpG5yI7g9)mS zlgqgkETu}Etc=ZHs$TT#l-C{HZ|Q@j(P{f>AKzDV1Md;-u9`L3C5l-uU=Im~`gs`L z9ZcpWLGPYztsJe{``qj3%Z60RsxFUhvXgSsw0p2a7V0=WIG8$1cCKeGgrt!>ySJ?~ z;TJw%tXSAdkn(B84(fz^QfWp4gguuZX)!$PguF>`K9BBd{D<;^8dK}(XwVld`O@?E zMsZa_u@hKhv~g>|1+)H?2n7s`46_Foba)glJ3ETdkAMAPQF&)-^o>fPO{Pv>OqyAA z0+rsb-))G)E5lVE$@&eRT$j?sv4ZF#v2C|25}#&#KlMcZMJ&FNIr^tq5nj|mLP?(Yf(F}E&#(aa} zN%>Gfj74Tw?rG9- z7yM>b18dJsQULBHh#!!W65yr?G$rcD`p(jv*fYrsi!D+*-a0Omd9#PW^9A%LWcuMRUJYgY4PkQe{!iIt&9!u=_IFZ9=f z%jLCfGm=FBQHO7xl8;$hDHBs9`nuPm3rck-w*E1@+Hm(#!daL?~H@cDbQN z=Y)pl$0GrN?x%LpJ1bskCcjjO+mr8Z7j&2Tx9espEGLH-{R2q(A#1DbEkfh4|34tf z{}cGoDxy*gYCov{Q;t_LN_3KAf>~-`y3seKzUgl#mxCl*n)RK{{_i`yUXVwR(eI9j;H8 zI?w4%?uIf;;kHGeGGNwKY^Ui=?k$%ovv3#_ijM?Z7K)^h=o^*rkob*KArGF4ALAe3 z%C^^c`f)8D^2Slj!bL+FNlWVLjB$5&3(W@e9JpxBRXsn(UH!?tt(y-|y8;~rOYwCW z#u8~^D?WCXoD4Wz4?8RvszhXBN?7(Ci zTc7}C%YkQBxPZ%0I_9UMMO{U(@f+5J0SLcZ;nSD>b+mczec{BXE}v>D7HaU;lxGLG zLKNm&#skM)pH8m>GrZ}~J7KDI*Jcp}q%pgc({xt~e3no9NsuGLd!Fh(Q zcd#2;c7I|}O})9ecGMOrH{a+UFBN7(B6QzDP5dt@-WK;9;t4H)Yb@4jsaWI7ye2z_ z0m+w$uW&Yqkwd>QlxPuYfngr1mD8VfEFBS{Ei_v>zJQKer8`W3Q7$YZurayIsxaj@`}&Pe^`yfe3u4`gLAZOJ z>G$v3DiFkW29^9{bPcw4ZpgKvYP^<)ypK>dvwsWgM&dZ(wLQy0#MN$lx>CzAtsg3R zODjI6+YS0*%eIm6K^hjFXfltA1dJ;a9>p^*|UN`hK@HkroKmB9Ju_} zkCs6^S~6n+Y0VfK0ZHBi;CrSG#cQ_RX4y+?1U{RaQq zb4wwm?yDR(rX>vT-5a6DwkN8~d4OK6V^N-3(G1_z4l?MKk_#IRsGBw!sm4NowEyKG z@^sZ~_}t`IlUT8Vci;MNBjRoNoPv$x+WAnVnAln54p3_8u$SsH5ceXbGZyFl_C$m9utJ=K|N%K7gUA0gN^veN|+!r5i$>#1J{t6q! z|Ei+zZET%Aq~HGKFkec_M43$t-xrTP?KG_Jtv(ASgCjpONYsQiVV~(`YgF5W{J_=!yS~0UEftA;Iv>qQ`6?f(xR|~b; zh<5wZ=C-Zy-a)+0w5Dd7x_!XsbdDr60)F`0I3{YiKBz|x<&C*0x}7=c*N}YjNZ;k3 zzqC?E%)U`4&UvVwnqJ1$&nDmra?Ce13B_LY$kjLPSvr2wipI6dq*x$>g#wkiE{U_= zB!@wPH-?4f{Y;s@R4ov)mZxiD0@B_Za@OA-hP4elcy}s~v@8%WBxjdlqFPsnL3vn=t) zj39BdEpZTDdS8b4^kicfJ(v= z7;P2FTYY9#LHP3>90u{GDl<;MD}RY`PBQWS6)J@l)@}JliM}2Ndoyvcsi8cS!66wx zG?Wx}vkOp$q?A0WkD0ecQvicOT5xJSTLorI`}q?Q1Ig>HK>bos6t6#R zT-Q>6wa0`n3YV+ec}Q-P1r$&XpN|aXU|(wvOnlckv9mB84!AQ4;)#2klfapi759(x z`Jeq1-&Bpz>6*lUDEWJHnhFv{ia*F_x{0K2TJ_ZizdDsmcHxi5k!PznXSiBQN-<*^ z>AuF1qUhE=y#z}G6;<&G$`R48Houz7W`DJ>Oa4cXoLJJO!8fm#O$UR_@hcva$bygj zZ-Er(0XM~*zdBT{$=JW9W-gZHC+?749rei4ul1x#ao?Z-_O+u~yNI2 z9LkmgQbl%c<5qR<+Ze=&h*I}WXPOR13=DM(F{h^UeU&&4DNuF=cxCb55nH@J_4xH4 zidsyGu8xia@H13sK0ZzI3zbju0f6Iu!8VU;B?m@{pSB~QC`{>dX2?ChI1!8bHTNBt8m)K?&R0|YtlA0ES^jYUvd2=!9N!SU&+IEJeDx^2?Ts*LTBxRih;}}$p8Qz_ zg(ctN>^zt94d?She^d;DGeM8j;Xbcr6hYBoCG=3$@}QXC9~`7b7#U|>N8APKt{n>k zY3G-!#QXRaz4-hPoC$nM9TME@$THbP)pXP6jAI)hbHr3?rakI(mIns48&X3 zpk`!MlQ3~_?_X9L?=pzYY)&Qg!%|+s?+d1@u4_#v5*=V(TT`4KvsPQ>!XCWMsCgUS zm`8y$z|AV5FJ!$#;lM)Z+u5v21hor0PuXrPhOyeBW;w~bGMe%YL(;1zBMvitZ?xOz z&k>ofc$*YT2@GfXHXuh?1sosr1Q}S~9PH9LD>>LBgXV>L01_Vq*VjjQ)uk+$&GaRn zPdWef0pC_3jjPIN3e=3J)Lmw|oEd|!E~dX1=YEhgr6UY;!xkaUqVEIr^_f@d?PlS1kP5Btjf0)(6|UZg^}LInQjXMx6-35U z>w)g4;v=DDC7%O3E9uWt2%P7A*dj96`5!W*7a@1&Zj?EPlnG|`h8gzZi6U5d+Zit z*VP3j*(Zv{{Z|_{T~-&Kg%NqPOs{j?^ggF;GyeuebPwAH!@ra#fl;uM%elBd&$$;V zWl>@;6u*5Z+Fyf|;2O0$6H6#)0iu0E*SDqRu>1i<0-IQ|bAsv4=yC?bX4mCB4>~-c>FlPcu zby<&(w%>=iBkdpDk>JOq(WzeF$RMt@3gQtw$UckVOIOs0Ic~*Sqj51sFK&8PuyL7c zC*a*ocJ&3ZqVNoRG8eq&J4%X$%V6^?(ZjEHzl>fl`Sa@K8?0P`_w_=9Mlp|2kQTB& zoM|U)i356t^KszKs}4@t+r7m$hG9pyP>gIC9m_I+>OAVMpXzQB&Ki8BHh@ zcgg9>wcF{Op3HMO6r^4w-J`*u^|~~sL;t85kbqKN+_cb~f{|k%0C9_<3YTGS+?s%& zzrsvefrCVR|M`z{TT1kk8W!2gsF@tk&Fr>*u5~;F+{0*6i^u9K0=5J;N_y0XA;Rf`KbotE$YG=7&=4wlvtaqLB#hLWV$ChE&4rCK1)f~QC}Yhc)3xyT z?}cuYD0s?3dAX?h<-pU#fm0C{{xZ|IPi}f`ThpiFE=4P8O5m4iw3%I89kzP+XxnR+ z;!V(y1o>Z?gylu963wTNac|glo&ITF&}kQSNO&8apW!Sfe7J>_msK6$SA8yCaTMeK zh(qCE2K;z-ljJr5n19VHrZ=!dHB>$2q;pcm238DN&Gf+~-cx+3Y-GYMPge81+Oj*$ zTnZE+%O)|*ZAYI;*o@g6xY?u&H%-Fa@i``T5-CZZvyS)7rjH# zR+cR(BF42hTR9s~(ooidc;-*A6#2-Y=$uS`k~<(!k07gRq?Lu^pE|RElN&e zNO61}*}mB&MXBe3lX~&8mR_nkhqmvbkK&gsHkWjAT3Fb>Mi3Zf7_3meUWokK>BIQN z-tC zf!V&qoH-rmk0>NrB?^I>U<*;++;@7vz#yTx|I$r*>9 z2^`2}F}d5htf?PcI<~OzUbQ>^4+mphZ0Ppv-oI2Qa6SKFkG2?w zd-Z!&DK{Sj3+ci;)a|e+7;_r&L=br za}|ZVPVIV{tV+%|NHqQtD~dpnpMhc;%rEUs&JCEO3ZQeaJRJvqFZq;HJIp!x^SM6# zA!zZL(zR@~9qRS9?e<%7(n*Fky<@@8pTVh(nv37fp;QQbkOv2MZ#dV1&(W48?`vTx z_;sEJnM@c-E&jYb*lB)X*~{y6`qba7`ndTvNG6Q%M^LvjmVt2HA~+c2OLZVPGApR5 zFK8n+3m0bfa{LOK7MK5mX=s`*xe?!*z;I$9&ftx;RNI`3H?B#cTw>yX$IOk8Q4x62R1fM6>2FW9?>NnEM_0XscI`fP|yr+ zhz_aRB}V|I3>gZ4ZT&KOKe5B{xG}WpE;i?Gw4gFB7w@H13YC+o9Q2GPT+`rUys469 zyD9kk zWWg(wFs~;#pFR~O0%R_Vox>3R&QDEj66H#@m>Fyl@9OA(zs(RtDuAKR18ZqKObQ>)N;)< zC7|6JJ0FoVyTz@j@Ko{$Ol+5saVb+7^V;l6QC~G~sT>Hhg9P&4Gzq82Lg?xKWDwEqqa1sEwRL+9#5V71+6!8`g5RvXzpDTiLZZ^t?`1CDNEm7KO&m;)x1Ojs zB{kR@D9N)mUkG4I)UjN%Ls1t;yY=QxL_~9le}B*58rp|$OAcSP?giPEuNIDq_&L3I|Z)^xf{$GO0%*)%UP+$n(IGfZp~CU z4!dnabJL;vEN=O`3#k|SR0QE+`LDh5PEx035vH)q=AQBb{wcHfUA~i0Nz~3xh$Z#d zik&vH7j>b5itH7;Dt+lGM5?h=(9cf`^9aEB{b#WMPPQFStt#_Lreh#y+KYAurYH8H ziq?3Gtw?wLv5!aH)g&J*i0D5A+^ia90X{bDX^TGPsCv`N79=f2t<6!O6aWjL${U)T z%jemBrz2dBtUiL7{XY4n6S-_ZfM-sX-16z(86zR=rzO9e zx%E`626tUVmo*0te(3Ty%pP{6DZ?{GMmx;Iwh$bzYR6!=`jcjE(>?25Ucieu4qA2eEFA3;OU&1L}Elps4Dm+u= zn&szXwu{P2G0mUB6{Q@H!3fDS0OmO4Dx1=83!x6Ma2)}nBq2z5EJ6A7w~v*$i}~uO zS^HhOh3#s59*vZy3p(&`oWcbmV8n#fTsJ(0oleMcd6rxcL-_S0v1X4;E4OWq8YR@N zRg8<6@igzXx-+w_B8`6svzm8~{D$SDi8L^*fGYthEi8_O(fpy|XKCi~W_2be+WEKv z{Il>0N%9~%`l8ElLbLG738$L#Ls2uw69p^xUMWB^C`V%{K`UZP@Qw^6z#CS%7|zGN z>fdl!4$CBAh!$v$&Onc*Gg&a9Cb3^tnbK-+DP~Ms>+o3GQSSHGg^1HmGq2ECAJG660oWYoMKf^G0mn5jOot{I=MKPYb zSF6VZ$D-&W7n8bUa%9d!cdqGq>tOG&4YRuz+OtGvXm3BXpj`mv`qh|KQVSCsF4B~+ zSao4N6Zs%&NwQNl?+3cJwJ8OovZ6ywVlOO`lPef@$l}>8g;$=c-En1_{Rsm_+$~S% zhdw(`Q9am|n&5hkpSM8Apqw4VVL%qn7UR;%06q%gQGa3@00tW~!c7R~pq#5Ite2Ub zie!FjTdw%yZ0){k_P^1#Gu%zDydPg9dD<28RKfCyk(;W7dOTWcziTCt#l#S3eBeEM zl8!NOYbCSG^j}Y<8Q)uCSwpk1E8T_sENgg=g0PHRDNij|?})O5+hD?JTuQV@n7(zB zUG8TXC^VbFZ;_Zw#NGkvrhzb_w(#qjGM5F8``@KNDow4J49)2Xd>QM~aE4Afj2*Ea z+Ccj+ZQNe5Az+$eIE~DBHqRxL*waBvv0^1fCizES4#6bHgk`itRUS7AQAkog4+yJu zmx^FTcosiUR?p(s7i*^<+B}D*eHTy_RqxzwMDMG3x4r!1ypSg){&r}ZN~d46Ny$uk z-9bHa@@{hmVJ-**4j2{ws*C-etTKY2Lds#g7r6OO-3 z06R{PQHgD;@A>qi%)~7#izUFOGRQLdevlW$R}8Q2t(pvq{M04OO+$IQsQDr4KGJ{4 zsAGSl%s?EnUA!9afaOqA)ThG2DTFw1c_#870;eK>F)4N=zV=)Bu1g6urmWf2HCj(U zMYcbEp6kA{jKa)gqGo0!N(;M5Nvci5!xN(VZcejCXD^~k($+sr^%zD4fGQp4e`B+n z{xoK_=zaIytQ49Q)uhIxKv*OQ%3or{NhnOiPt=hhn2-15wWC-NFiF^Lp)I$T#vYpZW&HH5u|8f{~p05$C~)fF!=hOLe0*AdWfrD9+(Jpl70)w+&q zi-C;Fj`!Vw$@_M}h~FDA_1{Ifi8WDWHKW!^5nBx>e|O$p59E}I&yoaf1CLI|O1WG#xmOyzgB$K@6FgDqznB&6!mWP^@&aD4{`al5qKWB7zfob^Vm^4H8|dE}`W7TWXXkQe>{SPfB$ z(nEFjv8Yh_^+N?m@F=0&u0PHVnP^Edu@n zS{jpc@h6~A@lVNTKLx6`gwFpEPR;*OoUVMe5Mh<-fDHA_-v?DBO|Ps#pzEea2K(jz zKYBlDgvFxA!`LrzC5=S~ODEyl)RJrFZ{O|)XAZIu>Sb`!@Cm-o98e?tP1~wvyY!ac zRVlGRhw~ACDG8BblSX=<03l{UNa7I^JVSS{qHqAFSF4Va8a)sTM4e19hihV$H={LX z1zD{hwh_3@&aBw$D$>|?H^Y8#51*c)fr*gf-m*Si&^y)r*Su%VJE9H9 zV88~G-q7UU{WK}_SFJZYui^YzgMPtVzYshdaLMW1PA!Ek#_Gs`btdR(+%YWH&5-XP zOG3-RmzEjkzfBUUcaY&b#QABB=CXi|zh&altmNnXC;n@GxL|FkB3G}X+9=Q~x5iwZ-)NH*-a?%ZR*^HcmMk}hH_m^7FmM~W-9{s))$0`}2mhIMVsH;os zpff2c0tB~M88&|5W_Mo>!mysm{Qq`9uTYX5el}eR>^9o7l|e;Vjgxm92ahka?OLYiLM+gF;-?6Pu{WYSCX5_9 zG-Xv(NNs7dN5{n3x$KcHR=tnYMO@Q}_X#t^lk+K<7=z`+CM8PL95pXHvIaKO>M8Wm z^mB#`jT(>^UP+~vjC5j`7$a;At0h}Zl&_f8=BzM5D*XO&9%Y=RY0L~{&vuXXnN6Ck zufOZSLcgpq#wJ0b%6Hs zcdgfd2tGCTgrE~YkHIxdjO%Zf-G0*bXj1514$oB7uGi`xa@L~GT6V>6j7bbWITYh% z|GSL;n_!eE<~gEr7c;f7@&5jay0$F-&v$w!E@dduDn-W}HTjXLt&-%G``9F7au}v^RScZ9hPsnom zJ4vRQBpvMpIDA5F0$jR0*xfzOLF`Tn(r1Tw44$ovXN<0KmdL94WL`=r*BE*#xxRmQ zW#_^qujw;##K{s)J0c}|xuKuSHA9lk*eutcj7_b{rL+B24V08nkn(0Bp45)ERa*Of zl-iOR!QBpOs5BnU@2Q1Hfv%H_KbpZx4E({V>C>~Ylq1n__qfY9DXT|dsz`@6uT6Pi zc_m;fKrzjkxRpAlqvBg5YXJPG&ye+XDHEo3h26=DrAHPPwyZ79JYOHDWA4bLVKB5dofzVC zeu)1MfjM^y==gPYK24_zbJ;BUgM&B8Y-}2J=Qqwgj-W>XI+%S*jV8&B@jnC%N4`Ad z=;r*aRgc}k(H8!uhxo0k`24mzcex{!qkwB?asEl37Q>}hP&2*LN>q6vcq@K?Hrts+ zIj*!o2wjYk%9HVZu>1tX?&G_!M?!4Pvt|&~?krp-}kBMW!k_+Gb>f^~HhPk8RQD zUH1pv+eXSn(-Wphi__N*JU+SYKb^mMzt=hy@dt7k&MSlYg)CoZ2v&jCYNFNlYCN z+28pIlWLs6H=8>MNeak<#H-(aO{V<#X^d`B$Ff~=;%to+2>0L0>X)VX+hj-5|CFM^ z6kVP^q4j>hKtVy`7d85Mh&W$UNHUcimq1(G3Q4D5@f^-T)uxn$HuB}CZJLTU0)u>D zRx%p{4@#uPmnB2%62acO`^URy_<)iOAUXwA`83Y+!|nqiF&mX1$A^3|FzJ!wF)KB8 zUmPug7cQk|<{ExUd2a&UXz;7xjj+BDCvhaA6si)nj}WRT-qS+A%S5j`_W0>gCXDto z*v8dbuJr(Rm@IS4p8$3CtRDUagt+<>Ni-dep~Z`o{;Z$%EyLt26&N@}gwwaE zQ|lF@ncGs;g!|t9^X4Uu`Yu?S*s+%ZGJd72RFmKG0!TtH+PB$arE7~c_eL!>DUY>M z=uPcC?F>>OEEOOvRo};jRemWZUX?SShng%|Rd|4$l>L`QXz*II&c*DAw5TSG^&4Z! z>{4x+$8ZJ*IzpNj^N49n44hFM9HM=^M~BKT=0nCNtfRqGKGAHRD0_`LXw@f>iMc8& zd`&AcZ5}^eFyCC`Qm`~XH^x@F+E_41BO~Y{Y6N^c=#l~faI$~I2tjJ?6jo>gvN1aZ znd6*e(bEo`pbO~MKGd$dqSK2{RXN(`N>jXYcM-p{E{(X^FAGyq)pZ85TkLDx0W2^} zHu~@N=rOTWuDml^>=(m!GlWahgQ1w*2g!?qt$$N)U2a$q)dq_Coxi=W`Q&iBTnJ5s z4w6fuMsUM}mi!hnf)zm{r>^R~p%}4dOLII!Z&%b}25}g8JfCw%D-@%RV9$aTS_I;e zLrMhnAaH!AA}F6{qVKaKXFy%~1#Nk5G^Vs>U1`({xVdhdq~m|u#k&x1TRd>CNGHbLp)h&cx4#`?oX$V?>8%WPa?QcIx@^V zhC?vKockum5YFarp&dbNhwdM>hKK(hxl4C_|e{Qe7h)uh6y93Z}*iQ&&N&~Y*{gLHx zEK2=Q(N7gCZA486DXM3&y5BV4apTt}T36vr4}VYtRf-p)6|Rv7t>%>PiuN^DY{@l-|*vZ)Xg!w0IN(|&wLmM%t?IH=!P83V!xa%t+zR5#V;n`*FDX#ju zf8eR;-$Lp)@#H+-5hbBv0v^ww;7+-$whT5-U4G@pf!h4+B7c9?X1CdJiHVo1A4HEu z3n*#ZHO^Ci$>fQ2Z1*JY7w+IC-#CQwpfF7K)>KeY#Q|B}0?*F$WgLZOCJ zmT&=$*kCJCZW*RDQPbNZe^Ya1X!3l-#2Zjt=uv%#(tBBC`I86E`{55s_k8rG$3Oh- z)hp!MiEqk_AN75Qc%(-sfvLU|?vp_W+HkKC>HAS$u7e5qs|k}hAIg`6v!*Z$Aq3e- zF08Z07i}#T*w=yTmdZiz<}6)$Hi#`$@8L|R>}*8TC|YEYnV?&>|u#nH5N zgw2H@0z`muUyabGVtyZ7mWWNVrh~7P*Kq7mZWklHD(28ewDpbW9hD0se%kdg#cIDT zlqHMu3vJE#*ON0w%Rv(j)^kBh|4y0J^5(OzkAm>-!Lt1fzWJ)^fBgo|%6 zcx}t)PaR`5ms_wXf0ZTC50p6bA|Kfj6Md~KYo%bM3|;~rt$%k(t$im{V|BGO>_r?) zvstQ^!&Sj%?z*Iz(3m+)#>R#r#m0;w$n^F5-Q)*~<^(o9?1(n@blf;?GtUqKy)Q^X zuet^1>z^I5>wjtm-lUt2q0S|rfm6c+YZZT_7uF`X>(T64FPC^_$`r({&ofsg*iWwt zgIFmGT=L4VDat0iDyUC9AcJ6z)}w=@G**SlQG7?M0hYDp3>S7KD{e1;c5;7`SietJ zD=B(^D%3eeyd>td?3^OV9H?;a*);wUfsr6A7lfEFEkXCU-K zoTzAb8-Z%M;TLF0Ka@cu%@vXq9eR|hWTWpw17U}xhG+pW5#G;W%$?Tpkl=+ZTo?)6 zx@-S+a-upuyJ(fDK}|mN-*A~>;wfMK2`owb_sq#Cno6^W^4-F_XL3*;Ma!mcIbDHL zXx%x&zS3NTAW{V}@ZD-){onMI`TKjHgTa56`(U1E91cz>kR%*$6hMxyD=9^a9WMk4 zYg!I}qGKT{MZ)Mo-!Rb~I0j}_t^70p!XBe#GvPvJAoH{CBD4qjdLpW$zJ#O@YHXOm zp2lg-rtv8J;otwP-TdJ-EA$Z9;lqi;GYp&)pWE-(tGx7bN?q-dMNQy>y3Vvu2R*%u@Fin zZPpl6C$f#_k-B71=cv#r41aqLbXFaVz5MigYjoHwO4!m8|GK*J!&RJ?*iCQlx7>J- zasGgDTXJv{r)pUZ`{c2hJnP5_Kn-P=*^p=o%O*^6eN2Y1+KUMY&%pk+JU^DqyAlgYZ4LM+Z;i9W+sm<^Pew5}}h zQe$07$jXGNjV3N*=O+4mJ_LzU;S@xik}G&%6^nVAwXEPk6vW%~?JbdQUE*}zvLSVQ z&*tABj^L>BDj6!>vLKub)15^F%BLS(x2@{yVCPcr?vR-_P;{046OHRm+!@DWJc}JQ-F1irW(W zU3AT^df)+W!Nr$M2gE}zwcK(6wO@W`15+#Y-*Q~F_c?HcFM(0#GoYd{I)B74F#dNw zgv0%c4ABwYW;Hvy6C$OiGe~sbFk0lZFuZ2?uN^hPHn8aPA zq?o>AQb?)=bK68<4A7UV(;T?7=~FAYZYoLsf(L<>nPh}7kl!$3Zt7yyLYK+ z^!r?WQ}A9K=nP>!3n<=B?Ir+s>w!BdSw@x1jgTjn!|l7>%JP*HDE>cI(q zEwXmWmiEs<$4%qv)>l&5NIRF19{HuDabBeP+pcxH%;goStoq7O@AWh#zZ^X0nFio% zrb$A7At<#_dUPmV%ob(mfQbRdxYe%|}zi%~w z5_h%n^J#muH938$a3dO|aP#N7q2FwJN0^$D)QLf7O+~dCT2;g;ndR={blnz11Vf7( zU(TI<^bQcbnz(})!C~iI1eSTUzSCK<9gdZD=`0vwWxyIa&wWFxJF%q6EygTo z$@?(L7xn~~d#c^LvCfz`>%|$dah5>{dKE#%Pl12>uiOyg5(w0^l#Ej%zF&yqkLWX3 z2u6@hGav+5jk|0kkfM0B2pk4%1+jS341?D+SVT;vN;G1}tBy{&@g$NOOOvp&SXhCh zKk1DJG0&tZ9x4neCBN5QkUX$bX9T3-yXN%&w6}5+#SnI<(v7tUkk`2z7ba`6rKC|(XzZ80B^BWv9FWH`_-iF4xk{WlpUygYF`f(sg+y zXR?X(p-xJH%?GovBj9Fb64oGq%^_vN7a+cK(XYL=HG%IGb}()DIXmzqYJhnkVWmcm z7<{5eaHC|m=tRUElry-j#G+(OU%M`1u8C`7v*r|2c;6;Z`e!vqhx!t+J;~B}TyeK4 zDSND>@ptIYo*C%ugR0o1w4vH9Ei+|huMwXi_qp;k!PKWYk^Ux)HruF`ngTX*R>cms zhiCh(oM5B;!e4{kz8g#!87-b7A*UrU+9Wvm)sRgwN!3tM2Tx9jZ1+H8vJrH5K8$J> zaRGcLV(^{l`X#|sUlm2^xy@e$NbzYG#dgJOgnj&m!Ns~;!o{))5bg*hgmv`is~lpU+CA(;f|Gvss6DWEv!wtRZaiH(N>9fgOQ&iM%%Em+iC&&x7;xiy@@smHhe?VF+U?OXQzUbg7RT zGdlh0Q;^_8Rxy2KsM!zFE8(OB9mTbM%5Y>26;AeNp)9lZZyyBUG@GN1r9Y(zY&k@q z2iV!JNsbgyo?R&K{#`!X(ULmbx2-F#)VpDsGM2<5uTuImF1QZQ> z7r^@$LaWCE2y(N7DQzkk5m&DVUCUV5%6_Sv*)%;|v$Y#XnDMIfL(UnY5AulDqE9|7 z2eAgqii5|7q=a@V|0XL6+8iP>(uyVLvAkN;!RYTJ9(K8uXP;@th0edbuUOCrI+a ze5ypCy2Y!D^K7;^%YodD_1)GZzG0OeNy4cOi5iSZfCq||1dMH`9W+I*!e+lRocflO z`@-R@WVaQdQ+qR8?tNrEn7E?5mTAAs_85-$FM2~~PplL2S~*^xbNr={Q! z;b~DB0sGONnD%BvSB`eBp5i7h6#WI9KfZ3MVXZf~X;)GVQ-!>7evukN-Q=LV(&hc3 z{^v9gQ}+>~G~_F&=)*NM0&0-kWKefc>TJ%(34`i~U?(v#CX~Wi$$;7$ExTR}p*hz6 z$S-oSa^!Jx8@--XL+g)Avss%e*WebMNpQ~J9>c+S0=J)nxbs?q`Ud3>CDgd zrmGd;P3vL+3!PJ$Fz0$6*c-TV;{8H5#01LQ;wzjT^| z9+j6{%CpoB{0A547FQQ9rY_&;BZL`MX+C-++hmquTI3lt1*BuT5J!*Qe6V>!8tuNg z=UuVSPMp{)N2h6{CQM71rM{Lf7twOe?3gIpmd8*rwWoKgXfWRzvM!)oPNneKX+t@q z%eX_E^#C7K41?E31dFDeyv=rFgh`zZ#;gKdLwEp&x{h8&4&Ea6Whpg6yrdeDsN98r zxo82Bm}0DZtRpD7c>dWbDGuM)Y*5{P8PVJeVk0Sz30Pp^t(a(+qbN)jDMsZNuScbU zh4EQ|A*qrtDcuuA6>O03`Gk2LQ3f1HWo(fD#t^&v?1&EVjI~lNDe|CdkeUhLEQmm} z^YTOGd*Ih50>l!&R$NqmTHpa(&?MxK*KEMvsW}JGOhG(dTHg>8&P3Luil)Fo_RmB( zg}46WvOIRYwvEOl@am931iahwJmBv{@;XwY2c!7zYY+N`$z%DY$MZ)xhNPM%2h9tvWAMY9i{oGGK%-_#|V?4NvdxK zOAWu7DCnNySjB~UR_o2?zyECA5H)#(XPo_U8L=Ca@!L70PW`v2!?`?TwTyLC8-x!SnRw4DWqex2nWW#hUeHHyBzz+5j-LEfWB(t5LSPx9 z$G)xZm!L}`)wMcyyA*SKcoCs-RTq-VYj?FuO;;nu zo*vLHHTnxg_|h^%tM=I9I`|KQx~jiHzD|Ym}(BX@zZOA^ZG^YyW-nf*6MZSjt5hXgwhMYc&KzGAS!AQ z2qJQUVvWklFES_ICmw4p15CX7zsz}lTAJg~NiXX?>-d9ObKceJ@rUgUhFiVf#;H@p zgd<&AFsc+IX~Oqx6Fa+0u3<8TUv?xZ&D9)YVY`I$)I_iz$8p8{$-rLZ_LD% zUD0{}SgV{E9!UHiCq-DAOp_Iv8Udt*K-0sd|7@Sng;qfEVQbAlTxrE;y2AZvyYMO( zGah>!<2oJ9ttdnq4NVo_MQpIK;#gmX)aGOoq1Z)~!pNyqbI<|J;)?d0Qrf4Xg!6K? z9RbH>+^-A}&R44NcX{8{vUy*EpY0l6!DU<{RnWXSkD3?ZzU8qt`Hg|DyXx0y6a72W}6Oc zd|eWEYC6{sY6nq#T4H70V`py85siG3#Z-7|de$E2n{_@3-E!JsOf)m2RSWJ{oR)u0YTi!?E6<5fO;JS1a-4&i7ZIEZ@Jb&gpPj%qr#}AwO1^54A zWL4OTMvFUi&AuLf-mo2cH?t+_2~M7$(L&Qq4G}!uFk!t!Z+hD8T-YQKXFpqd8Ctgw z;wBt#wVAS0f@m^HPo&guxhN@m&^eqm6Y4laBl7}=q&Z_=@3Ia1k)_EX;z0)SSEe4AMKob z{9zEMQnAjA3@n|o< z1W2OKDUUah@$TSR4yk)SJZGGR>$brwg_yK7xWg*VM@%Jm;&yj~eQAFLDu~>*M@w#w z{34)oqLO&&R3hf@;i(q@yz||&r#0$W&~2W2ux@>k)Ge95yUIh-Jz2uC`}&xvtYe@K zurKQd`3=M2(!fGtsX+|b(rf;VPOZN&ikokU*s1q`_5^_#W4c9xd1REtyAJBJi<*{i zG$F(-cOAlfJZ5c_Wm2gbg)LoYta^$`K}a)*2jo5dfpRk^Sx^-n5;-6Pf|7BorY zYXW>tWwV|wlP?4BDI%b}htn}5lTEl^lASN*@)3Oe>mAye&x*;Po70UEO?4)oVFjq4p6Jw@Cf_KsCsHmbM5`oWB4DP zZ#8HA@vAk%>Bsg)_71#imJ1Zaz%@9q7x2R9i*Y)Ec_Pwlz7N|>__z@ib5I)^)X|+C z+?AWhduEK0P^a!0qXen_yx*K%pS!ksnuTq>zdV4<=gMWAY}DbskP z^>aBgp=HTN^&6~J_pukwlYn+JC%$~n2Kl9KFmoP&69jjt>0y-|HWW~q{=h4f9P2jBF5uxb2<{l}C1;FF;~2};iW??Gc|udJvi{6F#;L#L>DTHqCS zvX~=LPi4wnN`ZO`23LsBan~Cg@ut7?Kc6)&R%N&nawQ z!jyk592jY<&NOSI)pgR}=0*a~Anr}%{LYxxhREtd%PGV*At`#Dqd1AItb@n7M*dFq zn}K0rM$o&ZMLIB3!gMh|DwScAwG)LP6)>B zjcx^v1MR4orCM+vq7|NUW>_P00h_qlPn5TimAvHeCM_S4TDlAUOTKmBr(5WVjBZcl z_Jd>HXMfU|4Pi3Q_$a&t`kLBq_rHbSYN495v-z*z_H`&B>dc! zLjdmES%#AOogf^k*3El>QiQX+;39J=M5zOJ5?9rH@37oH&%v7wW~mr+%)6xM#yGRL z3-;b)J2E*4_AFe+%=fyno;J!$0P4yv!SFRaXD?nUcFSNU#(q1ptujHHRuHYsCeHrG zl-U`W$KDVPLk&cX?p-#BkhiKBHlREN;C;~&EY2d&*4&ytM|4f9?bMxAHS!$O_M7+0 z=zBkBa>~E%Ongmo7CfWg-(HN(1{v4*rj!0B44vUUte)r$D2Sy_uG6?PbjXz90TNEm z*oaR(c}7o|)%1%0?jjt~F4}>3fs*F81m!z!yF+La!Kb=<8Q*Jf5wRN2fOr7c!G349-SRBj`| zS3o3V(r1YCzGD_n%zMX8Jztx_3a3KQdINZ=lmE58L0$(F8^>Lmw-e8^f$r8D`0OKZ zSpv$!3c%kh#)R}RbR<>E4li%_xsh0LA)VbRd;^65sh~4j4hXN zQ66o`wEcRsr}nYi6?nKnOAn!y#va>oGiAvb3z_cuol9Usfkk9((DAa=uJ&MVrOv>z z41;$-bY4LbZcW90GCj#xZxB#lk;Z1_kzdF+RuF3S8`}`M99yn)w&y zhE4wMYK*|WLHkxP!??i+T-sLYA-W+4IfHLB3{`uR6O*5L_};i6nl2_?HsY96U`>US zPvT9uNw_0_YU-^yl`s|6-TW{KdFesRd(g-?hPMV;ZF@A^;@5+>V2GMATXAz+z}*F= zqu$M96f;Ecytfvy`{@rCYEFAb{O{|}j?3lxaqwVGdjN}^!pKhR<6tLF#th(ZMf%#J z@z}-@-on}VL=kXNnkZA{PX-m-M17N<4kbUKMxRL^!D9!-$6a8;UR2XdhUp3V2iYgH z>P%@qJWmZgw=HMeN(+52$cL!XLOjD$OLdHjLWDvn#`vU_Mx|D4ztX1jS1>MVn1(nm z?<(K{n&>HJHQZ!#+7hAkS4G=2nZy8H{dIa$Ur1pXNT>+|K@R zb{m)8#!~&Kj!{O6)dOctcokT|F{dA!*z$YxqDhkewu1JUkhy$S_(vuccHce|gE1~% zP9>5@{Ju}y618tgN>QHx!U1Oen$1E~f)cjrhVJP#!B?THY$r(y%+&et`5vnJXFRBdIoI=Nt|oh$z34wgt(mL*AtiJ)8i7QC z3=9)^vOiNzYU(pEG5({S-L%I)r@2syreSxwx%_G{-0gZ~_UEp6-^AbVc)}2y+c-6N zrCzieip86oTa=9tT{*3K_-Ns$FQqf1r0&16@vf>PwY{9O#J4ciRhx0JqzrXA>*&oM znx7<0sCM5l!tgWOeZ_UJiIY1XWAd=j48L!e7;Ru&$mja%p{AfpFPGAe((m-o;PT3d zltn(^N-8sDqf}vU%1xr{?li~jML5ITyMgA{6TJCHqhLWw6K~r~O~!-AJx2$n^Znq4 zEzz^Hn{9D!uZ)H!tJv2sNz(FVkR43qHvu?;=ZuXjXR0Hkx;9X3(%b-({C^R4RzY!f zVV7=#Lm+r?2rfYaf#47b)_CLY5ZqmYyL)hlrg3T9-CY}RB)A19e8Yb=RZ}%H*XQn3 z?W%Xbd#&fu3qar(vi84Gw}viHtI(Y#U>)MyYtq3KF*i$wu8{Ha)T-3Z$?SiS+DaRO zq7AIqL3l*P1@B83nPo6Q%V9I2x6Jyr1IN6)Xg*T?OhRGBE*E%ghvnNGzdZdI7`6FA z_*?f~^1A~%pR|&D@QQH0 zY-i6Yy{j(*{iiNp2S^V|$i4K7M&2obMdT{Kt$`&X6imXRk^*0B1^3E7v^jp~e;BGH zBhlI@sIe#0q>h~)t#0b|pv`D{p!9N5pKM-fxfIYe;d5IbdbLQ-An%3SQ(sO!a`>Z0 zJcD##<|p1A^VLjc=*CTqBK^Wf*{_B-%j)I-vUZhu=Fm;qNDlObeuale?R_3Hc0zRB z8b5Bz-SYIQG~|VQAl^d3=6^$ZD29X`ZfNCEaGL)JAd+l8wgEbc<9 zS9%bT8d8{!3ky0EurJ^uF17d&CeX7Mk@G2p&jFiU1Ah5begxC_Gi`B3VcP_4v;Jr? z0~>F9c3RN=noRfQwQi6vZ6^6@p%BG?ZK83>;OgV{+<$t+WF-Fp^ z8CO|KV32Z1Xg1T`D6x_+xobuXr#AV2fXzL^+-6&&C_HAxn~t6<(Xw{+N(Lo=M`QL+ zSWSdsyTj()J>yKo;`ny}>nXs`TD{o|*EkNRR@UYJEqMO_z*Y$4obPs%TiqXv7AVxb z-j}!HflxsiF2qw@0)gbXuc)Xxw_ne|7AI-16cKXaa%<8B3ohDSh9Ou(Swd3!gJSl$ zniVp-V_MQ94*BMW_W2@DGx69i*k;UYu?2A!X7j)3m$$GAEXImKHqhwru5E6@8LEkk z&qM3qX{Tt{S!p2@5p?&AT6HWmGKrbGJWUNP<2qPhhq+`aeF+hrH@WttB^IK!jh@TtY1r_gt=YYou!sxn~Ol&^R#n-4K z7gZi(BmV)u$S_-!zn(Sg0ri9S872$V9dzK`jTJE@UyP)`b9CY=elGnHo=wNA=onJM zdJL5E_Q?>Ey{hXy6>Hb)QnPcpp<8_9ByG( zt>YpRZ%qz^?wIxuHoL7#$zs;Y7z8HA$`ib59x+5XJm*+NEh-Q%ekaKO{~3LHdQHO7v5n+Il0&7TnO6i`v*^Y-O>C9_}!RZIhJD* z)C!dQ1r#tq>p4cMB9T2tLI_T*39{HpqPSbHQ7lTfV(yK6u0oB+e_~VBxyljCvLUXs zQvVsP`a{Otyq*7u31z3$izsajo`iEA7 zrSKc0_862xZ^Ht($>l!%V9%3N$5rfJIa5W#a?r0-Kc1B}u0#(n)48>7wOjKg!CyF1 z{ncg%WG}ZAMj!GPo2GLay<7ghMQ-$CK66}>P*NgCl~ti}2BHzk=v3wXRhRO%P~GbN z9EIMPXCCg522OQu{#**G4k`xm2(mWng3FSq1&8~sE+xl0>CrHamv5@5RZ-Mc8#}|Q z%cbT^4K7y&bdOY_F}*~Qo6HG4HfhIUT#K5{Z)BM#t%8ZmYkA@cnN2QiQDePlJPB^6V#4g`s zNnvIK?QXpi(=tok{@lBj6~Yi3*itHGtJC7Ky3U|+1I>HldR4-5TipKY+*CFoV?g5E zhe|Woy`7qJ9PWzso<9`2%$>o~cpOLli*meIDDebM*s(H|C5lglYBUA=GN386J(ujn zsREiohOPH565*YC$9E>t^{$l(wJ{gIom}I+I`?IPo&6hGY;L+-8})xu)xX`cMv<#x zii?dZ>e@Ch_K=f%2_0E`Bu~KYWJ=dVjgY1 z;>*n<#;li8Q%+C07dNPV`hnt=|6W(kIO-~UY&h7s3Ib*WBk{Dwa_>*7FX;Szke2}q zYJ-0~HL)#I8QN6NDzqrR~J-PE1+2I)vI)RmGrVq+1nUu2(3?N3pRh6#FWvT6bT)ZI2fB zyH!(3Mzj0Xd+Ba90Qv_+6+DOUc;i5ilh^VQ2l8pnx};M;6>LS%1WGBxYph~MB+o4_ zi}ejml7X|vS#05G09V1=u_<-YC|jFo-){8<$OWUFE_mNDN?MIFG00uC&Mh#gj5-Zc z#pI$6U#~*S@U>D&LYFheb&yAAu<3QvOE+P-RgDdH4ml#NppZ}tjPh$!=nlXe=K=FO zV*>goQ5Km6ZkW`38{Krzi~1PJmq?N>s}YBnzSrMWnVGg9LaYsrm1##hPDVoMAN^e_ zA`q(?M5Pd!4ZJ~>Pfb%xDEMvK5|(85~6M0 zx$DF$a#*HOw;St&1r3D1(fP{8bY!i7M}0&XbNJbeSAp>^M+t4rh`DDweJ>v)ZD=87 zu1-?KX9|sul>GZuZA^D_Yh=M~9(3aj?V8qEvN5xGjPOZzWO5|>da+RwMn=So9Q$&8 z!kpGz6sBi$8-_FJy?BFK$&gVySGw@RM*$GJ3J?ZFL!iA(%(ldsMm-R-=+x?5LgcDj zyfv0+XD_ROntmP*r^m{prh|I-plbjWxxBp_;*Lcg7t~ftxG7qH3%_favmK)S>{qfj zJCc{rs(xDb$XiLa1~c(HYtcj&DESh?zt^jaW=*q@y<=`yQ-c%(FRSalUx`E&*YUPrkC@7= zdJ)9+!#5PE89^>TN<$fkE$x7naYX_(ujA(xWBG>(nvCAbI03)Ev^i}NFPH!M6bhSt zTRd0Xi12G`^b^VjXL{lY4`{_3lBWTy?5i#}Rzan2rk3h2YzhK<-%?h+tp47*#jqk_ zufE(;M5rk}lG<%oYGG6TK((XZ>`LF+pY%~Djjq93=oSF?S?F%E zvkwoI<;`;P-6j{;tiYYw!)<`(PooBujCUu-RhnSU+^x4s%1q4)Z^d7aSAW7Qn!^n7*z{^eA1Q)Uvnx3yO?Yek9U#ySQ1^lqs|FK3$u?x)lNYaLjl=e}*r zK`SN0g&ZD4$Ns3@-6B=In=PG0ugy*o6Q5Siw92?%B1-8(HO5$vAg|AJQr2H&Woy2xMdi4R88oc(2%W#D|jWiXj#5vn>~XwayULl)haWJ@Gy& z@j$i?@iu}Fb*Q3wM>TAgM&G0f&u)BNf;XjIV_KsRI+iB4u+gz)?Kr6O1G4`E=!=aj zY-+aI%AlBO@?Nh)0*_4-B=rY}F^=u96Y68gW0-D+_zvUkfGS-o>kK>UR}oeU`!=@T z=I5$=ddmx$r1*+0`7E@tG0eO9yPjt~)UUqQ+Ujc7YvI~iTJFgTfxK0Gm23k)j2-w6 zoKDbXMp0=|DdDF)`qiQH6Ly(@_}KJZ)nc)!U9R*a@7QiVH`#QcY$e(`I$<%Q$nwn1 zq_Tj0KToVUDU1kI+C7_nVb)mqC+~qTyqIb{{p@WI9L`s3SkJH{ThIkXYo)3>BSP7d zt}{y{68spaggg74({eWU+Spr>b4jQFCw!yp`eNp;KHXKi(C*Blt)I0*9p~>_gt4Nu zd_aDfY3Mt``Jl#BBcnFIR>XhG6~zvPzq@JCFzYSN zKY=fb+Yn~%i}-r0ml^t#qgOYR^FFopBmclgzk5K9A8%Rdhm?Aq8u%`S%^0O51Z(2k z@=%+7bdGh@)>Ut1n~q*8TgGipXAqZ*3;)h+pysnz1fd8NZXwO)Fr%4bNm#Lfe2eXp z2ue9`ju^{Xl>f3jX>L2N2^MAq8;50LjD)fU9= zD?o?{Wx8b1@^&@4F?BVR2ipNF&NwI_lmij?AkHVm;W>~ug$>a-8x^K z#$WXqOwxnm4MI86c2)amPM|LL8c?VOUY1HFD}(jdT!L6u7Rk}=ZobPDFrLTprz2Pr zi`GVeiw4%AFpV9aM=#u3eM|wQ=#Bsg7=AaMRB2*S);Y4ggV(0~hzb+v z7y!tk3v091s*9ed;uCvFrnrX%^1|4s+fE-@==GJ$g^P`%PeyHo_bYA9PoU#X z=PY(udub98NmWq)(ZO}pb1`*tJ+S6E{vd+)W5~DCt%Gs zVtgPHXdr6@nF(bKp88eeXT7j2jpPFtd~-Cd<9Qz^Bev(0PqXK;JYKeI)fukeTR$g? zm&oU+xfKsqOo?m$l|w}biUsVHW!%s|ko!c$=eRNYW{D^jn2-uD|pLFC0K8kv$zw=`eDa~fF*iN;u^Vv?=N$HJuvDsnmQ=l3t)nmgW!+!*M>+%4=`HD34< zs4Dd!r4dPbb|rkzB~2*>z+o0TWW1us9EC}Q@;I(vJgMwSt&N2EO{Ei^!=L;#QZFN& zVNeCOa&-rGEZMrKhA+{W}JX&k(lDBwJqTD|pg%utinEwOB z*j&eYZ=^M$#H>rN=l3R@hOcQpEp!yS7XKSgDav!KIRwYuuMfq2y#Eg%$z1y%pfyTc zzbJw-{i$-)X=7s8{9va~9A5B!ohA zYB-+w=xoq9^07VT(B^#A?T-07@>aQX_N6)6(ebFZk|L)|_T8Z_N4}53Juo($A`tH3 zt9RJ~I;-2r3ThXK{yBSu9@h(^Wj3EFEDkZEr=3ILMBlsoKr&PcuWDFDqab82LfMSc z8E*f*$1P&^&y80n-T02>yyDyqZqP#AE>{vECY5~*BuhD7NHy-b?7}H@^rSZDB@zp3bt`yy-nBBr_KHPLpM^9zwO0Ej zO;*?aR_F#2-33*K*=heY-0GS&`@h#;8;=cIL4BJ`g@YQ49&}K1@c>ABw{PAIKOIvmQwiC& z1N;$&#Oa^4LIegn3K@~v{f~~q6)0l6Z(PlVllqQRRm;%u1}eplO=Xf^e{~87jBrl z^~~`xh&qzREdLRb%4WXBikO>UCShbMgs`Rg2JOIbZzvn)>HX5yZC{h-kF?_Xz6+SM z^-glwB)_Q2Iy)a>7#N@TG59}#p}?^Z=4(MDp4~dtexlly(uMKWV<`7J)^zDv5ocaG z{bE$ox@7^huM>e9ES;Uel^B5S-P!r*rl95u>ntO*?!Rn{k@KBDp8a*SXcG1H2)%>( zOxZ}bYCN0=k2sPdv}%>vO5c|kRg?KUV;qVLO#P3Et8+NFAeH*B$_lf;B}w;kStcJa z_d2WQik8^O=6;=7(;e%&F=pow;(ux->4QbR5%mL@S(G%;s42Nuf-7%b_hgh1Gw1s1 zPy})+iP|OOlde~YC|sQPgmw)Hj>)Oj1q!$S79%8u4PRBp+xNE$2ZClDa^U&$N~Ac= z4HotS$h;P(kapxuK|-(CIb-g>%0=NoZ&Pf%RNSDB0Pe-SJpeA@L(H5|JtNL+K6z@* zyVWNF&yc1s;XoI<=)-Ew7NU9j$Fg%|P^18xh`M2E%JUhGY=Y20ORLaMn3snw^3uLJA(P+w zE~>Dm$m9Cc{wTBR340ru9T{a#SvdjW7Ag4B=lM{l{=2YR;9M+0iLe_s2}0cO)f^@K z`~Iiut+0wJ8mvi>zE>F4Q>p5H$sRH?D}<5cRBYJZ?UTF?_5~qA1XQ|K#?_>ewP*(M_SfY%DX!7 z%`-r3>0lFbygBcQy~f1r;$}DCtN?80Px@OxDLp3@vm3Zm3IpuW#kk>pP%`?USaf1# zHn?{e1JabEukzsAuvir)huJP2kvbBkXIzyiMq(8C2NXSpBb{S)_Oq^bYleSWKAyianax5jFUYHp z@^~kJ}3Izb*1}1A*aTReF z1+=fazPVf7$Ojd{gk>pp*N01ww-c;VqfIXY&2p7G_o3TSRnEJ*ju6?j;n|UB0X{7| z+t)M1xxzmq$HVA!p{9CMUES{oEqpm^IrRcyZSXXE{=`{5tIKs81RK_Sg(|-t6Exms zkHF)Gu$MFIyPV~+xr-P5{!D$5$Mh*wSXnD7Zvoisk9fbh5e2d+6sRF&_@bji7oJ!ex@O=Ki7v$7pe zA6xz+^#2F2TV@-8Zc1^l9(hE&wTzEFJ*Q1J! z9oG-PUNos%`Nw#l5^r=uHYB0%#crq$1+9r!~H*?|YUOoNIsymVtoFerqbp8Q1C( zZ^tCa{F4$rKW@>6xqu% z<*d|IGn;VmZr-s)L5^}Xdlfl$N~5VG)pA#-VW->IgJrI^dN}QLEJ(kYN4I2**+1oG z?7K0rhpi=P`wx@Wr%#I<%)^|Eiv*yl5vr^>O>%yp*NUAWWz(;X+!{TYTC<%dTy9NG zHzSr#RaJTK(Ypu)?xqFhSNMP4nD;<{$qdCI1jFg{vQiqME(vLBBYbCbT--wqNt7;)AFO6VX3TkE`WBIm`BYMv?4Bx!0 zu$?{u|1dpoBW+-zC5&rxEiSu}{K668#MJhM!;PZKHf~#&Xh3kPLCj6fyd}w^zg#L~ zRP5zrl?gdyX%s{XYQn6Dty#`svyGlxSGSQ#G6r*k+|# z2x3|!dD}(04SVZe5iEF~;$bAMC?A8S6){@)Mi5&CFKwapWJ;EDpSmfAt^PE!KqFJ* zQDjL0GY(kZe?hEcGx?H*YtCm{m^{StX)Ff1mQ}aTjV-l&$EaZb^Y1cy2vuXTNkcJ4 zgTUwi0As%X|9EsV{JDWg(~UCUlnm*uS7FO8eZ|d+7FqQ8GIDIZYu?dO+jMjuqjUfs zTB1?Y>TqaUMxz@W(XqWV`Gt*>N~*f63Q+rfL4Ure{7YI$SRFsF(5vbK=j;j43DUIXxDWo^r>~Q{ zWGY?EEW~ndWJ`|o54LFgE~&$z2UfI@RTd`^VUi?SQMR5h2t7ftHw(8Qu8oC4x{2t{ z0U=51Ila_VqOOFo^>}YgX{Ca^ImwSzegW53*vTD6HIe^+3$JXWHL9H(84vl#>YXycX z1zr0^>V=Giei8&l-qe6gRMawXDjS6syk={&IZ_=%Cir1p%j@vGEo*h1?V(DwU^c6I zQwT-c{pERy7jB-{J@%y)%6_2@&EcX@K+6VG>Gk(ggTE}yP9p_};%!l#9*+kbH9nk% zD1lapXRtPGFH##^d>!WH7x=(g*e;nX@^RmY$kE^lB1CXM4bo!Uj+1c6onB_jWvXj3 z(FaYw5t0)j_$!q_<6xbS$i&_t@x`Nu=!J*qthJh{RxtJnID7uh@F>=m@gE>Li4foJ z^w8>7la8gn1Pr!Upy1L)+rc8p24j`*F-tiL#J4i4odT0ENXzEuW!Jty5mqe|T8Zd% zo-8y=6`#T)DL3XknNvgCGzL+Bc@X8{G!uzKtP@JtnK3*j?3zBJ3I+W-$&r|sCGkyc zros02RqLWf77N3Oa{#cA#`aW!ug+{Ujqb<6yq(zTVjU|AQou1h zwP@ICeG&I-M*@m;B9@)iPhKM&?i|Krcj7;J_M~TRIjc%m0a=+UC7sQ$=QQ zs~ow>I+}ZK(M8f)^-5+oPmoUS+57;GbldB#->Eu9&5et}TKGAJT3aY+3;aEnKeXy| z>KHI^RL46E-2u|QLr%$~G~|R4<8H-LVM}>sf7U~yrL&iVDy-p6Is74$8|$8Q+og`5 zEax--s=2l8;Ze1qLgpNNEaGiOPe&nuMbNXzQV!sJe`y-60B0{JY zI{EwpSxo!~^0=rXXuGQXnl|Tw$L6KZPH%oRS*~wbheCa~d+QD;%N}&NRG#HaE^oA3 zq;NxY&6Qi7j>f7f?l~m`j}NQ{t2eDInkj}^jam^=qeKU9zuSq)FOBV;wD7m7BO6ZT z>Te(`fpv19{6h{Tw7hpB$}Ucics*|TL!NCqpIaa^@P%QvHq7GOP~EwQ*I7?T+2UMs z;7S;E`TMeD`k_6teSwp(_h^+++uN8b?85bKd|zKu>ud`~JWM=Hntw3~ySu+IxIb!Js{OQ_NzGkbNE>5mVvQr_U>*GAr+biD5)RQpZi)t~K5 zb5bQ;Rz1`sh1=*i2*b+4l6LgmQfn_yHP#}KiW8g?(Cz`pio*YTyK4w_vwzTg7%A>w zcR_djJC>;omgr{x?;xKa|Hn51e|Q62j|ueaCooI{&1IDNldmrmj;PYI0L`BEGY9kz zm`syw)8}lh$Khw2rVQUP0|3>e^S!0fd&sw)-FE8gS_2wH3bm1QcYT++y?-*d?#x>$ z($367l1lI|1;mECcSUd4#M5!W1!gg2?&lA6Q0UU~$?&{fmFB>x497=kH1kTkzKgxO zdH3$S%rCNMM_$9b+!TniTu*oHrK5_+tR;IvF=jw zHY-Trmr|4BVLE~mgb+Gc92w@n**HoL*(Zaximt=H&JUk6cz&qNA>g*OKBRtx*aOOB zP3*eqAJ_+(-LQFgfC;-^7)Z`&v|Sw%iW0$@4U4;2F66@p82ejU?FL=Nb9;*k*V>Bu zpr8-p*+X1{3H%ydKDZEM3HcdVRKD>wS5ku~d9`@z>7qfNX4et#t-eC_Z{|h5XB!~_ zoY2p-*Ywo5S2>b%s)(GM8ZnxN_0lAUVZ14Vt<`}~g5a#o?5(G<2`Mj`o)YdRo7 zBixzfz#*bMXV(Gnc6qf!V`H9I8`vJJFHsnadnRwAm^UGCto!iI3~^pu z;S}5BqI+U0#3>GSwX0v2DD{JC0Rf9$X(+C0>f$AGnS#^Bk$+xS0nqT@`7KW9xFjCi{fT zN7BReYG16hi+m(Jo@$aeYs^D`g(^TafSN0<5fO(`N0UQK=f zE!{IK6y>}wS%t~lRidQ7fkO`~>V4HTe)3q$(>kyac%SjAqL;~AQ8o!46cZRTvS5

Q}ezwoFyiX5cefNS_{_u32QXl#4h{?XzY(L_STUZY+J$d{lIQbB@SgLJJ#b@ zVOco9A&w{I%zR2*O5(~*NJ&72WZ%)9EP9yTpQi`7HZ5o4ujL1fjOgk9ZXwYfSbGIJ zs1={v&uK8L+Y~ui^jP3v%BQ0~v5qN&lo3bAfDO}PZ?AHEh&k5KoCODbqCdr3hLm4$ zi%ictPZGPL`U@U@Z}Pt<_~zECSmv%nJz)L`ahpw+b@<=ePlYHA{*7fVR|G|s(;>Ve ztUCuvv%Eya^$M)s^|6r_GdCxJ(R8=R5~Z)S*~J>~`GnX?q0!k!!VDp( z+D}2Pc&0X;;*G&x^~-G;O8TdEQW)aCML*>2yYiVquue_TSOJb?L{9!aC2;TL1*31~Os>MsTUCWYCQv~q1$5mb;_WP^tklByqTk)GldK^b z{>?Ef7pM`BRov`EkMd+T;p{j)e| zaMB+>d-Ml+qa@06hSir>mZ92x7&iydty?Q{nS^#a3wKM`nIIH9Ugo!9QWPN9 zmHgBsfIo_?P5eoebajB)hUL49qF!}T?R!8JcO3H(lm@K)8gv8D{R*KU z?5t-8LPK;-<8r7aVr4C~xq?>}rz(7-Ew?k))}}b_Gl!{zEs!N-X*VIh?*)@4^a4%5 zit;M8CHzdkb*Cf?xYNlr#Htq$vaH*xR3oQ25SZpeVMjkw%*=HxZL?gF7 z=bKT@tg9{$sY94^Ra8T)xZIdT+#_I*4Fgk&?hX^EWDL7mFdkx|cSO!dHY20|u0Z1H z6J6;-r{z{l#iMn47{M}FrIS?gq_G~tOrk~JB0WMSDo{sS9_$f0>ar82)_TCXKAb*i z^@MVx;Q`$)(@oO9w!#nUYO)e$_hKeK0#GTbd=l0l){trvu3VH|8TibXnk#4 z|D_U4-GSS-`SHLDru)+_SDS+|QY%Zc;Va7Von*9vb=xyA^m*X6AgNx|HwFB|Ev_Rt zu6nayo4zy%SV0>%{AWuwJ-`OXE-zCuchQ3oe=QYDpcpv;1|)R7BP*+#8nAa@rF3!xijM(DXN{ zSO!@{w=3Jo{H;&ql5&Q?y-8_{%I0^>c2N}du@BZdwB#Plx`$#hoGYCV*WSEa2QL05 zBoh{Ew%su0HTRsJ=Zp5r+hFJu9XrVXFpd!$_+Z9;9*LeO6;vVw)=(U zXJ;<0leUO&b5X{U^;=$jQ3LHqD2Sft@8s8~#f2JvmSaZr9(0hR7oGDL3SAW}{trGL z*`CZVWFH^{q$Z)yF(|NgrGW0~No&u$D#Ss`EucwWy(^|k0XjmPx&>V$ZxdfgLf9qj zyFRn95KeJ|Ob_$&8Z()}-2D$yKC0RdIKf5F9?mex0REeZ-*6)4pN7PGLyN1=wPZmn zj$SlPc7EN$Va9rpOK5@Nz}q4ki4qM7x2B~sM6zX*b!xn4S?zaTza&Ee+AMQkqeZ{O zDPK~^9vt;h?TFaE?JxeT<&d3sm-H4-S4`TUkhOo<8q0w$V+>pH7I)&6NT6G@5)jx--7 zsWVrYsD|<;0qe38dl?Z|Z1{#~V$M-0wz@ktqM=fy1v!v?vX@GK(ZWQBDcFXD74p4e zb27_jIqw40OjaFXd4a-zO ze!u9xleyt8CKo@E1pn3HS%%pQk_F`XbICHQaP201S$f~CZd0-vwOWYn+TO|iRL;Jy z{a5#?c)cBaxMo02mMLC@j?_tq3>bNfGows?l^pjku9&$r&Z(o<+;G5(g(;_%yXK%Z zUA;^sQOcxD44hwE`eYE2?(GfYJEo9EjDv4c3Eu$cbQ9|rN_~i5Z|qCo;uz}5($>lH zhBJdnDa;3^AJ{-LsKp%xRiC0%p+aFuwFS#ixdZ;Lzli6 zRQ3-0GNSVG&d+}P&`N>Ej8&ET880-PAb6PK z8XL-)nOOmjaqwb;{wkbVtNix9pP5XBfLhcO!H)mnD^0J|{Z^mI_L*MUu1=FDPZU1e z$MNb33$C>uMkF>dR)9ZU-UODdLWpq9rg4i7fvz^K8c+|q%*-vCs(yY}tKFbY4rFGo$Ngnhxa8-aT4)*B0QbC$cQ(!EEyBkGb? zq@8sg4$ty%VG|hlQD#59U?I0S6qGBMi79RgD82<3rqESliwTSEmCaA_)P+UqggZz( z?)0o$*?k(gymMD4D~W4CGTd@WY>tnb_$J3OTrOjL#PwRAeKD7ohlJz`NTo$xNJ66y z;-l47XJ@dRFO2Fhd|!;myR$5U^P$}=(!(X&G9#R=`eI;P;!qXPd}f7_|I}|XF#n<;m9O$yDH=I4;!YA z9Us}I8NjZuD~ShuzrWD5C6&10V49Xw1urjy^~8nmS%wf)R;3eWswZGz4#`-Iuz?a5 zaRA#V78S?6IKagS?G365<+y1kG+WgRYHu@BuKSHGRn?@x1*D0f9ulqtTuLg$ONm!T zN?}FvRuBE)_@!zrQxi%QRB(B!$ZSJ-Kt9`p;=v+b6cHbq(2h;rTrH>( zT?{aH->%A#cstWsQ*?YLpw~!cmmZ}_(j0=S7}NewB^{^ududxt3byZIIaN7J(;QvV zc_wODkQ$#qzg^lr5GJ-n@kcC&#sr~t$7piz-k7u`PWq-LB(8{Y;<6<7@HZUp5I%#s zR;|=x#OE1QYUgXXgJk<1tHtMXbyD6}-RGdT=SGJ0xHB$YCOcW36#-B z=P+ZawI)_^fX+{SH?6hL8m+Jex5Tg`8_JJe((zkCK;t5SW6>x-s!TtvKE4kl?f{0?2UlbLc%cp z$Z_9%vMYyMFo6u3-9a_d-8pg|OhK{FIv@WYSWQ-BSP^<;8B^$+2f!-Ok@5xu0E}C= zi$L&nSbpno98Jx>RV;l#oNa$rUWV?w*{gI#`;0S`GCI{2GkOKKVXp8vVJ*HfN56Qd zX_)>yU!H{(Vcsva0k+FTd*4Nx>sT|!WvK@&`gf2IL}(*;cMdZvzZLGaG2Q2IJF4>k zk!xX|m4Pk$ahuNW)GsWUk04fbh2Wop#hZ6y zFY#$bQFBwOM}&fSur8(=g3<-APs;Mxo_6H2+QOhqa|pW;&U{3m!1|Di7jw>fVI zK-*yN`NlI49;OKM@lTx*sK!ZYqIhBPd|}#la!%IhK+u~_&j_`3mazIF{3xZJ{{;G{ z1N>Eaoc^|%b#4s@#m_zoApHD}@7!(YnwKHHV+A>lm=2sEi7A)uipT}__UjdcjQI1= zG+|rA%S-&_evhD1h>_#v1;^ODCrnT`tn=j6Of$eeyY=n(#7Pfq-;v=KkXCFeg|pS9E2}LZ&8yAD zt3)uceYWJkyETPTXbm;$hN<$vdMm7+r6WeEEDj%GJVxzOrQOVtNv5bd(ec!6g|$n3 z$jprBwB$J4Rkz3$5RX-$eYaWX@_yLi=f@0|BN10y%IugsAv5=7*%eL-$q49jJBr@* zFY?oZI{D&|+b8yKk!$q*s-Z+KiACI!rBztrdep+7?gQw)^^V~saB*=J*974uSAUC+ z#Pqn{Z~!wV9knw&Acc`7-CxfjOxM(4n`;pLU>Rg6A>rk!P&wgRAU2v?*rgXJ^aRTJ z*UJtgZmDZ5EVL=CWZQe`yP@tpxKMMHn|g>%w0wxvxQ~1m^;%maR{hqOrDK{e zoJ)lBbDQuVw9Lv09-~P3sY3#ju*LW;JLnhZ^jE)H`+v8!6ItX&D#MCF1)iZ!{C%jx zZG$QH)&j1%~5rtqoC&$ww}2c;Q{-GZWUsTWNeT?qzk( zXzu9yvNhySTu8&lpb?#AE$T%A;9{t@sj~dy=YGrmq}Y2+Y)g7t{X{i$t3*G|!ry3i z#yAEa+O!Nr&)y}@I8B@54!cw(^v(Wmi}UT1uxR{%yaJnSTR&zo-M|6=i5UlqCxlbT zfOsX)gy6^3V%(lB<+^VXE4s1H3x`{p{o>KG zWz-oXDaUg4*v&pIFzQ}O8b{P9e-H~F^uXR-_p#K7c3oMt1UE53EIc;cWqq%+(?=B1S*dPil?P` z00qrre0~iao7{iIC~LR0PbF{4{H;?&BBFM0De#o=j$d3k0q`P`>;It{S_s)Ii@ERq zwplS7IKPV@Erop;`i~n^+|%mvpGx-$4@;p5XEQjqKAi;2mm9)+e6@s^Aj_{L^Kkrp z!iyL&id1T?{mo#Lt%d(qp&~yCWoR|SL*LJ?{EvvupU%!#rJR5)yRWx{GMRt>1Kd`N zOf+#OdHW#I5=(b+=XF(Ip5+Rn?w2zTe0}+@=3%^0y_iRM6YO85rEA=|h}9k`>!fyY zP&;4=XSTtR3#1LHeET_v#g&N(+%=|m>G9Icku|Yv*6YI$a(>(YKGnS^@}xKYyCvPn~Lwn>9>HW?mva8gXn)2#G5r8wJ+CYw6vS zQ+u6dwJ!Y9MSLGIvXbQnND}sYVrIGwlk!+Q)N*@bGxmQ_xZG^#ADFRivnx>zCX@-( zDS*-{8tXG+faZfP4^vum3!ZRQN(MHNWy;fdWheNnsN*EqFH$RuOYr2V%)7RQl$Lp} zPu#1>>Q{ebNDk_mR9jofp}BJnyAz~T@+F~))T(X;pN%Y56#cwo;r(D$`T+bahinQ*-C1b-lDOO7%I% zfwgY)*;nHwi@&k)4EyVuhtP1r#RrdB>zvdpLHEBJrBxT&rpJ4Z4~C0eTCC5(WpDL0loR!ipl-SPo|e;BNl zPme4*x$1g3bm@#?#^f`b3r!2D!4sL2Vb~D3F;z2K1fAmZyc0EH?c+PCZqjZPn6C${_vfX<@ATk#x*Q zsxWoGL56s{PtcPa$~eOjam-QB^Z{Oy^hssy>HX@1t&>Y{bq1cv~D0Kp}=1_=ar>u%g>Jh*G)F2SvFcWK<+T|#hocL){;lJ|1I zp1QZr4_IGz)vDTS&gU89M_v%x4ZGoFd&h}P=LXkw$_pH<4NIXdt*YPkAO^wSjWSSu zkdg8IQIv_&FE-uReVuyicvRA!3r+R{b(&kf9}L*rxm;XNNose;975hOo5|Hbj0qQRu%xR?be&Lo-rNgC^l1h)VR1@=@z=~Ydpa6W>slWCn|T|40yo`lcdz#p5YtxKNDE3RDOkUh}ZYn+g5_I#H_C zfMU^GKaf7Ytovw51kuj3L@P5x@rT3caQK???uyB=;Qeyv&ZHwpG4|8{7RxQ%_FWTN zQrdh(K$IlQn#ME4(U(r+4|gggY;*Lk3}kLU+He^E9oUH;@S=`k0GX#mPKLYZ{gyc8 z)*;J<6pEt%zyuTnlIp#$N8a6$8t-Zp%4V!r(B+>EHCN2Z8^Yyl;^)B9x4hzVlaOhbYWOfHS<*4FaPFbawj*ox; z@k1u0gdkS-qEX>G3iZ`JGGETDOb)MOycZq>!54n)gm9JXc``}$P$QMSrEY|cZbwyA z#$_3rR;}tVel*JpbtnM40(&SmMyOJ;N>d>2Sp5!Z#fS228SAsSyl80oK2Hm9*ib^ zx9wJI#TLVKCd^nbTE3g7B(&{fk(E74#M?cUn1Nz=qL<6VjJD}2hMqufeSulTPHFmX zSJiZf-C2r4Wg5PA{C@!RVc#%vNu$<(n8wsLG;pBYIXd4d&F$J?hVBO&e8pd#K-Ckv zZvsyhxdSL?Gi>NwjMc^Av15(`1Ir+|ha<7$z91)E>V~Y!{ z*|A2O-^H;rY!?&_Zl@THetvJF@Tiy5P1bPOMXKa#?bc*m5tMVSb^-*4tMn=lBfRqc zgZ!00QjM8#*Qx|2ytz2NMdLJ}=NFmgmr++6pOWV|+X(m-$DCQYLXZgf3RE?VvK}aU zA71W{cdmb3&g>u7HCQrRYBTL3b|jCVK9;U!=hmMSmO_dbnd5*~&GGOk_n$}ydU&!s zM+Vu_@3A(GCQZz_wIHu!8*Y!t*}Ub;5uRJ>QQz~ahmC&5%a@Wul$%#1@LLG+J(NHn z3Y2P5gVzi{_gJ!a&tGP^J6PQsid981*fe)7Ky)gLGR87vDX$1x3LtGF4L)waU<`uRsf{)BUC+y_Q>3)RJp^0@6a_`wdkYCkXX}lw zw}QSGZQ3Vwk*9LcXtY$m$9_2=pr?OQ`D&PWf~^jI8{R2y+${Az6H|zQ2eU-rIE-@` z1*dLAU_?cm8i_;iImP-t^@0O-@}kvJMvdE-AvV8URcrD+wv&Y7cD4JE9er!jP+6kB zu_KDTBZ0Vr!J;kPd8g_7)6(ngtNKc4^itG3MbMco^TCz{#?k?0ZXn#qnDg^unq8-qKUGcnT~u^$ z6aXXm#g7!r(-W?y^vNqNelt|d@x4rB^~^4tO|HxLZLF)D(!r{(?e@o}<4jpaJ)rGa zsyardYWy3OdN!$WQO^*{#K3gKfIiY(M_5wwNsWRUZQ>d{+y;k!%G}poVOw-a zF*~568iVU|h_4f#SyIHuT&MVXOIr&Bu=4+Pbq3)DAn*wXFlhVcI{s)d3|e~w!j=H* z9oT7KPc_n8DX=W;CaYP#PK>n|yz_xG;U-d|k^RnT+6QpQ3OZd^s*Px1$|rQcvNl_m z_McHOoqk^Ljzx{r3o3G}Uac5i|HDSgoc#_eVbiSzNquf68DsIp{s0mX-#0o6;NR0Z zq5l}OyT)&|+h||lZ%zRw_`7RkmcQ&|`(&oMm#CYnjAte%F-t1(PN=bEHtBXuH!JZM zDk7=?(E>Qn1~REIzd5{9r#VKOXpS7(YT++}phi$Zzgi*@<0Kotrh#FaQk)+Ei{F;$ z|Lxm$GD7t*&x7UjGsz({)N%MXvkqMEyOB-6_=NfFi;6O{Af1+9Ixn&AU23MT;tojS zrQw){W+5?%$3A(x{|H-lyG@uCo4{%C+N4v2*`md}#b$7A+1bhfvaClqfR1s(`dheL zhO@?ruq~hk%*rF5kl0oK&q(3LzCPvA9?5(Bn62nlYX+6DzIvpr=TcALTu3Y=1k>8LVsVMq@`yIGQ@o&9aIE zurb<4>`_FH$Ubhx%#N{fJAWdnPLC7^hmX0FF9jPxTesPu>`f0TaPRfAj_Qcf2$IO4 zeIhhrke@`Lk`B=rI#N7`ur#e7xx>`nY%~UUI79fW~X|ko!#wh1}9B*Rh{l%N${9 zu-+A1(#OUp8bYKIh{^@9VqLC7@H2A+yFA}60&c!Cxj<*q!AWDoiscv9eI)-PV8nR^w8o`N7fVSC8{trPul@a}Gq?jZC9EM8*MKOi7Mm0_=;xKy;!+hRu5h zXGlMkX^i)|Q6Zvdkp_OW+Wfr)V8_2Q6$r}48?Ra&0xPCvOnzTvL0c*u z_6ft%5TE*-{EQtKp)sVUd2H_P;%xw$h`nFDH?BJ@@XJNRtxW*Drofa;IR=91jF0f}B#A%kRS(S^IPg;d`rcE+Z zZno!Pb0n3)d;@8(vmJ~RM2cTuMtHCqla+Vs5OD#S51x-KKmKjCD~!~~uHNW}r8&Xw zwD4;2QxnG3MP5hN@pvrD!xeC?^d_+2P&zeQt7bP5WQ&-tq9u2)izwT-;-_W&DbiRZ zxrCtUO-*|(j@*MN`8^H_W#?G}ta-`gHOuttdexU*!vTYdm6XXA?dIthfw{QPNF^F{ z((E)7kj`1|oIKU6guv5%XP(rLO|;ZAra(vsPgkTyTQY4tiNam8$-O!>Mym7Tbs|u< zw!Qp@!JG>(G=KyY353Kw$nXn~Y-u~fpMiq?!xIkHmN7zzPD^%=r!^Z-zk_!*ch{EK z7f;<@RnmmH=w+o+I~S+lB#SvEzw2=fiID=(#)Lmx=lvMmm3|=*2@Jhwwb3I1&TnpR zYx=A(6ZDC1Sc7>U#cBieZdF0?x%P#_G9q%9G6fue^K!&=YJNm6#i?qksHIFAas4Fs z!orD@Zh4p(%&-OHk%t+{8-F9WD~M1krnXnx-Nr7W+;K9EPj;6Bh4-D%u(Ro%n%hfx zkE|0mj~hh~nsd)b4R4Z7O*{Q7Z~wj0bADc>$i{V)PVLIXUZwPP&(An=H;{VX`z|?G z`zS~q#e2XwttcM2^3#6qQj5H3C5|RjWy53iptqi zx!9*%H%v503CBD2AdM_z+AK1PPjNBYr)7H;pAScN+ZKtV)Qye%Vp`97|Mk$(r#tZP z_{9%$Ye_?5Z!k>cfH#X1QFLNokfO=5DCZEjzUSa75k)&f2<~HR%Ak@%QQawqLOybr zs%N@c%t~*Sp|oTR=F^)#8i4<2Q3aFo;1;{qs%Z9(ORVK2vHZ1r)DMMm zocn}2N@FYrc$|Mv@po!m8nx&z$T;htC%W7rc)S}=SiCicVZ2ok-;v_s*!mJ3v!Y@- zaR#I^IB0B`ulE;sRRr8OBdyk2-It!8lS~@cLA4>YRJ}mo(3<+*iy#J!2_M5$Q(1GQ zVx-1UeU%CjW)gy-_zO#`_8#>(Vri7(SI43Ws@gdmR|*>X?XRtIWRmQ;6yq09hQC+= zlJljP@KuX)1_`#~0%LSeNZZh?w%bZr80<7pAP(M?&iNM;=|QuFNN`0)*L;2LQXG1!FlC5PjF$k1}*7i zxDv3l8!y*57>^AzolTmR%tH3N@7~YFxrinMa=^Oor^bdzJPSQWkkds*`FPxLEpPp@OP-1?Tp$^Gh zgq&yMu6{D;%jS+*mZzdFeOishiBt`T7;)__@-Q@$o@f|1&2E5Pqi|L$o;JnZ(?nx zJZ%^DK#jQ2(Lx1dv=ba5;(h>MuL^k&XYS(}rq#xWwx4WcEPLf{XU^^-sD~90GgWy! zHF}BJ@MErB8)|59HQQ;vD}9~DCP$w}k` zX@`yf0e)P-SJrmnB45k7%+xkMf9$p`hC9m^gFs1W{T_-EjyOHdEjpMqgqF&48WYO) zH;p29k6z1Xg3sJetBq)P4cG+(Jla@$Cpl(ANQDokchRh+&8TmOHSv(3W=LNW5^)C& ztKODAM*U8wtyTwxsGkQqdK&{>z6%)sT8Un0a2r}Z3v>7gteUl|Px+9#CzJ&phWMi^ zQNYkfX;ke^4DEIbs_Lyix0!^uQr)9!L{`shcSKnz6is2OkE-rVgToMu>UY;}@qA-d z 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%0AsSy^7JwNm|))=5zAnwpiJ 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%0Ai-m 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 X|6TC+q0;`#PV~Qp{X4y3wl(q(HW^X_ literal 0 HcmV?d00001 From c289ad9471778ac8f1189644c425c6af3af5a582 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 06:08:48 -0400 Subject: [PATCH 58/99] forgot to include upward arrow image --- doc/utils/sphinx-config/_static/up.png | Bin 0 -> 203 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/utils/sphinx-config/_static/up.png diff --git a/doc/utils/sphinx-config/_static/up.png b/doc/utils/sphinx-config/_static/up.png new file mode 100644 index 0000000000000000000000000000000000000000..2a940a7da7c14e6a36901e83306849ba7efad4d4 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CV9FzhEy=Fov?Lbi-SbV{M7eb zSgRCN7I%METfw=?;;+>WH3cj0g7WUX+WNUO*ZcGT`ytIgVd8OSIh$j5tP~Z0O{ng4 zcW5}i$^L-SndMiXU*q89_#FKDQg!+}n Date: Sat, 22 Mar 2025 11:15:26 -0400 Subject: [PATCH 59/99] improve wording --- doc/src/Howto_bulk2slab.rst | 135 ++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 61 deletions(-) diff --git a/doc/src/Howto_bulk2slab.rst b/doc/src/Howto_bulk2slab.rst index 58d22f8037..cd167b1403 100644 --- a/doc/src/Howto_bulk2slab.rst +++ b/doc/src/Howto_bulk2slab.rst @@ -3,62 +3,74 @@ Convert a bulk system to a slab system ====================================== A regularly encountered simulation problem is how to convert a bulk -system that has been run for a while into a slab system with some vacuum -space. The challenge here is that one cannot just change the box -dimensions with the :doc:`change_box command ` because some -atoms will have non-zero image flags. Changing the box dimensions -results in an undesired displacement of those atoms, since the image -flags indicate how many times the box length in x-, y-, or z-direction -needs to be added or subtracted to get the "unwrapped" coordinates. +system that has been run for a while to equilibrate into a slab system +with some vacuum space. The challenge here is that one cannot just +change the box dimensions with the :doc:`change_box command +` or edit the box boundaries in a data file because some +atoms will have non-zero image flags from diffusing around. Changing +the box dimensions results in an undesired displacement of those atoms, +since the image flags indicate how many times the box length in x-, y-, +or z-direction needs to be added or subtracted to get the "unwrapped" +coordinates. By changing the box dimension this distance is changed and +thus those atoms move unphysically relative to their neighbors with zero +image flags. Setting image flags forcibly to zero creates problems because +that could break apart molecules by have one atom of a bond on the top +of the system and the other at the bottom. +.. _bulk2slab: .. figure:: JPG/rhodo-both.jpg :figwidth: 80% :figclass: align-center Snapshots of the bulk Rhodopsin system (right) and the slab geometry (left) -Below is a suggested workflow that can be applied to the :doc:`Rhodopsin -benchmark input `. The modifications to the ``in.rhodo`` -input file are discussed below. The first lines up to and including the -:doc:`read_data command ` remain unchanged. Then we insert -the following lines to add vacuum to the z direction above and below -the system: +Below is a suggested workflow using the :doc:`Rhodopsin benchmark input +` for demonstration. The figure shows the state before on +the left (with unwrapped atoms that have diffused out of the box) and +after on the right (with the vacuum added above and below). The process +is done by modifying the ``in.rhodo`` input file. The first lines up to +and including the :doc:`read_data command ` remain unchanged. +Then we insert the following lines to add vacuum to the z direction +above and below the system: .. code-block:: LAMMPS variable delta index 10.0 reset_atoms image all write_dump all custom rhodo-unwrap.lammpstrj id xu yu zu - change_box all z final $(zlo-2.0*v_delta) $(zhi+2.0*v_delta) - set atom * image NULL NULL 0 + change_box all z final $(zlo-2.0*v_delta) $(zhi+2.0*v_delta) & + boundary p p f read_dump rhodo-unwrap.lammpstrj 0 x y z box no replace yes - change_box all boundary p p f kspace_modify slab 3.0 -The :doc:`variable delta ` (set to :math:`10 \AA`) represents -a distance that determines the amount of vacuum added: we add twice its -value in each direction to the z-dimension so in total :math:`40 \AA` -get added. The :doc:`reset_atoms image all ` command shall -reset any image flags to become either 0 or :math:`\pm 1`. +Specifically, the :doc:`variable delta ` (set to :math:`10 +\AA`) represents a distance that determines the amount of vacuum added: +we add twice its value in each direction to the z-dimension; thus in +total :math:`40 \AA` get added. The :doc:`reset_atoms image all +` command shall reset any image flags to become either 0 or +:math:`\pm 1` and thus have the minimum distance from the center of the +simulation box, but the correct relative distance for bonded atoms. The :doc:`write_dump command ` then writes out the resulting -"unwrapped" coordinates of the system. After expanding the box, coordinates -that were outside the box should now be inside. +*unwrapped* coordinates of the system. After expanding the box, +coordinates that were outside the box should now be inside and the +unwrapped coordinates will become "wrapped", while atoms outside the +periodic boundaries will be wrapped back into the box and their image +flags in those directions restored. -The first :doc:`change_box command ` adds the desired -distance to the low and high box boundary in z-direction as thus will -create an undesired displacement for the atoms with non-zero image -flags. With the :doc:`set command ` the image flags in z-direction -will be set to zero while preserving the values in x- and y-direction. +The :doc:`change_box command ` adds the desired +distance to the low and high box boundary in z-direction and then changes +the :doc:`boundary to "p p f" ` which will force the image +flags in z-direction to zero and create an undesired displacement for +the atoms with non-zero image flags. With the :doc:`read_dump command ` we read back and replace partially incorrect coordinates with the previously saved, unwrapped coordinates. It is important to ignore the box dimensions stored in the -dump file. We want to preserve the expanded box. At this point it is -also possible to change the periodicity in z-direction with the second -:doc:`change_box command ` and turn on the slab correction -to the PPPM long-range solver with the :doc:`kspace_modify command -`. +dump file. We want to preserve the expanded box. Finally, we turn on +the slab correction for the PPPM long-range solver with the +:doc:`kspace_modify command ` as required when using a +long range Coulomb solver for non-periodic z-dimension. Next we replace the :doc:`fix npt command ` with: @@ -67,18 +79,17 @@ Next we replace the :doc:`fix npt command ` with: fix 2 nvt temp 300.0 300.0 10.0 We now have an open system and thus the adjustment of the cell in -z-direction is no longer required. Since the splitting of the bulk -system where the vacuum is inserted, we reduce the thermostat time -constant from 100.0 to 10.0 to remove excess kinetic energy resulting -from that change faster. +z-direction is no longer required. Since splitting of the bulk where +the vacuum is inserted, creates surface atoms with high potential +energy, we reduce the thermostat time constant from 100.0 to 10.0 to +remove excess kinetic energy resulting from that change faster. -Since atoms and molecules at the interface will experience a large -change in potential energy due to the box expansion, and thus it is -possible that some of them will be ejected from the slab. In order to -suppress that, we add soft harmonic walls to push back any atoms that -want to leave the slab. To determine the position of the wall, we -first need to to determine the extent of the atoms in z-direction -and then place the harmonic walls based on that information: +Also the high potential energy of the surface atoms can cause that some +of them are ejected from the slab. In order to suppress that, we add +soft harmonic walls to push back any atoms that want to leave the slab. +To determine the position of the wall, we first need to to determine the +extent of the atoms in z-direction and then place the harmonic walls +based on that information: .. code-block:: LAMMPS @@ -91,16 +102,17 @@ and then place the harmonic walls based on that information: The two :doc:`compute reduce ` command determine the minimum and maximum z-coordinate across all atoms. In order to trigger -the compute commands we need to "consume" them. This is done with the -:doc:`thermo_style custom ` command followed by the -:doc:`run 0 ` command. This enables using the min/max values -determined by the compute commands to compute the location of the wall -in lower and upper direction. This uses the previously defined *delta* -variable to determine the distance of the wall from the extent of the -system and the cutoff for the wall interaction. This way only atoms -that move beyond the min/max values in z-direction will experience a -restoring force. The force constant of :math:`10.0 -\frac{\mathrm{kcal/mol}}{\AA}` was determined empirically. +the execution of the compute commands we need to "consume" them. This +is done with the :doc:`thermo_style custom ` command +followed by the :doc:`run 0 ` command. This avoids and error +accessing the min/max values determined by the compute commands to +compute the location of the wall in lower and upper direction. This +uses the previously defined *delta* variable to determine the distance +of the wall from the extent of the system and the cutoff for the wall +interaction. This way only atoms that move beyond the min/max values in +z-direction will experience a restoring force, nudging them back to the +slab. The force constant of :math:`10.0 \frac{\mathrm{kcal/mol}}{\AA}` +was determined empirically. Finally, we replace the :doc:`run 100 ` of the original input with: @@ -116,10 +128,11 @@ Finally, we replace the :doc:`run 100 ` of the original input with: This runs the system converted to a slab first for 1000 MD steps using the walls and stronger Nose-Hoover thermostat. Then the walls are -removed and the thermostat time constant reset to 100.0 and the system -run for another 1000 steps. Finally the resulting slab geometry is -written to a new data file ``data.rhodo-slab`` with a :doc:`write_data -command `. The number of MD steps required to reach a -proper equilibrium state is very likely larger. The number of 1000 -steps (corresponding to 2 picoseconds) was chosen for demonstration -purposes, so that the procedure can be easily and quickly tested. +removed with :doc:`unfix 3 ` and the thermostat time constant +reset to 100.0 and the system run for another 1000 steps. Finally the +resulting slab geometry is written to a new data file +``data.rhodo-slab`` with a :doc:`write_data command `. The +number of MD steps required to reach a proper equilibrium state is very +likely larger. The number of 1000 steps (corresponding to 2 +picoseconds) was chosen for demonstration purposes, so that the +procedure can be easily and quickly tested. From 8a0900f0ab1e80aaade0c9f2f3e10de0f0e9b4c4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 15 Mar 2025 21:17:00 -0400 Subject: [PATCH 60/99] revert broken change to print angstrom character --- doc/utils/sphinx-config/conf.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/utils/sphinx-config/conf.py.in b/doc/utils/sphinx-config/conf.py.in index 12e5c57f78..073143a7e9 100644 --- a/doc/utils/sphinx-config/conf.py.in +++ b/doc/utils/sphinx-config/conf.py.in @@ -288,7 +288,7 @@ rst_prolog = r""" .. only:: html - :math:`\renewcommand{\AA}{\textup{\r{A}}` + :math:`\renewcommand{\AA}{\text{â„«}}` .. role:: lammps(code) :language: LAMMPS From cb5e45ff1f7822165f023e43baf8f77900b67217 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 11:24:53 -0400 Subject: [PATCH 61/99] small tweaks --- doc/src/Howto_bulk2slab.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/src/Howto_bulk2slab.rst b/doc/src/Howto_bulk2slab.rst index cd167b1403..56de49d299 100644 --- a/doc/src/Howto_bulk2slab.rst +++ b/doc/src/Howto_bulk2slab.rst @@ -1,6 +1,6 @@ -====================================== -Convert a bulk system to a slab system -====================================== +=========================== +Convert bulk system to slab +=========================== A regularly encountered simulation problem is how to convert a bulk system that has been run for a while to equilibrate into a slab system @@ -43,10 +43,10 @@ above and below the system: read_dump rhodo-unwrap.lammpstrj 0 x y z box no replace yes kspace_modify slab 3.0 -Specifically, the :doc:`variable delta ` (set to :math:`10 -\AA`) represents a distance that determines the amount of vacuum added: -we add twice its value in each direction to the z-dimension; thus in -total :math:`40 \AA` get added. The :doc:`reset_atoms image all +Specifically, the :doc:`variable delta ` (set to 10.0) +represents a distance that determines the amount of vacuum added: we add +twice its value in each direction to the z-dimension; thus in total +:math:`40 \AA` get added. The :doc:`reset_atoms image all ` command shall reset any image flags to become either 0 or :math:`\pm 1` and thus have the minimum distance from the center of the simulation box, but the correct relative distance for bonded atoms. From 12cc12b4f49a59d6af3ea2e3d2f6097ecf1d8c3e Mon Sep 17 00:00:00 2001 From: jtclemm Date: Sat, 22 Mar 2025 12:57:28 -0600 Subject: [PATCH 62/99] Typos and alternate wording suggestions --- doc/src/Build_manual.rst | 4 +-- doc/src/Errors_details.rst | 58 ++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index 4993aa53a0..dea98e9b61 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -223,7 +223,7 @@ This translation uses `Pandoc `_ instead of Sphinx and thus all special Sphinx features (cross-references, advanced tables, embedding of Python docstrings or doxygen documentation, and so on) will not render correctly. Most embedded math should render correctly. This -is a **very fast** way to check the syntaxs and layout of documentation +is a **very fast** way to check the syntaxes and layout of documentation as HTML while writing the documentation. To translate **all** manual pages, you can type ``make fasthtml`` at the @@ -236,7 +236,7 @@ directly translate only individual pages: e.g. to translate only the After writing the documentation is completed, you will still need to verify with ``make html`` and ``make pdf`` that it translates -correctly in the actual translations used for download and online +correctly in the actual translations used for downloaded and online documentation. Tests for consistency, completeness, and other known issues diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index ae731a316b..a5b4d088f0 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -2,14 +2,12 @@ Errors and warnings details =========================== Many errors and warnings that LAMMPS outputs are self-explanatory and -thus straightforward to resolve. However, there are also cases, where -there is no single cause and explanation. LAMMPS can only detect -symptoms of an error but not name the exact cause, or the explanation -needs to be more detailed than what can be fit into a short message -printed by the program. The following are discussions of such cases; -first on a more general level and then for specific cases. In the -latter cases, LAMMPS will output a short message and then provide -a URL that links to a specific section on this page. +thus straightforward to resolve. However, there are also cases where +there is no single cause or simple explanation that can be provided in a +short message printed by LAMMPS. Therefore, more detailed discussions of +such scenarios are provided here; first on a more general level and then for +specific errors. In the latter cases, LAMMPS will output a short message +and then provide a URL that links to a specific section on this page. .. contents:: @@ -375,14 +373,14 @@ warning or turned off using the *lost/bond* keyword in the :doc:`thermo_modify Non-numeric atom coords or pressure or box dimensions - simulation unstable --------------------------------------------------------------------------- -This kind of error usually occurs due to issues with system geometry or -the potential in use, or too aggressive simulation settings. See -:ref:`Pressure, forces, positions becoming NaN or Inf ` above in -the general troubleshooting section. It is more likely to happen during +This error usually occurs due to overly aggressive simulation settings or +issues with the system geometry or the potential. See :ref:`Pressure, +forces, positions becoming NaN or Inf ` above in the general +troubleshooting section. This error is more likely to happen during equilibration, so it can help to do a minimization before or even add a second or third minimization after running a few equilibration MD steps. -It also is more likely when using a Nose-Hoover barostat directly, and -thus it may be advisable to run with only a thermostat for a bit until +It also is more likely when directly using a Nose-Hoover (or other) barostat, +and thus it may be advisable to run with only a thermostat for a bit until the potential energy has stabilized. .. _err007: @@ -409,7 +407,7 @@ causes. By default, LAMMPS checks for whether the total number of atoms is consistent with the sum of atoms "owned" by MPI processors every time that thermodynamic output is written. In the majority of cases, lost atoms are unexpected and a result of extremely high velocities causing -instabilities in the system, and those velocities can result from a +instabilities in the system. Such velocities can result from a variety of issues. For ideas on how to track down issues with unexpected lost atoms, see :ref:`Fast moving atoms ` and :ref:`Neighbor list settings ` in the general troubleshooting @@ -427,11 +425,11 @@ Too many neighbor bins The simulation box is or has become too large relative to the size of a neighbor bin (which in turn depends on the largest pair-wise cutoff by -default) and LAMMPS is unable to store the needed number of bins. This +default) such that LAMMPS is unable to store the needed number of bins. This typically implies the simulation box has expanded too far. That can -happen when some atoms move rapidly apart with shrink-wrap boundaries or +occur when some atoms move rapidly apart with shrink-wrap boundaries or when a fix (like fix deform or a barostat) excessively grows the -simulation box. This can also happen, if the largest pair-wise cutoff +simulation box. This can also happen if the largest pair-wise cutoff is small. In this case, the error can be avoided by using the :doc:`neigh_modify command ` to set the bin width to a suitably large value. @@ -448,11 +446,11 @@ the relevant Makefile or CMake build directory. See :doc:`Section 3. Build LAMMPS ` for more details. One can check if the expected package and pair style is present in the executable by running it with the ``-help`` (or ``-h``) flag on the command line. One -common oversight, especially for beginner LAMMPS users, is to enable the -package, but to forget to run commands to rebuild (e.g., to run the +common oversight, especially for beginner LAMMPS users, is enabling the +package but forgetting to run commands to rebuild (e.g., to run the final ``make`` or ``cmake`` command). -If this error is occurring with an executable that the user does not control +If this error occurs with an executable that the user does not control (e.g., through a module on HPC clusters), the user will need to get in contact with the relevant person or people who can update the executable. @@ -461,14 +459,14 @@ with the relevant person or people who can update the executable. Energy or stress was not tallied by pair style ---------------------------------------------- -This warning will be printed by computes from the :ref:`TALLY package -`. Those use a callback mechanism that will only work for +This warning can be printed by computes from the :ref:`TALLY package +`. Those use a callback mechanism that only work for regular pair-wise additive pair styles like :doc:`Lennard-Jones `, :doc:`Morse `, :doc:`Born-Meyer-Huggins -`, and similar. Making these computes work for many-body -potentials will require to implement similar callbacks suitable for such -potentials, which has not been done (and may be difficult to do in a -generic fashion). Whether this warning indicates that contributions to +`, and similar. Such required callbacks have not been +implemented for many-body potentials so one would have to implement them +to add compatiability with these computes (which may be difficult to do in +a generic fashion). Whether this warning indicates that contributions to the computed properties are missing depends on the groups used. At any rate, careful testing of the results is advised when this warning appears. @@ -918,7 +916,7 @@ the documentation carefully. XXX command before simulation box is defined -------------------------------------------- -This error happens, when trying to excute a LAMMPS command that requires +This error occurs when trying to excute a LAMMPS command that requires information about the system dimensions, or the number atom, bond, angle, dihedral, or improper types, or the number of atoms or similar data that is only available *after* the simulation box has been created. @@ -930,8 +928,8 @@ created ` for additional information. XXX command after simulation box is defined -------------------------------------------- -This error happens, when trying to excute a LAMMPS command that that -changes a global setting that will be locked in when the simulation box +This error occurs when trying to excute a LAMMPS command that +changes a global setting that is locked in when the simulation box is created (for instance defining the :doc:`atom style `, :doc:`dimension `, :doc:`newton `, or :doc:`units ` setting). These settings may only be changed *before* the From 6f24e1edd5b58460ff92894443ea83f8f5ec1814 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 15:42:51 -0400 Subject: [PATCH 63/99] remove leftover pieces of obsolete warning --- doc/src/Errors_warnings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Errors_warnings.rst b/doc/src/Errors_warnings.rst index c99b3f6b7c..3f18ddd2ca 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -609,7 +609,7 @@ Please also see the page with :doc:`Error messages ` assumed to also be for all atoms. Thus the pressure printed by thermo could be inaccurate. -*The fix ave/spatial command has been replaced by the more flexible fix ave/chunk and compute chunk/atom commands -- fix ave/spatial will be removed*The minimizer does not re-orient dipoles when using fix efield* +*The minimizer does not re-orient dipoles when using fix efield* This means that only the atom coordinates will be minimized, not the orientation of the dipoles. From f4b92a23ae79e793c08db5dc09c103fce6ab1188 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 15:47:52 -0400 Subject: [PATCH 64/99] small clarification cherry-picked from PR #4502 --- doc/src/Build_manual.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index dea98e9b61..2fc29f584b 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -223,8 +223,8 @@ This translation uses `Pandoc `_ instead of Sphinx and thus all special Sphinx features (cross-references, advanced tables, embedding of Python docstrings or doxygen documentation, and so on) will not render correctly. Most embedded math should render correctly. This -is a **very fast** way to check the syntaxes and layout of documentation -as HTML while writing the documentation. +is a **very fast** way to check the syntax and layout of a documentation +file translated to HTML while writing or updating it. To translate **all** manual pages, you can type ``make fasthtml`` at the command line. The translated HTML files are then in the ``fasthtml`` @@ -236,8 +236,7 @@ directly translate only individual pages: e.g. to translate only the After writing the documentation is completed, you will still need to verify with ``make html`` and ``make pdf`` that it translates -correctly in the actual translations used for downloaded and online -documentation. +correctly in both formats. Tests for consistency, completeness, and other known issues ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ From c65c8819e3879406210536f6325cfe8dde3558be Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 16:06:17 -0400 Subject: [PATCH 65/99] cosmetic changes and re-wrap paragraphs --- doc/src/Errors_details.rst | 619 +++++++++++++++++++------------------ 1 file changed, 317 insertions(+), 302 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index a5b4d088f0..9ca69c5068 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -4,10 +4,11 @@ Errors and warnings details Many errors and warnings that LAMMPS outputs are self-explanatory and thus straightforward to resolve. However, there are also cases where there is no single cause or simple explanation that can be provided in a -short message printed by LAMMPS. Therefore, more detailed discussions of -such scenarios are provided here; first on a more general level and then for -specific errors. In the latter cases, LAMMPS will output a short message -and then provide a URL that links to a specific section on this page. +short message printed by LAMMPS. Therefore, more detailed discussions +of such scenarios are provided here; first on a more general level and +then for specific errors. In the latter cases, LAMMPS will output a +short message and then provide a URL that links to a specific section on +this page. .. contents:: @@ -76,13 +77,13 @@ simulation settings. For time critical code paths, LAMMPS will assume the user has chosen the settings carefully and will not make any checks to avoid to avoid performance penalties. -A crucial step in resolving a segmentation fault is to identify the exact -location in the code where it happens. Please see `Errors_debug` for -a couple of examples showing how to do this on a Linux machine. With -this information -- a simple way to reproduce the segmentation fault and -the exact :doc:`LAMMPS version ` and platform you are -running on -- you can contact the LAMMPS developers or post in the LAMMPS -forum to get assistance. +A crucial step in resolving a segmentation fault is to identify the +exact location in the code where it happens. Please see `Errors_debug` +for a couple of examples showing how to do this on a Linux machine. +With this information -- a simple way to reproduce the segmentation +fault and the exact :doc:`LAMMPS version ` and platform +you are running on -- you can contact the LAMMPS developers or post in +the LAMMPS forum to get assistance. .. _hint05: @@ -92,55 +93,57 @@ Fast moving atoms Fast moving atoms may be "lost" or "missing" when their velocity becomes so large that they can cross a sub-domain within one timestep. This often happens when atoms are too close, but atoms may also "move" too -fast from sub-domain to sub-domain if the box changes rapidly. E.g. when -setting a large an initial box with :doc:`shrink-wrap boundary +fast from sub-domain to sub-domain if the box changes rapidly. +E.g. when setting a large an initial box with :doc:`shrink-wrap boundary conditions ` that collapses on the first step (in this case the solution is often using 'm' instead of 's' as a boundary condition). To reduce the impact of "close contacts", one can remove those atoms or molecules with something like :doc:`delete_atoms overlap 0.1 all all -`. With periodic boundaries, a close contact pair of atoms -may be on opposite sides of the simulation box. Another option would be -to first run a minimization (aka quench) before starting the MD. Reducing -the time step can also help. Many times, one just needs to "ease" the -system into a balanced state and can then switch to more aggressive settings. +`. With periodic boundaries, a close contact pair of +atoms may be on opposite sides of the simulation box. Another option +would be to first run a minimization (aka quench) before starting +the MD. Reducing the time step can also help. Many times, one just +needs to "ease" the system into a balanced state and can then switch to +more aggressive settings. The speed of atoms during an MD run depends on the steepness of the potential function and their mass. Since the positions and velocities of atoms are computed with finite timesteps, the timestep needs to be -small enough for stable numeric integration of the trajectory. If the timestep -is too large during initialization (or other instances of extreme dynamics), -using :doc:`fix nve/limit ` or :doc:`fix dt/reset ` -temporarily can help to avoid too large updates or adapt the timestep according -to the displacements. +small enough for stable numeric integration of the trajectory. If the +timestep is too large during initialization (or other instances of +extreme dynamics), using :doc:`fix nve/limit ` or +:doc:`fix dt/reset ` temporarily can help to avoid too +large updates or adapt the timestep according to the displacements. .. _hint06: Ignoring lost atoms ^^^^^^^^^^^^^^^^^^^ -It is tempting to use the :doc:`thermo_modify lost ignore ` -to avoid LAMMPS aborting with an error on lost atoms. This setting should, -however, *only* be used when atoms *should* leave the system. In general, -ignoring a problem does not solve it. +It is tempting to use the :doc:`thermo_modify lost ignore +` to avoid LAMMPS aborting with an error on lost atoms. +This setting should, however, *only* be used when atoms *should* leave +the system. In general, ignoring a problem does not solve it. .. _hint07: Pressure, forces, positions becoming NaN or Inf ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Some potentials can overflow or have a division by zero with close contacts -or bad geometries (for the given force styles in use) leading to forces -that can no longer be represented as numbers. Those will show as "NaN" or -"Inf". On most machines, the program will continue, but there is no way -to recover from it and those NaN or Inf values will propagate. So-called -:doc:`"soft-core" potentials ` or the :doc:`"soft" repulsive-only -pair style ` are less prone for this behavior (depending on the -settings in use) and can be used at the beginning of a simulation. Also, -single precision numbers can overflow much faster, so for the GPU or INTEL -package it may be beneficial to run with double precision initially before -switching to mixed or single precision for faster execution when the system -has relaxed. +Some potentials can overflow or have a division by zero with close +contacts or bad geometries (for the given force styles in use) leading +to forces that can no longer be represented as numbers. Those will show +as "NaN" or "Inf". On most machines, the program will continue, but +there is no way to recover from it and those NaN or Inf values will +propagate. So-called :doc:`"soft-core" potentials ` or +the :doc:`"soft" repulsive-only pair style ` are less prone +for this behavior (depending on the settings in use) and can be used at +the beginning of a simulation. Also, single precision numbers can +overflow much faster, so for the GPU or INTEL package it may be +beneficial to run with double precision initially before switching to +mixed or single precision for faster execution when the system has +relaxed. .. _hint08: @@ -150,17 +153,17 @@ Communication cutoff The communication cutoff determines the "overlap" between sub-domains and atoms in these regions are referred to in LAMMPS as "ghost atoms". This region has to be large enough to contain all atoms of a bond, -angle, dihedral, or improper with just one atom in the actual sub-domain. -Typically, this cutoff is set to the largest cutoff from the :doc:`pair -style(s) ` plus the :doc:`neighbor list skin distance -` and will typically be sufficient for all bonded +angle, dihedral, or improper with just one atom in the actual +sub-domain. Typically, this cutoff is set to the largest cutoff from +the :doc:`pair style(s) ` plus the :doc:`neighbor list skin +distance ` and will typically be sufficient for all bonded interactions. But if the pair style cutoff is small, this may not be enough. LAMMPS will print a warning in this case using some heuristic -based on the equilibrium bond length, but that still may not be sufficient -for cases where the force constants are small and thus bonds may be -stretched very far. The communication cutoff can be adjusted with -:doc:`comm_modify cutoff \ `, but setting this too -large will waste CPU time and memory. +based on the equilibrium bond length, but that still may not be +sufficient for cases where the force constants are small and thus bonds +may be stretched very far. The communication cutoff can be adjusted +with :doc:`comm_modify cutoff \ `, but setting this +too large will waste CPU time and memory. .. _hint09: @@ -205,12 +208,12 @@ In some cases -- especially when running in parallel with MPI -- LAMMPS may stop without displaying an error. But the fact that nothing was displayed does not mean there was not an error message. Instead it is highly likely that the message was written to a buffer and LAMMPS was -aborted before the buffer was output. Usually, output buffers are output -for every line of output, but sometimes this is delayed until 4096 or -8192 bytes of output have been accumulated. This buffering for screen -and logfile output can be disabled by using the :ref:`-nb or -nonbuf -` command-line flag. This is most often needed when debugging -crashing multi-replica calculations. +aborted before the buffer was output. Usually, output buffers are +output for every line of output, but sometimes this is delayed until +4096 or 8192 bytes of output have been accumulated. This buffering for +screen and logfile output can be disabled by using the :ref:`-nb +or -nonbuf ` command-line flag. This is most often needed when +debugging crashing multi-replica calculations. .. _hint12: @@ -229,7 +232,7 @@ defined. Very few commands can be used before and after, like Most LAMMPS commands must be used after the simulation box is created. Consequently, LAMMPS will stop with an error, if a command is used in -the wrong place. This is not always obvious. So index or string style +the wrong place. This is not always obvious. So index or string style :doc:`variables ` can be expanded anywhere in the input, but equal style (or similar) variables can only be expanded before the box is defined if they do not reference anything that cannot be defined @@ -252,13 +255,14 @@ The header section informs LAMMPS how many entries or lines are expected in the various sections (like Atoms, Masses, Pair Coeffs, *etc.*\ ) of the data file. If there is a mismatch, LAMMPS will either keep reading beyond the end of a section or stop reading before the section has -ended. In that case the next line will not contain a recognized keyword. +ended. In that case the next line will not contain a recognized +keyword. -Such a mismatch can also happen when the first line of the data -is *not* a comment as required by the format, but a line with a valid -header keyword. That would result in LAMMPS expecting, for instance, -0 atoms because the "atoms" header line is the first line and thus -treated as a comment. +Such a mismatch can also happen when the first line of the data is *not* +a comment as required by the format, but a line with a valid header +keyword. That would result in LAMMPS expecting, for instance, 0 atoms +because the "atoms" header line is the first line and thus treated as a +comment. Another possibility to trigger this error is to have a keyword in the data file that corresponds to a fix (e.g. :doc:`fix cmap `) @@ -274,15 +278,15 @@ Incorrect format in ... section of data file This error happens when LAMMPS reads the contents of a section of a :doc:`data file ` and the number of parameters in the line -differs from what is expected. This most commonly happens when the -atom style is different from what is expected for a specific data file -since changing the atom style usually changes the format of the line. +differs from what is expected. This most commonly happens when the atom +style is different from what is expected for a specific data file since +changing the atom style usually changes the format of the line. This error can also occur when the number of entries indicated in the header of a data file (e.g. the number of atoms) is larger than the number of lines provided (e.g. in the corresponding Atoms section) -causing LAMMPS to continue reading into the next section which has -a completely different format. +causing LAMMPS to continue reading into the next section which has a +completely different format. .. _err0003: @@ -290,98 +294,100 @@ Illegal variable command: expected X arguments but found Y ---------------------------------------------------------- This error indicates that a variable command has the wrong number of -arguments. A common reason for this is that the variable expression -has whitespace, but is not enclosed in single or double quotes. +arguments. A common reason for this is that the variable expression has +whitespace, but is not enclosed in single or double quotes. To explain, the LAMMPS input parser reads and processes lines. The resulting line is broken down into "words". Those are usually -individual commands, labels, names, and values separated by whitespace (a -space or tab character). For "words" that may contain whitespace, they -have to be enclosed in single (') or double (") quotes. The parser will -then remove the outermost pair of quotes and pass that string as +individual commands, labels, names, and values separated by whitespace +(a space or tab character). For "words" that may contain whitespace, +they have to be enclosed in single (') or double (") quotes. The parser +will then remove the outermost pair of quotes and pass that string as "word" to the variable command. Thus missing quotes or accidental extra whitespace will trigger this -error because the unquoted whitespace will result in the text being broken -into more "words", i.e. the variable expression being split. +error because the unquoted whitespace will result in the text being +broken into more "words", i.e. the variable expression being split. .. _err0004: Out of range atoms - cannot compute ... --------------------------------------- -The PPPM (and also PPPMDisp and MSM) methods need to assemble a grid -of electron density data derived from the (partial) charges assigned to -the atoms. These charges are smeared out across multiple grid points -(see :doc:`kspace_modify order `). When running in -parallel with MPI, LAMMPS uses a :doc:`domain decomposition scheme +The PPPM (and also PPPMDisp and MSM) methods need to assemble a grid of +electron density data derived from the (partial) charges assigned to the +atoms. These charges are smeared out across multiple grid points (see +:doc:`kspace_modify order `). When running in parallel +with MPI, LAMMPS uses a :doc:`domain decomposition scheme ` where each processor manages a subset of atoms and -thus also a grid representing the density. The processor's grid covers the -actual volume of the sub-domain and some extra space corresponding to the -:doc:`neighbor list skin `. These are then :doc:`combined and -redistributed ` for parallel processing of the -long-range component of the Coulomb interaction. +thus also a grid representing the density. The processor's grid covers +the actual volume of the sub-domain and some extra space corresponding +to the :doc:`neighbor list skin `. These are then +:doc:`combined and redistributed ` for parallel +processing of the long-range component of the Coulomb interaction. The ``Out of range atoms`` error can happen when atoms move too fast, the neighbor list skin is too small, or the neighbor lists are not updated frequently enough. The smeared charges cannot then be fully assigned to the density grid for all atoms. LAMMPS checks for this condition and stops with an error. Most of the time, this is an -indication of a system with very high forces, often at the beginning -of a simulation or when boundary conditions are changed. The -error becomes more likely with more MPI processes. +indication of a system with very high forces, often at the beginning of +a simulation or when boundary conditions are changed. The error becomes +more likely with more MPI processes. There are multiple options to explore for avoiding the error. The best choice depends strongly on the individual system, and often a combination of changes is required. For example, more conservative MD parameter settings can be used (larger neighbor skin, shorter time step, more frequent neighbor list updates). Sometimes, it helps to revisit -the system generation and avoid close contacts when building it. Otherwise -one can use the :doc:`delete_atoms overlap` command to delete -those close contact atoms or run a minimization before the MD. It can also -help to temporarily use a cutoff-Coulomb pair style and no kspace style -until the system has somewhat equilibrated and then switch to the -long-range solver. +the system generation and avoid close contacts when building it. +Otherwise one can use the :doc:`delete_atoms overlap` +command to delete those close contact atoms or run a minimization before +the MD. It can also help to temporarily use a cutoff-Coulomb pair style +and no kspace style until the system has somewhat equilibrated and then +switch to the long-range solver. .. _err0005: Bond (or angle, dihedral, improper, cmap, or shake) atoms missing ----------------------------------------------------------------- -The second atom needed to compute a particular bond (or the third or fourth -atom for angle, dihedral, or improper) is missing on the indicated timestep -and processor. Typically, this is because the two bonded atoms have become -too far apart relative to the communication cutoff distance for ghost atoms. -By default, the communication cutoff is set by the pair cutoff. However, to -accommodate larger distances between topologically connected atoms, it can -be manually adjusted using :doc:`comm_modify ` at the cost of -increased communication and more ghost atoms. However, missing bond atoms -may also indicate that there are unstable dynamics which caused the atoms -to blow apart. In this scenario, increasing the communication distance will -not solve the underlying issue. Rather, see :ref:`Fast moving atoms ` -and :ref:`Neighbor list settings ` in the general troubleshooting +The second atom needed to compute a particular bond (or the third or +fourth atom for angle, dihedral, or improper) is missing on the +indicated timestep and processor. Typically, this is because the two +bonded atoms have become too far apart relative to the communication +cutoff distance for ghost atoms. By default, the communication cutoff +is set by the pair cutoff. However, to accommodate larger distances +between topologically connected atoms, it can be manually adjusted using +:doc:`comm_modify ` at the cost of increased communication +and more ghost atoms. However, missing bond atoms may also indicate +that there are unstable dynamics which caused the atoms to blow apart. +In this scenario, increasing the communication distance will not solve +the underlying issue. Rather, see :ref:`Fast moving atoms ` and +:ref:`Neighbor list settings ` in the general troubleshooting section above for ideas to fix unstable dynamics. -If atoms are intended to be lost during a simulation (e.g. due to open boundary -conditions or :doc:`fix evaporate `) such that two bonded atoms -may be lost at different times from each other, this error can be converted to a -warning or turned off using the *lost/bond* keyword in the :doc:`thermo_modify -` command. +If atoms are intended to be lost during a simulation (e.g. due to open +boundary conditions or :doc:`fix evaporate `) such that +two bonded atoms may be lost at different times from each other, this +error can be converted to a warning or turned off using the *lost/bond* +keyword in the :doc:`thermo_modify ` command. .. _err0006: Non-numeric atom coords or pressure or box dimensions - simulation unstable --------------------------------------------------------------------------- -This error usually occurs due to overly aggressive simulation settings or -issues with the system geometry or the potential. See :ref:`Pressure, -forces, positions becoming NaN or Inf ` above in the general -troubleshooting section. This error is more likely to happen during -equilibration, so it can help to do a minimization before or even add a -second or third minimization after running a few equilibration MD steps. -It also is more likely when directly using a Nose-Hoover (or other) barostat, -and thus it may be advisable to run with only a thermostat for a bit until -the potential energy has stabilized. +This error usually occurs due to overly aggressive simulation settings +or issues with the system geometry or the potential. See +:ref:`Pressure, forces, positions becoming NaN or Inf ` above in +the general troubleshooting section. This error is more likely to +happen during equilibration, so it can help to do a minimization before +or even add a second or third minimization after running a few +equilibration MD steps. It also is more likely when directly using a +Nose-Hoover (or other) barostat, and thus it may be advisable to run +with only a thermostat for a bit until the potential energy has +stabilized. .. _err007: @@ -392,10 +398,10 @@ Many fix styles are invoked only every *nevery* timesteps, which means their data is only valid on those steps. When data from a fix is used as input for a compute, a dump, another fix, or thermo output, it must read that data at timesteps when the fix in question was invoked, i.e. -on timesteps that are multiples of its *nevery* setting. If this is -not the case, LAMMPS will stop with an error. To remedy this, it may -be required to change the output frequency or the *nevery* setting of -the fix. +on timesteps that are multiples of its *nevery* setting. If this is not +the case, LAMMPS will stop with an error. To remedy this, it may be +required to change the output frequency or the *nevery* setting of the +fix. .. _err0008: @@ -407,16 +413,15 @@ causes. By default, LAMMPS checks for whether the total number of atoms is consistent with the sum of atoms "owned" by MPI processors every time that thermodynamic output is written. In the majority of cases, lost atoms are unexpected and a result of extremely high velocities causing -instabilities in the system. Such velocities can result from a -variety of issues. For ideas on how to track down issues with -unexpected lost atoms, see :ref:`Fast moving atoms ` and -:ref:`Neighbor list settings ` in the general troubleshooting -section above. In specific situations however, losing atoms is expected -material behavior (e.g. with sputtering and surface evaporation -simulations) and an unwanted crash can be resolved by changing the -:doc:`thermo_modify lost ` keyword from the default -'error' to 'warn' or 'ignore' (though heed the advice in :ref:`Ignoring -lost atoms ` above!). +instabilities in the system. Such velocities can result from a variety +of issues. For ideas on how to track down issues with unexpected lost +atoms, see :ref:`Fast moving atoms ` and :ref:`Neighbor list +settings ` in the general troubleshooting section above. In +specific situations however, losing atoms is expected material behavior +(e.g. with sputtering and surface evaporation simulations), and an +unwanted crash can be avoided by changing the :doc:`thermo_modify lost +` keyword from the default 'error' to 'warn' or 'ignore' +(though heed the advice in :ref:`Ignoring lost atoms ` above!). .. _err0009: @@ -425,12 +430,12 @@ Too many neighbor bins The simulation box is or has become too large relative to the size of a neighbor bin (which in turn depends on the largest pair-wise cutoff by -default) such that LAMMPS is unable to store the needed number of bins. This -typically implies the simulation box has expanded too far. That can -occur when some atoms move rapidly apart with shrink-wrap boundaries or -when a fix (like fix deform or a barostat) excessively grows the -simulation box. This can also happen if the largest pair-wise cutoff -is small. In this case, the error can be avoided by using the +default) such that LAMMPS is unable to store the needed number of bins. +This typically implies the simulation box has expanded too far. That +can occur when some atoms move rapidly apart with shrink-wrap boundaries +or when a fix (like fix deform or a barostat) excessively grows the +simulation box. This can also happen if the largest pair-wise cutoff is +small. In this case, the error can be avoided by using the :doc:`neigh_modify command ` to set the bin width to a suitably large value. @@ -442,17 +447,18 @@ Unrecognized ... style ... is part of ... package which is not enabled in this L The LAMMPS executable (binary) being used was not compiled with a package containing the specified style. This indicates that the executable needs to be re-built after enabling the correct package in -the relevant Makefile or CMake build directory. See +the relevant Makefile or CMake build directory. See :doc:`Section 3. Build LAMMPS ` for more details. One can check if the expected package and pair style is present in the executable by -running it with the ``-help`` (or ``-h``) flag on the command line. One +running it with the ``-help`` (or ``-h``) flag on the command line. One common oversight, especially for beginner LAMMPS users, is enabling the package but forgetting to run commands to rebuild (e.g., to run the final ``make`` or ``cmake`` command). If this error occurs with an executable that the user does not control -(e.g., through a module on HPC clusters), the user will need to get in contact -with the relevant person or people who can update the executable. +(e.g., through a module on HPC clusters), the user will need to get in +contact with the relevant person or people who can update the +executable. .. _err011: @@ -460,13 +466,13 @@ Energy or stress was not tallied by pair style ---------------------------------------------- This warning can be printed by computes from the :ref:`TALLY package -`. Those use a callback mechanism that only work for -regular pair-wise additive pair styles like :doc:`Lennard-Jones -`, :doc:`Morse `, :doc:`Born-Meyer-Huggins -`, and similar. Such required callbacks have not been -implemented for many-body potentials so one would have to implement them -to add compatiability with these computes (which may be difficult to do in -a generic fashion). Whether this warning indicates that contributions to +`. Those use a callback mechanism that only work for regular +pair-wise additive pair styles like :doc:`Lennard-Jones `, +:doc:`Morse `, :doc:`Born-Meyer-Huggins `, and +similar. Such required callbacks have not been implemented for +many-body potentials so one would have to implement them to add +compatiability with these computes (which may be difficult to do in a +generic fashion). Whether this warning indicates that contributions to the computed properties are missing depends on the groups used. At any rate, careful testing of the results is advised when this warning appears. @@ -493,9 +499,10 @@ Substitution for illegal variable A variable in an input script or a variable expression was not found in the list of valid variables. The most common reason for this is a typo -somewhere in the input file such that the expression uses an invalid variable -name. The second most common reason is omitting the curly braces for a -direct variable with a name that is not a single letter. For example: +somewhere in the input file such that the expression uses an invalid +variable name. The second most common reason is omitting the curly +braces for a direct variable with a name that is not a single letter. +For example: .. code-block:: LAMMPS @@ -507,14 +514,13 @@ direct variable with a name that is not a single letter. For example: Another potential source of this error may be invalid command line variables (-var or -v argument) used when launching LAMMPS from an interactive shell or shell scripts. An uncommon source for this error -is using the :doc:`next command ` to advance through a list of values -provided by an index style variable. If there is no remaining element in -the list, LAMMPS will delete the variable and any following expansion or -reference attempt will trigger the error. +is using the :doc:`next command ` to advance through a list of +values provided by an index style variable. If there is no remaining +element in the list, LAMMPS will delete the variable and any following +expansion or reference attempt will trigger the error. -Users with harder-to-track variable errors might also find reading -:doc:`Section 5.2. Parsing rules for input scripts` -helpful. +Users with harder-to-track variable errors might also find reading the +:doc:`Parsing rules for input scripts ` helpful. .. _err0014: @@ -527,9 +533,9 @@ of the LAMMPS code where it updates the domain decomposition and before it builds the neighbor lists. It checks that both atoms of a bond are within the communication cutoff of a subdomain. It is usually caused by atoms moving too fast (see the :ref:`paragraph on fast moving atoms -`), or by the :doc:`communication cutoff being too -small `, or by waiting too long between :doc:`sub-domain -and neighbor list updates `. +`), or by the :doc:`communication cutoff being too small +`, or by waiting too long between :doc:`sub-domain and +neighbor list updates `. .. _err0015: @@ -537,41 +543,43 @@ Cannot use neighbor bins - box size \<\< cutoff ----------------------------------------------- LAMMPS is unable to build neighbor bins since the size of the box is -much smaller than an interaction cutoff in at least one of its dimensions. -Typically, this error is triggered when the simulation box has one very -thin dimension. If a cubic neighbor bin had to fit exactly within -the thin dimension, then an inordinate amount of bins would be created to -fill space. This error can be avoided using the generally slower -:doc:`nsq neighbor style ` or by increasing the size of the -smallest box lengths. +much smaller than an interaction cutoff in at least one of its +dimensions. Typically, this error is triggered when the simulation box +has one very thin dimension. If a cubic neighbor bin had to fit exactly +within the thin dimension, then an inordinate amount of bins would be +created to fill space. This error can be avoided using the generally +slower :doc:`nsq neighbor style ` or by increasing the size of +the smallest box lengths. .. _err0016: Did not assign all atoms correctly ---------------------------------- -This error happens most commonly when :doc:`reading a data file ` -under :doc:`non-periodic boundary conditions`. Only atoms with -positions **inside** the simulation box will be read and thus any atoms -outside the box will be skipped and the total atom count will not match, -which triggers the error. This does not happen with periodic boundary -conditions where atoms outside the principal box will be "wrapped" into -the principal box and their image flags set accordingly. +This error happens most commonly when :doc:`reading a data file +` under :doc:`non-periodic boundary conditions`. +Only atoms with positions **inside** the simulation box will be read and +thus any atoms outside the box will be skipped and the total atom count +will not match, which triggers the error. This does not happen with +periodic boundary conditions where atoms outside the principal box will +be "wrapped" into the principal box and their image flags set +accordingly. -Similar errors can happen with the :doc:`replicate command` or -the :doc:`read_restart command`. In these cases the cause -may be a problematic geometry, an insufficient communication cutoff, or -a bug in the LAMMPS source code. In these cases it is advisable to set -up :ref:`small test case ` for testing and debugging. This will -be required in case you need to get help from a LAMMPS developer. +Similar errors can happen with the :doc:`replicate command` +or the :doc:`read_restart command`. In these cases the +cause may be a problematic geometry, an insufficient communication +cutoff, or a bug in the LAMMPS source code. In these cases it is +advisable to set up :ref:`small test case ` for testing and +debugging. This will be required in case you need to get help from a +LAMMPS developer. .. _err0017: Domain too large for neighbor bins ---------------------------------- -The domain has become extremely large so that neighbor bins cannot -be used. Too many neighbor bins would need to be created to fill space. +The domain has become extremely large so that neighbor bins cannot be +used. Too many neighbor bins would need to be created to fill space. Most likely, one or more atoms have been blown a great distance out of the simulation box or a fix (like fix deform or a barostat) has excessively grown the simulation box. @@ -587,13 +595,13 @@ of bonds and hydrogen bonds can change due to chemical reactions. The default approach, however, assumes that these changes are not very large, so it allocates buffers for the current system setup plus a safety margin. This can be adjusted with the :doc:`safezone, mincap, -and minhbonds settings of the pair style `, but only to some -extent. When equilibrating a new system, or simulating a sparse system -in parallel, this can be difficult to control and become wasteful. A -simple workaround is often to break a simulation down in multiple -chunks. A better approach, however, is to compile and use the KOKKOS -package version of ReaxFF (you do not need a GPU for that, but can also -compile it in serial or OpenMP mode), which uses a more robust +and minhbonds settings of the pair style `, but only to +some extent. When equilibrating a new system, or simulating a sparse +system in parallel, this can be difficult to control and become +wasteful. A simple workaround is often to break a simulation down in +multiple chunks. A better approach, however, is to compile and use the +KOKKOS package version of ReaxFF (you do not need a GPU for that, but +can also compile it in serial or OpenMP mode), which uses a more robust memory allocation approach. .. _err0019: @@ -605,17 +613,17 @@ This error most commonly happens when setting force field coefficients with either the :doc:`pair_coeff `, the :doc:`bond_coeff `, the :doc:`angle_coeff `, the :doc:`dihedral_coeff `, or the :doc:`improper_coeff -` command. These commands accept type labels, -explicit numbers, and wildcards for ranges of numbers. If the numeric -value of any of these is outside the valid range (defined by the number -of corresponding types), LAMMPS will stop with this error. A few other -commands and styles also allow ranges of numbers and check -using the same method and thus print the same kind of error. +` command. These commands accept type labels, explicit +numbers, and wildcards for ranges of numbers. If the numeric value of +any of these is outside the valid range (defined by the number of +corresponding types), LAMMPS will stop with this error. A few other +commands and styles also allow ranges of numbers and check using the +same method and thus print the same kind of error. -The cause is almost always a typo in the input or a logic error -when defining the values or ranges. So one needs to carefully -review the input. Along with the error, LAMMPS will print the -valid range as a hint. +The cause is almost always a typo in the input or a logic error when +defining the values or ranges. So one needs to carefully review the +input. Along with the error, LAMMPS will print the valid range as a +hint. .. _err0020: @@ -627,7 +635,7 @@ per-atom vector or array provided by a compute or fix or atom-style or vector-style variable or data from a specific atom, an index in square brackets ("[ ]") (or two indices) must be provided to determine which element to access and it must be in a valid range or else LAMMPS would -access invalid data or crash with a segmentation fault. In the two most +access invalid data or crash with a segmentation fault. In the two most common cases, where this data is accessed, :doc:`variable expressions ` and :doc:`thermodynamic output `, LAMMPS will check for valid indices and stop with an error otherwise. @@ -645,34 +653,37 @@ properties at every step. Incorrect args for pair coefficients (also bond/angle/dihedral/improper coefficients) ------------------------------------------------------------------------------------- -The parameters in the :doc:`pair_coeff ` command for a specified -:doc:`pair_style ` have a missing or erroneous argument. The same -applies when seeing this error for :doc:`bond_coeff `, -:doc:`angle_coeff `, :doc:`dihedral_coeff `, or -:doc:`improper_coeff ` and their respective style commands when -using the MOLECULE or EXTRA-MOLECULE packages. The cases below describe -some ways to approach pair coefficient errors, but the same strategies -apply to bonded systems as well. +The parameters in the :doc:`pair_coeff ` command for a +specified :doc:`pair_style ` have a missing or erroneous +argument. The same applies when seeing this error for :doc:`bond_coeff +`, :doc:`angle_coeff `, :doc:`dihedral_coeff +`, or :doc:`improper_coeff ` and their +respective style commands when using the MOLECULE or EXTRA-MOLECULE +packages. The cases below describe some ways to approach pair +coefficient errors, but the same strategies apply to bonded systems as +well. -Outside of normal typos, this error can have several sources. In all cases, the -first step is to compare the command arguments to the expected format found in -the corresponding :doc:`pair_style ` page. This can reveal cases -where, for example, a pair style was changed, but the pair coefficients were not -updated. This can happen especially with pair style variants such as -:doc:`pair_style eam ` vs. :doc:`pair_style eam/alloy ` -that look very similar but accept different parameters (the latter 'eam/alloy' -variant takes element type names while 'eam' does not). +Outside of normal typos, this error can have several sources. In all +cases, the first step is to compare the command arguments to the +expected format found in the corresponding :doc:`pair_style +` page. This can reveal cases where, for example, a pair +style was changed, but the pair coefficients were not updated. This can +happen especially with pair style variants such as :doc:`pair_style eam +` vs. :doc:`pair_style eam/alloy ` that look very +similar but accept different parameters (the latter 'eam/alloy' variant +takes element type names while 'eam' does not). -Another common source of coefficient errors is when using multiple pair styles -with commands such as :doc:`pair_style hybrid `. Using hybrid pair -styles requires adding an extra "label" argument in the coefficient commands -that designates which pair style the command line refers to. Moreover, if -the same pair style is used multiple times, this label must be followed by -an additional numeric argument. Also, different pair styles may require -different arguments. +Another common source of coefficient errors is when using multiple pair +styles with commands such as :doc:`pair_style hybrid `. +Using hybrid pair styles requires adding an extra "label" argument in +the coefficient commands that designates which pair style the command +line refers to. Moreover, if the same pair style is used multiple +times, this label must be followed by an additional numeric argument. +Also, different pair styles may require different arguments. -This error message might also require a close look at other LAMMPS input files -that are read in by the input script, such as data files or restart files. +This error message might also require a close look at other LAMMPS input +files that are read in by the input script, such as data files or +restart files. .. _err0022: @@ -685,20 +696,20 @@ LAMMPS does *not* calculate these quantities when the forces are calculated on every timestep or iteration. Global quantities are only calculated when they are needed for :doc:`thermo ` output (at the beginning, end, and at regular intervals specified by the -:doc:`thermo ` command). Similarly, per-atom quantities are only -calculated if they are needed to write per-atom energy or virial to a -dump file. This system works fine for simple input scripts. However, +:doc:`thermo ` command). Similarly, per-atom quantities are +only calculated if they are needed to write per-atom energy or virial to +a dump file. This system works fine for simple input scripts. However, the many user-specified `variable`, `fix`, and `compute` commands that LAMMPS provides make it difficult to anticipate when a quantity will be -requested. In some use cases, LAMMPS will figure out that a quantity is +requested. In some use cases, LAMMPS will figure out that a quantity is needed and arrange for it to be calculated on that timestep e.g. if it is requested by :doc:`fix ave/time ` or similar commands. If that fails, it can be detected by a mismatch between the current timestep and when a quantity was last calculated, in which case an error message of this type is generated. -The most common cause of this type of error is requesting a quantity before -the start of the simulation. +The most common cause of this type of error is requesting a quantity +before the start of the simulation. .. code-block:: LAMMPS @@ -707,13 +718,13 @@ the start of the simulation. print "Potential energy = $e" # this will generate the error run 1000 # start of simulation -This situation can be avoided by adding in a "run 0" command, as explained in -more detail in the "Variable Accuracy" section of the +This situation can be avoided by adding in a "run 0" command, as +explained in more detail in the "Variable Accuracy" section of the :doc:`variable ` doc page. -Another cause is requesting a quantity on a timestep that is not -a thermo or dump output timestep. This can often be -remedied by increasing the frequency of thermo or dump output. +Another cause is requesting a quantity on a timestep that is not a +thermo or dump output timestep. This can often be remedied by +increasing the frequency of thermo or dump output. .. _err0023: @@ -722,19 +733,19 @@ Molecule auto special bond generation overflow In order to correctly apply the :doc:`special_bonds ` settings (also known as "exclusions"), LAMMPS needs to maintain for each -atom a list of atoms that are connected to this atom, either directly with -a bond or indirectly through bonding with an intermediate atom(s). The purpose -is to either remove or tag those pairs of atoms in the neighbor list. This -information is stored with individual -atoms and thus the maximum number of such "special" neighbors is set -when the simulation box is created. When reading (relative) geometry -and topology of a 'molecule' from a :doc:`molecule file `, -LAMMPS will build the list of such "special" neighbors for the molecule atom +atom a list of atoms that are connected to this atom, either directly +with a bond or indirectly through bonding with an intermediate atom(s). +The purpose is to either remove or tag those pairs of atoms in the +neighbor list. This information is stored with individual atoms and +thus the maximum number of such "special" neighbors is set when the +simulation box is created. When reading (relative) geometry and +topology of a 'molecule' from a :doc:`molecule file `, LAMMPS +will build the list of such "special" neighbors for the molecule atom (if not given in the molecule file explicitly). The error is triggered -when the resulting list is too long for the space reserved when -creating the simulation box. The solution is to increase the -corresponding setting. Overestimating this value will only consume -more memory, and is thus a safe choice. +when the resulting list is too long for the space reserved when creating +the simulation box. The solution is to increase the corresponding +setting. Overestimating this value will only consume more memory, and +is thus a safe choice. .. _err0024: @@ -742,14 +753,14 @@ Molecule topology/atom exceeds system topology/atom --------------------------------------------------- LAMMPS uses :doc:`domain decomposition ` to -distribute data (i.e. atoms) across the MPI processes in parallel -runs. This includes topology data about bonds, angles, -dihedrals, impropers and :doc:`"special" neighbors `. -This information is stored with either one or all atoms involved in such -a topology entry (which of the two option applies depends on the -:doc:`newton ` setting for bonds). When reading a data file, -LAMMPS analyzes the requirements for this file and then the values are -"locked in" and cannot be extended. +distribute data (i.e. atoms) across the MPI processes in parallel runs. +This includes topology data about bonds, angles, dihedrals, impropers +and :doc:`"special" neighbors `. This information is +stored with either one or all atoms involved in such a topology entry +(which of the two option applies depends on the :doc:`newton ` +setting for bonds). When reading a data file, LAMMPS analyzes the +requirements for this file and then the values are "locked in" and +cannot be extended. So loading a molecule file that requires more of the topology per atom storage or adding a data file with such needs will lead to an error. To @@ -765,10 +776,10 @@ Molecule topology type exceeds system topology type --------------------------------------------------- The total number of atom, bond, angle, dihedral, and improper types is -"locked in" when LAMMPS creates the simulation box. This can happen +"locked in" when LAMMPS creates the simulation box. This can happen through either the :doc:`create_box `, the :doc:`read_data `, or the :doc:`read_restart ` command. After -this it is not possible to refer to an additional type. So loading a +this it is not possible to refer to an additional type. So loading a molecule file that uses additional types or adding a data file that would require additional types will lead to an error. To avoid the error, one or more of the `extra/XXX/types` keywords are required to @@ -817,17 +828,18 @@ beginning of the chain. No fixes with time integration, atoms won't move ------------------------------------------------ -This warning will be issued if LAMMPS encounters a :doc:`run ` command that -does not have a preceding :doc:`fix ` command that updates atom/object -positions and velocities per step. In other words, there are no fixes detected -that perform velocity-Verlet time integration, such as :doc:`fix nve `. -Note that this alert does not mean that there are no active fixes. LAMMPS has a -very wide variety of fixes, many of which do not move objects but also operate -through steps, such as printing outputs (e.g. :doc:`fix print `), -performing calculations (e.g. :doc:`fix ave/time `), or changing -other system parameters (e.g. :doc:`fix dt/reset `). It is up to -the user to determine whether the lack of a time-integrating fix is intentional -or not. +This warning will be issued if LAMMPS encounters a :doc:`run ` +command that does not have a preceding :doc:`fix ` command that +updates atom/object positions and velocities per step. In other words, +there are no fixes detected that perform velocity-Verlet time +integration, such as :doc:`fix nve `. Note that this alert +does not mean that there are no active fixes. LAMMPS has a very wide +variety of fixes, many of which do not move objects but also operate +through steps, such as printing outputs (e.g. :doc:`fix print +`), performing calculations (e.g. :doc:`fix ave/time +`), or changing other system parameters (e.g. :doc:`fix +dt/reset `). It is up to the user to determine whether +the lack of a time-integrating fix is intentional or not. .. _err0029: @@ -835,36 +847,39 @@ or not. System is not charge neutral, net charge = ... ---------------------------------------------- -the sum of charges in the system is not zero. When a system is not -charge-neutral, methods that evolve/manipulate per-atom charges, evaluate -Coulomb interactions, evaluate Coulomb forces, or evaluate/manipulate other -properties relying on per-atom charges may raise this warning. A non-zero -net charge most commonly arises after setting per-atom charges :doc:`set ` -such that the sum is non-zero or by reading in a system through :doc:`read_data -` where the per-atom charges do not sum to zero. However, a loss of -charge neutrality may occur in other less common ways, like when charge +the sum of charges in the system is not zero. When a system is not +charge-neutral, methods that evolve/manipulate per-atom charges, +evaluate Coulomb interactions, evaluate Coulomb forces, or +evaluate/manipulate other properties relying on per-atom charges may +raise this warning. A non-zero net charge most commonly arises after +setting per-atom charges :doc:`set ` such that the sum is non-zero +or by reading in a system through :doc:`read_data ` where the +per-atom charges do not sum to zero. However, a loss of charge +neutrality may occur in other less common ways, like when charge equilibration methods (e.g., :doc:`fix qeq `) fail. -A similar warning/error may be raised when using certain charge equilibration -methods: :doc:`fix qeq `, :doc:`fix qeq/comb `, :doc:`fix -qeq/reaxff `, and :doc:`fix qtpie/reaxff `. In -such cases, this warning/error will be raised for the fix :doc:`group ` -when the group has a non-zero net charge. +A similar warning/error may be raised when using certain charge +equilibration methods: :doc:`fix qeq `, :doc:`fix qeq/comb +`, :doc:`fix qeq/reaxff `, and :doc:`fix +qtpie/reaxff `. In such cases, this warning/error +will be raised for the fix :doc:`group ` when the group has a +non-zero net charge. -When the system is expected to be charge-neutral, this warning often arises due -to an error in the lammps input (e.g., an incorrect :doc:`set ` command, -error in the data file read by :doc:`read_data `, incorrectly -grouping atoms with charge, etc.). If the system is NOT expected to be -charge-neutral, the user should make sure that the method(s) used are -appropriate for systems with a non-zero net charge. Some commonly used fixes for -charge equilibration :doc:`fix qeq `, pair styles that include charge -interactions :doc:`pair_style coul/XXX `, and kspace methods -:doc:`kspace_style ` can, in theory, support systems with non-zero -net charge. However, non-zero net charge can lead to spurious artifacts. The -severity of these artifacts depends on the magnitude of total charge, system -size, and methods used. Before running simulations or calculations for systems -with non-zero net charge, users should test for artifacts and convergence of -properties. +When the system is expected to be charge-neutral, this warning often +arises due to an error in the lammps input (e.g., an incorrect :doc:`set +` command, error in the data file read by :doc:`read_data +`, incorrectly grouping atoms with charge, etc.). If the +system is NOT expected to be charge-neutral, the user should make sure +that the method(s) used are appropriate for systems with a non-zero net +charge. Some commonly used fixes for charge equilibration :doc:`fix qeq +`, pair styles that include charge interactions +:doc:`pair_style coul/XXX `, and kspace methods +:doc:`kspace_style ` can, in theory, support systems with +non-zero net charge. However, non-zero net charge can lead to spurious +artifacts. The severity of these artifacts depends on the magnitude of +total charge, system size, and methods used. Before running simulations +or calculations for systems with non-zero net charge, users should test +for artifacts and convergence of properties. .. _err0030: @@ -928,9 +943,9 @@ created ` for additional information. XXX command after simulation box is defined -------------------------------------------- -This error occurs when trying to excute a LAMMPS command that -changes a global setting that is locked in when the simulation box -is created (for instance defining the :doc:`atom style `, +This error occurs when trying to excute a LAMMPS command that changes a +global setting *after* it is locked in when the simulation box is +created (for instance defining the :doc:`atom style `, :doc:`dimension `, :doc:`newton `, or :doc:`units ` setting). These settings may only be changed *before* the simulation box has been created. See the paragraph on :ref:`errors From 88cecbd11dbf909aa24205b15f220b7386642721 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 22 Mar 2025 18:54:49 -0400 Subject: [PATCH 66/99] alternate implementation of jump to top by @rbberger --- doc/utils/sphinx-config/_themes/lammps_theme/layout.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/utils/sphinx-config/_themes/lammps_theme/layout.html b/doc/utils/sphinx-config/_themes/lammps_theme/layout.html index 69fc12652c..7e938d2d70 100644 --- a/doc/utils/sphinx-config/_themes/lammps_theme/layout.html +++ b/doc/utils/sphinx-config/_themes/lammps_theme/layout.html @@ -173,11 +173,15 @@ {%- endblock %} -

+ +
From a26ea958c684d3ff03531c8e2166c6d828ed1715 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 18:07:08 -0400 Subject: [PATCH 67/99] throw suitable exception when trying to extract unknown or incompatible compute or fix data --- src/library.cpp | 66 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 0127a0e198..9ce39435b0 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -79,6 +79,38 @@ static void ptr_argument_warning() ptr_argument_flag = 0; } +// for throwing exceptions from within the library interface; similar to Error::all() +// instead of qualifying it with source file and line, we use the (library) function name +// __func__ is supposed to be portable for compilers also supporting C99: MSVC, GCC, Clang. +#if defined(FNERR) +#undef FNERR +#endif +#define FNERR __func__ + +[[noreturn]] static void lammps_throw_error(const std::string &fname, const std::string &mesg) +{ + throw LAMMPSException("ERROR in library function " + fname + "(): " + mesg + "\n"); + exit(1); +} + +[[noreturn]] static void _lammps_throw_error(const std::string &fname, fmt::string_view format, + fmt::format_args args) +{ + try { + lammps_throw_error(fname, fmt::vformat(format, args)); + } catch (fmt::format_error &e) { + lammps_throw_error(fname, e.what()); + } + exit(1); // to trick "smart" compilers into believing this does not return +} + +template +[[noreturn]] static void lammps_throw_error(const std::string &fname, + const std::string &format, ARgs &&...args) +{ + _lammps_throw_error(fname, format, fmt::make_format_args(args...)); +} + // ---------------------------------------------------------------------- // utility macros // ---------------------------------------------------------------------- @@ -2362,17 +2394,19 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) BEGIN_CAPTURE { auto compute = lmp->modify->get_compute_by_id(id); - if (!compute) return nullptr; + if (!compute) lammps_throw_error(FNERR, "Compute {} does not exist", id); if (style == LMP_STYLE_GLOBAL) { if (type == LMP_TYPE_SCALAR) { - if (!compute->scalar_flag) return nullptr; + if (!compute->scalar_flag) + lammps_throw_error(FNERR, "Compute {} does not compute global scalar", id); if (compute->invoked_scalar != lmp->update->ntimestep) compute->compute_scalar(); return (void *) &compute->scalar; } if ((type == LMP_TYPE_VECTOR) || (type == LMP_SIZE_VECTOR)) { - if (!compute->vector_flag) return nullptr; + if (!compute->vector_flag) + lammps_throw_error(FNERR, "Compute {} does not compute global vector", id); if (compute->invoked_vector != lmp->update->ntimestep) compute->compute_vector(); if (type == LMP_TYPE_VECTOR) @@ -2381,7 +2415,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) return (void *) &compute->size_vector; } if ((type == LMP_TYPE_ARRAY) || (type == LMP_SIZE_ROWS) || (type == LMP_SIZE_COLS)) { - if (!compute->array_flag) return nullptr; + if (!compute->array_flag) + lammps_throw_error(FNERR, "Compute {} does not compute global array", id); if (compute->invoked_array != lmp->update->ntimestep) compute->compute_array(); if (type == LMP_TYPE_ARRAY) @@ -2550,33 +2585,38 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) return nullptr; + if (!fix) lammps_throw_error(FNERR, "Fix {} does not exist", id); if (style == LMP_STYLE_GLOBAL) { if (type == LMP_TYPE_SCALAR) { - if (!fix->scalar_flag) return nullptr; + if (!fix->scalar_flag) + lammps_throw_error(FNERR, "Fix {} does not compute global scalar", id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_scalar(); return (void *) dptr; } if (type == LMP_TYPE_VECTOR) { - if (!fix->vector_flag) return nullptr; + if (!fix->vector_flag) + lammps_throw_error(FNERR, "Fix {} does not compute global vector", id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_vector(nrow); return (void *) dptr; } if (type == LMP_TYPE_ARRAY) { - if (!fix->array_flag) return nullptr; + if (!fix->array_flag) + lammps_throw_error(FNERR, "Fix {} does not compute global array", id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_array(nrow,ncol); return (void *) dptr; } if (type == LMP_SIZE_VECTOR) { - if (!fix->vector_flag) return nullptr; + if (!fix->vector_flag); + lammps_throw_error(FNERR, "Fix {} does not compute global vector", id); return (void *) &fix->size_vector; } if ((type == LMP_SIZE_ROWS) || (type == LMP_SIZE_COLS)) { - if (!fix->array_flag) return nullptr; + if (!fix->array_flag) + lammps_throw_error(FNERR, "Fix {} does not compute global array", id); if (type == LMP_SIZE_ROWS) return (void *) &fix->size_array_rows; else @@ -2585,14 +2625,16 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, } if (style == LMP_STYLE_ATOM) { - if (!fix->peratom_flag) return nullptr; + if (!fix->peratom_flag) + lammps_throw_error(FNERR, "Fix {} does not compute per-atom vector or array", id); if (type == LMP_TYPE_VECTOR) return (void *) fix->vector_atom; if (type == LMP_TYPE_ARRAY) return (void *) fix->array_atom; if (type == LMP_SIZE_COLS) return (void *) &fix->size_peratom_cols; } if (style == LMP_STYLE_LOCAL) { - if (!fix->local_flag) return nullptr; + if (!fix->local_flag) + lammps_throw_error(FNERR, "Fix {} does not compute local vector or array", id); if (type == LMP_TYPE_SCALAR) return (void *) &fix->size_local_rows; if (type == LMP_TYPE_VECTOR) return (void *) fix->vector_local; if (type == LMP_TYPE_ARRAY) return (void *) fix->array_local; From 6fca985d5dd1bc03f3f023fe3a8559e1054d933a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 18:59:12 -0400 Subject: [PATCH 68/99] add method that allows suppressing printing error messages immediately --- src/error.cpp | 33 +++++++++++++++++++++++---------- src/error.h | 3 ++- src/library.cpp | 38 ++++++++++++++++++++++++++++++++++---- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index 35e0ab49e0..25a172a07e 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -35,7 +35,7 @@ static std::string truncpath(const std::string &path) /* ---------------------------------------------------------------------- */ Error::Error(LAMMPS *lmp) - : Pointers(lmp), numwarn(0), maxwarn(100), allwarn(0) + : Pointers(lmp), numwarn(0), maxwarn(100), allwarn(0), showerror(1) { last_error_message.clear(); last_error_type = ERROR_NONE; @@ -56,7 +56,7 @@ void Error::universe_all(const std::string &file, int line, const std::string &s } catch (fmt::format_error &) { ; // do nothing } - if (universe->me == 0) { + if (showerror && (universe->me == 0)) { if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); if (universe->ulogfile) fputs(mesg.c_str(),universe->ulogfile); } @@ -84,7 +84,10 @@ void Error::universe_one(const std::string &file, int line, const std::string &s { std::string mesg = fmt::format("ERROR on proc {}: {} ({}:{})\n", universe->me,str,truncpath(file),line); - if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); + if (showerror) { + if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); + if (universe->ulogfile) fputs(mesg.c_str(),universe->ulogfile); + } utils::flush_buffers(lmp); // allow commands if an exception was caught in a run @@ -131,7 +134,7 @@ void Error::all(const std::string &file, int line, int failed, const std::string if (failed > NOLASTLINE) mesg += utils::point_to_error(input, failed); if (failed == ARGZERO) mesg += utils::point_to_error(input, 0); - if (me == 0) utils::logmesg(lmp,mesg); + if (showerror && (me == 0)) utils::logmesg(lmp,mesg); utils::flush_buffers(lmp); // allow commands if an exception was caught in a run @@ -164,11 +167,12 @@ void Error::one(const std::string &file, int line, int failed, const std::string std::string mesg = fmt::format("ERROR on proc {}: {} ({}:{})\n", me, str, truncpath(file), line); if (failed > NOPOINTER) mesg += utils::point_to_error(input, failed); if (failed == ARGZERO) mesg += utils::point_to_error(input, 0); - utils::logmesg(lmp,mesg); + if (showerror) utils::logmesg(lmp,mesg); - if (universe->nworlds > 1) - if (universe->uscreen) - fputs(mesg.c_str(),universe->uscreen); + if (showerror && (universe->nworlds > 1)) { + if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); + if (universe->ulogfile) fputs(mesg.c_str(),universe->ulogfile); + } utils::flush_buffers(lmp); // allow commands if an exception was caught in a run @@ -213,8 +217,7 @@ void Error::warning(const std::string &file, int line, const std::string &str) { ++numwarn; if ((maxwarn != 0) && ((numwarn > maxwarn) || (allwarn > maxwarn) || (maxwarn < 0))) return; - std::string mesg = fmt::format("WARNING: {} ({}:{})\n", - str,truncpath(file),line); + std::string mesg = fmt::format("WARNING: {} ({}:{})\n", str,truncpath(file),line); if (screen) fputs(mesg.c_str(),screen); if (logfile) fputs(mesg.c_str(),logfile); } @@ -308,3 +311,13 @@ void Error::set_last_error(const char *msg, ErrorType type) last_error_message = msg; last_error_type = type; } + +/* ---------------------------------------------------------------------- + enable or disable printing error messages. for use with library interface. + if flag = 0 only last error message and type are updated. +------------------------------------------------------------------------- */ + +void Error::set_show_error(const int flag) +{ + showerror = flag; +} diff --git a/src/error.h b/src/error.h index ba1bd655d0..668cdce2dd 100644 --- a/src/error.h +++ b/src/error.h @@ -98,12 +98,13 @@ class Error : protected Pointers { std::string get_last_error() const; ErrorType get_last_error_type() const; void set_last_error(const char *msg, ErrorType type = ERROR_NORMAL); + void set_show_error(const int flag); private: std::string last_error_message; ErrorType last_error_type; - int numwarn, maxwarn, allwarn; + int numwarn, maxwarn, allwarn, showerror; // internal versions that accept explicit fmtlib arguments [[noreturn]] void _all(const std::string &, int, int, fmt::string_view, fmt::format_args args); [[noreturn]] void _one(const std::string &, int, int, fmt::string_view, fmt::format_args args); diff --git a/src/library.cpp b/src/library.cpp index 9ce39435b0..0a594e9403 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -89,7 +89,7 @@ static void ptr_argument_warning() [[noreturn]] static void lammps_throw_error(const std::string &fname, const std::string &mesg) { - throw LAMMPSException("ERROR in library function " + fname + "(): " + mesg + "\n"); + throw LAMMPSException("ERROR in " + fname + "(): " + mesg + "\n"); exit(1); } @@ -130,7 +130,7 @@ template END_CAPTURE ------------------------------------------------------------------------- */ -#define BEGIN_CAPTURE \ +#define BEGIN_CAPTURE \ Error *error = lmp->error; \ try @@ -327,7 +327,8 @@ multiple LAMMPS instances concurrently or sequentially. See void lammps_close(void *handle) { auto lmp = (LAMMPS *) handle; - delete lmp; + // only delete if not already deleted + if (lmp && lmp->comm) delete lmp; } /* ---------------------------------------------------------------------- */ @@ -7200,6 +7201,35 @@ int lammps_has_error(void *handle) /* ---------------------------------------------------------------------- */ +/** Enable or disable direct printing of error messages + +\verbatim embed:rst + +.. versionadded:: TBD + +This function can be used to stop LAMMPS from printing error messages +*before* LAMMPS throws a :ref:`C++ exception `. This is so +it may be left to the code calling the library interface whether to +check for them, and retrieve and print error messages using the library +interface functions :cpp:func:`lammps_has_error` and +:cpp:func:`lammps_get_last_error_message`. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *`` or NULL + * \param flag enable (not 0) or disable (0) printing error messages before throwing exception + */ +void lammps_set_show_error(void *handle, const int flag) +{ + if (handle) { + LAMMPS *lmp = (LAMMPS *) handle; + Error *error = lmp->error; + error->set_show_error(flag); + } +} + +/* ---------------------------------------------------------------------- */ + /** Copy the last error message into the provided buffer \verbatim embed:rst @@ -7287,5 +7317,5 @@ int lammps_python_api_version() { } // Local Variables: -// fill-column: 80 +// fill-column: 99 // End: From ccbf47c66dd3068d094025790a5420c64327d404 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 19:02:10 -0400 Subject: [PATCH 69/99] forgot exceptions in two cases --- src/library.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 0a594e9403..03862a3001 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2430,7 +2430,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) } if (style == LMP_STYLE_ATOM) { - if (!compute->peratom_flag) return nullptr; + if (!compute->peratom_flag) + lammps_throw_error(FNERR, "Compute {} does not compute per-atom vector or array", id); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); if (type == LMP_TYPE_VECTOR) return (void *) compute->vector_atom; @@ -2439,7 +2440,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) } if (style == LMP_STYLE_LOCAL) { - if (!compute->local_flag) return nullptr; + if (!compute->local_flag) + lammps_throw_error(FNERR, "Compute {} does not compute vector or array", id); if (compute->invoked_local != lmp->update->ntimestep) compute->compute_local(); if (type == LMP_TYPE_SCALAR) return (void *) &compute->size_local_rows; /* for backward compatibility */ From b4e4ea1069b9df1950f449f49e666cdd3c35fa58 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 21:23:24 -0400 Subject: [PATCH 70/99] we don't need lammps_throw_error. just call lmp->error->xxx --- src/library.cpp | 256 +++++++++++++++++++++++++++++++++++------------- src/library.h | 1 + 2 files changed, 191 insertions(+), 66 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 03862a3001..436c95f770 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -79,38 +79,12 @@ static void ptr_argument_warning() ptr_argument_flag = 0; } -// for throwing exceptions from within the library interface; similar to Error::all() -// instead of qualifying it with source file and line, we use the (library) function name // __func__ is supposed to be portable for compilers also supporting C99: MSVC, GCC, Clang. #if defined(FNERR) #undef FNERR #endif #define FNERR __func__ -[[noreturn]] static void lammps_throw_error(const std::string &fname, const std::string &mesg) -{ - throw LAMMPSException("ERROR in " + fname + "(): " + mesg + "\n"); - exit(1); -} - -[[noreturn]] static void _lammps_throw_error(const std::string &fname, fmt::string_view format, - fmt::format_args args) -{ - try { - lammps_throw_error(fname, fmt::vformat(format, args)); - } catch (fmt::format_error &e) { - lammps_throw_error(fname, e.what()); - } - exit(1); // to trick "smart" compilers into believing this does not return -} - -template -[[noreturn]] static void lammps_throw_error(const std::string &fname, - const std::string &format, ARgs &&...args) -{ - _lammps_throw_error(fname, format, fmt::make_format_args(args...)); -} - // ---------------------------------------------------------------------- // utility macros // ---------------------------------------------------------------------- @@ -327,8 +301,12 @@ multiple LAMMPS instances concurrently or sequentially. See void lammps_close(void *handle) { auto lmp = (LAMMPS *) handle; - // only delete if not already deleted - if (lmp && lmp->comm) delete lmp; + if (!lmp || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + + delete lmp; } /* ---------------------------------------------------------------------- */ @@ -479,6 +457,10 @@ function returns. void lammps_error(void *handle, int error_type, const char *error_text) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } BEGIN_CAPTURE { @@ -487,19 +469,19 @@ void lammps_error(void *handle, int error_type, const char *error_text) lmp->error->warning("(library)", 0, error_text); break; case LMP_ERROR_ONE: - lmp->error->one("(library)", 0, error_text); + lmp->error->one("(library)", 0, Error::NOLASTLINE, error_text); break; case LMP_ERROR_ALL: - lmp->error->all("(library)", 0, error_text); + lmp->error->all("(library)", 0, Error::NOLASTLINE, error_text); break; case LMP_ERROR_WARNING|LMP_ERROR_WORLD: lmp->error->warning("(library)", 0, error_text); break; case LMP_ERROR_ONE|LMP_ERROR_WORLD: - lmp->error->one("(library)", 0, error_text); + lmp->error->one("(library)", 0, Error::NOLASTLINE, error_text); break; case LMP_ERROR_ALL|LMP_ERROR_WORLD: - lmp->error->all("(library)", 0, error_text); + lmp->error->all("(library)", 0, Error::NOLASTLINE, error_text); break; case LMP_ERROR_WARNING|LMP_ERROR_UNIVERSE: lmp->error->universe_warn("(library)", 0, error_text); @@ -561,6 +543,10 @@ must be freed with :cpp:func:`lammps_free` after use to avoid a memory leak. char *lammps_expand(void *handle, const char *line) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } char *copy, *work; int n, maxcopy, maxwork; @@ -606,11 +592,16 @@ and :cpp:func:`Input::file()`. void lammps_file(void *handle, const char *filename) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->update || !lmp->input) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } BEGIN_CAPTURE { if (lmp->update->whichflag != 0) - lmp->error->all(FLERR, "Issuing LAMMPS commands during a run is not allowed"); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Issuing LAMMPS commands during a run is not allowed", FNERR); else lmp->input->file(filename); } @@ -642,12 +633,17 @@ passing a string without a command. char *lammps_command(void *handle, const char *cmd) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->update || !lmp->input) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } char *result = nullptr; BEGIN_CAPTURE { if (lmp->update->whichflag != 0) - lmp->error->all(FLERR, "Issuing LAMMPS command during a run is not allowed."); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Issuing LAMMPS command during a run is not allowed.", FNERR); else result = lmp->input->one(cmd); } @@ -711,9 +707,12 @@ executing. void lammps_commands_string(void *handle, const char *str) { - if (!handle) return; - auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->update || !lmp->output || !lmp->comm || !lmp->input) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + std::string cmd, line, buffer; bool append = false; bool triple = false; @@ -723,7 +722,8 @@ void lammps_commands_string(void *handle, const char *str) BEGIN_CAPTURE { if (lmp->update->whichflag != 0) { - lmp->error->all(FLERR, "Issuing LAMMPS commands during a run is not allowed"); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Issuing LAMMPS commands during a run is not allowed", FNERR); } std::size_t cursor = 0; @@ -775,7 +775,8 @@ void lammps_commands_string(void *handle, const char *str) // need to handle jump command here if ((words.size() == 3) && (words[0] == "jump")) { if (words[1] != "SELF") - lmp->error->all(FLERR, "May only use jump SELF with command string buffer "); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): May only use jump SELF with command string buffer", FNERR); // emulate jump command unless with need to skip it if (!lmp->input->get_jump_skip()) { label = words[2]; @@ -834,9 +835,13 @@ the size of a ``bigint`` integer. double lammps_get_natoms(void *handle) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1.0; + } auto natoms = static_cast(lmp->atom->natoms); - if (natoms > 9.0e15) return 0; // TODO:XXX why not -1? + if (natoms > 9.0e15) return -1.0; return natoms; } @@ -862,6 +867,10 @@ the last thermo output. double lammps_get_thermo(void *handle, const char *keyword) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->output || !lmp->output->thermo) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0.0; + } double dval = 0.0; BEGIN_CAPTURE @@ -958,6 +967,10 @@ of a run, the lock/unlock calls have no effect. void *lammps_last_thermo(void *handle, const char *what, int index) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->update || !lmp->output || !lmp->output->thermo) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } void *val = nullptr; if (!lmp->output) return val; @@ -1044,10 +1057,14 @@ void lammps_extract_box(void *handle, double *boxlo, double *boxhi, int *pflags, int *boxflag) { auto lmp = (LAMMPS *) handle; - Domain *domain = lmp->domain; + if (!lmp || !lmp->error || !lmp->domain || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } BEGIN_CAPTURE { + auto *domain = lmp->domain; // do nothing if box does not yet exist if (lmp->domain->box_exist == 0) { if (lmp->comm->me == 0) @@ -1106,17 +1123,22 @@ void lammps_reset_box(void *handle, double *boxlo, double *boxhi, double xy, double yz, double xz) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->domain || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } Domain *domain = lmp->domain; BEGIN_CAPTURE { if (lmp->atom->natoms > 0) - lmp->error->all(FLERR, "Calling lammps_reset_box() not supported when atoms exist"); + lmp->error->all(FLERR, Error::NOLASTLINE, + "Calling lammps_reset_box() not supported when atoms exist"); // warn and do nothing if no box exists if (lmp->domain->box_exist == 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"Call to lammps_reset_box() without a box ignored"); + lmp->error->warning(FLERR, "Call to lammps_reset_box() without a box ignored"); return; } @@ -1167,6 +1189,10 @@ system it will be set to zero. void lammps_memory_usage(void *handle, double *meminfo) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } Info info(lmp); info.get_memory_info(meminfo); } @@ -1198,9 +1224,14 @@ If LAMMPS was compiled with MPI_STUBS, this function returns -1. int lammps_get_mpi_comm(void *handle) { #ifdef MPI_STUBS + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; #else LAMMPS *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } MPI_Fint f_comm = MPI_Comm_c2f(lmp->world); return f_comm; #endif @@ -1403,6 +1434,10 @@ internally by the :doc:`Fortran interface ` and are not likely to be us int lammps_extract_setting(void *handle, const char *keyword) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->domain || !lmp->force || !lmp->comm || !lmp->universe || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } // This can be customized by adding keywords and documenting them in the section above. if (strcmp(keyword,"bigint") == 0) return sizeof(bigint); @@ -1980,6 +2015,11 @@ report the "native" data type. The following tables are provided: void *lammps_extract_global(void *handle, const char *name) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->update || !lmp->atom || !lmp->force || !lmp->domain || !lmp->domain->lattice + || !lmp->update->integrate) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } if (strcmp(name,"units") == 0) return (void *) lmp->update->unit_style; if (strcmp(name,"atom_style") == 0) return (void *) lmp->atom->atom_style; @@ -1991,6 +2031,7 @@ void *lammps_extract_global(void *handle, const char *name) if (strcmp(name,"kspace_style") == 0) return (void *) lmp->force->kspace_style; if (strcmp(name,"dt") == 0) return (void *) &lmp->update->dt; if (strcmp(name,"ntimestep") == 0) return (void *) &lmp->update->ntimestep; + // update->atime can be referenced as a pointer // thermo "timer" data cannot be, since it is computed on request // lammps_get_thermo() can access all thermo keywords by value @@ -2106,9 +2147,10 @@ to then decide how to cast the ``void *`` pointer and access the data. int lammps_extract_pair_dimension(void * handle, const char *name) { auto lmp = (LAMMPS *) handle; - if (!lmp) return -1; - auto pair = lmp->force->pair; - if (!pair) return -1; + if (!lmp || !lmp->force || !lmp->force->pair) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } int dim = -1; if (lmp->force->pair->extract(name, dim)) return dim; @@ -2138,9 +2180,10 @@ pointer can be determined with :cpp:func:`lammps_extract_pair_dimension`. void *lammps_extract_pair(void * handle, const char *name) { auto lmp = (LAMMPS *) handle; - if (!lmp) return nullptr; - auto pair = lmp->force->pair; - if (!pair) return nullptr; + if (!lmp || !lmp->force || !lmp->force->pair) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } int dim = -1; return lmp->force->pair->extract(name, dim); @@ -2170,6 +2213,10 @@ using :cpp:func:`lammps_extract_setting`. int lammps_map_atom(void *handle, const void *id) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } auto tag = (const tagint *) id; if (lmp->atom->map_style > Atom::MAP_NONE) return lmp->atom->map(*tag); @@ -2204,6 +2251,10 @@ about the vector or array dimensions. int lammps_extract_atom_datatype(void *handle, const char *name) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } return lmp->atom->extract_datatype(name); } @@ -2237,6 +2288,10 @@ to decide how to cast the ``void *`` pointer and access the data. int lammps_extract_atom_size(void *handle, const char *name, int type) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } return lmp->atom->extract_size(name, type); } @@ -2273,6 +2328,10 @@ A table with supported keywords is included in the documentation of the void *lammps_extract_atom(void *handle, const char *name) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } return lmp->atom->extract(name); } @@ -2391,23 +2450,30 @@ lists the available options. void *lammps_extract_compute(void *handle, const char *id, int style, int type) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } BEGIN_CAPTURE { auto compute = lmp->modify->get_compute_by_id(id); - if (!compute) lammps_throw_error(FNERR, "Compute {} does not exist", id); + if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not exist", FNERR, id); if (style == LMP_STYLE_GLOBAL) { if (type == LMP_TYPE_SCALAR) { if (!compute->scalar_flag) - lammps_throw_error(FNERR, "Compute {} does not compute global scalar", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute global scalar", FNERR, id); if (compute->invoked_scalar != lmp->update->ntimestep) compute->compute_scalar(); return (void *) &compute->scalar; } if ((type == LMP_TYPE_VECTOR) || (type == LMP_SIZE_VECTOR)) { if (!compute->vector_flag) - lammps_throw_error(FNERR, "Compute {} does not compute global vector", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute global vector", FNERR, id); if (compute->invoked_vector != lmp->update->ntimestep) compute->compute_vector(); if (type == LMP_TYPE_VECTOR) @@ -2417,7 +2483,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) } if ((type == LMP_TYPE_ARRAY) || (type == LMP_SIZE_ROWS) || (type == LMP_SIZE_COLS)) { if (!compute->array_flag) - lammps_throw_error(FNERR, "Compute {} does not compute global array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute global array", FNERR, id); if (compute->invoked_array != lmp->update->ntimestep) compute->compute_array(); if (type == LMP_TYPE_ARRAY) @@ -2431,7 +2498,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) if (style == LMP_STYLE_ATOM) { if (!compute->peratom_flag) - lammps_throw_error(FNERR, "Compute {} does not compute per-atom vector or array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector or array", FNERR, id); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); if (type == LMP_TYPE_VECTOR) return (void *) compute->vector_atom; @@ -2441,7 +2509,8 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) if (style == LMP_STYLE_LOCAL) { if (!compute->local_flag) - lammps_throw_error(FNERR, "Compute {} does not compute vector or array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute vector or array", FNERR, id); if (compute->invoked_local != lmp->update->ntimestep) compute->compute_local(); if (type == LMP_TYPE_SCALAR) return (void *) &compute->size_local_rows; /* for backward compatibility */ @@ -2584,42 +2653,52 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, int nrow, int ncol) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lammps_throw_error(FNERR, "Fix {} does not exist", id); + if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not exist", FNERR, id); if (style == LMP_STYLE_GLOBAL) { if (type == LMP_TYPE_SCALAR) { if (!fix->scalar_flag) - lammps_throw_error(FNERR, "Fix {} does not compute global scalar", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute global scalar", FNERR, id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_scalar(); return (void *) dptr; } if (type == LMP_TYPE_VECTOR) { if (!fix->vector_flag) - lammps_throw_error(FNERR, "Fix {} does not compute global vector", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute global vector", FNERR, id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_vector(nrow); return (void *) dptr; } if (type == LMP_TYPE_ARRAY) { if (!fix->array_flag) - lammps_throw_error(FNERR, "Fix {} does not compute global array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute global array", FNERR, id); auto dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_array(nrow,ncol); return (void *) dptr; } if (type == LMP_SIZE_VECTOR) { if (!fix->vector_flag); - lammps_throw_error(FNERR, "Fix {} does not compute global vector", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute global vector", FNERR, id); return (void *) &fix->size_vector; } if ((type == LMP_SIZE_ROWS) || (type == LMP_SIZE_COLS)) { if (!fix->array_flag) - lammps_throw_error(FNERR, "Fix {} does not compute global array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute global array", FNERR, id); if (type == LMP_SIZE_ROWS) return (void *) &fix->size_array_rows; else @@ -2629,7 +2708,8 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, if (style == LMP_STYLE_ATOM) { if (!fix->peratom_flag) - lammps_throw_error(FNERR, "Fix {} does not compute per-atom vector or array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom vector or array", FNERR, id); if (type == LMP_TYPE_VECTOR) return (void *) fix->vector_atom; if (type == LMP_TYPE_ARRAY) return (void *) fix->array_atom; if (type == LMP_SIZE_COLS) return (void *) &fix->size_peratom_cols; @@ -2637,7 +2717,8 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, if (style == LMP_STYLE_LOCAL) { if (!fix->local_flag) - lammps_throw_error(FNERR, "Fix {} does not compute local vector or array", id); + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute local vector or array", FNERR, id); if (type == LMP_TYPE_SCALAR) return (void *) &fix->size_local_rows; if (type == LMP_TYPE_VECTOR) return (void *) fix->vector_local; if (type == LMP_TYPE_ARRAY) return (void *) fix->array_local; @@ -2735,6 +2816,10 @@ a char pointer and it should **not** be deallocated. Example: void *lammps_extract_variable(void *handle, const char *name, const char *group) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } BEGIN_CAPTURE { @@ -2793,7 +2878,11 @@ decide how to cast the ``void *`` pointer and access the data. int lammps_extract_variable_datatype(void *handle, const char *name) { - auto lmp = (LAMMPS*) handle; + auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } BEGIN_CAPTURE { @@ -2879,6 +2968,10 @@ a string-style variable, otherwise 0. int lammps_set_string_variable(void *handle, const char *name, const char *str) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } int err = -1; BEGIN_CAPTURE @@ -2917,6 +3010,10 @@ internal-style variable, otherwise 0. int lammps_set_internal_variable(void *handle, const char *name, double value) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } BEGIN_CAPTURE { @@ -2958,6 +3055,10 @@ string, otherwise 1. int lammps_variable_info(void *handle, int idx, char *buffer, int buf_size) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } Info info(lmp); if ((idx >= 0) && (idx < lmp->input->variable->nvar)) { @@ -2994,6 +3095,10 @@ the resulting (scalar) value as a floating point number. double lammps_eval(void *handle, const char *expr) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0.0; + } double result = 0.0; BEGIN_CAPTURE @@ -3028,6 +3133,10 @@ double lammps_eval(void *handle, const char *expr) */ void lammps_clearstep_compute(void *handle) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } lmp->modify->clearstep_compute(); } @@ -3055,6 +3164,10 @@ void lammps_clearstep_compute(void *handle) { */ void lammps_addstep_compute_all(void *handle, void *newstep) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } auto ns = (bigint *) newstep; if (lmp && lmp->modify && ns) lmp->modify->addstep_compute_all(*ns); } @@ -3081,6 +3194,10 @@ void lammps_addstep_compute_all(void *handle, void *newstep) { */ void lammps_addstep_compute(void *handle, void *newstep) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } auto ns = (bigint *) newstep; if (lmp && lmp->modify && ns) lmp->modify->addstep_compute(*ns); } @@ -3139,6 +3256,10 @@ x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], :math:`\dots`); void lammps_gather_atoms(void *handle, const char *name, int type, int count, void *data) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } BEGIN_CAPTURE { @@ -3301,12 +3422,15 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, int count, void *data) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->comm || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_atoms_concat() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR,"{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,offset; @@ -3325,7 +3449,7 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, void *vptr = lmp->atom->extract(name); if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_gather_atoms_concat(): unknown property {}", name); + lmp->error->all(FLERR,"{}(): unknown property {}", FNERR, name); return; } diff --git a/src/library.h b/src/library.h index 6f1c21d748..89a9624280 100644 --- a/src/library.h +++ b/src/library.h @@ -312,6 +312,7 @@ void lammps_force_timeout(void *handle); int lammps_has_error(void *handle); int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +void lammps_set_show_error(void *handle, const int flag); int lammps_python_api_version(); From aabfef6d0bf4ececa6b9c66804ab49b316b4c948 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 22:20:02 -0400 Subject: [PATCH 71/99] update packaging to conform with suggested packaging changes --- python/setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/setup.py b/python/setup.py index 3bcab8faa1..72f8e883b7 100644 --- a/python/setup.py +++ b/python/setup.py @@ -44,6 +44,7 @@ else: setup( name = "lammps", version = get_lammps_version(), + license = "GPL-2.0-only", author = "The LAMMPS Developers", author_email = "developers@lammps.org", url = "https://www.lammps.org", @@ -57,11 +58,10 @@ setup( "Programming Language :: Python :: 3", "Development Status :: 5 - Production/Stable", "Environment :: Console", - "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Operating System :: OS Independent", ], - license = "GPL", packages = pkgs, package_data = pkgdata, distclass = bdist, + python_requires = '>=3.6', ) From 2b718d3b86090be55696e153eb53be2b871f5ef6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 22:20:34 -0400 Subject: [PATCH 72/99] add interface to lammps_set_show_error() --- python/lammps/core.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/python/lammps/core.py b/python/lammps/core.py index d4609d3b5d..f9e297e7f9 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -2124,6 +2124,25 @@ class lammps(object): # ------------------------------------------------------------------------- + def set_show_error(self, flag): + """ Enable or disable direct printing of error messages in C++ code + + .. versionadded:: TBD + + This function allows to enable or disable printing of error message directly in + the C++ code. Disabling the printing avoids printing error messages twice when + detecting and re-throwing them in Python code. + + This is a wrapper around the :cpp:func:`lammps_set_show_error` + function of the library interface. + + :param flag: enable (1) or disable (0) printing of error message + :type flag: int + """ + self.lib.lammps_set_show_error(self.lmp, flag) + + # ------------------------------------------------------------------------- + def force_timeout(self): """ Trigger an immediate timeout, i.e. a "soft stop" of a run. From 9577343429214670a0075291f281db87c9909e47 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 22:21:05 -0400 Subject: [PATCH 73/99] use a global constant for a common string buffer size --- python/lammps/constants.py | 2 ++ python/lammps/core.py | 35 +++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/python/lammps/constants.py b/python/lammps/constants.py index 1d0d8adb78..3a66eac661 100644 --- a/python/lammps/constants.py +++ b/python/lammps/constants.py @@ -50,6 +50,8 @@ LMP_VAR_ATOM = 1 LMP_VAR_VECTOR = 2 LMP_VAR_STRING = 3 +# default buffer size for string buffers +LMP_BUFSIZE = 1024 # ------------------------------------------------------------------------- def get_ctypes_int(size): diff --git a/python/lammps/core.py b/python/lammps/core.py index f9e297e7f9..92e73adc1c 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -29,7 +29,7 @@ from lammps.constants import LAMMPS_AUTODETECT, LAMMPS_STRING, \ LMP_TYPE_SCALAR, LMP_TYPE_VECTOR, LMP_TYPE_ARRAY, \ LMP_SIZE_VECTOR, LMP_SIZE_ROWS, LMP_SIZE_COLS, \ LMP_VAR_EQUAL, LMP_VAR_ATOM, LMP_VAR_VECTOR, LMP_VAR_STRING, \ - get_ctypes_int + LMP_BUFSIZE, get_ctypes_int from lammps.data import NeighList @@ -347,6 +347,7 @@ class lammps(object): self.lib.lammps_get_last_error_message.argtypes = [c_void_p, c_char_p, c_int] self.lib.lammps_get_last_error_message.restype = c_int + self.lib.lammps_set_show_error.argtypes = [c_void_p, c_int] self.lib.lammps_extract_global.argtypes = [c_void_p, c_char_p] self.lib.lammps_extract_global_datatype.argtypes = [c_void_p, c_char_p] @@ -704,8 +705,8 @@ class lammps(object): :rtype: string """ - sb = create_string_buffer(512) - self.lib.lammps_get_os_info(sb,512) + sb = create_string_buffer(LMP_BUFSIZE) + self.lib.lammps_get_os_info(sb, LMP_BUFSIZE) return sb.value.decode() # ------------------------------------------------------------------------- @@ -734,8 +735,8 @@ class lammps(object): @property def _lammps_exception(self): - sb = create_string_buffer(100) - error_type = self.lib.lammps_get_last_error_message(self.lmp, sb, 100) + sb = create_string_buffer(LMP_BUFSIZE) + error_type = self.lib.lammps_get_last_error_message(self.lmp, sb, LMP_BUFSIZE) error_msg = sb.value.decode().strip() if error_type == 2: @@ -2319,8 +2320,9 @@ class lammps(object): :rtype: string """ - sb = create_string_buffer(8192) - self.lib.lammps_get_gpu_device_info(sb,8192) + BUFSIZE = 8192 + sb = create_string_buffer(BUFSIZE) + self.lib.lammps_get_gpu_device_info(sb, BUFSIZE) return sb.value.decode() # ------------------------------------------------------------------------- @@ -2337,9 +2339,9 @@ class lammps(object): if self._installed_packages is None: self._installed_packages = [] npackages = self.lib.lammps_config_package_count() - sb = create_string_buffer(100) + sb = create_string_buffer(LMP_BUFSIZE) for idx in range(npackages): - self.lib.lammps_config_package_name(idx, sb, 100) + self.lib.lammps_config_package_name(idx, sb, LMP_BUFSIZE) self._installed_packages.append(sb.value.decode()) return self._installed_packages @@ -2375,6 +2377,7 @@ class lammps(object): :return: list of style names in given category :rtype: list """ + BUFSIZE = 8192 if self._available_styles is None: self._available_styles = {} @@ -2382,10 +2385,10 @@ class lammps(object): self._available_styles[category] = [] with ExceptionCheck(self): nstyles = self.lib.lammps_style_count(self.lmp, category.encode()) - sb = create_string_buffer(100) + sb = create_string_buffer(BUFSIZE) for idx in range(nstyles): with ExceptionCheck(self): - self.lib.lammps_style_name(self.lmp, category.encode(), idx, sb, 100) + self.lib.lammps_style_name(self.lmp, category.encode(), idx, sb, BUFSIZE) self._available_styles[category].append(sb.value.decode()) return self._available_styles[category] @@ -2430,9 +2433,9 @@ class lammps(object): available_ids = [] if category in categories: num = self.lib.lammps_id_count(self.lmp, category.encode()) - sb = create_string_buffer(100) + sb = create_string_buffer(LMP_BUFSIZE) for idx in range(num): - self.lib.lammps_id_name(self.lmp, category.encode(), idx, sb, 100) + self.lib.lammps_id_name(self.lmp, category.encode(), idx, sb, LMP_BUFSIZE) available_ids.append(sb.value.decode()) return available_ids @@ -2452,10 +2455,10 @@ class lammps(object): available_plugins = [] num = self.lib.lammps_plugin_count(self.lmp) - sty = create_string_buffer(100) - nam = create_string_buffer(100) + sty = create_string_buffer(LMP_BUFSIZE) + nam = create_string_buffer(LMP_BUFSIZE) for idx in range(num): - self.lib.lammps_plugin_name(idx, sty, nam, 100) + self.lib.lammps_plugin_name(idx, sty, nam, LMP_BUFSIZE) available_plugins.append([sty.value.decode(), nam.value.decode()]) return available_plugins From 3a18ca5197f7a148e6954cc3841b5f6ad07ce407 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 23 Mar 2025 23:17:53 -0400 Subject: [PATCH 74/99] updates, recover failed tests with -DLAMMPS_BIGBIG --- src/library.cpp | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 436c95f770..c1d47022a0 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1433,13 +1433,7 @@ internally by the :doc:`Fortran interface ` and are not likely to be us int lammps_extract_setting(void *handle, const char *keyword) { - auto lmp = (LAMMPS *) handle; - if (!lmp || !lmp->domain || !lmp->force || !lmp->comm || !lmp->universe || !lmp->atom) { - lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); - return -1; - } - -// This can be customized by adding keywords and documenting them in the section above. + // This can be customized by adding keywords and documenting them in the section above. if (strcmp(keyword,"bigint") == 0) return sizeof(bigint); if (strcmp(keyword,"tagint") == 0) return sizeof(tagint); if (strcmp(keyword,"imageint") == 0) return sizeof(imageint); @@ -1449,6 +1443,12 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"IMG2BITS") == 0) return IMG2BITS; if (strcmp(keyword,"IMGMAX") == 0) return IMGMAX; + auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->domain || !lmp->force || !lmp->comm || !lmp->universe || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } + if (strcmp(keyword,"dimension") == 0) return lmp->domain->dimension; if (strcmp(keyword,"box_exist") == 0) return lmp->domain->box_exist; if (strcmp(keyword,"kokkos_active") == 0) return (lmp->kokkos) ? 1 : 0; @@ -2816,7 +2816,7 @@ a char pointer and it should **not** be deallocated. Example: void *lammps_extract_variable(void *handle, const char *name, const char *group) { auto lmp = (LAMMPS *) handle; - if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { + if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable || !lmp->group) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; } @@ -2824,7 +2824,8 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) BEGIN_CAPTURE { int ivar = lmp->input->variable->find(name); - if (ivar < 0) return nullptr; + if (ivar < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Variable {} does not exist", FNERR, name); if (lmp->input->variable->equalstyle(ivar)) { auto dptr = (double *) malloc(sizeof(double)); @@ -2833,7 +2834,8 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group) } else if (lmp->input->variable->atomstyle(ivar)) { if (group == nullptr) group = (char *)"all"; int igroup = lmp->group->find(group); - if (igroup < 0) return nullptr; + if (igroup < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Group {} does not exist", FNERR, group); int nlocal = lmp->atom->nlocal; auto vector = (double *) malloc(nlocal*sizeof(double)); lmp->input->variable->compute_atom(ivar,igroup,vector,1,0); @@ -2887,7 +2889,8 @@ int lammps_extract_variable_datatype(void *handle, const char *name) BEGIN_CAPTURE { int ivar = lmp->input->variable->find(name); - if (ivar < 0) return -1; + if (ivar < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Variable {} does not exist", FNERR, name); if (lmp->input->variable->equalstyle(ivar)) return LMP_VAR_EQUAL; @@ -3018,7 +3021,9 @@ int lammps_set_internal_variable(void *handle, const char *name, double value) BEGIN_CAPTURE { int ivar = lmp->input->variable->find(name); - if (ivar < 0) return -1; + if (ivar < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Variable {} does not exist", FNERR, name); + if (lmp->input->variable->internalstyle(ivar)) { lmp->input->variable->internal_set(ivar, value); return 0; @@ -3264,8 +3269,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_atoms() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,offset; @@ -3277,7 +3281,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (flag) { - lmp->error->all(FLERR,"lammps_gather_atoms(): Atom-IDs must exist and be consecutive"); + lmp->error->all(FLERR, "{}(): Atom-IDs must exist and be consecutive", FNERR); return; } @@ -3285,7 +3289,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo void *vptr = lmp->atom->extract(name); if (vptr == nullptr) { - lmp->error->all(FLERR, "lammps_gather_atoms(): unknown property {}", name); + lmp->error->all(FLERR, "{}(): unknown property {}", FNERR, name); return; } @@ -3360,7 +3364,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo MPI_Allreduce(copy,data,count*natoms,MPI_DOUBLE,MPI_SUM,lmp->world); lmp->memory->destroy(copy); } else { - lmp->error->all(FLERR,"lammps_gather_atoms(): unsupported data type"); + lmp->error->all(FLERR,"{}(): unsupported data type: {}", FNERR, type); return; } #endif @@ -3430,7 +3434,7 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); + lmp->error->all(FLERR, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,offset; @@ -3441,7 +3445,7 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (flag) { - lmp->error->all(FLERR,"lammps_gather_atoms_concat(): Atom-IDs must exist"); + lmp->error->all(FLERR, "{}(): Atom-IDs must exist", FNERR); return; } @@ -7347,11 +7351,8 @@ interface functions :cpp:func:`lammps_has_error` and */ void lammps_set_show_error(void *handle, const int flag) { - if (handle) { - LAMMPS *lmp = (LAMMPS *) handle; - Error *error = lmp->error; - error->set_show_error(flag); - } + LAMMPS *lmp = (LAMMPS *) handle; + if (lmp && lmp->error) lmp->error->set_show_error(flag); } /* ---------------------------------------------------------------------- */ From 15cdba0bf0681b1de7e9fcec18f0fa6fbf053bfd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 04:13:24 -0400 Subject: [PATCH 75/99] have Error::set_show_error() return the previous setting --- doc/src/Library_utility.rst | 6 ++++++ python/lammps/core.py | 3 +++ src/error.cpp | 5 ++++- src/error.h | 2 +- src/library.cpp | 10 +++++++--- src/library.h | 2 +- 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/doc/src/Library_utility.rst b/doc/src/Library_utility.rst index e555b79c0b..b9cd568da9 100644 --- a/doc/src/Library_utility.rst +++ b/doc/src/Library_utility.rst @@ -20,6 +20,7 @@ functions. They do not directly call the LAMMPS library. - :cpp:func:`lammps_force_timeout` - :cpp:func:`lammps_has_error` - :cpp:func:`lammps_get_last_error_message` +- :cpp:func:`lammps_set_show_error` - :cpp:func:`lammps_python_api_version` The :cpp:func:`lammps_free` function is a clean-up function to free @@ -110,6 +111,11 @@ where such memory buffers were allocated that require the use of ----------------------- +.. doxygenfunction:: lammps_set_show_error + :project: progguide + +----------------------- + .. doxygenfunction:: lammps_python_api_version :project: progguide diff --git a/python/lammps/core.py b/python/lammps/core.py index 92e73adc1c..537472d636 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -348,6 +348,7 @@ class lammps(object): self.lib.lammps_get_last_error_message.argtypes = [c_void_p, c_char_p, c_int] self.lib.lammps_get_last_error_message.restype = c_int self.lib.lammps_set_show_error.argtypes = [c_void_p, c_int] + self.lib.lammps_set_show_error.restype = c_int self.lib.lammps_extract_global.argtypes = [c_void_p, c_char_p] self.lib.lammps_extract_global_datatype.argtypes = [c_void_p, c_char_p] @@ -2139,6 +2140,8 @@ class lammps(object): :param flag: enable (1) or disable (0) printing of error message :type flag: int + :return: previous setting of the flag + :rtype: int """ self.lib.lammps_set_show_error(self.lmp, flag) diff --git a/src/error.cpp b/src/error.cpp index 25a172a07e..3e17fec2e8 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -315,9 +315,12 @@ void Error::set_last_error(const char *msg, ErrorType type) /* ---------------------------------------------------------------------- enable or disable printing error messages. for use with library interface. if flag = 0 only last error message and type are updated. + returns the previous setting. ------------------------------------------------------------------------- */ -void Error::set_show_error(const int flag) +int Error::set_show_error(const int flag) { + int oldflag = show_error showerror = flag; + return oldflag; } diff --git a/src/error.h b/src/error.h index 668cdce2dd..5f5b349bc8 100644 --- a/src/error.h +++ b/src/error.h @@ -98,7 +98,7 @@ class Error : protected Pointers { std::string get_last_error() const; ErrorType get_last_error_type() const; void set_last_error(const char *msg, ErrorType type = ERROR_NORMAL); - void set_show_error(const int flag); + int set_show_error(const int flag); private: std::string last_error_message; diff --git a/src/library.cpp b/src/library.cpp index c1d47022a0..23da26cb03 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -7342,17 +7342,21 @@ This function can be used to stop LAMMPS from printing error messages it may be left to the code calling the library interface whether to check for them, and retrieve and print error messages using the library interface functions :cpp:func:`lammps_has_error` and -:cpp:func:`lammps_get_last_error_message`. +:cpp:func:`lammps_get_last_error_message`. The function returns the +previous setting so that one can easily override the setting +temporarily and restore it afterwards. \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *`` or NULL * \param flag enable (not 0) or disable (0) printing error messages before throwing exception + * \return previous setting of the flag */ -void lammps_set_show_error(void *handle, const int flag) +int lammps_set_show_error(void *handle, const int flag) { LAMMPS *lmp = (LAMMPS *) handle; - if (lmp && lmp->error) lmp->error->set_show_error(flag); + if (lmp && lmp->error) return lmp->error->set_show_error(flag); + return 1; // default value } /* ---------------------------------------------------------------------- */ diff --git a/src/library.h b/src/library.h index 89a9624280..1744d99fcf 100644 --- a/src/library.h +++ b/src/library.h @@ -312,7 +312,7 @@ void lammps_force_timeout(void *handle); int lammps_has_error(void *handle); int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); -void lammps_set_show_error(void *handle, const int flag); +int lammps_set_show_error(void *handle, const int flag); int lammps_python_api_version(); From e0322b96ec128991221afa5c93c3e666d222c144 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 04:33:27 -0400 Subject: [PATCH 76/99] sync new library interface function across all interfaced derived packages --- examples/COUPLE/plugin/liblammpsplugin.c | 1 + examples/COUPLE/plugin/liblammpsplugin.h | 4 +++- fortran/lammps.f90 | 16 ++++++++++++++++ src/error.cpp | 2 +- src/library.h | 4 +--- tools/swig/lammps.i | 2 ++ 6 files changed, 24 insertions(+), 5 deletions(-) diff --git a/examples/COUPLE/plugin/liblammpsplugin.c b/examples/COUPLE/plugin/liblammpsplugin.c index 619b8828fc..87cf58729c 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.c +++ b/examples/COUPLE/plugin/liblammpsplugin.c @@ -204,6 +204,7 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(has_error); ADDSYM(get_last_error_message); } + ADDSYM(set_show_error); ADDSYM(python_api_version); return lmp; diff --git a/examples/COUPLE/plugin/liblammpsplugin.h b/examples/COUPLE/plugin/liblammpsplugin.h index c347dac4c1..3732b3a5c0 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.h +++ b/examples/COUPLE/plugin/liblammpsplugin.h @@ -109,6 +109,7 @@ struct _liblammpsplugin { int abiversion; int has_exceptions; void *handle; + #if defined(LAMMPS_LIB_MPI) void *(*open)(int, char **, MPI_Comm, void **); #else @@ -187,7 +188,7 @@ struct _liblammpsplugin { * the ifdef ensures they are compatible with rest of LAMMPS * caller must match to how LAMMPS library is built */ -#ifndef LAMMPS_BIGBIG +#if !defined(LAMMPS_BIGBIG) int (*create_atoms)(void *, int, int *, int *, double *, double *, int *, int); #else int (*create_atoms)(void *, int, int64_t *, int *, double *, double *, int64_t *, int); @@ -255,6 +256,7 @@ struct _liblammpsplugin { int (*has_error)(void *); int (*get_last_error_message)(void *, char *, int); + int (*set_show_error)(void *, const int); int (*python_api_version)(); }; diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index 9922fd1f2d..fdd10167bf 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -248,6 +248,7 @@ MODULE LIBLAMMPS PROCEDURE :: force_timeout => lmp_force_timeout PROCEDURE :: has_error => lmp_has_error PROCEDURE :: get_last_error_message => lmp_get_last_error_message + PROCEDURE :: set_show_error => lmp_set_show_error END TYPE lammps INTERFACE lammps @@ -1041,6 +1042,13 @@ MODULE LIBLAMMPS INTEGER(c_int), VALUE :: buf_size END FUNCTION lammps_get_last_error_message + INTEGER(c_int) FUNCTION lammps_set_show_error(handle,flag) BIND(C) + IMPORT :: c_ptr, c_int + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle + INTEGER(c_int), VALUE :: flag + END FUNCTION lammps_set_show_error + !--------------------------------------------------------------------- ! Utility functions imported for convenience (not in library.h) !--------------------------------------------------------------------- @@ -3666,6 +3674,14 @@ CONTAINS END IF END SUBROUTINE lmp_get_last_error_message + ! equivalent function to lammps_set_show_error + INTEGER FUNCTION lmp_set_show_error(self, flag) + CLASS(lammps), INTENT(IN) :: self + INTEGER, INTENT(IN) :: flag + + lmp_set_show_error = lammps_set_show_error(self%handle, flag) + END FUNCTION lmp_set_show_error + ! ---------------------------------------------------------------------- ! functions to assign user-space pointers to LAMMPS data ! ---------------------------------------------------------------------- diff --git a/src/error.cpp b/src/error.cpp index 3e17fec2e8..6de19b6323 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -320,7 +320,7 @@ void Error::set_last_error(const char *msg, ErrorType type) int Error::set_show_error(const int flag) { - int oldflag = show_error + int oldflag = showerror; showerror = flag; return oldflag; } diff --git a/src/library.h b/src/library.h index 1744d99fcf..0d57fdaf78 100644 --- a/src/library.h +++ b/src/library.h @@ -287,10 +287,8 @@ void lammps_decode_image_flags(int64_t image, int *flags); #if defined(LAMMPS_BIGBIG) typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); -#elif defined(LAMMPS_SMALLBIG) -typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **); #else -typedef void (*FixExternalFnPtr)(void *, int, int, int *, double **, double **); +typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **); #endif void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, diff --git a/tools/swig/lammps.i b/tools/swig/lammps.i index 476e6ad17d..1ed36d61c8 100644 --- a/tools/swig/lammps.i +++ b/tools/swig/lammps.i @@ -222,6 +222,7 @@ extern int lammps_is_running(void *handle); extern void lammps_force_timeout(void *handle); extern int lammps_has_error(void *handle); extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +extern int lammps_set_show_error(void *handle, const int flag); extern int lammps_python_api_version(); %} @@ -418,6 +419,7 @@ extern int lammps_is_running(void *handle); extern void lammps_force_timeout(void *handle); extern int lammps_has_error(void *handle); extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +extern int lammps_set_show_error(void *handle, const int flag); extern int lammps_python_api_version(); /* last revised on 3 October 2022 */ From 350fa4ddec078984aacc202c7fffd7d6d0044061 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 05:25:11 -0400 Subject: [PATCH 77/99] more library interface argument checking and error handling --- src/library.cpp | 206 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 162 insertions(+), 44 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 23da26cb03..8cf3cb3d6a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2184,6 +2184,7 @@ void *lammps_extract_pair(void * handle, const char *name) lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; } + if (!name) return nullptr; int dim = -1; return lmp->force->pair->extract(name, dim); @@ -2217,6 +2218,8 @@ int lammps_map_atom(void *handle, const void *id) lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; } + if (!id) return -1; + auto tag = (const tagint *) id; if (lmp->atom->map_style > Atom::MAP_NONE) return lmp->atom->map(*tag); @@ -6042,12 +6045,19 @@ int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->neighbor || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } + if (!id) return -1; + auto compute = lmp->modify->get_compute_by_id(id); - if (!compute) return -1; + if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not exist", FNERR, id); // find neigh list for (int i = 0; i < lmp->neighbor->nlist; i++) { - NeighList * list = lmp->neighbor->lists[i]; + NeighList *list = lmp->neighbor->lists[i]; if ((list->requestor_type == NeighList::COMPUTE) && (compute == list->requestor) && (list->id == reqid) ) return i; @@ -6066,13 +6076,17 @@ int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { */ int lammps_neighlist_num_elements(void *handle, int idx) { auto lmp = (LAMMPS *) handle; - Neighbor * neighbor = lmp->neighbor; + if (!lmp || !lmp->error || !lmp->neighbor) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + Neighbor *neighbor = lmp->neighbor; if (idx < 0 || idx >= neighbor->nlist) { return -1; } - NeighList * list = neighbor->lists[idx]; + NeighList *list = neighbor->lists[idx]; return list->inum; } @@ -6091,8 +6105,14 @@ int lammps_neighlist_num_elements(void *handle, int idx) { void lammps_neighlist_element_neighbors(void *handle, int idx, int element, int *iatom, int *numneigh, int **neighbors) { - auto lmp = (LAMMPS *) handle; - Neighbor * neighbor = lmp->neighbor; + auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->neighbor) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!iatom || !numneigh || !neighbors) return; + + Neighbor *neighbor = lmp->neighbor; *iatom = -1; *numneigh = 0; *neighbors = nullptr; @@ -6101,7 +6121,7 @@ void lammps_neighlist_element_neighbors(void *handle, int idx, int element, int return; } - NeighList * list = neighbor->lists[idx]; + NeighList *list = neighbor->lists[idx]; if (element < 0 || element >= list->inum) { return; @@ -6136,6 +6156,11 @@ growing with every new LAMMPS release. int lammps_version(void *handle) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + return lmp->num_ver; } @@ -6162,7 +6187,8 @@ string is typically a few hundred bytes long. void lammps_get_os_info(char *buffer, int buf_size) { - if (buf_size <=0) return; + if (!buffer || (buf_size <=0)) return; + buffer[0] = buffer[buf_size-1] = '\0'; std::string txt = platform::os_info() + "\n"; txt += platform::compiler_info(); @@ -6329,6 +6355,7 @@ specific :doc:`LAMMPS package ` provided as argument. * \return 1 if included, 0 if not. */ int lammps_config_has_package(const char *name) { + if (!name) return 0; return Info::has_package(name) ? 1 : 0; } @@ -6369,6 +6396,8 @@ the function returns 0 and *buffer* is set to an empty string, otherwise 1; * \return 1 if successful, otherwise 0 */ int lammps_config_package_name(int idx, char *buffer, int buf_size) { + if (!buffer) return 0; + int maxidx = lammps_config_package_count(); if ((idx < 0) || (idx >= maxidx)) { buffer[0] = '\0'; @@ -6450,7 +6479,8 @@ string can be several kilobytes long, if multiple devices are present. void lammps_get_gpu_device_info(char *buffer, int buf_size) { - if (buf_size <= 0) return; + if (!buffer || (buf_size <= 0)) return; + buffer[0] = buffer[buf_size-1] = '\0'; std::string devinfo = Info::get_gpu_device_info(); strncpy(buffer, devinfo.c_str(), buf_size-1); @@ -6475,6 +6505,12 @@ Valid categories are: *atom*\ , *integrate*\ , *minimize*\ , */ int lammps_has_style(void *handle, const char *category, const char *name) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!category || !name) return 0; + Info info(lmp); return info.has_style(category, name) ? 1 : 0; } @@ -6496,6 +6532,12 @@ categories. */ int lammps_style_count(void *handle, const char *category) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!category) return 0; + Info info(lmp); return info.get_available_styles(category).size(); } @@ -6521,6 +6563,12 @@ int lammps_style_count(void *handle, const char *category) { */ int lammps_style_name(void *handle, const char *category, int idx, char *buffer, int buf_size) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!category || !buffer) return 0; + Info info(lmp); auto styles = info.get_available_styles(category); @@ -6554,6 +6602,12 @@ the given *name* exists. Valid categories are: *compute*\ , *dump*\ , */ int lammps_has_id(void *handle, const char *category, const char *name) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom + || !lmp->domain || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!category || !name) return 0; if (strcmp(category,"compute") == 0) { if (lmp->modify->get_compute_by_id(name)) return 1; @@ -6594,6 +6648,13 @@ categories. */ int lammps_id_count(void *handle, const char *category) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom + || !lmp->domain || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!category) return 0; + if (strcmp(category,"compute") == 0) { return lmp->modify->get_compute_list().size(); } else if (strcmp(category,"dump") == 0) { @@ -6638,7 +6699,12 @@ set to an empty string, otherwise 1. */ int lammps_id_name(void *handle, const char *category, int idx, char *buffer, int buf_size) { auto lmp = (LAMMPS *) handle; - if (idx < 0) return 0; + if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom + || !lmp->domain || !lmp->input || !lmp->input->variable) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } + if (!buffer || !category || (idx < 0)) return 0; if (strcmp(category,"compute") == 0) { auto icompute = lmp->modify->get_compute_by_index(idx); @@ -6733,12 +6799,13 @@ set to an empty string, otherwise 1. int lammps_plugin_name(int idx, char *stylebuf, char *namebuf, int buf_size) { #if defined(LMP_PLUGIN) + if (!stylebuf || !namebuf) return 0; stylebuf[0] = namebuf[0] = '\0'; const lammpsplugin_t *plugin = plugin_get_info(idx); if (plugin) { - strncpy(stylebuf,plugin->style,buf_size); - strncpy(namebuf,plugin->name,buf_size); + strncpy(stylebuf, plugin->style, buf_size); + strncpy(namebuf, plugin->name, buf_size); return 1; } #endif @@ -6857,20 +6924,28 @@ external code. * \param funcptr pointer to callback function * \param ptr pointer to object in calling code, passed to callback function as first argument */ -void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr) +void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, + void *ptr) { auto lmp = (LAMMPS *) handle; - auto callback = (FixExternal::FnPtr) funcptr; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id || !ptr) return; + + auto callback = (FixExternal::FnPtr) funcptr; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Cannot find fix with ID '{}'!", id); - - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style 'external'", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); + fext->set_callback(callback, ptr); } END_CAPTURE @@ -6921,15 +6996,22 @@ external code. double **lammps_fix_external_get_force(void *handle, const char *id) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return nullptr; + } + if (!id) return nullptr; + double **fexternal = nullptr; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); int tmp; fexternal = (double **)fix->extract("fexternal",tmp); @@ -6969,16 +7051,22 @@ external code. void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); - - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "Fix {} is not of style external", FNERR, id); + fext->set_energy_global(eng); } END_CAPTURE @@ -7017,16 +7105,22 @@ external code. void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id || !virial) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); - auto fext = dynamic_cast(fix); fext->set_virial_global(virial); } END_CAPTURE @@ -7065,16 +7159,22 @@ external code. void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id || !eng) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); - - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "Fix {} is not of style external", FNERR, id); + fext->set_energy_peratom(eng); } END_CAPTURE @@ -7116,16 +7216,22 @@ external code. void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id || !virial) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); - auto fext = dynamic_cast(fix); fext->set_virial_peratom(virial); } END_CAPTURE @@ -7160,16 +7266,22 @@ external code. void lammps_fix_external_set_vector_length(void *handle, const char *id, int len) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); - - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); + fext->set_vector_length(len); } END_CAPTURE @@ -7214,16 +7326,22 @@ external code. void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!id) return; BEGIN_CAPTURE { auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + auto fext = dynamic_cast(fix); + if (!fext || (strcmp("external",fix->style) != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); - auto fext = dynamic_cast(fix); fext->set_vector(idx, val); } END_CAPTURE From 7b5c281596115f66aca171b384ee481af505832b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 05:52:47 -0400 Subject: [PATCH 78/99] when calling Error we must wrap the code in BEGIN/END capture --- src/library.cpp | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 8cf3cb3d6a..b3c48cc59a 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -6051,17 +6051,22 @@ int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { } if (!id) return -1; - auto compute = lmp->modify->get_compute_by_id(id); - if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, - "{}(): Compute {} does not exist", FNERR, id); + BEGIN_CAPTURE + { + auto compute = lmp->modify->get_compute_by_id(id); + if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not exist", FNERR, id); - // find neigh list - for (int i = 0; i < lmp->neighbor->nlist; i++) { - NeighList *list = lmp->neighbor->lists[i]; - if ((list->requestor_type == NeighList::COMPUTE) - && (compute == list->requestor) - && (list->id == reqid) ) return i; + // find neigh list + for (int i = 0; i < lmp->neighbor->nlist; i++) { + NeighList *list = lmp->neighbor->lists[i]; + if ((list->requestor_type == NeighList::COMPUTE) + && (compute == list->requestor) + && (list->id == reqid) ) return i; + } } + END_CAPTURE + return -1; } From b45c811fbb29368463af552f6b4ce227bf614dd0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 09:15:19 -0400 Subject: [PATCH 79/99] more argument error improvements --- src/library.cpp | 112 +++++++++++++++++++++++++++++------------------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index b3c48cc59a..cbedd4f46d 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -5613,7 +5613,7 @@ be {1, 100, 57}. loop over Ndata, if I own atom ID, set its values from data ------------------------------------------------------------------------- */ -void lammps_scatter_subset(void *handle, const char *name,int type, int count, int ndata, +void lammps_scatter_subset(void *handle, const char *name, int type, int count, int ndata, int *ids, void *data) { auto lmp = (LAMMPS *) handle; @@ -5864,26 +5864,21 @@ int lammps_create_atoms(void *handle, int n, const tagint *id, const int *type, int bexpand) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->domain || !lmp->atom) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } + if (!type || !x) return -1; bigint natoms_prev = lmp->atom->natoms; BEGIN_CAPTURE { // error if box does not exist or tags not defined - - int flag = 0; - std::string msg("Failure in lammps_create_atoms(): "); if (lmp->domain->box_exist == 0) { - flag = 1; - msg += "trying to create atoms before before simulation box is defined"; - } - if (lmp->atom->tag_enable == 0) { - flag = 1; - msg += "must have atom IDs to use this function"; - } - - if (flag) { - lmp->error->all(FLERR, msg); - return -1; + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Cannot create atoms before before simulation box is defined", FNERR); + } else if (lmp->atom->tag_enable == 0) { + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Must have atom IDs to create atoms", FNERR); } // loop over all N atoms on all MPI ranks @@ -5986,17 +5981,27 @@ int lammps_create_atoms(void *handle, int n, const tagint *id, const int *type, int lammps_find_pair_neighlist(void *handle, const char *style, int exact, int nsub, int reqid) { auto lmp = (LAMMPS *) handle; - Pair *pair = lmp->force->pair_match(style, exact, nsub); + if (!lmp || !lmp->error || !lmp->neighbor || !lmp->force) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; + } + if (!style) return -1; - if (pair != nullptr) { - // find neigh list - for (int i = 0; i < lmp->neighbor->nlist; i++) { - NeighList *list = lmp->neighbor->lists[i]; - if ((list->requestor_type == NeighList::PAIR) - && (pair == list->requestor) - && (list->id == reqid) ) return i; + BEGIN_CAPTURE + { + auto *pair = lmp->force->pair_match(style, exact, nsub); + if (!pair) { + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Pair style {} does not exist", FNERR, style); + } else { + // find neigh list + for (int i = 0; i < lmp->neighbor->nlist; i++) { + NeighList *list = lmp->neighbor->lists[i]; + if ((list->requestor_type == NeighList::PAIR) && (pair == list->requestor) + && (list->id == reqid) ) return i; + } } } + END_CAPTURE return -1; } @@ -6016,16 +6021,27 @@ int lammps_find_pair_neighlist(void *handle, const char *style, int exact, int n int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { auto lmp = (LAMMPS *) handle; - auto fix = lmp->modify->get_fix_by_id(id); - if (!fix) return -1; - - // find neigh list - for (int i = 0; i < lmp->neighbor->nlist; i++) { - NeighList *list = lmp->neighbor->lists[i]; - if ((list->requestor_type == NeighList::FIX) - && (fix == list->requestor) - && (list->id == reqid) ) return i; + if (!lmp || !lmp->error || !lmp->neighbor || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return -1; } + if (!id) return -1; + + BEGIN_CAPTURE + { + auto fix = lmp->modify->get_fix_by_id(id); + if (!fix) { + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); + } else { + // find neigh list + for (int i = 0; i < lmp->neighbor->nlist; i++) { + NeighList *list = lmp->neighbor->lists[i]; + if ((list->requestor_type == NeighList::FIX) && (fix == list->requestor) + && (list->id == reqid) ) return i; + } + } + } + END_CAPTURE return -1; } @@ -6054,15 +6070,15 @@ int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { BEGIN_CAPTURE { auto compute = lmp->modify->get_compute_by_id(id); - if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, - "{}(): Compute {} does not exist", FNERR, id); - - // find neigh list - for (int i = 0; i < lmp->neighbor->nlist; i++) { - NeighList *list = lmp->neighbor->lists[i]; - if ((list->requestor_type == NeighList::COMPUTE) - && (compute == list->requestor) - && (list->id == reqid) ) return i; + if (!compute) { + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, id); + } else { + // find neigh list + for (int i = 0; i < lmp->neighbor->nlist; i++) { + NeighList *list = lmp->neighbor->lists[i]; + if ((list->requestor_type == NeighList::COMPUTE) && (compute == list->requestor) + && (list->id == reqid) ) return i; + } } } END_CAPTURE @@ -7364,7 +7380,7 @@ and logfile pointers to simplify capturing output from LAMMPS library calls. * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. */ void lammps_flush_buffers(void *handle) { - utils::flush_buffers((LAMMPS *) handle); + if (handle) utils::flush_buffers((LAMMPS *) handle); } /* ---------------------------------------------------------------------- */ @@ -7384,7 +7400,7 @@ leaks. void lammps_free(void *ptr) { - free(ptr); + if (ptr) free(ptr); } /* ---------------------------------------------------------------------- */ @@ -7400,6 +7416,10 @@ void lammps_free(void *ptr) int lammps_is_running(void *handle) { auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->update) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return 0; + } return lmp->update->whichflag; } @@ -7412,7 +7432,11 @@ int lammps_is_running(void *handle) void lammps_force_timeout(void *handle) { - auto lmp = (LAMMPS *) handle; + auto lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->timer) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } return lmp->timer->force_timeout(); } From bbd057891abe4bdf8428bac71086e39975da798d Mon Sep 17 00:00:00 2001 From: Eddy Barraud Date: Mon, 24 Mar 2025 15:35:34 +0100 Subject: [PATCH 80/99] wrong qi*qj cuda code correction of cutsq[mtype].z instead of extra[j].x ! --- lib/gpu/lal_dpd_coul_slater_long.cu | 22 +++++++++++----------- lib/gpu/lal_dpd_coul_slater_long.h | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/gpu/lal_dpd_coul_slater_long.cu b/lib/gpu/lal_dpd_coul_slater_long.cu index 4835b8777b..44931195ee 100644 --- a/lib/gpu/lal_dpd_coul_slater_long.cu +++ b/lib/gpu/lal_dpd_coul_slater_long.cu @@ -287,16 +287,16 @@ __kernel void k_dpd_coul_slater_long(const __global numtyp4 *restrict x_, // apply Slater electrostatic force if distance below Slater cutoff // and the two species have a slater coeff - // cutsq[mtype].z -> Coulombic squared cutoff - if ( cutsq[mtype].z != 0.0 && rsq < cutsq[mtype].z){ + // cutsq[mtype].z -> Slater cutoff + // extra[j].x -> q[j] ; particle j charge + if ( rsq < cutsq[mtype].z ){ numtyp r2inv=ucl_recip(rsq); numtyp _erfc; numtyp grij = g_ewald * r; numtyp expm2 = ucl_exp(-grij*grij); numtyp t = ucl_recip((numtyp)1.0 + EWALD_P*grij); _erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - numtyp prefactor = extra[j].x; - prefactor *= qqrd2e * cutsq[mtype].z * qtmp/r; + numtyp prefactor = qqrd2e * extra[j].x * qtmp / r; numtyp rlamdainv = r * lamdainv; numtyp exprlmdainv = ucl_exp((numtyp)-2.0*rlamdainv); numtyp slater_term = exprlmdainv*((numtyp)1.0 + ((numtyp)2.0*rlamdainv*((numtyp)1.0+rlamdainv))); @@ -306,9 +306,9 @@ __kernel void k_dpd_coul_slater_long(const __global numtyp4 *restrict x_, if (EVFLAG && eflag) { numtyp e_slater = ((numtyp)1.0 + rlamdainv)*exprlmdainv; - numtyp e = prefactor*(_erfc-e_slater); - if (factor_coul > (numtyp)0) e -= factor_coul*prefactor*((numtyp)1.0 - e_slater); - e_coul += e; + numtyp e_sf = prefactor*(_erfc-e_slater); + if (factor_coul > (numtyp)0) e_sf -= factor_coul*prefactor*((numtyp)1.0 - e_slater); + e_coul += e_sf; } } // if cut_coulsq @@ -471,16 +471,16 @@ __kernel void k_dpd_coul_slater_long_fast(const __global numtyp4 *restrict x_, // apply Slater electrostatic force if distance below Slater cutoff // and the two species have a slater coeff - // cutsq[mtype].z -> Coulombic squared cutoff - if ( cutsq[mtype].z != 0.0 && rsq < cutsq[mtype].z){ + // cutsq[mtype].z -> Slater cutoff + // extra[j].x -> q[j] ; particle j charge + if ( rsq < cutsq[mtype].z ){ numtyp r2inv=ucl_recip(rsq); numtyp _erfc; numtyp grij = g_ewald * r; numtyp expm2 = ucl_exp(-grij*grij); numtyp t = ucl_recip((numtyp)1.0 + EWALD_P*grij); _erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - numtyp prefactor = extra[j].x; - prefactor *= qqrd2e * cutsq[mtype].z * qtmp/r; + numtyp prefactor = qqrd2e * extra[j].x * qtmp / r; numtyp rlamdainv = r * lamdainv; numtyp exprlmdainv = ucl_exp((numtyp)-2.0*rlamdainv); numtyp slater_term = exprlmdainv*((numtyp)1.0 + ((numtyp)2.0*rlamdainv*((numtyp)1.0+rlamdainv))); diff --git a/lib/gpu/lal_dpd_coul_slater_long.h b/lib/gpu/lal_dpd_coul_slater_long.h index 1870255998..007e7a2e00 100644 --- a/lib/gpu/lal_dpd_coul_slater_long.h +++ b/lib/gpu/lal_dpd_coul_slater_long.h @@ -65,7 +65,7 @@ class DPDCoulSlaterLong : public BaseDPD { /// coeff.x = a0, coeff.y = gamma, coeff.z = sigma, coeff.w = cut_dpd UCL_D_Vec coeff; - /// cutsq.x = cutsq, cutsq.y = cut_dpdsq, cutsq.w = cut_slatersq + /// cutsq.x = cutsq, cutsq.y = cut_dpdsq, cutsq.z = cut_slatersq UCL_D_Vec cutsq; /// Special LJ values From d83041222868537fbfdae824c6939e13db985103 Mon Sep 17 00:00:00 2001 From: Eddy Barraud Date: Mon, 24 Mar 2025 16:04:40 +0100 Subject: [PATCH 81/99] added boolean the read_data is not reading slater boolean of pair_coeff --- .../dpd_coul_slater_long/in.dpd_coul_slater_long | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long index bd405aad37..e683855b0d 100644 --- a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long +++ b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long @@ -30,11 +30,16 @@ comm_modify vel yes # store info of ghost atoms btw processors # Define pair style and coefficients pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} -read_data data.dpd_coul_slater_long - # Enable long range electrostatics solver kspace_style pppm 1e-04 + +read_data data.dpd_coul_slater_long + +pair_coeff * * 78.0 4.5 +pair_coeff 2*3 2*3 78.0 4.5 yes + + # Construct neighbors every steps neighbor 1.0 bin neigh_modify every 1 delay 0 check yes From b4ff184a0aef1c1e7d0d3941a19241fcf5ee19f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 24 Mar 2025 17:19:31 -0400 Subject: [PATCH 82/99] complete refactoring of handle check and error handling --- src/library.cpp | 940 +++++++++++++++++++++++------------------------- 1 file changed, 448 insertions(+), 492 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index cbedd4f46d..a77a76772e 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -300,7 +300,7 @@ multiple LAMMPS instances concurrently or sequentially. See void lammps_close(void *handle) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->comm) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -456,7 +456,7 @@ function returns. void lammps_error(void *handle, int error_type, const char *error_text) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -542,7 +542,7 @@ must be freed with :cpp:func:`lammps_free` after use to avoid a memory leak. char *lammps_expand(void *handle, const char *line) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -591,7 +591,7 @@ and :cpp:func:`Input::file()`. void lammps_file(void *handle, const char *filename) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->update || !lmp->input) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -632,7 +632,7 @@ passing a string without a command. char *lammps_command(void *handle, const char *cmd) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->update || !lmp->input) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -707,7 +707,7 @@ executing. void lammps_commands_string(void *handle, const char *str) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->update || !lmp->output || !lmp->comm || !lmp->input) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -834,7 +834,7 @@ the size of a ``bigint`` integer. double lammps_get_natoms(void *handle) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1.0; @@ -866,7 +866,7 @@ the last thermo output. double lammps_get_thermo(void *handle, const char *keyword) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->output || !lmp->output->thermo) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0.0; @@ -966,7 +966,7 @@ of a run, the lock/unlock calls have no effect. void *lammps_last_thermo(void *handle, const char *what, int index) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->update || !lmp->output || !lmp->output->thermo) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -1056,7 +1056,7 @@ void lammps_extract_box(void *handle, double *boxlo, double *boxhi, double *xy, double *yz, double *xz, int *pflags, int *boxflag) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->domain || !lmp->comm) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -1122,7 +1122,7 @@ are created. void lammps_reset_box(void *handle, double *boxlo, double *boxhi, double xy, double yz, double xz) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->domain || !lmp->comm) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -1188,7 +1188,7 @@ system it will be set to zero. void lammps_memory_usage(void *handle, double *meminfo) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -1443,7 +1443,7 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"IMG2BITS") == 0) return IMG2BITS; if (strcmp(keyword,"IMGMAX") == 0) return IMGMAX; - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->domain || !lmp->force || !lmp->comm || !lmp->universe || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2014,7 +2014,7 @@ report the "native" data type. The following tables are provided: void *lammps_extract_global(void *handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->update || !lmp->atom || !lmp->force || !lmp->domain || !lmp->domain->lattice || !lmp->update->integrate) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); @@ -2146,7 +2146,7 @@ to then decide how to cast the ``void *`` pointer and access the data. int lammps_extract_pair_dimension(void * handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->force || !lmp->force->pair) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2179,7 +2179,7 @@ pointer can be determined with :cpp:func:`lammps_extract_pair_dimension`. void *lammps_extract_pair(void * handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->force || !lmp->force->pair) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -2213,7 +2213,7 @@ using :cpp:func:`lammps_extract_setting`. int lammps_map_atom(void *handle, const void *id) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2253,7 +2253,7 @@ about the vector or array dimensions. int lammps_extract_atom_datatype(void *handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2290,7 +2290,7 @@ to decide how to cast the ``void *`` pointer and access the data. int lammps_extract_atom_size(void *handle, const char *name, int type) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2330,7 +2330,7 @@ A table with supported keywords is included in the documentation of the void *lammps_extract_atom(void *handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -2452,7 +2452,7 @@ lists the available options. void *lammps_extract_compute(void *handle, const char *id, int style, int type) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -2460,7 +2460,7 @@ void *lammps_extract_compute(void *handle, const char *id, int style, int type) BEGIN_CAPTURE { - auto compute = lmp->modify->get_compute_by_id(id); + auto *compute = lmp->modify->get_compute_by_id(id); if (!compute) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, id); @@ -2655,7 +2655,7 @@ The following table lists the available options. void *lammps_extract_fix(void *handle, const char *id, int style, int type, int nrow, int ncol) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -2663,7 +2663,7 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); @@ -2693,9 +2693,9 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, return (void *) dptr; } if (type == LMP_SIZE_VECTOR) { - if (!fix->vector_flag); - lmp->error->all(FLERR, Error::NOLASTLINE, - "{}(): Fix {} does not compute global vector", FNERR, id); + if (!fix->vector_flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not compute global vector", + FNERR, id); return (void *) &fix->size_vector; } if ((type == LMP_SIZE_ROWS) || (type == LMP_SIZE_COLS)) { @@ -2818,7 +2818,7 @@ a char pointer and it should **not** be deallocated. Example: void *lammps_extract_variable(void *handle, const char *name, const char *group) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable || !lmp->group) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -2883,7 +2883,7 @@ decide how to cast the ``void *`` pointer and access the data. int lammps_extract_variable_datatype(void *handle, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -2973,7 +2973,7 @@ a string-style variable, otherwise 0. */ int lammps_set_string_variable(void *handle, const char *name, const char *str) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -3015,7 +3015,7 @@ internal-style variable, otherwise 0. */ int lammps_set_internal_variable(void *handle, const char *name, double value) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -3062,7 +3062,7 @@ string, otherwise 1. * \return 1 if successful, otherwise 0 */ int lammps_variable_info(void *handle, int idx, char *buffer, int buf_size) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -3102,7 +3102,7 @@ the resulting (scalar) value as a floating point number. double lammps_eval(void *handle, const char *expr) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0.0; @@ -3140,7 +3140,7 @@ double lammps_eval(void *handle, const char *expr) * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. */ void lammps_clearstep_compute(void *handle) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -3171,7 +3171,7 @@ void lammps_clearstep_compute(void *handle) { * \param newstep pointer to bigint of next timestep the compute will be invoked */ void lammps_addstep_compute_all(void *handle, void *newstep) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -3201,7 +3201,7 @@ void lammps_addstep_compute_all(void *handle, void *newstep) { * \param newstep next timestep the compute will be invoked */ void lammps_addstep_compute(void *handle, void *newstep) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -3263,16 +3263,17 @@ x[0][2], x[1][0], x[1][1], x[1][2], x[2][0], :math:`\dots`); void lammps_gather_atoms(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->atom || !lmp->memory) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,offset; @@ -3283,18 +3284,13 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo if (lmp->atom->tag_enable == 0 || lmp->atom->tag_consecutive() == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; - if (flag) { - lmp->error->all(FLERR, "{}(): Atom-IDs must exist and be consecutive", FNERR); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist and be consecutive", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); - if (vptr == nullptr) { - lmp->error->all(FLERR, "{}(): unknown property {}", FNERR, name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): unknown property {}", FNERR, name); // copy = Natom length vector of per-atom values // use atom ID to insert each atom's values into copy @@ -3309,7 +3305,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo else array = (int **) vptr; int *copy; - lmp->memory->create(copy,count*natoms,"lib/gather:copy"); + lmp->memory->create(copy, count*natoms, "lib/gather:copy"); for (i = 0; i < count*natoms; i++) copy[i] = 0; tagint *tag = lmp->atom->tag; @@ -3336,7 +3332,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo } } - MPI_Allreduce(copy,data,count*natoms,MPI_INT,MPI_SUM,lmp->world); + MPI_Allreduce(copy, data, count * natoms, MPI_INT, MPI_SUM, lmp->world); lmp->memory->destroy(copy); } else if (type == 1) { @@ -3346,7 +3342,7 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo else array = (double **) vptr; double *copy; - lmp->memory->create(copy,count*natoms,"lib/gather:copy"); + lmp->memory->create(copy, count*natoms, "lib/gather:copy"); for (i = 0; i < count*natoms; i++) copy[i] = 0.0; tagint *tag = lmp->atom->tag; @@ -3364,10 +3360,10 @@ void lammps_gather_atoms(void *handle, const char *name, int type, int count, vo } } - MPI_Allreduce(copy,data,count*natoms,MPI_DOUBLE,MPI_SUM,lmp->world); + MPI_Allreduce(copy, data, count*natoms, MPI_DOUBLE, MPI_SUM, lmp->world); lmp->memory->destroy(copy); } else { - lmp->error->all(FLERR,"{}(): unsupported data type: {}", FNERR, type); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): unsupported data type: {}", FNERR, type); return; } #endif @@ -3428,7 +3424,7 @@ or :cpp:func:`lammps_extract_setting`. void lammps_gather_atoms_concat(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->atom || !lmp->comm || !lmp->memory) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -3437,7 +3433,7 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,offset; @@ -3447,18 +3443,13 @@ void lammps_gather_atoms_concat(void *handle, const char *name, int type, int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; - if (flag) { - lmp->error->all(FLERR, "{}(): Atom-IDs must exist", FNERR); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); - if (vptr == nullptr) { - lmp->error->all(FLERR,"{}(): unknown property {}", FNERR, name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown property {}", FNERR, name); // perform MPI_Allgatherv on each proc's chunk of Nlocal atoms @@ -3599,13 +3590,17 @@ x[100][2], x[57][0], x[57][1], x[57][2], x[210][0], :math:`\dots`); void lammps_gather_atoms_subset(void *handle, const char *name, int type, int count, int ndata, int *ids, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !ids || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_atoms_subset() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset; tagint id; @@ -3617,16 +3612,11 @@ void lammps_gather_atoms_subset(void *handle, const char *name, int type, if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_gather_atoms_subset(): Atom-IDs must exist and be mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist and be mapped", FNERR); void *vptr = lmp->atom->extract(name); - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_gather_atoms_subset(): unknown property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): unknown property {}", FNERR, name); // copy = Ndata length vector of per-atom values // use atom ID to insert each atom's values into copy @@ -3760,16 +3750,19 @@ atom ID (e.g., if *name* is *x* and *count* = 3, then loop over Natoms, if I own atom ID, set its values from data ------------------------------------------------------------------------- */ -void lammps_scatter_atoms(void *handle, const char *name, int type, int count, - void *data) +void lammps_scatter_atoms(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_scatter_atoms() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset; @@ -3781,19 +3774,14 @@ void lammps_scatter_atoms(void *handle, const char *name, int type, int count, flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_scatter_atoms(): " - "Atom-IDs must exist, be consecutive, and be mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Atom-IDs must exist, be consecutive, and be mapped", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); - if (vptr == nullptr) { - lmp->error->all(FLERR, "lammps_scatter_atoms(): unknown property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): unknown property {}", FNERR, name); if (type == 0) { int *vector = nullptr; @@ -3917,13 +3905,17 @@ be {1, 100, 57}. void lammps_scatter_atoms_subset(void *handle, const char *name, int type, int count, int ndata, int *ids, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !ids || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_scatter_atoms_subset() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset; tagint id; @@ -3935,16 +3927,11 @@ void lammps_scatter_atoms_subset(void *handle, const char *name, int type, if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_scatter_atoms_subset(): Atom-IDs must exist and be mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist and be mapped", FNERR); void *vptr = lmp->atom->extract(name); - if (vptr == nullptr) { - lmp->error->all(FLERR, "lammps_scatter_atoms_subset(): unknown property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown property {}", FNERR, name); if (type == 0) { int *vector = nullptr; @@ -4092,9 +4079,15 @@ Below is a brief C code demonstrating accessing this collected bond information. void lammps_gather_bonds(void *handle, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->atom->avec || !lmp->comm || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!data) return; + BEGIN_CAPTURE { - void *val = lammps_extract_global(handle,"nbonds"); + void *val = lammps_extract_global(handle, "nbonds"); bigint nbonds = *(bigint *)val; // no bonds @@ -4203,9 +4196,15 @@ Below is a brief C code demonstrating accessing this collected angle information void lammps_gather_angles(void *handle, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->atom->avec || !lmp->comm || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!data) return; + BEGIN_CAPTURE { - void *val = lammps_extract_global(handle,"nangles"); + void *val = lammps_extract_global(handle, "nangles"); bigint nangles = *(bigint *)val; // no angles @@ -4315,7 +4314,13 @@ Below is a brief C code demonstrating accessing this collected dihedral informat void lammps_gather_dihedrals(void *handle, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->atom->avec || !lmp->comm || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!data) return; + BEGIN_CAPTURE { void *val = lammps_extract_global(handle,"ndihedrals"); bigint ndihedrals = *(bigint *)val; @@ -4427,7 +4432,13 @@ Below is a brief C code demonstrating accessing this collected improper informat void lammps_gather_impropers(void *handle, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->atom->avec || !lmp->comm || !lmp->memory) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!data) return; + BEGIN_CAPTURE { void *val = lammps_extract_global(handle,"nimpropers"); bigint nimpropers = *(bigint *)val; @@ -4533,12 +4544,17 @@ given does not have per-atom data. void lammps_gather(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory || !lmp->modify) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR, "Library function lammps_gather() is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,offset,ltype; @@ -4548,38 +4564,32 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da if (lmp->atom->tag_enable == 0 || lmp->atom->tag_consecutive() == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_gather(): Atom-IDs must exist, and be consecutive"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist and be consecutive", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); // fix - if (vptr==nullptr && utils::strmatch(name,"^f_")) { - const char *fixid = name+2; - - auto fix = lmp->modify->get_fix_by_id(fixid); - if (!fix) { - lmp->error->all(FLERR,"lammps_gather(): unknown fix id {}", fixid); - return; - } - - if (fix->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather(): fix {} does not return peratom data", fixid); - return; - } - if ((count > 1) && (fix->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather: count != values peratom for fix {}", fixid); - return; - } - - if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather: fix {} not computed at compatible time", fixid); - return; - } + if (!vptr && utils::strmatch(name,"^f_")) { + const char *fixid = name + 2; + auto *fix = lmp->modify->get_fix_by_id(fixid); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, fixid); + if (fix->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): fix {} does not compute per-atom vector or array", FNERR, fixid); + if ((count > 1) && (fix->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom array with {} columns", + FNERR, count, fixid); + if ((count == 1) && (fix->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute {} per-atom vector", FNERR, count, fixid); + if (lmp->update->ntimestep % fix->peratom_freq) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}: Fix {} not computed at compatible time", + FNERR, fixid); if (count==1) vptr = (void *) fix->vector_atom; else vptr = (void *) fix->array_atom; @@ -4587,22 +4597,21 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) { + if (!vptr && utils::strmatch(name,"^c_")) { const char *compid = name+2; - auto compute = lmp->modify->get_compute_by_id(compid); - if (!compute) { - lmp->error->all(FLERR,"lammps_gather(): unknown compute id {}", compid); - return; - } - - if (compute->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather(): compute {} does not return peratom data", compid); - return; - } - if ((count > 1) && (compute->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather(): count != values peratom for compute {}", compid); - return; - } + auto *compute = lmp->modify->get_compute_by_id(compid); + if (!compute) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, compid); + if (compute->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not compute per-atom " + "vector or array", FNERR, compid); + if ((count > 1) && (compute->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom array with {} columns", + FNERR, count, compid); + if ((count == 1) && (compute->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector", FNERR, count, compid); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); @@ -4611,33 +4620,27 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da else vptr = (void *) compute->array_atom; } - // custom fix property/atom vector or array - - if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { + // custom per-atom vector or array + if (!vptr && utils::strmatch(name, "^[id]2?_")) { int idx,icol; const char *propid; - if (utils::strmatch(name,"^[id]_")) propid = name+2; - else propid = name+3; - idx = lmp->atom->find_custom(propid,ltype,icol); + if (utils::strmatch(name,"^[id]_")) propid = name + 2; + else propid = name + 3; - if (idx < 0) { - lmp->error->all(FLERR,"lammps_gather(): unknown property/atom id {}", propid); - return; - } - - if (ltype != type) { - lmp->error->all(FLERR,"lammps_gather(): mismatch property/atom type for {}", propid); - return; - } - if ((count == 1) && (icol != 0)) { - lmp->error->all(FLERR,"lammps_gather(): mismatch property/atom count for {}", propid); - return; - } - if ((count > 1) && (icol != count)) { - lmp->error->all(FLERR,"lammps_gather(): mismatch property/atom count for {}", propid); - return; - } + idx = lmp->atom->find_custom(propid, ltype, icol); + if (idx < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Could not find custom per-atom property ID {}", FNERR, propid); + if (ltype != type) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} type mismatch", FNERR, propid); + if ((count == 1) && (icol != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); + if ((count > 1) && (icol != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[idx]; @@ -4650,10 +4653,7 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da // no match - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_gather(): undefined property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown property {}", name); // copy = Natom length vector of per-atom values // use atom ID to insert each atom's values into copy @@ -4696,7 +4696,7 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da } } - MPI_Allreduce(copy,data,count*natoms,MPI_INT,MPI_SUM,lmp->world); + MPI_Allreduce(copy, data, count * natoms, MPI_INT, MPI_SUM, lmp->world); lmp->memory->destroy(copy); } else { @@ -4722,7 +4722,7 @@ void lammps_gather(void *handle, const char *name, int type, int count, void *da copy[offset++] = array[i][j]; } } - MPI_Allreduce(copy,data,count*natoms,MPI_DOUBLE,MPI_SUM,lmp->world); + MPI_Allreduce(copy, data, count * natoms, MPI_DOUBLE, MPI_SUM, lmp->world); lmp->memory->destroy(copy); } #endif @@ -4801,16 +4801,19 @@ pre-allocated by the caller to length (*count* :math:`\times` *natoms*), as quer Allreduce to sum vector into data across all procs ------------------------------------------------------------------------- */ -void lammps_gather_concat(void *handle, const char *name, int type, int count, - void *data) +void lammps_gather_concat(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory || !lmp->modify || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_concat()" - " is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,offset,ltype; @@ -4819,37 +4822,31 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_gather_concat(): atom-IDs must exist"); - return; - } + if (flag) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); // fix - if (vptr==nullptr && utils::strmatch(name,"^f_")) { + if (!vptr && utils::strmatch(name,"^f_")) { const char *fixid = name+2; - auto fix = lmp->modify->get_fix_by_id(fixid); - if (!fix) { - lmp->error->all(FLERR,"lammps_gather_concat(): unknown fix id {}", fixid); - return; - } - - if (fix->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather_concat(): fix {} does not return peratom data", fixid); - return; - } - if ((count > 1) && (fix->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather_concat(): count != values peratom for fix {}", fixid); - return; - } - if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather_concat(): fix {} not computed at compatible time", - fixid); - return; - } + auto *fix = lmp->modify->get_fix_by_id(fixid); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, fixid); + if (fix->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): fix {} does not compute per-atom vector or array", FNERR, fixid); + if ((count > 1) && (fix->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom array with {} columns", + FNERR, count, fixid); + if ((count == 1) && (fix->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute {} per-atom vector", FNERR, count, fixid); + if (lmp->update->ntimestep % fix->peratom_freq) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}: Fix {} not computed at compatible time", + FNERR, fixid); if (count==1) vptr = (void *) fix->vector_atom; else vptr = (void *) fix->array_atom; @@ -4857,25 +4854,21 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) { - + if (!vptr && utils::strmatch(name,"^c_")) { const char *compid = name + 2; - auto compute = lmp->modify->get_compute_by_id(compid); - if (!compute) { - lmp->error->all(FLERR,"lammps_gather_concat(): unknown compute id {}", compid); - return; - } - - if (compute->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather_concat(): compute {} does not return peratom data", - compid); - return; - } - if ((count > 1) && (compute->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather_concat(): count != values peratom for compute {}", - compid); - return; - } + auto *compute = lmp->modify->get_compute_by_id(compid); + if (!compute) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, compid); + if (compute->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not compute per-atom " + "vector or array", FNERR, compid); + if ((count > 1) && (compute->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom array with {} columns", + FNERR, count, compid); + if ((count == 1) && (compute->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector", FNERR, count, compid); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); @@ -4886,31 +4879,25 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, // custom per-atom vector or array - if ((vptr==nullptr) && utils::strmatch(name,"^[id]2?_")) { - + if (!vptr && utils::strmatch(name, "^[id]2?_")) { int idx,icol; const char *propid; if (utils::strmatch(name,"^[id]_")) propid = name + 2; else propid = name + 3; - idx = lmp->atom->find_custom(propid,ltype,icol); - if (idx < 0) { - lmp->error->all(FLERR,"lammps_gather_concat(): unknown property/atom id {}", propid); - return; - } - - if (ltype != type) { - lmp->error->all(FLERR,"lammps_gather_concat(): mismatch property/atom {} type", propid); - return; - } - if ((count == 1) && (icol != 0)) { - lmp->error->all(FLERR,"lammps_gather_concat(): mismatch property/atom {} count", propid); - return; - } - if ((count > 1) && (icol != count)) { - lmp->error->all(FLERR,"lammps_gather_concat(): mismatch property/atom {} count", propid); - return; - } + idx = lmp->atom->find_custom(propid, ltype, icol); + if (idx < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Could not find custom per-atom property ID {}", FNERR, propid); + if (ltype != type) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} type mismatch", FNERR, propid); + if ((count == 1) && (icol != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); + if ((count > 1) && (icol != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[idx]; @@ -4923,16 +4910,14 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, // no match - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_gather_concat(): undefined property {}", name); - return; - } + if (!vptr) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown per-atom property {}", FNERR, name); // perform MPI_Allgatherv on each proc's chunk of Nlocal atoms int nprocs = lmp->comm->nprocs; - int *recvcounts,*displs; + int *recvcounts, *displs; lmp->memory->create(recvcounts,nprocs,"lib/gather:recvcounts"); lmp->memory->create(displs,nprocs,"lib/gather:displs"); @@ -4952,8 +4937,7 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, displs[0] = 0; for (i = 1; i < nprocs; i++) displs[i] = displs[i-1] + recvcounts[i-1]; - MPI_Allgatherv(vector,nlocal,MPI_INT,data,recvcounts,displs, - MPI_INT,lmp->world); + MPI_Allgatherv(vector, nlocal, MPI_INT, data, recvcounts, displs, MPI_INT, lmp->world); } else if (imgunpack) { int *copy; @@ -4982,7 +4966,7 @@ void lammps_gather_concat(void *handle, const char *name, int type, int count, for (i = 1; i < nprocs; i++) displs[i] = displs[i-1] + recvcounts[i-1]; MPI_Allgatherv(&array[0][0],count*nlocal,MPI_INT,data,recvcounts,displs,MPI_INT,lmp->world); - } + } } else { double *vector = nullptr; @@ -5086,16 +5070,20 @@ pre-allocated by the caller to length (*count*\ :math:`{}\times{}`\ *ndata*). Allreduce to sum vector into data across all procs ------------------------------------------------------------------------- */ -void lammps_gather_subset(void *handle, const char *name, int type, int count, - int ndata, int *ids, void *data) +void lammps_gather_subset(void *handle, const char *name, int type, int count, int ndata, int *ids, + void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory || !lmp->modify || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !ids || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_subset() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset,ltype; tagint id; @@ -5106,36 +5094,31 @@ void lammps_gather_subset(void *handle, const char *name, int type, int count, if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all (FLERR,"lammps_gather_subset(): atom IDs must be enabled and mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must be enabled and mapped", FNERR); void *vptr = lmp->atom->extract(name); // fix - if (vptr==nullptr && utils::strmatch(name,"^f_")) { - const char *fixid = name + 2; - - auto fix = lmp->modify->get_fix_by_id(fixid); - if (!fix) { - lmp->error->all(FLERR,"lammps_gather_subset(): unknown fix id {}", fixid); - return; - } - - if (fix->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather_subset(): fix {} does not return peratom data", fixid); - return; - } - if ((count > 1) && (fix->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather_subset(): count != values peratom for fix {}", fixid); - return; - } - if (lmp->update->ntimestep % fix->peratom_freq) { - lmp->error->all(FLERR,"lammps_gather_subset(): fix {} not computed at compatible time", fixid); - return; - } + if (!vptr && utils::strmatch(name,"^f_")) { + const char *fixid = name+2; + auto *fix = lmp->modify->get_fix_by_id(fixid); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, fixid); + if (fix->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): fix {} does not compute per-atom vector or array", FNERR, fixid); + if ((count > 1) && (fix->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom array with {} columns", + FNERR, count, fixid); + if ((count == 1) && (fix->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute {} per-atom vector", FNERR, count, fixid); + if (lmp->update->ntimestep % fix->peratom_freq) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}: Fix {} not computed at compatible time", + FNERR, fixid); if (count==1) vptr = (void *) fix->vector_atom; else vptr = (void *) fix->array_atom; @@ -5143,24 +5126,21 @@ void lammps_gather_subset(void *handle, const char *name, int type, int count, // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) { + if (!vptr && utils::strmatch(name,"^c_")) { const char *compid = name + 2; - auto compute = lmp->modify->get_compute_by_id(compid); - if (!compute) { - lmp->error->all(FLERR,"lammps_gather_subset(): unknown compute id {}", compid); - return; - } - - if (compute->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_gather_subset(): compute {} does not return peratom data", - compid); - return; - } - if ((count > 1) && (compute->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_gather_subset(): count != values peratom for compute {}", - compid); - return; - } + auto *compute = lmp->modify->get_compute_by_id(compid); + if (!compute) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, compid); + if (compute->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not compute per-atom " + "vector or array", FNERR, compid); + if ((count > 1) && (compute->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom array with {} columns", + FNERR, count, compid); + if ((count == 1) && (compute->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector", FNERR, count, compid); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); @@ -5169,33 +5149,27 @@ void lammps_gather_subset(void *handle, const char *name, int type, int count, else vptr = (void *) compute->array_atom; } - // custom fix property/atom vector or array - - if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { + // custom per-atom vector or array + if (!vptr && utils::strmatch(name, "^[id]2?_")) { int idx,icol; const char *propid; if (utils::strmatch(name,"^[id]_")) propid = name + 2; else propid = name + 3; - idx = lmp->atom->find_custom(propid,ltype,icol); - if (idx < 0) { - lmp->error->all(FLERR,"lammps_gather_subset(): unknown property/atom id {}", propid); - return; - } - - if (ltype != type) { - lmp->error->all(FLERR,"lammps_gather_subset(): mismatch property/atom {} type", propid); - return; - } - if (count == 1 && icol != 0) { - lmp->error->all(FLERR,"lammps_gather_subset(): mismatch property/atom {} count", propid); - return; - } - if (count > 1 && icol != count) { - lmp->error->all(FLERR,"lammps_gather_subset(): mismatch property/atom {} count", propid); - return; - } + idx = lmp->atom->find_custom(propid, ltype, icol); + if (idx < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Could not find custom per-atom property ID {}", FNERR, propid); + if (ltype != type) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} type mismatch", FNERR, propid); + if ((count == 1) && (icol != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); + if ((count > 1) && (icol != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[idx]; @@ -5208,10 +5182,8 @@ void lammps_gather_subset(void *handle, const char *name, int type, int count, // no match - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_gather_subset(): undefined property {}", name); - return; - } + if (!vptr) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown per-atom property {}", FNERR, name); // copy = Ndata length vector of per-atom values // use atom ID to insert each atom's values into copy @@ -5366,16 +5338,19 @@ x[1][2], x[2][0], :math:`\dots`}); *data* must be of length (*count* :math:`\tim Allreduce to sum vector into data across all procs ------------------------------------------------------------------------- */ -void lammps_scatter(void *handle, const char *name, int type, int count, - void *data) +void lammps_scatter(void *handle, const char *name, int type, int count, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory || !lmp->modify || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_scatter() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset,ltype; @@ -5387,32 +5362,33 @@ void lammps_scatter(void *handle, const char *name, int type, int count, flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_scatter(): atom IDs must be defined, consecutive, and mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Atom-IDs must exist, be consecutive, and be mapped", FNERR); int natoms = static_cast (lmp->atom->natoms); void *vptr = lmp->atom->extract(name); // fix - if (vptr==nullptr && utils::strmatch(name,"^f_")) { + if (!vptr && utils::strmatch(name,"^f_")) { const char *fixid = name + 2; - auto fix = lmp->modify->get_fix_by_id(fixid); - if (!fix) { - lmp->error->all(FLERR,"lammps_scatter(): unknown fix id {}", fixid); - return; - } - - if (fix->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_scatter(): fix {} does not return peratom data", fixid); - return; - } - if ((count > 1) && (fix->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_scatter(): count != values peratom for fix {}", fixid); - return; - } + auto *fix = lmp->modify->get_fix_by_id(fixid); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, fixid); + if (fix->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): fix {} does not compute per-atom vector or array", FNERR, fixid); + if ((count > 1) && (fix->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom array with {} columns", + FNERR, count, fixid); + if ((count == 1) && (fix->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute {} per-atom vector", FNERR, count, fixid); + if (lmp->update->ntimestep % fix->peratom_freq) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}: Fix {} not computed at compatible time", + FNERR, fixid); if (count==1) vptr = (void *) fix->vector_atom; else vptr = (void *) fix->array_atom; @@ -5420,22 +5396,21 @@ void lammps_scatter(void *handle, const char *name, int type, int count, // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) { - const char *compid = name + 2; - auto compute = lmp->modify->get_compute_by_id(compid); - if (!compute) { - lmp->error->all(FLERR,"lammps_scatter(): unknown compute id {}",compid); - return; - } - - if (compute->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_scatter(): compute {} does not return peratom data", compid); - return; - } - if ((count > 1) && (compute->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_scatter(): count != values peratom for compute {}", compid); - return; - } + if (!vptr && utils::strmatch(name,"^c_")) { + const char *compid = name+2; + auto *compute = lmp->modify->get_compute_by_id(compid); + if (!compute) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, compid); + if (compute->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not compute per-atom " + "vector or array", FNERR, compid); + if ((count > 1) && (compute->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom array with {} columns", + FNERR, count, compid); + if ((count == 1) && (compute->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector", FNERR, count, compid); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); @@ -5444,33 +5419,27 @@ void lammps_scatter(void *handle, const char *name, int type, int count, else vptr = (void *) compute->array_atom; } - // custom fix property/atom vector or array - - if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { + // custom per-atom vector or array + if (!vptr && utils::strmatch(name, "^[id]2?_")) { int idx,icol; const char *propid; if (utils::strmatch(name,"^[id]_")) propid = name + 2; else propid = name + 3; - idx = lmp->atom->find_custom(propid,ltype,icol); - if (idx < 0) { - lmp->error->all(FLERR,"lammps_scatter(): unknown property/atom id {}", propid); - return; - } - - if (ltype != type) { - lmp->error->all(FLERR,"lammps_scatter(): mismatch property/atom {} type", propid); - return; - } - if (count == 1 && icol != 0) { - lmp->error->all(FLERR,"lammps_scatter(): mismatch property/atom {} count", propid); - return; - } - if (count > 1 && icol != count) { - lmp->error->all(FLERR,"lammps_scatter(): mismatch property/atom {} count", propid); - return; - } + idx = lmp->atom->find_custom(propid, ltype, icol); + if (idx < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Could not find custom per-atom property ID {}", FNERR, propid); + if (ltype != type) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} type mismatch", FNERR, propid); + if ((count == 1) && (icol != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); + if ((count > 1) && (icol != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[idx]; @@ -5483,10 +5452,7 @@ void lammps_scatter(void *handle, const char *name, int type, int count, // no match - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_scatter(): unknown property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown property {}", name); if (type == 0) { int *vector = nullptr; @@ -5616,13 +5582,17 @@ be {1, 100, 57}. void lammps_scatter_subset(void *handle, const char *name, int type, int count, int ndata, int *ids, void *data) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; + if (!lmp || !lmp->error || !lmp->atom || !lmp->memory || !lmp->modify || !lmp->comm) { + lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); + return; + } + if (!name || !data) return; BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_scatter_subset() " - "is not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR, Error::NOLASTLINE, "{}() is not compatible with -DLAMMPS_BIGBIG", FNERR); #else int i,j,m,offset,ltype; tagint id; @@ -5634,31 +5604,29 @@ void lammps_scatter_subset(void *handle, const char *name, int type, int count, if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; if (lmp->atom->map_style == Atom::MAP_NONE) flag = 1; - if (flag) { - lmp->error->all(FLERR,"lammps_scatter_subset(): atom-IDs must be defined and mapped"); - return; - } + if (flag) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Atom-IDs must exist and be mapped", FNERR); void *vptr = lmp->atom->extract(name); - // fix - - if (vptr==nullptr && utils::strmatch(name,"^f_")) { + if (!vptr && utils::strmatch(name,"^f_")) { const char *fixid = name + 2; - auto fix = lmp->modify->get_fix_by_id(fixid); - if (!fix) { - lmp->error->all(FLERR,"lammps_scatter_subset(): unknown fix id {}", fixid); - return; - } - - if (fix->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_scatter_subset(): fix {} does not return peratom data", fixid); - return; - } - if ((count > 1) && (fix->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_scatter_subset(): count != values peratom for fix {}", fixid); - return; - } + auto *fix = lmp->modify->get_fix_by_id(fixid); + if (!fix) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, fixid); + if (fix->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): fix {} does not compute per-atom vector or array", FNERR, fixid); + if ((count > 1) && (fix->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute per-atom array with {} columns", + FNERR, count, fixid); + if ((count == 1) && (fix->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} does not compute {} per-atom vector", FNERR, count, fixid); + if (lmp->update->ntimestep % fix->peratom_freq) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}: Fix {} not computed at compatible time", + FNERR, fixid); if (count==1) vptr = (void *) fix->vector_atom; else vptr = (void *) fix->array_atom; @@ -5666,24 +5634,21 @@ void lammps_scatter_subset(void *handle, const char *name, int type, int count, // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) { - const char *compid = name + 2; - auto compute = lmp->modify->get_compute_by_id(compid); - if (!compute) { - lmp->error->all(FLERR,"lammps_scatter_subset(): unknown compute id {}", compid); - return; - } - - if (compute->peratom_flag == 0) { - lmp->error->all(FLERR,"lammps_scatter_subset(): compute {} does not return peratom data", - compid); - return; - } - if ((count > 1) && (compute->size_peratom_cols != count)) { - lmp->error->all(FLERR,"lammps_scatter_subset(): count != values peratom for compute {}", - compid); - return; - } + if (!vptr && utils::strmatch(name,"^c_")) { + const char *compid = name+2; + auto *compute = lmp->modify->get_compute_by_id(compid); + if (!compute) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, compid); + if (compute->peratom_flag == 0) + lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not compute per-atom " + "vector or array", FNERR, compid); + if ((count > 1) && (compute->size_peratom_cols != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom array with {} columns", + FNERR, count, compid); + if ((count == 1) && (compute->size_peratom_cols != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Compute {} does not compute per-atom vector", FNERR, count, compid); if (compute->invoked_peratom != lmp->update->ntimestep) compute->compute_peratom(); @@ -5692,33 +5657,27 @@ void lammps_scatter_subset(void *handle, const char *name, int type, int count, else vptr = (void *) compute->array_atom; } - // custom fix property/atom vector or array - - if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { + // custom per-atom vector or array + if (!vptr && utils::strmatch(name, "^[id]2?_")) { int idx,icol; const char *propid; if (utils::strmatch(name,"^[id]_")) propid = name + 2; else propid = name + 3; - idx = lmp->atom->find_custom(propid,ltype,icol); - if (idx < 0) { - lmp->error->all(FLERR,"lammps_scatter_subset(): unknown property/atom id {}", propid); - return; - } - - if (ltype != type) { - lmp->error->all(FLERR,"lammps_scatter_subset(): mismatch property/atom {} type", propid); - return; - } - if (count == 1 && icol != 0) { - lmp->error->all(FLERR,"lammps_scatter_subset(): mismatch property/atom {} count", propid); - return; - } - if (count > 1 && icol != count) { - lmp->error->all(FLERR,"lammps_scatter_subset(): mismatch property/atom {} count", propid); - return; - } + idx = lmp->atom->find_custom(propid, ltype, icol); + if (idx < 0) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Could not find custom per-atom property ID {}", FNERR, propid); + if (ltype != type) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} type mismatch", FNERR, propid); + if ((count == 1) && (icol != 0)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); + if ((count > 1) && (icol != count)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Custom per-atom property {} count mismatch", FNERR, propid); if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[idx]; @@ -5731,10 +5690,7 @@ void lammps_scatter_subset(void *handle, const char *name, int type, int count, // no match - if (vptr == nullptr) { - lmp->error->all(FLERR,"lammps_scatter_subset(): unknown property {}", name); - return; - } + if (!vptr) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Unknown property {}", name); if (type == 0) { int *vector = nullptr; @@ -5863,7 +5819,7 @@ int lammps_create_atoms(void *handle, int n, const tagint *id, const int *type, const double *x, const double *v, const imageint *image, int bexpand) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->domain || !lmp->atom) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -5980,7 +5936,7 @@ int lammps_create_atoms(void *handle, int n, const tagint *id, const int *type, * \return return neighbor list index if found, otherwise -1 */ int lammps_find_pair_neighlist(void *handle, const char *style, int exact, int nsub, int reqid) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->neighbor || !lmp->force) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -6020,7 +5976,7 @@ int lammps_find_pair_neighlist(void *handle, const char *style, int exact, int n * \return return neighbor list index if found, otherwise -1 */ int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->neighbor || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -6029,7 +5985,7 @@ int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) { lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); } else { @@ -6060,7 +6016,7 @@ int lammps_find_fix_neighlist(void *handle, const char *id, int reqid) { * \return return neighbor list index if found, otherwise -1 */ int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->neighbor || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return -1; @@ -6069,7 +6025,7 @@ int lammps_find_compute_neighlist(void *handle, const char *id, int reqid) { BEGIN_CAPTURE { - auto compute = lmp->modify->get_compute_by_id(id); + auto *compute = lmp->modify->get_compute_by_id(id); if (!compute) { lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Compute {} does not exist", FNERR, id); } else { @@ -6126,7 +6082,7 @@ int lammps_neighlist_num_elements(void *handle, int idx) { void lammps_neighlist_element_neighbors(void *handle, int idx, int element, int *iatom, int *numneigh, int **neighbors) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->neighbor) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -6176,7 +6132,7 @@ growing with every new LAMMPS release. int lammps_version(void *handle) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0; @@ -6525,7 +6481,7 @@ Valid categories are: *atom*\ , *integrate*\ , *minimize*\ , * \return 1 if included, 0 if not. */ int lammps_has_style(void *handle, const char *category, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0; @@ -6552,7 +6508,7 @@ categories. * \return number of styles in category */ int lammps_style_count(void *handle, const char *category) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0; @@ -6583,7 +6539,7 @@ int lammps_style_count(void *handle, const char *category) { * \return 1 if successful, otherwise 0 */ int lammps_style_name(void *handle, const char *category, int idx, char *buffer, int buf_size) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return 0; @@ -6622,7 +6578,7 @@ the given *name* exists. Valid categories are: *compute*\ , *dump*\ , * \return 1 if included, 0 if not. */ int lammps_has_id(void *handle, const char *category, const char *name) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom || !lmp->domain || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); @@ -6668,7 +6624,7 @@ categories. * \return number of IDs in category */ int lammps_id_count(void *handle, const char *category) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom || !lmp->domain || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); @@ -6719,7 +6675,7 @@ set to an empty string, otherwise 1. * \return 1 if successful, otherwise 0 */ int lammps_id_name(void *handle, const char *category, int idx, char *buffer, int buf_size) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify || !lmp->output || !lmp->group || !lmp->atom || !lmp->domain || !lmp->input || !lmp->input->variable) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); @@ -6948,7 +6904,7 @@ external code. void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -6959,11 +6915,11 @@ void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalF BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); @@ -7016,7 +6972,7 @@ external code. double **lammps_fix_external_get_force(void *handle, const char *id) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return nullptr; @@ -7027,7 +6983,7 @@ double **lammps_fix_external_get_force(void *handle, const char *id) BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); @@ -7071,7 +7027,7 @@ external code. void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7080,11 +7036,11 @@ void lammps_fix_external_set_energy_global(void *handle, const char *id, double BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "Fix {} is not of style external", FNERR, id); @@ -7125,7 +7081,7 @@ external code. void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7134,11 +7090,11 @@ void lammps_fix_external_set_virial_global(void *handle, const char *id, double BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); @@ -7179,7 +7135,7 @@ external code. void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7188,11 +7144,11 @@ void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "Fix {} is not of style external", FNERR, id); @@ -7236,7 +7192,7 @@ external code. void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7245,11 +7201,11 @@ void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); @@ -7286,7 +7242,7 @@ external code. void lammps_fix_external_set_vector_length(void *handle, const char *id, int len) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7295,11 +7251,11 @@ void lammps_fix_external_set_vector_length(void *handle, const char *id, int len BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); @@ -7346,7 +7302,7 @@ external code. void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; @@ -7355,11 +7311,11 @@ void lammps_fix_external_set_vector(void *handle, const char *id, int idx, doubl BEGIN_CAPTURE { - auto fix = lmp->modify->get_fix_by_id(id); + auto *fix = lmp->modify->get_fix_by_id(id); if (!fix) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not exist", FNERR, id); - auto fext = dynamic_cast(fix); + auto *fext = dynamic_cast(fix); if (!fext || (strcmp("external",fix->style) != 0)) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} is not of style external", FNERR, id); @@ -7432,7 +7388,7 @@ int lammps_is_running(void *handle) void lammps_force_timeout(void *handle) { - auto lmp = (LAMMPS *) handle; + auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->timer) { lammps_last_global_errormessage = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR); return; From 5a62d0a129a0174e10d17fe278e1b05d1b91ddea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 03:01:38 -0400 Subject: [PATCH 83/99] correct data in data file and pair_coeff changes are no longer needed also re-create reference log files --- .../data.dpd_coul_slater_long | 12 +- .../in.dpd_coul_slater_long | 51 +++--- .../log.19Jun24.dpd_coul_slater.g++.1 | 147 ------------------ .../log.19Jun24.dpd_coul_slater.g++.4 | 147 ------------------ .../log.25Mar25.dpd_coul_slater.g++.1 | 145 +++++++++++++++++ .../log.25Mar25.dpd_coul_slater.g++.4 | 145 +++++++++++++++++ 6 files changed, 318 insertions(+), 329 deletions(-) delete mode 100644 examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.1 delete mode 100644 examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.4 create mode 100644 examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.1 create mode 100644 examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.4 diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/data.dpd_coul_slater_long b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/data.dpd_coul_slater_long index 91ddddf4ec..29315a5901 100644 --- a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/data.dpd_coul_slater_long +++ b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/data.dpd_coul_slater_long @@ -15,12 +15,12 @@ Masses PairIJ Coeffs # dpd/coul/slater/long -1 1 78 4.5 yes 1 -1 2 78 4.5 yes 1 -1 3 78 4.5 yes 1 -2 2 78 4.5 no 1 -2 3 78 4.5 no 1 -3 3 78 4.5 no 1 +1 1 78 4.5 no 1 +1 2 78 4.5 no 1 +1 3 78 4.5 no 1 +2 2 78 4.5 yes 1 +2 3 78 4.5 yes 1 +3 3 78 4.5 yes 1 Atoms # full diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long index e683855b0d..dc73aa887b 100644 --- a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long +++ b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/in.dpd_coul_slater_long @@ -10,54 +10,47 @@ variable cut_coul equal 2.0 # Initialize LAMMPS run for 3-d periodic #------------------------------------------------------------------------------- -units lj -boundary p p p # periodic at all axes -atom_style full -dimension 3 +units lj +boundary p p p # periodic at all axes +atom_style full +dimension 3 -bond_style none -angle_style none -dihedral_style none -improper_style none +bond_style none +angle_style none +dihedral_style none +improper_style none -newton on -comm_modify vel yes # store info of ghost atoms btw processors +newton on +comm_modify vel yes # store info of ghost atoms btw processors #------------------------------------------------------------------------------- # Box creation and configuration #------------------------------------------------------------------------------- # Define pair style and coefficients -pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} # Enable long range electrostatics solver -kspace_style pppm 1e-04 - - -read_data data.dpd_coul_slater_long - -pair_coeff * * 78.0 4.5 -pair_coeff 2*3 2*3 78.0 4.5 yes +kspace_style pppm 1e-04 +read_data data.dpd_coul_slater_long # Construct neighbors every steps -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes #------------------------------------------------------------------------------- # Run the simulation #------------------------------------------------------------------------------- -thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax -thermo_modify norm no -thermo 100 +thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax +thermo_modify norm no +thermo 100 -timestep 0.01 -run_style verlet +timestep 0.01 +run_style verlet -fix 1 all nve +fix 1 all nve -run 1000 - -unfix 1 +run 1000 diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.1 b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.1 deleted file mode 100644 index 39c0ded481..0000000000 --- a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.1 +++ /dev/null @@ -1,147 +0,0 @@ -LAMMPS (17 Apr 2024 - Development - patch_17Apr2024-262-g0aff26705c-modified) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) - using 1 OpenMP thread(s) per MPI task -# DPD Ionic Fluid - -variable T equal 1.0 -variable cut_DPD equal 1.0 -variable seed equal 165412 -variable lambda equal 0.25 -variable cut_coul equal 2.0 - -#------------------------------------------------------------------------------- -# Initialize LAMMPS run for 3-d periodic -#------------------------------------------------------------------------------- - -units lj -boundary p p p # periodic at all axes -atom_style full -dimension 3 - -bond_style none -angle_style none -dihedral_style none -improper_style none - -newton on -comm_modify vel yes # store info of ghost atoms btw processors - -#------------------------------------------------------------------------------- -# Box creation and configuration -#------------------------------------------------------------------------------- - -# Define pair style and coefficients -pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 0.25 2 - -read_data data.dpd_coul_slater_long -Reading data file ... - orthogonal box = (0 0 0) to (5 5 5) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 375 atoms - reading velocities ... - 375 velocities -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000 seconds - read_data CPU = 0.003 seconds - -# Enable long range electrostatics solver -kspace_style pppm 1e-04 - -# Construct neighbors every steps -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -#------------------------------------------------------------------------------- -# Run the simulation -#------------------------------------------------------------------------------- - -thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax -thermo_modify norm no -thermo 100 - -timestep 0.01 -run_style verlet - -fix 1 all nve - -run 1000 -PPPM initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:342) - G vector (1/distance) = 1.4828454 - grid = 20 20 20 - stencil order = 5 - estimated absolute RMS force accuracy = 7.7240141e-05 - estimated relative force accuracy = 7.7240141e-05 - using double precision FFTW3 - 3d grid and FFT values/proc = 24389 8000 -Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update: every = 1 steps, delay = 0 steps, check = yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 3 - ghost atom cutoff = 3 - binsize = 1.5, bins = 4 4 4 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair dpd/coul/slater/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 8.359 | 8.359 | 8.359 Mbytes - Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax - 0 0.9849949 69.271905 125 4673.0443 0 -30.365103 4642.6792 552.58214 646.76798 65.851035 - 100 1.0614027 69.794624 125 4659.0139 0 -31.906319 4627.1075 595.44692 612.94396 60.338653 - 200 0.9422517 68.721098 125 4687.8862 0 -33.81531 4654.0709 528.6032 620.25627 62.726994 - 300 0.8956649 69.323482 125 4721.0824 0 -33.854275 4687.2281 502.46801 670.22699 73.087908 - 400 0.99584547 69.670416 125 4713.9086 0 -30.783633 4683.125 558.66931 607.65881 59.224652 - 500 1.0565931 69.497816 125 4701.2584 0 -26.80545 4674.4529 592.74873 646.18907 71.398122 - 600 1.0071523 70.26222 125 4659.2061 0 -29.98909 4629.217 565.01243 630.00244 58.264115 - 700 1.0507355 67.920078 125 4695.255 0 -32.649209 4662.6058 589.46259 651.80459 70.573524 - 800 0.98561942 68.279591 125 4745.7603 0 -28.98491 4716.7754 552.9325 627.14371 67.196483 - 900 0.96470105 70.742864 125 4706.3605 0 -30.271633 4676.0889 541.19729 644.43036 79.474998 - 1000 1.0204819 70.164419 125 4654.6077 0 -27.797433 4626.8103 572.49035 624.19728 71.825307 -Loop time of 2.10153 on 1 procs for 1000 steps with 375 atoms - -Performance: 411128.483 tau/day, 475.843 timesteps/s, 178.441 katom-step/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.1779 | 1.1779 | 1.1779 | 0.0 | 56.05 -Bond | 6.507e-05 | 6.507e-05 | 6.507e-05 | 0.0 | 0.00 -Kspace | 0.74636 | 0.74636 | 0.74636 | 0.0 | 35.51 -Neigh | 0.12903 | 0.12903 | 0.12903 | 0.0 | 6.14 -Comm | 0.039726 | 0.039726 | 0.039726 | 0.0 | 1.89 -Output | 0.00027587 | 0.00027587 | 0.00027587 | 0.0 | 0.01 -Modify | 0.0037596 | 0.0037596 | 0.0037596 | 0.0 | 0.18 -Other | | 0.004451 | | | 0.21 - -Nlocal: 375 ave 375 max 375 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 3613 ave 3613 max 3613 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 62354 ave 62354 max 62354 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 62354 -Ave neighs/atom = 166.27733 -Ave special neighs/atom = 0 -Neighbor list builds = 65 -Dangerous builds = 0 - -unfix 1 - -Total wall time: 0:00:02 diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.4 b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.4 deleted file mode 100644 index 445baac0f7..0000000000 --- a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.19Jun24.dpd_coul_slater.g++.4 +++ /dev/null @@ -1,147 +0,0 @@ -LAMMPS (17 Apr 2024 - Development - patch_17Apr2024-262-g0aff26705c-modified) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) - using 1 OpenMP thread(s) per MPI task -# DPD Ionic Fluid - -variable T equal 1.0 -variable cut_DPD equal 1.0 -variable seed equal 165412 -variable lambda equal 0.25 -variable cut_coul equal 2.0 - -#------------------------------------------------------------------------------- -# Initialize LAMMPS run for 3-d periodic -#------------------------------------------------------------------------------- - -units lj -boundary p p p # periodic at all axes -atom_style full -dimension 3 - -bond_style none -angle_style none -dihedral_style none -improper_style none - -newton on -comm_modify vel yes # store info of ghost atoms btw processors - -#------------------------------------------------------------------------------- -# Box creation and configuration -#------------------------------------------------------------------------------- - -# Define pair style and coefficients -pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul} -pair_style dpd/coul/slater/long 1 1 165412 0.25 2 - -read_data data.dpd_coul_slater_long -Reading data file ... - orthogonal box = (0 0 0) to (5 5 5) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 375 atoms - reading velocities ... - 375 velocities -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000 seconds - read_data CPU = 0.003 seconds - -# Enable long range electrostatics solver -kspace_style pppm 1e-04 - -# Construct neighbors every steps -neighbor 1.0 bin -neigh_modify every 1 delay 0 check yes - -#------------------------------------------------------------------------------- -# Run the simulation -#------------------------------------------------------------------------------- - -thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax -thermo_modify norm no -thermo 100 - -timestep 0.01 -run_style verlet - -fix 1 all nve - -run 1000 -PPPM initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:342) - G vector (1/distance) = 1.4828454 - grid = 20 20 20 - stencil order = 5 - estimated absolute RMS force accuracy = 7.7240141e-05 - estimated relative force accuracy = 7.7240141e-05 - using double precision FFTW3 - 3d grid and FFT values/proc = 10469 2000 -Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule -Neighbor list info ... - update: every = 1 steps, delay = 0 steps, check = yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 3 - ghost atom cutoff = 3 - binsize = 1.5, bins = 4 4 4 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair dpd/coul/slater/long, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 7.208 | 7.208 | 7.209 Mbytes - Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax - 0 0.9849949 69.076433 125 4673.0443 0 -30.365103 4642.6792 552.58214 613.18374 70.700582 - 100 0.95374867 69.110009 125 4681.1097 0 -31.260804 4649.8489 535.053 629.95109 62.05418 - 200 1.0076152 69.824904 125 4670.7458 0 -28.382203 4642.3636 565.27213 656.8501 72.049813 - 300 1.0014752 69.666331 125 4696.454 0 -26.943577 4669.5105 561.8276 631.49861 74.737274 - 400 0.98863876 69.731774 125 4700.7552 0 -23.816077 4676.9391 554.62634 637.74742 68.928573 - 500 0.95782852 68.588075 125 4698.588 0 -29.249543 4669.3385 537.3418 646.31897 68.800569 - 600 0.97443232 70.864079 125 4674.8821 0 -26.415644 4648.4664 546.65653 606.50755 78.664429 - 700 0.98783988 68.908299 125 4692.5536 0 -28.092022 4664.4616 554.17817 638.98401 69.691814 - 800 0.98000145 69.83977 125 4706.6365 0 -29.648365 4676.9881 549.78082 626.84362 73.133934 - 900 1.0526251 69.466078 125 4671.9648 0 -30.941117 4641.0237 590.52269 618.1049 62.333546 - 1000 0.98340746 69.527121 125 4728.2894 0 -31.869907 4696.4195 551.69159 630.14208 61.392611 -Loop time of 0.928543 on 4 procs for 1000 steps with 375 atoms - -Performance: 930490.137 tau/day, 1076.956 timesteps/s, 403.859 katom-step/s -98.9% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.30761 | 0.34974 | 0.38864 | 4.9 | 37.67 -Bond | 8.4633e-05 | 9.0539e-05 | 9.9184e-05 | 0.0 | 0.01 -Kspace | 0.39038 | 0.42976 | 0.47215 | 4.4 | 46.28 -Neigh | 0.033986 | 0.035576 | 0.036791 | 0.5 | 3.83 -Comm | 0.10247 | 0.10324 | 0.10481 | 0.3 | 11.12 -Output | 0.00024145 | 0.00027404 | 0.00036867 | 0.0 | 0.03 -Modify | 0.0022402 | 0.0025068 | 0.0026343 | 0.3 | 0.27 -Other | | 0.007356 | | | 0.79 - -Nlocal: 93.75 ave 96 max 93 min -Histogram: 3 0 0 0 0 0 0 0 0 1 -Nghost: 2289.75 ave 2317 max 2271 min -Histogram: 1 1 0 0 1 0 0 0 0 1 -Neighs: 15590.2 ave 16765 max 14540 min -Histogram: 1 0 1 0 0 1 0 0 0 1 - -Total # of neighbors = 62361 -Ave neighs/atom = 166.296 -Ave special neighs/atom = 0 -Neighbor list builds = 64 -Dangerous builds = 0 - -unfix 1 - -Total wall time: 0:00:00 diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.1 b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.1 new file mode 100644 index 0000000000..4b2509550f --- /dev/null +++ b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.1 @@ -0,0 +1,145 @@ +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-468-gd830412228-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# DPD Ionic Fluid + +variable T equal 1.0 +variable cut_DPD equal 1.0 +variable seed equal 165412 +variable lambda equal 0.25 +variable cut_coul equal 2.0 + +#------------------------------------------------------------------------------- +# Initialize LAMMPS run for 3-d periodic +#------------------------------------------------------------------------------- + +units lj +boundary p p p # periodic at all axes +atom_style full +dimension 3 + +bond_style none +angle_style none +dihedral_style none +improper_style none + +newton on +comm_modify vel yes # store info of ghost atoms btw processors + +#------------------------------------------------------------------------------- +# Box creation and configuration +#------------------------------------------------------------------------------- + +# Define pair style and coefficients +pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 0.25 2 + +# Enable long range electrostatics solver +kspace_style pppm 1e-04 + +read_data data.dpd_coul_slater_long +Reading data file ... + orthogonal box = (0 0 0) to (5 5 5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 375 atoms + reading velocities ... + 375 velocities +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.001 seconds + read_data CPU = 0.004 seconds + +# Construct neighbors every steps +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +#------------------------------------------------------------------------------- +# Run the simulation +#------------------------------------------------------------------------------- + +thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax +thermo_modify norm no +thermo 100 + +timestep 0.01 +run_style verlet + +fix 1 all nve + +run 1000 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:342) + G vector (1/distance) = 1.4828454 + grid = 20 20 20 + stencil order = 5 + estimated absolute RMS force accuracy = 7.7240141e-05 + estimated relative force accuracy = 7.7240141e-05 + using double precision KISS FFT + 3d grid and FFT values/proc = 24389 8000 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3 + binsize = 1.5, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair dpd/coul/slater/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 8.359 | 8.359 | 8.359 Mbytes + Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax + 0 0.9849949 69.242343 125 4673.0443 -3.2653869 -30.365103 4639.4138 552.58214 646.89929 65.851035 + 100 1.023885 69.716134 125 4676.9465 -4.9878506 -34.092864 4637.8658 574.39949 663.35845 94.350026 + 200 1.0286646 69.674249 125 4636.201 -4.6314926 -33.406897 4598.1626 577.08087 614.52805 62.295431 + 300 0.9745797 69.689534 125 4679.9157 -4.3964184 -30.560567 4644.9588 546.73921 603.46282 60.56253 + 400 0.99487931 69.17085 125 4678.0362 -4.9518269 -34.446596 4638.6378 558.12729 656.99738 88.090014 + 500 0.97732377 69.551562 125 4684.3709 -5.0851581 -33.863212 4645.4226 548.27864 647.12533 75.851935 + 600 0.95396337 68.358297 125 4706.824 -4.269168 -33.634096 4668.9207 535.17345 604.31276 63.41042 + 700 0.99397324 68.365109 125 4669.1062 -4.700146 -35.014001 4629.3921 557.61899 633.29262 74.300913 + 800 1.0157864 69.263686 125 4664.1398 -4.0142381 -34.372669 4625.7529 569.85616 595.81462 67.046561 + 900 0.9925779 70.008922 125 4652.3023 -2.7845751 -33.095293 4616.4224 556.8362 620.13154 82.785317 + 1000 0.97336501 68.973657 125 4688.8002 -5.5239266 -36.42345 4646.8529 546.05777 625.66451 64.948859 +Loop time of 0.755094 on 1 procs for 1000 steps with 375 atoms + +Performance: 1144228.093 tau/day, 1324.338 timesteps/s, 496.627 katom-step/s +99.5% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.14421 | 0.14421 | 0.14421 | 0.0 | 19.10 +Bond | 3.8885e-05 | 3.8885e-05 | 3.8885e-05 | 0.0 | 0.01 +Kspace | 0.53292 | 0.53292 | 0.53292 | 0.0 | 70.58 +Neigh | 0.056741 | 0.056741 | 0.056741 | 0.0 | 7.51 +Comm | 0.017676 | 0.017676 | 0.017676 | 0.0 | 2.34 +Output | 0.00024925 | 0.00024925 | 0.00024925 | 0.0 | 0.03 +Modify | 0.0016688 | 0.0016688 | 0.0016688 | 0.0 | 0.22 +Other | | 0.001588 | | | 0.21 + +Nlocal: 375 ave 375 max 375 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 3570 ave 3570 max 3570 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 19729 ave 19729 max 19729 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 19729 +Ave neighs/atom = 52.610667 +Ave special neighs/atom = 0 +Neighbor list builds = 66 +Dangerous builds = 0 + +Total wall time: 0:00:00 diff --git a/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.4 b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.4 new file mode 100644 index 0000000000..52d50716c9 --- /dev/null +++ b/examples/PACKAGES/dpd-basic/dpd_coul_slater_long/log.25Mar25.dpd_coul_slater.g++.4 @@ -0,0 +1,145 @@ +LAMMPS (4 Feb 2025 - Development - patch_4Feb2025-468-gd830412228-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# DPD Ionic Fluid + +variable T equal 1.0 +variable cut_DPD equal 1.0 +variable seed equal 165412 +variable lambda equal 0.25 +variable cut_coul equal 2.0 + +#------------------------------------------------------------------------------- +# Initialize LAMMPS run for 3-d periodic +#------------------------------------------------------------------------------- + +units lj +boundary p p p # periodic at all axes +atom_style full +dimension 3 + +bond_style none +angle_style none +dihedral_style none +improper_style none + +newton on +comm_modify vel yes # store info of ghost atoms btw processors + +#------------------------------------------------------------------------------- +# Box creation and configuration +#------------------------------------------------------------------------------- + +# Define pair style and coefficients +pair_style dpd/coul/slater/long ${T} ${cut_DPD} ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 ${cut_DPD} ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 ${seed} ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 ${lambda} ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 0.25 ${cut_coul} +pair_style dpd/coul/slater/long 1 1 165412 0.25 2 + +# Enable long range electrostatics solver +kspace_style pppm 1e-04 + +read_data data.dpd_coul_slater_long +Reading data file ... + orthogonal box = (0 0 0) to (5 5 5) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 375 atoms + reading velocities ... + 375 velocities +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.004 seconds + +# Construct neighbors every steps +neighbor 1.0 bin +neigh_modify every 1 delay 0 check yes + +#------------------------------------------------------------------------------- +# Run the simulation +#------------------------------------------------------------------------------- + +thermo_style custom step temp press vol evdwl ecoul elong pe ke fnorm fmax +thermo_modify norm no +thermo 100 + +timestep 0.01 +run_style verlet + +fix 1 all nve + +run 1000 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:342) + G vector (1/distance) = 1.4828454 + grid = 20 20 20 + stencil order = 5 + estimated absolute RMS force accuracy = 7.7240141e-05 + estimated relative force accuracy = 7.7240141e-05 + using double precision KISS FFT + 3d grid and FFT values/proc = 10469 2000 +Generated 0 of 3 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3 + binsize = 1.5, bins = 4 4 4 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair dpd/coul/slater/long, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 7.208 | 7.208 | 7.209 Mbytes + Step Temp Press Volume E_vdwl E_coul E_long PotEng KinEng Fnorm Fmax + 0 0.9849949 69.04687 125 4673.0443 -3.2653869 -30.365103 4639.4138 552.58214 613.14254 70.700582 + 100 1.0206537 69.308834 125 4676.3153 -4.5693306 -33.647673 4638.0983 572.58672 630.70953 76.020236 + 200 0.99990746 68.572978 125 4707.1556 -3.4977853 -33.275671 4670.3821 560.94809 633.00167 77.040049 + 300 0.91055241 69.390592 125 4685.5268 -2.9764038 -29.986737 4652.5637 510.8199 614.61006 62.799933 + 400 1.0080135 69.442971 125 4677.3078 -4.8740989 -32.908722 4639.525 565.49557 649.20121 61.033612 + 500 0.99500653 68.275189 125 4718.6774 -4.2475783 -35.206868 4679.223 558.19867 657.3073 74.738502 + 600 1.052925 70.601712 125 4703.6749 -2.8511316 -34.085418 4666.7383 590.69094 641.70441 59.043346 + 700 0.96467445 69.502018 125 4720.4257 -4.3345734 -34.310005 4681.7811 541.18237 656.24965 72.433637 + 800 1.0657358 70.960958 125 4685.5637 -5.8903418 -35.207202 4644.4661 597.87781 595.54446 61.462159 + 900 1.0273388 68.735518 125 4693.5106 -2.4175829 -28.602387 4662.4906 576.33707 598.80294 71.747886 + 1000 0.9702835 69.885576 125 4701.4385 -3.6513555 -29.487331 4668.2999 544.32904 666.55262 73.231425 +Loop time of 0.270344 on 4 procs for 1000 steps with 375 atoms + +Performance: 3195929.791 tau/day, 3698.993 timesteps/s, 1.387 Matom-step/s +99.3% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.031268 | 0.035485 | 0.039491 | 1.6 | 13.13 +Bond | 3.3378e-05 | 3.4848e-05 | 3.5667e-05 | 0.0 | 0.01 +Kspace | 0.18632 | 0.19083 | 0.19556 | 0.8 | 70.59 +Neigh | 0.012413 | 0.012991 | 0.013598 | 0.4 | 4.81 +Comm | 0.028195 | 0.028407 | 0.028626 | 0.1 | 10.51 +Output | 0.00013369 | 0.00015738 | 0.00022498 | 0.0 | 0.06 +Modify | 0.00055373 | 0.00059062 | 0.00068807 | 0.0 | 0.22 +Other | | 0.001846 | | | 0.68 + +Nlocal: 93.75 ave 95 max 92 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Nghost: 2286 ave 2307 max 2269 min +Histogram: 1 0 1 0 0 1 0 0 0 1 +Neighs: 4945 ave 5443 max 4513 min +Histogram: 1 0 1 0 0 1 0 0 0 1 + +Total # of neighbors = 19780 +Ave neighs/atom = 52.746667 +Ave special neighs/atom = 0 +Neighbor list builds = 66 +Dangerous builds = 0 + +Total wall time: 0:00:00 From 7fba02f8655aa85dd8eac7380e0088cea0a57b07 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 03:02:17 -0400 Subject: [PATCH 84/99] fix logic bug when writing coeffs to data file --- src/DPD-BASIC/pair_dpd_coul_slater_long.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp b/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp index 4c4a62f157..40730036de 100644 --- a/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp +++ b/src/DPD-BASIC/pair_dpd_coul_slater_long.cpp @@ -473,7 +473,8 @@ void PairDPDCoulSlaterLong::read_restart_settings(FILE *fp) void PairDPDCoulSlaterLong::write_data(FILE *fp) { for (int i = 1; i <= atom->ntypes; i++) - fprintf(fp,"%d %g %g\n",i,a0[i][i],gamma[i][i]); + fprintf(fp,"%d %g %g %s %g\n",i,a0[i][i],gamma[i][i], + (cut_slatersq[i][i] == 0.0) ? "no" : "yes", cut_dpd[i][i]); } /* ---------------------------------------------------------------------- @@ -485,7 +486,7 @@ void PairDPDCoulSlaterLong::write_data_all(FILE *fp) for (int i = 1; i <= atom->ntypes; i++) for (int j = i; j <= atom->ntypes; j++) fprintf(fp,"%d %d %g %g %s %g\n",i,j,a0[i][j],gamma[i][j], - (cut_slatersq[i][j] == 0.0) ? "yes" : "no", cut_dpd[i][j]); + (cut_slatersq[i][j] == 0.0) ? "no" : "yes", cut_dpd[i][j]); } /* ---------------------------------------------------------------------- */ From e9ac9e77db7b58ea49457e0a7e3009ea6b5901bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 11:20:15 -0400 Subject: [PATCH 85/99] add option to return an entire column, row, or array as flat array with lammps_extract_fix() --- doc/utils/sphinx-config/false_positives.txt | 1 + src/library.cpp | 112 +++++++++++++++----- 2 files changed, 89 insertions(+), 24 deletions(-) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index fee9b97c8e..36ff6b3be7 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -736,6 +736,7 @@ dE De deallocate deallocated +deallocation debye Debye Decius diff --git a/src/library.cpp b/src/library.cpp index a77a76772e..1ca9110b12 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2543,25 +2543,54 @@ Since individual fixes may provide multiple kinds of data, it is required to set style and type flags representing what specific data is desired. This also determines to what kind of pointer the returned pointer needs to be cast to access the data correctly. The function -returns ``NULL`` if the fix ID is not found or the requested data is not -available. +set the error status and returns ``NULL`` if the fix ID is not found +or the requested data is not available. -.. note:: +.. admonition:: Accessing global data + :class: warning - When requesting global data, the fix data can only be accessed one - item at a time without access to the pointer itself. Thus this - function will allocate storage for a single double value, copy the - returned value to it, and returns a pointer to the location of the - copy. Therefore the allocated storage needs to be freed after its - use to avoid a memory leak. Example: + When requesting **global** data, the fix data can internally only be + accessed one item at a time without access to the underlying pointer + itself (it may also be computed on-the-fly). Thus this function + allocates temporary storage for the requested data, copy the the data to it, and return a pointer to the location + of the copy. Therefore the allocated storage needs to be freed + with :cpp:func:`lammps_free` after its use to avoid a memory leak. Example: .. code-block:: c - double *dptr = (double *) lammps_extract_fix(handle, name, - LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 0, 0); + double *dptr = (double *) lammps_extract_fix(handle, name, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, 0, 0); double value = *dptr; lammps_free((void *)dptr); +.. admonition:: Requesting rows, columns, or the entire global array + :class: Hint + + In order to avoid the inefficient allocation and deallocation of + temporary storage for single values, this functions accepts special + values of -1 for the nrow and ncol arguments. For the negative + values, the entire row, or column, or full array is copied to a + (flat) block of storage and its pointer returned. This still is a + copy and needs to be deallocated with :cpp:func:`lammps_free` as + indicated in the note above. In case of requesting the whole array, + the data is returned column by column, i.e. as d(c\_0,r\_0), + d(c\_0,r\_1), ... d(c\_0, c\_nrow-1), d(c\_1,r\_0), d(c\_1,r\_1), + ... d(c\_ncol-1, r\_nrow-1) for a total of nrow \* ncol elements. + Example use: + + .. code-block:: c + + int nrows = *(int *) lammps_extract_fix(handle, name, LMP_STYLE_GLOBAL, LMP_SIZE_ROWS, 0,0); + int ncols = *(int *) lammps_extract_fix(handle, name, LMP_STYLE_GLOBAL, LMP_SIZE_COLS, 0,0); + double *dptr = (double *) lammps_extract_fix(handle, name, LMP_STYLE_GLOBAL, LMP_TYPE_ARRAY, -1, -1); + printf("values[%d][%d] = {\n", ncols, nrows); + for (int j = 0; j < ncols; ++j) { + printf(" { "); + for (int i = 0; i < nrows; ++i) printf("%g, ", dvalue[j * nrows + i]); + printf("},\n"); + } + printf("};\n"); + lammps_free((void *)dptr); + The following table lists the available options. .. list-table:: @@ -2636,8 +2665,9 @@ The following table lists the available options. .. note:: - LAMMPS cannot easily check if it is valid to access the data, so it - may fail with an error. The caller has to avoid such an error. + LAMMPS cannot easily check if it is valid to access the data, so it may + fail with an error and return a NULL pointer. The caller has to avoid + such an error. \endverbatim * @@ -2647,13 +2677,12 @@ The following table lists the available options. (global, per-atom, or local) * \param type constant indicating type of data (scalar, vector, or array) or size of rows or columns - * \param nrow row index (only used for global vectors and arrays) - * \param ncol column index (only used for global arrays) + * \param nrow row index (only used for global vectors and arrays), zero-based + * \param ncol column index (only used for global arrays), zero-based * \return pointer (cast to ``void *``) to the location of the * requested data or ``NULL`` if not found. */ -void *lammps_extract_fix(void *handle, const char *id, int style, int type, - int nrow, int ncol) +void *lammps_extract_fix(void *handle, const char *id, int style, int type, int nrow, int ncol) { auto *lmp = (LAMMPS *) handle; if (!lmp || !lmp->error || !lmp->modify) { @@ -2672,7 +2701,7 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, if (!fix->scalar_flag) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not compute global scalar", FNERR, id); - auto dptr = (double *) malloc(sizeof(double)); + auto *dptr = (double *) malloc(sizeof(double)); *dptr = fix->compute_scalar(); return (void *) dptr; } @@ -2680,17 +2709,52 @@ void *lammps_extract_fix(void *handle, const char *id, int style, int type, if (!fix->vector_flag) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not compute global vector", FNERR, id); - auto dptr = (double *) malloc(sizeof(double)); - *dptr = fix->compute_vector(nrow); - return (void *) dptr; + int veclen = fix->size_vector; + if (nrow >= veclen) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} vector accessed out-of-range", FNERR, id); + if (nrow < 0) { + auto *dptr = (double *) malloc(sizeof(double) * veclen); + for (int i = 0; i < veclen; ++i) dptr[i] = fix->compute_vector(i); + return (void *) dptr; + } else { + auto *dptr = (double *) malloc(sizeof(double)); + *dptr = fix->compute_vector(nrow); + return (void *) dptr; + } } if (type == LMP_TYPE_ARRAY) { if (!fix->array_flag) lmp->error->all(FLERR, Error::NOLASTLINE, "{}(): Fix {} does not compute global array", FNERR, id); - auto dptr = (double *) malloc(sizeof(double)); - *dptr = fix->compute_array(nrow,ncol); - return (void *) dptr; + int array_rows = fix->size_array_rows; + int array_cols = fix->size_array_cols; + if ((nrow >= array_rows) || (ncol >= array_cols)) + lmp->error->all(FLERR, Error::NOLASTLINE, + "{}(): Fix {} array accessed out-of-range", FNERR, id); + if ((nrow < 0) && (ncol < 0)) { // whole array as flat array + auto *dptr = (double *) malloc(sizeof(double) * array_rows * array_cols); + for (int j = 0; j < array_cols; ++j) { + for (int i = 0; i < array_rows; ++i) { + dptr[array_rows * j + i] = fix->compute_array(i, j); + } + } + return (void *) dptr; + } else if (ncol < 0) { // only one row + int array_cols = fix->size_array_cols; + auto *dptr = (double *) malloc(sizeof(double) * array_cols); + for (int i = 0; i < array_cols; ++i) dptr[i] = fix->compute_array(nrow, i); + return (void *) dptr; + } else if (nrow < 0) { // only one column + int array_rows = fix->size_array_rows; + auto *dptr = (double *) malloc(sizeof(double) * array_rows); + for (int i = 0; i < array_rows; ++i) dptr[i] = fix->compute_array(i, ncol); + return (void *) dptr; + } else { + auto *dptr = (double *) malloc(sizeof(double)); + *dptr = fix->compute_array(nrow, ncol); + return (void *) dptr; + } } if (type == LMP_SIZE_VECTOR) { if (!fix->vector_flag) From 183486d8135ae6340beb644723bdbc2224cbd9e3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 11:27:19 -0400 Subject: [PATCH 86/99] implement suggestions from @ndtrung81 --- doc/src/Howto_moltemplate.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/src/Howto_moltemplate.rst b/doc/src/Howto_moltemplate.rst index 470f76ded0..c4f89a4e26 100644 --- a/doc/src/Howto_moltemplate.rst +++ b/doc/src/Howto_moltemplate.rst @@ -76,10 +76,10 @@ the atom type will determine the bond type. The other bonded interactions (e.g. angles, dihedrals, and impropers) will be automatically generated by Moltemplate. -If the simulation is non-neutral, or Moltemplate complains that you have -missing bond, angle, or dihedral types, this probably means at least one -of your atom types is incorrect (or perhaps there is no suitable atom -type currently defined in the ``oplsaa2024.lt`` file). +If the simulation is not charge-neutral, or Moltemplate complains that +you have missing bond, angle, or dihedral types, this probably means that +at least one of your atom types is incorrect (or that perhaps there is no +suitable atom type currently defined in the ``oplsaa2024.lt`` file). The second step is to create a master file with instructions to build a starting structure and the LAMMPS commands to run an NPT simulation. The From fecd93783bfe846f4108109f2dd44a74b3e6e477 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 15:40:40 -0400 Subject: [PATCH 87/99] spelling --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 084f7c0ec1..ab93ca7c98 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2780,6 +2780,7 @@ omegaz Omelyan omp OMP +ondulated oneAPI onebody onelevel From 227b7840e7b3399f9f06d1161e452ba38efb4d21 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 15:42:11 -0400 Subject: [PATCH 88/99] add disclaimer and improve some formulations --- doc/src/Howto_bulk2slab.rst | 70 ++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/doc/src/Howto_bulk2slab.rst b/doc/src/Howto_bulk2slab.rst index 56de49d299..2c26961522 100644 --- a/doc/src/Howto_bulk2slab.rst +++ b/doc/src/Howto_bulk2slab.rst @@ -4,34 +4,51 @@ Convert bulk system to slab A regularly encountered simulation problem is how to convert a bulk system that has been run for a while to equilibrate into a slab system -with some vacuum space. The challenge here is that one cannot just -change the box dimensions with the :doc:`change_box command -` or edit the box boundaries in a data file because some -atoms will have non-zero image flags from diffusing around. Changing -the box dimensions results in an undesired displacement of those atoms, -since the image flags indicate how many times the box length in x-, y-, -or z-direction needs to be added or subtracted to get the "unwrapped" -coordinates. By changing the box dimension this distance is changed and -thus those atoms move unphysically relative to their neighbors with zero -image flags. Setting image flags forcibly to zero creates problems because -that could break apart molecules by have one atom of a bond on the top -of the system and the other at the bottom. +with some vacuum space and free surfaces. The challenge here is that +one cannot just change the box dimensions with the :doc:`change_box +command ` or edit the box boundaries in a data file because +some atoms will have non-zero image flags from diffusing around. + +Changing the box dimensions results in an undesired displacement of +those atoms, since the image flags indicate how many times the box +length in x-, y-, or z-direction needs to be added or subtracted to get +the "unwrapped" coordinates. By changing the box dimension this +distance is changed and thus those atoms move unphysically relative to +their neighbors with zero image flags. Setting image flags forcibly to +zero creates problems because that could break apart molecules by having +one atom of a bond on the top of the system and the other at the bottom. .. _bulk2slab: .. figure:: JPG/rhodo-both.jpg :figwidth: 80% :figclass: align-center - Snapshots of the bulk Rhodopsin system (right) and the slab geometry (left) + Snapshots of the bulk Rhodopsin in lipid layer and water system (right) + and the generated slab geometry (left) + +.. admonition:: Disclaimer + :class: note + + The following workflow will work for many bulk systems, but not all. + Some systems cannot be converted (e.g. polymers with bonds to the + same molecule across periodic boundaries, sometimes called "infinite + polymers"). The amount of vacuum that needs to be added depends on + the length of the molecules where the system is split (the example + here splits where there is water with short molecules). In some + cases, the system may need to be re-centered in the box first using + the :doc:`displace_atoms command `. Also, the time + spent on strong thermalization and equilibration will depend on the + specific system and its thermodynamic conditions. Below is a suggested workflow using the :doc:`Rhodopsin benchmark input -` for demonstration. The figure shows the state before on -the left (with unwrapped atoms that have diffused out of the box) and -after on the right (with the vacuum added above and below). The process -is done by modifying the ``in.rhodo`` input file. The first lines up to -and including the :doc:`read_data command ` remain unchanged. -Then we insert the following lines to add vacuum to the z direction -above and below the system: +` for demonstration. The figure shows the state *before* +the procedure on the left (with unwrapped atoms that have diffused out +of the box) and *after* on the right (with the vacuum added above and +below). The procedure is implemented by modifying a copy of the +``in.rhodo`` input file. The first lines up to and including the +:doc:`read_data command ` remain unchanged. Then we insert +the following lines to add vacuum to the z direction above and below the +system: .. code-block:: LAMMPS @@ -79,10 +96,10 @@ Next we replace the :doc:`fix npt command ` with: fix 2 nvt temp 300.0 300.0 10.0 We now have an open system and thus the adjustment of the cell in -z-direction is no longer required. Since splitting of the bulk where -the vacuum is inserted, creates surface atoms with high potential -energy, we reduce the thermostat time constant from 100.0 to 10.0 to -remove excess kinetic energy resulting from that change faster. +z-direction is no longer required. Since splitting the bulk water +region where the vacuum is inserted, creates surface atoms with high +potential energy, we reduce the thermostat time constant from 100.0 to +10.0 to remove excess kinetic energy resulting from that change faster. Also the high potential energy of the surface atoms can cause that some of them are ejected from the slab. In order to suppress that, we add @@ -114,6 +131,11 @@ z-direction will experience a restoring force, nudging them back to the slab. The force constant of :math:`10.0 \frac{\mathrm{kcal/mol}}{\AA}` was determined empirically. +Adding these "restoring" soft walls assist in making the free surfaces +above and below the slab flat, instead of having rugged or ondulated +surfaces. The impact of the walls can be changed by adjusting the force +constant, cutoff, and position of the wall. + Finally, we replace the :doc:`run 100 ` of the original input with: .. code-block:: LAMMPS From d658c589f73d003611da890df3c388c9b0fc6ec8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 21:47:04 -0400 Subject: [PATCH 89/99] update formulations some more --- doc/src/Run_formats.rst | 74 ++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 6e3c87cf79..a8749d1f38 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -7,32 +7,33 @@ formats that LAMMPS is reading and writing. Character Encoding ^^^^^^^^^^^^^^^^^^ -For text files, LAMMPS uses `ASCII character encoding -`_ which represents the digits 0 to -9, the lower and upper case letters a to z, some common punctuation and -other symbols and a few whitespace characters including a regular "space -character", "line feed", "carriage return", "tabulator". These are all -represented by bytes with a value smaller than 128 and only 95 of those -128 values represent printable characters. This is sufficient to represent -most English text, but misses accented characters or umlauts or Greek -symbols and more. +For processing text files, the LAMMPS source code assumes `ASCII +character encoding `_ which +represents the digits 0 to 9, the lower and upper case letters a to z, +some common punctuation and other symbols and a few whitespace +characters including a regular "space character", "line feed", "carriage +return", "tabulator". These are all represented by single bytes with a +value smaller than 128 and only 95 of those 128 values represent +printable characters. This is sufficient to represent most English +text, but misses accented characters or umlauts or Greek symbols and +more. Modern text often uses `UTF-8 character encoding -`_ instead. This is a way to +`_ instead. This is a way to represent many more different characters as defined by the Unicode standard. This is compatible with ASCII, since the first 128 values are -identical with the ASCIII encoding. It is important to note, however, -that there are Unicode characters that look similar or even identical to -ASCII characters, but have a different representation. As a general -rule, these characters are not correctly recognized by LAMMPS. For some -parts of LAMMPS' text processing, translation tables with known -"lookalike" characters are used that transparently substitute non-ASCII -characters with their ASCII equivalents. Non-ASCII lookalike characters -are often used by web browsers or PDF viewers to improve the readability -of text. Thus, when using copy-n-paste to transfer text from such an -application to your input file, you may unintentionally create text that -is not exclusively using ASCII encoding and may cause errors when LAMMPS -is trying to read it. +identical with the ASCII encoding. It is important to note, however, +that there are Unicode characters that *look* similar to ASCII +characters, but have a different binary representation. As a general +rule, these characters may not be correctly recognized by LAMMPS. For +some parts of LAMMPS' text processing, translation tables with known +"lookalike" characters are used. Those transparently substitute +non-ASCII characters with their ASCII equivalents. Non-ASCII lookalike +characters are often used by web browsers or PDF viewers to improve the +readability of text. Thus, when using copy-n-paste to transfer text +from such an application to your input file, you may unintentionally +create text that is not exclusively using ASCII encoding and may cause +errors when LAMMPS is trying to read it. Lines with non-printable and non-ASCII characters in text files can be detected for example with a (Linux) command like the following: @@ -48,22 +49,27 @@ Different countries and languages have different conventions to format numbers. While in some regions commas are used for fractions and points to indicate thousand, million and so on, this is reversed in other regions. Modern operating systems have facilities to adjust input and -output accordingly. The exact rules are often applied according to the -value of the ``$LANG`` environment variable (e.g. "en_US.utf8"). +output accordingly that are collectively referred to as "native language +support" (NLS). The exact rules are often applied according to the +value of the ``$LANG`` environment variable (e.g. "en_US.utf8" for +English text in UTF-8 encoding). For the sake of simplicity of the implementation and transferability of results, LAMMPS does not support this and instead expects numbers being formatted in the generic or "C" locale. The "C" locale has no punctuation for thousand, million and so on and uses a decimal point for fractions. One thousand would be represented as "1000.0" and not as -"1,000.0" nor as "1.000,0". +"1,000.0" nor as "1.000,0". Having native language support enabled for +a locale other than "C" will result in different behavior when converting +or formatting numbers that can trigger unexpected errors. -LAMMPS also only accepts integer numbers when an integer is required, -so using "1.0" is not accepted; you have to use "1" instead. +LAMMPS also only accepts integer numbers when an integer is required, so +using floating point equivalents like "1.0" are not accepted; you *must* +use "1" instead. For floating point numbers in scientific notation, the Fortran double -precision notation "1.1d3" is not accepted either; you have to use -"1100", "1100.0" or "1.1e3". +precision notation "1.1d3" is not accepted; you have to use "1100", +"1100.0" or "1.1e3". Input file ^^^^^^^^^^ @@ -71,12 +77,13 @@ Input file A LAMMPS input file is a text file with commands. It is read line-by-line and each line is processed *immediately*. Before looking for commands and executing them, there is a pre-processing step where -comments (text starting with a pound sign '#') are removed, +comments (non-quoted text starting with a pound sign '#') are removed, `${variable}` and `$(expression)` constructs are expanded or evaluated, and lines that end in the ampersand character '&' are combined with the next line (similar to Fortran 90 free format source code). After the pre-processing, lines are split into "words" and the first word must be a -:doc:`command ` and everything . Below are some example lines: +:doc:`command ` and everything else is considered argument. +Below are some example lines: .. code-block:: LAMMPS @@ -92,11 +99,11 @@ pre-processing, lines are split into "words" and the first word must be a lattice fcc 0.8442 - # multi-line command, uses spacing from "lattice" command + # multi-line command, uses spacing from "lattice" command, else add "units box" to command region box block 0.0 ${xx} & 0.0 40.0 & 0.0 30.0 - # create simulation box and fillwith atoms according to lattice setting + # create simulation box and fill with atoms according to lattice setting create_box 1 box create_atoms 1 box @@ -228,4 +235,3 @@ Restart file Dump file ^^^^^^^^^ - From bc1b22a2f867db4f26bc8ed47338493c1cc65e8d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 25 Mar 2025 23:37:32 -0400 Subject: [PATCH 90/99] finish (for now) the summary of the data file format --- doc/src/Run_formats.rst | 101 +++++++++++++++++++++++++++++++++++----- 1 file changed, 89 insertions(+), 12 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index a8749d1f38..54830549e8 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -167,19 +167,38 @@ from the :doc:`command line `. The file is generally structured into a header section at the very beginning of the file and multiple titled sections like "Atoms", -Masses", "Pair Coeffs", and so on. The data file **always** starts -with a "title" line, which will be **ignored** by LAMMPS. Omitting -the title line can lead to unexpected behavior as then a line of -the header with an actual setting may be ignored. This is often a -line with the "atoms" keyword, which results in LAMMPS assuming that -there are no atoms in the data file and thus throwing an error on the -contents of the "Atoms" section. The title line may contain some -keywords that can be used by external programs to convey information -about the system, that is not required and not read by LAMMPS. +Masses", "Pair Coeffs", and so on. Header keywords can only be used +*before* the first title section. + +The data file **always** starts with a "title" line, which will be +**ignored** by LAMMPS. Omitting the title line can lead to unexpected +behavior as then a line of the header with an actual setting may be +ignored. This is often a line with the "atoms" keyword, which results +in LAMMPS assuming that there are no atoms in the data file and thus +throwing an error on the contents of the "Atoms" section. The title +line may contain some keywords that can be used by external programs to +convey information about the system (included as comments), that is not +required and not read by LAMMPS. + +The line following a section title is also **ignored**. Skipping it +will lead to short reads and thus errors. The number of lines in titled +sections depends on header keywords, like the number of atom types, the +number of atoms, the number of bond types, or the number of bonds and so +on. The data in those sections has to be complete. A special case are +the "Pair Coeffs" and "PairIJ Coeffs" sections; the former is for force +fields and pair styles that use mixing of non-bonded potential +parameters, the latter for pair styles and force fields requiring +explicit coefficients. Thus with *N* being the number of atom types, +the "Pair Coeffs" section has *N* entries while "PairIJ Coeffs" has +:math:`N \cdot (N-1)` entries. Internally, these sections will be +converted to :doc:`pair_coeff ` commands. Thus the +corresponding :doc:`pair style ` must have been set *before* +the :doc:`read_data command ` reads the data file. Data files may contain comments, which start with the pound sign '#'. There must be at least one blank between a valid keyword and the pound -sign. +sign. Below is a simple example case of a data file for :doc:`atom style +full `. .. code-block:: bash @@ -200,7 +219,7 @@ sign. 3 15.9990 4 1.0080 - Pair Coeffs + Pair Coeffs # this section is optional 1 0.110000 3.563595 0.110000 3.563595 2 0.080000 3.670503 0.010000 3.385415 @@ -219,11 +238,69 @@ sign. 8 1 4 0.070 42.07157 57.45486 37.62418 0 0 0 9 1 1 0.510 42.19985 57.57789 39.12163 0 0 0 10 1 1 0.510 41.88641 58.62251 39.70398 0 0 0 - # ^^atomID ^^molID ^^type ^^charge ^^xcoord ^^ycoord ^^ycoord ^^image^^flags + # ^^atomID ^^molID ^^type ^^charge ^^xcoord ^^ycoord ^^ycoord ^^image^^flags (optional) + Velocities # this section is optional + + 1 0.0050731 -0.00398928 0.00391473 + 2 -0.0175184 0.0173484 -0.00489207 + 3 0.00597225 -0.00202006 0.00166454 + 4 -0.010395 -0.0082582 0.00316419 + 5 -0.00390877 0.00470331 -0.00226911 + 6 -0.00111157 -0.00374545 -0.0169374 + 7 0.00209054 -0.00594936 -0.000124563 + 8 0.00635002 -0.0120093 -0.0110999 + 9 -0.004955 -0.0123375 0.000403422 + 10 0.00265028 -0.00189329 -0.00293198 + +The common problem is processing the "Atoms" section, since its format depends +on the :doc:`atom style ` used and that setting must be done in the +input file *before* reading the data file. To assist with detecting incompatible +data files, a comment is appended to the "Atoms" title indicating the atom style +used (or intended) when *writing* the data file. For example below is the same +section for :doc:`atom style charge `, which omits the molecule ID +column. + +.. code-block:: bash + + Atoms # charge + + 1 1 0.560 43.99993 58.52678 36.78550 + 2 2 -0.270 45.10395 58.23499 35.86693 + 3 3 -0.510 43.81519 59.54928 37.43995 + 4 4 0.090 45.71714 57.34797 36.13434 + 5 4 0.090 45.72261 59.13657 35.67007 + 6 4 0.090 44.66624 58.09539 34.85538 + 7 3 -0.470 43.28193 57.47427 36.91953 + 8 4 0.070 42.07157 57.45486 37.62418 + 9 1 0.510 42.19985 57.57789 39.12163 + 10 1 0.510 41.88641 58.62251 39.70398 + # ^^atomID ^^type ^^charge ^^xcoord ^^ycoord ^^ycoord + +Another source of confusion about the "Atoms" section format is the +ordering of columns. The three atom style variants `atom_style full`, +`atom_style hybrid charge molecular`, and `atom_style hybrid molecular +charge` all carry the same per-atom information, but in the data file +the Atoms section has the columns 'Atom-ID Molecule-ID Atom-type Charge +X Y Z' for atom style full, but hybrid atom styles the first columns are +always 'Atom-ID Atom-type X Y Z' and then followed by any *additional* +data added by the hybrid styles, and thus 'Charge Molecule-ID' for the +first hybrid style and 'Molecule-ID Charge' in the second hybrid style +variant. Finally, an alternative to a hybrid atom style is to use fix +property/atom, e.g. to add molecule IDs to atom style charge. In this +case the "Atoms" section is formatted according to atom style charge and +a new section, "Molecules" is added that contains lines with 'Atom-ID +Molecule-ID', one for each atom in the system. For adding charges +to atom style molecular with fix property/atom, the "Atoms" section is +now formatted according to the atom style and a "Charges" section is +added. + Molecule file ^^^^^^^^^^^^^ +Molecule files look quite similar to data files but they do not have a +compatible format, i.e. one cannot use a data file as molecule file and +vice versa. Potential file ^^^^^^^^^^^^^^ From 194b3408f7f835f8c944cdb35710b44c79ebb80a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 26 Mar 2025 09:51:09 -0400 Subject: [PATCH 91/99] add section about molecule files --- doc/src/Run_formats.rst | 73 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 54830549e8..2a8713c40d 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -294,14 +294,79 @@ Molecule-ID', one for each atom in the system. For adding charges to atom style molecular with fix property/atom, the "Atoms" section is now formatted according to the atom style and a "Charges" section is added. - + Molecule file ^^^^^^^^^^^^^ -Molecule files look quite similar to data files but they do not have a -compatible format, i.e. one cannot use a data file as molecule file and -vice versa. +Molecule files for use with the :doc:`molecule command ` look +quite similar to data files but they do not have a compatible format, +i.e. one cannot use a data file as molecule file and vice versa. Below +is a simple example for a water molecule (SPC/E model). Same as a data +file, there is an ignored title line and you can use comments. However, +there is no information about the number of types or the box dimensions. +These are set when the simulation box is created. Thus the header only +has the count of atoms, bonds, and so on. +While there also is a header part and sections and the sections must +come after the header, the (required) section names are may be +different. There is no "Atoms" section and the section format is +independent of the atom style. Its information is split across multiple +sections, like "Coords", "Types", and "Charges". Note that no "Masses" +section is needed here. The atom masses are by default tied to the atom +type and set with a data file or the :doc:`mass command `. A +"Masses" section would only be required for atom styles with per-atom +masses, e.g. atom style sphere. + +Since the entire file is a 'molecule', LAMMPS will assign a new +molecule-ID (if supported by the atom style) when atoms are instantiated +from a molecule file, e.g. with the :doc:`create_atoms command +`. It is possible to include a "Molecules" section, in +case the atoms belong to multiple 'molecules'. Atom-IDs and +molecule-IDs in the molecule file are relative for the file (starting +from 1) and will be translated into actual atom-IDs also when the +molecule is created. + +.. code-block:: bash + + # Water molecule. SPC/E model. + + 3 atoms + 2 bonds + 1 angles + + Coords + + 1 1.12456 0.09298 1.27452 + 2 1.53683 0.75606 1.89928 + 3 0.49482 0.56390 0.65678 + + Types + + 1 1 + 2 2 + 3 2 + + Charges + + 1 -0.8472 + 2 0.4236 + 3 0.4236 + + Bonds + + 1 1 1 2 + 2 1 1 3 + + Angles + + 1 1 2 1 3 + + +There are also optional sections, e.g. about :doc:`SHAKE ` and +:doc:`special bonds `. Those are only needed if the molecule +command is issues *before* the simulation box is defined. Otherwise, the +molecule command can derive the required settings internally. + Potential file ^^^^^^^^^^^^^^ From dcbc3c9dbc391c20b3692edfb681cce89c6ff85d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 26 Mar 2025 09:52:19 -0400 Subject: [PATCH 92/99] whitespace --- doc/src/Run_formats.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 2a8713c40d..a906425168 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -360,13 +360,13 @@ molecule is created. Angles 1 1 2 1 3 - + There are also optional sections, e.g. about :doc:`SHAKE ` and :doc:`special bonds `. Those are only needed if the molecule command is issues *before* the simulation box is defined. Otherwise, the molecule command can derive the required settings internally. - + Potential file ^^^^^^^^^^^^^^ From 7f0b71f7c016e3dd405ac39764561c70270cfaf4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 26 Mar 2025 09:00:25 -0400 Subject: [PATCH 93/99] spelling --- doc/src/Errors_details.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index 9ca69c5068..c94d96b405 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -471,7 +471,7 @@ pair-wise additive pair styles like :doc:`Lennard-Jones `, :doc:`Morse `, :doc:`Born-Meyer-Huggins `, and similar. Such required callbacks have not been implemented for many-body potentials so one would have to implement them to add -compatiability with these computes (which may be difficult to do in a +compatibility with these computes (which may be difficult to do in a generic fashion). Whether this warning indicates that contributions to the computed properties are missing depends on the groups used. At any rate, careful testing of the results is advised when this warning @@ -931,7 +931,7 @@ the documentation carefully. XXX command before simulation box is defined -------------------------------------------- -This error occurs when trying to excute a LAMMPS command that requires +This error occurs when trying to execute a LAMMPS command that requires information about the system dimensions, or the number atom, bond, angle, dihedral, or improper types, or the number of atoms or similar data that is only available *after* the simulation box has been created. @@ -943,7 +943,7 @@ created ` for additional information. XXX command after simulation box is defined -------------------------------------------- -This error occurs when trying to excute a LAMMPS command that changes a +This error occurs when trying to execute a LAMMPS command that changes a global setting *after* it is locked in when the simulation box is created (for instance defining the :doc:`atom style `, :doc:`dimension `, :doc:`newton `, or :doc:`units From 2542b989ee3aaf8c5b4df82b0b074018e89e098d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 26 Mar 2025 19:59:52 -0400 Subject: [PATCH 94/99] small tweak --- doc/src/Run_formats.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index a906425168..a67a28af3b 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -1,9 +1,16 @@ + File formats used by LAMMPS =========================== This page provides a general overview of the kinds of files and file formats that LAMMPS is reading and writing. +.. contents:: On this page + :depth: 2 + :backlinks: top + +------------------- + Character Encoding ^^^^^^^^^^^^^^^^^^ From 738fb4a502e2e35e9910b93b29eafffc28f1eb0e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 27 Mar 2025 16:29:13 -0400 Subject: [PATCH 95/99] add info about restart files --- doc/src/Run_formats.rst | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index a67a28af3b..fe48347edc 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -374,13 +374,46 @@ There are also optional sections, e.g. about :doc:`SHAKE ` and command is issues *before* the simulation box is defined. Otherwise, the molecule command can derive the required settings internally. -Potential file -^^^^^^^^^^^^^^ - +Native Dump file +^^^^^^^^^^^^^^^^ Restart file ^^^^^^^^^^^^ +LAMMPS restart files are binary files and not available in text format. +They can be identified by the first few bytes that contain the (C-style) +string "LammpS RestartT" as `magic string +`_. This is followed by a +16-bit integer of the number 1 used for detecting whether the computer +writing the restart has the same `endianness +`_ as the computer reading it. +If not the file cannot be read correctly. This is followed by a 32-bit +integer indicating the file format revision (currently 3), which can be +used to implement backward compatibility for reading older revisions. + +This information has been added to the `Unix "file" command's +` "magic" file so that restart files +can be identified without opening them. If you have a fairly recent +version, it should already be included. If you have an older version, +the LAMMPS source package :ref:`contains a file with the necessary +additions `. + +The rest of the file is organized in sections of a 32-bit signed integer +constant indicating the kind of content and the corresponding value (or +values). If those values are arrays (including C-style strings), then +the integer constant is followed by a 32-bit integer indicating the +length of the array. This mechanism will read the data regardless of +the ordering of the sections. Symbolic names of the section constants +are in the ``lmprestart.h`` header file. + +LAMMPS restart files are not expected to be portable between platforms +or LAMMPS versions, but changes to the file format are rare. + Dump file ^^^^^^^^^ + + +Potential files +^^^^^^^^^^^^^^^ + From 9661c21052eee23a945d701b5a3d862e41cdb9da Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 28 Mar 2025 09:56:06 -0400 Subject: [PATCH 96/99] comment out possible additional sections --- doc/src/Run_formats.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index fe48347edc..59a29f6bbb 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -410,10 +410,9 @@ LAMMPS restart files are not expected to be portable between platforms or LAMMPS versions, but changes to the file format are rare. -Dump file -^^^^^^^^^ - - -Potential files -^^^^^^^^^^^^^^^ +.. Dump file +.. ^^^^^^^^^ +.. +.. Potential files +.. ^^^^^^^^^^^^^^^ From 4dbf18e2c94b946109dd0b8e23fe098bfd8f5355 Mon Sep 17 00:00:00 2001 From: Jacob Gissinger Date: Fri, 28 Mar 2025 23:15:33 -0400 Subject: [PATCH 97/99] small suggested changes --- doc/src/Run_formats.rst | 115 ++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 59a29f6bbb..17c37a8e2c 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -19,25 +19,25 @@ character encoding `_ which represents the digits 0 to 9, the lower and upper case letters a to z, some common punctuation and other symbols and a few whitespace characters including a regular "space character", "line feed", "carriage -return", "tabulator". These are all represented by single bytes with a -value smaller than 128 and only 95 of those 128 values represent -printable characters. This is sufficient to represent most English +return", "tabulator". These characters are all represented by single bytes +with a value smaller than 128 and only 95 of those 128 values represent +printable characters. This list is sufficient to represent most English text, but misses accented characters or umlauts or Greek symbols and more. Modern text often uses `UTF-8 character encoding -`_ instead. This is a way to -represent many more different characters as defined by the Unicode -standard. This is compatible with ASCII, since the first 128 values are +`_ instead. This encoding is a way +to represent many more different characters as defined by the Unicode +standard. UFT-8 is compatible with ASCII, since the first 128 values are identical with the ASCII encoding. It is important to note, however, that there are Unicode characters that *look* similar to ASCII characters, but have a different binary representation. As a general rule, these characters may not be correctly recognized by LAMMPS. For some parts of LAMMPS' text processing, translation tables with known -"lookalike" characters are used. Those transparently substitute +"lookalike" characters are used. The tables are used to substitute non-ASCII characters with their ASCII equivalents. Non-ASCII lookalike characters are often used by web browsers or PDF viewers to improve the -readability of text. Thus, when using copy-n-paste to transfer text +readability of text. Thus, when using copy and paste to transfer text from such an application to your input file, you may unintentionally create text that is not exclusively using ASCII encoding and may cause errors when LAMMPS is trying to read it. @@ -85,11 +85,11 @@ A LAMMPS input file is a text file with commands. It is read line-by-line and each line is processed *immediately*. Before looking for commands and executing them, there is a pre-processing step where comments (non-quoted text starting with a pound sign '#') are removed, -`${variable}` and `$(expression)` constructs are expanded or evaluated, +``${variable}`` and ``$(expression)`` constructs are expanded or evaluated, and lines that end in the ampersand character '&' are combined with the -next line (similar to Fortran 90 free format source code). After the -pre-processing, lines are split into "words" and the first word must be a -:doc:`command ` and everything else is considered argument. +next line (similar to Fortran 90 free-format source code). After the +pre-processing, lines are split into "words" and evaluated. The first word +must be a :doc:`command ` and all following words are arguments. Below are some example lines: .. code-block:: LAMMPS @@ -102,11 +102,12 @@ Below are some example lines: # ^^ command ^^ argument(s) variable x index 1 # may be overridden from command line with -var x - variable xx equal 20*$x # variable "xx" is always 20 time "x" + variable xx equal 20*$x # variable "xx" is always 20 times "x" lattice fcc 0.8442 - # multi-line command, uses spacing from "lattice" command, else add "units box" to command + # example of a command written across multiple lines + # the "region" command uses spacing from "lattice" command, unless "units box" is specified region box block 0.0 ${xx} & 0.0 40.0 & 0.0 30.0 @@ -144,7 +145,7 @@ There is a frequent misconception about the :doc:`if command `: this is a command for conditional execution **outside** a run or minimization. To trigger actions on specific conditions **during** a run is a non-trivial operation that usually requires adopting one -of the available fix commands or creating a new one. +of the available "fix" commands or creating a new "fix" command. LAMMPS commands change the internal state and thus the order of commands matters and reordering them can produce different results. For example, @@ -155,7 +156,7 @@ dimensions will be different depending on the order of the two commands. Each line must have an "end-of-line" character (line feed or carriage return plus line feed). Some text editors do not automatically insert one which may cause LAMMPS to ignore the last command. It is thus -recommended, to always have an empty line at the end of an input file. +recommended to always have an empty line at the end of an input file. The specific details describing how LAMMPS input is processed and parsed are explained in :doc:`Commands_parse`. @@ -164,33 +165,32 @@ Data file ^^^^^^^^^ A LAMMPS data file contains a description of a system suitable for -reading with the :doc:`read_data command `. This is commonly -used for setting up more complex and particularly molecular systems -which can be difficult to achieve with the commands :doc:`create_box -` and :doc:`create_atoms ` alone. Also, data -files can be used as a portable alternatives to a :doc:`binary restart -file `. A restart file can be converted into a data file -from the :doc:`command line `. +reading with the :doc:`read_data command `. Data files are +commonly used for setting up complex molecular systems that can be +difficult to achieve with the commands :doc:`create_box ` +and :doc:`create_atoms ` alone. Also, data files can be +used as a portable alternatives to a :doc:`binary restart file `. +A restart file can be converted into a data file from the +:doc:`command line `. -The file is generally structured into a header section at the very -beginning of the file and multiple titled sections like "Atoms", -Masses", "Pair Coeffs", and so on. Header keywords can only be used -*before* the first title section. +Data files have a header section at the very beginning of the file and +multiple titled sections such as "Atoms", Masses", "Pair Coeffs", and so on. +Header keywords can only be used *before* the first title section. The data file **always** starts with a "title" line, which will be **ignored** by LAMMPS. Omitting the title line can lead to unexpected -behavior as then a line of the header with an actual setting may be -ignored. This is often a line with the "atoms" keyword, which results -in LAMMPS assuming that there are no atoms in the data file and thus -throwing an error on the contents of the "Atoms" section. The title -line may contain some keywords that can be used by external programs to -convey information about the system (included as comments), that is not -required and not read by LAMMPS. +behavior because a line of the header with an actual setting may be +ignored. In this case, the mistakenly ignored line often contains the +"atoms" keyword, which results in LAMMPS assuming that there are no atoms +in the data file and thus throwing an error on the contents of the "Atoms" +section. The title line may contain some keywords that can be used by +external programs to convey information about the system (included as +comments), that is not required and not read by LAMMPS. -The line following a section title is also **ignored**. Skipping it -will lead to short reads and thus errors. The number of lines in titled +The line following a section title is also **ignored**. An error will occur +if an empty line is not placed after a section title. The number of lines in titled sections depends on header keywords, like the number of atom types, the -number of atoms, the number of bond types, or the number of bonds and so +number of atoms, the number of bond types, the number of bonds, and so on. The data in those sections has to be complete. A special case are the "Pair Coeffs" and "PairIJ Coeffs" sections; the former is for force fields and pair styles that use mixing of non-bonded potential @@ -261,10 +261,10 @@ full `. 10 0.00265028 -0.00189329 -0.00293198 The common problem is processing the "Atoms" section, since its format depends -on the :doc:`atom style ` used and that setting must be done in the +on the :doc:`atom style ` used, and that setting must be done in the input file *before* reading the data file. To assist with detecting incompatible data files, a comment is appended to the "Atoms" title indicating the atom style -used (or intended) when *writing* the data file. For example below is the same +used (or intended) when *writing* the data file. For example, below is an "Atoms" section for :doc:`atom style charge `, which omits the molecule ID column. @@ -287,11 +287,11 @@ column. Another source of confusion about the "Atoms" section format is the ordering of columns. The three atom style variants `atom_style full`, `atom_style hybrid charge molecular`, and `atom_style hybrid molecular -charge` all carry the same per-atom information, but in the data file +charge` all carry the same per-atom information. However, in data files, the Atoms section has the columns 'Atom-ID Molecule-ID Atom-type Charge -X Y Z' for atom style full, but hybrid atom styles the first columns are -always 'Atom-ID Atom-type X Y Z' and then followed by any *additional* -data added by the hybrid styles, and thus 'Charge Molecule-ID' for the +X Y Z' for atom style full, but for hybrid atom styles the first columns are +always 'Atom-ID Atom-type X Y Z' followed by any *additional* +data added by the hybrid styles, for example, 'Charge Molecule-ID' for the first hybrid style and 'Molecule-ID Charge' in the second hybrid style variant. Finally, an alternative to a hybrid atom style is to use fix property/atom, e.g. to add molecule IDs to atom style charge. In this @@ -307,27 +307,26 @@ Molecule file Molecule files for use with the :doc:`molecule command ` look quite similar to data files but they do not have a compatible format, -i.e. one cannot use a data file as molecule file and vice versa. Below +i.e., one cannot use a data file as molecule file and vice versa. Below is a simple example for a water molecule (SPC/E model). Same as a data file, there is an ignored title line and you can use comments. However, there is no information about the number of types or the box dimensions. -These are set when the simulation box is created. Thus the header only -has the count of atoms, bonds, and so on. +These parameters are set when the simulation box is created. Thus the +header only has the count of atoms, bonds, and so on. -While there also is a header part and sections and the sections must -come after the header, the (required) section names are may be -different. There is no "Atoms" section and the section format is -independent of the atom style. Its information is split across multiple -sections, like "Coords", "Types", and "Charges". Note that no "Masses" -section is needed here. The atom masses are by default tied to the atom -type and set with a data file or the :doc:`mass command `. A +Molecule files have a header followed by sections, but the section names are +different than those of a data file. There is no "Atoms" section and the +section format is independent of the atom style. Its information is split +across multiple sections, like "Coords", "Types", and "Charges". Note that +no "Masses" section is needed here. The atom masses are by default tied to +the atom type and set with a data file or the :doc:`mass command `. A "Masses" section would only be required for atom styles with per-atom masses, e.g. atom style sphere. Since the entire file is a 'molecule', LAMMPS will assign a new molecule-ID (if supported by the atom style) when atoms are instantiated from a molecule file, e.g. with the :doc:`create_atoms command -`. It is possible to include a "Molecules" section, in +`. It is possible to include a "Molecules" section in case the atoms belong to multiple 'molecules'. Atom-IDs and molecule-IDs in the molecule file are relative for the file (starting from 1) and will be translated into actual atom-IDs also when the @@ -370,8 +369,8 @@ molecule is created. There are also optional sections, e.g. about :doc:`SHAKE ` and -:doc:`special bonds `. Those are only needed if the molecule -command is issues *before* the simulation box is defined. Otherwise, the +:doc:`special bonds `. Those sections are only needed if the molecule +command is issued *before* the simulation box is defined. Otherwise, the molecule command can derive the required settings internally. Native Dump file @@ -383,11 +382,11 @@ Restart file LAMMPS restart files are binary files and not available in text format. They can be identified by the first few bytes that contain the (C-style) string "LammpS RestartT" as `magic string -`_. This is followed by a +`_. This string is followed by a 16-bit integer of the number 1 used for detecting whether the computer writing the restart has the same `endianness `_ as the computer reading it. -If not the file cannot be read correctly. This is followed by a 32-bit +If not, the file cannot be read correctly. This integer is followed by a 32-bit integer indicating the file format revision (currently 3), which can be used to implement backward compatibility for reading older revisions. From 990007c87b5c4938cc981a4ea3556eee85b715b3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 28 Mar 2025 23:55:38 -0400 Subject: [PATCH 98/99] whitespace, rewrap, and comments --- doc/src/Run_formats.rst | 152 ++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 77 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index 17c37a8e2c..ff74bf1c56 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -19,18 +19,18 @@ character encoding `_ which represents the digits 0 to 9, the lower and upper case letters a to z, some common punctuation and other symbols and a few whitespace characters including a regular "space character", "line feed", "carriage -return", "tabulator". These characters are all represented by single bytes -with a value smaller than 128 and only 95 of those 128 values represent -printable characters. This list is sufficient to represent most English -text, but misses accented characters or umlauts or Greek symbols and -more. +return", "tabulator". These characters are all represented by single +bytes with a value smaller than 128 and only 95 of those 128 values +represent printable characters. This list is sufficient to represent +most English text, but misses accented characters or umlauts or Greek +symbols and more. Modern text often uses `UTF-8 character encoding `_ instead. This encoding is a way to represent many more different characters as defined by the Unicode -standard. UFT-8 is compatible with ASCII, since the first 128 values are -identical with the ASCII encoding. It is important to note, however, -that there are Unicode characters that *look* similar to ASCII +standard. UFT-8 is compatible with ASCII, since the first 128 values +are identical with the ASCII encoding. It is important to note, +however, that there are Unicode characters that *look* similar to ASCII characters, but have a different binary representation. As a general rule, these characters may not be correctly recognized by LAMMPS. For some parts of LAMMPS' text processing, translation tables with known @@ -67,8 +67,8 @@ formatted in the generic or "C" locale. The "C" locale has no punctuation for thousand, million and so on and uses a decimal point for fractions. One thousand would be represented as "1000.0" and not as "1,000.0" nor as "1.000,0". Having native language support enabled for -a locale other than "C" will result in different behavior when converting -or formatting numbers that can trigger unexpected errors. +a locale other than "C" will result in different behavior when +converting or formatting numbers that can trigger unexpected errors. LAMMPS also only accepts integer numbers when an integer is required, so using floating point equivalents like "1.0" are not accepted; you *must* @@ -81,16 +81,16 @@ precision notation "1.1d3" is not accepted; you have to use "1100", Input file ^^^^^^^^^^ -A LAMMPS input file is a text file with commands. It is read +A LAMMPS input file is a text file with commands. It is read line-by-line and each line is processed *immediately*. Before looking for commands and executing them, there is a pre-processing step where comments (non-quoted text starting with a pound sign '#') are removed, -``${variable}`` and ``$(expression)`` constructs are expanded or evaluated, -and lines that end in the ampersand character '&' are combined with the -next line (similar to Fortran 90 free-format source code). After the -pre-processing, lines are split into "words" and evaluated. The first word -must be a :doc:`command ` and all following words are arguments. -Below are some example lines: +``${variable}`` and ``$(expression)`` constructs are expanded or +evaluated, and lines that end in the ampersand character '&' are +combined with the next line (similar to Fortran 90 free-format source +code). After the pre-processing, lines are split into "words" and +evaluated. The first word must be a :doc:`command ` and +all following words are arguments. Below are some example lines: .. code-block:: LAMMPS @@ -166,38 +166,38 @@ Data file A LAMMPS data file contains a description of a system suitable for reading with the :doc:`read_data command `. Data files are -commonly used for setting up complex molecular systems that can be +commonly used for setting up complex molecular systems that can be difficult to achieve with the commands :doc:`create_box ` and :doc:`create_atoms ` alone. Also, data files can be -used as a portable alternatives to a :doc:`binary restart file `. -A restart file can be converted into a data file from the +used as a portable alternatives to a :doc:`binary restart file +`. A restart file can be converted into a data file from the :doc:`command line `. Data files have a header section at the very beginning of the file and -multiple titled sections such as "Atoms", Masses", "Pair Coeffs", and so on. -Header keywords can only be used *before* the first title section. +multiple titled sections such as "Atoms", Masses", "Pair Coeffs", and so +on. Header keywords can only be used *before* the first title section. The data file **always** starts with a "title" line, which will be **ignored** by LAMMPS. Omitting the title line can lead to unexpected behavior because a line of the header with an actual setting may be ignored. In this case, the mistakenly ignored line often contains the -"atoms" keyword, which results in LAMMPS assuming that there are no atoms -in the data file and thus throwing an error on the contents of the "Atoms" -section. The title line may contain some keywords that can be used by -external programs to convey information about the system (included as -comments), that is not required and not read by LAMMPS. +"atoms" keyword, which results in LAMMPS assuming that there are no +atoms in the data file and thus throwing an error on the contents of the +"Atoms" section. The title line may contain some keywords that can be +used by external programs to convey information about the system +(included as comments), that is not required and not read by LAMMPS. -The line following a section title is also **ignored**. An error will occur -if an empty line is not placed after a section title. The number of lines in titled -sections depends on header keywords, like the number of atom types, the -number of atoms, the number of bond types, the number of bonds, and so -on. The data in those sections has to be complete. A special case are -the "Pair Coeffs" and "PairIJ Coeffs" sections; the former is for force -fields and pair styles that use mixing of non-bonded potential -parameters, the latter for pair styles and force fields requiring -explicit coefficients. Thus with *N* being the number of atom types, -the "Pair Coeffs" section has *N* entries while "PairIJ Coeffs" has -:math:`N \cdot (N-1)` entries. Internally, these sections will be +The line following a section title is also **ignored**. An error will +occur if an empty line is not placed after a section title. The number +of lines in titled sections depends on header keywords, like the number +of atom types, the number of atoms, the number of bond types, the number +of bonds, and so on. The data in those sections has to be complete. A +special case are the "Pair Coeffs" and "PairIJ Coeffs" sections; the +former is for force fields and pair styles that use mixing of non-bonded +potential parameters, the latter for pair styles and force fields +requiring explicit coefficients. Thus with *N* being the number of atom +types, the "Pair Coeffs" section has *N* entries while "PairIJ Coeffs" +has :math:`N \cdot (N-1)` entries. Internally, these sections will be converted to :doc:`pair_coeff ` commands. Thus the corresponding :doc:`pair style ` must have been set *before* the :doc:`read_data command ` reads the data file. @@ -260,12 +260,13 @@ full `. 9 -0.004955 -0.0123375 0.000403422 10 0.00265028 -0.00189329 -0.00293198 -The common problem is processing the "Atoms" section, since its format depends -on the :doc:`atom style ` used, and that setting must be done in the -input file *before* reading the data file. To assist with detecting incompatible -data files, a comment is appended to the "Atoms" title indicating the atom style -used (or intended) when *writing* the data file. For example, below is an "Atoms" -section for :doc:`atom style charge `, which omits the molecule ID +The common problem is processing the "Atoms" section, since its format +depends on the :doc:`atom style ` used, and that setting +must be done in the input file *before* reading the data file. To +assist with detecting incompatible data files, a comment is appended to +the "Atoms" title indicating the atom style used (or intended) when +*writing* the data file. For example, below is an "Atoms" section for +:doc:`atom style charge `, which omits the molecule ID column. .. code-block:: bash @@ -289,18 +290,17 @@ ordering of columns. The three atom style variants `atom_style full`, `atom_style hybrid charge molecular`, and `atom_style hybrid molecular charge` all carry the same per-atom information. However, in data files, the Atoms section has the columns 'Atom-ID Molecule-ID Atom-type Charge -X Y Z' for atom style full, but for hybrid atom styles the first columns are -always 'Atom-ID Atom-type X Y Z' followed by any *additional* -data added by the hybrid styles, for example, 'Charge Molecule-ID' for the +X Y Z' for atom style full, but for hybrid atom styles the first columns +are always 'Atom-ID Atom-type X Y Z' followed by any *additional* data +added by the hybrid styles, for example, 'Charge Molecule-ID' for the first hybrid style and 'Molecule-ID Charge' in the second hybrid style variant. Finally, an alternative to a hybrid atom style is to use fix property/atom, e.g. to add molecule IDs to atom style charge. In this case the "Atoms" section is formatted according to atom style charge and a new section, "Molecules" is added that contains lines with 'Atom-ID -Molecule-ID', one for each atom in the system. For adding charges -to atom style molecular with fix property/atom, the "Atoms" section is -now formatted according to the atom style and a "Charges" section is -added. +Molecule-ID', one for each atom in the system. For adding charges to +atom style molecular with fix property/atom, the "Atoms" section is now +formatted according to the atom style and a "Charges" section is added. Molecule file ^^^^^^^^^^^^^ @@ -314,14 +314,14 @@ there is no information about the number of types or the box dimensions. These parameters are set when the simulation box is created. Thus the header only has the count of atoms, bonds, and so on. -Molecule files have a header followed by sections, but the section names are -different than those of a data file. There is no "Atoms" section and the -section format is independent of the atom style. Its information is split -across multiple sections, like "Coords", "Types", and "Charges". Note that -no "Masses" section is needed here. The atom masses are by default tied to -the atom type and set with a data file or the :doc:`mass command `. A -"Masses" section would only be required for atom styles with per-atom -masses, e.g. atom style sphere. +Molecule files have a header followed by sections, but the section names +are different than those of a data file. There is no "Atoms" section +and the section format is independent of the atom style. Its +information is split across multiple sections, like "Coords", "Types", +and "Charges". Note that no "Masses" section is needed here. The atom +masses are by default tied to the atom type and set with a data file or +the :doc:`mass command `. A "Masses" section would only be +required for atom styles with per-atom masses, e.g. atom style sphere. Since the entire file is a 'molecule', LAMMPS will assign a new molecule-ID (if supported by the atom style) when atoms are instantiated @@ -368,32 +368,31 @@ molecule is created. 1 1 2 1 3 -There are also optional sections, e.g. about :doc:`SHAKE ` and -:doc:`special bonds `. Those sections are only needed if the molecule -command is issued *before* the simulation box is defined. Otherwise, the -molecule command can derive the required settings internally. - -Native Dump file -^^^^^^^^^^^^^^^^ +There are also optional sections, e.g. about :doc:`SHAKE ` +and :doc:`special bonds `. Those sections are only needed +if the molecule command is issued *before* the simulation box is +defined. Otherwise, the molecule command can derive the required +settings internally. Restart file ^^^^^^^^^^^^ LAMMPS restart files are binary files and not available in text format. They can be identified by the first few bytes that contain the (C-style) -string "LammpS RestartT" as `magic string -`_. This string is followed by a -16-bit integer of the number 1 used for detecting whether the computer -writing the restart has the same `endianness +string ``LammpS RestartT`` as `magic string +`_. This string is followed +by a 16-bit integer of the number 1 used for detecting whether the +computer writing the restart has the same `endianness `_ as the computer reading it. -If not, the file cannot be read correctly. This integer is followed by a 32-bit -integer indicating the file format revision (currently 3), which can be -used to implement backward compatibility for reading older revisions. +If not, the file cannot be read correctly. This integer is followed by +a 32-bit integer indicating the file format revision (currently 3), +which can be used to implement backward compatibility for reading older +revisions. This information has been added to the `Unix "file" command's ` "magic" file so that restart files can be identified without opening them. If you have a fairly recent -version, it should already be included. If you have an older version, +version, it should already be included. If you have an older version, the LAMMPS source package :ref:`contains a file with the necessary additions `. @@ -409,9 +408,8 @@ LAMMPS restart files are not expected to be portable between platforms or LAMMPS versions, but changes to the file format are rare. -.. Dump file -.. ^^^^^^^^^ +.. Native Dump file +.. ^^^^^^^^^^^^^^^^ .. .. Potential files .. ^^^^^^^^^^^^^^^ - From 7ff9ee51e58a45e4f503d0e54a01e227818cc090 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 29 Mar 2025 15:56:34 -0400 Subject: [PATCH 99/99] small tweaks --- doc/src/Run_formats.rst | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/doc/src/Run_formats.rst b/doc/src/Run_formats.rst index ff74bf1c56..d03227f091 100644 --- a/doc/src/Run_formats.rst +++ b/doc/src/Run_formats.rst @@ -314,23 +314,25 @@ there is no information about the number of types or the box dimensions. These parameters are set when the simulation box is created. Thus the header only has the count of atoms, bonds, and so on. -Molecule files have a header followed by sections, but the section names -are different than those of a data file. There is no "Atoms" section -and the section format is independent of the atom style. Its -information is split across multiple sections, like "Coords", "Types", -and "Charges". Note that no "Masses" section is needed here. The atom -masses are by default tied to the atom type and set with a data file or -the :doc:`mass command `. A "Masses" section would only be -required for atom styles with per-atom masses, e.g. atom style sphere. +Molecule files have a header followed by sections (just as in data +files), but the section names are different than those of a data file. +There is no "Atoms" section and the section formats in molecule files is +independent of the atom style. Its information is split across multiple +sections, like "Coords", "Types", and "Charges". Note that no "Masses" +section is needed here. The atom masses are by default tied to the atom +type and set with a data file or the :doc:`mass command `. A +"Masses" section would only be required for atom styles with per-atom +masses, e.g. atom style sphere, where in data files you would provide +the density and the diameter instead of the mass. Since the entire file is a 'molecule', LAMMPS will assign a new molecule-ID (if supported by the atom style) when atoms are instantiated from a molecule file, e.g. with the :doc:`create_atoms command -`. It is possible to include a "Molecules" section in -case the atoms belong to multiple 'molecules'. Atom-IDs and -molecule-IDs in the molecule file are relative for the file (starting -from 1) and will be translated into actual atom-IDs also when the -molecule is created. +`. It is possible to include a "Molecules" section to +indicate that the atoms belong to multiple 'molecules'. Atom-IDs and +molecule-IDs in the molecule file are relative for the file +(i.e. starting from 1) and will be translated into actual atom-IDs also +when the atoms from the molecule are created. .. code-block:: bash @@ -407,7 +409,6 @@ are in the ``lmprestart.h`` header file. LAMMPS restart files are not expected to be portable between platforms or LAMMPS versions, but changes to the file format are rare. - .. Native Dump file .. ^^^^^^^^^^^^^^^^ ..