From d1442b0538d85e5890edbc52b512c356fb611143 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 4 Sep 2020 11:33:49 -0600 Subject: [PATCH 001/352] enable per-atom custom arrays in addition to vectors --- doc/src/balance.rst | 18 +- doc/src/compute_property_atom.rst | 117 ++++---- doc/src/dump.rst | 45 +-- doc/src/fix_property_atom.rst | 258 +++++++++-------- doc/src/fix_store_state.rst | 35 ++- doc/src/group.rst | 37 ++- doc/src/set.rst | 34 ++- src/Makefile | 1 + src/atom.cpp | 202 ++++++++++--- src/atom.h | 17 +- src/compute_property_atom.cpp | 171 +++++++---- src/compute_property_atom.h | 20 +- src/dump_custom.cpp | 279 +++++++++++------- src/dump_custom.h | 25 +- src/fix_group.cpp | 34 ++- src/fix_group.h | 2 +- src/fix_property_atom.cpp | 453 +++++++++++++++++++++--------- src/fix_property_atom.h | 9 +- src/fix_store_state.cpp | 199 ++++++++----- src/imbalance_store.cpp | 13 +- src/input.cpp | 53 +++- src/set.cpp | 88 ++++-- src/set.h | 2 +- 23 files changed, 1390 insertions(+), 722 deletions(-) diff --git a/doc/src/balance.rst b/doc/src/balance.rst index e023b6f2f0..afa43cbc2f 100644 --- a/doc/src/balance.rst +++ b/doc/src/balance.rst @@ -465,12 +465,18 @@ atom-style variables can reference the position of a particle, its velocity, the volume of its Voronoi cell, etc. The *store* weight style does not compute a weight factor. Instead it -stores the current accumulated weights in a custom per-atom property -specified by *name*\ . This must be a property defined as *d_name* via -the :doc:`fix property/atom ` command. Note that -these custom per-atom properties can be output in a :doc:`dump ` -file, so this is a way to examine, debug, or visualize the -per-particle weights computed during the load-balancing operation. +stores the current accumulated weights in a custom per-atom vector +specified by *name*\ . This must be a vector defined as *d_name* via +the :doc:`fix property/atom ` command. This means +the values in the vector can be read as part of a data file with the +:doc:`read_data ` command or specified with the :doc:`set +` command. These weights can also be output in a :doc:`dump +` file, so this is a way to examine, debug, or visualize the +per-particle weights used during the load-balancing operation. + +Note that the name of the custom per-atom vector is specified just +as *name*, not as *d_name* as it is for other commands that use +different kinds of custom atom vectors or arrays as arguments. ---------- diff --git a/doc/src/compute_property_atom.rst b/doc/src/compute_property_atom.rst index ec9322bb7b..b455b7ae53 100644 --- a/doc/src/compute_property_atom.rst +++ b/doc/src/compute_property_atom.rst @@ -20,7 +20,8 @@ Syntax x, y, z, xs, ys, zs, xu, yu, zu, ix, iy, iz, vx, vy, vz, fx, fy, fz, q, mux, muy, muz, mu, - sp, spx, spy, spz, fmx, fmy, fmz, + spx, spy, spz, sp, fmx, fmy, fmz, + nbonds, radius, diameter, omegax, omegay, omegaz, angmomx, angmomy, angmomz, shapex,shapey, shapez, @@ -29,42 +30,42 @@ Syntax corner1x, corner1y, corner1z, corner2x, corner2y, corner2z, corner3x, corner3y, corner3z, - nbonds, - buckling, - vfrac, s0, - spin, eradius, ervel, erforce, - rho, drho, e, de, cv, - i_name, d_name + i_name, d_name, i2_name[I], d2_name[I], + vfrac, s0, spin, eradius, ervel, erforce, + rho, drho, e, de, cv, buckling .. parsed-literal:: - id = atom ID - mol = molecule ID - proc = ID of processor that owns atom - type = atom type - mass = atom mass - x,y,z = unscaled atom coordinates - xs,ys,zs = scaled atom coordinates - xu,yu,zu = unwrapped atom coordinates - ix,iy,iz = box image that the atom is in - vx,vy,vz = atom velocities - fx,fy,fz = forces on atoms - q = atom charge - mux,muy,muz = orientation of dipole moment of atom - mu = magnitude of dipole moment of atom - sp = atomic magnetic spin moment - spx, spy, spz = direction of the atomic magnetic spin - fmx, fmy, fmz = magnetic force - radius,diameter = radius,diameter of spherical particle - omegax,omegay,omegaz = angular velocity of spherical particle - angmomx,angmomy,angmomz = angular momentum of aspherical particle - shapex,shapey,shapez = 3 diameters of aspherical particle - quatw,quati,quatj,quatk = quaternion components for aspherical or body particles - tqx,tqy,tqz = torque on finite-size particles - end12x, end12y, end12z = end points of line segment - corner123x, corner123y, corner123z = corner points of triangle - nbonds = number of bonds assigned to an atom - buckling = buckling flag used in mesoscopic simulation of nanotubes + *id* = atom ID + *mol* = molecule ID + *proc* = ID of processor that owns atom + *type* = atom type + *mass* = atom mass + *x,y,z* = unscaled atom coordinates + *xs,ys,zs* = scaled atom coordinates + *xu,yu,zu* = unwrapped atom coordinates + *ix,iy,iz* = box image that the atom is in + *vx,vy,vz* = atom velocities + *fx,fy,fz* = forces on atoms + *q* = atom charge + *mux,muy,muz* = orientation of dipole moment of atom + *mu* = magnitude of dipole moment of atom + *spx, spy, spz* = direction of the atomic magnetic spin + *sp* = magintude of atomic magnetic spin moment + *fmx, fmy, fmz* = magnetic force + *nbonds* = number of bonds assigned to an atom + *radius,diameter* = radius,diameter of spherical particle + *omegax,omegay,omegaz* = angular velocity of spherical particle + *angmomx,angmomy,angmomz* = angular momentum of aspherical particle + *shapex,shapey,shapez* = 3 diameters of aspherical particle + *quatw,quati,quatj,quatk* = quaternion components for aspherical or body particles + *tqx,tqy,tqz* = torque on finite-size particles + *end12x, end12y, end12z* = end points of line segment + *corner123x, corner123y, corner123z* = corner points of triangle + *i_name* = custom integer vector with name + *d_name* = custom floating point vector with name + *i2_name[I]* = Ith column of custom integer array with name + *d2_name[I]* = Ith column of custom floating-point array with name .. parsed-literal:: @@ -91,9 +92,8 @@ Syntax .. parsed-literal:: - :doc:`fix property/atom ` per-atom properties: - i_name = custom integer vector with name - d_name = custom integer vector with name + USER-MESONT package per-atom properties: + buckling = buckling flag used in mesoscopic simulation of nanotubes Examples """""""" @@ -104,6 +104,7 @@ Examples compute 2 all property/atom type compute 1 all property/atom ix iy iz compute 3 all property/atom sp spx spy spz + compute 1 all property/atom i_myFlag d_Sxyz[1] d_Sxyz[3] Description """"""""""" @@ -116,20 +117,37 @@ ave/atom `, :doc:`fix ave/histo `, :doc:`fix ave/chunk `, and :doc:`atom-style variable ` commands. -The list of possible attributes is the same as that used by the -:doc:`dump custom ` command, which describes their meaning, with -some additional quantities that are only defined for certain -:doc:`atom styles `. Basically, this augmented list gives -an input script access to any per-atom quantity stored by LAMMPS. +The list of possible attributes is essentially the same as that used +by the :doc:`dump custom ` command, which describes their +meaning, with some additional quantities that are only defined for +certain :doc:`atom styles `. The goal of this augmented +list gives an input script access to any per-atom quantity stored by +LAMMPS. The values are stored in a per-atom vector or array as discussed below. Zeroes are stored for atoms not in the specified group or for quantities that are not defined for a particular particle in the group (e.g. *shapex* if the particle is not an ellipsoid). +Attributes *i_name*, *d_name*, *i2_name*, *d2_name* refer to custom +per-atom integer and floating-point vectors or arrays that have been +added via the :doc:`fix property/atom ` command. +When that command is used specific names are given to each attribute +which are the "name" portion of these attributes. For arrays *i2_name* +and *d2_name*, the column of the array must also be included following +the name in brackets: e.g. d2_xyz[2], i2_mySpin[3]. + The additional quantities only accessible via this command, and not directly via the :doc:`dump custom ` command, are as follows. +*Nbonds* is available for all molecular atom styles and refers to the +number of explicit bonds assigned to an atom. Note that if the +:doc:`newton bond ` command is set to *on*\ , which is the +default, then every bond in the system is assigned to only one of the +two atoms in the bond. Thus a bond between atoms I,J may be tallied +for either atom I or atom J. If :doc:`newton bond off ` is +set, it will be tallied with both atom I and atom J. + *Shapex*\ , *shapey*\ , and *shapez* are defined for ellipsoidal particles and define the 3d shape of each particle. @@ -146,19 +164,8 @@ line segment. *corner2z*\ , *corner3x*\ , *corner3y*\ , *corner3z*\ , are defined for triangular particles and define the corner points of each triangle. -*Nbonds* is available for all molecular atom styles and refers to the -number of explicit bonds assigned to an atom. Note that if the -:doc:`newton bond ` command is set to *on*\ , which is the -default, then every bond in the system is assigned to only one of the -two atoms in the bond. Thus a bond between atoms I,J may be tallied -for either atom I or atom J. If :doc:`newton bond off ` is -set, it will be tallied with both atom I and atom J. - -The *i_name* and *d_name* attributes refer to custom integer and -floating-point properties that have been added to each atom via the -:doc:`fix property/atom ` command. When that -command is used specific names are given to each attribute which are -what is specified as the "name" portion of *i_name* or *d_name*. +In addition, the various per-atom quantities listed above for specific +packages are only accessible by this command. Output info """"""""""" diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 36a20defb6..2b7e6d7bae 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -78,7 +78,8 @@ Syntax q, mux, muy, muz, mu, radius, diameter, omegax, omegay, omegaz, angmomx, angmomy, angmomz, tqx, tqy, tqz, - c_ID, c_ID[N], f_ID, f_ID[N], v_name + c_ID, c_ID[I], f_ID, f_ID[I], v_name, + i_name, d_name, i2_name[I], d2_name[I] .. parsed-literal:: @@ -108,8 +109,10 @@ Syntax f_ID = per-atom vector calculated by a fix with ID f_ID[I] = Ith column of per-atom array calculated by a fix with ID, I can include wildcard (see below) v_name = per-atom vector calculated by an atom-style variable with name - d_name = per-atom floating point vector with name, managed by fix property/atom - i_name = per-atom integer vector with name, managed by fix property/atom + i_name = custom integer vector with name + d_name = custom floating point vector with name + i2_name[I] = Ith column of custom integer array with name, I can include wildcard (see below) + d2_name[I] = Ith column of custom floating point vector with name, I can include wildcard (see below) * *local* args = list of local attributes @@ -134,7 +137,7 @@ Examples dump 2 subgroup atom 50 dump.run.mpiio.bin dump 4a all custom 100 dump.myforce.* id type x y vx fx dump 4b flow custom 100 dump.%.myforce id type c_myF[3] v_ke - dump 4b flow custom 100 dump.%.myforce id type c_myF[\*] v_ke + dump 4b flow custom 100 dump.%.myforce id type c_myF[*] v_ke dump 2 inner cfg 10 dump.snap.*.cfg mass type xs ys zs vx vy vz dump snap all cfg 100 dump.config.*.cfg mass type xs ys zs id type c_Stress[2] dump 1 all xtc 1000 file.xtc @@ -465,16 +468,15 @@ styles. ---------- Note that in the discussion which follows, for styles which can -reference values from a compute or fix, like the *custom*\ , *cfg*\ , or -*local* styles, the bracketed index I can be specified using a -wildcard asterisk with the index to effectively specify multiple -values. This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N = the -size of the vector (for *mode* = scalar) or the number of columns in -the array (for *mode* = vector), then an asterisk with no numeric -values means all indices from 1 to N. A leading asterisk means all -indices from 1 to n (inclusive). A trailing asterisk means all -indices from n to N (inclusive). A middle asterisk means all indices -from m to n (inclusive). +reference values from a compute or fix or custom atom property, like +the *custom*\ , *cfg*\ , or *local* styles, the bracketed index I can +be specified using a wildcard asterisk with the index to effectively +specify multiple values. This takes the form "\*" or "\*n" or "n\*" +or "m\*n". If N = the number of columns in the array, then an +asterisk with no numeric values means all column indices from 1 to N. +A leading asterisk means all indices from 1 to n (inclusive). A +trailing asterisk means all indices from n to N (inclusive). A middle +asterisk means all indices from m to n (inclusive). Using a wildcard is the same as if the individual columns of the array had been listed one by one. E.g. these 2 dump commands are @@ -512,8 +514,9 @@ bonds and angles. Note that computes which calculate global or per-atom quantities, as opposed to local quantities, cannot be output in a dump local command. -Instead, global quantities can be output by the :doc:`thermo_style custom ` command, and per-atom quantities can be -output by the dump custom command. +Instead, global quantities can be output by the :doc:`thermo_style +custom ` command, and per-atom quantities can be output +by the dump custom command. If *c_ID* is used as a attribute, then the local vector calculated by the compute is printed. If *c_ID[I]* is used, then I must be in the @@ -660,9 +663,13 @@ invoke other computes, fixes, or variables when they are evaluated, so this is a very general means of creating quantities to output to a dump file. -The *d_name* and *i_name* attributes allow to output custom per atom -floating point or integer properties that are managed by -:doc:`fix property/atom `. +The *i_name*, *d_name*, *i2_name*, *d2_name* attributes refer to +per-atom integer and floating-point vectors or arrays that have been +added via the :doc:`fix property/atom ` command. +When that command is used specific names are given to each attribute +which are the "name" portion of these keywords. For arrays *i2_name* +and *d2_name*, the column of the array must also be included following +the name in brackets: e.g. d2_xyz[2], i2_mySpin[3]. See the :doc:`Modify ` doc page for information on how to add new compute and fix styles to LAMMPS to calculate per-atom quantities diff --git a/doc/src/fix_property_atom.rst b/doc/src/fix_property_atom.rst index eaf246c1a3..584451cba1 100644 --- a/doc/src/fix_property_atom.rst +++ b/doc/src/fix_property_atom.rst @@ -11,11 +11,11 @@ Syntax .. parsed-literal:: - fix ID group-ID property/atom vec1 vec2 ... keyword value ... + fix ID group-ID property/atom name1 name2 ... keyword value ... * ID, group-ID are documented in :doc:`fix ` command * property/atom = style name of this fix command -* vec1,vec2,... = *mol* or *q* or *rmass* or *i_name* or *d_name* +* name1,name2,... = *mol* or *q* or *rmass* or *i_name* or *d_name* or *i2_name* or *d2_name* .. parsed-literal:: @@ -24,6 +24,10 @@ Syntax *rmass* = per-atom mass *i_name* = new integer vector referenced by name *d_name* = new floating-point vector referenced by name + *i2_name* = new integer array referenced by name + i2_name arg = N = number of columns in the array + *d2_name* = new floating-point array referenced by name + d2_name arg = N = number of columns in the array * zero of more keyword/value pairs may be appended * keyword = *ghost* @@ -39,58 +43,64 @@ Examples fix 1 all property/atom mol fix 1 all property/atom i_myflag1 i_myflag2 - fix 1 all property/atom d_sx d_sy d_sz + fix 1 all property/atom d2_sxyz 3 ghost yes Description """"""""""" -Create one or more additional per-atom vectors to store information -about atoms and to use during a simulation. The specified *group-ID* -is ignored by this fix. +Create one or more additional per-atom vectors or arrays to store +information about atoms and to use during a simulation. The specified +*group-ID* is ignored by this fix. The atom style used for a simulation defines a set of per-atom properties, as explained on the :doc:`atom_style ` and -:doc:`read_data ` doc pages. The latter command allows these -properties to be defined for each atom in the system when a data file -is read. This fix will augment the set of properties with new custom +:doc:`read_data ` doc pages. The latter command defines +these properties for each atom in the system when a data file is read. +This fix augments the set of per-atom properties with new custom ones. This can be useful in several scenarios. -If the atom style does not define molecule IDs, per-atom charge, -or per-atom mass, they can be added using the *mol*\ , *q* or *rmass* -keywords. This can be useful, e.g, to define "molecules" to use as -rigid bodies with the :doc:`fix rigid ` command, or just to -carry around an extra flag with the atoms (stored as a molecule ID) -that can be used to group atoms without having to use the group +If the atom style does not define molecule IDs, per-atom charge, or +per-atom mass, they can be added using the *mol*\ , *q* or *rmass* +keywords. This ciykd be useful to define "molecules" to use as rigid +bodies with the :doc:`fix rigid ` command, or to carry +around an extra flag with atoms (stored as a molecule ID) that can be +used by various commands like :doc:`compute chunk/atom +` to group atoms without having to use the group command (which is limited to a total of 32 groups including *all*\ ). -Another application would be to use the *rmass* flag in order to have -per-atom masses instead of per-type masses, for example this can be -useful to study isotope effects with partial isotope substitution. -Please :ref:`see below ` for an example of simulating a mixture -of light and heavy water with the TIP4P water potential. +Another application is to use the *rmass* flag in order to have +per-atom masses instead of per-type masses. This could be used to +study isotope effects with partial isotope substitution. :ref:`See +below ` for an example of simulating a mixture of light and +heavy water with the TIP4P water potential. -An alternative to using fix *property/atom* in these ways is to +An alternative to using fix *property/atom* for these examples is to use an atom style that does define molecule IDs or charge or per-atom mass (indirectly via diameter and density) or to use a hybrid atom -style that combines two or more atom styles -to provide the union of all atom properties. However, this has two -practical drawbacks: first, it typically necessitates changing the -format of the data file, which can be tedious for large systems; -and second, it may define additional properties that are not needed -such as bond lists, which has some overhead when there are no bonds. +style that combines two or more atom styles to provide the union of +all their atom properties. However, this has two practical drawbacks: +first, it typically necessitates changing the format of the Atoms +section in the data file and second, it may define additional +properties that are not needed such as bond lists, which incurs some +overhead when there are no bonds. -In the future, we may add additional per-atom properties similar to -*mol*\ , *q* or *rmass*\ , which "turn-on" specific properties defined -by some atom styles, so they can be used by atom styles that do not -define them. +In the future, we may add additional existing per-atom properties to +fix property/atom, similar to *mol*\ , *q* or *rmass*\ , which +"turn-on" specific properties defined by some atom styles, so they can +be easily used by atom styles that do not define them. -More generally, the *i_name* and *d_name* vectors allow one or more -new custom per-atom properties to be defined. Each name must be -unique and can use alphanumeric or underscore characters. These -vectors can store whatever values you decide are useful in your -simulation. As explained below there are several ways to initialize -and access and output these values, both via input script commands and -in new code that you add to LAMMPS. +More generally, the *i_name* and *d_name* options allow one or more +new custom per-atom vectors to be defined. Likewise the *i2_name* and +*d2_name* options allow one or more custom per-atom arrays to be +defined. The *i2_name* and *d2_name* options take an argument *N* +which specifies the number of columns in the per-atom array, i.e. the +number of attributes associated with each atom. *N* >= 1 is required. + +Each name must be unique and can use alphanumeric or underscore +characters. These vectors and arrays can store whatever values you +decide are useful in your simulation. As explained below there are +several ways to initialize, access, and output these values, via input +script commands, data files, and in new code you add to LAMMPS. This is effectively a simple way to add per-atom properties to a model without needing to write code for a new :doc:`atom style ` @@ -107,42 +117,38 @@ new properties are also defined for the ghost atoms. .. note:: - If you use this command with the *mol*\ , *q* or *rmass* vectors, - then you most likely want to set *ghost* yes, since these properties - are stored with ghost atoms if you use an :doc:`atom_style ` - that defines them, and many LAMMPS operations that use molecule IDs or - charge, such as neighbor lists and pair styles, will expect ghost - atoms to have these values. LAMMPS will issue a warning it you define - those vectors but do not set *ghost* yes. + If you use the *mol*\ , *q* or *rmass* names, you most likely want + to set *ghost* yes, since these properties are stored with ghost + atoms if you use an :doc:`atom_style ` that defines + them. Many LAMMPS operations that use molecule IDs or charge, such + as neighbor lists and pair styles, will expect ghost atoms to have + these values. LAMMPS will issue a warning it you define those + vectors but do not set *ghost* yes. .. note:: - The properties for ghost atoms are not updated every timestep, - but only once every few steps when neighbor lists are re-built. Thus - the *ghost* keyword is suitable for static properties, like molecule - IDs, but not for dynamic properties that change every step. For the - latter, the code you add to LAMMPS to change the properties will also - need to communicate their new values to/from ghost atoms, an operation - that can be invoked from within a :doc:`pair style ` or - :doc:`fix ` or :doc:`compute ` that you write. - -.. note:: - - If this fix is defined **after** the simulation box is created, - a 'run 0' command should be issued to properly initialize the storage - created by this fix. + The specified properties for ghost atoms are not updated every + timestep, but only once every few steps when neighbor lists are + re-built. Thus the *ghost* keyword is suitable for static + properties, like molecule IDs, but not for dynamic properties that + change every step. For the latter, the code you add to LAMMPS to + change the properties will also need to communicate their new + values to/from ghost atoms, an operation that can be invoked from + within a :doc:`pair style ` or :doc:`fix ` or + :doc:`compute ` that you write. ---------- This fix is one of a small number that can be defined in an input script before the simulation box is created or atoms are defined. -This is so it can be used with the :doc:`read_data ` command -as described below. +This is so it can be used with the :doc:`read_data ` +command as described next. -Per-atom properties that are defined by the :doc:`atom style ` are initialized when atoms are created, e.g. by -the :doc:`read_data ` or :doc:`create_atoms ` +Per-atom properties that are defined by the :doc:`atom style +` are initialized when atoms are created, e.g. by the +:doc:`read_data ` or :doc:`create_atoms ` commands. The per-atom properties defined by this fix are not. So -you need to initialize them explicitly. This can be done by the +you need to initialize them explicitly. One way to do thisis :doc:`read_data ` command, using its *fix* keyword and passing it the fix-ID of this fix. @@ -167,15 +173,22 @@ would allow a data file to have a section like this: ... N 763 4.5 -where N is the number of atoms, and the first field on each line is -the atom-ID, followed by a molecule-ID and a floating point value that -will be stored in a new property called "flag". Note that the list of -per-atom properties can be in any order. +where N is the number of atoms, the first field on each line is the +atom-ID, the next two are a molecule-ID and a floating point value +that will be stored in a new property called "flag". If a per-atom +array was specified in the fix property/atom commmand then the *N* +values for that array must be specified consecutively for that +property on each line. -Another way of initializing the new properties is via the -:doc:`set ` command. For example, if you wanted molecules -defined for every set of 10 atoms, based on their atom-IDs, -these commands could be used: +Note that the the lines of per-atom properties can be listed in any +order. Also note that all the per-atom properties specified by the +fix ID (prop in this case) must be included on each line in the +specified data file section (Molecules in this case). + +Another way of initializing the new properties is via the :doc:`set +` command. For example, if you wanted molecules defined for +every set of 10 atoms, based on their atom-IDs, these commands could +be used: .. code-block:: LAMMPS @@ -185,53 +198,59 @@ these commands could be used: The :doc:`atom-style variable ` will create values for atoms with IDs 31,32,33,...40 that are 4.0,4.1,4.2,...,4.9. When the -:doc:`set ` commands assigns them to the molecule ID for each atom, -they will be truncated to an integer value, so atoms 31-40 will all be -assigned a molecule ID of 4. +:doc:`set ` commands assigns them to the molecule ID for each +atom, they will be truncated to an integer value, so atoms 31-40 will +all be assigned a molecule ID of 4. -Note that :doc:`atomfile-style variables ` can also be used in -place of atom-style variables, which means in this case that the +Note that :doc:`atomfile-style variables ` can also be used +in place of atom-style variables, which means in this case that the molecule IDs could be read-in from a separate file and assigned by the :doc:`set ` command. This allows you to initialize new per-atom properties in a completely general fashion. ---------- -For new atom properties specified as *i_name* or *d_name*, the -:doc:`compute property/atom ` command can access -their values. This means that the values can be output via the :doc:`dump custom ` command, accessed by fixes like :doc:`fix ave/atom `, accessed by other computes like :doc:`compute reduce `, or used in :doc:`atom-style variables `. +For new atom properties specified as *i_name*, *d_name*, *i2_name*, or +*d2_name*, the :doc:`dump custom ` and :doc:`compute +property/atom ` commands can access their +values. This means that the values can be used accessed by fixes like +:doc:`fix ave/atom `, accessed by other computes like +:doc:`compute reduce `, or used in :doc:`atom-style +variables `. -For example, these commands will output two new properties to a custom -dump file: +For example, these commands will output both the instantanous and +time-averaged values of two new properties to a custom dump file: .. code-block:: LAMMPS - fix prop all property/atom i_flag1 d_flag2 + fix myprops all property/atom i_flag1 d_flag2 compute 1 all property/atom i_flag1 d_flag2 - dump 1 all custom 100 tmp.dump id x y z c_1[1] c_1[2] + fix 1 all ave/atom 10 10 100 c_1[1] c_1[2] + dump 1 all custom 100 tmp.dump id x y z i_flag1 d_flag2 f_1[1] f_1[2] ---------- -If you wish to add new :doc:`pair styles `, -:doc:`fixes `, or :doc:`computes ` that use the per-atom -properties defined by this fix, see the :doc:`Modify atom ` -doc page which has details on how the properties can be accessed from -added classes. +If you wish to add new :doc:`pair styles `, :doc:`fixes +`, or :doc:`computes ` that use the per-atom properties +defined by this fix, see the :doc:`Modify atom ` doc page +which has details on how the custom properties of this fix can be +accessed from added classes. ---------- .. _isotopes: -Example for using per-atom masses with TIP4P water to -study isotope effects. When setting up simulations with the :doc:`TIP4P pair styles ` for water, you have to provide exactly -one atom type each to identify the water oxygen and hydrogen -atoms. Since the atom mass is normally tied to the atom type, this -makes it impossible to study multiple isotopes in the same simulation. -With *fix property/atom rmass* however, the per-type masses are -replaced by per-atom masses. Asumming you have a working input deck -for regular TIP4P water, where water oxygen is atom type 1 and water -hydrogen is atom type 2, the following lines of input script convert -this to using per-atom masses: +Here is an example of using per-atom masses with TIP4P water to study +isotope effects. When setting up simulations with the :doc:`TIP4P pair +styles ` for water, you have to provide exactly one atom +type each to identify the water oxygen and hydrogen atoms. Since the +atom mass is normally tied to the atom type, this makes it impossible +to study multiple isotopes in the same simulation. With *fix +property/atom rmass* however, the per-type masses are replaced by +per-atom masses. Asumming you have a working input deck for regular +TIP4P water, where water oxygen is atom type 1 and water hydrogen is +atom type 2, the following lines of input script convert this to using +per-atom masses: .. code-block:: LAMMPS @@ -239,22 +258,22 @@ this to using per-atom masses: set type 1 mass 15.9994 set type 2 mass 1.008 -When writing out the system data with the :doc:`write_data ` -command, there will be a new section named with the fix-ID -(i.e. *Isotopes* in this case). Alternatively, you can take an -existing data file and just add this *Isotopes* section with -one line per atom containing atom-ID and mass. Either way, the -extended data file can be read back with: +When writing out the system data with the :doc:`write_data +` command, there will be a new section named with the +fix-ID (i.e. *Isotopes* in this case). Alternatively, you can take an +existing data file and just add this *Isotopes* section with one line +per atom containing atom-ID and mass. Either way, the extended data +file can be read back with: .. code-block:: LAMMPS fix Isotopes all property/atom rmass ghost yes read_data tip4p-isotopes.data fix Isotopes NULL Isotopes -Please note that the first *Isotopes* refers to the fix-ID -and the second to the name of the section. The following input -script code will now change the first 100 water molecules in this -example to heavy water: +Please note that the first *Isotopes* refers to the fix-ID and the +second to the name of the section. The following input script code +will now change the first 100 water molecules in this example to heavy +water: .. code-block:: LAMMPS @@ -271,17 +290,19 @@ example to heavy water: Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -This fix writes the per-atom values it stores to :doc:`binary restart files `, so that the values can be restored when a -simulation is restarted. See the :doc:`read_restart ` -command for info on how to re-specify a fix in an input script that -reads a restart file, so that the operation of the fix continues in an +This fix writes the per-atom values it stores to :doc:`binary restart +files `, so that the values can be restored when a simulation +is restarted. See the :doc:`read_restart ` command for +info on how to re-specify a fix in an input script that reads a +restart file, so that the operation of the fix continues in an uninterrupted fashion. -None of the :doc:`fix_modify ` options are relevant to this -fix. No global or per-atom quantities are stored by this fix for +None of the :doc:`fix_modify ` options are relevant to +this fix. No global or per-atom quantities are stored by this fix for access by various :doc:`output commands `. No parameter of this fix can be used with the *start/stop* keywords of the -:doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +:doc:`run ` command. This fix is not invoked during :doc:`energy +minimization `. Restrictions """""""""""" @@ -290,9 +311,10 @@ Restrictions Related commands """""""""""""""" -:doc:`read_data `, :doc:`set `, :doc:`compute property/atom ` +:doc:`read_data `, :doc:`set `, +:doc:`compute property/atom ` Default """"""" -The default keyword values are ghost = no. +The default keyword value is ghost = no. diff --git a/doc/src/fix_store_state.rst b/doc/src/fix_store_state.rst index 5f42e3ef5d..dee46e2086 100644 --- a/doc/src/fix_store_state.rst +++ b/doc/src/fix_store_state.rst @@ -23,8 +23,8 @@ Syntax q, mux, muy, muz, mu, radius, diameter, omegax, omegay, omegaz, angmomx, angmomy, angmomz, tqx, tqy, tqz, - c_ID, c_ID[N], f_ID, f_ID[N], v_name, - d_name, i_name + c_ID, c_ID[I], f_ID, f_ID[I], v_name, + d_name, i_name, i2_name[I], d2_name[I], .. parsed-literal:: @@ -46,13 +46,15 @@ Syntax omegax,omegay,omegaz = angular velocity of spherical particle angmomx,angmomy,angmomz = angular momentum of aspherical particle tqx,tqy,tqz = torque on finite-size particles - c_ID = per-atom vector calculated by a compute with ID - c_ID[I] = Ith column of per-atom array calculated by a compute with ID - f_ID = per-atom vector calculated by a fix with ID - f_ID[I] = Ith column of per-atom array calculated by a fix with ID - v_name = per-atom vector calculated by an atom-style variable with name - d_name = per-atom floating point vector name, managed by fix property/atom - i_name = per-atom integer vector name, managed by fix property/atom + *c_ID* = per-atom vector calculated by a compute with ID + *c_ID[I]* = Ith column of per-atom array calculated by a compute with ID + *f_ID* = per-atom vector calculated by a fix with ID + *f_ID[I]* = Ith column of per-atom array calculated by a fix with ID + *v_name* = per-atom vector calculated by an atom-style variable with name + *i_name* = custom integer vector with name + *d_name* = custom floating point vector with name + *i2_name[I]* = Ith column of custom integer array with name + *d2_name[I]* = Ith column of custom floating-point array with name * zero or more keyword/value pairs may be appended * keyword = *com* @@ -92,7 +94,8 @@ steps. those attributes may require quantities that are not defined in between runs. -The list of possible attributes is the same as that used by the :doc:`dump custom ` command, which describes their meaning. +The list of possible attributes is the same as that used by the +:doc:`dump custom ` command, which describes their meaning. If the *com* keyword is set to *yes* then the *xu*\ , *yu*\ , and *zu* inputs store the position of each atom relative to the center-of-mass @@ -105,10 +108,11 @@ group. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -This fix writes the per-atom values it stores to :doc:`binary restart files `, so that the values can be restored when a -simulation is restarted. See the :doc:`read_restart ` -command for info on how to re-specify a fix in an input script that -reads a restart file, so that the operation of the fix continues in an +This fix writes the per-atom values it stores to :doc:`binary restart +files `, so that the values can be restored when a simulation +is restarted. See the :doc:`read_restart ` command for +info on how to re-specify a fix in an input script that reads a +restart file, so that the operation of the fix continues in an uninterrupted fashion. None of the :doc:`fix_modify ` options are relevant to this @@ -121,7 +125,8 @@ can be accessed by various :doc:`output commands `. The per-atom values be accessed on any timestep. No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. This fix is not invoked during +:doc:`energy minimization `. Restrictions """""""""""" diff --git a/doc/src/group.rst b/doc/src/group.rst index 6371a030ee..61690c4d42 100644 --- a/doc/src/group.rst +++ b/doc/src/group.rst @@ -41,7 +41,7 @@ Syntax keyword = *region* or *var* or *every* *region* value = region-ID *var* value = name of variable - *property* value = name of per-atom property + *property* value = name of custom integer or floating point vector *every* value = N = update group every this many timesteps *static* = no args @@ -226,18 +226,33 @@ simulation runs. This is in contrast to static groups where atoms are permanently assigned to the group. The way the assignment occurs is as follows. Only atoms in the group specified as the parent group via the parent-ID are assigned to the dynamic group before the following -conditions are applied. If the *region* keyword is used, atoms not in -the specified region are removed from the dynamic group. If the *var* -keyword is used, the variable name must be an atom-style or -atomfile-style variable. The variable is evaluated and atoms whose -per-atom values are 0.0, are removed from the dynamic group. If the *property* -keyword is used, the per-atom property name must be a previously defined -per-atom property. The per-atom property is evaluated and atoms whose -values are 0.0 are removed from the dynamic group. +conditions are applied. + +If the *region* keyword is used, atoms not in the specified region are +removed from the dynamic group. + +If the *var* keyword is used, the variable name must be an atom-style +or atomfile-style variable. The variable is evaluated and atoms whose +per-atom values are 0.0, are removed from the dynamic group. + +If the *property* keyword is used, the name refers to a custom integer +or floating point per-atom vector defined via the :doc:`fix +property/atom ` command. This means the values in +the vector can be read as part of a data file with the :doc:`read_data +` command or specified with the :doc:`set ` command. +Or accessed and changed via the :doc:`library interface to LAMMPS +`, or by styles you add to LAMMPS (pair, fix, compute, +etc) which access the custom vector and modify its values. Which +means the values can be modified between or during simulations. Atoms +whose values in the custom vector are zero are removed from the +dynamic group. Note that the name of the custom per-atom vector is +specified just as *name*, not as *i_name* or *d_name* as it is for +other commands that use different kinds of custom atom vectors or +arrays as arguments. The assignment of atoms to a dynamic group is done at the beginning of -each run and on every timestep that is a multiple of *N*\ , which is the -argument for the *every* keyword (N = 1 is the default). For an +each run and on every timestep that is a multiple of *N*\ , which is +the argument for the *every* keyword (N = 1 is the default). For an energy minimization, via the :doc:`minimize ` command, an assignment is made at the beginning of the minimization, but not during the iterations of the minimizer. diff --git a/doc/src/set.rst b/doc/src/set.rst index f830149569..82b577ca9f 100644 --- a/doc/src/set.rst +++ b/doc/src/set.rst @@ -13,7 +13,17 @@ Syntax * style = *atom* or *type* or *mol* or *group* or *region* * ID = atom ID range or type range or mol ID range or group ID or region ID * one or more keyword/value pairs may be appended -* keyword = *type* or *type/fraction* or *type/ratio* or *type/subset* or *mol* or *x* or *y* or *z* or *charge* or *dipole* or *dipole/random* or *quat* or *spin* or *spin/random* or *quat* or *quat/random* or *diameter* or *shape* or *length* or *tri* or *theta* or *theta/random* or *angmom* or *omega* or *mass* or *density* or *density/disc* or *volume* or *image* or *bond* or *angle* or *dihedral* or *improper* or *sph/e* or *sph/cv* or *sph/rho* or *smd/contact/radius* or *smd/mass/density* or *dpd/theta* or *edpd/temp* or *edpd/cv* or *cc* or *i_name* or *d_name* +* keyword = *type* or *type/fraction* or *type/ratio* or *type/subset* + or *mol* or *x* or *y* or *z* or *charge* or *dipole* or + *dipole/random* or *quat* or *spin* or *spin/random* or + *quat* or *quat/random* or *diameter* or *shape* or + *length* or *tri* or *theta* or *theta/random* or *angmom* or + *omega* or *mass* or *density* or *density/disc* or + *volume* or *image* or *bond* or *angle* or *dihedral* or + *improper* or *sph/e* or *sph/cv* or *sph/rho* or + *smd/contact/radius* or *smd/mass/density* or *dpd/theta* or + *edpd/temp* or *edpd/cv* or *cc* or + *i_name* or *d_name* or *i2_name* or *d2_name* .. parsed-literal:: @@ -114,8 +124,12 @@ Syntax *cc* values = index cc index = index of a chemical species (1 to Nspecies) cc = chemical concentration of tDPD particles for a species (mole/volume units) - *i_name* value = value for custom integer vector with name - *d_name* value = value for custom floating-point vector with name + *i_name* value = custom integer vector with name + *d_name* value = custom floating-point vector with name + *i2_name* value = column of a custom integer array with name + column specified as i2_name[N] where N is 1 to Ncol + *d2_name* value = column of a custom floating-point array with name + column specified as d2_name[N] where N is 1 to Ncol Examples """""""" @@ -132,6 +146,8 @@ Examples set atom 100*200 x 0.5 y 1.0 set atom 100 vx 0.0 vy 0.0 vz -1.0 set atom 1492 type 3 + set atom * i_myVal 5 + set atom * d2_Sxyz[1] 6.4 Description """"""""""" @@ -473,11 +489,13 @@ attribute. An integer for "index" selects a chemical species (1 to Nspecies) where Nspecies is set by the atom_style command. The value for the chemical concentration must be >= 0.0. -Keywords *i_name* and *d_name* refer to custom integer and -floating-point properties that have been added to each atom via the -:doc:`fix property/atom ` command. When that command -is used specific names are given to each attribute which are what is -specified as the "name" portion of *i_name* or *d_name*. +Keywords *i_name*, *d_name*, *i2_name*, *d2_name* refer to custom +per-atom integer and floating-point vectors or arrays that have been +added via the :doc:`fix property/atom ` command. +When that command is used specific names are given to each attribute +which are the "name" portion of these keywords. For arrays *i2_name* +and *d2_name*, the column of the array must also be included following +the name in brackets: e.g. d2_xyz[2], i2_mySpin[3]. Restrictions """""""""""" diff --git a/src/Makefile b/src/Makefile index 4528c027cf..80d0a91a98 100644 --- a/src/Makefile +++ b/src/Makefile @@ -260,6 +260,7 @@ clean: clean-all: rm -rf Obj_* + rm style_*.h packages_*.h lmpgitversion.h lmpinstalledpkgs.h clean-%: @if [ $@ = "clean-serial" ]; \ diff --git a/src/atom.cpp b/src/atom.cpp index e930a0255e..4e2b82fb30 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -178,10 +178,13 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) // custom atom arrays - nivector = ndvector = 0; + nivector = ndvector = niarray = ndarray = 0; ivector = NULL; dvector = NULL; - iname = dname = NULL; + iarray = NULL; + darray = NULL; + icols = dcols = NULL; + ivname = dvname = ianame = daname = NULL; // initialize atom style and array existence flags @@ -262,20 +265,32 @@ Atom::~Atom() // delete custom atom arrays for (int i = 0; i < nivector; i++) { - delete [] iname[i]; + delete [] ivname[i]; memory->destroy(ivector[i]); } - if (dvector != NULL) { - for (int i = 0; i < ndvector; i++) { - delete [] dname[i]; - memory->destroy(dvector[i]); - } + for (int i = 0; i < ndvector; i++) { + delete [] dvname[i]; + memory->destroy(dvector[i]); + } + for (int i = 0; i < niarray; i++) { + delete [] ianame[i]; + memory->destroy(iarray[i]); + } + for (int i = 0; i < ndarray; i++) { + delete [] daname[i]; + memory->destroy(darray[i]); } - memory->sfree(iname); - memory->sfree(dname); + memory->sfree(ivname); + memory->sfree(dvname); + memory->sfree(ianame); + memory->sfree(daname); memory->sfree(ivector); memory->sfree(dvector); + memory->sfree(iarray); + memory->sfree(darray); + memory->sfree(icols); + memory->sfree(dcols); // delete user-defined molecules @@ -2282,23 +2297,41 @@ void Atom::update_callback(int ifix) /* ---------------------------------------------------------------------- find custom per-atom vector with name - return index if found, and flag = 0/1 for int/double - return -1 if not found + return index if found, -1 if not found + lists of names can have NULL entries if previously removed + return flag = 0/1 for int/double + return cols = 0/N for vector/array where N = # of columns ------------------------------------------------------------------------- */ -int Atom::find_custom(const char *name, int &flag) +int Atom::find_custom(const char *name, int &flag, int &cols) { - if(name == NULL) return -1; + if (name == NULL) return -1; for (int i = 0; i < nivector; i++) - if (iname[i] && strcmp(iname[i],name) == 0) { + if (ivname[i] && strcmp(ivname[i],name) == 0) { flag = 0; + cols = 0; return i; } for (int i = 0; i < ndvector; i++) - if (dname[i] && strcmp(dname[i],name) == 0) { + if (dvname[i] && strcmp(dvname[i],name) == 0) { flag = 1; + cols = 0; + return i; + } + + for (int i = 0; i < niarray; i++) + if (ianame[i] && strcmp(ianame[i],name) == 0) { + flag = 0; + cols = icols[i]; + return i; + } + + for (int i = 0; i < ndarray; i++) + if (daname[i] && strcmp(daname[i],name) == 0) { + flag = 1; + cols = dcols[i]; return i; } @@ -2306,60 +2339,107 @@ int Atom::find_custom(const char *name, int &flag) } /* ---------------------------------------------------------------------- - add a custom variable with name of type flag = 0/1 for int/double + add a custom variable with name + flag = 0/1 for int/double, cols = 0/N for vector/array where N = # of columns assumes name does not already exist - return index in ivector or dvector of its location + vectors of names and data ptrs are always incremented by one + return index in vector/array lists of its location ------------------------------------------------------------------------- */ -int Atom::add_custom(const char *name, int flag) +int Atom::add_custom(const char *name, int flag, int cols) { int index; - if (flag == 0) { + if (flag == 0 && cols == 0) { index = nivector; nivector++; - iname = (char **) memory->srealloc(iname,nivector*sizeof(char *), - "atom:iname"); + ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *), + "atom:ivname"); int n = strlen(name) + 1; - iname[index] = new char[n]; - strcpy(iname[index],name); + ivname[index] = new char[n]; + strcpy(ivname[index],name); ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), "atom:ivector"); memory->create(ivector[index],nmax,"atom:ivector"); - } else { + + } else if (flag == 1 && cols == 0) { index = ndvector; ndvector++; - dname = (char **) memory->srealloc(dname,ndvector*sizeof(char *), - "atom:dname"); + dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *), + "atom:dvname"); int n = strlen(name) + 1; - dname[index] = new char[n]; - strcpy(dname[index],name); + dvname[index] = new char[n]; + strcpy(dvname[index],name); dvector = (double **) memory->srealloc(dvector,ndvector*sizeof(double *), "atom:dvector"); memory->create(dvector[index],nmax,"atom:dvector"); - } + } else if (flag == 0 && cols) { + index = niarray; + niarray++; + ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *), + "atom:ianame"); + int n = strlen(name) + 1; + ianame[index] = new char[n]; + strcpy(ianame[index],name); + iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), + "atom:iarray"); + memory->create(iarray[index],nmax,cols,"atom:iarray"); + + icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); + icols[index] = cols; + + } else if (flag == 1 && cols) { + index = ndarray; + ndarray++; + daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *), + "atom:daname"); + int n = strlen(name) + 1; + daname[index] = new char[n]; + strcpy(daname[index],name); + darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **), + "atom:darray"); + memory->create(darray[index],nmax,cols,"atom:darray"); + + dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); + dcols[index] = cols; + } + return index; } /* ---------------------------------------------------------------------- - remove a custom variable of type flag = 0/1 for int/double at index - free memory for vector and name and set ptrs to NULL - ivector/dvector and iname/dname lists never shrink + remove a custom variable stored at index + flag = 0/1 for int/double, cols = 0/1 for vector/array or N for array columns + free memory for vector/array and name and set ptrs to NULL + vector/array lists and name lists never shrink ------------------------------------------------------------------------- */ -void Atom::remove_custom(int flag, int index) +void Atom::remove_custom(int index, int flag, int cols) { - if (flag == 0) { + if (flag == 0 && cols == 0) { memory->destroy(ivector[index]); ivector[index] = NULL; - delete [] iname[index]; - iname[index] = NULL; - } else { + delete [] ivname[index]; + ivname[index] = NULL; + + } else if (flag == 1 && cols == 0) { memory->destroy(dvector[index]); dvector[index] = NULL; - delete [] dname[index]; - dname[index] = NULL; + delete [] dvname[index]; + dvname[index] = NULL; + + } else if (flag == 0 && cols) { + memory->destroy(iarray[index]); + iarray[index] = NULL; + delete [] ianame[index]; + ianame[index] = NULL; + + } else if (flag == 1 && cols) { + memory->destroy(darray[index]); + darray[index] = NULL; + delete [] daname[index]; + daname[index] = NULL; } } @@ -2372,7 +2452,8 @@ void *Atom::extract(char *name) { // -------------------------------------------------------------------- // 4th customization section: customize by adding new variable name - + // if new variable is from a package, add package comment + if (strcmp(name,"mass") == 0) return (void *) mass; if (strcmp(name,"id") == 0) return (void *) tag; @@ -2415,10 +2496,30 @@ void *Atom::extract(char *name) if (strcmp(name,"cv") == 0) return (void *) cv; if (strcmp(name,"vest") == 0) return (void *) vest; - // USER-MESONT package - if (strcmp(name,"length") == 0) return (void *) length; - if (strcmp(name,"buckling") == 0) return (void *) buckling; - if (strcmp(name,"bond_nt") == 0) return (void *) bond_nt; + // custom vectors and arrays + + if (strstr(name,"i_") == name || strstr(name,"d_") == name || + strstr(name,"i2_") == name || strstr(name,"d2_") == name) { + int which = 0; + if (name[0] == 'd') which = 1; + int array = 0; + if (name[1] == '2') array = 1; + + int index,flag,cols; + if (!array) index = find_custom(&name[2],flag,cols); + else index = find_custom(&name[3],flag,cols); + + if (index < 0) return NULL; + if (which != flag) return NULL; + if ((!array && cols) || (array && !cols)) return NULL; + + if (!which && !array) return (void *) ivector[index]; + if (which && !array) return (void *) dvector[index]; + if (!which && array) return (void *) iarray[index]; + if (which && array) return (void *) darray[index]; + } + + // USER-SMD package if (strcmp(name, "contact_radius") == 0) return (void *) contact_radius; if (strcmp(name, "smd_data_9") == 0) return (void *) smd_data_9; @@ -2429,9 +2530,20 @@ void *Atom::extract(char *name) return (void *) eff_plastic_strain_rate; if (strcmp(name, "damage") == 0) return (void *) damage; + // USER-DPD package + if (strcmp(name,"dpdTheta") == 0) return (void *) dpdTheta; + + // USER-MESO package + if (strcmp(name,"edpd_temp") == 0) return (void *) edpd_temp; + // USER-MESONT package + + if (strcmp(name,"length") == 0) return (void *) length; + if (strcmp(name,"buckling") == 0) return (void *) buckling; + if (strcmp(name,"bond_nt") == 0) return (void *) bond_nt; + // end of customization section // -------------------------------------------------------------------- diff --git a/src/atom.h b/src/atom.h index 4dac15d758..a2e69e06f2 100644 --- a/src/atom.h +++ b/src/atom.h @@ -206,12 +206,13 @@ class Atom : protected Pointers { PerAtom *peratom; int nperatom,maxperatom; - // custom arrays used by fix property/atom + // custom vectors and arrays used by fix property/atom - int **ivector; - double **dvector; - char **iname,**dname; - int nivector,ndvector; + int **ivector,***iarray; + double **dvector,***darray; + int *icols,*dcols; + char **ivname,**dvname,**ianame,**daname; + int nivector,ndvector,niarray,ndarray; // molecule templates // each template can be a set of consecutive molecules @@ -321,9 +322,9 @@ class Atom : protected Pointers { void delete_callback(const char *, int); void update_callback(int); - int find_custom(const char *, int &); - virtual int add_custom(const char *, int); - virtual void remove_custom(int, int); + int find_custom(const char *, int &, int &); + virtual int add_custom(const char *, int, int); + virtual void remove_custom(int, int, int); virtual void sync_modify(ExecutionSpace, unsigned int, unsigned int) {} diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index 9c637edc1e..173665154c 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -24,6 +24,7 @@ #include "update.h" #include "domain.h" #include "comm.h" +#include "utils.h" #include "memory.h" #include "error.h" @@ -33,7 +34,7 @@ using namespace LAMMPS_NS; ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), - index(NULL), pack_choice(NULL) + index(NULL), colindex(NULL), pack_choice(NULL) { if (narg < 4) error->all(FLERR,"Illegal compute property/atom command"); @@ -47,6 +48,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : pack_choice = new FnPtrPack[nvalues]; index = new int[nvalues]; + colindex = new int[nvalues]; int i; for (int iarg = 3; iarg < narg; iarg++) { @@ -141,7 +143,10 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_mu; - } else if (strcmp(arg[iarg],"spx") == 0) { // pack magnetic variables + + // pack magnetic variables + + } else if (strcmp(arg[iarg],"spx") == 0) { if (!atom->sp_flag) error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); @@ -176,6 +181,17 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_fmz; + + // bond count + + } else if (strcmp(arg[iarg],"nbonds") == 0) { + if (!atom->molecule_flag) + error->all(FLERR,"Compute property/atom for " + "atom property that isn't allocated"); + pack_choice[i] = &ComputePropertyAtom::pack_nbonds; + + // finite-size particles + } else if (strcmp(arg[iarg],"radius") == 0) { if (!atom->radius_flag) error->all(FLERR,"Compute property/atom for " @@ -329,6 +345,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (!avec_tri) error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner2x; + } else if (strcmp(arg[iarg],"corner2y") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); if (!avec_tri) error->all(FLERR,"Compute property/atom for " @@ -355,40 +372,59 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner3z; - } else if (strcmp(arg[iarg],"nbonds") == 0) { - if (!atom->molecule_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); - pack_choice[i] = &ComputePropertyAtom::pack_nbonds; - + // custom per-atom vectors + } else if (strstr(arg[iarg],"i_") == arg[iarg]) { - int flag; - index[i] = atom->find_custom(&arg[iarg][2],flag); - if (index[i] < 0 || flag != 0) - error->all(FLERR,"Compute property/atom integer " - "vector does not exist"); + int flag,cols; + index[i] = atom->find_custom(&arg[iarg][2],flag,cols); + if (index[i] < 0 || flag || cols) + error->all(FLERR,"Compute property/atom custom vector does not exist"); pack_choice[i] = &ComputePropertyAtom::pack_iname; } else if (strstr(arg[iarg],"d_") == arg[iarg]) { - int flag; - index[i] = atom->find_custom(&arg[iarg][2],flag); - if (index[i] < 0 || flag != 1) - error->all(FLERR,"Compute property/atom floating point " - "vector does not exist"); + int flag,cols; + index[i] = atom->find_custom(&arg[iarg][2],flag,cols); + if (index[i] < 0 || !flag || cols) + error->all(FLERR,"Compute property/atom custom vector does not exist"); pack_choice[i] = &ComputePropertyAtom::pack_dname; - } - else if (strcmp(arg[iarg],"buckling") == 0) { - if (!atom->mesont_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); - pack_choice[i] = &ComputePropertyAtom::pack_buckling; - // check if atom style recognizes keyword + // custom per-atom arrays, must include bracketed index + + } else if (strstr(arg[iarg],"i2_") == arg[iarg] || + strstr(arg[iarg],"d2_") == arg[iarg]) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; + + int n = strlen(arg[iarg]); + char *suffix = new char[n]; + strcpy(suffix,&arg[iarg][3]); + + char *ptr = strchr(suffix,'['); + if (ptr) { + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Invalid attribute in set command"); + suffix[strlen(suffix)-1] = '\0'; + colindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); + *ptr = '\0'; + } else error->all(FLERR,"Compute property/atom custom array is not indexed"); + + int flag,cols; + index[i] = atom->find_custom(suffix,flag,cols); + delete [] suffix; + + if ((!which && (index[i] < 0 || flag || !cols)) || + (which && (index[i] < 0 || !flag || !cols))) + error->all(FLERR,"Compute property/atom custom array does not exist"); + + if (!which) pack_choice[i] = &ComputePropertyAtom::pack_i2name; + else pack_choice[i] = &ComputePropertyAtom::pack_d2name; + + // anything else must be recognized by atom style } else { index[i] = atom->avec->property_atom(arg[iarg]); if (index[i] < 0) error->all(FLERR,"Invalid keyword in compute property/atom command"); - pack_choice[i] = &ComputePropertyAtom::pack_property_atom; + pack_choice[i] = &ComputePropertyAtom::pack_atom_style; } } @@ -401,6 +437,7 @@ ComputePropertyAtom::~ComputePropertyAtom() { delete [] pack_choice; delete [] index; + delete [] colindex; memory->destroy(vector_atom); memory->destroy(array_atom); } @@ -413,6 +450,9 @@ void ComputePropertyAtom::init() avec_line = (AtomVecLine *) atom->style_match("line"); avec_tri = (AtomVecTri *) atom->style_match("tri"); avec_body = (AtomVecBody *) atom->style_match("body"); + + // NOTE: could reset custom vector/array indices here, like dump custom does + // in case have been deleted } /* ---------------------------------------------------------------------- */ @@ -1145,6 +1185,21 @@ void ComputePropertyAtom::pack_fmz(int n) /* ---------------------------------------------------------------------- */ +void ComputePropertyAtom::pack_nbonds(int n) +{ + int *num_bond = atom->num_bond; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = num_bond[i]; + else buf[n] = 0.0; + n += nvalues; + } +} + +/* ---------------------------------------------------------------------- */ + void ComputePropertyAtom::pack_radius(int n) { double *radius = atom->radius; @@ -1780,36 +1835,6 @@ void ComputePropertyAtom::pack_corner3z(int n) /* ---------------------------------------------------------------------- */ -void ComputePropertyAtom::pack_buckling(int n) -{ - int *buckling = atom->buckling; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = static_cast(buckling[i]); - else buf[n] = 0.0; - n += nvalues; - } -} - -/* ---------------------------------------------------------------------- */ - -void ComputePropertyAtom::pack_nbonds(int n) -{ - int *num_bond = atom->num_bond; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = num_bond[i]; - else buf[n] = 0.0; - n += nvalues; - } -} - -/* ---------------------------------------------------------------------- */ - void ComputePropertyAtom::pack_iname(int n) { int *ivector = atom->ivector[index[n]]; @@ -1840,7 +1865,39 @@ void ComputePropertyAtom::pack_dname(int n) /* ---------------------------------------------------------------------- */ -void ComputePropertyAtom::pack_property_atom(int n) +void ComputePropertyAtom::pack_i2name(int n) +{ + int **iarray = atom->iarray[index[n]]; + int icol = colindex[n] - 1; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = iarray[i][icol]; + else buf[n] = 0.0; + n += nvalues; + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputePropertyAtom::pack_d2name(int n) +{ + double **darray = atom->darray[index[n]]; + int icol = colindex[n] - 1; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = darray[i][icol]; + else buf[n] = 0.0; + n += nvalues; + } +} + +/* ---------------------------------------------------------------------- */ + +void ComputePropertyAtom::pack_atom_style(int n) { atom->avec->pack_property_atom(index[n],&buf[n],nvalues,groupbit); } diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h index cab9d3ea1b..2b087204d2 100644 --- a/src/compute_property_atom.h +++ b/src/compute_property_atom.h @@ -35,7 +35,7 @@ class ComputePropertyAtom : public Compute { private: int nvalues; int nmax; - int *index; + int *index,*colindex; double *buf; class AtomVecEllipsoid *avec_ellipsoid; class AtomVecLine *avec_line; @@ -81,10 +81,6 @@ class ComputePropertyAtom : public Compute { void pack_muy(int); void pack_muz(int); void pack_mu(int); - void pack_radius(int); - void pack_diameter(int); - - // pack magnetic variables void pack_spx(int); void pack_spy(int); @@ -94,12 +90,17 @@ class ComputePropertyAtom : public Compute { void pack_fmy(int); void pack_fmz(int); + void pack_nbonds(int); + + void pack_radius(int); + void pack_diameter(int); void pack_omegax(int); void pack_omegay(int); void pack_omegaz(int); void pack_angmomx(int); void pack_angmomy(int); void pack_angmomz(int); + void pack_shapex(int); void pack_shapey(int); void pack_shapez(int); @@ -110,12 +111,14 @@ class ComputePropertyAtom : public Compute { void pack_tqx(int); void pack_tqy(int); void pack_tqz(int); + void pack_end1x(int); void pack_end1y(int); void pack_end1z(int); void pack_end2x(int); void pack_end2y(int); void pack_end2z(int); + void pack_corner1x(int); void pack_corner1y(int); void pack_corner1z(int); @@ -125,14 +128,13 @@ class ComputePropertyAtom : public Compute { void pack_corner3x(int); void pack_corner3y(int); void pack_corner3z(int); - void pack_buckling(int); - - void pack_nbonds(int); void pack_iname(int); void pack_dname(int); + void pack_i2name(int); + void pack_d2name(int); - void pack_property_atom(int); + void pack_atom_style(int); }; } diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 3297ecb4e7..2f89991c93 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -30,6 +30,7 @@ #include "update.h" #include "variable.h" #include "fmt/format.h" +#include "utils.h" using namespace LAMMPS_NS; @@ -44,7 +45,7 @@ enum{ID,MOL,PROC,PROCP1,TYPE,ELEMENT,MASS, Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, TQX,TQY,TQZ, - COMPUTE,FIX,VARIABLE,INAME,DNAME}; + COMPUTE,FIX,VARIABLE,IVEC,DVEC,IARRAY,DARRAY}; enum{LT,LE,GT,GE,EQ,NEQ,XOR}; #define INVOKED_PERATOM 8 @@ -60,7 +61,7 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : earg(NULL), vtype(NULL), vformat(NULL), columns(NULL), choose(NULL), dchoose(NULL), clist(NULL), field2index(NULL), argindex(NULL), id_compute(NULL), compute(NULL), id_fix(NULL), fix(NULL), id_variable(NULL), variable(NULL), - vbuf(NULL), id_custom(NULL), flag_custom(NULL), typenames(NULL), + vbuf(NULL), id_custom(NULL), custom(NULL), custom_flag(NULL), typenames(NULL), pack_choice(NULL) { if (narg == 5) error->all(FLERR,"No dump custom arguments specified"); @@ -119,7 +120,8 @@ DumpCustom::DumpCustom(LAMMPS *lmp, int narg, char **arg) : ncustom = 0; id_custom = NULL; - flag_custom = NULL; + custom = NULL; + custom_flag = NULL; // process attributes // ioptional = start of additional optional args in expanded args @@ -236,7 +238,8 @@ DumpCustom::~DumpCustom() for (int i = 0; i < ncustom; i++) delete [] id_custom[i]; memory->sfree(id_custom); - delete [] flag_custom; + delete [] custom; + delete [] custom_flag; memory->destroy(choose); memory->destroy(dchoose); @@ -324,7 +327,7 @@ void DumpCustom::init_style() else if (buffer_flag == 1) write_choice = &DumpCustom::write_string; else write_choice = &DumpCustom::write_lines; - // find current ptr for each compute,fix,variable + // find current ptr for each compute,fix,variable and custom atom property // check that fix frequency is acceptable int icompute; @@ -353,9 +356,15 @@ void DumpCustom::init_style() int icustom; for (int i = 0; i < ncustom; i++) { - icustom = atom->find_custom(id_custom[i],flag_custom[i]); + int flag,cols; + icustom = atom->find_custom(id_custom[i],flag,cols); if (icustom < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + error->all(FLERR,"Could not find dump custom atom property name"); + custom[i] = icustom; + if (!flag && !cols) custom_flag[i] = IVEC; + else if (flag && !cols) custom_flag[i] = DVEC; + else if (!flag && cols) custom_flag[i] = IARRAY; + else if (flag && cols) custom_flag[i] = DARRAY; } // set index and check validity of region @@ -1036,23 +1045,37 @@ int DumpCustom::count() ptr = vbuf[field2index[i]]; nstride = 1; - } else if (thresh_array[ithresh] == DNAME) { - int iwhich,tmp; + } else if (thresh_array[ithresh] == IVEC) { i = nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],tmp); - ptr = atom->dvector[iwhich]; - nstride = 1; - - } else if (thresh_array[ithresh] == INAME) { - int iwhich,tmp; - i = nfield + ithresh; - iwhich = atom->find_custom(id_custom[field2index[i]],tmp); - + int iwhich = custom[field2index[i]]; int *ivector = atom->ivector[iwhich]; for (i = 0; i < nlocal; i++) dchoose[i] = ivector[i]; ptr = dchoose; nstride = 1; + + } else if (thresh_array[ithresh] == DVEC) { + i = nfield + ithresh; + int iwhich = custom[field2index[i]]; + ptr = atom->dvector[iwhich]; + nstride = 1; + + } else if (thresh_array[ithresh] == IARRAY) { + i = nfield + ithresh; + int iwhich = custom[field2index[i]]; + int **iarray = atom->iarray[iwhich]; + int icol = argindex[i] - 1; + for (i = 0; i < nlocal; i++) + dchoose[i] = iarray[i][icol]; + ptr = dchoose; + nstride = 1; + + } else if (thresh_array[ithresh] == DARRAY) { + i = nfield + ithresh; + int iwhich = custom[field2index[i]]; + double **darray = atom->darray[iwhich]; + ptr = &darray[0][argindex[i]-1]; + nstride = atom->dcols[iwhich]; } // unselect atoms that don't meet threshold criterion @@ -1257,7 +1280,7 @@ int DumpCustom::parse_fields(int narg, char **arg) int i; for (int iarg = 0; iarg < narg; iarg++) { i = iarg; - + if (strcmp(arg[iarg],"id") == 0) { pack_choice[i] = &DumpCustom::pack_id; if (sizeof(tagint) == sizeof(smallint)) vtype[i] = Dump::INT; @@ -1455,7 +1478,8 @@ int DumpCustom::parse_fields(int narg, char **arg) if (ptr) { if (suffix[strlen(suffix)-1] != ']') error->all(FLERR,"Invalid attribute in dump custom command"); - argindex[i] = atoi(ptr+1); + suffix[strlen(suffix)-1] = '\0'; + argindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else argindex[i] = 0; @@ -1491,7 +1515,8 @@ int DumpCustom::parse_fields(int narg, char **arg) if (ptr) { if (suffix[strlen(suffix)-1] != ']') error->all(FLERR,"Invalid attribute in dump custom command"); - argindex[i] = atoi(ptr+1); + suffix[strlen(suffix)-1] = '\0'; + argindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else argindex[i] = 0; @@ -1530,48 +1555,66 @@ int DumpCustom::parse_fields(int narg, char **arg) field2index[i] = add_variable(suffix); delete [] suffix; - // custom per-atom floating point value = d_ID + // custom per-atom vector = i_ID or d_ID - } else if (strncmp(arg[iarg],"d_",2) == 0) { + } else if (strncmp(arg[iarg],"i_",2) == 0 || + strncmp(arg[iarg],"d_",2) == 0) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; + pack_choice[i] = &DumpCustom::pack_custom; - vtype[i] = Dump::DOUBLE; + if (!which) vtype[i] = Dump::INT; + else vtype[i] = Dump::DOUBLE; int n = strlen(arg[iarg]); char *suffix = new char[n]; strcpy(suffix,&arg[iarg][2]); argindex[i] = 0; - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + if ((!which && (n < 0 || flag || cols)) || + (which && (n < 0 || !flag || cols))) + error->all(FLERR,"Dump custom per-atom custom vector does not exist"); - if (tmp != 1) - error->all(FLERR,"Custom per-atom property ID is not floating point"); - - field2index[i] = add_custom(suffix,1); + field2index[i] = add_custom(suffix); delete [] suffix; - // custom per-atom integer value = i_ID + // custom per-atom array = i2_ID or d2_ID, must include bracketed index + + } else if (strncmp(arg[iarg],"i2_",3) == 0 || + strncmp(arg[iarg],"d2_",3) == 0) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; - } else if (strncmp(arg[iarg],"i_",2) == 0) { pack_choice[i] = &DumpCustom::pack_custom; - vtype[i] = Dump::INT; + if (!which) vtype[i] = Dump::INT; + else vtype[i] = Dump::DOUBLE; int n = strlen(arg[iarg]); char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][2]); - argindex[i] = 0; + strcpy(suffix,&arg[iarg][3]); - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + char *ptr = strchr(suffix,'['); + if (ptr) { + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Invalid attribute in dump custom command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); + *ptr = '\0'; + } else error->all(FLERR,"Dump custom per-atom custom array is not indexed"); - if (tmp != 0) - error->all(FLERR,"Custom per-atom property ID is not integer"); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + + if ((!which && (n < 0 || flag || !cols)) || + (which && (n < 0 || !flag || !cols))) + error->all(FLERR,"Dump custom per-atom custom array does not exist"); + if (argindex[i] <= 0 || argindex[i] > cols) + error->all(FLERR, + "Dump custom per-atom custom array is accessed out-of-range"); - field2index[i] = add_custom(suffix,0); + field2index[i] = add_custom(suffix); delete [] suffix; } else return iarg; @@ -1645,7 +1688,7 @@ int DumpCustom::add_variable(char *id) id_variable = (char **) memory->srealloc(id_variable,(nvariable+1)*sizeof(char *), - "dump:id_variable"); + "dsrealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); - flag_custom = (int *) - memory->srealloc(flag_custom,(ncustom+1)*sizeof(int),"dump:flag_custom"); + + delete [] custom; + custom = new int[ncustom+1]; + delete [] custom_flag; + custom_flag = new int[ncustom+1]; int n = strlen(id) + 1; id_custom[ncustom] = new char[n]; strcpy(id_custom[ncustom],id); - flag_custom[ncustom] = flag; ncustom++; return ncustom-1; @@ -1777,7 +1821,7 @@ int DumpCustom::modify_param(int narg, char **arg) if (narg < 2) error->all(FLERR,"Illegal dump_modify command"); if (strncmp(arg[1],"c_",2) != 0) error->all(FLERR,"Illegal dump_modify command"); - if (refreshflag) error->all(FLERR,"Dump modify can only have one refresh"); + if (refreshflag) error->all(FLERR,"Dump_modify can only have one refresh"); refreshflag = 1; int n = strlen(arg[1]); @@ -1914,28 +1958,29 @@ int DumpCustom::modify_param(int narg, char **arg) char *ptr = strchr(suffix,'['); if (ptr) { if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump modify command"); - argindex[nfield+nthresh] = atoi(ptr+1); + error->all(FLERR,"Invalid attribute in dump_modify command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[nfield+nthresh] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else argindex[nfield+nthresh] = 0; n = modify->find_compute(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify compute ID"); + if (n < 0) error->all(FLERR,"Could not find dump_modify compute ID"); if (modify->compute[n]->peratom_flag == 0) error->all(FLERR, - "Dump modify compute ID does not compute per-atom info"); + "Dump_modify compute ID does not compute per-atom info"); if (argindex[nfield+nthresh] == 0 && modify->compute[n]->size_peratom_cols > 0) error->all(FLERR, - "Dump modify compute ID does not compute per-atom vector"); + "Dump_modify compute ID does not compute per-atom vector"); if (argindex[nfield+nthresh] > 0 && modify->compute[n]->size_peratom_cols == 0) error->all(FLERR, - "Dump modify compute ID does not compute per-atom array"); + "Dump_modify compute ID does not compute per-atom array"); if (argindex[nfield+nthresh] > 0 && argindex[nfield+nthresh] > modify->compute[n]->size_peratom_cols) - error->all(FLERR,"Dump modify compute ID vector is not large enough"); + error->all(FLERR,"Dump_modify compute ID vector is not large enough"); field2index[nfield+nthresh] = add_compute(suffix); delete [] suffix; @@ -1955,25 +2000,26 @@ int DumpCustom::modify_param(int narg, char **arg) char *ptr = strchr(suffix,'['); if (ptr) { if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump modify command"); - argindex[nfield+nthresh] = atoi(ptr+1); + error->all(FLERR,"Invalid attribute in dump_modify command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[nfield+nthresh] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else argindex[nfield+nthresh] = 0; n = modify->find_fix(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify fix ID"); + if (n < 0) error->all(FLERR,"Could not find dump_modify fix ID"); if (modify->fix[n]->peratom_flag == 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom info"); + error->all(FLERR,"Dump_modify fix ID does not compute per-atom info"); if (argindex[nfield+nthresh] == 0 && modify->fix[n]->size_peratom_cols > 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom vector"); + error->all(FLERR,"Dump_modify fix ID does not compute per-atom vector"); if (argindex[nfield+nthresh] > 0 && modify->fix[n]->size_peratom_cols == 0) - error->all(FLERR,"Dump modify fix ID does not compute per-atom array"); + error->all(FLERR,"Dump_modify fix ID does not compute per-atom array"); if (argindex[nfield+nthresh] > 0 && argindex[nfield+nthresh] > modify->fix[n]->size_peratom_cols) - error->all(FLERR,"Dump modify fix ID vector is not large enough"); + error->all(FLERR,"Dump_modify fix ID vector is not large enough"); field2index[nfield+nthresh] = add_fix(suffix); delete [] suffix; @@ -1992,18 +2038,23 @@ int DumpCustom::modify_param(int narg, char **arg) argindex[nfield+nthresh] = 0; n = input->variable->find(suffix); - if (n < 0) error->all(FLERR,"Could not find dump modify variable name"); + if (n < 0) error->all(FLERR,"Could not find dump_modify variable name"); if (input->variable->atomstyle(n) == 0) - error->all(FLERR,"Dump modify variable is not atom-style variable"); + error->all(FLERR,"Dump_modify variable is not atom-style variable"); field2index[nfield+nthresh] = add_variable(suffix); delete [] suffix; - // custom per atom floating point value = d_ID + // custom per-atom vector = i_ID or d_ID // must grow field2index and argindex arrays, since access is beyond nfield - } else if (strncmp(arg[1],"d_",2) == 0) { - thresh_array[nthresh] = DNAME; + } else if (strncmp(arg[1],"i_",2) == 0 || + strncmp(arg[1],"d_",2) == 0) { + int which = 0; + if (arg[1][0] == 'd') which = 1; + + if (!which) thresh_array[nthresh] = IVEC; + else thresh_array[nthresh] = DVEC; memory->grow(field2index,nfield+nthresh+1,"dump:field2index"); memory->grow(argindex,nfield+nthresh+1,"dump:argindex"); int n = strlen(arg[1]); @@ -2011,34 +2062,51 @@ int DumpCustom::modify_param(int narg, char **arg) strcpy(suffix,&arg[1][2]); argindex[nfield+nthresh] = 0; - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if ((n < 0) || (tmp != 1)) - error->all(FLERR,"Could not find dump modify " - "custom atom floating point property ID"); - - field2index[nfield+nthresh] = add_custom(suffix,1); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + if ((!which && (n < 0 || flag || cols)) || + (which && (n < 0 || !flag || cols))) + error->all(FLERR,"Could not find dump_modify per-atom custom vector"); + field2index[nfield+nthresh] = add_custom(suffix); delete [] suffix; - // custom per atom integer value = i_ID + // custom per-atom array = i2_ID or d2_ID, must include bracketed index // must grow field2index and argindex arrays, since access is beyond nfield - } else if (strncmp(arg[1],"i_",2) == 0) { - thresh_array[nthresh] = INAME; + } else if (strncmp(arg[1],"i2_",3) == 0 || + strncmp(arg[1],"d2_",3) == 0) { + int which = 0; + if (arg[1][0] == 'd') which = 1; + + if (!which) thresh_array[nthresh] = IARRAY; + else thresh_array[nthresh] = DARRAY; memory->grow(field2index,nfield+nthresh+1,"dump:field2index"); memory->grow(argindex,nfield+nthresh+1,"dump:argindex"); + int n = strlen(arg[1]); char *suffix = new char[n]; - strcpy(suffix,&arg[1][2]); - argindex[nfield+nthresh] = 0; + strcpy(suffix,&arg[1][3]); - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if ((n < 0) || (tmp != 0)) - error->all(FLERR,"Could not find dump modify " - "custom atom integer property ID"); + char *ptr = strchr(suffix,'['); + if (ptr) { + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Invalid attribute in dump custom command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[nfield+nthresh] = utils::inumeric(FLERR,ptr+1,true,lmp); + *ptr = '\0'; + } else error->all(FLERR,"Dump_modify per-atom custom array is not indexed"); - field2index[nfield+nthresh] = add_custom(suffix,0); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + + if ((!which && (n < 0 || flag || !cols)) || + (which && (n < 0 || !flag || !cols))) + error->all(FLERR,"Could not find dump_modify per-atom custom array"); + if (argindex[nfield+nthresh] <= 0 || argindex[nfield+nthresh] > cols) + error->all(FLERR, + "Dump_modify per-atom custom array is accessed out-of-range"); + + field2index[nfield+nthresh] = add_custom(suffix); delete [] suffix; } else error->all(FLERR,"Invalid dump_modify thresh attribute"); @@ -2165,27 +2233,36 @@ void DumpCustom::pack_variable(int n) void DumpCustom::pack_custom(int n) { - - int index = field2index[n]; - - if (flag_custom[index] == 0) { // integer - int iwhich,tmp; - iwhich = atom->find_custom(id_custom[index],tmp); - + int flag = custom_flag[field2index[n]]; + int iwhich = custom[field2index[n]]; + int index = argindex[n]; + + if (flag == IVEC) { int *ivector = atom->ivector[iwhich]; for (int i = 0; i < nchoose; i++) { buf[n] = ivector[clist[i]]; n += size_one; } - } else if (flag_custom[index] == 1) { // double - int iwhich,tmp; - iwhich = atom->find_custom(id_custom[index],tmp); - + } else if (flag == DVEC) { double *dvector = atom->dvector[iwhich]; for (int i = 0; i < nchoose; i++) { buf[n] = dvector[clist[i]]; n += size_one; } + } else if (flag == IARRAY) { + index--; + int **iarray = atom->iarray[iwhich]; + for (int i = 0; i < nchoose; i++) { + buf[n] = iarray[clist[i]][index]; + n += size_one; + } + } else if (flag == DARRAY) { + index--; + double **darray = atom->darray[iwhich]; + for (int i = 0; i < nchoose; i++) { + buf[n] = darray[clist[i]][index]; + n += size_one; + } } } diff --git a/src/dump_custom.h b/src/dump_custom.h index 0f63eac8de..d800acf525 100644 --- a/src/dump_custom.h +++ b/src/dump_custom.h @@ -70,29 +70,30 @@ class DumpCustom : public Dump { int nfield; // # of keywords listed by user int ioptional; // index of start of optional args - int *field2index; // which compute,fix,variable calcs this field - int *argindex; // index into compute,fix scalar_atom,vector_atom - // 0 for scalar_atom, 1-N for vector_atom values + int *field2index; // which compute,fix,variable,custom calcs this field + int *argindex; // index into compute,fix,custom per-atom data + // 0 for per-atom vector, 1-N for cols of per-atom array - int ncompute; // # of Compute objects used by dump + int ncompute; // # of Computes accessed by dump char **id_compute; // their IDs - class Compute **compute; // list of ptrs to the Compute objects + class Compute **compute; // list of ptrs to the Computes - int nfix; // # of Fix objects used by dump + int nfix; // # of Fixes used by dump char **id_fix; // their IDs - class Fix **fix; // list of ptrs to the Fix objects + class Fix **fix; // list of ptrs to the Fixes int nvariable; // # of Variables used by dump char **id_variable; // their names - int *variable; // list of indices for the Variables + int *variable; // list of Variable indices in Variable class double **vbuf; // local storage for variable evaluation - int ncustom; // # of custom atom properties + int ncustom; // # of Custom atom properties used by dump char **id_custom; // their names - int *flag_custom; // their data type + int *custom; // list of Custom indices in Atom class + int *custom_flag; // list of IVEC,DVEC,IARRAY,DARRAY styles int ntypes; // # of atom types - char **typenames; // array of element names for each type + char **typenames; // array of element names for each type // private methods @@ -108,7 +109,7 @@ class DumpCustom : public Dump { int add_compute(char *); int add_fix(char *); int add_variable(char *); - int add_custom(char *, int); + int add_custom(char *); virtual int modify_param(int, char **); void header_format_binary(); diff --git a/src/fix_group.cpp b/src/fix_group.cpp index d2eea9f781..17f1d3c60b 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -64,6 +64,7 @@ idregion(NULL), idvar(NULL), idprop(NULL) idregion = new char[n]; strcpy(idregion,arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"var") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); if (input->variable->find(arg[iarg+1]) < 0) @@ -74,16 +75,21 @@ idregion(NULL), idvar(NULL), idprop(NULL) idvar = new char[n]; strcpy(idvar,arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"property") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); - if (atom->find_custom(arg[iarg+1],typeflag) < 0) - error->all(FLERR,"Per atom property for group dynamic does not exist"); + if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); + int flag,cols; + iprop = atom->find_custom(arg[iarg+1],flag,cols); + if (iprop < 1 || cols) + error->all(FLERR,"Custom per-atom vector for group dynamic " + "does not exist"); propflag = 1; delete [] idprop; int n = strlen(arg[iarg+1]) + 1; idprop = new char[n]; strcpy(idprop,arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"every") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); nevery = force->inumeric(FLERR,arg[iarg+1]); @@ -125,7 +131,7 @@ void FixGroup::init() if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; - // set current indices for region and variable + // set current indices for region and variable and custom property if (regionflag) { iregion = domain->find_region(idregion); @@ -143,9 +149,10 @@ void FixGroup::init() } if (propflag) { - iprop = atom->find_custom(idprop,typeflag); - if (iprop < 0) - error->all(FLERR,"Per-atom property for group dynamic does not exist"); + int cols; + iprop = atom->find_custom(idprop,proptype,cols); + if (iprop < 0 || cols) + error->all(FLERR,"Group dynamic command custom property vector does not exist"); } // warn if any FixGroup is not at tail end of all post_integrate fixes @@ -222,11 +229,10 @@ void FixGroup::set_group() update->post_integrate = 0; } - // invoke per-atom property if defined + // set ptr to custom atom vector - if (propflag && !typeflag) ivector = atom->ivector[iprop]; //check nlocal > 0? - - if (propflag && typeflag) dvector = atom->dvector[iprop]; //check nlocal > 0? + if (propflag && !proptype) ivector = atom->ivector[iprop]; + if (propflag && proptype) dvector = atom->dvector[iprop]; // update region in case it has a variable dependence or is dynamic @@ -246,8 +252,10 @@ void FixGroup::set_group() inflag = 1; if (regionflag && !region->match(x[i][0],x[i][1],x[i][2])) inflag = 0; if (varflag && var[i] == 0.0) inflag = 0; - if (propflag && !typeflag && ivector[i] == 0) inflag = 0; - if (propflag && typeflag && dvector[i] == 0) inflag = 0; + if (propflag) { + if (!proptype && ivector[i] == 0) inflag = 0; + if (proptype && dvector[i] == 0.0) inflag = 0; + } } else inflag = 0; if (inflag) mask[i] |= gbit; diff --git a/src/fix_group.h b/src/fix_group.h index f3fecac316..56e4ade06d 100644 --- a/src/fix_group.h +++ b/src/fix_group.h @@ -37,7 +37,7 @@ class FixGroup : public Fix { private: int gbit,gbitinverse; - int regionflag,varflag,propflag,typeflag; + int regionflag,varflag,propflag,proptype; int iregion,ivar,iprop; char *idregion,*idvar,*idprop; class Region *region; diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 374d0069fd..2b004a0ba8 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -24,7 +24,7 @@ using namespace LAMMPS_NS; using namespace FixConst; -enum{MOLECULE,CHARGE,RMASS,INTEGER,DOUBLE}; +enum{MOLECULE,CHARGE,RMASS,IVEC,DVEC,IARRAY,DARRAY}; /* ---------------------------------------------------------------------- */ @@ -40,6 +40,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : int iarg = 3; nvalue = narg-iarg; style = new int[nvalue]; + cols = new int[nvalue]; index = new int[nvalue]; molecule_flag = 0; @@ -47,6 +48,8 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : rmass_flag = 0; nvalue = 0; + values_peratom = 0; + while (iarg < narg) { if (strcmp(arg[iarg],"mol") == 0) { if (atom->molecule_flag) @@ -55,8 +58,11 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (molecule_flag) error->all(FLERR,"Fix property/atom cannot specify mol twice"); style[nvalue] = MOLECULE; + cols[nvalue] = 0; atom->molecule_flag = molecule_flag = 1; + values_peratom++; nvalue++; + iarg++; } else if (strcmp(arg[iarg],"q") == 0) { if (atom->q_flag) error->all(FLERR,"Fix property/atom q when atom_style " @@ -64,8 +70,11 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (q_flag) error->all(FLERR,"Fix property/atom cannot specify q twice"); style[nvalue] = CHARGE; + cols[nvalue] = 0; atom->q_flag = q_flag = 1; + values_peratom++; nvalue++; + iarg++; } else if (strcmp(arg[iarg],"rmass") == 0) { if (atom->rmass_flag) error->all(FLERR,"Fix property/atom rmass when atom_style " @@ -73,27 +82,45 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (rmass_flag) error->all(FLERR,"Fix property/atom cannot specify rmass twice"); style[nvalue] = RMASS; + cols[nvalue] = 0; atom->rmass_flag = rmass_flag = 1; + values_peratom++; nvalue++; - } else if (strstr(arg[iarg],"i_") == arg[iarg]) { - style[nvalue] = INTEGER; - int tmp; - index[nvalue] = atom->find_custom(&arg[iarg][2],tmp); + iarg++; + } else if (strstr(arg[iarg],"i_") == arg[iarg] || + strstr(arg[iarg],"d_") == arg[iarg]) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; + if (which == 0) style[nvalue] = IVEC; + else style[nvalue] = DVEC; + int tmp1,tmp2; + index[nvalue] = atom->find_custom(&arg[iarg][2],tmp1,tmp2); if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom vector name already exists"); - index[nvalue] = atom->add_custom(&arg[iarg][2],0); + cols[nvalue] = 0; + index[nvalue] = atom->add_custom(&arg[iarg][2],which,cols[nvalue]); + values_peratom++; nvalue++; - } else if (strstr(arg[iarg],"d_") == arg[iarg]) { - style[nvalue] = DOUBLE; - int tmp; - index[nvalue] = atom->find_custom(&arg[iarg][2],tmp); + iarg++; + } else if (strstr(arg[iarg],"i2_") == arg[iarg] || + strstr(arg[iarg],"d2_") == arg[iarg]) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix property/atom command"); + int which = 0; + if (arg[iarg][0] == 'd') which = 1; + if (which == 0) style[nvalue] = IARRAY; + else style[nvalue] = DARRAY; + int tmp1,tmp2; + index[nvalue] = atom->find_custom(&arg[iarg][3],tmp1,tmp2); if (index[nvalue] >= 0) - error->all(FLERR,"Fix property/atom vector name already exists"); - index[nvalue] = atom->add_custom(&arg[iarg][2],1); + error->all(FLERR,"Fix property/atom array name already exists"); + cols[nvalue] = utils::inumeric(FLERR,arg[iarg+1],true,lmp); + if (cols[nvalue] < 1) + error->all(FLERR,"Invalid array columns in fix property/atom"); + index[nvalue] = atom->add_custom(&arg[iarg][3],which,cols[nvalue]); + values_peratom += cols[nvalue]; nvalue++; + iarg += 2; } else break; - - iarg++; } // optional args @@ -109,7 +136,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : } else error->all(FLERR,"Illegal fix property/atom command"); } - if (border) comm_border = nvalue; + if (border) comm_border = values_peratom; // warn if mol or charge keyword used without ghost yes @@ -134,8 +161,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : // register with Atom class nmax_old = 0; - if (!lmp->kokkos) - grow_arrays(atom->nmax); + if (!lmp->kokkos) grow_arrays(atom->nmax); atom->add_callback(0); atom->add_callback(1); if (border) atom->add_callback(2); @@ -154,27 +180,32 @@ FixPropertyAtom::~FixPropertyAtom() // deallocate per-atom vectors in Atom class // set ptrs to NULL, so they no longer exist for Atom class - for (int m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) { + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) { atom->molecule_flag = 0; memory->destroy(atom->molecule); atom->molecule = NULL; - } else if (style[m] == CHARGE) { + } else if (style[nv] == CHARGE) { atom->q_flag = 0; memory->destroy(atom->q); atom->q = NULL; - } else if (style[m] == RMASS) { + } else if (style[nv] == RMASS) { atom->rmass_flag = 0; memory->destroy(atom->rmass); atom->rmass = NULL; - } else if (style[m] == INTEGER) { - atom->remove_custom(0,index[m]); - } else if (style[m] == DOUBLE) { - atom->remove_custom(1,index[m]); + } else if (style[nv] == IVEC) { + atom->remove_custom(index[nv],0,cols[nv]); + } else if (style[nv] == DVEC) { + atom->remove_custom(index[nv],1,cols[nv]); + } else if (style[nv] == IARRAY) { + atom->remove_custom(index[nv],0,cols[nv]); + } else if (style[nv] == DARRAY) { + atom->remove_custom(index[nv],1,cols[nv]); } } delete [] style; + delete [] cols; delete [] index; delete [] astyle; } @@ -206,7 +237,7 @@ void FixPropertyAtom::init() void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, tagint id_offset) { - int j,m; + int j,k,m,iword,ncol,nv; tagint itag; char *next; @@ -222,7 +253,7 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, int nwords = utils::trim_and_count_words(buf); *next = '\n'; - if (nwords != nvalue+1) + if (nwords != values_peratom+1) error->all(FLERR,fmt::format("Incorrect {} format in data file",keyword)); char **values = new char*[nwords]; @@ -254,16 +285,27 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, "data file",itag, keyword)); // assign words in line to per-atom vectors - + // iword = position in vector of words + if ((m = atom->map(itag)) >= 0) { - for (j = 0; j < nvalue; j++) { - if (style[j] == MOLECULE) atom->molecule[m] = ATOTAGINT(values[j+1]); - else if (style[j] == CHARGE) atom->q[m] = atof(values[j+1]); - else if (style[j] == RMASS) atom->rmass[m] = atof(values[j+1]); - else if (style[j] == INTEGER) - atom->ivector[index[j]][m] = atoi(values[j+1]); - else if (style[j] == DOUBLE) - atom->dvector[index[j]][m] = atof(values[j+1]); + iword = 1; + for (nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) atom->molecule[m] = ATOTAGINT(values[iword++]); + else if (style[nv] == CHARGE) atom->q[m] = atof(values[iword++]); + else if (style[nv] == RMASS) atom->rmass[m] = atof(values[iword++]); + else if (style[nv] == IVEC) + atom->ivector[index[nv]][m] = atoi(values[iword++]); + else if (style[nv] == DVEC) + atom->dvector[index[nv]][m] = atof(values[iword++]); + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->iarray[index[nv]][m][k] = atoi(values[iword++]); + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->darray[index[nv]][m][k] = atof(values[iword++]); + } } } @@ -291,13 +333,13 @@ bigint FixPropertyAtom::read_data_skip_lines(char * /*keyword*/) return size I own for Mth data section # of data sections = 1 for this fix nx = # of local atoms - ny = columns = tag + nvalues + ny = columns = tag + values_peratom ------------------------------------------------------------------------- */ void FixPropertyAtom::write_data_section_size(int /*mth*/, int &nx, int &ny) { nx = atom->nlocal; - ny = nvalue + 1; + ny = values_peratom + 1; } /* ---------------------------------------------------------------------- @@ -307,7 +349,7 @@ void FixPropertyAtom::write_data_section_size(int /*mth*/, int &nx, int &ny) void FixPropertyAtom::write_data_section_pack(int /*mth*/, double **buf) { - int i; + int i,k,ncol; // 1st column = atom tag // rest of columns = per-atom values @@ -317,23 +359,42 @@ void FixPropertyAtom::write_data_section_pack(int /*mth*/, double **buf) for (i = 0; i < nlocal; i++) buf[i][0] = ubuf(tag[i]).d; - for (int m = 0; m < nvalue; m++) { - int mp1 = m+1; - if (style[m] == MOLECULE) { + int icol = 1; + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) { tagint *molecule = atom->molecule; - for (i = 0; i < nlocal; i++) buf[i][mp1] = ubuf(molecule[i]).d; - } else if (style[m] == CHARGE) { + for (i = 0; i < nlocal; i++) buf[i][icol] = ubuf(molecule[i]).d; + icol++; + } else if (style[nv] == CHARGE) { double *q = atom->q; - for (i = 0; i < nlocal; i++) buf[i][mp1] = q[i]; - } else if (style[m] == RMASS) { + for (i = 0; i < nlocal; i++) buf[i][icol] = q[i]; + icol++; + } else if (style[nv] == RMASS) { double *rmass = atom->rmass; - for (i = 0; i < nlocal; i++) buf[i][mp1] = rmass[i]; - } else if (style[m] == INTEGER) { - int *ivec = atom->ivector[index[m]]; - for (i = 0; i < nlocal; i++) buf[i][mp1] = ubuf(ivec[i]).d; - } else if (style[m] == DOUBLE) { - double *dvec = atom->dvector[index[m]]; - for (i = 0; i < nlocal; i++) buf[i][mp1] = dvec[i]; + for (i = 0; i < nlocal; i++) buf[i][icol] = rmass[i]; + icol++; + } else if (style[nv] == IVEC) { + int *ivec = atom->ivector[index[nv]]; + for (i = 0; i < nlocal; i++) buf[i][icol] = ubuf(ivec[i]).d; + icol++; + } else if (style[nv] == DVEC) { + double *dvec = atom->dvector[index[nv]]; + for (i = 0; i < nlocal; i++) buf[i][icol] = dvec[i]; + icol++; + } else if (style[nv] == IARRAY) { + int **iarray = atom->iarray[index[nv]]; + ncol = cols[nv]; + for (i = 0; i < nlocal; i++) + for (k = 0; k < ncol; k++) + buf[i][icol+k] = ubuf(iarray[i][k]).d; + icol += ncol; + } else if (style[nv] == DARRAY) { + double **darray = atom->darray[index[nv]]; + ncol = cols[nv]; + for (i = 0; i < nlocal; i++) + for (k = 0; k < ncol; k++) + buf[i][icol+k] = ubuf(darray[i][k]).d; + icol += ncol; } } } @@ -361,16 +422,33 @@ void FixPropertyAtom::write_data_section_keyword(int /*mth*/, FILE *fp) void FixPropertyAtom::write_data_section(int /*mth*/, FILE *fp, int n, double **buf, int /*index*/) { - int m; + int k,icol,ncol,nv; for (int i = 0; i < n; i++) { fprintf(fp,TAGINT_FORMAT,(tagint) ubuf(buf[i][0]).i); - for (m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) - fprintf(fp," " TAGINT_FORMAT,(tagint) ubuf(buf[i][m+1]).i); - else if (style[m] == INTEGER) - fprintf(fp," %d",(int) ubuf(buf[i][m+1]).i); - else fprintf(fp," %g",buf[i][m+1]); + icol = 1; + for (nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) + fprintf(fp," " TAGINT_FORMAT,(tagint) ubuf(buf[i][icol++]).i); + else if (style[nv] == CHARGE) + fprintf(fp," %g",buf[i][icol++]); + else if (style[nv] == RMASS) + fprintf(fp," %g",buf[i][icol++]); + else if (style[nv] == IVEC) + fprintf(fp," %d",(int) ubuf(buf[i][icol++]).i); + else if (style[nv] == DVEC) + fprintf(fp," %g",buf[i][icol++]); + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + fprintf(fp," %d",(int) ubuf(buf[i][icol+k]).i); + icol += ncol; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + fprintf(fp," %g",buf[i][icol+k]); + icol += ncol; + } } fprintf(fp,"\n"); } @@ -387,42 +465,52 @@ double FixPropertyAtom::memory_usage() if (style[m] == MOLECULE) bytes = atom->nmax * sizeof(tagint); else if (style[m] == CHARGE) bytes = atom->nmax * sizeof(double); else if (style[m] == RMASS) bytes = atom->nmax * sizeof(double); - else if (style[m] == INTEGER) bytes = atom->nmax * sizeof(int); - else if (style[m] == DOUBLE) bytes = atom->nmax * sizeof(double); + else if (style[m] == IVEC) bytes = atom->nmax * sizeof(int); + else if (style[m] == DVEC) bytes = atom->nmax * sizeof(double); + else if (style[m] == IARRAY) bytes = atom->nmax * cols[m] * sizeof(int); + else if (style[m] == DARRAY) bytes = atom->nmax * cols[m] * sizeof(double); } return bytes; } /* ---------------------------------------------------------------------- allocate atom-based arrays - initialize new values to 0, - since AtomVec class won't do it as atoms are added, - e.g. in create_atom() or data_atom() + also initialize new values to 0 + since AtomVec class won't do it as atoms are added, + e.g. in create_atom() or data_atom() ------------------------------------------------------------------------- */ void FixPropertyAtom::grow_arrays(int nmax) { - for (int m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) { + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) { memory->grow(atom->molecule,nmax,"atom:molecule"); size_t nbytes = (nmax-nmax_old) * sizeof(tagint); memset(&atom->molecule[nmax_old],0,nbytes); - } else if (style[m] == CHARGE) { + } else if (style[nv] == CHARGE) { memory->grow(atom->q,nmax,"atom:q"); size_t nbytes = (nmax-nmax_old) * sizeof(double); memset(&atom->q[nmax_old],0,nbytes); - } else if (style[m] == RMASS) { + } else if (style[nv] == RMASS) { memory->grow(atom->rmass,nmax,"atom:rmass"); size_t nbytes = (nmax-nmax_old) * sizeof(double); memset(&atom->rmass[nmax_old],0,nbytes); - } else if (style[m] == INTEGER) { - memory->grow(atom->ivector[index[m]],nmax,"atom:ivector"); + } else if (style[nv] == IVEC) { + memory->grow(atom->ivector[index[nv]],nmax,"atom:ivector"); size_t nbytes = (nmax-nmax_old) * sizeof(int); - memset(&atom->ivector[index[m]][nmax_old],0,nbytes); - } else if (style[m] == DOUBLE) { - memory->grow(atom->dvector[index[m]],nmax,"atom:dvector"); + memset(&atom->ivector[index[nv]][nmax_old],0,nbytes); + } else if (style[nv] == DVEC) { + memory->grow(atom->dvector[index[nv]],nmax,"atom:dvector"); size_t nbytes = (nmax-nmax_old) * sizeof(double); - memset(&atom->dvector[index[m]][nmax_old],0,nbytes); + memset(&atom->dvector[index[nv]][nmax_old],0,nbytes); + } else if (style[nv] == IARRAY) { + memory->grow(atom->iarray[index[nv]],nmax,cols[nv],"atom:iarray"); + size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(int); + if (nbytes) memset(&atom->iarray[index[nv]][nmax_old][0],0,nbytes); + } else if (style[nv] == DARRAY) { + memory->grow(atom->darray[index[nv]],nmax,cols[nv],"atom:darray"); + size_t nbytes = (nmax-nmax_old) * cols[nv] * sizeof(double); + if (nbytes) memset(&atom->darray[index[nv]][nmax_old][0],0,nbytes); } } @@ -435,17 +523,28 @@ void FixPropertyAtom::grow_arrays(int nmax) void FixPropertyAtom::copy_arrays(int i, int j, int /*delflag*/) { - for (int m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) + int k,ncol; + + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) atom->molecule[j] = atom->molecule[i]; - else if (style[m] == CHARGE) + else if (style[nv] == CHARGE) atom->q[j] = atom->q[i]; - else if (style[m] == RMASS) + else if (style[nv] == RMASS) atom->rmass[j] = atom->rmass[i]; - else if (style[m] == INTEGER) - atom->ivector[index[m]][j] = atom->ivector[index[m]][i]; - else if (style[m] == DOUBLE) - atom->dvector[index[m]][j] = atom->dvector[index[m]][i]; + else if (style[nv] == IVEC) + atom->ivector[index[nv]][j] = atom->ivector[index[nv]][i]; + else if (style[nv] == DVEC) + atom->dvector[index[nv]][j] = atom->dvector[index[nv]][i]; + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->iarray[index[nv]][j][k] = atom->iarray[index[nv]][i][k]; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->darray[index[nv]][j][k] = atom->darray[index[nv]][i][k]; + } } } @@ -455,40 +554,56 @@ void FixPropertyAtom::copy_arrays(int i, int j, int /*delflag*/) int FixPropertyAtom::pack_border(int n, int *list, double *buf) { - int i,j,k; + int i,j,k,ncol; int m = 0; - for (k = 0; k < nvalue; k++) { - if (style[k] == MOLECULE) { + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) { tagint *molecule = atom->molecule; for (i = 0; i < n; i++) { j = list[i]; buf[m++] = ubuf(molecule[j]).d; } - } else if (style[k] == CHARGE) { + } else if (style[nv] == CHARGE) { double *q = atom->q; for (i = 0; i < n; i++) { j = list[i]; buf[m++] = q[j]; } - } else if (style[k] == RMASS) { + } else if (style[nv] == RMASS) { double *rmass = atom->rmass; for (i = 0; i < n; i++) { j = list[i]; buf[m++] = rmass[j]; } - } else if (style[k] == INTEGER) { - int *ivector = atom->ivector[index[k]]; + } else if (style[nv] == IVEC) { + int *ivector = atom->ivector[index[nv]]; for (i = 0; i < n; i++) { j = list[i]; buf[m++] = ubuf(ivector[j]).d; } - } else if (style[k] == DOUBLE) { - double *dvector = atom->dvector[index[k]]; + } else if (style[nv] == DVEC) { + double *dvector = atom->dvector[index[nv]]; for (i = 0; i < n; i++) { j = list[i]; buf[m++] = dvector[j]; } + } else if (style[nv] == IARRAY) { + int **iarray = atom->iarray[index[nv]]; + ncol = cols[nv]; + for (i = 0; i < n; i++) { + j = list[i]; + for (k = 0; k < ncol; k++) + buf[m++] = ubuf(iarray[j][k]).d; + } + } else if (style[nv] == DARRAY) { + double **darray = atom->darray[index[nv]]; + ncol = cols[nv]; + for (i = 0; i < n; i++) { + j = list[i]; + for (k = 0; k < ncol; k++) + buf[m++] = darray[j][k]; + } } } @@ -501,35 +616,49 @@ int FixPropertyAtom::pack_border(int n, int *list, double *buf) int FixPropertyAtom::unpack_border(int n, int first, double *buf) { - int i,k,last; + int i,k,last,ncol; int m = 0; - for (k = 0; k < nvalue; k++) { - if (style[k] == MOLECULE) { + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) { tagint *molecule = atom->molecule; last = first + n; for (i = first; i < last; i++) molecule[i] = (tagint) ubuf(buf[m++]).i; - } else if (style[k] == CHARGE) { + } else if (style[nv] == CHARGE) { double *q = atom->q; last = first + n; for (i = first; i < last; i++) q[i] = buf[m++]; - } else if (style[k] == RMASS) { + } else if (style[nv] == RMASS) { double *rmass = atom->rmass; last = first + n; for (i = first; i < last; i++) rmass[i] = buf[m++]; - } else if (style[k] == INTEGER) { - int *ivector = atom->ivector[index[k]]; + } else if (style[nv] == IVEC) { + int *ivector = atom->ivector[index[nv]]; last = first + n; for (i = first; i < last; i++) ivector[i] = (int) ubuf(buf[m++]).i; - } else if (style[k] == DOUBLE) { - double *dvector = atom->dvector[index[k]]; + } else if (style[nv] == DVEC) { + double *dvector = atom->dvector[index[nv]]; last = first + n; for (i = first; i < last; i++) dvector[i] = buf[m++]; + } else if (style[nv] == IARRAY) { + int **iarray = atom->iarray[index[nv]]; + ncol = cols[nv]; + last = first + n; + for (i = first; i < last; i++) + for (k = 0; k < ncol; k++) + iarray[i][k] = (int) ubuf(buf[m++]).i; + } else if (style[nv] == DARRAY) { + double **darray = atom->darray[index[nv]]; + ncol = cols[nv]; + last = first + n; + for (i = first; i < last; i++) + for (k = 0; k < ncol; k++) + darray[i][k] = buf[m++]; } } @@ -542,14 +671,27 @@ int FixPropertyAtom::unpack_border(int n, int first, double *buf) int FixPropertyAtom::pack_exchange(int i, double *buf) { - for (int m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) buf[m] = ubuf(atom->molecule[i]).d; - else if (style[m] == CHARGE) buf[m] = atom->q[i]; - else if (style[m] == RMASS) buf[m] = atom->rmass[i]; - else if (style[m] == INTEGER) buf[m] = ubuf(atom->ivector[index[m]][i]).d; - else if (style[m] == DOUBLE) buf[m] = atom->dvector[index[m]][i]; + int k,ncol; + + int m = 0; + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d; + else if (style[nv] == CHARGE) buf[m++] = atom->q[i]; + else if (style[nv] == RMASS) buf[m++] = atom->rmass[i]; + else if (style[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d; + else if (style[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i]; + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + buf[m++] = atom->darray[index[nv]][i][k]; + } } - return nvalue; + + return m; } /* ---------------------------------------------------------------------- @@ -558,19 +700,32 @@ int FixPropertyAtom::pack_exchange(int i, double *buf) int FixPropertyAtom::unpack_exchange(int nlocal, double *buf) { - for (int m = 0; m < nvalue; m++) { - if (style[m] == MOLECULE) - atom->molecule[nlocal] = (tagint) ubuf(buf[m]).i; - else if (style[m] == CHARGE) - atom->q[nlocal] = buf[m]; - else if (style[m] == RMASS) - atom->rmass[nlocal] = buf[m]; - else if (style[m] == INTEGER) - atom->ivector[index[m]][nlocal] = (int) ubuf(buf[m]).i; - else if (style[m] == DOUBLE) - atom->dvector[index[m]][nlocal] = buf[m]; + int k,ncol; + + int m = 0; + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) + atom->molecule[nlocal] = (tagint) ubuf(buf[m++]).i; + else if (style[nv] == CHARGE) + atom->q[nlocal] = buf[m++]; + else if (style[nv] == RMASS) + atom->rmass[nlocal] = buf[m++]; + else if (style[nv] == IVEC) + atom->ivector[index[nv]][nlocal] = (int) ubuf(buf[m++]).i; + else if (style[nv] == DVEC) + atom->dvector[index[nv]][nlocal] = buf[m++]; + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->iarray[index[nv]][nlocal][k] = (int) ubuf(buf[m++]).i; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->darray[index[nv]][nlocal][k] = buf[m++]; + } } - return nvalue; + + return m; } /* ---------------------------------------------------------------------- @@ -579,19 +734,31 @@ int FixPropertyAtom::unpack_exchange(int nlocal, double *buf) int FixPropertyAtom::pack_restart(int i, double *buf) { + int k,ncol; + // pack buf[0] this way because other fixes unpack it - buf[0] = nvalue+1; + + buf[0] = values_peratom+1; int m = 1; - for (int j = 0; j < nvalue; j++) { - if (style[j] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d; - else if (style[j] == CHARGE) buf[m++] = atom->q[i]; - else if (style[j] == RMASS) buf[m++] = atom->rmass[i]; - else if (style[j] == INTEGER) buf[m++] = ubuf(atom->ivector[index[j]][i]).d; - else if (style[j] == DOUBLE) buf[m++] = atom->dvector[index[j]][i]; + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) buf[m++] = ubuf(atom->molecule[i]).d; + else if (style[nv] == CHARGE) buf[m++] = atom->q[i]; + else if (style[nv] == RMASS) buf[m++] = atom->rmass[i]; + else if (style[nv] == IVEC) buf[m++] = ubuf(atom->ivector[index[nv]][i]).d; + else if (style[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i]; + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + buf[m++] = atom->darray[index[nv]][i][k]; + } } - return nvalue+1; + return values_peratom+1; } /* ---------------------------------------------------------------------- @@ -600,6 +767,7 @@ int FixPropertyAtom::pack_restart(int i, double *buf) void FixPropertyAtom::unpack_restart(int nlocal, int nth) { + int k,ncol; double **extra = atom->extra; // skip to Nth set of extra values @@ -609,17 +777,26 @@ void FixPropertyAtom::unpack_restart(int nlocal, int nth) for (int i = 0; i < nth; i++) m += static_cast (extra[nlocal][m]); m++; - for (int i = 0; i < nvalue; i++) { - if (style[i] == MOLECULE) + for (int nv = 0; nv < nvalue; nv++) { + if (style[nv] == MOLECULE) atom->molecule[nlocal] = (tagint) ubuf(extra[nlocal][m++]).i; - else if (style[i] == CHARGE) + else if (style[nv] == CHARGE) atom->q[nlocal] = extra[nlocal][m++]; - else if (style[i] == RMASS) + else if (style[nv] == RMASS) atom->rmass[nlocal] = extra[nlocal][m++]; - else if (style[i] == INTEGER) - atom->ivector[index[i]][nlocal] = (int) ubuf(extra[nlocal][m++]).i; - else if (style[i] == DOUBLE) - atom->dvector[index[i]][nlocal] = extra[nlocal][m++]; + else if (style[nv] == IVEC) + atom->ivector[index[nv]][nlocal] = (int) ubuf(extra[nlocal][m++]).i; + else if (style[nv] == DVEC) + atom->dvector[index[nv]][nlocal] = extra[nlocal][m++]; + else if (style[nv] == IARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->iarray[index[nv]][nlocal][k] = (int) ubuf(extra[nlocal][m++]).i; + } else if (style[nv] == DARRAY) { + ncol = cols[nv]; + for (k = 0; k < ncol; k++) + atom->darray[index[nv]][nlocal][k] = extra[nlocal][m++]; + } } } @@ -629,7 +806,7 @@ void FixPropertyAtom::unpack_restart(int nlocal, int nth) int FixPropertyAtom::maxsize_restart() { - return nvalue+1; + return values_peratom+1; } /* ---------------------------------------------------------------------- @@ -638,5 +815,5 @@ int FixPropertyAtom::maxsize_restart() int FixPropertyAtom::size_restart(int /*nlocal*/) { - return nvalue+1; + return values_peratom+1; } diff --git a/src/fix_property_atom.h b/src/fix_property_atom.h index 9e0236f61e..3e491ea861 100644 --- a/src/fix_property_atom.h +++ b/src/fix_property_atom.h @@ -52,10 +52,13 @@ class FixPropertyAtom : public Fix { protected: int nvalue,border; - int molecule_flag,q_flag,rmass_flag; - int *style,*index; - char *astyle; + int molecule_flag,q_flag,rmass_flag; // flags for specific fields + int *style; // style of each value, see enum + int *index; // indices into atom custom data structs + int *cols; // columns per value, for arrays + char *astyle; // atom style at instantiation + int values_peratom; // # of values per atom, including multiple for arrays int nmax_old; // length of peratom arrays the last time they grew }; diff --git a/src/fix_store_state.cpp b/src/fix_store_state.cpp index e1e2aab663..cdda399fff 100644 --- a/src/fix_store_state.cpp +++ b/src/fix_store_state.cpp @@ -20,17 +20,18 @@ #include "group.h" #include "modify.h" #include "compute.h" +#include "force.h" #include "fix.h" #include "input.h" #include "variable.h" +#include "utils.h" #include "memory.h" #include "error.h" -#include "force.h" using namespace LAMMPS_NS; using namespace FixConst; -enum{KEYWORD,COMPUTE,FIX,VARIABLE,DNAME,INAME}; +enum{KEYWORD,COMPUTE,FIX,VARIABLE,IVEC,DVEC,IARRAY,DARRAY}; #define INVOKED_PERATOM 8 @@ -224,15 +225,11 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : pack_choice[nvalues++] = &FixStoreState::pack_tqz; } else if (strncmp(arg[iarg],"c_",2) == 0 || - strncmp(arg[iarg],"d_",2) == 0 || strncmp(arg[iarg],"f_",2) == 0 || - strncmp(arg[iarg],"i_",2) == 0 || strncmp(arg[iarg],"v_",2) == 0) { cfv_any = 1; if (arg[iarg][0] == 'c') which[nvalues] = COMPUTE; - else if (arg[iarg][0] == 'd') which[nvalues] = DNAME; else if (arg[iarg][0] == 'f') which[nvalues] = FIX; - else if (arg[iarg][0] == 'i') which[nvalues] = INAME; else if (arg[iarg][0] == 'v') which[nvalues] = VARIABLE; int n = strlen(arg[iarg]); @@ -241,11 +238,50 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : char *ptr = strchr(suffix,'['); if (ptr) { + if (which[nvalues] == VARIABLE) + error->all(FLERR,"Illegal fix store/state command"); if (suffix[strlen(suffix)-1] != ']') error->all(FLERR,"Illegal fix store/state command"); - argindex[nvalues] = atoi(ptr+1); + suffix[strlen(suffix)-1] = '\0'; + argindex[nvalues] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else argindex[nvalues] = 0; + + n = strlen(suffix) + 1; + ids[nvalues] = new char[n]; + strcpy(ids[nvalues],suffix); + nvalues++; + delete [] suffix; + + } else if (strncmp(arg[iarg],"i_",2) == 0 || + strncmp(arg[iarg],"d_",2) == 0 || + strncmp(arg[iarg],"i2_",3) == 0 || + strncmp(arg[iarg],"d2_",3) == 0) { + if (strncmp(arg[iarg],"i_",2) == 0) which[nvalues] = IVEC; + else if (strncmp(arg[iarg],"d_",2) == 0) which[nvalues] = DVEC; + else if (strncmp(arg[iarg],"i2_",3) == 0) which[nvalues] = IARRAY; + else if (strncmp(arg[iarg],"d2_",3) == 0) which[nvalues] = DARRAY; + + int n = strlen(arg[iarg]); + char *suffix = new char[n]; + if (which[nvalues] == IVEC || which[nvalues] == DVEC) + strcpy(suffix,&arg[iarg][2]); + else strcpy(suffix,&arg[iarg][3]); + + char *ptr = strchr(suffix,'['); + if (ptr) { + if (which[nvalues] == IVEC || which[nvalues] == DVEC) + error->all(FLERR,"Illegal fix store/state command"); + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Illegal fix store/state command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[nvalues] = utils::inumeric(FLERR,ptr+1,true,lmp); + *ptr = '\0'; + } else { + if (which[nvalues] == IARRAY || which[nvalues] == DARRAY) + error->all(FLERR,"Illegal fix store/state command"); + argindex[nvalues] = 0; + } n = strlen(suffix) + 1; ids[nvalues] = new char[n]; @@ -274,68 +310,79 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : // error check - for (int i = 0; i < nvalues; i++) { - if (which[i] == COMPUTE) { - int icompute = modify->find_compute(ids[i]); + for (int m = 0; m < nvalues; m++) { + if (which[m] == COMPUTE) { + int icompute = modify->find_compute(ids[m]); if (icompute < 0) error->all(FLERR,"Compute ID for fix store/state does not exist"); if (modify->compute[icompute]->peratom_flag == 0) error->all(FLERR,"Fix store/state compute " "does not calculate per-atom values"); - if (argindex[i] == 0 && + if (argindex[m] == 0 && modify->compute[icompute]->size_peratom_cols != 0) error->all(FLERR,"Fix store/state compute does not " "calculate a per-atom vector"); - if (argindex[i] && modify->compute[icompute]->size_peratom_cols == 0) + if (argindex[m] && modify->compute[icompute]->size_peratom_cols == 0) error->all(FLERR, "Fix store/state compute does not " "calculate a per-atom array"); - if (argindex[i] && - argindex[i] > modify->compute[icompute]->size_peratom_cols) + if (argindex[m] && + argindex[m] > modify->compute[icompute]->size_peratom_cols) error->all(FLERR, "Fix store/state compute array is accessed out-of-range"); - - } else if (which[i] == INAME) { - int icustom,iflag; - icustom = atom->find_custom(ids[i],iflag); - if ((icustom < 0) || (iflag != 0)) - error->all(FLERR, - "Custom integer vector for fix store/state does not exist"); - - } else if (which[i] == DNAME) { - int icustom,iflag; - icustom = atom->find_custom(ids[i],iflag); - if ((icustom < 0) || (iflag != 1)) - error->all(FLERR, - "Custom floating point vector for fix store/state does not exist"); - - } else if (which[i] == FIX) { - int ifix = modify->find_fix(ids[i]); + + } else if (which[m] == FIX) { + int ifix = modify->find_fix(ids[m]); if (ifix < 0) error->all(FLERR, "Fix ID for fix store/state does not exist"); if (modify->fix[ifix]->peratom_flag == 0) error->all(FLERR, "Fix store/state fix does not calculate per-atom values"); - if (argindex[i] == 0 && modify->fix[ifix]->size_peratom_cols != 0) + if (argindex[m] == 0 && modify->fix[ifix]->size_peratom_cols != 0) error->all(FLERR, "Fix store/state fix does not calculate a per-atom vector"); - if (argindex[i] && modify->fix[ifix]->size_peratom_cols == 0) + if (argindex[m] && modify->fix[ifix]->size_peratom_cols == 0) error->all(FLERR, "Fix store/state fix does not calculate a per-atom array"); - if (argindex[i] && argindex[i] > modify->fix[ifix]->size_peratom_cols) + if (argindex[m] && argindex[m] > modify->fix[ifix]->size_peratom_cols) error->all(FLERR, "Fix store/state fix array is accessed out-of-range"); if (nevery % modify->fix[ifix]->peratom_freq) error->all(FLERR, "Fix for fix store/state not computed at compatible time"); - } else if (which[i] == VARIABLE) { - int ivariable = input->variable->find(ids[i]); + } else if (which[m] == VARIABLE) { + int ivariable = input->variable->find(ids[m]); if (ivariable < 0) error->all(FLERR,"Variable name for fix store/state does not exist"); if (input->variable->atomstyle(ivariable) == 0) error->all(FLERR,"Fix store/state variable is not atom-style variable"); + + } else if (which[m] == IVEC) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if ((icustom < 0) || flag || cols) + error->all(FLERR, + "Custom integer vector for fix store/state does not exist"); + } else if (which[m] == DVEC) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if ((icustom < 0) || !flag || cols) + error->all(FLERR, + "Custom floating point vector for fix store/state does not exist"); + } else if (which[m] == IARRAY) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if ((icustom < 0) || flag || !cols) + error->all(FLERR, + "Custom integer array for fix store/state does not exist"); + } else if (which[m] == DARRAY) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if ((icustom < 0) || !flag || !cols) + error->all(FLERR, + "Custom floating point array for fix store/state does not exist"); } } @@ -413,22 +460,6 @@ void FixStoreState::init() error->all(FLERR,"Compute ID for fix store/state does not exist"); value2index[m] = icompute; - } else if (which[m] == INAME) { - int icustom,iflag; - icustom = atom->find_custom(ids[m],iflag); - if ((icustom < 0) || (iflag != 0)) - error->all(FLERR, - "Custom integer vector for fix store/state does not exist"); - value2index[m] = icustom; - - } else if (which[m] == DNAME) { - int icustom,iflag; - icustom = atom->find_custom(ids[m],iflag); - if ((icustom < 0) || (iflag != 1)) - error->all(FLERR, - "Custom floating point vector for fix store/state does not exist"); - value2index[m] = icustom; - } else if (which[m] == FIX) { int ifix = modify->find_fix(ids[m]); if (ifix < 0) @@ -440,6 +471,35 @@ void FixStoreState::init() if (ivariable < 0) error->all(FLERR,"Variable name for fix store/state does not exist"); value2index[m] = ivariable; + + } else if (which[m] == IVEC) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if (icustom < 0 || flag || cols) + error->all(FLERR, + "Custom integer vector for fix store/state does not exist"); + value2index[m] = icustom; + } else if (which[m] == DVEC) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if (icustom < 0 || !flag || cols) + error->all(FLERR, + "Custom floating point vector for fix store/state does not exist"); + value2index[m] = icustom; + } else if (which[m] == IARRAY) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if (icustom < 0 || flag || !cols) + error->all(FLERR, + "Custom integer array for fix store/state does not exist"); + value2index[m] = icustom; + } else if (which[m] == DARRAY) { + int icustom,flag,cols; + icustom = atom->find_custom(ids[m],flag,cols); + if (icustom < 0 || !flag || !cols) + error->all(FLERR, + "Custom floating point array for fix store/state does not exist"); + value2index[m] = icustom; } } } @@ -525,22 +585,33 @@ void FixStoreState::end_of_step() if (mask[i] & groupbit) values[i][m] = fix_array[i][jm1]; } - // access custom atom property fields - - } else if (which[m] == INAME) { - int *ivector = atom->ivector[n]; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = ivector[i]; - - } else if (which[m] == DNAME) { - double *dvector = atom->dvector[n]; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = dvector[i]; - // evaluate atom-style variable } else if (which[m] == VARIABLE) { input->variable->compute_atom(n,igroup,&values[0][m],nvalues,0); + + // access custom atom property fields + + } else if (which[m] == IVEC) { + int *ivector = atom->ivector[n]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = ivector[i]; + } else if (which[m] == DVEC) { + double *dvector = atom->dvector[n]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = dvector[i]; + } else if (which[m] == IARRAY) { + int **iarray = atom->iarray[n]; + int jm1 = j - 1; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + values[i][m] = iarray[i][jm1]; + } else if (which[m] == DARRAY) { + double **darray = atom->darray[n]; + int jm1 = j - 1; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + values[i][m] = darray[i][jm1]; } } } diff --git a/src/imbalance_store.cpp b/src/imbalance_store.cpp index 919d1f3f61..f42e8df031 100644 --- a/src/imbalance_store.cpp +++ b/src/imbalance_store.cpp @@ -47,18 +47,17 @@ int ImbalanceStore::options(int narg, char **arg) void ImbalanceStore::compute(double *weight) { - int dflag = 0; - int idx = atom->find_custom(name,dflag); + int flag,cols; + int index = atom->find_custom(name,flag,cols); // property does not exist - if (idx < 0 || dflag != 1) return; + if (index < 0 || flag != 1 || cols) + error->all(FLERR,"Balance weight store vector does not exist"); - double *prop = atom->dvector[idx]; + double *prop = atom->dvector[index]; const int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; ++i) - prop[i] = weight[i]; + for (int i = 0; i < nlocal; ++i) prop[i] = weight[i]; } /* -------------------------------------------------------------------- */ diff --git a/src/input.cpp b/src/input.cpp index dd640f18b0..1069cbf944 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -600,8 +600,9 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag) } /* ---------------------------------------------------------------------- - expand arg to earg, for arguments with syntax c_ID[*] or f_ID[*] + expand arg to earg, for args with syntax c_ID[*], f_ID[*], i2_ID[*], d2_ID[*] fields to consider in input arg range from iarg to narg + mode = 0 for args = vectors, mode = 1 for args = arrays return new expanded # of values, and copy them w/out "*" into earg if any expansion occurs, earg is new allocation, must be freed by caller if no expansion occurs, earg just points to arg, caller need not free @@ -609,7 +610,7 @@ void Input::substitute(char *&str, char *&str2, int &max, int &max2, int flag) int Input::expand_args(int narg, char **arg, int mode, char **&earg) { - int n,iarg,index,nlo,nhi,nmax,expandflag,icompute,ifix; + int n,iarg,index,nlo,nhi,nmax,expandflag; char *ptr1,*ptr2,*str; ptr1 = NULL; @@ -633,7 +634,9 @@ int Input::expand_args(int narg, char **arg, int mode, char **&earg) expandflag = 0; if (strncmp(arg[iarg],"c_",2) == 0 || - strncmp(arg[iarg],"f_",2) == 0) { + strncmp(arg[iarg],"f_",2) == 0 || + strncmp(arg[iarg],"i2_",3) == 0 || + strncmp(arg[iarg],"d2_",3) == 0) { ptr1 = strchr(&arg[iarg][2],'['); if (ptr1) { @@ -641,9 +644,10 @@ int Input::expand_args(int narg, char **arg, int mode, char **&earg) if (ptr2) { *ptr2 = '\0'; if (strchr(ptr1,'*')) { + if (arg[iarg][0] == 'c') { *ptr1 = '\0'; - icompute = modify->find_compute(&arg[iarg][2]); + int icompute = modify->find_compute(&arg[iarg][2]); *ptr1 = '['; // check for global vector/array, peratom array, local array @@ -665,9 +669,10 @@ int Input::expand_args(int narg, char **arg, int mode, char **&earg) expandflag = 1; } } + } else if (arg[iarg][0] == 'f') { *ptr1 = '\0'; - ifix = modify->find_fix(&arg[iarg][2]); + int ifix = modify->find_fix(&arg[iarg][2]); *ptr1 = '['; // check for global vector/array, peratom array, local array @@ -689,10 +694,40 @@ int Input::expand_args(int narg, char **arg, int mode, char **&earg) expandflag = 1; } } - } - } - *ptr2 = ']'; - } + + } else if (arg[iarg][0] == 'i') { + *ptr1 = '\0'; + int flag,cols; + int icustom = atom->find_custom(&arg[iarg][3],flag,cols); + *ptr1 = '['; + + // check for custom per-atom integer array + + if (icustom >= 0) { + if (mode == 1 && !flag && cols) { + nmax = cols; + expandflag = 1; + } + } + + } else if (arg[iarg][0] == 'd') { + *ptr1 = '\0'; + int flag,cols; + int icustom = atom->find_custom(&arg[iarg][3],flag,cols); + *ptr1 = '['; + + // check for custom per-atom floating point array + + if (icustom >= 0) { + if (mode == 1 && flag && cols) { + nmax = cols; + expandflag = 1; + } + } + } + } + *ptr2 = ']'; + } } } diff --git a/src/set.cpp b/src/set.cpp index 01176f68c0..d7a8337f81 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -45,12 +45,12 @@ using namespace MathConst; enum{ATOM_SELECT,MOL_SELECT,TYPE_SELECT,GROUP_SELECT,REGION_SELECT}; enum{TYPE,TYPE_FRACTION,TYPE_RATIO,TYPE_SUBSET, - MOLECULE,X,Y,Z,CHARGE,MASS,SHAPE,LENGTH,TRI, + MOLECULE,X,Y,Z,VX,VY,VZ,CHARGE,MASS,SHAPE,LENGTH,TRI, DIPOLE,DIPOLE_RANDOM,SPIN,SPIN_RANDOM,QUAT,QUAT_RANDOM, THETA,THETA_RANDOM,ANGMOM,OMEGA, DIAMETER,DENSITY,VOLUME,IMAGE,BOND,ANGLE,DIHEDRAL,IMPROPER, SPH_E,SPH_CV,SPH_RHO,EDPD_TEMP,EDPD_CV,CC,SMD_MASS_DENSITY, - SMD_CONTACT_RADIUS,DPDTHETA,INAME,DNAME,VX,VY,VZ}; + SMD_CONTACT_RADIUS,DPDTHETA,IVEC,DVEC,IARRAY,DARRAY}; #define BIG INT_MAX @@ -573,28 +573,63 @@ void Set::command(int narg, char **arg) set(DPDTHETA); iarg += 2; - } else if (strstr(arg[iarg],"i_") == arg[iarg]) { - if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); - if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); - else ivalue = force->inumeric(FLERR,arg[iarg+1]); - int flag; - index_custom = atom->find_custom(&arg[iarg][2],flag); - if (index_custom < 0 || flag != 0) - error->all(FLERR,"Set command integer vector does not exist"); - set(INAME); - iarg += 2; - - } else if (strstr(arg[iarg],"d_") == arg[iarg]) { + // custom per-atom vector + + } else if (strstr(arg[iarg],"i_") == arg[iarg] || + strstr(arg[iarg],"d_") == arg[iarg]) { if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + int which = 0; + if (arg[iarg][0] == 'd') which = 1; if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else if (!which) ivalue = force->inumeric(FLERR,arg[iarg+1]); else dvalue = force->numeric(FLERR,arg[iarg+1]); - int flag; - index_custom = atom->find_custom(&arg[iarg][2],flag); - if (index_custom < 0 || flag != 1) - error->all(FLERR,"Set command floating point vector does not exist"); - set(DNAME); + + int flag,cols; + index_custom = atom->find_custom(&arg[iarg][2],flag,cols); + if ((!which && (index_custom < 0 || flag || cols)) || + (which && (index_custom < 0 || !flag || cols))) + error->all(FLERR,"Set command per-atom custom vector does not exist"); + if (!which) set(IVEC); + else set(DVEC); iarg += 2; + // custom per-atom array, must include bracketed index + + } else if (strstr(arg[iarg],"i2_") == arg[iarg] || + strstr(arg[iarg],"d2_") == arg[iarg]) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + int which = 0; + if (arg[iarg][0] == 'd') which = 1; + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else if (!which) ivalue = force->inumeric(FLERR,arg[iarg+1]); + else dvalue = force->numeric(FLERR,arg[iarg+1]); + + int n = strlen(arg[iarg]); + char *suffix = new char[n]; + strcpy(suffix,&arg[iarg][3]); + + char *ptr = strchr(suffix,'['); + if (ptr) { + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Invalid attribute in set command"); + icol_custom = atoi(ptr+1); + *ptr = '\0'; + } else error->all(FLERR,"Set command per-atom custom array is not indexed"); + + int flag,cols; + index_custom = atom->find_custom(suffix,flag,cols); + delete [] suffix; + + if ((!which && (index_custom < 0 || flag || !cols)) || + (which && (index_custom < 0 || !flag || !cols))) + error->all(FLERR,"Set command per-atom custom array does not exist"); + if (icol_custom <= 0 || icol_custom > cols) + error->all(FLERR,"Set command per-atom custom array is accessed out-of-range"); + + if (!which) set(IARRAY); + else set(DARRAY); + iarg += 2; + } else error->all(FLERR,"Illegal set command"); // statistics @@ -970,20 +1005,29 @@ void Set::set(int keyword) (((imageint) (zbox + IMGMAX) & IMGMASK) << IMG2BITS); } - // set value for custom integer or double vector + // set value for custom vector or array - else if (keyword == INAME) { + else if (keyword == IVEC) { atom->ivector[index_custom][i] = ivalue; } - else if (keyword == DNAME) { + else if (keyword == DVEC) { atom->dvector[index_custom][i] = dvalue; } + else if (keyword == IARRAY) { + atom->iarray[index_custom][i][icol_custom-1] = ivalue; + } + + else if (keyword == DARRAY) { + atom->darray[index_custom][i][icol_custom-1] = dvalue; + } + count++; } // update bonus data numbers + if (keyword == SHAPE) { bigint nlocal_bonus = avec_ellipsoid->nlocal_bonus; MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1, diff --git a/src/set.h b/src/set.h index 6788849677..bbbe08bc47 100644 --- a/src/set.h +++ b/src/set.h @@ -32,7 +32,7 @@ class Set : protected Pointers { private: char *id; int *select; - int style,ivalue,newtype,count,index_custom; + int style,ivalue,newtype,count,index_custom,icol_custom; int ximage,yimage,zimage,ximageflag,yimageflag,zimageflag; int cc_index; bigint nsubset; From 76725731fdea07180a6a1e2f7d79df26ff02047a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 8 Sep 2020 13:48:41 -0600 Subject: [PATCH 002/352] changes in package files to match new find_custom() syntax --- doc/src/fix_rigid.rst | 21 +++---- src/RIGID/fix_rigid.cpp | 12 ++-- src/RIGID/fix_rigid_small.cpp | 13 ++-- src/USER-REACTION/fix_bond_react.cpp | 36 +++++------ src/USER-VTK/dump_vtk.cpp | 90 ++++++++++++++++++---------- 5 files changed, 95 insertions(+), 77 deletions(-) diff --git a/doc/src/fix_rigid.rst b/doc/src/fix_rigid.rst index a143817303..3811cc2be1 100644 --- a/doc/src/fix_rigid.rst +++ b/doc/src/fix_rigid.rst @@ -64,7 +64,7 @@ Syntax *single* args = none *molecule* args = none *custom* args = *i_propname* or *v_varname* - i_propname = an integer property defined via fix property/atom + i_propname = a custom integer vector defined via fix property/atom v_varname = an atom-style or atomfile-style variable *group* args = N groupID1 groupID2 ... N = # of groups @@ -287,15 +287,16 @@ includes atoms you want to be part of rigid bodies. Bodystyle *custom* is similar to bodystyle *molecule* except that it is more flexible in using other per-atom properties to define the sets -of atoms that form rigid bodies. An integer vector defined by the -:doc:`fix property/atom ` command can be used. Or an -:doc:`atom-style or atomfile-style variable ` can be used; the -floating-point value produced by the variable is rounded to an -integer. As with bodystyle *molecule*\ , each set of atoms in the fix -groups with the same integer value is treated as a different rigid -body. Since fix property/atom vectors and atom-style variables -produce values for all atoms, you should be careful to use a fix group -that only includes atoms you want to be part of rigid bodies. +of atoms that form rigid bodies. A custom per-atom integer vector +defined by the :doc:`fix property/atom ` command +can be used. Or an :doc:`atom-style or atomfile-style variable +` can be used; the floating-point value produced by the +variable is rounded to an integer. As with bodystyle *molecule*\ , +each set of atoms in the fix groups with the same integer value is +treated as a different rigid body. Since fix property/atom custom +vectors and atom-style variables produce values for all atoms, you +should be careful to use a fix group that only includes atoms you want +to be part of rigid bodies. .. note:: diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 0d15f22090..5e6f48e2cb 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -129,14 +129,10 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) : // determine whether atom-style variable or atom property is used if (strstr(arg[4],"i_") == arg[4]) { - int is_double=0; - int custom_index = atom->find_custom(arg[4]+2,is_double); - if (custom_index == -1) - error->all(FLERR,"Fix rigid custom requires " - "previously defined property/atom"); - else if (is_double) - error->all(FLERR,"Fix rigid custom requires " - "integer-valued property/atom"); + int flag,cols; + int custom_index = atom->find_custom(arg[4]+2,flag,cols); + if (custom_index < 0 || !flag || cols) + error->all(FLERR,"Fix rigid custom requires custom integer vector"); int minval = INT_MAX; int *value = atom->ivector[custom_index]; for (i = 0; i < nlocal; i++) diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index f12c53bf3a..ff31ce9e2a 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -113,15 +113,10 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) : // determine whether atom-style variable or atom property is used if (strstr(arg[4],"i_") == arg[4]) { - int is_double=0; - int custom_index = atom->find_custom(arg[4]+2,is_double); - if (custom_index == -1) - error->all(FLERR,"Fix rigid/small custom requires " - "previously defined property/atom"); - else if (is_double) - error->all(FLERR,"Fix rigid/small custom requires " - "integer-valued property/atom"); - + int flag,cols; + int custom_index = atom->find_custom(arg[4]+2,flag,cols); + if (custom_index < 0 || !flag || cols) + error->all(FLERR,"Fix rigid custom requires custom integer vector"); int minval = INT_MAX; int *value = atom->ivector[custom_index]; for (i = 0; i < nlocal; i++) diff --git a/src/USER-REACTION/fix_bond_react.cpp b/src/USER-REACTION/fix_bond_react.cpp index 29aa476148..38760a8c98 100644 --- a/src/USER-REACTION/fix_bond_react.cpp +++ b/src/USER-REACTION/fix_bond_react.cpp @@ -683,8 +683,8 @@ void FixBondReact::post_constructor() // initialize per-atom statted_flags to 1 // (only if not already initialized by restart) if (fix3->restart_reset != 1) { - int flag; - int index = atom->find_custom("statted_tags",flag); + int flag,cols; + int index = atom->find_custom("statted_tags",flag,cols); int *i_statted_tags = atom->ivector[index]; for (int i = 0; i < atom->nlocal; i++) @@ -715,8 +715,8 @@ void FixBondReact::post_constructor() // initialize per-atom statted_tags to 1 // need to correct for smooth restarts - //int flag; - //int index = atom->find_custom(statted_id,flag); + //int flag,cols; + //int index = atom->find_custom(statted_id,flag,cols); //int *i_statted_tags = atom->ivector[index]; //for (int i = 0; i < atom->nlocal; i++) // i_statted_tags[i] = 1; @@ -1021,8 +1021,8 @@ void FixBondReact::far_partner() firstneigh = list->firstneigh; // per-atom property indicating if in bond/react master group - int flag; - int index1 = atom->find_custom("limit_tags",flag); + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; int i,j; @@ -1108,8 +1108,8 @@ void FixBondReact::close_partner() int *mask = atom->mask; // per-atom property indicating if in bond/react master group - int flag; - int index1 = atom->find_custom("limit_tags",flag); + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; // loop over special list @@ -1377,8 +1377,8 @@ void FixBondReact::make_a_guess() int nfirst_neighs = onemol_nxspecial[pion][0]; // per-atom property indicating if in bond/react master group - int flag; - int index1 = atom->find_custom("limit_tags",flag); + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; if (status == GUESSFAIL && avail_guesses == 0) { @@ -2341,17 +2341,17 @@ void FixBondReact::limit_bond(int limit_bond_mode) // we must keep our own list of limited atoms // this will be a new per-atom property! - int flag; - int index1 = atom->find_custom("limit_tags",flag); + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; int *i_statted_tags; if (stabilization_flag == 1) { - int index2 = atom->find_custom(statted_id,flag); + int index2 = atom->find_custom(statted_id,flag,cols); i_statted_tags = atom->ivector[index2]; } - int index3 = atom->find_custom("react_tags",flag); + int index3 = atom->find_custom("react_tags",flag,cols); int *i_react_tags = atom->ivector[index3]; for (int i = 0; i < temp_limit_num; i++) { @@ -2374,17 +2374,17 @@ void FixBondReact::unlimit_bond() //let's now unlimit in terms of i_limit_tags //we just run through all nlocal, looking for > limit_duration //then we return i_limit_tag to 0 (which removes from dynamic group) - int flag; - int index1 = atom->find_custom("limit_tags",flag); + int flag,cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; int *i_statted_tags; if (stabilization_flag == 1) { - int index2 = atom->find_custom(statted_id,flag); + int index2 = atom->find_custom(statted_id,flag,cols); i_statted_tags = atom->ivector[index2]; } - int index3 = atom->find_custom("react_tags",flag); + int index3 = atom->find_custom("react_tags",flag,cols); int *i_react_tags = atom->ivector[index3]; for (int i = 0; i < atom->nlocal; i++) { diff --git a/src/USER-VTK/dump_vtk.cpp b/src/USER-VTK/dump_vtk.cpp index 7f1443c654..b10a8cec41 100644 --- a/src/USER-VTK/dump_vtk.cpp +++ b/src/USER-VTK/dump_vtk.cpp @@ -237,9 +237,15 @@ void DumpVTK::init_style() int icustom; for (int i = 0; i < ncustom; i++) { - icustom = atom->find_custom(id_custom[i],flag_custom[i]); + int flag,cols; + icustom = atom->find_custom(id_custom[i],flag,cols); if (icustom < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + error->all(FLERR,"Could not find dump vtk atom property name"); + custom[i] = icustom; + if (!flag && !cols) custom_flag[i] = IVEC; + else if (flag && !cols) custom_flag[i] = DVEC; + else if (!flag && cols) custom_flag[i] = IARRAY; + else if (flag && cols) custom_flag[i] = DARRAY; } // set index and check validity of region @@ -1511,6 +1517,7 @@ int DumpVTK::parse_fields(int narg, char **arg) name[Z] = "z"; // customize by adding to if statement + int i; for (int iarg = 5; iarg < narg; iarg++) { i = iarg-5; @@ -1825,49 +1832,67 @@ int DumpVTK::parse_fields(int narg, char **arg) name[ATTRIBUTES+i] = suffix; delete [] suffix; - // custom per-atom floating point value = d_ID + // custom per-atom integer value = i_ID or d_ID + + } else if (strncmp(arg[iarg],"i_",2) == 0 || + strncmp(arg[iarg],"d_",2) == 0) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; - } else if (strncmp(arg[iarg],"d_",2) == 0) { pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_custom; - vtype[ATTRIBUTES+i] = Dump::DOUBLE; + if (!which) vtype[ATTRIBUTES+i] = Dump::INT; + else vtype[ATTRIBUTES+i] = Dump::DOUBLE; int n = strlen(arg[iarg]); char *suffix = new char[n]; strcpy(suffix,&arg[iarg][2]); argindex[ATTRIBUTES+i] = 0; - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + if ((!which && (n < 0 || flag || cols)) || + (which && (n < 0 || !flag || cols))) + error->all(FLERR,"Dump vtk per-atom custom vector does not exist"); - if (tmp != 1) - error->all(FLERR,"Custom per-atom property ID is not floating point"); - - field2index[ATTRIBUTES+i] = add_custom(suffix,1); + field2index[ATTRIBUTES+i] = add_custom(suffix); name[ATTRIBUTES+i] = suffix; delete [] suffix; - // custom per-atom integer value = i_ID + // custom per-atom array = i2_ID or d2_ID, must include bracketed index + + } else if (strncmp(arg[iarg],"i2_",3) == 0 || + strncmp(arg[iarg],"d2_",3) == 0) { + int which = 0; + if (arg[iarg][0] == 'd') which = 1; - } else if (strncmp(arg[iarg],"i_",2) == 0) { pack_choice[ATTRIBUTES+i] = &DumpVTK::pack_custom; - vtype[ATTRIBUTES+i] = Dump::INT; + if (!which) vtype[ATTRIBUTES+i] = Dump::INT; + else vtype[ATTRIBUTES+i] = Dump::DOUBLE; int n = strlen(arg[iarg]); char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][2]); - argindex[ATTRIBUTES+i] = 0; + strcpy(suffix,&arg[iarg][3]); - int tmp = -1; - n = atom->find_custom(suffix,tmp); - if (n < 0) - error->all(FLERR,"Could not find custom per-atom property ID"); + char *ptr = strchr(suffix,'['); + if (ptr) { + if (suffix[strlen(suffix)-1] != ']') + error->all(FLERR,"Invalid attribute in dump custom command"); + suffix[strlen(suffix)-1] = '\0'; + argindex[ATTRIBUTES+i] = utils::inumeric(FLERR,ptr+1,true,lmp); + *ptr = '\0'; + } else error->all(FLERR,"Dump custom per-atom custom array is not indexed"); - if (tmp != 0) - error->all(FLERR,"Custom per-atom property ID is not integer"); + int flag,cols; + n = atom->find_custom(suffix,flag,cols); + + if ((!which && (n < 0 || flag || !cols)) || + (which && (n < 0 || !flag || !cols))) + error->all(FLERR,"Dump vtk per-atom custom array does not exist"); + if (argindex[i] <= 0 || argindex[i] > cols) + error->all(FLERR, + "Dump vtk per-atom custom array is accessed out-of-range"); - field2index[ATTRIBUTES+i] = add_custom(suffix,0); + field2index[i] = add_custom(suffix); name[ATTRIBUTES+i] = suffix; delete [] suffix; @@ -2006,27 +2031,28 @@ int DumpVTK::add_variable(char *id) /* ---------------------------------------------------------------------- add custom atom property to list used by dump - return index of where this property is in list + return index of where this property is in Atom class custom lists if already in list, do not add, just return index, else add to list ------------------------------------------------------------------------- */ -int DumpVTK::add_custom(char *id, int flag) +int DumpVTK::add_custom(char *id) { int icustom; for (icustom = 0; icustom < ncustom; icustom++) - if ((strcmp(id,id_custom[icustom]) == 0) - && (flag == flag_custom[icustom])) break; + if (strcmp(id,id_custom[icustom]) == 0) break; if (icustom < ncustom) return icustom; id_custom = (char **) memory->srealloc(id_custom,(ncustom+1)*sizeof(char *),"dump:id_custom"); - flag_custom = (int *) - memory->srealloc(flag_custom,(ncustom+1)*sizeof(int),"dump:flag_custom"); + + delete [] custom; + custom = new int[ncustom+1]; + delete [] custom_flag; + custom_flag = new int[ncustom+1]; int n = strlen(id) + 1; id_custom[ncustom] = new char[n]; strcpy(id_custom[ncustom],id); - flag_custom[ncustom] = flag; ncustom++; return ncustom-1; From 64257393b9de5df9d00bea933eb848a4d6259fdb Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 9 Sep 2020 10:21:59 -0600 Subject: [PATCH 003/352] remove custom vector usage from USER-DPD:fix_rx.cpp --- src/USER-DPD/fix_rx.cpp | 42 ----------------------------------------- 1 file changed, 42 deletions(-) diff --git a/src/USER-DPD/fix_rx.cpp b/src/USER-DPD/fix_rx.cpp index 77efd1842b..809535ea77 100644 --- a/src/USER-DPD/fix_rx.cpp +++ b/src/USER-DPD/fix_rx.cpp @@ -1327,10 +1327,6 @@ void FixRX::odeDiagnostics(void) TimerType now = getTimeStamp(); - // Query the fix database and look for rx_weight for the balance fix. - int type_flag = -1; - int rx_weight_index = atom->find_custom( "rx_weight", /*0:int, 1:float*/ type_flag ); - // Compute the average # of neighbors. double averageNumNeighbors = 0; { @@ -1349,44 +1345,6 @@ void FixRX::odeDiagnostics(void) printf("me= %d nst= %g nfc= %g time= %g nlocal= %g lmpnst= %g weight_idx= %d 1st= %d aveNeigh= %g\n", comm->me, this->diagnosticCounter[0], this->diagnosticCounter[1], this->diagnosticCounter[2], this->diagnosticCounter[3], this->diagnosticCounter[4], rx_weight_index, firstStep, averageNumNeighbors); - if (rx_weight_index != -1 && !firstStep && 0) - { - double *rx_weight = atom->dvector[rx_weight_index]; - - const int nlocal = atom->nlocal; - const int *mask = atom->mask; - - if (odeIntegrationFlag == ODE_LAMMPS_RKF45 && diagnosticFrequency == 1) - { - const double total_time = getElapsedTime( oldTimeStamp, now ); - const double fixrx_time = this->diagnosticCounter[TimeSum]; - const double time_ratio = fixrx_time / total_time; - - double tsum = 0.0; - double tmin = 100000, tmax = 0; - for (int i = 0; i < nlocal; ++i) - if (mask[i] & groupbit) - { - double nfunc_ratio = double( diagnosticCounterPerODE[FuncSum][i] ) / diagnosticCounter[FuncSum]; - rx_weight[i] = nfunc_ratio * fixrx_time + (total_time - fixrx_time) / nlocal; - tmin = fmin( tmin, rx_weight[i] ); - tmax = fmax( tmax, rx_weight[i] ); - tsum += rx_weight[i]; - //rx_weight[i] = (double) diagnosticCounterPerODE[FuncSum][i]; - } - - printf("me= %d total= %g fixrx= %g ratio= %g tsum= %g %g %g %g\n", comm->me, total_time, fixrx_time, time_ratio, tsum, (total_time - fixrx_time) / nlocal, tmin, tmax); - } - else - { - error->warning(FLERR, "Dynamic load balancing enabled but per-atom weights not available."); - - for (int i = 0; i < nlocal; ++i) - if (mask[i] & groupbit) - rx_weight[i] = 1.0; - } - } - firstStep = false; oldTimeStamp = now; } From bddd26ba6c43d4871c8033c822a35520317d2cc2 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 11 Jan 2021 17:26:00 -0700 Subject: [PATCH 004/352] additional changes needed to merge with current master --- src/library.cpp | 283 +++++++++++++++++++++++++++++++++--------------- src/set.cpp | 8 +- src/utils.cpp | 5 +- 3 files changed, 201 insertions(+), 95 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 7d3f2f8996..2630973c3d 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2650,9 +2650,10 @@ void lammps_scatter_atoms_subset(void *handle, char *name, int type, int count, see gather_concat() to return data for all atoms, unordered see gather_subset() to return data for only a subset of atoms name = "x" , "f" or other atom properties - "d_name" or "i_name" for fix property/atom quantities - "f_fix", "c_compute" for fixes / computes - will return error if fix/compute doesn't isn't atom-based + "f_fix", "c_compute" for fixes / computes + "d_name" or "i_name" for fix property/atom vectors with count = 1 + "d2_name" or "i2_name" for fix property/atom arrays with count > 1 + will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f use count = 3 with "image" if want single image flag unpacked into xyz @@ -2673,12 +2674,13 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather" - " not compatible with -DLAMMPS_BIGBIG"); + lmp->error->all(FLERR,"Library function lammps_gather" + " not compatible with -DLAMMPS_BIGBIG"); #else - int i,j,offset,fcid,ltype; + int i,j,offset,fcid,ltype,icol; // error if tags are not defined or not consecutive + int flag = 0; if (lmp->atom->tag_enable == 0 || lmp->atom->tag_consecutive() == 0) flag = 1; @@ -2690,10 +2692,11 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) } int natoms = static_cast (lmp->atom->natoms); - void *vptr = lmp->atom->extract(name); - if (vptr==nullptr && strstr(name,"f_") == name) { // fix + // fix + + if (vptr==nullptr && strstr(name,"f_") == name) { fcid = lmp->modify->find_fix(&name[2]); if (fcid < 0) { @@ -2726,7 +2729,9 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) else vptr = (void *) lmp->modify->fix[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"c_") == name) { // compute + // compute + + if (vptr==nullptr && strstr(name,"c_") == name) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -2753,41 +2758,58 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) if (count==1) vptr = (void *) lmp->modify->compute[fcid]->vector_atom; else vptr = (void *) lmp->modify->compute[fcid]->array_atom; - - } - // property / atom - if ( (vptr == nullptr) && ((strstr(name,"d_") == name) - || (strstr(name,"i_") == name))) { - fcid = lmp->atom->find_custom(&name[2], ltype); + + // property/atom + + if ((vptr == nullptr) && + ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || + (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); + else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather: unknown property/atom id"); return; } + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom type"); return; } - if (count != 1) { + if (count == 1 && icol != 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather: property/atom has count=1"); + lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom count"); return; } - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (count > 1 && icol != count) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom count"); + return; + } + + if (count == 1) { + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; + } else { + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; + } } if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather: unknown property name"); + lmp->error->warning(FLERR,"lammps_gather: undefined property name"); return; } - + // copy = Natom length vector of per-atom values // use atom ID to insert each atom's values into copy // MPI_Allreduce with MPI_SUM to merge into data, ordered by atom ID + if (type==0) { int *vector = nullptr; int **array = nullptr; @@ -2829,7 +2851,6 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) lmp->memory->destroy(copy); } else { - double *vector = nullptr; double **array = nullptr; if (count == 1) vector = (double *) vptr; @@ -2869,9 +2890,10 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) see gather() to return data ordered by consecutive atom IDs see gather_subset() to return data for only a subset of atoms name = "x" , "f" or other atom properties - "d_name" or "i_name" for fix property/atom quantities - "f_fix", "c_compute" for fixes / computes - will return error if fix/compute doesn't isn't atom-based + "f_fix", "c_compute" for fixes / computes + "d_name" or "i_name" for fix property/atom vectors with count = 1 + "d2_name" or "i2_name" for fix property/atom arrays with count > 1 + will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f use count = 3 with "image" if want single image flag unpacked into xyz @@ -2895,9 +2917,10 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d lmp->error->all(FLERR,"Library function lammps_gather_concat" " not compatible with -DLAMMPS_BIGBIG"); #else - int i,offset,fcid,ltype; + int i,offset,fcid,ltype,icol; // error if tags are not defined or not consecutive + int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; @@ -2907,12 +2930,12 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d return; } - int natoms = static_cast (lmp->atom->natoms); - void *vptr = lmp->atom->extract(name); - if (vptr==nullptr && strstr(name,"f_") == name) { // fix + // fix + + if (vptr==nullptr && strstr(name,"f_") == name) { fcid = lmp->modify->find_fix(&name[2]); if (fcid < 0) { @@ -2933,8 +2956,6 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d " count != values peratom for fix"); return; } - - if (lmp->update->ntimestep % lmp->modify->fix[fcid]->peratom_freq) { if (lmp->comm->me == 0) lmp->error->all(FLERR,"lammps_gather_concat:" @@ -2946,7 +2967,9 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d else vptr = (void *) lmp->modify->fix[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"c_") == name) { // compute + // compute + + if (vptr==nullptr && strstr(name,"c_") == name) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -2973,39 +2996,55 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (count==1) vptr = (void *) lmp->modify->compute[fcid]->vector_atom; else vptr = (void *) lmp->modify->compute[fcid]->array_atom; - - } - if (vptr==nullptr && strstr(name,"d_") == name) { // property / atom + // property/atom - fcid = lmp->atom->find_custom(&name[2], ltype); + if ((vptr==nullptr) && + ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || + (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); + else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_concat: " - "unknown property/atom id"); + "unknown property/atom id"); return; } + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_concat: " - "mismatch property/atom type"); + "mismatch property/atom type"); return; } - if (count != 1) { + if (count == 1 && icol != 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_concat: " - "property/atom has count=1"); + "mismatch property/atom count"); + return; + } + if (count > 1 && icol != count) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR,"lammps_gather_concat: " + "mismatch property/atom count"); return; } - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (count == 1) { + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; + } else { + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; + } } if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: unknown property name"); + lmp->error->warning(FLERR,"lammps_gather_concat: undefined property name"); return; } @@ -3020,6 +3059,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (type == 0) { int *vector = nullptr; int **array = nullptr; + const int imgunpack = (count == 3) && (strcmp(name,"image") == 0); if ((count == 1) || imgunpack) vector = (int *) vptr; @@ -3111,9 +3151,10 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d see gather() to return data ordered by consecutive atom IDs see gather_concat() to return data for all atoms, unordered name = "x" , "f" or other atom properties - "d_name" or "i_name" for fix property/atom quantities - "f_fix", "c_compute" for fixes / computes - will return error if fix/compute doesn't isn't atom-based + "f_fix", "c_compute" for fixes / computes + "d_name" or "i_name" for fix property/atom vectors with count = 1 + "d2_name" or "i2_name" for fix property/atom arrays with count > 1 + will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f use count = 3 with "image" if want single image flag unpacked into xyz @@ -3136,13 +3177,14 @@ void lammps_gather_subset(void *handle, char *name, BEGIN_CAPTURE { #if defined(LAMMPS_BIGBIG) - lmp->error->all(FLERR,"Library function lammps_gather_subset() " + lmp->error->all(FLERR,"Library function lammps_gather_subset() " "is not compatible with -DLAMMPS_BIGBIG"); #else - int i,j,m,offset,fcid,ltype; + int i,j,m,offset,fcid,ltype,icol; tagint id; // error if tags are not defined or not consecutive + int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; @@ -3154,7 +3196,9 @@ void lammps_gather_subset(void *handle, char *name, void *vptr = lmp->atom->extract(name); - if (vptr==nullptr && strstr(name,"f_") == name) { // fix + // fix + + if (vptr==nullptr && strstr(name,"f_") == name) { fcid = lmp->modify->find_fix(&name[2]); if (fcid < 0) { @@ -3169,13 +3213,11 @@ void lammps_gather_subset(void *handle, char *name, " fix does not return peratom data"); return; } - if (count>1 && lmp->modify->fix[fcid]->size_peratom_cols != count) { lmp->error->warning(FLERR,"lammps_gather_subset:" - " count != values peratom for fix"); + " count != values peratom for fix"); return; } - if (lmp->update->ntimestep % lmp->modify->fix[fcid]->peratom_freq) { if (lmp->comm->me == 0) lmp->error->all(FLERR,"lammps_gather_subset:" @@ -3187,7 +3229,9 @@ void lammps_gather_subset(void *handle, char *name, else vptr = (void *) lmp->modify->fix[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"c_") == name) { // compute + // compute + + if (vptr==nullptr && strstr(name,"c_") == name) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -3214,39 +3258,56 @@ void lammps_gather_subset(void *handle, char *name, if (count==1) vptr = (void *) lmp->modify->compute[fcid]->vector_atom; else vptr = (void *) lmp->modify->compute[fcid]->array_atom; - - } - if (vptr==nullptr && strstr(name,"d_") == name) { // property / atom + // property/atom - fcid = lmp->atom->find_custom(&name[2], ltype); + if ((vptr == nullptr) && + ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || + (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); + else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_subset: " "unknown property/atom id"); return; } + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_subset: " "mismatch property/atom type"); return; } - if (count != 1) { + if (count == 1 && icol != 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_subset: " - "property/atom has count=1"); + "mismatch property/atom count"); return; } - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (count > 1 && icol != count) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR,"lammps_gather_subset: " + "mismatch property/atom count"); + return; + } + + if (count == 1) { + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; + } else { + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; + } } + if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: " - "unknown property name"); + lmp->error->warning(FLERR,"lammps_gather_subset: undefined property name"); return; } @@ -3304,6 +3365,7 @@ void lammps_gather_subset(void *handle, char *name, } else { double *vector = nullptr; double **array = nullptr; + if (count == 1) vector = (double *) vptr; else array = (double **) vptr; @@ -3346,9 +3408,10 @@ void lammps_gather_subset(void *handle, char *name, requirement for consecutive atom IDs (1 to N) see scatter_subset() to scatter data for some (or all) atoms, unordered name = "x" , "f" or other atom properties - "d_name" or "i_name" for fix property/atom quantities - "f_fix", "c_compute" for fixes / computes - will return error if fix/compute doesn't isn't atom-based + "f_fix", "c_compute" for fixes / computes + "d_name" or "i_name" for fix property/atom vectors with count = 1 + "d2_name" or "i2_name" for fix property/atom arrays with count > 1 + will return error if fix/compute isn't atom-based type = 0 for integer values, 1 for double values count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f use count = 3 with "image" if want single image flag unpacked into xyz @@ -3372,7 +3435,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) lmp->error->all(FLERR,"Library function lammps_scatter() " "is not compatible with -DLAMMPS_BIGBIG"); #else - int i,j,m,offset,fcid,ltype; + int i,j,m,offset,fcid,ltype,icol; // error if tags are not defined or not consecutive or no atom map // NOTE: test that name = image or ids is not a 64-bit int in code? @@ -3389,10 +3452,11 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) } int natoms = static_cast (lmp->atom->natoms); - void *vptr = lmp->atom->extract(name); - if (vptr==nullptr && strstr(name,"f_") == name) { // fix + // fix + + if (vptr==nullptr && strstr(name,"f_") == name) { fcid = lmp->modify->find_fix(&name[2]); if (fcid < 0) { @@ -3418,7 +3482,9 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) else vptr = (void *) lmp->modify->fix[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"c_") == name) { // compute + // compute + + if (vptr==nullptr && strstr(name,"c_") == name) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -3445,31 +3511,46 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) if (count==1) vptr = (void *) lmp->modify->compute[fcid]->vector_atom; else vptr = (void *) lmp->modify->compute[fcid]->array_atom; - - } - if (vptr==nullptr && strstr(name,"d_") == name) { // property / atom + // property/atom + + if ((vptr == nullptr) && + ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || + (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { - fcid = lmp->atom->find_custom(&name[2], ltype); + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); + else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter: unknown property/atom id"); return; } + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter: mismatch property/atom type"); return; } - if (count != 1) { + if (count == 1 && icol != 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_scatter: property/atom has count=1"); + lmp->error->warning(FLERR,"lammps_scatter: mismatch property/atom count"); + return; + } + if (count > 1 && icol != count) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR,"lammps_scatter: mismatch property/atom count"); return; } - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (count == 1) { + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; + } else { + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; + } } if (vptr == nullptr) { @@ -3548,7 +3629,10 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) data is ordered by provided atom IDs no requirement for consecutive atom IDs (1 to N) see scatter_atoms() to scatter data for all atoms, ordered by consecutive IDs - name = desired quantity, e.g. x or charge + name = "x" , "f" or other atom properties + "d_name" or "i_name" for fix property/atom quantities + "f_fix", "c_compute" for fixes / computes + will return error if fix/compute doesn't isn't atom-based type = 0 for integer values, 1 for double values count = # of per-atom values, e.g. 1 for type or charge, 3 for x or f use count = 3 with "image" for xyz to be packed into single image flag @@ -3572,7 +3656,7 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, lmp->error->all(FLERR,"Library function lammps_scatter_subset() " "is not compatible with -DLAMMPS_BIGBIG"); #else - int i,j,m,offset,fcid,ltype; + int i,j,m,offset,fcid,ltype,icol; tagint id; // error if tags are not defined or no atom map @@ -3590,7 +3674,9 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, void *vptr = lmp->atom->extract(name); - if (vptr==nullptr && strstr(name,"f_") == name) { // fix + // fix + + if (vptr==nullptr && strstr(name,"f_") == name) { fcid = lmp->modify->find_fix(&name[2]); if (fcid < 0) { @@ -3616,7 +3702,9 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, else vptr = (void *) lmp->modify->fix[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"c_") == name) { // compute + // compute + + if (vptr==nullptr && strstr(name,"c_") == name) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -3645,29 +3733,46 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, else vptr = (void *) lmp->modify->compute[fcid]->array_atom; } - if (vptr==nullptr && strstr(name,"d_") == name) { // property / atom + // property/atom + + if ((vptr == nullptr) && + ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || + (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { - fcid = lmp->atom->find_custom(&name[2], ltype); + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); + else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter_subset: " "unknown property/atom id"); return; } + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter_subset: " "mismatch property/atom type"); return; } - if (count != 1) { + if (count == 1 && icol != 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_scatter_subset: " - "property/atom has count=1"); + lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom count"); return; } - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (count > 1 && icol != count) { + if (lmp->comm->me == 0) + lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom count"); + return; + } + + if (count == 1) { + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; + } else { + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; + } } if (vptr == nullptr) { diff --git a/src/set.cpp b/src/set.cpp index 98b8afb9c8..f83bf6d78d 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -579,8 +579,8 @@ void Set::command(int narg, char **arg) int which = 0; if (arg[iarg][0] == 'd') which = 1; if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); - else if (!which) ivalue = force->inumeric(FLERR,arg[iarg+1]); - else dvalue = force->numeric(FLERR,arg[iarg+1]); + else if (!which) ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); int flag,cols; index_custom = atom->find_custom(&arg[iarg][2],flag,cols); @@ -599,8 +599,8 @@ void Set::command(int narg, char **arg) int which = 0; if (arg[iarg][0] == 'd') which = 1; if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); - else if (!which) ivalue = force->inumeric(FLERR,arg[iarg+1]); - else dvalue = force->numeric(FLERR,arg[iarg+1]); + else if (!which) ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); int n = strlen(arg[iarg]); char *suffix = new char[n]; diff --git a/src/utils.cpp b/src/utils.cpp index 154f35410e..8fdc5b87e6 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -13,6 +13,7 @@ #include "utils.h" +#include "atom.h" #include "comm.h" #include "compute.h" #include "error.h" @@ -503,7 +504,7 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, } else if (arg[iarg][0] == 'i') { *ptr1 = '\0'; int flag,cols; - int icustom = atom->find_custom(&arg[iarg][3],flag,cols); + int icustom = lmp->atom->find_custom(&arg[iarg][3],flag,cols); *ptr1 = '['; // check for custom per-atom integer array @@ -518,7 +519,7 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, } else if (arg[iarg][0] == 'd') { *ptr1 = '\0'; int flag,cols; - int icustom = atom->find_custom(&arg[iarg][3],flag,cols); + int icustom = lmp->atom->find_custom(&arg[iarg][3],flag,cols); *ptr1 = '['; // check for custom per-atom floating point array From 386fe6158a04bc1c686ac2141c321706c9f8f621 Mon Sep 17 00:00:00 2001 From: Plimpton Date: Tue, 12 Jan 2021 09:07:23 -0700 Subject: [PATCH 005/352] edits to doc pages, including per-atom variables --- doc/src/fix_property_atom.rst | 9 +++ doc/src/fix_store_state.rst | 2 +- doc/src/read_data.rst | 12 +++- src/atom.cpp | 102 ++++++++++++++++++++++++---------- 4 files changed, 92 insertions(+), 33 deletions(-) diff --git a/doc/src/fix_property_atom.rst b/doc/src/fix_property_atom.rst index 71e1a52eaf..c7bf3f8c37 100644 --- a/doc/src/fix_property_atom.rst +++ b/doc/src/fix_property_atom.rst @@ -299,6 +299,15 @@ info on how to re-specify a fix in an input script that reads a restart file, so that the operation of the fix continues in an uninterrupted fashion. +.. warning:: + + When reading data from a restart file, this fix command has to be specified + **exactly** the same way as before. LAMMPS will only check whether a + fix is of the same style and has the same fix ID and in case of a match + will then try to initialize the fix with the data stored in the binary + restart file. If the fix property/atom command does not match exactly, + data can be corrupted or LAMMPS may crash. + None of the :doc:`fix_modify ` options are relevant to this fix. No global or per-atom quantities are stored by this fix for access by various :doc:`output commands `. No parameter diff --git a/doc/src/fix_store_state.rst b/doc/src/fix_store_state.rst index 2a0fda4774..756e32162a 100644 --- a/doc/src/fix_store_state.rst +++ b/doc/src/fix_store_state.rst @@ -117,7 +117,7 @@ uninterrupted fashion. .. warning:: - When reading data from a restart, the fix command has to be specified + When reading data from a restart file, this fix command has to be specified **exactly** the same way as before. LAMMPS will only check whether a fix is of the same style and has the same fix ID and in case of a match will then try to initialize the fix with the data stored in the binary diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index 5d74d9c28b..dc98924ee1 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -633,12 +633,14 @@ of analysis. - atom-ID molecule-ID atom-type lineflag density x y z * - mdpd - atom-ID atom-type rho x y z + * - mesont + - atom-ID molecule-ID atom-type bond_nt mass mradius mlength buckling x y z * - molecular - atom-ID molecule-ID atom-type x y z * - peri - atom-ID atom-type volume density x y z * - smd - - atom-ID atom-type molecule volume mass kernel-radius contact-radius x0 y0 z0 x y z + - atom-ID atom-type molecule volume mass kradius cradius x0 y0 z0 x y z * - sph - atom-ID atom-type rho esph cv x y z * - sphere @@ -661,8 +663,10 @@ The per-atom values have these meanings and units, listed alphabetically: * atom-ID = integer ID of atom * atom-type = type of atom (1-Ntype) * bodyflag = 1 for body particles, 0 for point particles +* bond_nt = bond NT factor for MESONT particles (?? units) +* buckling = buckling factor for MESONT particles (?? units) * ccN = chemical concentration for tDPD particles for each species (mole/volume units) -* contact-radius = ??? (distance units) +* cradius = contact radius for SMD particles (distance units) * cs_re,cs_im = real/imaginary parts of wave packet coefficients * cv = heat capacity (need units) for SPH particles * density = density of particle (mass/distance\^3 or mass/distance\^2 or mass/distance units, depending on dimensionality of particle) @@ -673,10 +677,12 @@ The per-atom values have these meanings and units, listed alphabetically: * ellipsoidflag = 1 for ellipsoidal particles, 0 for point particles * eradius = electron radius (or fixed-core radius) * etag = integer ID of electron that each wave packet belongs to -* kernel-radius = ??? (distance units) +* kradius = kernel radius for SMD particles (distance units) * lineflag = 1 for line segment particles, 0 for point or spherical particles * mass = mass of particle (mass units) +* mlength = ?? length for MESONT particles (distance units) * molecule-ID = integer ID of molecule the atom belongs to +* mradius = ?? radius for MESONT particles (distance units) * mux,muy,muz = components of dipole moment of atom (dipole units) * q = charge on atom (charge units) * rho = density (need units) for SPH particles diff --git a/src/atom.cpp b/src/atom.cpp index d4aa742fb8..741b2c6821 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2599,6 +2599,22 @@ length of the data area, and a short description. - int - 1 - 1 if the particle is a body particle, 0 if not + * - i_name + - int + - 1 + - single integer value defined by fix property/atom vector name + * - d_name + - double + - 1 + - single double value defined by fix property/atom vector name + * - i2_name + - int + - n + - N integer values defined by fix property/atom array name + * - d2_name + - double + - n + - N double values defined by fix property/atom array name *See also* :cpp:func:`lammps_extract_atom` @@ -2660,29 +2676,6 @@ void *Atom::extract(const char *name) if (strcmp(name,"cv") == 0) return (void *) cv; if (strcmp(name,"vest") == 0) return (void *) vest; - // custom vectors and arrays - - if (strstr(name,"i_") == name || strstr(name,"d_") == name || - strstr(name,"i2_") == name || strstr(name,"d2_") == name) { - int which = 0; - if (name[0] == 'd') which = 1; - int array = 0; - if (name[1] == '2') array = 1; - - int index,flag,cols; - if (!array) index = find_custom(&name[2],flag,cols); - else index = find_custom(&name[3],flag,cols); - - if (index < 0) return NULL; - if (which != flag) return NULL; - if ((!array && cols) || (array && !cols)) return NULL; - - if (!which && !array) return (void *) ivector[index]; - if (which && !array) return (void *) dvector[index]; - if (!which && array) return (void *) iarray[index]; - if (which && array) return (void *) darray[index]; - } - // USER-SMD package if (strcmp(name, "contact_radius") == 0) return (void *) contact_radius; @@ -2708,13 +2701,35 @@ void *Atom::extract(const char *name) if (strcmp(name,"buckling") == 0) return (void *) buckling; if (strcmp(name,"bond_nt") == 0) return (void *) bond_nt; + // custom vectors and arrays + + if (strstr(name,"i_") == name || strstr(name,"d_") == name || + strstr(name,"i2_") == name || strstr(name,"d2_") == name) { + int which = 0; + if (name[0] == 'd') which = 1; + int array = 0; + if (name[1] == '2') array = 1; + + int index,flag,cols; + if (!array) index = find_custom(&name[2],flag,cols); + else index = find_custom(&name[3],flag,cols); + + if (index < 0) return NULL; + if (which != flag) return NULL; + if ((!array && cols) || (array && !cols)) return NULL; + + if (!which && !array) return (void *) ivector[index]; + if (which && !array) return (void *) dvector[index]; + if (!which && array) return (void *) iarray[index]; + if (which && array) return (void *) darray[index]; + } + // end of customization section // -------------------------------------------------------------------- return nullptr; } - /** Provide data type info about internal data of the Atom class * \verbatim embed:rst @@ -2776,11 +2791,8 @@ int Atom::extract_datatype(const char *name) if (strcmp(name,"cv") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"vest") == 0) return LAMMPS_DOUBLE_2D; - // USER-MESONT package - if (strcmp(name,"length") == 0) return LAMMPS_DOUBLE; - if (strcmp(name,"buckling") == 0) return LAMMPS_INT; - if (strcmp(name,"bond_nt") == 0) return LAMMPS_TAGINT_2D; - + // USER-SMD package + if (strcmp(name, "contact_radius") == 0) return LAMMPS_DOUBLE; if (strcmp(name, "smd_data_9") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name, "smd_stress") == 0) return LAMMPS_DOUBLE_2D; @@ -2788,9 +2800,41 @@ int Atom::extract_datatype(const char *name) if (strcmp(name, "eff_plastic_strain_rate") == 0) return LAMMPS_DOUBLE; if (strcmp(name, "damage") == 0) return LAMMPS_DOUBLE; + // USER-DPD package + if (strcmp(name,"dpdTheta") == 0) return LAMMPS_DOUBLE; + + // USER-MESO package + if (strcmp(name,"edpd_temp") == 0) return LAMMPS_DOUBLE; + // USER-MESONT package + + if (strcmp(name,"length") == 0) return LAMMPS_DOUBLE; + if (strcmp(name,"buckling") == 0) return LAMMPS_INT; + if (strcmp(name,"bond_nt") == 0) return LAMMPS_TAGINT_2D; + + // custom vectors and arrays + + if (strstr(name,"i_") == name || strstr(name,"d_") == name || + strstr(name,"i2_") == name || strstr(name,"d2_") == name) { + int which = 0; + if (name[0] == 'd') which = 1; + int array = 0; + if (name[1] == '2') array = 1; + + int index,flag,cols; + if (!array) index = find_custom(&name[2],flag,cols); + else index = find_custom(&name[3],flag,cols); + + if (index < 0) return -1; + if (which != flag) return -1; + if ((!array && cols) || (array && !cols)) return -1; + + if (which == 0) return LAMMPS_INT; + else return LAMMPS_DOUBLE; + } + // end of customization section // -------------------------------------------------------------------- From 6f4d6570619fc4e0d229204a2fa7d01909d52521 Mon Sep 17 00:00:00 2001 From: Plimpton Date: Tue, 12 Jan 2021 12:28:06 -0700 Subject: [PATCH 006/352] enable pair table/rx for new custom vector syntax --- src/USER-DPD/pair_table_rx.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/USER-DPD/pair_table_rx.cpp b/src/USER-DPD/pair_table_rx.cpp index cefbe5a73d..4d412d7481 100644 --- a/src/USER-DPD/pair_table_rx.cpp +++ b/src/USER-DPD/pair_table_rx.cpp @@ -329,7 +329,7 @@ void PairTableRX::coeff(int narg, char **arg) int ispecies; for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site1,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site1,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site1,"1fluid") != 0) error->all(FLERR,"Site1 name not recognized in pair coefficients"); @@ -339,7 +339,7 @@ void PairTableRX::coeff(int narg, char **arg) strcpy(site2,arg[5]); for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site2,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site2,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site2,"1fluid") != 0) error->all(FLERR,"Site2 name not recognized in pair coefficients"); @@ -406,7 +406,7 @@ void PairTableRX::coeff(int narg, char **arg) isite1 = nspecies; for (int k = 0; k < nspecies; k++) { - if (strcmp(site1, atom->dname[k]) == 0) { + if (strcmp(site1, atom->dvname[k]) == 0) { isite1 = k; break; } @@ -421,7 +421,7 @@ void PairTableRX::coeff(int narg, char **arg) isite2 = nspecies; for (int k = 0; k < nspecies; k++) { - if (strcmp(site2, atom->dname[k]) == 0) { + if (strcmp(site2, atom->dvname[k]) == 0) { isite2 = ispecies; break; } From fc792805482452f699e3c983f31ed7c6d66d68fe Mon Sep 17 00:00:00 2001 From: Plimpton Date: Tue, 12 Jan 2021 12:37:50 -0700 Subject: [PATCH 007/352] other USER-DPD uses of dname vs new dvname --- src/USER-DPD/fix_eos_table_rx.cpp | 4 ++-- src/USER-DPD/fix_rx.cpp | 12 ++++++------ src/USER-DPD/pair_exp6_rx.cpp | 14 +++++++------- src/USER-DPD/pair_multi_lucy_rx.cpp | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/USER-DPD/fix_eos_table_rx.cpp b/src/USER-DPD/fix_eos_table_rx.cpp index 28cd4eb4c3..b1928caebc 100644 --- a/src/USER-DPD/fix_eos_table_rx.cpp +++ b/src/USER-DPD/fix_eos_table_rx.cpp @@ -369,7 +369,7 @@ void FixEOStableRX::read_file(char *file) while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; for (ispecies = 0; ispecies < nspecies; ispecies++) - if (strcmp(words[0],&atom->dname[ispecies][0]) == 0) break; + if (strcmp(words[0],&atom->dvname[ispecies][0]) == 0) break; if (ispecies < nspecies) { dHf[ispecies] = atof(words[1]); @@ -583,7 +583,7 @@ void FixEOStableRX::param_extract(Table *tb, char *line) if (rx_flag) { while (word) { for (ispecies = 0; ispecies < nspecies; ispecies++) - if (strcmp(word,&atom->dname[ispecies][0]) == 0) { + if (strcmp(word,&atom->dvname[ispecies][0]) == 0) { eosSpecies[ncolumn] = ispecies; ncolumn++; break; diff --git a/src/USER-DPD/fix_rx.cpp b/src/USER-DPD/fix_rx.cpp index 00c2452e81..d38a13b69b 100644 --- a/src/USER-DPD/fix_rx.cpp +++ b/src/USER-DPD/fix_rx.cpp @@ -410,7 +410,7 @@ void FixRX::initSparse() if (comm->me == 0 and Verbosity > 1) { for (int k = 0; k < nspecies; ++k) - printf("atom->dname[%d]= %s\n", k, atom->dname[k]); + printf("atom->dvname[%d]= %s\n", k, atom->dvname[k]); printf("stoich[][]\n"); for (int i = 0; i < nreactions; ++i) { @@ -470,7 +470,7 @@ void FixRX::initSparse() char digit[6]; sprintf(digit, "%4.1f ", stoichReactants[i][k]); rstr += digit; - rstr += atom->dname[k]; + rstr += atom->dvname[k]; } if (stoichProducts[i][k] > 0.0) { allAreIntegral &= (std::fmod( stoichProducts[i][k], 1.0 ) == 0.0); @@ -482,7 +482,7 @@ void FixRX::initSparse() char digit[6]; sprintf(digit, "%4.1f ", stoichProducts[i][k]); pstr += digit; - pstr += atom->dname[k]; + pstr += atom->dvname[k]; } } if (comm->me == 0 and Verbosity > 1) @@ -596,7 +596,7 @@ void FixRX::initSparse() else sprintf(digit,"%4.1f ", sparseKinetics_nu[i][kk]); rstr += digit; - rstr += atom->dname[k]; + rstr += atom->dvname[k]; } } @@ -612,7 +612,7 @@ void FixRX::initSparse() else sprintf(digit,"%4.1f ", sparseKinetics_nu[i][kk]); pstr += digit; - pstr += atom->dname[k]; + pstr += atom->dvname[k]; } } if (comm->me == 0 and Verbosity > 1) @@ -950,7 +950,7 @@ void FixRX::read_file(char *file) tmpStoich = atof(word); word = strtok(nullptr, " \t\n\r\f"); for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(word,&atom->dname[ispecies][0]) == 0) { + if (strcmp(word,&atom->dvname[ispecies][0]) == 0) { stoich[nreactions][ispecies] += sign*tmpStoich; if (sign<0.0) stoichReactants[nreactions][ispecies] += tmpStoich; diff --git a/src/USER-DPD/pair_exp6_rx.cpp b/src/USER-DPD/pair_exp6_rx.cpp index d387ffa3c5..0882825203 100644 --- a/src/USER-DPD/pair_exp6_rx.cpp +++ b/src/USER-DPD/pair_exp6_rx.cpp @@ -602,7 +602,7 @@ void PairExp6rx::coeff(int narg, char **arg) int ispecies; for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site1,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site1,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site1,"1fluid") != 0) error->all(FLERR,"Site1 name not recognized in pair coefficients"); @@ -612,7 +612,7 @@ void PairExp6rx::coeff(int narg, char **arg) strcpy(site2,arg[4]); for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site2,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site2,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site2,"1fluid") != 0) error->all(FLERR,"Site2 name not recognized in pair coefficients"); @@ -626,7 +626,7 @@ void PairExp6rx::coeff(int narg, char **arg) { int isp; for (isp = 0; isp < nspecies; isp++) - if (strcmp(site1, &atom->dname[isp][0]) == 0) break; + if (strcmp(site1, &atom->dvname[isp][0]) == 0) break; if (isp == nspecies) error->all(FLERR,"Site1 name not recognized in pair coefficients"); @@ -640,7 +640,7 @@ void PairExp6rx::coeff(int narg, char **arg) { int isp; for (isp = 0; isp < nspecies; isp++) - if (strcmp(site2, &atom->dname[isp][0]) == 0) break; + if (strcmp(site2, &atom->dvname[isp][0]) == 0) break; if (isp == nspecies) error->all(FLERR,"Site2 name not recognized in pair coefficients"); @@ -788,7 +788,7 @@ void PairExp6rx::read_file(char *file) while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; for (ispecies = 0; ispecies < nspecies; ispecies++) - if (strcmp(words[0],&atom->dname[ispecies][0]) == 0) break; + if (strcmp(words[0],&atom->dvname[ispecies][0]) == 0) break; if (ispecies == nspecies) continue; // load up parameter settings and error check their values @@ -806,9 +806,9 @@ void PairExp6rx::read_file(char *file) params[nparams].ispecies = ispecies; - n = strlen(&atom->dname[ispecies][0]) + 1; + n = strlen(&atom->dvname[ispecies][0]) + 1; params[nparams].name = new char[n]; - strcpy(params[nparams].name,&atom->dname[ispecies][0]); + strcpy(params[nparams].name,&atom->dvname[ispecies][0]); n = strlen(words[1]) + 1; params[nparams].potential = new char[n]; diff --git a/src/USER-DPD/pair_multi_lucy_rx.cpp b/src/USER-DPD/pair_multi_lucy_rx.cpp index e1a263b7dc..33a9039ccd 100644 --- a/src/USER-DPD/pair_multi_lucy_rx.cpp +++ b/src/USER-DPD/pair_multi_lucy_rx.cpp @@ -442,7 +442,7 @@ void PairMultiLucyRX::coeff(int narg, char **arg) else { isite1 = nspecies; for (int ispecies = 0; ispecies < nspecies; ++ispecies) - if (strcmp(site1, atom->dname[ispecies]) == 0) { + if (strcmp(site1, atom->dvname[ispecies]) == 0) { isite1 = ispecies; break; } @@ -456,7 +456,7 @@ void PairMultiLucyRX::coeff(int narg, char **arg) else { isite2 = nspecies; for (int ispecies = 0; ispecies < nspecies; ++ispecies) - if (strcmp(site2, atom->dname[ispecies]) == 0) { + if (strcmp(site2, atom->dvname[ispecies]) == 0) { isite2 = ispecies; break; } From b2f96d92df865d14f4f781a12c4e5bf6e4fd3f64 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 13 Jan 2021 10:31:03 -0700 Subject: [PATCH 008/352] remove print statement --- src/USER-DPD/fix_rx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-DPD/fix_rx.cpp b/src/USER-DPD/fix_rx.cpp index d38a13b69b..e0c34fd9fd 100644 --- a/src/USER-DPD/fix_rx.cpp +++ b/src/USER-DPD/fix_rx.cpp @@ -1343,7 +1343,7 @@ void FixRX::odeDiagnostics(void) averageNumNeighbors /= inum; } - printf("me= %d nst= %g nfc= %g time= %g nlocal= %g lmpnst= %g weight_idx= %d 1st= %d aveNeigh= %g\n", comm->me, this->diagnosticCounter[0], this->diagnosticCounter[1], this->diagnosticCounter[2], this->diagnosticCounter[3], this->diagnosticCounter[4], rx_weight_index, firstStep, averageNumNeighbors); + //printf("me= %d nst= %g nfc= %g time= %g nlocal= %g lmpnst= %g weight_idx= %d 1st= %d aveNeigh= %g\n", comm->me, this->diagnosticCounter[0], this->diagnosticCounter[1], this->diagnosticCounter[2], this->diagnosticCounter[3], this->diagnosticCounter[4], rx_weight_index, firstStep, averageNumNeighbors); firstStep = false; oldTimeStamp = now; From 89b0227849d1b87208a3f891fc433cdb61d0c884 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Apr 2021 16:20:39 -0400 Subject: [PATCH 009/352] move file opening step to reax/c function. simplify code. --- src/USER-REAXC/pair_reaxc.cpp | 12 ++---------- src/USER-REAXC/reaxc_control.cpp | 7 ++++++- src/USER-REAXC/reaxc_ffield.cpp | 17 +++++++++++++---- src/USER-REAXC/reaxc_ffield.h | 3 +-- src/USER-REAXC/reaxc_types.h | 15 ++++++++++----- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 4d6f240ec6..6e9429809e 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -121,6 +121,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) system->pair_ptr = this; system->error_ptr = error; control->error_ptr = error; + control->lmp_ptr = lmp; system->omp_active = 0; @@ -314,16 +315,7 @@ void PairReaxC::coeff( int nargs, char **args ) // read ffield file - char *file = args[2]; - FILE *fp; - fp = utils::open_potential(file,lmp,nullptr); - if (fp != nullptr) - Read_Force_Field(fp, &(system->reax_param), control); - else { - char str[128]; - snprintf(str,128,"Cannot open ReaxFF potential file %s",file); - error->all(FLERR,str); - } + Read_Force_Field(args[2], &(system->reax_param), control); // read args that map atom types to elements in potential file // map[i] = which element the Ith atom type is, -1 if "NULL" diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index b717b6b97f..e4771427e8 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -31,6 +31,9 @@ #include "reaxc_tool_box.h" #include "error.h" +#include "utils.h" + +using LAMMPS_NS::utils::getsyserror; char Read_Control_File( char *control_file, control_params* control, output_controls *out_control ) @@ -42,7 +45,9 @@ char Read_Control_File( char *control_file, control_params* control, /* open control file */ if ((fp = fopen( control_file, "r" ) ) == nullptr) { - control->error_ptr->all(FLERR, "The control file cannot be opened"); + control->error_ptr->all(FLERR,fmt::format("The control file {} cannot be " + "opened: {}",control_file, + getsyserror())); } /* assign default values */ diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index e54b3b75e0..a48ba93e85 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -25,16 +25,22 @@ ----------------------------------------------------------------------*/ #include "reaxc_ffield.h" + #include #include #include #include +#include #include #include "reaxc_defs.h" #include "error.h" #include "reaxc_tool_box.h" +#include "utils.h" -char Read_Force_Field( FILE *fp, reax_interaction *reax, +using LAMMPS_NS::utils::open_potential; +using LAMMPS_NS::utils::getsyserror; + +void Read_Force_Field(const char *filename, reax_interaction *reax, control_params *control ) { char *s; @@ -46,6 +52,11 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, double val; int me = control->me; + FILE *fp = open_potential(filename,control->lmp_ptr,nullptr); + if (!fp) + control->error_ptr->all(FLERR,fmt::format("Cannot open ReaxFF potential " + "file {}: {}",filename, + getsyserror())); s = (char*) malloc(sizeof(char)*MAX_LINE); tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); for (i=0; i < MAX_TOKENS; i++) @@ -66,7 +77,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, fclose(fp); free(s); free(tmp); - return 1; + return; } reax->gp.n_global = n; @@ -734,6 +745,4 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, // close file fclose(fp); - - return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_ffield.h b/src/USER-REAXC/reaxc_ffield.h index b6fe1c9ea9..d334047ab5 100644 --- a/src/USER-REAXC/reaxc_ffield.h +++ b/src/USER-REAXC/reaxc_ffield.h @@ -28,8 +28,7 @@ #define __FFIELD_H_ #include "reaxc_types.h" -#include -char Read_Force_Field( FILE*, reax_interaction*, control_params* ); +void Read_Force_Field(const char *, reax_interaction *, control_params *); #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 36678ad2b0..5e7e655899 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -32,7 +32,12 @@ #include #include "accelerator_kokkos.h" -namespace LAMMPS_NS { class Error;} +// forward declarations +namespace LAMMPS_NS { + class Error; + class LAMMPS; + class Pair; +} #if defined LMP_USER_OMP #define OMP_TIMING 0 @@ -406,8 +411,8 @@ struct _reax_system boundary_cutoff bndry_cuts; reax_atom *my_atoms; - class LAMMPS_NS::Error *error_ptr; - class LAMMPS_NS::Pair *pair_ptr; + LAMMPS_NS::Error *error_ptr; + LAMMPS_NS::Pair *pair_ptr; int my_bonds; int mincap,minhbonds; double safezone, saferzone; @@ -486,9 +491,9 @@ typedef struct int lgflag; int enobondsflag; - class LAMMPS_NS::Error *error_ptr; + LAMMPS_NS::Error *error_ptr; + LAMMPS_NS::LAMMPS *lmp_ptr; int me; - } control_params; From 73cd6f8e4ebe4d117605a969b7c00b10c5ec4406 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Apr 2021 17:36:17 -0400 Subject: [PATCH 010/352] read control file only on MPI rank 0, then broadcast its data --- src/USER-REAXC/reaxc_control.cpp | 13 +++++-------- src/USER-REAXC/reaxc_control.h | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index e4771427e8..6496f27ab5 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -35,8 +35,8 @@ using LAMMPS_NS::utils::getsyserror; -char Read_Control_File( char *control_file, control_params* control, - output_controls *out_control ) +void Read_Control_File(const char *control_file, control_params *control, + output_controls *out_control) { FILE *fp; char *s, **tmp; @@ -44,12 +44,11 @@ char Read_Control_File( char *control_file, control_params* control, double val; /* open control file */ - if ((fp = fopen( control_file, "r" ) ) == nullptr) { - control->error_ptr->all(FLERR,fmt::format("The control file {} cannot be " + fp = fopen(control_file, "r"); + if (!fp) + control->error_ptr->one(FLERR,fmt::format("The control file {} cannot be " "opened: {}",control_file, getsyserror())); - } - /* assign default values */ strcpy( control->sim_name, "simulate" ); control->ensemble = NVE; @@ -390,6 +389,4 @@ char Read_Control_File( char *control_file, control_params* control, free( s ); fclose(fp); - - return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_control.h b/src/USER-REAXC/reaxc_control.h index b2b455d6b8..5739d97574 100644 --- a/src/USER-REAXC/reaxc_control.h +++ b/src/USER-REAXC/reaxc_control.h @@ -29,6 +29,6 @@ #include "reaxc_types.h" -char Read_Control_File( char*, control_params*, output_controls* ); +void Read_Control_File(const char *, control_params *, output_controls *); #endif From a2dcbf6a2d556a678e54cf28e031d956184bd9b0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Apr 2021 17:52:10 -0400 Subject: [PATCH 011/352] remove obsolete define --- src/USER-REAXC/reaxc_list.h | 2 -- src/USER-REAXC/reaxc_types.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/USER-REAXC/reaxc_list.h b/src/USER-REAXC/reaxc_list.h index 28567252da..1894f6cbbd 100644 --- a/src/USER-REAXC/reaxc_list.h +++ b/src/USER-REAXC/reaxc_list.h @@ -38,7 +38,6 @@ inline int End_Index( int, reax_list* ); inline void Set_Start_Index(int,int,reax_list*); inline void Set_End_Index(int,int,reax_list*); -#if defined(LAMMPS_REAX) inline int Num_Entries( int i, reax_list *l ) { return l->end_index[i] - l->index[i]; @@ -63,6 +62,5 @@ inline void Set_End_Index( int i, int val, reax_list *l ) { l->end_index[i] = val; } -#endif // LAMMPS_REAX #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 5e7e655899..a0173c9c20 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -75,8 +75,6 @@ extern int ompTimingCGCount[LASTTIMINGINDEX]; /************* SOME DEFS - crucial for reax_types.h *********/ -#define LAMMPS_REAX - //#define DEBUG //#define DEBUG_FOCUS //#define TEST_ENERGY From 390b1683f0d154dee773e7600c09acfe21c21cc1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Apr 2021 17:53:29 -0400 Subject: [PATCH 012/352] remove unusued function pointer typedefs --- src/USER-REAXC/reaxc_types.h | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index a0173c9c20..fdcd0436e2 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -907,23 +907,8 @@ typedef struct _LR_lookup_table } LR_lookup_table; /* function pointer defs */ -typedef void (*evolve_function)(reax_system*, control_params*, - simulation_data*, storage*, reax_list**, - output_controls*, mpi_datatypes* ); -typedef void (*interaction_function) (reax_system*, control_params*, - simulation_data*, storage*, - reax_list**, output_controls*); - -typedef void (*print_interaction)(reax_system*, control_params*, - simulation_data*, storage*, - reax_list**, output_controls*); - -typedef double (*lookup_function)(double); - -typedef void (*message_sorter) (reax_system*, int, int, int, mpi_out_data*); -typedef void (*unpacker) ( reax_system*, int, void*, int, neighbor_proc*, int ); - -typedef void (*dist_packer) (void*, mpi_out_data*); -typedef void (*coll_unpacker) (void*, void*, mpi_out_data*); +typedef void (*interaction_function) (reax_system *, control_params *, + simulation_data *, storage *, + reax_list **, output_controls *); #endif From 487e0b041c52bb120e852d414de95b553bc1f604 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Apr 2021 23:26:37 -0400 Subject: [PATCH 013/352] eliminate mpi_datatypes struct --- src/USER-OMP/pair_reaxc_omp.cpp | 9 +- src/USER-OMP/reaxc_forces_omp.cpp | 29 ++-- src/USER-OMP/reaxc_forces_omp.h | 3 +- src/USER-OMP/reaxc_init_md_omp.cpp | 24 +-- src/USER-OMP/reaxc_init_md_omp.h | 2 +- src/USER-OMP/reaxc_nonbonded_omp.cpp | 4 +- src/USER-REAXC/pair_reaxc.cpp | 33 ++-- src/USER-REAXC/pair_reaxc.h | 14 +- src/USER-REAXC/reaxc_forces.cpp | 50 +++--- src/USER-REAXC/reaxc_forces.h | 4 +- src/USER-REAXC/reaxc_init_md.cpp | 37 +--- src/USER-REAXC/reaxc_init_md.h | 4 +- src/USER-REAXC/reaxc_io_tools.cpp | 21 +-- src/USER-REAXC/reaxc_io_tools.h | 12 +- src/USER-REAXC/reaxc_lookup.cpp | 8 +- src/USER-REAXC/reaxc_lookup.h | 3 +- src/USER-REAXC/reaxc_traj.cpp | 93 +++++----- src/USER-REAXC/reaxc_traj.h | 5 +- src/USER-REAXC/reaxc_types.h | 244 +++++++++------------------ 19 files changed, 234 insertions(+), 365 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index d10a4573f1..6bb9377ca3 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -117,7 +117,7 @@ PairReaxCOMP::~PairReaxCOMP() #ifdef OMP_TIMING int myrank; - MPI_Comm_rank(mpi_data->world,&myrank); + MPI_Comm_rank(world,&myrank); // Write screen output if (timer->has_full() && myrank == 0 && screen) { @@ -230,7 +230,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) startTimeBase = MPI_Wtime(); #endif - Compute_ForcesOMP(system,control,data,workspace,&lists,out_control,mpi_data); + Compute_ForcesOMP(system,control,data,workspace,&lists,out_control); read_reax_forces(vflag); #ifdef OMP_TIMING @@ -289,7 +289,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) data->step = update->ntimestep; - Output_Results( system, control, data, &lists, out_control, mpi_data ); + Output_Results( system, control, data, &lists, out_control, world ); // populate tmpid and tmpbo arrays for fix reax/c/species @@ -430,8 +430,7 @@ void PairReaxCOMP::setup( ) write_reax_lists(); - InitializeOMP( system, control, data, workspace, &lists, out_control, - mpi_data, world ); + InitializeOMP(system, control, data, workspace, &lists, out_control, world); for (int k = 0; k < system->N; ++k) { num_bonds[k] = system->my_atoms[k].num_bonds; diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 5eb939cf8c..4bed7a3828 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -81,8 +81,7 @@ void Init_Force_FunctionsOMP( control_params *control ) // Only difference with MPI-only version is inclusion of OMP_TIMING statements void Compute_Bonded_ForcesOMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm /* comm */) + reax_list **lists, output_controls *out_control) { int i; @@ -107,8 +106,7 @@ void Compute_Bonded_ForcesOMP( reax_system *system, control_params *control, // Only difference with MPI-only version is inclusion of OMP_TIMING statements void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm /* comm */) + reax_list **lists, output_controls *out_control) { /* van der Waals and Coulomb interactions */ #ifdef OMP_TIMING @@ -136,7 +134,7 @@ void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, Saves enormous time & space! */ void Compute_Total_ForceOMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, mpi_datatypes * /* mpi_data */) + reax_list **lists) { #ifdef OMP_TIMING double startTimeBase,endTimeBase; @@ -266,7 +264,7 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, /* ---------------------------------------------------------------------- */ void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list **lists, - int step, int n, int N, int numH, MPI_Comm /*comm*/) + int step, int n, int N, int numH) { int comp, Hindex; reax_list *bonds, *hbonds; @@ -334,8 +332,7 @@ void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list * void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /* out_control */, - MPI_Comm comm) { + reax_list **lists) { #ifdef OMP_TIMING double startTimeBase, endTimeBase; startTimeBase = MPI_Wtime(); @@ -588,7 +585,7 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, workspace->realloc.num_hbonds = num_hbonds; Validate_ListsOMP( system, workspace, lists, data->step, - system->n, system->N, system->numH, comm ); + system->n, system->N, system->numH); #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); @@ -600,23 +597,19 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, void Compute_ForcesOMP( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - mpi_datatypes *mpi_data ) + reax_list **lists, output_controls *out_control) { - MPI_Comm comm = mpi_data->world; - // Init Forces - Init_Forces_noQEq_OMP( system, control, data, workspace, - lists, out_control, comm ); + Init_Forces_noQEq_OMP( system, control, data, workspace, lists); // Bonded Interactions Compute_Bonded_ForcesOMP( system, control, data, workspace, - lists, out_control, mpi_data->world ); + lists, out_control ); // Nonbonded Interactions Compute_NonBonded_ForcesOMP( system, control, data, workspace, - lists, out_control, mpi_data->world ); + lists, out_control); // Total Force - Compute_Total_ForceOMP( system, control, data, workspace, lists, mpi_data ); + Compute_Total_ForceOMP( system, control, data, workspace, lists); } diff --git a/src/USER-OMP/reaxc_forces_omp.h b/src/USER-OMP/reaxc_forces_omp.h index 6df0288656..e2065d8305 100644 --- a/src/USER-OMP/reaxc_forces_omp.h +++ b/src/USER-OMP/reaxc_forces_omp.h @@ -30,8 +30,9 @@ #define __FORCES_OMP_H_ #include "reaxc_types.h" +#include void Init_Force_FunctionsOMP( control_params* ); void Compute_ForcesOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, mpi_datatypes* ); + storage*, reax_list**, output_controls*); #endif diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 1312953180..bb7d102141 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -41,16 +41,14 @@ #include // Functions defined in reaxc_init_md.cpp -extern int Init_MPI_Datatypes(reax_system*, storage*, mpi_datatypes*, MPI_Comm, char*); -extern int Init_System(reax_system*, control_params*, char*); +extern void Init_System(reax_system*, control_params*); extern int Init_Simulation_Data(reax_system*, control_params*, simulation_data*, char*); extern int Init_Workspace(reax_system*, control_params*, storage*, char*); /* ---------------------------------------------------------------------- */ int Init_ListsOMP(reax_system *system, control_params *control, - simulation_data * /* data */, storage * /* workspace */, - reax_list **lists, mpi_datatypes * /* mpi_data */, char * /* msg */) + reax_list **lists) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; @@ -119,18 +117,12 @@ int Init_ListsOMP(reax_system *system, control_params *control, void InitializeOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, - mpi_datatypes *mpi_data, MPI_Comm comm) + MPI_Comm world) { char msg[MAX_STR]; LAMMPS_NS::Error *error = system->error_ptr; - if (Init_MPI_Datatypes(system,workspace,mpi_data,comm,msg) == FAILURE) - error->one(FLERR,"init_mpi_datatypes: could not create datatypes. " - "Mpi_data could not be initialized! Terminating."); - - if (Init_System(system,control,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. System could not be " - "initialized! Terminating.",msg)); + Init_System(system,control); if (Init_Simulation_Data(system,control,data,msg) == FAILURE) error->one(FLERR,fmt::format("Error on: {}. Sim_data could not be " @@ -140,16 +132,14 @@ void InitializeOMP(reax_system *system, control_params *control, error->one(FLERR,"init_workspace: not enough memory. " "Workspace could not be initialized. Terminating."); - if (Init_ListsOMP(system,control,data,workspace,lists,mpi_data,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. System could not be " - "initialized. Terminating.",msg)); + Init_ListsOMP(system,control,lists); - if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) + if (Init_Output_Files(system,control,out_control,world,msg)== FAILURE) error->one(FLERR,fmt::format("Error on: {}. Could not open output files! " "Terminating.",msg)); if (control->tabulate) - if (Init_Lookup_Tables(system,control,workspace,mpi_data,msg) == FAILURE) + if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) error->one(FLERR,fmt::format("Error on: {}. Could not create lookup " "table. Terminating.",msg)); diff --git a/src/USER-OMP/reaxc_init_md_omp.h b/src/USER-OMP/reaxc_init_md_omp.h index 45478ec632..422e2aa452 100644 --- a/src/USER-OMP/reaxc_init_md_omp.h +++ b/src/USER-OMP/reaxc_init_md_omp.h @@ -34,5 +34,5 @@ #include void InitializeOMP( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); + reax_list**, output_controls*, MPI_Comm ); #endif diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 7abcb5b42a..3a4214d306 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -28,14 +28,14 @@ #include "pair_reaxc_omp.h" -#include "reaxc_defs.h" #include "reaxc_types.h" - #include "reaxc_nonbonded.h" #include "reaxc_nonbonded_omp.h" #include "reaxc_list.h" #include "reaxc_vector.h" +#include "reaxc_defs.h" + #include #if defined(_OPENMP) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 6e9429809e..2897a24d66 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -98,8 +98,6 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) out_control = (output_controls *) memory->smalloc(sizeof(output_controls),"reax:out_control"); memset(out_control,0,sizeof(output_controls)); - mpi_data = (mpi_datatypes *) - memory->smalloc(sizeof(mpi_datatypes),"reax:mpi"); control->me = system->my_rank = comm->me; @@ -148,28 +146,27 @@ PairReaxC::~PairReaxC() delete[] fix_id; if (setup_flag) { - Close_Output_Files( system, control, out_control, mpi_data ); + Close_Output_Files(system,out_control); // deallocate reax data-structures - if (control->tabulate ) Deallocate_Lookup_Tables( system); + if (control->tabulate) Deallocate_Lookup_Tables(system); - if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS ); - Delete_List( lists+BONDS ); - Delete_List( lists+THREE_BODIES ); - Delete_List( lists+FAR_NBRS ); + if (control->hbond_cut > 0) Delete_List(lists+HBONDS); + Delete_List(lists+BONDS); + Delete_List(lists+THREE_BODIES); + Delete_List(lists+FAR_NBRS); - DeAllocate_Workspace( control, workspace ); - DeAllocate_System( system ); + DeAllocate_Workspace(control, workspace); + DeAllocate_System(system); } - memory->destroy( system ); - memory->destroy( control ); + memory->destroy(system); + memory->destroy(control); memory->destroy( data ); memory->destroy( workspace ); memory->destroy( lists ); memory->destroy( out_control ); - memory->destroy( mpi_data ); // deallocate interface storage if (allocated) { @@ -467,8 +464,8 @@ void PairReaxC::setup( ) (lists+FAR_NBRS)->error_ptr=error; write_reax_lists(); - Initialize( system, control, data, workspace, &lists, out_control, - mpi_data, world ); + system->wsize = comm->nprocs; + Initialize(system, control, data, workspace, &lists, out_control, world); for (int k = 0; k < system->N; ++k) { num_bonds[k] = system->my_atoms[k].num_bonds; num_hbonds[k] = system->my_atoms[k].num_hbonds; @@ -491,7 +488,7 @@ void PairReaxC::setup( ) } bigint local_ngroup = list->inum; - MPI_Allreduce( &local_ngroup, &ngroup, 1, MPI_LMP_BIGINT, MPI_SUM, world ); + MPI_Allreduce(&local_ngroup, &ngroup, 1, MPI_LMP_BIGINT, MPI_SUM, world); } /* ---------------------------------------------------------------------- */ @@ -548,7 +545,7 @@ void PairReaxC::compute(int eflag, int vflag) // forces - Compute_Forces(system,control,data,workspace,&lists,out_control,mpi_data); + Compute_Forces(system,control,data,workspace,&lists,out_control); read_reax_forces(vflag); for (int k = 0; k < system->N; ++k) { @@ -602,7 +599,7 @@ void PairReaxC::compute(int eflag, int vflag) data->step = update->ntimestep; - Output_Results( system, control, data, &lists, out_control, mpi_data ); + Output_Results(system, control, data, &lists, out_control, world); // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; diff --git a/src/USER-REAXC/pair_reaxc.h b/src/USER-REAXC/pair_reaxc.h index 53b41ba9c8..5283824116 100644 --- a/src/USER-REAXC/pair_reaxc.h +++ b/src/USER-REAXC/pair_reaxc.h @@ -31,7 +31,15 @@ PairStyle(reax/c,PairReaxC) #define LMP_PAIR_REAXC_H #include "pair.h" -#include "reaxc_types.h" + +// forward declarations +struct control_params; +struct reax_system; +struct output_controls; +struct simulation_data; +struct storage; +struct reax_list; +struct far_neighbor_data; namespace LAMMPS_NS { @@ -55,11 +63,11 @@ class PairReaxC : public Pair { simulation_data *data; storage *workspace; reax_list *lists; - mpi_datatypes *mpi_data; bigint ngroup; + typedef double rvec[3]; - protected: +protected: char *fix_id; double cutmax; class FixReaxC *fix_reax; diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index cde80e9866..0289c08504 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -42,14 +42,14 @@ interaction_function Interaction_Functions[NUM_INTRS]; -void Dummy_Interaction( reax_system * /*system*/, control_params * /*control*/, - simulation_data * /*data*/, storage * /*workspace*/, - reax_list ** /*lists*/, output_controls * /*out_control*/ ) +void Dummy_Interaction(reax_system * /*system*/, control_params * /*control*/, + simulation_data * /*data*/, storage * /*workspace*/, + reax_list ** /*lists*/, output_controls * /*out_control*/ ) { } -void Init_Force_Functions( control_params *control ) +void Init_Force_Functions(control_params *control) { Interaction_Functions[0] = BO; Interaction_Functions[1] = Bonds; //Dummy_Interaction; @@ -66,10 +66,9 @@ void Init_Force_Functions( control_params *control ) } -void Compute_Bonded_Forces( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm /*comm*/ ) +void Compute_Bonded_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) { int i; @@ -81,10 +80,9 @@ void Compute_Bonded_Forces( reax_system *system, control_params *control, } -void Compute_NonBonded_Forces( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm /*comm*/ ) +void Compute_NonBonded_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) { /* van der Waals and Coulomb interactions */ @@ -97,9 +95,9 @@ void Compute_NonBonded_Forces( reax_system *system, control_params *control, } -void Compute_Total_Force( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, mpi_datatypes * /*mpi_data*/ ) +void Compute_Total_Force(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) { int i, pj; reax_list *bonds = (*lists) + BONDS; @@ -433,24 +431,22 @@ void Estimate_Storages( reax_system *system, control_params *control, } -void Compute_Forces( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - mpi_datatypes *mpi_data ) +void Compute_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) { - Init_Forces_noQEq( system, control, data, workspace, - lists, out_control); + Init_Forces_noQEq(system, control, data, workspace, + lists, out_control); /********* bonded interactions ************/ - Compute_Bonded_Forces( system, control, data, workspace, - lists, out_control, mpi_data->world ); + Compute_Bonded_Forces(system, control, data, workspace, + lists, out_control); /********* nonbonded interactions ************/ - Compute_NonBonded_Forces( system, control, data, workspace, - lists, out_control, mpi_data->world ); + Compute_NonBonded_Forces(system, control, data, workspace, + lists, out_control); /*********** total force ***************/ - Compute_Total_Force( system, control, data, workspace, lists, mpi_data ); - + Compute_Total_Force(system, control, data, workspace, lists); } diff --git a/src/USER-REAXC/reaxc_forces.h b/src/USER-REAXC/reaxc_forces.h index bfad2e9b71..b679a66650 100644 --- a/src/USER-REAXC/reaxc_forces.h +++ b/src/USER-REAXC/reaxc_forces.h @@ -32,9 +32,9 @@ extern interaction_function Interaction_Functions[NUM_INTRS]; -void Init_Force_Functions( control_params* ); +void Init_Force_Functions(control_params *); void Compute_Forces( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, mpi_datatypes* ); + storage*, reax_list**, output_controls*); void Estimate_Storages( reax_system*, control_params*, reax_list**, int*, int*, int*, int* ); #endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 9d10966d3b..23c20d1c21 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -41,7 +41,7 @@ #include "error.h" #include "fmt/format.h" -int Init_System(reax_system *system, control_params *control, char * /*msg*/) +void Init_System(reax_system *system, control_params *control) { int i; reax_atom *atom; @@ -65,8 +65,6 @@ int Init_System(reax_system *system, control_params *control, char * /*msg*/) else atom->Hindex = -1; } system->Hcap = (int)(MAX(system->numH * saferzone, mincap)); - - return SUCCESS; } @@ -145,22 +143,7 @@ int Init_Workspace(reax_system *system, control_params *control, return SUCCESS; } - -/************** setup communication data structures **************/ -int Init_MPI_Datatypes(reax_system *system, storage * /*workspace*/, - mpi_datatypes *mpi_data, MPI_Comm comm, char * /*msg*/) -{ - - /* setup the world */ - mpi_data->world = comm; - MPI_Comm_size(comm, &(system->wsize)); - - return SUCCESS; -} - -int Init_Lists(reax_system *system, control_params *control, - simulation_data * /*data*/, storage * /*workspace*/, reax_list **lists, - mpi_datatypes * /*mpi_data*/, char * /*msg*/) +int Init_Lists(reax_system *system, control_params *control, reax_list **lists) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; @@ -221,18 +204,12 @@ int Init_Lists(reax_system *system, control_params *control, void Initialize(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, - mpi_datatypes *mpi_data, MPI_Comm comm) + MPI_Comm world) { char msg[MAX_STR]; LAMMPS_NS::Error *error = system->error_ptr; - if (Init_MPI_Datatypes(system,workspace,mpi_data,comm,msg) == FAILURE) - error->one(FLERR,"init_mpi_datatypes: could not create datatypes. " - "Mpi_data could not be initialized! Terminating."); - - if (Init_System(system,control,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. System could not be " - "initialized! Terminating.",msg)); + Init_System(system,control); if (Init_Simulation_Data( system,control,data,msg) == FAILURE) error->one(FLERR,fmt::format("Error on: {}. Sim_data could not be " @@ -242,16 +219,16 @@ void Initialize(reax_system *system, control_params *control, error->one(FLERR,"init_workspace: not enough memory. " "Workspace could not be initialized. Terminating."); - if (Init_Lists(system, control, data, workspace, lists, mpi_data, msg) ==FAILURE) + if (Init_Lists(system, control, lists) ==FAILURE) error->one(FLERR,fmt::format("Error on: {}. System could not be " "initialized. Terminating.",msg)); - if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) + if (Init_Output_Files(system,control,out_control,world,msg)== FAILURE) error->one(FLERR,fmt::format("Error on: {}. Could not open output files! " "Terminating.",msg)); if (control->tabulate) - if (Init_Lookup_Tables(system,control,workspace,mpi_data,msg) == FAILURE) + if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) error->one(FLERR,fmt::format("Error on: {}. Could not create lookup " "table. Terminating.",msg)); diff --git a/src/USER-REAXC/reaxc_init_md.h b/src/USER-REAXC/reaxc_init_md.h index 5d593f50ea..4528ee95b1 100644 --- a/src/USER-REAXC/reaxc_init_md.h +++ b/src/USER-REAXC/reaxc_init_md.h @@ -30,6 +30,6 @@ #include "reaxc_types.h" #include -void Initialize( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); +void Initialize(reax_system*, control_params*, simulation_data*, storage*, + reax_list**, output_controls*, MPI_Comm); #endif diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 5864ab6a15..290b559817 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -31,15 +31,14 @@ #include "reaxc_system_props.h" #include "reaxc_traj.h" -int Init_Output_Files( reax_system *system, control_params *control, - output_controls *out_control, mpi_datatypes *mpi_data, - char *msg ) +int Init_Output_Files(reax_system *system, control_params *control, + output_controls *out_control, MPI_Comm world, char *msg) { char temp[MAX_STR+8]; int ret; if (out_control->write_steps > 0) { - ret = Init_Traj( system, control, out_control, mpi_data, msg ); + ret = Init_Traj( system, control, out_control, world, msg ); if (ret == FAILURE) return ret; } @@ -80,10 +79,8 @@ int Init_Output_Files( reax_system *system, control_params *control, return SUCCESS; } - /************************ close output files ************************/ -int Close_Output_Files( reax_system *system, control_params * /* control */, - output_controls *out_control, mpi_datatypes * /*mpi_data*/ ) +int Close_Output_Files(reax_system *system, output_controls *out_control) { if (out_control->write_steps > 0) End_Traj( system->my_rank, out_control ); @@ -104,9 +101,9 @@ int Close_Output_Files( reax_system *system, control_params * /* control */, } -void Output_Results( reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, mpi_datatypes *mpi_data ) +void Output_Results(reax_system *system, control_params *control, + simulation_data *data, reax_list **lists, + output_controls *out_control, MPI_Comm world) { if ((out_control->energy_update_freq > 0 && @@ -114,7 +111,7 @@ void Output_Results( reax_system *system, control_params *control, (out_control->write_steps > 0 && data->step%out_control->write_steps == 0)) { /* update system-wide energies */ - Compute_System_Energy( system, data, mpi_data->world ); + Compute_System_Energy(system, data, world); /* output energies */ if ( system->my_rank == MASTER_NODE && @@ -143,7 +140,7 @@ void Output_Results( reax_system *system, control_params *control, /* write current frame */ if ( out_control->write_steps > 0 && (data->step-data->prev_steps) % out_control->write_steps == 0) { - Append_Frame( system, control, data, lists, out_control, mpi_data ); + Append_Frame( system, control, data, lists, out_control, world); } } diff --git a/src/USER-REAXC/reaxc_io_tools.h b/src/USER-REAXC/reaxc_io_tools.h index a3f22fccc2..643b563f73 100644 --- a/src/USER-REAXC/reaxc_io_tools.h +++ b/src/USER-REAXC/reaxc_io_tools.h @@ -28,11 +28,11 @@ #define __IO_TOOLS_H_ #include "reaxc_types.h" +#include -int Init_Output_Files( reax_system*, control_params*, - output_controls*, mpi_datatypes*, char* ); -int Close_Output_Files( reax_system*, control_params*, - output_controls*, mpi_datatypes* ); -void Output_Results( reax_system*, control_params*, simulation_data*, - reax_list**, output_controls*, mpi_datatypes* ); +int Init_Output_Files(reax_system *, control_params *, + output_controls *, MPI_Comm, char *); +int Close_Output_Files(reax_system *, output_controls *); +void Output_Results(reax_system *, control_params *, simulation_data *, + reax_list **, output_controls *, MPI_Comm); #endif diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index b45a6da265..7584c34b82 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -147,8 +147,8 @@ void Complete_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const } -int Init_Lookup_Tables( reax_system *system, control_params *control, - storage *workspace, mpi_datatypes *mpi_data, char * /*msg*/ ) +int Init_Lookup_Tables(reax_system *system, control_params *control, + storage *workspace, MPI_Comm world, char * /*msg*/) { int i, j, r; int num_atom_types; @@ -190,8 +190,8 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, for (i = 0; i < system->n; ++i) existing_types[ system->my_atoms[i].type ] = 1; - MPI_Allreduce( existing_types, aggregated, REAX_MAX_ATOM_TYPES, - MPI_INT, MPI_SUM, mpi_data->world ); + MPI_Allreduce(existing_types, aggregated, REAX_MAX_ATOM_TYPES, + MPI_INT, MPI_SUM, world); for (i = 0; i < num_atom_types; ++i) { if (aggregated[i]) { diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h index 3aae7e0b63..39b0b14ef1 100644 --- a/src/USER-REAXC/reaxc_lookup.h +++ b/src/USER-REAXC/reaxc_lookup.h @@ -40,8 +40,7 @@ void Complete_Cubic_Spline( LAMMPS_NS::Error*, const double *h, const double *f, double v0, double vlast, cubic_spline_coef *coef, unsigned int n ); -int Init_Lookup_Tables( reax_system*, control_params*, storage*, - mpi_datatypes*, char* ); +int Init_Lookup_Tables(reax_system*, control_params*, storage*, MPI_Comm, char* ); void Deallocate_Lookup_Tables( reax_system* ); diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 66a1c70b0e..66968f186e 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -50,9 +50,8 @@ int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_ return SUCCESS; } - -void Write_Skip_Line( output_controls *out_control, mpi_datatypes * /*mpi_data*/, - int my_rank, int skip, int num_section ) +void Write_Skip_Line(output_controls *out_control, + int my_rank, int skip, int num_section) { if (my_rank == MASTER_NODE) fprintf( out_control->strj, INT2_LINE, @@ -60,8 +59,8 @@ void Write_Skip_Line( output_controls *out_control, mpi_datatypes * /*mpi_data*/ } -int Write_Header( reax_system *system, control_params *control, - output_controls *out_control, mpi_datatypes * /*mpi_data*/ ) +int Write_Header(reax_system *system, control_params *control, + output_controls *out_control) { int num_hdr_lines, my_hdr_lines, buffer_req; char ensembles[ens_N][25] = { "NVE", "NVT", "fully flexible NPT", @@ -262,8 +261,8 @@ int Write_Header( reax_system *system, control_params *control, } -int Write_Init_Desc( reax_system *system, control_params * /*control*/, - output_controls *out_control, mpi_datatypes *mpi_data ) +int Write_Init_Desc(reax_system *system, output_controls *out_control, + MPI_Comm world) { int i, me, np, cnt, buffer_len, buffer_req; reax_atom *p_atom; @@ -273,8 +272,7 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, np = system->wsize; /* skip info */ - Write_Skip_Line( out_control, mpi_data, me, - system->bigN * INIT_DESC_LEN, system->bigN ); + Write_Skip_Line(out_control, me, system->bigN*INIT_DESC_LEN, system->bigN); if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) buffer_req = system->bigN * INIT_DESC_LEN + 1; @@ -295,14 +293,14 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, } if (me != MASTER_NODE) { - MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np * INIT_DESCS + me, mpi_data->world ); + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np * INIT_DESCS + me, world); } else { buffer_len = system->n * INIT_DESC_LEN; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*INIT_DESCS+i, mpi_data->world, &status ); + MPI_CHAR, i, np*INIT_DESCS+i, world, &status ); MPI_Get_count( &status, MPI_CHAR, &cnt ); buffer_len += cnt; } @@ -314,9 +312,8 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, } -int Init_Traj( reax_system *system, control_params *control, - output_controls *out_control, mpi_datatypes *mpi_data, - char *msg ) +int Init_Traj(reax_system *system, control_params *control, + output_controls *out_control, MPI_Comm world, char *msg) { char fname[MAX_STR+8]; int atom_line_len[ NR_OPT_ATOM ] = { 0, 0, 0, 0, @@ -346,21 +343,20 @@ int Init_Traj( reax_system *system, control_params *control, /* write trajectory header and atom info, if applicable */ if (out_control->traj_method == REG_TRAJ) { if (system->my_rank == MASTER_NODE) - out_control->strj = fopen( fname, "w" ); + out_control->strj = fopen(fname, "w"); } else { strcpy( msg, "init_traj: unknown trajectory option" ); return FAILURE; } - Write_Header( system, control, out_control, mpi_data ); - Write_Init_Desc( system, control, out_control, mpi_data ); + Write_Header(system, control, out_control); + Write_Init_Desc(system, out_control, world); return SUCCESS; } -int Write_Frame_Header( reax_system *system, control_params *control, - simulation_data *data, output_controls *out_control, - mpi_datatypes * /*mpi_data*/ ) +int Write_Frame_Header(reax_system *system, control_params *control, + simulation_data *data, output_controls *out_control) { int me, num_frm_hdr_lines, my_frm_hdr_lines, buffer_req; @@ -484,8 +480,8 @@ int Write_Frame_Header( reax_system *system, control_params *control, -int Write_Atoms( reax_system *system, control_params * /*control*/, - output_controls *out_control, mpi_datatypes *mpi_data ) +int Write_Atoms(reax_system *system, output_controls *out_control, + MPI_Comm world) { int i, me, np, line_len, buffer_len, buffer_req, cnt; MPI_Status status; @@ -495,8 +491,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, np = system->wsize; line_len = out_control->atom_line_len; - Write_Skip_Line( out_control, mpi_data, me, - system->bigN*line_len, system->bigN ); + Write_Skip_Line(out_control, me, system->bigN*line_len, system->bigN); if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) buffer_req = system->bigN * line_len + 1; @@ -542,13 +537,13 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, if (me != MASTER_NODE) { MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ATOM_LINES+me, mpi_data->world ); + np*ATOM_LINES+me, world); } else { buffer_len = system->n * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ATOM_LINES+i, mpi_data->world, &status ); + MPI_CHAR, i, np*ATOM_LINES+i, world, &status ); MPI_Get_count( &status, MPI_CHAR, &cnt ); buffer_len += cnt; } @@ -561,7 +556,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, - output_controls *out_control, mpi_datatypes *mpi_data) + output_controls *out_control, MPI_Comm world) { int i, j, pj, me, np; int my_bonds, num_bonds; @@ -584,9 +579,9 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, } /* allreduce - total number of bonds */ - MPI_Allreduce( &my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, mpi_data->world ); + MPI_Allreduce( &my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world ); - Write_Skip_Line( out_control, mpi_data, me, num_bonds*line_len, num_bonds ); + Write_Skip_Line( out_control, me, num_bonds*line_len, num_bonds ); if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) buffer_req = num_bonds * line_len + 1; @@ -631,13 +626,13 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, if (me != MASTER_NODE) { MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*BOND_LINES+me, mpi_data->world ); + np*BOND_LINES+me, world ); } else { buffer_len = my_bonds * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*BOND_LINES+i, mpi_data->world, &status ); + MPI_CHAR, i, np*BOND_LINES+i, world, &status ); MPI_Get_count( &status, MPI_CHAR, &cnt ); buffer_len += cnt; } @@ -651,7 +646,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, int Write_Angles( reax_system *system, control_params *control, reax_list *bonds, reax_list *thb_intrs, - output_controls *out_control, mpi_datatypes *mpi_data ) + output_controls *out_control, MPI_Comm world) { int i, j, k, pi, pk, me, np; int my_angles, num_angles; @@ -684,9 +679,9 @@ int Write_Angles( reax_system *system, control_params *control, } } /* total number of valences */ - MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, mpi_data->world); + MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, world); - Write_Skip_Line( out_control, mpi_data, me, num_angles*line_len, num_angles ); + Write_Skip_Line( out_control, me, num_angles*line_len, num_angles ); if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) buffer_req = num_angles * line_len + 1; @@ -726,13 +721,13 @@ int Write_Angles( reax_system *system, control_params *control, if (me != MASTER_NODE) { MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ANGLE_LINES+me, mpi_data->world ); + np*ANGLE_LINES+me, world ); } else { buffer_len = my_angles * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ANGLE_LINES+i, mpi_data->world, &status ); + MPI_CHAR, i, np*ANGLE_LINES+i, world, &status ); MPI_Get_count( &status, MPI_CHAR, &cnt ); buffer_len += cnt; } @@ -744,33 +739,33 @@ int Write_Angles( reax_system *system, control_params *control, } -int Append_Frame( reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, mpi_datatypes *mpi_data ) +int Append_Frame(reax_system *system, control_params *control, + simulation_data *data, reax_list **lists, + output_controls *out_control, MPI_Comm world) { - Write_Frame_Header( system, control, data, out_control, mpi_data ); + Write_Frame_Header(system, control, data, out_control); if (out_control->write_atoms) - Write_Atoms( system, control, out_control, mpi_data ); + Write_Atoms(system, out_control, world); if (out_control->write_bonds) - Write_Bonds( system, control, (*lists + BONDS), out_control, mpi_data ); + Write_Bonds(system, control, (*lists + BONDS), out_control, world); if (out_control->write_angles) - Write_Angles( system, control, (*lists + BONDS), (*lists + THREE_BODIES), - out_control, mpi_data ); + Write_Angles(system, control, (*lists + BONDS), (*lists + THREE_BODIES), + out_control, world); return SUCCESS; } -int End_Traj( int my_rank, output_controls *out_control ) +int End_Traj(int my_rank, output_controls *out_control) { if (my_rank == MASTER_NODE) - fclose( out_control->strj ); + fclose(out_control->strj); - free( out_control->buffer ); - free( out_control->line ); + free(out_control->buffer); + free(out_control->line); return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index 2ff5995204..cb3f12b6f4 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -28,6 +28,7 @@ #define __TRAJ_H__ #include "reaxc_types.h" +#include #define MAX_TRJ_LINE_LEN 120 #define MAX_TRJ_BUFFER_SIZE (MAX_TRJ_LINE_LEN * 100) @@ -94,10 +95,10 @@ enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; int Init_Traj( reax_system*, control_params*, output_controls*, - mpi_datatypes*, char* ); + MPI_Comm , char* ); int End_Traj( int, output_controls* ); int Append_Frame( reax_system*, control_params*, simulation_data*, - reax_list**, output_controls*, mpi_datatypes* ); + reax_list**, output_controls*, MPI_Comm); #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index fdcd0436e2..b5e5fa911a 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -104,48 +104,14 @@ typedef double rvec4[4]; typedef LAMMPS_NS::tagint rc_tagint; typedef LAMMPS_NS::bigint rc_bigint; -typedef struct -{ - int cnt; - int *index; - void *out_atoms; -} mpi_out_data; - -typedef struct -{ - MPI_Comm world; - MPI_Comm comm_mesh3D; - - MPI_Datatype sys_info; - MPI_Datatype mpi_atom_type; - MPI_Datatype boundary_atom_type; - MPI_Datatype mpi_rvec, mpi_rvec2; - MPI_Datatype restart_atom_type; - - MPI_Datatype header_line; - MPI_Datatype header_view; - MPI_Datatype init_desc_line; - MPI_Datatype init_desc_view; - MPI_Datatype atom_line; - MPI_Datatype atom_view; - MPI_Datatype bond_line; - MPI_Datatype bond_view; - MPI_Datatype angle_line; - MPI_Datatype angle_view; - - mpi_out_data out_buffers[REAX_MAX_NBRS]; - void *in1_buffer; - void *in2_buffer; -} mpi_datatypes; - -typedef struct +struct global_parameters { int n_global; double* l; int vdw_type; -} global_parameters; +}; -typedef struct +struct single_body_parameters { /* Line one in field file */ char name[15]; // Two character atom name @@ -189,10 +155,10 @@ typedef struct double lgcij; double lgre; -} single_body_parameters; +}; /* Two Body Parameters */ -typedef struct { +struct two_body_parameters { /* Bond Order parameters */ double p_bo1,p_bo2,p_bo3,p_bo4,p_bo5,p_bo6; double r_s, r_p, r_pp; // r_o distances in BO formula @@ -217,10 +183,10 @@ typedef struct { double gamma; // note: this parameter is gamma^-3 and not gamma. double v13cor, ovc; -} two_body_parameters; +}; /* 3-body parameters */ -typedef struct { +struct three_body_parameters { /* valence angle */ double theta_00; double p_val1, p_val2, p_val4, p_val7; @@ -230,21 +196,23 @@ typedef struct { /* 3-body conjugation */ double p_coa1; -} three_body_parameters; +}; - -typedef struct{ +struct three_body_header +{ int cnt; three_body_parameters prm[REAX_MAX_3BODY_PARAM]; -} three_body_header; +}; /* hydrogen-bond parameters */ -typedef struct{ +struct hbond_parameters +{ double r0_hb, p_hb1, p_hb2, p_hb3; -} hbond_parameters; +}; /* 4-body parameters */ -typedef struct { +struct four_body_parameters +{ double V1, V2, V3; /* torsion angle */ @@ -252,15 +220,15 @@ typedef struct { /* 4-body conjugation */ double p_cot1; -} four_body_parameters; +}; -typedef struct +struct four_body_header { int cnt; four_body_parameters prm[REAX_MAX_4BODY_PARAM]; -} four_body_header; +}; -typedef struct +struct reax_interaction { int num_atom_types; global_parameters gp; @@ -269,9 +237,9 @@ typedef struct three_body_header ***thbp; hbond_parameters ***hbp; four_body_header ****fbp; -} reax_interaction; +}; -struct _reax_atom +struct reax_atom { rc_tagint orig_id; int imprt_id; @@ -297,9 +265,8 @@ struct _reax_atom double nbr_bo[MAX_BOND]; // BO values of bond between i and nbr double sum_bo, no_lp; // sum of BO values and no. of lone pairs }; -typedef _reax_atom reax_atom; -typedef struct +struct simulation_box { double V; rvec min, max, box_norms; @@ -307,29 +274,9 @@ typedef struct rtensor box, box_inv; rtensor trans, trans_inv; rtensor g; -} simulation_box; - -struct grid_cell -{ - double cutoff; - rvec min, max; - ivec rel_box; - - int mark; - int type; - int str; - int end; - int top; - int* atoms; - struct grid_cell** nbrs; - ivec* nbrs_x; - rvec* nbrs_cp; }; -typedef struct grid_cell grid_cell; - - -typedef struct +struct grid { int total, max_atoms, max_nbrs; ivec ncells; @@ -350,12 +297,10 @@ typedef struct ivec ghost_hbond_span; ivec ghost_bond_span; - grid_cell*** cells; ivec *order; -} grid; +}; - -typedef struct +struct neighbor_proc { int rank; int est_send, est_recv; @@ -369,30 +314,25 @@ typedef struct ivec end_send; ivec str_recv; ivec end_recv; -} neighbor_proc; +}; - - -typedef struct +struct bound_estimate { int N; int exc_gcells; int exc_atoms; -} bound_estimate; +}; - - -typedef struct +struct boundary_cutoff { double ghost_nonb; double ghost_hbond; double ghost_bond; double ghost_cutoff; -} boundary_cutoff; +}; - -struct _LR_lookup_table; // forward declaration -struct _reax_system +struct LR_lookup_table; // forward declaration +struct reax_system { reax_interaction reax_param; @@ -415,16 +355,13 @@ struct _reax_system int mincap,minhbonds; double safezone, saferzone; - _LR_lookup_table **LR; + LR_lookup_table **LR; int omp_active; }; -typedef _reax_system reax_system; - - /* system control parameters */ -typedef struct +struct control_params { char sim_name[REAX_MAX_STR]; int nprocs; @@ -492,10 +429,9 @@ typedef struct LAMMPS_NS::Error *error_ptr; LAMMPS_NS::LAMMPS *lmp_ptr; int me; -} control_params; +}; - -typedef struct +struct thermostat { double T; double xi; @@ -503,10 +439,9 @@ typedef struct double v_xi_old; double G_xi; -} thermostat; +}; - -typedef struct +struct isotropic_barostat { double P; double eps; @@ -514,10 +449,9 @@ typedef struct double v_eps_old; double a_eps; -} isotropic_barostat; +}; - -typedef struct +struct flexible_barostat { rtensor P; double P_scalar; @@ -532,10 +466,9 @@ typedef struct rtensor v_g0_old; rtensor a_g0; -} flexible_barostat; +}; - -typedef struct +struct reax_timing { double start; double end; @@ -550,10 +483,9 @@ typedef struct double qEq; int s_matvecs; int t_matvecs; -} reax_timing; +}; - -typedef struct +struct energy_data { double e_tot; double e_kin; // Total kinetic energy @@ -572,9 +504,9 @@ typedef struct double e_vdW; // Total van der Waals energy double e_ele; // Total electrostatics energy double e_pol; // Polarization energy -} energy_data; +}; -typedef struct +struct simulation_data { int step; int prev_steps; @@ -612,44 +544,40 @@ typedef struct rvec tot_press; reax_timing timing; -} simulation_data; +}; - -typedef struct{ +struct three_body_interaction_data +{ int thb; int pthb; // pointer to the third body on the central atom's nbrlist double theta, cos_theta; rvec dcos_di, dcos_dj, dcos_dk; -} three_body_interaction_data; +}; - -typedef struct { +struct far_neighbor_data { int nbr; ivec rel_box; double d; rvec dvec; -} far_neighbor_data; +}; - -typedef struct { +struct hbond_data { int nbr; int scl; far_neighbor_data *ptr; -} hbond_data; +}; - -typedef struct{ +struct dDelta_data { int wrt; rvec dVal; -} dDelta_data; +}; - -typedef struct{ +struct dbond_data { int wrt; rvec dBO, dBOpi, dBOpi2; -} dbond_data; +}; -typedef struct{ +struct bond_order_data { double BO, BO_s, BO_pi, BO_pi2; double Cdbo, Cdbopi, Cdbopi2; double C1dbo, C2dbo, C3dbo; @@ -657,9 +585,9 @@ typedef struct{ double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2; double *CdboReduction; -} bond_order_data; +}; -typedef struct { +struct bond_data { int nbr; int sym_index; int dbond_index; @@ -668,32 +596,29 @@ typedef struct { double d; rvec dvec; bond_order_data bo_data; -} bond_data; +}; - -typedef struct { +struct sparse_matrix_entry { int j; double val; -} sparse_matrix_entry; +}; -typedef struct { +struct sparse_matrix { int cap, n, m; int *start, *end; sparse_matrix_entry *entries; -} sparse_matrix; +}; - -typedef struct { +struct reallocate_data { int num_far; int H, Htop; int hbonds, num_hbonds; int bonds, num_bonds; int num_3body; int gcell_atoms; -} reallocate_data; +}; - -typedef struct +struct storage { int allocated; @@ -750,10 +675,9 @@ typedef struct int *valence_angle_atom_myoffset; reallocate_data realloc; -} storage; +}; - -typedef union +union list_type { void *v; three_body_interaction_data *three_body_list; @@ -762,10 +686,9 @@ typedef union dDelta_data *dDelta_list; far_neighbor_data *far_nbr_list; hbond_data *hbond_list; -} list_type; +}; - -struct _reax_list +struct reax_list { int allocated; @@ -779,10 +702,8 @@ struct _reax_list list_type select; class LAMMPS_NS::Error *error_ptr; }; -typedef _reax_list reax_list; - -typedef struct +struct output_controls { FILE *strj; int trj_offset; @@ -818,16 +739,14 @@ typedef struct int debug_level; int energy_update_freq; -} output_controls; +}; - -typedef struct +struct molecule { int atom_count; int atom_list[REAX_MAX_MOLECULE_SIZE]; int mtypes[REAX_MAX_ATOM_TYPES]; -} molecule; - +}; struct LR_data { @@ -856,7 +775,6 @@ struct LR_data } }; - struct cubic_spline_coef { double a, b, c, d; @@ -889,9 +807,7 @@ struct cubic_spline_coef } }; - - -typedef struct _LR_lookup_table +struct LR_lookup_table { double xmin, xmax; int n; @@ -904,7 +820,7 @@ typedef struct _LR_lookup_table cubic_spline_coef *H; cubic_spline_coef *vdW, *CEvd; cubic_spline_coef *ele, *CEclmb; -} LR_lookup_table; +}; /* function pointer defs */ From 112142be35c54918b0faa4c6ee7b19f8688bd4aa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 00:18:47 -0400 Subject: [PATCH 014/352] remove some unused structs, typedefs and data members --- src/USER-OMP/pair_reaxc_omp.cpp | 9 --- src/USER-REAXC/pair_reaxc.cpp | 17 ------ src/USER-REAXC/reaxc_control.cpp | 19 +----- src/USER-REAXC/reaxc_io_tools.cpp | 9 +-- src/USER-REAXC/reaxc_traj.cpp | 7 +-- src/USER-REAXC/reaxc_types.h | 99 ++----------------------------- 6 files changed, 13 insertions(+), 147 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 6bb9377ca3..5e20b06a28 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -201,10 +201,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system - system->big_box.V = 0; - system->big_box.box_norms[0] = 0; - system->big_box.box_norms[1] = 0; - system->big_box.box_norms[2] = 0; if (comm->me == 0 ) t_start = MPI_Wtime(); // setup data structures @@ -334,11 +330,6 @@ void PairReaxCOMP::init_style( ) system->bigN = static_cast (atom->natoms); // all atoms in the system system->wsize = comm->nprocs; - system->big_box.V = 0; - system->big_box.box_norms[0] = 0; - system->big_box.box_norms[1] = 0; - system->big_box.box_norms[2] = 0; - if (atom->tag_enable == 0) error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); if (force->newton_pair == 0) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 2897a24d66..c289cf9310 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -101,20 +101,12 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) control->me = system->my_rank = comm->me; - system->my_coords[0] = 0; - system->my_coords[1] = 0; - system->my_coords[2] = 0; system->num_nbrs = 0; system->n = 0; // my atoms system->N = 0; // mine + ghosts system->bigN = 0; // all atoms in the system system->local_cap = 0; system->total_cap = 0; - system->gcell_cap = 0; - system->bndry_cuts.ghost_nonb = 0; - system->bndry_cuts.ghost_hbond = 0; - system->bndry_cuts.ghost_bond = 0; - system->bndry_cuts.ghost_cutoff = 0; system->my_atoms = nullptr; system->pair_ptr = this; system->error_ptr = error; @@ -378,11 +370,6 @@ void PairReaxC::init_style( ) system->bigN = static_cast (atom->natoms); // all atoms in the system system->wsize = comm->nprocs; - system->big_box.V = 0; - system->big_box.box_norms[0] = 0; - system->big_box.box_norms[1] = 0; - system->big_box.box_norms[2] = 0; - if (atom->tag_enable == 0) error->all(FLERR,"Pair style reax/c requires atom IDs"); if (force->newton_pair == 0) @@ -525,10 +512,6 @@ void PairReaxC::compute(int eflag, int vflag) system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system - system->big_box.V = 0; - system->big_box.box_norms[0] = 0; - system->big_box.box_norms[1] = 0; - system->big_box.box_norms[2] = 0; if (comm->me == 0 ) t_start = MPI_Wtime(); // setup data structures diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 6496f27ab5..b74c07a5fe 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -53,12 +53,8 @@ void Read_Control_File(const char *control_file, control_params *control, strcpy( control->sim_name, "simulate" ); control->ensemble = NVE; control->nsteps = 0; - control->dt = 0.25; - control->nprocs = 1; + control->dt = 0.0; control->nthreads = 1; - control->procs_by_dim[0] = 1; - control->procs_by_dim[1] = 1; - control->procs_by_dim[2] = 1; control->geo_format = 1; control->restart = 0; @@ -139,19 +135,10 @@ void Read_Control_File(const char *control_file, control_params *control, control->nsteps = ival; } else if ( strcmp(tmp[0], "dt") == 0) { - val = atof(tmp[1]); - control->dt = val * 1.e-3; // convert dt from fs to ps! + ; // ignore } else if (strcmp(tmp[0], "proc_by_dim") == 0) { - ival = atoi(tmp[1]); - control->procs_by_dim[0] = ival; - ival = atoi(tmp[2]); - control->procs_by_dim[1] = ival; - ival = atoi(tmp[3]); - control->procs_by_dim[2] = ival; - - control->nprocs = control->procs_by_dim[0]*control->procs_by_dim[1]* - control->procs_by_dim[2]; + ; // ignore } else if (strcmp(tmp[0], "random_vel") == 0) { ival = atoi(tmp[1]); diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 290b559817..52e6a0c108 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -126,12 +126,9 @@ void Output_Results(reax_system *system, control_params *control, data->ext_press[0], data->ext_press[1], data->ext_press[2], data->kin_press ); - fprintf( out_control->prs, - "%8s%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f\n", - "",system->big_box.box_norms[0], system->big_box.box_norms[1], - system->big_box.box_norms[2], - data->tot_press[0], data->tot_press[1], data->tot_press[2], - system->big_box.V ); + fprintf(out_control->prs, + "%8s%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f\n", "", 0.0, 0.0, 0.0, + data->tot_press[0], data->tot_press[1], data->tot_press[2], 0.0); fflush( out_control->prs); } diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 66968f186e..f97a80f023 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -389,13 +389,10 @@ int Write_Frame_Header(reax_system *system, control_params *control, /* box info */ - sprintf( out_control->line, REAL_LINE, "volume:", system->big_box.V ); + sprintf( out_control->line, REAL_LINE, "volume:", 0.0 ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL3_LINE, "box_dimensions:", - system->big_box.box_norms[0], - system->big_box.box_norms[1], - system->big_box.box_norms[2] ); + sprintf( out_control->line, REAL3_LINE, "box_dimensions:", 0.0, 0.0, 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); sprintf( out_control->line, REAL3_LINE, diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index b5e5fa911a..ee2db705d5 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -1,4 +1,4 @@ -/*---------------------------------------------------------------------- +/*- -*- c++ -*- -------------------------------------------------------- PuReMD - Purdue ReaxFF Molecular Dynamics Program Copyright (2010) Purdue University @@ -24,8 +24,8 @@ . ----------------------------------------------------------------------*/ -#ifndef __REAX_TYPES_H_ -#define __REAX_TYPES_H_ +#ifndef LMP_REAXC_TYPES_H +#define LMP_REAXC_TYPES_H #include "lmptype.h" #include @@ -98,7 +98,6 @@ typedef int ivec[3]; typedef double rvec[3]; typedef double rtensor[3][3]; typedef double rvec2[2]; -typedef double rvec4[4]; // import LAMMPS' definition of tagint and bigint typedef LAMMPS_NS::tagint rc_tagint; @@ -113,9 +112,7 @@ struct global_parameters struct single_body_parameters { - /* Line one in field file */ - char name[15]; // Two character atom name - + char name[4]; // two character atom name double r_s; double valency; // Valency of the atom double mass; // Mass of atom @@ -242,93 +239,17 @@ struct reax_interaction struct reax_atom { rc_tagint orig_id; - int imprt_id; int type; char name[8]; rvec x; // position rvec v; // velocity rvec f; // force - rvec f_old; - double q; // charge - rvec4 s; // they take part in - rvec4 t; // computing q int Hindex; int num_bonds; int num_hbonds; - int renumber; - - int numbonds; // true number of bonds around atoms - int nbr_id[MAX_BOND]; // ids of neighbors around atoms - double nbr_bo[MAX_BOND]; // BO values of bond between i and nbr - double sum_bo, no_lp; // sum of BO values and no. of lone pairs -}; - -struct simulation_box -{ - double V; - rvec min, max, box_norms; - - rtensor box, box_inv; - rtensor trans, trans_inv; - rtensor g; -}; - -struct grid -{ - int total, max_atoms, max_nbrs; - ivec ncells; - rvec cell_len; - rvec inv_len; - - ivec bond_span; - ivec nonb_span; - ivec vlist_span; - - ivec native_cells; - ivec native_str; - ivec native_end; - - double ghost_cut; - ivec ghost_span; - ivec ghost_nonb_span; - ivec ghost_hbond_span; - ivec ghost_bond_span; - - ivec *order; -}; - -struct neighbor_proc -{ - int rank; - int est_send, est_recv; - int atoms_str, atoms_cnt; - ivec rltv, prdc; - rvec bndry_min, bndry_max; - - int send_type; - int recv_type; - ivec str_send; - ivec end_send; - ivec str_recv; - ivec end_recv; -}; - -struct bound_estimate -{ - int N; - int exc_gcells; - int exc_atoms; -}; - -struct boundary_cutoff -{ - double ghost_nonb; - double ghost_hbond; - double ghost_bond; - double ghost_cutoff; }; struct LR_lookup_table; // forward declaration @@ -338,15 +259,8 @@ struct reax_system rc_bigint bigN; int n, N, numH; - int local_cap, total_cap, gcell_cap, Hcap; - int est_recv, est_trans, max_recved; + int local_cap, total_cap, Hcap; int wsize, my_rank, num_nbrs; - ivec my_coords; - neighbor_proc my_nbrs[REAX_MAX_NBRS]; - int *global_offset; - simulation_box big_box, my_box, my_ext_box; - grid my_grid; - boundary_cutoff bndry_cuts; reax_atom *my_atoms; LAMMPS_NS::Error *error_ptr; @@ -364,9 +278,7 @@ struct reax_system struct control_params { char sim_name[REAX_MAX_STR]; - int nprocs; int nthreads; - ivec procs_by_dim; /* ensemble values: 0 : NVE 1 : bNVT (Berendsen) @@ -738,7 +650,6 @@ struct output_controls int restart_freq; int debug_level; int energy_update_freq; - }; struct molecule From 54ee33fe5806ecaeb5be182b828a0b50fce98c6c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 04:48:02 -0400 Subject: [PATCH 015/352] simplify creation of reaxc fix --- src/USER-OMP/pair_reaxc_omp.cpp | 13 ++----------- src/USER-REAXC/pair_reaxc.cpp | 10 ++-------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 5e20b06a28..6ed0979fc9 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -360,20 +360,11 @@ void PairReaxCOMP::init_style( ) lists[i].allocated = 0; if (fix_reax == nullptr) { - char **fixarg = new char*[3]; - fixarg[0] = (char *) fix_id; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "REAXC"; - modify->add_fix(3,fixarg); - delete [] fixarg; + modify->add_fix(fmt::format("{} all REAXC",fix_id)); fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; } -#if defined(_OPENMP) - control->nthreads = omp_get_max_threads(); -#else - control->nthreads = 1; -#endif + control->nthreads = comm->nthreads; } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index c289cf9310..eee48b20f4 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -79,8 +79,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) centroidstressflag = CENTROID_NOTAVAIL; ghostneigh = 1; - fix_id = new char[24]; - snprintf(fix_id,24,"REAXC_%d",instance_me); + fix_id = utils::strdup("REAXC_" + std::to_string(instance_me)); system = (reax_system *) memory->smalloc(sizeof(reax_system),"reax:system"); @@ -400,12 +399,7 @@ void PairReaxC::init_style( ) lists[i].allocated = 0; if (fix_reax == nullptr) { - char **fixarg = new char*[3]; - fixarg[0] = (char *) fix_id; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "REAXC"; - modify->add_fix(3,fixarg); - delete [] fixarg; + modify->add_fix(fmt::format("{} all REAXC",fix_id)); fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; } } From 7dc21842c2a130b46f83260268616d7ee12f3e6e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 05:40:16 -0400 Subject: [PATCH 016/352] ignore/remove unused control file settings and related functions and data structures --- src/USER-OMP/pair_reaxc_omp.cpp | 2 - src/USER-REAXC/pair_reaxc.cpp | 10 -- src/USER-REAXC/reaxc_allocate.cpp | 37 +++--- src/USER-REAXC/reaxc_control.cpp | 167 ++++++--------------------- src/USER-REAXC/reaxc_defs.h | 3 - src/USER-REAXC/reaxc_forces.cpp | 22 +--- src/USER-REAXC/reaxc_init_md.cpp | 2 +- src/USER-REAXC/reaxc_io_tools.cpp | 17 +-- src/USER-REAXC/reaxc_reset_tools.cpp | 21 ---- src/USER-REAXC/reaxc_traj.cpp | 80 ++++--------- src/USER-REAXC/reaxc_types.h | 88 +------------- 11 files changed, 80 insertions(+), 369 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 6ed0979fc9..505ca1467f 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -393,8 +393,6 @@ void PairReaxCOMP::setup( ) int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - control->vlist_cut = neighbor->cutneighmax; - // determine the local and total capacity system->local_cap = MAX( (int)(system->n * safezone), mincap ); diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index eee48b20f4..768827fb58 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -204,19 +204,15 @@ void PairReaxC::settings(int narg, char **arg) if (strcmp(arg[0],"NULL") == 0) { strcpy( control->sim_name, "simulate" ); - control->ensemble = 0; out_control->energy_update_freq = 0; control->tabulate = 0; - control->reneighbor = 1; - control->vlist_cut = control->nonb_cut; control->bond_cut = 5.; control->hbond_cut = 7.50; control->thb_cut = 0.001; control->thb_cutsq = 0.00001; control->bg_cut = 0.3; - // Initialize for when omp style included control->nthreads = 1; out_control->write_steps = 0; @@ -281,10 +277,6 @@ void PairReaxC::settings(int narg, char **arg) iarg += 2; } else error->all(FLERR,"Illegal pair_style reax/c command"); } - - // LAMMPS is responsible for generating nbrs - - control->reneighbor = 1; } /* ---------------------------------------------------------------------- */ @@ -424,8 +416,6 @@ void PairReaxC::setup( ) int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - control->vlist_cut = neighbor->cutneighmax; - // determine the local and total capacity system->local_cap = MAX( (int)(system->n * safezone), mincap ); diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 9ba92b9dfa..0c565e5c33 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -164,7 +164,6 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) sfree(control->error_ptr, workspace->b_prm, "b_prm" ); sfree(control->error_ptr, workspace->s, "s" ); sfree(control->error_ptr, workspace->t, "t" ); - sfree(control->error_ptr, workspace->droptol, "droptol" ); sfree(control->error_ptr, workspace->b, "b" ); sfree(control->error_ptr, workspace->x, "x" ); @@ -263,8 +262,6 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, workspace->b_prm = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prm"); workspace->s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "s"); workspace->t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "t"); - workspace->droptol = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "droptol"); workspace->b = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "b"); workspace->x = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "x"); @@ -398,8 +395,9 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, void ReAllocate( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists ) { + auto error = system->error_ptr; int num_bonds, est_3body, Hflag, ret; - int renbr, newsize; + int newsize; reallocate_data *realloc; reax_list *far_nbrs; char msg[200]; @@ -428,7 +426,7 @@ void ReAllocate( reax_system *system, control_params *control, if (ret != SUCCESS) { char errmsg[256]; snprintf(errmsg, 256, "Not enough space for atom_list: total_cap=%d", system->total_cap); - system->error_ptr->one(FLERR, errmsg); + error->one(FLERR, errmsg); } /* workspace */ @@ -438,29 +436,24 @@ void ReAllocate( reax_system *system, control_params *control, if (ret != SUCCESS) { char errmsg[256]; snprintf(errmsg, 256, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); - system->error_ptr->one(FLERR, errmsg); + error->one(FLERR, errmsg); } } - - renbr = (data->step - data->prev_steps) % control->reneighbor == 0; /* far neighbors */ - if (renbr) { - far_nbrs = *lists + FAR_NBRS; - if (Nflag || realloc->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { - if (realloc->num_far > far_nbrs->num_intrs) { - char errmsg[256]; - snprintf(errmsg, 256, "step%d-ran out of space on far_nbrs: top=%d, max=%d", data->step, realloc->num_far, far_nbrs->num_intrs); - system->error_ptr->one(FLERR, errmsg); - } + far_nbrs = *lists + FAR_NBRS; - newsize = static_cast - (MAX( realloc->num_far*safezone, mincap*REAX_MIN_NBRS)); + if (Nflag || realloc->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { + if (realloc->num_far > far_nbrs->num_intrs) + error->one(FLERR,fmt::format("step{}: ran out of space on far_nbrs: top={}, max={}", + data->step, realloc->num_far, far_nbrs->num_intrs)); - Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize); - realloc->num_far = 0; - } + newsize = static_cast + (MAX( realloc->num_far*safezone, mincap*REAX_MIN_NBRS)); + + Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize); + realloc->num_far = 0; } /* hydrogen bonds list */ @@ -498,7 +491,7 @@ void ReAllocate( reax_system *system, control_params *control, if ( !Make_List( num_bonds, realloc->num_3body, TYP_THREE_BODY, (*lists)+THREE_BODIES )) { - system->error_ptr->one(FLERR, "Problem in initializing angles list"); + error->one(FLERR, "Problem in initializing angles list"); } realloc->num_3body = -1; } diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index b74c07a5fe..93cb642a1f 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -51,23 +51,11 @@ void Read_Control_File(const char *control_file, control_params *control, getsyserror())); /* assign default values */ strcpy( control->sim_name, "simulate" ); - control->ensemble = NVE; - control->nsteps = 0; - control->dt = 0.0; control->nthreads = 1; - control->geo_format = 1; - control->restart = 0; - out_control->restart_format = WRITE_BINARY; - out_control->restart_freq = 0; - control->reposition_atoms = 0; - control->restrict_bonds = 0; - control->remove_CoM_vel = 25; out_control->debug_level = 0; out_control->energy_update_freq = 0; - control->reneighbor = 1; - control->vlist_cut = control->nonb_cut; control->bond_cut = 5.0; control->bg_cut = 0.3; control->thb_cut = 0.001; @@ -76,23 +64,6 @@ void Read_Control_File(const char *control_file, control_params *control, control->tabulate = 0; - control->qeq_freq = 1; - control->q_err = 1e-6; - control->refactor = 100; - control->droptol = 1e-2;; - - control->T_init = 0.; - control->T_final = 300.; - control->Tau_T = 500.0; - control->T_mode = 0; - control->T_rate = 1.; - control->T_freq = 1.; - - control->P[0] = control->P[1] = control->P[2] = 0.000101325; - control->Tau_P[0] = control->Tau_P[1] = control->Tau_P[2] = 500.0; - control->Tau_PT[0] = control->Tau_PT[1] = control->Tau_PT[2] = 500.0; - control->compressibility = 1.0; - control->press_mode = 0; control->virial = 0; out_control->write_steps = 0; @@ -103,13 +74,6 @@ void Read_Control_File(const char *control_file, control_params *control, out_control->bond_info = 0; out_control->angle_info = 0; - control->molecular_analysis = 0; - control->dipole_anal = 0; - control->freq_dipole_anal = 0; - control->diffusion_coef = 0; - control->freq_diffusion_coef = 0; - control->restrict_type = 0; - /* memory allocations */ s = (char*) malloc(sizeof(char)*MAX_LINE); tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); @@ -125,14 +89,10 @@ void Read_Control_File(const char *control_file, control_params *control, strcpy( control->sim_name, tmp[1] ); } else if (strcmp(tmp[0], "ensemble_type") == 0) { - ival = atoi(tmp[1]); - control->ensemble = ival; - if (ival == iNPT || ival ==sNPT || ival == NPT) - control->virial = 1; + ; // ignore } else if (strcmp(tmp[0], "nsteps") == 0) { - ival = atoi(tmp[1]); - control->nsteps = ival; + ; // ignore } else if ( strcmp(tmp[0], "dt") == 0) { ; // ignore @@ -141,28 +101,22 @@ void Read_Control_File(const char *control_file, control_params *control, ; // ignore } else if (strcmp(tmp[0], "random_vel") == 0) { - ival = atoi(tmp[1]); - control->random_vel = ival; + ; // ignore } else if (strcmp(tmp[0], "restart_format") == 0) { - ival = atoi(tmp[1]); - out_control->restart_format = ival; + ; // ignore } else if (strcmp(tmp[0], "restart_freq") == 0) { - ival = atoi(tmp[1]); - out_control->restart_freq = ival; + ; // ignore } else if (strcmp(tmp[0], "reposition_atoms") == 0) { - ival = atoi(tmp[1]); - control->reposition_atoms = ival; + ; // ignore } else if (strcmp(tmp[0], "restrict_bonds") == 0) { - ival = atoi( tmp[1] ); - control->restrict_bonds = ival; + ; // ignore } else if (strcmp(tmp[0], "remove_CoM_vel") == 0) { - ival = atoi(tmp[1]); - control->remove_CoM_vel = ival; + ; // ignore } else if (strcmp(tmp[0], "debug_level") == 0) { ival = atoi(tmp[1]); @@ -173,12 +127,10 @@ void Read_Control_File(const char *control_file, control_params *control, out_control->energy_update_freq = ival; } else if (strcmp(tmp[0], "reneighbor") == 0) { - ival = atoi( tmp[1] ); - control->reneighbor = ival; + ; // ignore } else if (strcmp(tmp[0], "vlist_buffer") == 0) { - val = atof(tmp[1]); - control->vlist_cut= val + control->nonb_cut; + ; // ignore } else if (strcmp(tmp[0], "nbrhood_cutoff") == 0) { val = atof(tmp[1]); @@ -201,97 +153,59 @@ void Read_Control_File(const char *control_file, control_params *control, control->hbond_cut = val; } else if (strcmp(tmp[0], "ghost_cutoff") == 0) { - val = atof(tmp[1]); - control->user_ghost_cut = val; + ; // ignore } else if (strcmp(tmp[0], "tabulate_long_range") == 0) { ival = atoi( tmp[1] ); control->tabulate = ival; } else if (strcmp(tmp[0], "qeq_freq") == 0) { - ival = atoi( tmp[1] ); - control->qeq_freq = ival; + ; // ignore } else if (strcmp(tmp[0], "q_err") == 0) { - val = atof( tmp[1] ); - control->q_err = val; + ; // ignore } else if (strcmp(tmp[0], "ilu_refactor") == 0) { - ival = atoi( tmp[1] ); - control->refactor = ival; + ; // ignore } else if (strcmp(tmp[0], "ilu_droptol") == 0) { - val = atof( tmp[1] ); - control->droptol = val; + ; // ignore } else if (strcmp(tmp[0], "temp_init") == 0) { - val = atof(tmp[1]); - control->T_init = val; - - if (control->T_init < 0.1) - control->T_init = 0.1; + ; // ignore } else if (strcmp(tmp[0], "temp_final") == 0) { - val = atof(tmp[1]); - control->T_final = val; - - if (control->T_final < 0.1) - control->T_final = 0.1; + ; // ignore } else if (strcmp(tmp[0], "t_mass") == 0) { - val = atof(tmp[1]); - control->Tau_T = val * 1.e-3; // convert t_mass from fs to ps + ; // ignore } else if (strcmp(tmp[0], "t_mode") == 0) { - ival = atoi(tmp[1]); - control->T_mode = ival; + ; // ignore } else if (strcmp(tmp[0], "t_rate") == 0) { - val = atof(tmp[1]); - control->T_rate = val; + ; // ignore } else if (strcmp(tmp[0], "t_freq") == 0) { - val = atof(tmp[1]); - control->T_freq = val; + ; // ignore } else if (strcmp(tmp[0], "pressure") == 0) { - if (control->ensemble == iNPT) { - control->P[0] = control->P[1] = control->P[2] = atof(tmp[1]); - } - else if (control->ensemble == sNPT) { - control->P[0] = atof(tmp[1]); - control->P[1] = atof(tmp[2]); - control->P[2] = atof(tmp[3]); - } + ; // ignore } else if (strcmp(tmp[0], "p_mass") == 0) { - // convert p_mass from fs to ps - if (control->ensemble == iNPT) { - control->Tau_P[0] = control->Tau_P[1] = control->Tau_P[2] = - atof(tmp[1]) * 1.e-3; - } - else if (control->ensemble == sNPT) { - control->Tau_P[0] = atof(tmp[1]) * 1.e-3; - control->Tau_P[1] = atof(tmp[2]) * 1.e-3; - control->Tau_P[2] = atof(tmp[3]) * 1.e-3; - } + ; // ignore } else if (strcmp(tmp[0], "pt_mass") == 0) { - val = atof(tmp[1]); - control->Tau_PT[0] = control->Tau_PT[1] = control->Tau_PT[2] = - val * 1.e-3; // convert pt_mass from fs to ps + ; // ignore } else if (strcmp(tmp[0], "compress") == 0) { - val = atof(tmp[1]); - control->compressibility = val; + ; // ignore } else if (strcmp(tmp[0], "press_mode") == 0) { - ival = atoi(tmp[1]); - control->press_mode = ival; + ; // ignore } else if (strcmp(tmp[0], "geo_format") == 0) { - ival = atoi( tmp[1] ); - control->geo_format = ival; + ; // ignore } else if (strcmp(tmp[0], "write_freq") == 0) { ival = atoi(tmp[1]); @@ -329,33 +243,25 @@ void Read_Control_File(const char *control_file, control_params *control, out_control->angle_info = ival; } else if (strcmp(tmp[0], "molecular_analysis") == 0) { - ival = atoi(tmp[1]); - control->molecular_analysis = ival; + ; // ignore } else if (strcmp(tmp[0], "ignore") == 0) { - control->num_ignored = atoi(tmp[1]); - for (i = 0; i < control->num_ignored; ++i) - control->ignore[atoi(tmp[i+2])] = 1; + ; // ignore } else if (strcmp(tmp[0], "dipole_anal") == 0) { - ival = atoi(tmp[1]); - control->dipole_anal = ival; + ; // ignore } else if (strcmp(tmp[0], "freq_dipole_anal") == 0) { - ival = atoi(tmp[1]); - control->freq_dipole_anal = ival; + ; // ignore } else if (strcmp(tmp[0], "diffusion_coef") == 0) { - ival = atoi(tmp[1]); - control->diffusion_coef = ival; + ; // ignore } else if (strcmp(tmp[0], "freq_diffusion_coef") == 0) { - ival = atoi(tmp[1]); - control->freq_diffusion_coef = ival; + ; // ignore } else if (strcmp(tmp[0], "restrict_type") == 0) { - ival = atoi(tmp[1]); - control->restrict_type = ival; + ; // ignore } else { char errmsg[128]; @@ -364,11 +270,6 @@ void Read_Control_File(const char *control_file, control_params *control, } } - /* determine target T */ - if (control->T_mode == 0) - control->T = control->T_final; - else control->T = control->T_init; - /* free memory allocations at the top */ for (i = 0; i < MAX_TOKENS; i++) free( tmp[i] ); diff --git a/src/USER-REAXC/reaxc_defs.h b/src/USER-REAXC/reaxc_defs.h index 3ead22842a..4103f06129 100644 --- a/src/USER-REAXC/reaxc_defs.h +++ b/src/USER-REAXC/reaxc_defs.h @@ -115,12 +115,9 @@ #define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ /******************* ENUMERATIONS *************************/ -enum geo_formats { CUSTOM, PDB, ASCII_RESTART, BINARY_RESTART, GF_N }; enum restart_formats { WRITE_ASCII, WRITE_BINARY, RF_N }; -enum ensembles { NVE, bNVT, nhNVT, sNPT, iNPT, NPT, ens_N }; - enum lists { BONDS, OLD_BONDS, THREE_BODIES, HBONDS, FAR_NBRS, DBOS, DDELTAS, LIST_N }; diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 0289c08504..f5f3db89ad 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -180,7 +180,7 @@ void Init_Forces_noQEq( reax_system *system, control_params *control, int type_i, type_j; int btop_i, num_bonds, num_hbonds; int ihb, jhb, ihb_top, jhb_top; - int local, flag, renbr; + int local, flag; double cutoff; reax_list *far_nbrs, *bonds, *hbonds; single_body_parameters *sbp_i, *sbp_j; @@ -201,7 +201,6 @@ void Init_Forces_noQEq( reax_system *system, control_params *control, num_bonds = 0; num_hbonds = 0; btop_i = 0; - renbr = (data->step-data->prev_steps) % control->reneighbor == 0; for (i = 0; i < system->N; ++i) { atom_i = &(system->my_atoms[i]); @@ -235,22 +234,9 @@ void Init_Forces_noQEq( reax_system *system, control_params *control, j = nbr_pj->nbr; atom_j = &(system->my_atoms[j]); - if (renbr) { - if (nbr_pj->d <= cutoff) - flag = 1; - else flag = 0; - } else { - nbr_pj->dvec[0] = atom_j->x[0] - atom_i->x[0]; - nbr_pj->dvec[1] = atom_j->x[1] - atom_i->x[1]; - nbr_pj->dvec[2] = atom_j->x[2] - atom_i->x[2]; - nbr_pj->d = rvec_Norm_Sqr( nbr_pj->dvec ); - if (nbr_pj->d <= SQR(cutoff)) { - nbr_pj->d = sqrt(nbr_pj->d); - flag = 1; - } else { - flag = 0; - } - } + if (nbr_pj->d <= cutoff) + flag = 1; + else flag = 0; if (flag) { type_j = atom_j->type; diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 23c20d1c21..9009f7995c 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -78,7 +78,7 @@ int Init_Simulation_Data(reax_system *system, control_params *control, data->timing.start = MPI_Wtime(); } - data->step = data->prev_steps = 0; + data->step = 0; return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 52e6a0c108..581ddf84ec 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -60,20 +60,6 @@ int Init_Output_Files(reax_system *system, control_params *control, } /* init pressure file */ - if ( control->ensemble == NPT || - control->ensemble == iNPT || - control->ensemble == sNPT) { - sprintf( temp, "%s.prs", control->sim_name ); - if ((out_control->prs = fopen( temp, "w" )) != nullptr) { - fprintf(out_control->prs,"%8s%13s%13s%13s%13s%13s%13s%13s\n", - "step", "Pint/norm[x]", "Pint/norm[y]", "Pint/norm[z]", - "Pext/Ptot[x]", "Pext/Ptot[y]", "Pext/Ptot[z]", "Pkin/V" ); - fflush( out_control->prs ); - } else { - strcpy(msg,"init_out_controls: .prs file couldn't be opened\n"); - return FAILURE; - } - } } return SUCCESS; @@ -135,8 +121,7 @@ void Output_Results(reax_system *system, control_params *control, } /* write current frame */ - if ( out_control->write_steps > 0 && - (data->step-data->prev_steps) % out_control->write_steps == 0) { + if ( out_control->write_steps > 0 && data->step % out_control->write_steps == 0) { Append_Frame( system, control, data, lists, out_control, world); } } diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 4367be8217..fa56b471ff 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -73,31 +73,10 @@ void Reset_Energies( energy_data *en ) en->e_tot = 0; } - -void Reset_Temperatures( simulation_data *data ) -{ - data->therm.T = 0; -} - - -void Reset_Pressures( simulation_data *data ) -{ - data->flex_bar.P_scalar = 0; - rtensor_MakeZero( data->flex_bar.P ); - - data->iso_bar.P = 0; - rvec_MakeZero( data->int_press ); - rvec_MakeZero( data->my_ext_press ); - rvec_MakeZero( data->ext_press ); -} - - void Reset_Simulation_Data( simulation_data* data, int /*virial*/ ) { Reset_Energies( &data->my_en ); Reset_Energies( &data->sys_en ); - Reset_Temperatures( data ); - Reset_Pressures( data ); } diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index f97a80f023..da7c7955e5 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -63,11 +63,6 @@ int Write_Header(reax_system *system, control_params *control, output_controls *out_control) { int num_hdr_lines, my_hdr_lines, buffer_req; - char ensembles[ens_N][25] = { "NVE", "NVT", "fully flexible NPT", - "semi isotropic NPT", "isotropic NPT" }; - char reposition[3][25] = { "fit to periodic box", "CoM to center of box", - "CoM to origin" }; - char t_regime[3][25] = { "T-coupling only", "step-wise", "constant slope" }; char traj_methods[TF_N][10] = { "custom", "xyz" }; char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", @@ -106,29 +101,23 @@ int Write_Header(reax_system *system, control_params *control, sprintf( out_control->line, BIGINT_LINE, "number_of_atoms:", system->bigN ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "ensemble_type:", - ensembles[ control->ensemble ] ); + sprintf( out_control->line, STR_LINE, "ensemble_type:", "(unknown)"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, INT_LINE, "number_of_steps:", - control->nsteps ); + sprintf( out_control->line, INT_LINE, "number_of_steps:", 0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "timestep_length_(in_fs):", - control->dt * 1000 ); + sprintf( out_control->line, REAL_LINE, "timestep_length_(in_fs):", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* restart info */ - sprintf( out_control->line, STR_LINE, "is_this_a_restart?:", - (control->restart ? "yes" : "no") ); + sprintf( out_control->line, STR_LINE, "is_this_a_restart?:", "no"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "write_restart_files?:", - ((out_control->restart_freq > 0) ? "yes" : "no") ); + sprintf( out_control->line, STR_LINE, "write_restart_files?:", "no"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, INT_LINE, "frequency_to_write_restarts:", - out_control->restart_freq ); + sprintf( out_control->line, INT_LINE, "frequency_to_write_restarts:", 0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* preferences */ @@ -139,23 +128,18 @@ int Write_Header(reax_system *system, control_params *control, sprintf( out_control->line, INT_LINE, "table_size:", control->tabulate ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "restrict_bonds?:", - (control->restrict_bonds ? "yes" : "no") ); + sprintf( out_control->line, STR_LINE, "restrict_bonds?:", "no"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, INT_LINE, "bond_restriction_length:", - control->restrict_bonds ); + sprintf( out_control->line, INT_LINE, "bond_restriction_length:", 0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "reposition_atoms?:", - reposition[control->reposition_atoms] ); + sprintf( out_control->line, STR_LINE, "reposition_atoms?:", "fit to periodic box"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, INT_LINE, "remove_CoM_velocity?:", - (control->ensemble==NVE) ? 0 : control->remove_CoM_vel); + sprintf( out_control->line, INT_LINE, "remove_CoM_velocity?:", 0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - /* cut-off values */ sprintf( out_control->line, REAL_LINE, "bonded_intr_dist_cutoff:", control->bond_cut ); @@ -181,37 +165,30 @@ int Write_Header(reax_system *system, control_params *control, control->thb_cut ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, SCI_LINE, "QEq_tolerance:", control->q_err ); + sprintf( out_control->line, SCI_LINE, "QEq_tolerance:", 0.0 ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* temperature controls */ - sprintf( out_control->line, REAL_LINE, "initial_temperature:", - control->T_init ); + sprintf( out_control->line, REAL_LINE, "initial_temperature:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "target_temperature:", - control->T_final ); + sprintf( out_control->line, REAL_LINE, "target_temperature:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "thermal_inertia:", - control->Tau_T ); + sprintf( out_control->line, REAL_LINE, "thermal_inertia:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "temperature_regime:", - t_regime[ control->T_mode ] ); + sprintf( out_control->line, STR_LINE, "temperature_regime:", "(unknown)"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "temperature_change_rate_(K/ps):", - control->T_rate / control->T_freq ); + sprintf( out_control->line, REAL_LINE, "temperature_change_rate_(K/ps):", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* pressure controls */ - sprintf( out_control->line, REAL3_LINE, "target_pressure_(GPa):", - control->P[0], control->P[1], control->P[2] ); + sprintf( out_control->line, REAL3_LINE, "target_pressure_(GPa):", 0.0, 0.0, 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL3_LINE, "virial_inertia:", - control->Tau_P[0], control->Tau_P[1], control->Tau_P[2] ); + sprintf( out_control->line, REAL3_LINE, "virial_inertia:", 0.0, 0.0, 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* trajectory */ @@ -244,12 +221,9 @@ int Write_Header(reax_system *system, control_params *control, strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* analysis */ - //sprintf( out_control->line, STR_LINE, "molecular_analysis:", - // (control->molec_anal ? "yes" : "no") ); - //strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "molecular_analysis_frequency:", - control->molecular_analysis ); + sprintf( out_control->line, STR_LINE, "molecular_analysis:", "no"); + strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + sprintf( out_control->line, INT_LINE, "molecular_analysis_frequency:", 0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); } @@ -383,11 +357,9 @@ int Write_Frame_Header(reax_system *system, control_params *control, sprintf( out_control->line, INT_LINE, "step:", data->step ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "time_in_ps:", - data->step * control->dt ); + sprintf( out_control->line, REAL_LINE, "time_in_ps:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - /* box info */ sprintf( out_control->line, REAL_LINE, "volume:", 0.0 ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); @@ -399,17 +371,13 @@ int Write_Frame_Header(reax_system *system, control_params *control, "coordinate_angles:", 90.0, 90.0, 90.0 ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - /* system T and P */ - sprintf( out_control->line, REAL_LINE, "temperature:", data->therm.T ); + sprintf( out_control->line, REAL_LINE, "temperature:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "pressure:", - (control->ensemble==iNPT) ? - data->iso_bar.P : data->flex_bar.P_scalar ); + sprintf( out_control->line, REAL_LINE, "pressure:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - /* energies */ sprintf( out_control->line, REAL_LINE, "total_energy:", data->sys_en.e_tot ); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index ee2db705d5..b8be985994 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -279,30 +279,10 @@ struct control_params { char sim_name[REAX_MAX_STR]; int nthreads; - /* ensemble values: - 0 : NVE - 1 : bNVT (Berendsen) - 2 : nhNVT (Nose-Hoover) - 3 : sNPT (Parrinello-Rehman-Nose-Hoover) semiisotropic - 4 : iNPT (Parrinello-Rehman-Nose-Hoover) isotropic - 5 : NPT (Parrinello-Rehman-Nose-Hoover) Anisotropic*/ - int ensemble; - int nsteps; - double dt; - int geo_format; - int restart; - int restrict_bonds; - int remove_CoM_vel; - int random_vel; - int reposition_atoms; - - int reneighbor; - double vlist_cut; double bond_cut; double nonb_cut, nonb_low; double hbond_cut; - double user_ghost_cut; double bg_cut; double bo_cut; @@ -310,31 +290,7 @@ struct control_params double thb_cutsq; int tabulate; - - int qeq_freq; - double q_err; - int refactor; - double droptol; - - double T_init, T_final, T; - double Tau_T; - int T_mode; - double T_rate, T_freq; - int virial; - rvec P, Tau_P, Tau_PT; - int press_mode; - double compressibility; - - int molecular_analysis; - int num_ignored; - int ignore[REAX_MAX_ATOM_TYPES]; - - int dipole_anal; - int freq_dipole_anal; - int diffusion_coef; - int freq_diffusion_coef; - int restrict_type; int lgflag; int enobondsflag; @@ -343,43 +299,6 @@ struct control_params int me; }; -struct thermostat -{ - double T; - double xi; - double v_xi; - double v_xi_old; - double G_xi; - -}; - -struct isotropic_barostat -{ - double P; - double eps; - double v_eps; - double v_eps_old; - double a_eps; - -}; - -struct flexible_barostat -{ - rtensor P; - double P_scalar; - - double eps; - double v_eps; - double v_eps_old; - double a_eps; - - rtensor h0; - rtensor v_g0; - rtensor v_g0_old; - rtensor a_g0; - -}; - struct reax_timing { double start; @@ -420,8 +339,7 @@ struct energy_data struct simulation_data { - int step; - int prev_steps; + rc_bigint step; double time; double M; // Total Mass @@ -444,9 +362,6 @@ struct simulation_data double N_f; //Number of degrees of freedom rvec t_scale; rtensor p_scale; - thermostat therm; // Used in Nose_Hoover method - isotropic_barostat iso_bar; - flexible_barostat flex_bar; double inv_W; double kin_press; @@ -552,7 +467,6 @@ struct storage /* QEq storage */ sparse_matrix *H, *L, *U; double *Hdia_inv, *b_s, *b_t, *b_prc, *b_prm, *s, *t; - double *droptol; rvec2 *b, *x; /* GMRES storage */ From f0369ce72d365a47d69887c678fcc351e5f921e6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 07:06:56 -0400 Subject: [PATCH 017/352] remove unused timing data structure --- src/USER-OMP/pair_reaxc_omp.cpp | 8 -------- src/USER-OMP/reaxc_init_md_omp.cpp | 7 ++----- src/USER-REAXC/pair_reaxc.cpp | 8 -------- src/USER-REAXC/reaxc_init_md.cpp | 16 ++-------------- src/USER-REAXC/reaxc_reset_tools.cpp | 15 --------------- src/USER-REAXC/reaxc_reset_tools.h | 1 - src/USER-REAXC/reaxc_types.h | 19 ------------------- 7 files changed, 4 insertions(+), 70 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 505ca1467f..e754316ea0 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -178,7 +178,6 @@ PairReaxCOMP::~PairReaxCOMP() void PairReaxCOMP::compute(int eflag, int vflag) { double evdwl,ecoul; - double t_start, t_end; // communicate num_bonds once every reneighboring // 2 num arrays stored by fix, grab ptr to them @@ -201,7 +200,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system - if (comm->me == 0 ) t_start = MPI_Wtime(); // setup data structures setup(); @@ -213,12 +211,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) //workspace->realloc.num_far = write_reax_lists(); write_reax_lists(); - // timing for filling in the reax lists - if (comm->me == 0) { - t_end = MPI_Wtime(); - data->timing.nbrs = t_end - t_start; - } - // forces #ifdef OMP_TIMING diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index bb7d102141..9652b52fe7 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -42,7 +42,7 @@ // Functions defined in reaxc_init_md.cpp extern void Init_System(reax_system*, control_params*); -extern int Init_Simulation_Data(reax_system*, control_params*, simulation_data*, char*); +extern void Init_Simulation_Data(control_params*, simulation_data*); extern int Init_Workspace(reax_system*, control_params*, storage*, char*); /* ---------------------------------------------------------------------- */ @@ -123,10 +123,7 @@ void InitializeOMP(reax_system *system, control_params *control, LAMMPS_NS::Error *error = system->error_ptr; Init_System(system,control); - - if (Init_Simulation_Data(system,control,data,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Sim_data could not be " - "initialized! Terminating.",msg)); + Init_Simulation_Data(control,data); if (Init_Workspace(system,control,workspace,msg) == FAILURE) error->one(FLERR,"init_workspace: not enough memory. " diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 768827fb58..cb1fe5f64d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -477,7 +477,6 @@ double PairReaxC::init_one(int i, int j) void PairReaxC::compute(int eflag, int vflag) { double evdwl,ecoul; - double t_start, t_end; // communicate num_bonds once every reneighboring // 2 num arrays stored by fix, grab ptr to them @@ -496,19 +495,12 @@ void PairReaxC::compute(int eflag, int vflag) system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system - if (comm->me == 0 ) t_start = MPI_Wtime(); - // setup data structures setup(); Reset( system, control, data, workspace, &lists ); workspace->realloc.num_far = write_reax_lists(); - // timing for filling in the reax lists - if (comm->me == 0) { - t_end = MPI_Wtime(); - data->timing.nbrs = t_end - t_start; - } // forces diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 9009f7995c..b9d46fc3f1 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -68,19 +68,10 @@ void Init_System(reax_system *system, control_params *control) } -int Init_Simulation_Data(reax_system *system, control_params *control, - simulation_data *data, char * /*msg*/) +void Init_Simulation_Data(control_params *control, simulation_data *data) { Reset_Simulation_Data(data, control->virial); - - /* initialize the timer(s) */ - if (system->my_rank == MASTER_NODE) { - data->timing.start = MPI_Wtime(); - } - data->step = 0; - - return SUCCESS; } void Init_Taper(control_params *control, storage *workspace) @@ -210,10 +201,7 @@ void Initialize(reax_system *system, control_params *control, LAMMPS_NS::Error *error = system->error_ptr; Init_System(system,control); - - if (Init_Simulation_Data( system,control,data,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Sim_data could not be " - "initialized! Terminating.",msg)); + Init_Simulation_Data(control,data); if (Init_Workspace( system,control,workspace,msg) == FAILURE) error->one(FLERR,"init_workspace: not enough memory. " diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index fa56b471ff..c32fe6a602 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -79,20 +79,6 @@ void Reset_Simulation_Data( simulation_data* data, int /*virial*/ ) Reset_Energies( &data->sys_en ); } - -void Reset_Timing( reax_timing *rt ) -{ - rt->total = MPI_Wtime(); - rt->comm = 0; - rt->nbrs = 0; - rt->init_forces = 0; - rt->bonded = 0; - rt->nonb = 0; - rt->qEq = 0; - rt->s_matvecs = 0; - rt->t_matvecs = 0; -} - void Reset_Workspace( reax_system *system, storage *workspace ) { memset( workspace->total_bond_order, 0, system->total_cap * sizeof( double ) ); @@ -102,7 +88,6 @@ void Reset_Workspace( reax_system *system, storage *workspace ) } - void Reset_Neighbor_Lists( reax_system *system, control_params *control, storage *workspace, reax_list **lists ) { diff --git a/src/USER-REAXC/reaxc_reset_tools.h b/src/USER-REAXC/reaxc_reset_tools.h index 20d1ab6964..39cda0ac9b 100644 --- a/src/USER-REAXC/reaxc_reset_tools.h +++ b/src/USER-REAXC/reaxc_reset_tools.h @@ -31,7 +31,6 @@ void Reset_Pressures( simulation_data* ); void Reset_Simulation_Data( simulation_data*, int ); -void Reset_Timing( reax_timing* ); void Reset_Workspace( reax_system*, storage* ); void Reset_Neighbor_Lists( reax_system*, control_params*, storage*, reax_list** ); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index b8be985994..87543ca155 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -299,23 +299,6 @@ struct control_params int me; }; -struct reax_timing -{ - double start; - double end; - double elapsed; - - double total; - double comm; - double nbrs; - double init_forces; - double bonded; - double nonb; - double qEq; - int s_matvecs; - int t_matvecs; -}; - struct energy_data { double e_tot; @@ -369,8 +352,6 @@ struct simulation_data rvec my_ext_press; rvec ext_press; rvec tot_press; - - reax_timing timing; }; struct three_body_interaction_data From def09d4d7a4209562ca2d4bd729bbc9b807df45f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 07:26:53 -0400 Subject: [PATCH 018/352] remove unused simulation data struct members and related code --- src/USER-OMP/reaxc_bond_orders_omp.cpp | 18 +-------------- src/USER-OMP/reaxc_forces_omp.cpp | 8 ------- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 9 ++------ src/USER-OMP/reaxc_nonbonded_omp.cpp | 11 ++------- src/USER-OMP/reaxc_torsion_angles_omp.cpp | 16 +------------- src/USER-OMP/reaxc_valence_angles_omp.cpp | 8 +------ src/USER-REAXC/reaxc_allocate.cpp | 3 --- src/USER-REAXC/reaxc_bond_orders.cpp | 20 ++--------------- src/USER-REAXC/reaxc_hydrogen_bonds.cpp | 9 ++------ src/USER-REAXC/reaxc_io_tools.cpp | 21 ------------------ src/USER-REAXC/reaxc_nonbonded.cpp | 10 ++------- src/USER-REAXC/reaxc_torsion_angles.cpp | 17 +------------- src/USER-REAXC/reaxc_types.h | 27 ----------------------- src/USER-REAXC/reaxc_valence_angles.cpp | 6 +---- 14 files changed, 15 insertions(+), 168 deletions(-) diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index 499c5f2933..aaebe9c83c 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -234,8 +234,7 @@ void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, bond_data *nbr_j, *nbr_k; bond_order_data *bo_ij, *bo_ji; dbond_coefficients coef; - rvec temp, ext_press; - ivec rel_box; + rvec temp; int pk, k, j; #if defined(_OPENMP) @@ -285,10 +284,6 @@ void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, /* force */ rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); - - /* pressure */ - rvec_iMultiply( ext_press, nbr_k->rel_box, temp ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } /* then atom i itself */ @@ -318,13 +313,6 @@ void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, /* force */ rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); - - /* pressure */ - if (k != i) { - ivec_Sum( rel_box, nbr_k->rel_box, nbr_j->rel_box ); //rel_box(k, i) - rvec_iMultiply( ext_press, rel_box, temp ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - } } /* then atom j itself */ @@ -343,10 +331,6 @@ void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, /* force */ rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); - - /* pressure */ - rvec_iMultiply( ext_press, nbr_j->rel_box, temp ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 4bed7a3828..956621f4db 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -247,14 +247,6 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, } } // parallel region - if (control->virial) - for (int i=0; i < nthreads; ++i) { - rvec_Add(data->my_ext_press, workspace->my_ext_pressReduction[i]); - workspace->my_ext_pressReduction[i][0] = 0; - workspace->my_ext_pressReduction[i][1] = 0; - workspace->my_ext_pressReduction[i][2] = 0; - } - #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTETFINDEX] += (endTimeBase-startTimeBase); diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index c0fe4e3792..b21b8b7cac 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -72,7 +72,7 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; double e_hb, e_hb_thr = 0.0, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force, ext_press; + rvec dvec_jk, force; hbond_parameters *hbp; bond_order_data *bo_ij; bond_data *pbond_ij; @@ -197,23 +197,18 @@ void Hydrogen_BondsOMP( reax_system *system, control_params *control, derivatives are added directly into pressure vector/tensor */ rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms rvec_Add(workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); rvec_Scale( force, +CEhb2, dcos_theta_dk ); rvec_Add(workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, rel_jk, force ); - rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); // dr terms rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk ); rvec_Scale( force, CEhb3/r_jk, dvec_jk ); rvec_Add(workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, rel_jk, force ); - rvec_ScaledAdd( workspace->my_ext_pressReduction[tid],1.0, ext_press ); } /* tally into per-atom virials */ diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 3a4214d306..f4a4e988bc 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -75,7 +75,7 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, double e_ele, e_vdW, e_core; const double SMALL = 0.0001; double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp, ext_press; + rvec temp; two_body_parameters *twbp; far_neighbor_data *nbr_pj; @@ -230,10 +230,6 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); rvec_ScaledAdd( workspace->f[reductionOffset+i], -1., temp ); rvec_Add( workspace->forceReduction[reductionOffset+j], temp); - - rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); - - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } } } @@ -273,7 +269,7 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro double e_vdW, e_ele; double CEvd, CEclmb; double f_tmp, delij[3]; - rvec temp, ext_press; + rvec temp; far_neighbor_data *nbr_pj; LR_lookup_table *t; #if defined(_OPENMP) @@ -370,9 +366,6 @@ void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *contro rvec_ScaledAdd( workspace->f[i], -1., temp ); rvec_Add( workspace->forceReduction[froffset+j], temp ); - - rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } } } diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index cb92a9a68c..9fe2542b47 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -103,7 +103,7 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, double CEconj4, CEconj5, CEconj6; double e_tor, e_con; rvec dvec_li; - rvec force, ext_press; + rvec force; ivec rel_box_jl; // rtensor total_rtensor, temp_rtensor; four_body_header *fbh; @@ -373,16 +373,12 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, /* dcos_theta_ijk */ rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); rvec_ScaledAdd( workspace->f[j], CEtors7 + CEconj4, p_ijk->dcos_dj ); rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); /* dcos_theta_jkl */ rvec_ScaledAdd( workspace->f[j], @@ -390,32 +386,22 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+l], force ); - rvec_iMultiply( ext_press, rel_box_jl, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); /* dcos_omega */ rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); rvec_ScaledAdd( workspace->f[j], CEtors9 + CEconj6, dcos_omega_dj ); rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dk ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dl ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, rel_box_jl, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } /* tally into per-atom virials */ diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 8b6f1e7617..7c417c0678 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -154,7 +154,7 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double f7_ij, f7_jk, f8_Dj, f9_Dj; double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; double BOA_ij, BOA_jk; - rvec force, ext_press; + rvec force; // rtensor temp_rtensor, total_rtensor; // Tallying variables @@ -552,16 +552,10 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, rvec_Scale( force, CEval8, p_ijk->dcos_di ); rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); rvec_Scale( force, CEval8, p_ijk->dcos_dk ); rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( workspace->my_ext_pressReduction[tid], ext_press ); } /* tally into per-atom virials */ diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 0c565e5c33..455e8f9ada 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -60,7 +60,6 @@ int PreAllocate_Space( reax_system *system, control_params * /*control*/, workspace->CdDeltaReduction = nullptr; workspace->forceReduction = nullptr; workspace->valence_angle_atom_myoffset = nullptr; - workspace->my_ext_pressReduction = nullptr; #else LMP_UNUSED_PARAM(workspace); #endif @@ -201,7 +200,6 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) if (workspace->CdDeltaReduction) sfree(control->error_ptr, workspace->CdDeltaReduction, "cddelta_reduce" ); if (workspace->forceReduction) sfree(control->error_ptr, workspace->forceReduction, "f_reduce" ); if (workspace->valence_angle_atom_myoffset) sfree(control->error_ptr, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); - if (workspace->my_ext_pressReduction) sfree(control->error_ptr, workspace->my_ext_pressReduction, "ext_press_reduce"); #endif } @@ -306,7 +304,6 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, "forceReduction"); workspace->valence_angle_atom_myoffset = (int *) scalloc(control->error_ptr, sizeof(int), total_cap, "valence_angle_atom_myoffset"); - workspace->my_ext_pressReduction = (rvec *) calloc(sizeof(rvec), control->nthreads); #else LMP_UNUSED_PARAM(control); #endif diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index 6a854e1805..0c26784ccb 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -32,15 +32,14 @@ #include "reaxc_list.h" #include "reaxc_vector.h" -void Add_dBond_to_Forces_NPT( int i, int pj, simulation_data *data, +void Add_dBond_to_Forces_NPT( int i, int pj, storage *workspace, reax_list **lists ) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; bond_order_data *bo_ij, *bo_ji; dbond_coefficients coef; - rvec temp, ext_press; - ivec rel_box; + rvec temp; int pk, k, j; /* Initializations */ @@ -78,10 +77,6 @@ void Add_dBond_to_Forces_NPT( int i, int pj, simulation_data *data, /* force */ rvec_Add( workspace->f[k], temp ); - /* pressure */ - rvec_iMultiply( ext_press, nbr_k->rel_box, temp ); - rvec_Add( data->my_ext_press, ext_press ); - } /* then atom i itself */ @@ -111,13 +106,6 @@ void Add_dBond_to_Forces_NPT( int i, int pj, simulation_data *data, /* force */ rvec_Add( workspace->f[k], temp ); - /* pressure */ - if (k != i) { - ivec_Sum( rel_box, nbr_k->rel_box, nbr_j->rel_box ); //rel_box(k, i) - rvec_iMultiply( ext_press, rel_box, temp ); - rvec_Add( data->my_ext_press, ext_press ); - - } } /* then atom j itself */ @@ -136,10 +124,6 @@ void Add_dBond_to_Forces_NPT( int i, int pj, simulation_data *data, /* force */ rvec_Add( workspace->f[j], temp ); - /* pressure */ - rvec_iMultiply( ext_press, nbr_j->rel_box, temp ); - rvec_Add( data->my_ext_press, ext_press ); - } void Add_dBond_to_Forces( reax_system *system, int i, int pj, diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp index ac94d7b62c..4391bf769a 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp @@ -46,7 +46,7 @@ void Hydrogen_Bonds( reax_system *system, control_params *control, double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; double e_hb, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force, ext_press; + rvec dvec_jk, force; hbond_parameters *hbp; bond_order_data *bo_ij; bond_data *pbond_ij; @@ -146,23 +146,18 @@ void Hydrogen_Bonds( reax_system *system, control_params *control, else { rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms rvec_Add( workspace->f[i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_ScaledAdd( data->my_ext_press, 1.0, ext_press ); rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); rvec_Scale( force, +CEhb2, dcos_theta_dk ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, rel_jk, force ); - rvec_ScaledAdd( data->my_ext_press, 1.0, ext_press ); + // dr terms rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); rvec_Scale( force, CEhb3/r_jk, dvec_jk ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, rel_jk, force ); - rvec_ScaledAdd( data->my_ext_press, 1.0, ext_press ); } /* tally into per-atom virials */ diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 581ddf84ec..8c962d2bad 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -99,27 +99,6 @@ void Output_Results(reax_system *system, control_params *control, /* update system-wide energies */ Compute_System_Energy(system, data, world); - /* output energies */ - if ( system->my_rank == MASTER_NODE && - out_control->energy_update_freq > 0 && - data->step % out_control->energy_update_freq == 0) { - - if (control->virial && out_control->prs) { - fprintf( out_control->prs, - "%8d%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f\n", - data->step, - data->int_press[0], data->int_press[1], data->int_press[2], - data->ext_press[0], data->ext_press[1], data->ext_press[2], - data->kin_press ); - - fprintf(out_control->prs, - "%8s%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f\n", "", 0.0, 0.0, 0.0, - data->tot_press[0], data->tot_press[1], data->tot_press[2], 0.0); - - fflush( out_control->prs); - } - } - /* write current frame */ if ( out_control->write_steps > 0 && data->step % out_control->write_steps == 0) { Append_Frame( system, control, data, lists, out_control, world); diff --git a/src/USER-REAXC/reaxc_nonbonded.cpp b/src/USER-REAXC/reaxc_nonbonded.cpp index 97790aa997..c5a1f808c5 100644 --- a/src/USER-REAXC/reaxc_nonbonded.cpp +++ b/src/USER-REAXC/reaxc_nonbonded.cpp @@ -46,7 +46,7 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control, double dr3gamij_1, dr3gamij_3; double e_ele, e_vdW, e_core, SMALL = 0.0001; double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp, ext_press; + rvec temp; two_body_parameters *twbp; far_neighbor_data *nbr_pj; reax_list *far_nbrs; @@ -190,9 +190,6 @@ void vdW_Coulomb_Energy( reax_system *system, control_params *control, rvec_ScaledAdd( workspace->f[i], -1., temp ); rvec_Add( workspace->f[j], temp ); - - rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); - rvec_Add( data->my_ext_press, ext_press ); } } } @@ -217,7 +214,7 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system,control_params *control, double CEvd, CEclmb, SMALL = 0.0001; double f_tmp, delij[3]; - rvec temp, ext_press; + rvec temp; far_neighbor_data *nbr_pj; reax_list *far_nbrs; LR_lookup_table *t; @@ -303,9 +300,6 @@ void Tabulated_vdW_Coulomb_Energy( reax_system *system,control_params *control, rvec_ScaledAdd( workspace->f[i], -1., temp ); rvec_Add( workspace->f[j], temp ); - - rvec_iMultiply( ext_press, nbr_pj->rel_box, temp ); - rvec_Add( data->my_ext_press, ext_press ); } } } diff --git a/src/USER-REAXC/reaxc_torsion_angles.cpp b/src/USER-REAXC/reaxc_torsion_angles.cpp index 305e83707d..08a64f3c24 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.cpp +++ b/src/USER-REAXC/reaxc_torsion_angles.cpp @@ -148,7 +148,7 @@ void Torsion_Angles( reax_system *system, control_params *control, double CEconj4, CEconj5, CEconj6; double e_tor, e_con; rvec dvec_li; - rvec force, ext_press; + rvec force; ivec rel_box_jl; // rtensor total_rtensor, temp_rtensor; four_body_header *fbh; @@ -390,17 +390,12 @@ void Torsion_Angles( reax_system *system, control_params *control, /* dcos_theta_ijk */ rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); rvec_Add( workspace->f[i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); rvec_ScaledAdd( workspace->f[j], CEtors7 + CEconj4, p_ijk->dcos_dj ); rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); - /* dcos_theta_jkl */ rvec_ScaledAdd( workspace->f[j], @@ -408,33 +403,23 @@ void Torsion_Angles( reax_system *system, control_params *control, rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); rvec_Add( workspace->f[l], force ); - rvec_iMultiply( ext_press, rel_box_jl, force ); - rvec_Add( data->my_ext_press, ext_press ); /* dcos_omega */ rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); rvec_Add( workspace->f[i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); rvec_ScaledAdd( workspace->f[j], CEtors9 + CEconj6, dcos_omega_dj ); rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dk ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dl ); rvec_Add( workspace->f[l], force ); - rvec_iMultiply( ext_press, rel_box_jl, force ); - rvec_Add( data->my_ext_press, ext_press ); } /* tally into per-atom virials */ diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 87543ca155..0880abf313 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -323,35 +323,9 @@ struct energy_data struct simulation_data { rc_bigint step; - double time; - - double M; // Total Mass - double inv_M; // 1 / Total Mass - - rvec xcm; // Center of mass - rvec vcm; // Center of mass velocity - rvec fcm; // Center of mass force - rvec amcm; // Angular momentum of CoM - rvec avcm; // Angular velocity of CoM - double etran_cm; // Translational kinetic energy of CoM - double erot_cm; // Rotational kinetic energy of CoM - - rtensor kinetic; // Kinetic energy tensor - rtensor virial; // Hydrodynamic virial energy_data my_en; energy_data sys_en; - - double N_f; //Number of degrees of freedom - rvec t_scale; - rtensor p_scale; - double inv_W; - - double kin_press; - rvec int_press; - rvec my_ext_press; - rvec ext_press; - rvec tot_press; }; struct three_body_interaction_data @@ -477,7 +451,6 @@ struct storage /* omp */ rvec *forceReduction; - rvec *my_ext_pressReduction; double *CdDeltaReduction; int *valence_angle_atom_myoffset; diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index 9aec0a1f05..78887e5ecc 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -102,7 +102,7 @@ void Valence_Angles( reax_system *system, control_params *control, double f7_ij, f7_jk, f8_Dj, f9_Dj; double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; double BOA_ij, BOA_jk; - rvec force, ext_press; + rvec force; // Tallying variables double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; @@ -364,15 +364,11 @@ void Valence_Angles( reax_system *system, control_params *control, } else { rvec_Scale( force, CEval8, p_ijk->dcos_di ); rvec_Add( workspace->f[i], force ); - rvec_iMultiply( ext_press, pbond_ij->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); rvec_Scale( force, CEval8, p_ijk->dcos_dk ); rvec_Add( workspace->f[k], force ); - rvec_iMultiply( ext_press, pbond_jk->rel_box, force ); - rvec_Add( data->my_ext_press, ext_press ); } /* tally into per-atom virials */ From 06a8f746cc3ea0182f39407b7b0c13e0acde8419 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 09:36:21 -0400 Subject: [PATCH 019/352] remove some more unused timer info and unused arguments --- src/USER-OMP/fix_qeq_reax_omp.cpp | 8 -------- src/USER-OMP/reaxc_bond_orders_omp.h | 13 ++++++------- src/USER-OMP/reaxc_forces_omp.cpp | 19 ++++--------------- src/USER-REAXC/fix_qeq_reax.cpp | 8 -------- src/USER-REAXC/fix_qeq_reax.h | 1 - src/USER-REAXC/reaxc_bond_orders.h | 3 +-- src/USER-REAXC/reaxc_forces.cpp | 2 +- 7 files changed, 12 insertions(+), 42 deletions(-) diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 7ddbe77f87..b1ab1e5d62 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -265,10 +265,7 @@ void FixQEqReaxOMP::pre_force(int /* vflag */) funcstartTimeBase = MPI_Wtime(); #endif - double t_start, t_end; - if (update->ntimestep % nevery) return; - if (comm->me == 0) t_start = MPI_Wtime(); int n = atom->nlocal; @@ -341,11 +338,6 @@ void FixQEqReaxOMP::pre_force(int /* vflag */) ompTimingData[COMPUTECALCQINDEX] += (endTimeBase-startTimeBase); #endif - if (comm->me == 0) { - t_end = MPI_Wtime(); - qeq_time = t_end - t_start; - } - #ifdef OMP_TIMING endTimeBase = MPI_Wtime(); ompTimingData[COMPUTEQEQINDEX] += (endTimeBase-funcstartTimeBase); diff --git a/src/USER-OMP/reaxc_bond_orders_omp.h b/src/USER-OMP/reaxc_bond_orders_omp.h index 2027a8628e..1711a9ca0c 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.h +++ b/src/USER-OMP/reaxc_bond_orders_omp.h @@ -31,14 +31,13 @@ #include "reaxc_types.h" -void Add_dBond_to_ForcesOMP( reax_system*, int, int, storage*, reax_list** ); -void Add_dBond_to_Forces_NPTOMP( reax_system *system, int, int, - simulation_data*, storage*, reax_list** ); +void Add_dBond_to_ForcesOMP(reax_system *, int, int, storage *, reax_list **); +void Add_dBond_to_Forces_NPTOMP(reax_system *, int, int, storage *, reax_list **); -int BOp_OMP(storage*, reax_list*, double, int, int, far_neighbor_data*, - single_body_parameters*, single_body_parameters*, two_body_parameters*, +int BOp_OMP(storage *, reax_list *, double, int, int, far_neighbor_data *, + single_body_parameters *, single_body_parameters *, two_body_parameters *, int, double, double, double, double, double, double, double); -void BOOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); +void BOOMP(reax_system *, control_params *, simulation_data *, + storage *, reax_list **, output_controls *); #endif diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 956621f4db..05a72c93eb 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -132,9 +132,8 @@ void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, /* this version of Compute_Total_Force computes forces from coefficients accumulated by all interaction functions. Saves enormous time & space! */ -void Compute_Total_ForceOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists) +void Compute_Total_ForceOMP(reax_system *system, control_params *control, + storage *workspace, reax_list **lists) { #ifdef OMP_TIMING double startTimeBase,endTimeBase; @@ -187,16 +186,6 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, } } -// #pragma omp for schedule(guided) //(dynamic,50) -// for (i = 0; i < system->N; ++i) -// for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) -// if (i < bonds->select.bond_list[pj].nbr) { -// if (control->virial == 0) -// Add_dBond_to_ForcesOMP( system, i, pj, workspace, lists ); -// else -// Add_dBond_to_Forces_NPTOMP(system, i, pj, data, workspace, lists ); -// } - if (control->virial == 0) { #if defined(_OPENMP) @@ -220,7 +209,7 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, const int endj = End_Index(i, bonds); for (pj = startj; pj < endj; ++pj) if (i < bonds->select.bond_list[pj].nbr) - Add_dBond_to_Forces_NPTOMP(system, i, pj, data, workspace, lists ); + Add_dBond_to_Forces_NPTOMP(system, i, pj, workspace, lists ); } } // if (virial == 0) @@ -603,5 +592,5 @@ void Compute_ForcesOMP( reax_system *system, control_params *control, lists, out_control); // Total Force - Compute_Total_ForceOMP( system, control, data, workspace, lists); + Compute_Total_ForceOMP( system, control, workspace, lists); } diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 3109950ff2..4fd177f76e 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -503,10 +503,7 @@ void FixQEqReax::init_storage() void FixQEqReax::pre_force(int /*vflag*/) { - double t_start, t_end; - if (update->ntimestep % nevery) return; - if (comm->me == 0) t_start = MPI_Wtime(); int n = atom->nlocal; @@ -538,11 +535,6 @@ void FixQEqReax::pre_force(int /*vflag*/) matvecs = matvecs_s + matvecs_t; calculate_Q(); - - if (comm->me == 0) { - t_end = MPI_Wtime(); - qeq_time = t_end - t_start; - } } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 5658167aca..932f2e3679 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -53,7 +53,6 @@ class FixQEqReax : public Fix { void min_pre_force(int); int matvecs; - double qeq_time; protected: int nevery,reaxflag; diff --git a/src/USER-REAXC/reaxc_bond_orders.h b/src/USER-REAXC/reaxc_bond_orders.h index 3631d90c89..09137a7afb 100644 --- a/src/USER-REAXC/reaxc_bond_orders.h +++ b/src/USER-REAXC/reaxc_bond_orders.h @@ -37,8 +37,7 @@ typedef struct{ }dbond_coefficients; void Add_dBond_to_Forces( reax_system*, int, int, storage*, reax_list** ); -void Add_dBond_to_Forces_NPT( int, int, simulation_data*, - storage*, reax_list** ); +void Add_dBond_to_Forces_NPT( int, int, storage*, reax_list** ); int BOp(storage*, reax_list*, double, int, int, far_neighbor_data*, single_body_parameters*, single_body_parameters*, two_body_parameters*); void BO( reax_system*, control_params*, simulation_data*, diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index f5f3db89ad..16224f2abb 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -108,7 +108,7 @@ void Compute_Total_Force(reax_system *system, control_params *control, if (control->virial == 0) Add_dBond_to_Forces( system, i, pj, workspace, lists ); else - Add_dBond_to_Forces_NPT( i, pj, data, workspace, lists ); + Add_dBond_to_Forces_NPT( i, pj, workspace, lists ); } } From 1fe2812c2bb0404f8ba9fe9e14accb0af7c62797 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 09:45:10 -0400 Subject: [PATCH 020/352] recover from CI compilation failure --- src/USER-OMP/reaxc_bond_orders_omp.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index aaebe9c83c..a2abb60f27 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -227,9 +227,8 @@ void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, /* ---------------------------------------------------------------------- */ -void Add_dBond_to_Forces_NPTOMP( reax_system *system, int i, int pj, - simulation_data * /* data */, - storage *workspace, reax_list **lists) { +void Add_dBond_to_Forces_NPTOMP(reax_system *system, int i, int pj, + storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; bond_order_data *bo_ij, *bo_ji; From 8118c23a986259481c1b45dea940b91356d40695 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 10:11:24 -0400 Subject: [PATCH 021/352] remove totals from energy_data struct --- src/USER-REAXC/reaxc_forces.cpp | 5 ++--- src/USER-REAXC/reaxc_reset_tools.cpp | 4 ---- src/USER-REAXC/reaxc_system_props.cpp | 24 ++---------------------- src/USER-REAXC/reaxc_traj.cpp | 15 +++++++++------ src/USER-REAXC/reaxc_types.h | 8 ++------ 5 files changed, 15 insertions(+), 41 deletions(-) diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 16224f2abb..d135571009 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -96,8 +96,7 @@ void Compute_NonBonded_Forces(reax_system *system, control_params *control, void Compute_Total_Force(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists) + storage *workspace, reax_list **lists) { int i, pj; reax_list *bonds = (*lists) + BONDS; @@ -434,5 +433,5 @@ void Compute_Forces(reax_system *system, control_params *control, lists, out_control); /*********** total force ***************/ - Compute_Total_Force(system, control, data, workspace, lists); + Compute_Total_Force(system, control, workspace, lists); } diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index c32fe6a602..dbd879a2a8 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -67,10 +67,6 @@ void Reset_Energies( energy_data *en ) en->e_vdW = 0; en->e_ele = 0; en->e_pol = 0; - - en->e_pot = 0; - en->e_kin = 0; - en->e_tot = 0; } void Reset_Simulation_Data( simulation_data* data, int /*virial*/ ) diff --git a/src/USER-REAXC/reaxc_system_props.cpp b/src/USER-REAXC/reaxc_system_props.cpp index e2cd7215aa..de513e11de 100644 --- a/src/USER-REAXC/reaxc_system_props.cpp +++ b/src/USER-REAXC/reaxc_system_props.cpp @@ -31,7 +31,7 @@ void Compute_System_Energy( reax_system *system, simulation_data *data, MPI_Comm comm ) { - double my_en[15], sys_en[15]; + double my_en[13], sys_en[13]; my_en[0] = data->my_en.e_bond; my_en[1] = data->my_en.e_ov; @@ -46,17 +46,7 @@ void Compute_System_Energy( reax_system *system, simulation_data *data, my_en[10] = data->my_en.e_vdW; my_en[11] = data->my_en.e_ele; my_en[12] = data->my_en.e_pol; - my_en[13] = data->my_en.e_kin; - MPI_Reduce( my_en, sys_en, 14, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); - - data->my_en.e_pot = data->my_en.e_bond + - data->my_en.e_ov + data->my_en.e_un + data->my_en.e_lp + - data->my_en.e_ang + data->my_en.e_pen + data->my_en.e_coa + - data->my_en.e_hb + - data->my_en.e_tor + data->my_en.e_con + - data->my_en.e_vdW + data->my_en.e_ele + data->my_en.e_pol; - - data->my_en.e_tot = data->my_en.e_pot + E_CONV * data->my_en.e_kin; + MPI_Reduce( my_en, sys_en, 13, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); if (system->my_rank == MASTER_NODE) { data->sys_en.e_bond = sys_en[0]; @@ -72,15 +62,5 @@ void Compute_System_Energy( reax_system *system, simulation_data *data, data->sys_en.e_vdW = sys_en[10]; data->sys_en.e_ele = sys_en[11]; data->sys_en.e_pol = sys_en[12]; - data->sys_en.e_kin = sys_en[13]; - - data->sys_en.e_pot = data->sys_en.e_bond + - data->sys_en.e_ov + data->sys_en.e_un + data->sys_en.e_lp + - data->sys_en.e_ang + data->sys_en.e_pen + data->sys_en.e_coa + - data->sys_en.e_hb + - data->sys_en.e_tor + data->sys_en.e_con + - data->sys_en.e_vdW + data->sys_en.e_ele + data->sys_en.e_pol; - - data->sys_en.e_tot = data->sys_en.e_pot + E_CONV * data->sys_en.e_kin; } } diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index da7c7955e5..658dfe4504 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -379,16 +379,19 @@ int Write_Frame_Header(reax_system *system, control_params *control, strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); /* energies */ - sprintf( out_control->line, REAL_LINE, "total_energy:", - data->sys_en.e_tot ); + double epot = data->sys_en.e_bond + data->sys_en.e_ov + data->sys_en.e_un + + data->sys_en.e_lp + data->sys_en.e_ang + data->sys_en.e_pen + + data->sys_en.e_coa + data->sys_en.e_hb + data->sys_en.e_tor + + data->sys_en.e_con + data->sys_en.e_vdW + + data->sys_en.e_ele + data->my_en.e_pol; + + sprintf( out_control->line, REAL_LINE, "total_energy:", epot); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "total_kinetic:", - data->sys_en.e_kin ); + sprintf( out_control->line, REAL_LINE, "total_kinetic:", 0.0); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, REAL_LINE, "total_potential:", - data->sys_en.e_pot ); + sprintf( out_control->line, REAL_LINE, "total_potential:", epot); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); sprintf( out_control->line, REAL_LINE, "bond_energy:", diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 0880abf313..73efda423e 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -301,10 +301,6 @@ struct control_params struct energy_data { - double e_tot; - double e_kin; // Total kinetic energy - double e_pot; - double e_bond; // Total bond energy double e_ov; // Total over coordination double e_un; // Total under coordination energy @@ -324,8 +320,8 @@ struct simulation_data { rc_bigint step; - energy_data my_en; - energy_data sys_en; + energy_data my_en; // per MPI rank energies + energy_data sys_en; // global energies }; struct three_body_interaction_data From 4dfd06cd8f39a493c23159eed13bab4d9b62f39b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 10:20:34 -0400 Subject: [PATCH 022/352] remove unused communication storage --- src/USER-REAXC/reaxc_allocate.cpp | 20 -------------------- src/USER-REAXC/reaxc_types.h | 7 ------- 2 files changed, 27 deletions(-) diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 455e8f9ada..96c709f2fa 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -127,15 +127,7 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) workspace->allocated = 0; - /* communication storage */ - for (i = 0; i < MAX_NBRS; ++i) { - sfree(control->error_ptr, workspace->tmp_dbl[i], "tmp_dbl[i]" ); - sfree(control->error_ptr, workspace->tmp_rvec[i], "tmp_rvec[i]" ); - sfree(control->error_ptr, workspace->tmp_rvec2[i], "tmp_rvec2[i]" ); - } - /* bond order storage */ - sfree(control->error_ptr, workspace->within_bond_box, "skin" ); sfree(control->error_ptr, workspace->total_bond_order, "total_bo" ); sfree(control->error_ptr, workspace->Deltap, "Deltap" ); sfree(control->error_ptr, workspace->Deltap_boc, "Deltap_boc" ); @@ -215,19 +207,7 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, total_rvec = total_cap * sizeof(rvec); local_rvec = local_cap * sizeof(rvec); - /* communication storage */ - for (i = 0; i < MAX_NBRS; ++i) { - workspace->tmp_dbl[i] = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "tmp_dbl"); - workspace->tmp_rvec[i] = (rvec*) - scalloc(control->error_ptr, total_cap, sizeof(rvec), "tmp_rvec"); - workspace->tmp_rvec2[i] = (rvec2*) - scalloc(control->error_ptr, total_cap, sizeof(rvec2), "tmp_rvec2"); - } - /* bond order related storage */ - workspace->within_bond_box = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "skin"); workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo"); workspace->Deltap = (double*) smalloc(control->error_ptr, total_real, "Deltap"); workspace->Deltap_boc = (double*) smalloc(control->error_ptr, total_real, "Deltap_boc"); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 73efda423e..5fbd74bf5f 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -393,19 +393,12 @@ struct reallocate_data { int hbonds, num_hbonds; int bonds, num_bonds; int num_3body; - int gcell_atoms; }; struct storage { int allocated; - /* communication storage */ - double *tmp_dbl[REAX_MAX_NBRS]; - rvec *tmp_rvec[REAX_MAX_NBRS]; - rvec2 *tmp_rvec2[REAX_MAX_NBRS]; - int *within_bond_box; - /* bond order related storage */ double *total_bond_order; double *Deltap, *Deltap_boc; From 499b6854213cc6ac9c84c3dde66f2eb429c1b95d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 10:58:29 -0400 Subject: [PATCH 023/352] clean up workspace management, output control, and enumerators --- src/USER-OMP/reaxc_init_md_omp.cpp | 8 ++------ src/USER-REAXC/pair_reaxc.cpp | 1 - src/USER-REAXC/reaxc_allocate.cpp | 28 ++++------------------------ src/USER-REAXC/reaxc_allocate.h | 5 ++--- src/USER-REAXC/reaxc_control.cpp | 12 +++--------- src/USER-REAXC/reaxc_defs.h | 29 +++-------------------------- src/USER-REAXC/reaxc_init_md.cpp | 18 +++--------------- src/USER-REAXC/reaxc_traj.cpp | 25 +++++++++---------------- src/USER-REAXC/reaxc_types.h | 25 +------------------------ 9 files changed, 27 insertions(+), 124 deletions(-) diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 9652b52fe7..31360a3bc0 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -43,7 +43,7 @@ // Functions defined in reaxc_init_md.cpp extern void Init_System(reax_system*, control_params*); extern void Init_Simulation_Data(control_params*, simulation_data*); -extern int Init_Workspace(reax_system*, control_params*, storage*, char*); +extern void Init_Workspace(reax_system*, control_params*, storage*); /* ---------------------------------------------------------------------- */ @@ -124,11 +124,7 @@ void InitializeOMP(reax_system *system, control_params *control, Init_System(system,control); Init_Simulation_Data(control,data); - - if (Init_Workspace(system,control,workspace,msg) == FAILURE) - error->one(FLERR,"init_workspace: not enough memory. " - "Workspace could not be initialized. Terminating."); - + Init_Workspace(system,control,workspace); Init_ListsOMP(system,control,lists); if (Init_Output_Files(system,control,out_control,world,msg)== FAILURE) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index cb1fe5f64d..9074ab8ca5 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -216,7 +216,6 @@ void PairReaxC::settings(int narg, char **arg) control->nthreads = 1; out_control->write_steps = 0; - out_control->traj_method = 0; strcpy( out_control->traj_title, "default_title" ); out_control->atom_info = 0; out_control->bond_info = 0; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 96c709f2fa..b0d83fc70d 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -145,7 +145,6 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) sfree(control->error_ptr, workspace->Clp, "Clp" ); sfree(control->error_ptr, workspace->vlpex, "vlpex" ); sfree(control->error_ptr, workspace->bond_mark, "bond_mark" ); - sfree(control->error_ptr, workspace->done_after, "done_after" ); /* QEq storage */ sfree(control->error_ptr, workspace->Hdia_inv, "Hdia_inv" ); @@ -180,9 +179,6 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) sfree(control->error_ptr, workspace->q2, "q2" ); sfree(control->error_ptr, workspace->p2, "p2" ); - /* integrator storage */ - sfree(control->error_ptr, workspace->v_const, "v_const" ); - /* force related storage */ sfree(control->error_ptr, workspace->f, "f" ); sfree(control->error_ptr, workspace->CdDelta, "CdDelta" ); @@ -196,16 +192,13 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) } -int Allocate_Workspace( reax_system * /*system*/, control_params * control, - storage *workspace, int local_cap, int total_cap, - char * /*msg*/ ) +void Allocate_Workspace( control_params *control, storage *workspace, int total_cap) { - int i, total_real, total_rvec, local_rvec; + int i, total_real, total_rvec; workspace->allocated = 1; total_real = total_cap * sizeof(double); total_rvec = total_cap * sizeof(rvec); - local_rvec = local_cap * sizeof(rvec); /* bond order related storage */ workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo"); @@ -228,8 +221,6 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, workspace->vlpex = (double*) smalloc(control->error_ptr, total_real, "vlpex"); workspace->bond_mark = (int*) scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark"); - workspace->done_after = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "done_after"); /* QEq storage */ workspace->Hdia_inv = (double*) @@ -267,9 +258,6 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, workspace->q2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "q2"); workspace->p2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "p2"); - /* integrator storage */ - workspace->v_const = (rvec*) smalloc(control->error_ptr, local_rvec, "v_const"); - /* force related storage */ workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f"); workspace->CdDelta = (double*) @@ -287,8 +275,6 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, #else LMP_UNUSED_PARAM(control); #endif - - return SUCCESS; } @@ -407,14 +393,8 @@ void ReAllocate( reax_system *system, control_params *control, } /* workspace */ - DeAllocate_Workspace( control, workspace ); - ret = Allocate_Workspace( system, control, workspace, system->local_cap, - system->total_cap, msg ); - if (ret != SUCCESS) { - char errmsg[256]; - snprintf(errmsg, 256, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); - error->one(FLERR, errmsg); - } + DeAllocate_Workspace(control, workspace); + Allocate_Workspace(control, workspace, system->total_cap); } /* far neighbors */ diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index be203340f6..e94066113b 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -33,9 +33,8 @@ int PreAllocate_Space( reax_system*, control_params*, storage* ); int Allocate_System( reax_system*, int, int, char* ); void DeAllocate_System( reax_system* ); -int Allocate_Workspace( reax_system*, control_params*, storage*, - int, int, char* ); -void DeAllocate_Workspace( control_params*, storage* ); +void Allocate_Workspace(control_params *, storage *, int); +void DeAllocate_Workspace(control_params *, storage *); void ReAllocate( reax_system*, control_params*, simulation_data*, storage*, reax_list** ); diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 93cb642a1f..67d019ae9c 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -53,7 +53,6 @@ void Read_Control_File(const char *control_file, control_params *control, strcpy( control->sim_name, "simulate" ); control->nthreads = 1; - out_control->debug_level = 0; out_control->energy_update_freq = 0; control->bond_cut = 5.0; @@ -67,8 +66,6 @@ void Read_Control_File(const char *control_file, control_params *control, control->virial = 0; out_control->write_steps = 0; - out_control->traj_compress = 0; - out_control->traj_method = REG_TRAJ; strcpy( out_control->traj_title, "default_title" ); out_control->atom_info = 0; out_control->bond_info = 0; @@ -119,8 +116,7 @@ void Read_Control_File(const char *control_file, control_params *control, ; // ignore } else if (strcmp(tmp[0], "debug_level") == 0) { - ival = atoi(tmp[1]); - out_control->debug_level = ival; + ; // ignore } else if (strcmp(tmp[0], "energy_update_freq") == 0) { ival = atoi(tmp[1]); @@ -212,12 +208,10 @@ void Read_Control_File(const char *control_file, control_params *control, out_control->write_steps = ival; } else if (strcmp(tmp[0], "traj_compress") == 0) { - ival = atoi(tmp[1]); - out_control->traj_compress = ival; + ; // ignore } else if (strcmp(tmp[0], "traj_method") == 0) { - ival = atoi(tmp[1]); - out_control->traj_method = ival; + ; // ignore } else if (strcmp(tmp[0], "traj_title") == 0) { strcpy( out_control->traj_title, tmp[1] ); diff --git a/src/USER-REAXC/reaxc_defs.h b/src/USER-REAXC/reaxc_defs.h index 4103f06129..f66fd9086c 100644 --- a/src/USER-REAXC/reaxc_defs.h +++ b/src/USER-REAXC/reaxc_defs.h @@ -116,36 +116,13 @@ /******************* ENUMERATIONS *************************/ -enum restart_formats { WRITE_ASCII, WRITE_BINARY, RF_N }; - enum lists { BONDS, OLD_BONDS, THREE_BODIES, HBONDS, FAR_NBRS, DBOS, DDELTAS, LIST_N }; -enum interactions { TYP_VOID, TYP_BOND, TYP_THREE_BODY, - TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N }; +enum message_tags {NONE, INIT_DESCS, ATOM_LINES, BOND_LINES, ANGLE_LINES}; -enum message_tags { INIT, UPDATE, BNDRY, UPDATE_BNDRY, - EXC_VEC1, EXC_VEC2, DIST_RVEC2, COLL_RVEC2, - DIST_RVECS, COLL_RVECS, INIT_DESCS, ATOM_LINES, - BOND_LINES, ANGLE_LINES, RESTART_ATOMS, TAGS_N }; - -enum errors { FILE_NOT_FOUND = -10, UNKNOWN_ATOM_TYPE = -11, - CANNOT_OPEN_FILE = -12, CANNOT_INITIALIZE = -13, - INSUFFICIENT_MEMORY = -14, UNKNOWN_OPTION = -15, - INVALID_INPUT = -16, INVALID_GEO = -17 }; - -enum exchanges { NONE, NEAR_EXCH, FULL_EXCH }; - -enum gcell_types { NO_NBRS=0, NEAR_ONLY=1, HBOND_ONLY=2, FAR_ONLY=4, - NEAR_HBOND=3, NEAR_FAR=5, HBOND_FAR=6, FULL_NBRS=7, - NATIVE=8 }; - -enum atoms { C_ATOM = 0, H_ATOM = 1, O_ATOM = 2, N_ATOM = 3, - S_ATOM = 4, SI_ATOM = 5, GE_ATOM = 6, X_ATOM = 7 }; - -enum traj_methods { REG_TRAJ, MPI_TRAJ, TF_N }; - -enum molecules { UNKNOWN, WATER }; +enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, + TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; #endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index b9d46fc3f1..44dbc764af 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -114,24 +114,15 @@ void Init_Taper(control_params *control, storage *workspace) 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } - -int Init_Workspace(reax_system *system, control_params *control, - storage *workspace, char *msg) +void Init_Workspace(reax_system *system, control_params *control, storage *workspace) { - int ret; - - ret = Allocate_Workspace(system, control, workspace, - system->local_cap, system->total_cap, msg); - if (ret != SUCCESS) - return ret; + Allocate_Workspace(control, workspace,system->total_cap); memset(&(workspace->realloc), 0, sizeof(reallocate_data)); Reset_Workspace(system, workspace); /* Initialize the Taper function */ Init_Taper(control, workspace); - - return SUCCESS; } int Init_Lists(reax_system *system, control_params *control, reax_list **lists) @@ -202,10 +193,7 @@ void Initialize(reax_system *system, control_params *control, Init_System(system,control); Init_Simulation_Data(control,data); - - if (Init_Workspace( system,control,workspace,msg) == FAILURE) - error->one(FLERR,"init_workspace: not enough memory. " - "Workspace could not be initialized. Terminating."); + Init_Workspace( system,control,workspace); if (Init_Lists(system, control, lists) ==FAILURE) error->one(FLERR,fmt::format("Error on: {}. System could not be " diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 658dfe4504..96b216241a 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -64,7 +64,6 @@ int Write_Header(reax_system *system, control_params *control, { int num_hdr_lines, my_hdr_lines, buffer_req; - char traj_methods[TF_N][10] = { "custom", "xyz" }; char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", "xyz_q", "xyz_q_fxfyfz", @@ -200,12 +199,10 @@ int Write_Header(reax_system *system, control_params *control, out_control->write_steps ); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "compress_trajectory_output?:", - (out_control->traj_compress ? "yes" : "no") ); + sprintf( out_control->line, STR_LINE, "compress_trajectory_output?:", "no"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, STR_LINE, "trajectory_format:", - traj_methods[ out_control->traj_method ] ); + sprintf( out_control->line, STR_LINE, "trajectory_format:", "regular"); strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); sprintf( out_control->line, STR_LINE, "atom_info:", @@ -248,7 +245,7 @@ int Write_Init_Desc(reax_system *system, output_controls *out_control, /* skip info */ Write_Skip_Line(out_control, me, system->bigN*INIT_DESC_LEN, system->bigN); - if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) + if (me == MASTER_NODE) buffer_req = system->bigN * INIT_DESC_LEN + 1; else buffer_req = system->n * INIT_DESC_LEN + 1; @@ -315,13 +312,9 @@ int Init_Traj(reax_system *system, control_params *control, out_control->buffer = nullptr; /* write trajectory header and atom info, if applicable */ - if (out_control->traj_method == REG_TRAJ) { - if (system->my_rank == MASTER_NODE) - out_control->strj = fopen(fname, "w"); - } else { - strcpy( msg, "init_traj: unknown trajectory option" ); - return FAILURE; - } + if (system->my_rank == MASTER_NODE) + out_control->strj = fopen(fname, "w"); + Write_Header(system, control, out_control); Write_Init_Desc(system, out_control, world); @@ -461,7 +454,7 @@ int Write_Atoms(reax_system *system, output_controls *out_control, Write_Skip_Line(out_control, me, system->bigN*line_len, system->bigN); - if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) + if (me == MASTER_NODE) buffer_req = system->bigN * line_len + 1; else buffer_req = system->n * line_len + 1; @@ -551,7 +544,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, Write_Skip_Line( out_control, me, num_bonds*line_len, num_bonds ); - if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) + if (me == MASTER_NODE) buffer_req = num_bonds * line_len + 1; else buffer_req = my_bonds * line_len + 1; @@ -651,7 +644,7 @@ int Write_Angles( reax_system *system, control_params *control, Write_Skip_Line( out_control, me, num_angles*line_len, num_angles ); - if (out_control->traj_method == REG_TRAJ && me == MASTER_NODE) + if (me == MASTER_NODE) buffer_req = num_angles * line_len + 1; else buffer_req = my_angles * line_len + 1; diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 5fbd74bf5f..53b0e35842 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -406,7 +406,7 @@ struct storage double *dDelta_lp, *dDelta_lp_temp; double *nlp, *nlp_temp, *Clp, *vlpex; rvec *dDeltap_self; - int *bond_mark, *done_after; + int *bond_mark; /* QEq storage */ sparse_matrix *H, *L, *U; @@ -423,17 +423,6 @@ struct storage /* Taper */ double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0; - /* storage for analysis */ - int *mark, *old_mark; - rvec *x_old; - - /* storage space for bond restrictions */ - int *restricted; - int **restricted_list; - - /* integrator */ - rvec *v_const; - /* force calculations */ double *CdDelta; // coefficient of dDelta rvec *f; @@ -496,26 +485,14 @@ struct output_controls FILE *prs; int write_steps; - int traj_compress; - int traj_method; char traj_title[81]; int atom_info; int bond_info; int angle_info; - int restart_format; - int restart_freq; - int debug_level; int energy_update_freq; }; -struct molecule -{ - int atom_count; - int atom_list[REAX_MAX_MOLECULE_SIZE]; - int mtypes[REAX_MAX_ATOM_TYPES]; -}; - struct LR_data { double H; From b3bc2d3df1b9302da8787f6850ba0d7c01399f08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 13:21:54 -0400 Subject: [PATCH 024/352] adjust pair style reax/c to read control file on MPI rank 0 and use tokenizer class --- src/USER-REAXC/pair_reaxc.cpp | 49 +++-- src/USER-REAXC/reaxc_control.cpp | 302 +++++++++---------------------- 2 files changed, 117 insertions(+), 234 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 9074ab8ca5..e8a47658d1 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -101,9 +101,9 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) control->me = system->my_rank = comm->me; system->num_nbrs = 0; - system->n = 0; // my atoms - system->N = 0; // mine + ghosts - system->bigN = 0; // all atoms in the system + system->n = 0; // my atoms + system->N = 0; // mine + ghosts + system->bigN = 0; // all atoms in the system system->local_cap = 0; system->total_cap = 0; system->my_atoms = nullptr; @@ -200,27 +200,36 @@ void PairReaxC::settings(int narg, char **arg) { if (narg < 1) error->all(FLERR,"Illegal pair_style command"); - // read name of control file or use default controls + if (comm->me == 0) { + // read name of control file or use default controls - if (strcmp(arg[0],"NULL") == 0) { - strcpy( control->sim_name, "simulate" ); - out_control->energy_update_freq = 0; - control->tabulate = 0; + if (strcmp(arg[0],"NULL") == 0) { + strcpy( control->sim_name, "simulate" ); + out_control->energy_update_freq = 0; + control->tabulate = 0; - control->bond_cut = 5.; - control->hbond_cut = 7.50; - control->thb_cut = 0.001; - control->thb_cutsq = 0.00001; - control->bg_cut = 0.3; + control->bond_cut = 5.; + control->hbond_cut = 7.50; + control->thb_cut = 0.001; + control->thb_cutsq = 0.00001; + control->bg_cut = 0.3; - control->nthreads = 1; + control->nthreads = 1; - out_control->write_steps = 0; - strcpy( out_control->traj_title, "default_title" ); - out_control->atom_info = 0; - out_control->bond_info = 0; - out_control->angle_info = 0; - } else Read_Control_File(arg[0], control, out_control); + out_control->write_steps = 0; + strcpy( out_control->traj_title, "default_title" ); + out_control->atom_info = 0; + out_control->bond_info = 0; + out_control->angle_info = 0; + } else Read_Control_File(arg[0], control, out_control); + } + MPI_Bcast(control,sizeof(control_params),MPI_CHAR,0,world); + MPI_Bcast(out_control,sizeof(output_controls),MPI_CHAR,0,world); + + // must reset these to local values after broadcast + control->me = comm->me; + control->error_ptr = error; + control->lmp_ptr = lmp; // default values diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 67d019ae9c..fe238ddb3c 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -25,250 +25,124 @@ ----------------------------------------------------------------------*/ #include "reaxc_control.h" -#include -#include #include "reaxc_defs.h" #include "reaxc_tool_box.h" #include "error.h" #include "utils.h" +#include "tokenizer.h" + +#include +#include +#include +#include using LAMMPS_NS::utils::getsyserror; +using LAMMPS_NS::utils::sfgets; +using LAMMPS_NS::utils::logmesg; +using LAMMPS_NS::ValueTokenizer; + +static std::unordered_set ignored_keywords = { + "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", + "restart_format", "restart_freq", "reposition_atoms", + "restrict_bonds", "remove_CoM_vel", "debug_level", "reneighbor", + "vlist_buffer", "ghost_cutoff", "qeq_freq", "q_err", "ilu_refactor", + "ilu_droptol", "temp_init", "temp_final", "t_mass", "t_mode", "t_rate", + "t_freq", "pressure", "p_mass", "pt_mass", "compress", "press_mode", + "geo_format", "traj_compress", "traj_method", "molecular_analysis", + "ignore", "dipole_anal", "freq_dipole_anal", "diffusion_coef", + "freq_diffusion_coef", "restrict_type" +}; + +class parser_error : public std::exception { + std::string message; +public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } +}; void Read_Control_File(const char *control_file, control_params *control, - output_controls *out_control) + output_controls *out_control) { FILE *fp; - char *s, **tmp; - int i,ival; - double val; + char line[MAX_LINE]; + auto error = control->error_ptr; + auto lmp = control->lmp_ptr; /* open control file */ fp = fopen(control_file, "r"); if (!fp) - control->error_ptr->one(FLERR,fmt::format("The control file {} cannot be " - "opened: {}",control_file, - getsyserror())); + error->one(FLERR,fmt::format("The control file {} cannot be opened: {}", + control_file, getsyserror())); /* assign default values */ - strcpy( control->sim_name, "simulate" ); - control->nthreads = 1; - - out_control->energy_update_freq = 0; - + strcpy(control->sim_name, "simulate"); + control->nthreads = 1; + control->tabulate = 0; + control->virial = 0; control->bond_cut = 5.0; control->bg_cut = 0.3; control->thb_cut = 0.001; control->thb_cutsq = 0.00001; control->hbond_cut = 7.5; - control->tabulate = 0; - - control->virial = 0; - out_control->write_steps = 0; - strcpy( out_control->traj_title, "default_title" ); + out_control->energy_update_freq = 0; + strcpy(out_control->traj_title, "default_title"); out_control->atom_info = 0; out_control->bond_info = 0; out_control->angle_info = 0; - /* memory allocations */ - s = (char*) malloc(sizeof(char)*MAX_LINE); - tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); - for (i=0; i < MAX_TOKENS; i++) - tmp[i] = (char*) malloc(sizeof(char)*MAX_LINE); - /* read control parameters file */ - while (!feof(fp)) { - fgets( s, MAX_LINE, fp ); - Tokenize( s, &tmp ); + while (fgets(line, MAX_LINE, fp)) { + ValueTokenizer values(line); - if (strcmp(tmp[0], "simulation_name") == 0) { - strcpy( control->sim_name, tmp[1] ); - } - else if (strcmp(tmp[0], "ensemble_type") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "nsteps") == 0) { - ; // ignore - } - else if ( strcmp(tmp[0], "dt") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "proc_by_dim") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "random_vel") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "restart_format") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "restart_freq") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "reposition_atoms") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "restrict_bonds") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "remove_CoM_vel") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "debug_level") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "energy_update_freq") == 0) { - ival = atoi(tmp[1]); - out_control->energy_update_freq = ival; - } - else if (strcmp(tmp[0], "reneighbor") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "vlist_buffer") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "nbrhood_cutoff") == 0) { - val = atof(tmp[1]); - control->bond_cut = val; - } - else if (strcmp(tmp[0], "bond_graph_cutoff") == 0) { - val = atof(tmp[1]); - control->bg_cut = val; - } - else if (strcmp(tmp[0], "thb_cutoff") == 0) { - val = atof(tmp[1]); - control->thb_cut = val; - } - else if (strcmp(tmp[0], "thb_cutoff_sq") == 0) { - val = atof(tmp[1]); - control->thb_cutsq = val; - } - else if (strcmp(tmp[0], "hbond_cutoff") == 0) { - val = atof( tmp[1] ); - control->hbond_cut = val; - } - else if (strcmp(tmp[0], "ghost_cutoff") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "tabulate_long_range") == 0) { - ival = atoi( tmp[1] ); - control->tabulate = ival; - } - else if (strcmp(tmp[0], "qeq_freq") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "q_err") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "ilu_refactor") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "ilu_droptol") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "temp_init") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "temp_final") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "t_mass") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "t_mode") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "t_rate") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "t_freq") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "pressure") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "p_mass") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "pt_mass") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "compress") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "press_mode") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "geo_format") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "write_freq") == 0) { - ival = atoi(tmp[1]); - out_control->write_steps = ival; - } - else if (strcmp(tmp[0], "traj_compress") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "traj_method") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "traj_title") == 0) { - strcpy( out_control->traj_title, tmp[1] ); - } - else if (strcmp(tmp[0], "atom_info") == 0) { - ival = atoi(tmp[1]); - out_control->atom_info += ival * 4; - } - else if (strcmp(tmp[0], "atom_velocities") == 0) { - ival = atoi(tmp[1]); - out_control->atom_info += ival * 2; - } - else if (strcmp(tmp[0], "atom_forces") == 0) { - ival = atoi(tmp[1]); - out_control->atom_info += ival * 1; - } - else if (strcmp(tmp[0], "bond_info") == 0) { - ival = atoi(tmp[1]); - out_control->bond_info = ival; - } - else if (strcmp(tmp[0], "angle_info") == 0) { - ival = atoi(tmp[1]); - out_control->angle_info = ival; - } - else if (strcmp(tmp[0], "molecular_analysis") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "ignore") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "dipole_anal") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "freq_dipole_anal") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "diffusion_coef") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "freq_diffusion_coef") == 0) { - ; // ignore - } - else if (strcmp(tmp[0], "restrict_type") == 0) { - ; // ignore - } - else { - char errmsg[128]; - snprintf(errmsg,128,"Unknown parameter %s in the control file", tmp[0]); - control->error_ptr->all(FLERR, errmsg); + // empty line + if (values.count() == 0) continue; + + try { + auto keyword = values.next_string(); + + if (!values.has_next()) + throw parser_error(fmt::format("No value(s) for control parameter: {}\n",keyword)); + + if (ignored_keywords.find(keyword) != ignored_keywords.end()) { + logmesg(lmp,fmt::format("Ignoring inactive control parameter: {}\n",keyword)); + } else if (keyword == "simulation_name") { + strcpy(control->sim_name, values.next_string().c_str()); + } else if (keyword == "energy_update_freq") { + out_control->energy_update_freq = values.next_int(); + } else if (keyword == "nbrhood_cutoff") { + control->bond_cut = values.next_double(); + } else if (keyword == "bond_graph_cutoff") { + control->bg_cut = values.next_double(); + } else if (keyword == "thb_cutoff") { + control->thb_cut = values.next_double(); + } else if (keyword == "thb_cutoff_sq") { + control->thb_cutsq = values.next_double(); + } else if (keyword == "hbond_cutoff") { + control->hbond_cut = values.next_double(); + } else if (keyword == "tabulate_long_range") { + control->tabulate = values.next_int(); + } else if (keyword == "write_freq") { + out_control->write_steps = values.next_int(); + } else if (keyword == "traj_title") { + strcpy(out_control->traj_title, values.next_string().c_str()); + } else if (keyword == "atom_info") { + out_control->atom_info += values.next_int() * 4; + } else if (keyword == "atom_velocities") { + out_control->atom_info += values.next_int() * 2; + } else if (keyword == "atom_forces") { + out_control->atom_info += values.next_int() * 1; + } else if (keyword == "bond_info") { + out_control->bond_info = values.next_int(); + } else if (keyword == "angle_info") { + out_control->angle_info = values.next_int(); + } else { + throw parser_error(fmt::format("Unknown parameter {} in control file", keyword)); + } + } catch (std::exception &e) { + error->one(FLERR, e.what()); } } - - /* free memory allocations at the top */ - for (i = 0; i < MAX_TOKENS; i++) - free( tmp[i] ); - free( tmp ); - free( s ); - fclose(fp); } From fb75e3e8b1f1ef26a2715e6c00d956977c21b554 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 14:25:10 -0400 Subject: [PATCH 025/352] remove unused and commented out defines --- src/USER-REAXC/reaxc_defs.h | 25 ++----------------------- src/USER-REAXC/reaxc_types.h | 13 ------------- 2 files changed, 2 insertions(+), 36 deletions(-) diff --git a/src/USER-REAXC/reaxc_defs.h b/src/USER-REAXC/reaxc_defs.h index f66fd9086c..6df4460fb9 100644 --- a/src/USER-REAXC/reaxc_defs.h +++ b/src/USER-REAXC/reaxc_defs.h @@ -26,8 +26,8 @@ . ----------------------------------------------------------------------*/ -#ifndef REAX_DEFS_H -#define REAX_DEFS_H +#ifndef LMP_REAXC_DEFS_H +#define LMP_REAXC_DEFS_H #if defined(__IBMC__) #define inline __inline__ @@ -39,19 +39,11 @@ #ifndef FAILURE #define FAILURE 0 #endif -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) #define DEG2RAD(a) ((a)*constPI/180.0) #define RAD2DEG(a) ((a)*180.0/constPI) -// #define MAX(x,y) (((x) > (y)) ? (x) : (y)) -// #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define MAX3(x,y,z) MAX( MAX(x,y), z) #define constPI 3.14159265 @@ -88,8 +80,6 @@ #define MIN_BONDS 25 #define REAX_MIN_HBONDS 25 #define MIN_3BODIES 1000 -#define MIN_GCELL_POPL 50 -#define MIN_SEND 100 #define REAX_SAFE_ZONE 1.2 #define REAX_SAFER_ZONE 1.4 #define DANGER_ZONE 0.90 @@ -97,20 +87,10 @@ #define MAX_3BODY_PARAM 5 #define MAX_4BODY_PARAM 5 -#define MAX_dV 1.01 -#define MIN_dV 0.99 -#define MAX_dT 4.00 -#define MIN_dT 0.00 - #define MASTER_NODE 0 -#define MAX_NBRS 6 //27 -#define MYSELF 13 // encoding of relative coordinate (0,0,0) -#define MAX_ITR 10 #define RESTART 30 -#define MAX_BOND 20 - #define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ #define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ @@ -121,7 +101,6 @@ enum lists { BONDS, OLD_BONDS, THREE_BODIES, enum message_tags {NONE, INIT_DESCS, ATOM_LINES, BOND_LINES, ANGLE_LINES}; - enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 53b0e35842..bef6475b6f 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -75,23 +75,10 @@ extern int ompTimingCGCount[LASTTIMINGINDEX]; /************* SOME DEFS - crucial for reax_types.h *********/ -//#define DEBUG -//#define DEBUG_FOCUS -//#define TEST_ENERGY -//#define TEST_FORCES -//#define CG_PERFORMANCE -//#define LOG_PERFORMANCE -//#define STANDARD_BOUNDARIES -//#define OLD_BOUNDARIES -//#define MIDPOINT_BOUNDARIES - #define REAX_MAX_STR 1024 -#define REAX_MAX_NBRS 6 #define REAX_MAX_3BODY_PARAM 5 #define REAX_MAX_4BODY_PARAM 5 #define REAX_MAX_ATOM_TYPES 25 -#define REAX_MAX_MOLECULE_SIZE 20 -#define MAX_BOND 20 // same as reaxc_defs.h /********************** TYPE DEFINITIONS ********************/ typedef int ivec[3]; From cc82e9b5581bfb840f07e38f953a89ca8e6b3a85 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 14:36:07 -0400 Subject: [PATCH 026/352] remove unused rtensor data type and support functions for it. --- src/USER-OMP/reaxc_torsion_angles_omp.cpp | 1 - src/USER-OMP/reaxc_valence_angles_omp.cpp | 1 - src/USER-REAXC/reaxc_torsion_angles.cpp | 1 - src/USER-REAXC/reaxc_types.h | 1 - src/USER-REAXC/reaxc_vector.cpp | 29 ----------------------- src/USER-REAXC/reaxc_vector.h | 3 --- 6 files changed, 36 deletions(-) diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index 9fe2542b47..642efd836e 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -105,7 +105,6 @@ void Torsion_AnglesOMP( reax_system *system, control_params *control, rvec dvec_li; rvec force; ivec rel_box_jl; - // rtensor total_rtensor, temp_rtensor; four_body_header *fbh; four_body_parameters *fbp; bond_data *pbond_ij, *pbond_jk, *pbond_kl; diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 7c417c0678..c83b26564a 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -155,7 +155,6 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; double BOA_ij, BOA_jk; rvec force; - // rtensor temp_rtensor, total_rtensor; // Tallying variables double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; diff --git a/src/USER-REAXC/reaxc_torsion_angles.cpp b/src/USER-REAXC/reaxc_torsion_angles.cpp index 08a64f3c24..04e7bfcc1c 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.cpp +++ b/src/USER-REAXC/reaxc_torsion_angles.cpp @@ -150,7 +150,6 @@ void Torsion_Angles( reax_system *system, control_params *control, rvec dvec_li; rvec force; ivec rel_box_jl; - // rtensor total_rtensor, temp_rtensor; four_body_header *fbh; four_body_parameters *fbp; bond_data *pbond_ij, *pbond_jk, *pbond_kl; diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index bef6475b6f..00c6de56ab 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -83,7 +83,6 @@ extern int ompTimingCGCount[LASTTIMINGINDEX]; /********************** TYPE DEFINITIONS ********************/ typedef int ivec[3]; typedef double rvec[3]; -typedef double rtensor[3][3]; typedef double rvec2[2]; // import LAMMPS' definition of tagint and bigint diff --git a/src/USER-REAXC/reaxc_vector.cpp b/src/USER-REAXC/reaxc_vector.cpp index e0e3a14782..2f06b57c02 100644 --- a/src/USER-REAXC/reaxc_vector.cpp +++ b/src/USER-REAXC/reaxc_vector.cpp @@ -100,35 +100,6 @@ void rvec_MakeZero( rvec v ) } -void rtensor_MatVec( rvec ret, rtensor m, rvec v ) -{ - int i; - rvec temp; - - if (ret == v) - { - for (i = 0; i < 3; ++i) - temp[i] = m[i][0] * v[0] + m[i][1] * v[1] + m[i][2] * v[2]; - - for (i = 0; i < 3; ++i) - ret[i] = temp[i]; - } - else - { - for (i = 0; i < 3; ++i) - ret[i] = m[i][0] * v[0] + m[i][1] * v[1] + m[i][2] * v[2]; - } -} - - -void rtensor_MakeZero( rtensor t ) -{ - t[0][0] = t[0][1] = t[0][2] = 0; - t[1][0] = t[1][1] = t[1][2] = 0; - t[2][0] = t[2][1] = t[2][2] = 0; -} - - void ivec_MakeZero( ivec v ) { v[0] = v[1] = v[2] = 0; diff --git a/src/USER-REAXC/reaxc_vector.h b/src/USER-REAXC/reaxc_vector.h index 549c1f927c..3dc36f96ef 100644 --- a/src/USER-REAXC/reaxc_vector.h +++ b/src/USER-REAXC/reaxc_vector.h @@ -42,9 +42,6 @@ double rvec_Norm( rvec ); void rvec_MakeZero( rvec ); void rvec_Random( rvec ); -void rtensor_MakeZero( rtensor ); -void rtensor_MatVec( rvec, rtensor, rvec ); - void ivec_MakeZero( ivec ); void ivec_Copy( ivec, ivec ); void ivec_Scale( ivec, double, ivec ); From 8b87eb9468da754a41d826512239a9a54ce5c02e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 15:49:51 -0400 Subject: [PATCH 027/352] remove unused file pointers and file streams --- src/USER-REAXC/reaxc_io_tools.cpp | 33 ------------------------------- src/USER-REAXC/reaxc_types.h | 10 ---------- 2 files changed, 43 deletions(-) diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 8c962d2bad..bb0b3e6b85 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -34,7 +34,6 @@ int Init_Output_Files(reax_system *system, control_params *control, output_controls *out_control, MPI_Comm world, char *msg) { - char temp[MAX_STR+8]; int ret; if (out_control->write_steps > 0) { @@ -42,26 +41,6 @@ int Init_Output_Files(reax_system *system, control_params *control, if (ret == FAILURE) return ret; } - - if (system->my_rank == MASTER_NODE) { - /* These files are written only by the master node */ - if (out_control->energy_update_freq > 0) { - - /* init potentials file */ - sprintf( temp, "%s.pot", control->sim_name ); - if ((out_control->pot = fopen( temp, "w" )) != nullptr) { - fflush( out_control->pot ); - } else { - strcpy( msg, "init_out_controls: .pot file could not be opened\n" ); - return FAILURE; - } - - /* init log file */ - } - - /* init pressure file */ - } - return SUCCESS; } @@ -71,18 +50,6 @@ int Close_Output_Files(reax_system *system, output_controls *out_control) if (out_control->write_steps > 0) End_Traj( system->my_rank, out_control ); - if (system->my_rank == MASTER_NODE) { - if (out_control->pot) { - fclose( out_control->pot ); - out_control->pot = nullptr; - } - - if (out_control->prs) { - fclose(out_control->prs); - out_control->prs = nullptr; - } - } - return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 00c6de56ab..fcc21cbda2 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -450,7 +450,6 @@ struct reax_list struct output_controls { FILE *strj; - int trj_offset; int atom_line_len; int bond_line_len; int angle_line_len; @@ -461,15 +460,6 @@ struct output_controls int buffer_len; char *buffer; - FILE *out; - FILE *pot; - FILE *log; - FILE *mol, *ign; - FILE *dpl; - FILE *drft; - FILE *pdb; - FILE *prs; - int write_steps; char traj_title[81]; int atom_info; From d1f004962a3a6e8c06e5472a0a5c35c74e098d85 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 17:13:31 -0400 Subject: [PATCH 028/352] convert fix qeq/reax to use modern LAMMPS file parsing --- src/USER-OMP/fix_qeq_reax_omp.cpp | 2 -- src/USER-REAXC/fix_qeq_reax.cpp | 52 +++++++++++++++++++------------ 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index b1ab1e5d62..ddc89ac4dc 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -52,8 +52,6 @@ using namespace LAMMPS_NS; using namespace FixConst; #define EV_TO_KCAL_PER_MOL 14.4 -//#define DANGER_ZONE 0.95 -//#define LOOSE_ZONE 0.7 #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) #define MIN_NBRS 100 diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 4fd177f76e..1d342df999 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -33,6 +33,8 @@ #include "pair.h" #include "pair_reaxc.h" #include "respa.h" +#include "text_file_reader.h" +#include "tokenizer.h" #include "update.h" #include @@ -44,6 +46,13 @@ using namespace LAMMPS_NS; using namespace FixConst; +class parser_error : public std::exception { + std::string message; +public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } +}; + #define EV_TO_KCAL_PER_MOL 14.4 #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) @@ -193,8 +202,8 @@ void FixQEqReax::pertype_parameters(char *arg) { if (strcmp(arg,"reax/c") == 0) { reaxflag = 1; - Pair *pair = force->pair_match("reax/c",0); - if (pair == nullptr) error->all(FLERR,"No pair reax/c for fix qeq/reax"); + Pair *pair = force->pair_match("^reax/c",0); + if (!pair) error->all(FLERR,"No reax/c pair style for fix qeq/reax"); int tmp; chi = (double *) pair->extract("chi",tmp); @@ -206,33 +215,36 @@ void FixQEqReax::pertype_parameters(char *arg) return; } - int i,itype,ntypes,rv; - double v1,v2,v3; - FILE *pf; - reaxflag = 0; - ntypes = atom->ntypes; + const int ntypes = atom->ntypes; memory->create(chi,ntypes+1,"qeq/reax:chi"); memory->create(eta,ntypes+1,"qeq/reax:eta"); memory->create(gamma,ntypes+1,"qeq/reax:gamma"); if (comm->me == 0) { - if ((pf = fopen(arg,"r")) == nullptr) - error->one(FLERR,"Fix qeq/reax parameter file could not be found"); + try { + TextFileReader reader(arg,"qeq/reax parameter"); + for (int i = 1; i <= ntypes; i++) { + const char *line = reader.next_line(); + if (!line) + throw parser_error("Invalid param file for fix qeq/reax"); + ValueTokenizer values(line); - for (i = 1; i <= ntypes && !feof(pf); i++) { - rv = fscanf(pf,"%d %lg %lg %lg",&itype,&v1,&v2,&v3); - if (rv != 4) - error->one(FLERR,"Fix qeq/reax: Incorrect format of param file"); - if (itype < 1 || itype > ntypes) - error->one(FLERR,"Fix qeq/reax: invalid atom type in param file"); - chi[itype] = v1; - eta[itype] = v2; - gamma[itype] = v3; + if (values.count() != 4) + throw parser_error("Fix qeq/reax: Incorrect format of param file"); + + int itype = values.next_int(); + if ((itype < 1) || (itype > ntypes)) + throw parser_error("Fix qeq/reax: invalid atom type in param file"); + + chi[itype] = values.next_double(); + eta[itype] = values.next_double(); + gamma[itype] = values.next_double(); + } + } catch (std::exception &e) { + error->one(FLERR,e.what()); } - if (i <= ntypes) error->one(FLERR,"Invalid param file for fix qeq/reax"); - fclose(pf); } MPI_Bcast(&chi[1],ntypes,MPI_DOUBLE,0,world); From 3eed9f23c8fe70e8c8592580fba43f077b81bfd8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 17:54:04 -0400 Subject: [PATCH 029/352] replace sprintf() into local char buffers with fmtlib --- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 26 ++++------- src/KOKKOS/pair_reaxc_kokkos.cpp | 8 ++-- src/USER-OMP/fix_qeq_reax_omp.cpp | 33 +++++-------- src/USER-OMP/reaxc_forces_omp.cpp | 20 ++++---- src/USER-OMP/reaxc_valence_angles_omp.cpp | 26 +++++------ src/USER-REAXC/fix_qeq_reax.cpp | 21 +++------ src/USER-REAXC/fix_reaxc_bonds.cpp | 27 ++++++----- src/USER-REAXC/fix_reaxc_species.cpp | 15 +++--- src/USER-REAXC/reaxc_allocate.cpp | 57 ++++++++--------------- src/USER-REAXC/reaxc_allocate.h | 10 ++-- src/USER-REAXC/reaxc_valence_angles.cpp | 12 ++--- 11 files changed, 99 insertions(+), 156 deletions(-) diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 7e4d99e1c3..fe1969c54f 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -838,14 +838,11 @@ void FixQEqReaxKokkos::cg_solve1() Kokkos::parallel_for(inum,vecsum2_functor); } - if (loop >= imax && comm->me == 0) { - char str[128]; - sprintf(str,"Fix qeq/reax cg_solve1 convergence failed after %d iterations " - "at " BIGINT_FORMAT " step: %f",loop,update->ntimestep,sqrt(sig_new)/b_norm); - error->warning(FLERR,str); - //error->all(FLERR,str); - } - + if (loop >= imax && comm->me == 0) + error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve1 convergence " + "failed after {} iterations at step {}: " + "{}", loop, update->ntimestep, + sqrt(sig_new)/b_norm)); } /* ---------------------------------------------------------------------- */ @@ -970,14 +967,11 @@ void FixQEqReaxKokkos::cg_solve2() Kokkos::parallel_for(inum,vecsum2_functor); } - if (loop >= imax && comm->me == 0) { - char str[128]; - sprintf(str,"Fix qeq/reax cg_solve2 convergence failed after %d iterations " - "at " BIGINT_FORMAT " step: %f",loop,update->ntimestep,sqrt(sig_new)/b_norm); - error->warning(FLERR,str); - //error->all(FLERR,str); - } - + if (loop >= imax && comm->me == 0) + error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve2 convergence " + "failed after {} iterations at step {}: " + "{}", loop, update->ntimestep, + sqrt(sig_new)/b_norm)); } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 75a1448b33..f9f3ebfdfa 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -349,11 +349,9 @@ void PairReaxCKokkos::init_md() if (swb < 0) error->one(FLERR,"Negative upper Taper-radius cutoff"); - else if (swb < 5) { - char str[128]; - sprintf(str,"Warning: very low Taper-radius cutoff: %f\n", swb); - error->one(FLERR,str); - } + else if (swb < 5) + error->one(FLERR,fmt::format("Warning: very low Taper-radius cutoff: " + "{}\n", swb)); d1 = swb - swa; d7 = powint(d1,7); diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index ddc89ac4dc..66760b8aa3 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -224,16 +224,11 @@ void FixQEqReaxOMP::compute_H() H.numnbrs[i] = mfill - H.firstnbr[i]; } } - - if (mfill >= H.m) { - char str[128]; - sprintf(str,"H matrix size has been exceeded: mfill=%d H.m=%d\n", - mfill, H.m); - error->warning(FLERR,str); - error->all(FLERR,"Fix qeq/reax/omp has insufficient QEq matrix size"); - } } // omp + if (m_fill >= H.m) + error->all(FLERR,fmt::format("Fix qeq/reax: H matrix size has been " + "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); } /* ---------------------------------------------------------------------- */ @@ -528,13 +523,10 @@ int FixQEqReaxOMP::CG( double *b, double *x) } } - if (i >= imax && comm->me == 0) { - char str[128]; - sprintf(str,"Fix qeq/reax CG convergence failed after %d iterations " - "at " BIGINT_FORMAT " step",i,update->ntimestep); - error->warning(FLERR,str); - } - + if (i >= imax && comm->me == 0) + error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " + "after {} iterations at step {}", + i,update->ntimestep)); return i; } @@ -882,13 +874,10 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) startTimeBase = endTimeBase; #endif - if ( i >= imax && comm->me == 0) { - char str[128]; - sprintf(str,"Fix qeq/reax CG convergence failed after %d iterations " - "at " BIGINT_FORMAT " step",i,update->ntimestep); - error->warning(FLERR,str); - } - + if ( i >= imax && comm->me == 0) + error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " + "after {} iterations at step {}", + i,update->ntimestep)); return i; } diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 05a72c93eb..aff543225d 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -270,12 +270,10 @@ void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list * comp = Start_Index(i+1, bonds); else comp = bonds->num_intrs; - if (End_Index(i, bonds) > comp) { - char errmsg[256]; - snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", - step, i, End_Index(i,bonds), comp ); - system->error_ptr->one(FLERR,errmsg); - } + 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)); } } @@ -297,12 +295,10 @@ void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list * comp = Start_Index(Hindex+1, hbonds); else comp = hbonds->num_intrs; - if (End_Index(Hindex, hbonds) > comp) { - char errmsg[256]; - snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", - step, Hindex, End_Index(Hindex,hbonds), comp ); - system->error_ptr->one(FLERR, errmsg); - } + 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)); } } } diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index c83b26564a..167f647790 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -239,15 +239,12 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, } // for (pi) // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom - if (my_offset >= (tid+1)*per_thread) { - char errmsg[512]; - snprintf( errmsg, 512, "step%d-ran out of space on angle_list for atom %i:\n" - " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n" - " num_intrs= %i N= %i\n" - , data->step, j, nthreads, tid, my_offset, per_thread,thb_intrs->num_intrs , system->N); - control->error_ptr->one(FLERR, errmsg); - } - + if (my_offset >= (tid+1)*per_thread) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list for atom {}:\n" + " nthreads={} tid={} my_offset={} per_thread={}\n" + " num_intrs={} N={}",data->step,j,nthreads,tid, + my_offset,per_thread,thb_intrs->num_intrs,system->N)); // Number of angles owned by this atom _my_offset[j] = my_offset - tid * per_thread; } // for (j) @@ -597,12 +594,11 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { workspace->realloc.num_3body = num_thb_intrs * TWICE; - if (num_thb_intrs > thb_intrs->num_intrs) { - char errmsg[128]; - snprintf(errmsg, 128, "step%d-ran out of space on angle_list: top=%d, max=%d", - data->step, num_thb_intrs, thb_intrs->num_intrs); - control->error_ptr->one(FLERR, errmsg); - } + if (num_thb_intrs > thb_intrs->num_intrs) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list: top={}, max={}", + data->step, num_thb_intrs, + thb_intrs->num_intrs)); } #ifdef OMP_TIMING diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 1d342df999..2472fc3098 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -652,13 +652,9 @@ void FixQEqReax::compute_H() } } - if (m_fill >= H.m) { - char str[128]; - sprintf(str,"H matrix size has been exceeded: m_fill=%d H.m=%d\n", - m_fill, H.m); - error->warning(FLERR,str); - error->all(FLERR,"Fix qeq/reax has insufficient QEq matrix size"); - } + if (m_fill >= H.m) + error->all(FLERR,fmt::format("Fix qeq/reax: H matrix size has been " + "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); } /* ---------------------------------------------------------------------- */ @@ -731,13 +727,10 @@ int FixQEqReax::CG( double *b, double *x) vector_sum( d, 1., p, beta, d, nn ); } - if (i >= imax && comm->me == 0) { - char str[128]; - sprintf(str,"Fix qeq/reax CG convergence failed after %d iterations " - "at " BIGINT_FORMAT " step",i,update->ntimestep); - error->warning(FLERR,str); - } - + if (i >= imax && comm->me == 0) + error->warning(FLERR,fmt::format("Fix qeq/reax CG convergence failed " + "after {} iterations at step {}", + i,update->ntimestep)); return i; } diff --git a/src/USER-REAXC/fix_reaxc_bonds.cpp b/src/USER-REAXC/fix_reaxc_bonds.cpp index 0cb78521f2..26cd7870ff 100644 --- a/src/USER-REAXC/fix_reaxc_bonds.cpp +++ b/src/USER-REAXC/fix_reaxc_bonds.cpp @@ -17,18 +17,20 @@ #include "fix_reaxc_bonds.h" -#include #include "atom.h" -#include "update.h" -#include "pair_reaxc.h" -#include "neigh_list.h" +#include "error.h" #include "force.h" #include "memory.h" -#include "error.h" +#include "neigh_list.h" +#include "pair_reaxc.h" +#include "update.h" + #include "reaxc_list.h" #include "reaxc_types.h" #include "reaxc_defs.h" +#include + using namespace LAMMPS_NS; using namespace FixConst; @@ -53,23 +55,20 @@ FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : char *suffix = strrchr(arg[4],'.'); if (suffix && strcmp(suffix,".gz") == 0) { #ifdef LAMMPS_GZIP - char gzip[128]; - snprintf(gzip,128,"gzip -6 > %s",arg[4]); + auto gzip = fmt::format("gzip -6 > {}",arg[4]); #ifdef _WIN32 - fp = _popen(gzip,"wb"); + fp = _popen(gzip.c_str(),"wb"); #else - fp = popen(gzip,"w"); + fp = popen(gzip.c_str(),"w"); #endif #else error->one(FLERR,"Cannot open gzipped file"); #endif } else fp = fopen(arg[4],"w"); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open fix reax/c/bonds file %s",arg[4]); - error->one(FLERR,str); - } + if (!fp) + error->one(FLERR,fmt::format("Cannot open fix reax/c/bonds file {}: " + "{}",arg[4],utils::getsyserror())); } if (atom->tag_consecutive() == 0) diff --git a/src/USER-REAXC/fix_reaxc_species.cpp b/src/USER-REAXC/fix_reaxc_species.cpp index 81b1dafa61..8128b23662 100644 --- a/src/USER-REAXC/fix_reaxc_species.cpp +++ b/src/USER-REAXC/fix_reaxc_species.cpp @@ -108,23 +108,20 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : char *suffix = strrchr(arg[6],'.'); if (suffix && strcmp(suffix,".gz") == 0) { #ifdef LAMMPS_GZIP - char gzip[128]; - sprintf(gzip,"gzip -6 > %s",arg[6]); + auto gzip = fmt::format("gzip -6 > {}",arg[6]); #ifdef _WIN32 - fp = _popen(gzip,"wb"); + fp = _popen(gzip.c_str(),"wb"); #else - fp = popen(gzip,"w"); + fp = popen(gzip.c_str(),"w"); #endif #else error->one(FLERR,"Cannot open gzipped file"); #endif } else fp = fopen(arg[6],"w"); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open fix reax/c/species file %s",arg[6]); - error->one(FLERR,str); - } + if (!fp) + error->one(FLERR,fmt::format("Cannot open fix reax/c/species file {}: " + "{}",arg[6],utils::getsyserror())); } x0 = nullptr; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index b0d83fc70d..3f0a251a97 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -70,16 +70,6 @@ int PreAllocate_Space( reax_system *system, control_params * /*control*/, /************* system *************/ -int Allocate_System( reax_system *system, int /*local_cap*/, int total_cap, - char * /*msg*/ ) -{ - system->my_atoms = (reax_atom*) - realloc( system->my_atoms, total_cap*sizeof(reax_atom) ); - - return SUCCESS; -} - - void DeAllocate_System( reax_system *system ) { int i, j, k; @@ -359,17 +349,16 @@ void ReAllocate( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists ) { auto error = system->error_ptr; - int num_bonds, est_3body, Hflag, ret; + int num_bonds, est_3body, Hflag; int newsize; - reallocate_data *realloc; + reallocate_data *wsr; reax_list *far_nbrs; - char msg[200]; int mincap = system->mincap; double safezone = system->safezone; double saferzone = system->saferzone; - realloc = &(workspace->realloc); + wsr = &(workspace->realloc); if ( system->n >= DANGER_ZONE * system->local_cap || (0 && system->n <= LOOSE_ZONE * system->local_cap)) { @@ -385,13 +374,8 @@ void ReAllocate( reax_system *system, control_params *control, if (Nflag) { /* system */ - ret = Allocate_System( system, system->local_cap, system->total_cap, msg ); - if (ret != SUCCESS) { - char errmsg[256]; - snprintf(errmsg, 256, "Not enough space for atom_list: total_cap=%d", system->total_cap); - error->one(FLERR, errmsg); - } - + system->my_atoms = (reax_atom *)::realloc(system->my_atoms, + system->total_cap*sizeof(reax_atom)); /* workspace */ DeAllocate_Workspace(control, workspace); Allocate_Workspace(control, workspace, system->total_cap); @@ -401,16 +385,16 @@ void ReAllocate( reax_system *system, control_params *control, far_nbrs = *lists + FAR_NBRS; - if (Nflag || realloc->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { - if (realloc->num_far > far_nbrs->num_intrs) + if (Nflag || wsr->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { + if (wsr->num_far > far_nbrs->num_intrs) error->one(FLERR,fmt::format("step{}: ran out of space on far_nbrs: top={}, max={}", - data->step, realloc->num_far, far_nbrs->num_intrs)); + data->step, wsr->num_far, far_nbrs->num_intrs)); newsize = static_cast - (MAX( realloc->num_far*safezone, mincap*REAX_MIN_NBRS)); + (MAX( wsr->num_far*safezone, mincap*REAX_MIN_NBRS)); Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize); - realloc->num_far = 0; + wsr->num_far = 0; } /* hydrogen bonds list */ @@ -422,35 +406,34 @@ void ReAllocate( reax_system *system, control_params *control, system->Hcap = int(MAX( system->numH * saferzone, mincap )); } - if (Hflag || realloc->hbonds) { - ret = Reallocate_HBonds_List( system, (*lists)+HBONDS); - realloc->hbonds = 0; + if (Hflag || wsr->hbonds) { + Reallocate_HBonds_List( system, (*lists)+HBONDS); + wsr->hbonds = 0; } } /* bonds list */ num_bonds = est_3body = -1; - if (Nflag || realloc->bonds) { + if (Nflag || wsr->bonds) { Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, &est_3body); - realloc->bonds = 0; - realloc->num_3body = MAX( realloc->num_3body, est_3body ) * 2; + wsr->bonds = 0; + wsr->num_3body = MAX( wsr->num_3body, est_3body ) * 2; } /* 3-body list */ - if (realloc->num_3body > 0) { + if (wsr->num_3body > 0) { Delete_List( (*lists)+THREE_BODIES); if (num_bonds == -1) num_bonds = ((*lists)+BONDS)->num_intrs; - realloc->num_3body = (int)(MAX(realloc->num_3body*safezone, MIN_3BODIES)); + wsr->num_3body = (int)(MAX(wsr->num_3body*safezone, MIN_3BODIES)); - if ( !Make_List( num_bonds, realloc->num_3body, TYP_THREE_BODY, + if ( !Make_List( num_bonds, wsr->num_3body, TYP_THREE_BODY, (*lists)+THREE_BODIES )) { error->one(FLERR, "Problem in initializing angles list"); } - realloc->num_3body = -1; + wsr->num_3body = -1; } - } diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index e94066113b..7229927b57 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -28,14 +28,14 @@ #define __ALLOCATE_H_ #include "reaxc_types.h" -int PreAllocate_Space( reax_system*, control_params*, storage* ); -int Allocate_System( reax_system*, int, int, char* ); -void DeAllocate_System( reax_system* ); +int PreAllocate_Space(reax_system *, control_params *, storage *); + +void DeAllocate_System(reax_system *); void Allocate_Workspace(control_params *, storage *, int); void DeAllocate_Workspace(control_params *, storage *); -void ReAllocate( reax_system*, control_params*, simulation_data*, storage*, - reax_list** ); +void ReAllocate(reax_system *, control_params *, simulation_data *, + storage*, reax_list**); #endif diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index 78887e5ecc..b363fd8e04 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -403,12 +403,10 @@ void Valence_Angles( reax_system *system, control_params *control, if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { workspace->realloc.num_3body = num_thb_intrs; - if (num_thb_intrs > thb_intrs->num_intrs) { - char errmsg[128]; - snprintf(errmsg, 128, "step%d-ran out of space on angle_list: top=%d, max=%d", - data->step, num_thb_intrs, thb_intrs->num_intrs); - control->error_ptr->one(FLERR, errmsg); - } + if (num_thb_intrs > thb_intrs->num_intrs) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list: top={}, max={}", + data->step, num_thb_intrs, + thb_intrs->num_intrs)); } - } From 6c07d2fb118dd9dbddc9ddd705b63b2b8a4301ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 20:08:25 -0400 Subject: [PATCH 030/352] replace some more sprintf() calls to local buffers with fmtlib --- src/USER-REAXC/reaxc_forces.cpp | 20 ++++++++------------ src/USER-REAXC/reaxc_init_md.cpp | 9 +++------ src/USER-REAXC/reaxc_list.cpp | 8 ++------ src/USER-REAXC/reaxc_reset_tools.cpp | 20 ++++++++------------ src/USER-REAXC/reaxc_traj.cpp | 14 +++++--------- 5 files changed, 26 insertions(+), 45 deletions(-) diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index d135571009..7e412afbd6 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -131,12 +131,10 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l comp = Start_Index(i+1, bonds); else comp = bonds->num_intrs; - if (End_Index(i, bonds) > comp) { - char errmsg[256]; - snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", - step, i, End_Index(i,bonds), comp ); - system->error_ptr->one(FLERR,errmsg); - } + 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)); } } @@ -159,12 +157,10 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l comp = Start_Index(Hindex+1, hbonds); else comp = hbonds->num_intrs; - if (End_Index(Hindex, hbonds) > comp) { - char errmsg[256]; - snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", - step, Hindex, End_Index(Hindex,hbonds), comp ); - system->error_ptr->one(FLERR, errmsg); - } + 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)); } } } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 44dbc764af..e94037c5f5 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -90,12 +90,9 @@ void Init_Taper(control_params *control, storage *workspace) if (swb < 0) { error->all(FLERR,"Negative upper Taper-radius cutoff"); } - else if (swb < 5 && control->me == 0) { - char errmsg[256]; - snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb); - error->warning(FLERR, errmsg); - } - + else if (swb < 5 && control->me == 0) + error->warning(FLERR,fmt::format("Warning: very low Taper-radius cutoff: " + "{}\n", swb)); d1 = swb - swa; d7 = pow(d1, 7.0); swa2 = SQR(swa); diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index ff5cf98900..b48a9a540e 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -89,9 +89,7 @@ int Make_List(int n, int num_intrs, int type, reax_list *l ) break; default: - char errmsg[128]; - snprintf(errmsg, 128, "No %d list type defined", l->type); - l->error_ptr->one(FLERR,errmsg); + l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); } return SUCCESS; @@ -140,9 +138,7 @@ void Delete_List( reax_list *l ) break; default: - char errmsg[128]; - snprintf(errmsg, 128, "No %d list type defined", l->type); - l->error_ptr->all(FLERR,errmsg); + l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); } } diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index dbd879a2a8..5d3053fb37 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -105,12 +105,10 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, /* is reallocation needed? */ if (total_bonds >= bonds->num_intrs * DANGER_ZONE) { workspace->realloc.bonds = 1; - if (total_bonds >= bonds->num_intrs) { - char errmsg[256]; - snprintf(errmsg, 256, "Not enough space for bonds! total=%d allocated=%d\n", - total_bonds, bonds->num_intrs); - control->error_ptr->one(FLERR, errmsg); - } + if (total_bonds >= bonds->num_intrs) + control->error_ptr->one(FLERR,fmt::format("Not enough space for bonds! " + "total={} allocated={}\n", + total_bonds, bonds->num_intrs)); } } @@ -131,12 +129,10 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, /* is reallocation needed? */ if (total_hbonds >= hbonds->num_intrs * 0.90/*DANGER_ZONE*/) { workspace->realloc.hbonds = 1; - if (total_hbonds >= hbonds->num_intrs) { - char errmsg[256]; - snprintf(errmsg, 256, "Not enough space for hbonds! total=%d allocated=%d\n", - total_hbonds, hbonds->num_intrs); - control->error_ptr->one(FLERR, errmsg); - } + if (total_hbonds >= hbonds->num_intrs) + control->error_ptr->one(FLERR,fmt::format("Not enough space for hbonds! " + "total={} allocated={}\n", + total_hbonds, hbonds->num_intrs)); } } } diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 96b216241a..280f40b7d3 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -41,12 +41,9 @@ int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_ out_control->buffer_len = (int)(req_space*REAX_SAFE_ZONE); out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); - if (out_control->buffer == nullptr) { - char errmsg[256]; - snprintf(errmsg, 256, "Insufficient memory for required buffer size %d", (int) (req_space*REAX_SAFE_ZONE)); - error_ptr->one(FLERR,errmsg); - } - + if (!out_control->buffer) + error_ptr->one(FLERR,fmt::format("Insufficient memory for required buffer " + "size {}", (req_space*REAX_SAFE_ZONE))); return SUCCESS; } @@ -286,7 +283,6 @@ int Write_Init_Desc(reax_system *system, output_controls *out_control, int Init_Traj(reax_system *system, control_params *control, output_controls *out_control, MPI_Comm world, char *msg) { - char fname[MAX_STR+8]; int atom_line_len[ NR_OPT_ATOM ] = { 0, 0, 0, 0, ATOM_BASIC_LEN, ATOM_wV_LEN, ATOM_wF_LEN, ATOM_FULL_LEN }; @@ -294,7 +290,7 @@ int Init_Traj(reax_system *system, control_params *control, int angle_line_len[ NR_OPT_ANGLE ] = { 0, ANGLE_BASIC_LEN }; /* generate trajectory name */ - sprintf( fname, "%s.trj", control->sim_name ); + auto fname = std::string(control->sim_name) + ".trj"; /* how should I write atoms? */ out_control->atom_line_len = atom_line_len[ out_control->atom_info ]; @@ -313,7 +309,7 @@ int Init_Traj(reax_system *system, control_params *control, /* write trajectory header and atom info, if applicable */ if (system->my_rank == MASTER_NODE) - out_control->strj = fopen(fname, "w"); + out_control->strj = fopen(fname.c_str(), "w"); Write_Header(system, control, out_control); Write_Init_Desc(system, out_control, world); From 2c38d1b7d4546558e42d07bad8aa9c14f85a170f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 15 Apr 2021 21:19:00 -0400 Subject: [PATCH 031/352] reax/c native trajectory output cleanup/simplification --- src/USER-OMP/reaxc_init_md_omp.cpp | 4 +- src/USER-REAXC/reaxc_init_md.cpp | 4 +- src/USER-REAXC/reaxc_io_tools.cpp | 21 +- src/USER-REAXC/reaxc_io_tools.h | 5 +- src/USER-REAXC/reaxc_traj.cpp | 588 +++++++++++------------------ src/USER-REAXC/reaxc_traj.h | 78 +--- src/USER-REAXC/reaxc_types.h | 1 - 7 files changed, 231 insertions(+), 470 deletions(-) diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 31360a3bc0..d20ab954fe 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -127,9 +127,7 @@ void InitializeOMP(reax_system *system, control_params *control, Init_Workspace(system,control,workspace); Init_ListsOMP(system,control,lists); - if (Init_Output_Files(system,control,out_control,world,msg)== FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Could not open output files! " - "Terminating.",msg)); + Init_Output_Files(system,control,out_control,world); if (control->tabulate) if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index e94037c5f5..beb7d1b87c 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -196,9 +196,7 @@ void Initialize(reax_system *system, control_params *control, error->one(FLERR,fmt::format("Error on: {}. System could not be " "initialized. Terminating.",msg)); - if (Init_Output_Files(system,control,out_control,world,msg)== FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Could not open output files! " - "Terminating.",msg)); + Init_Output_Files(system,control,out_control,world); if (control->tabulate) if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index bb0b3e6b85..2f5c6b8f65 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -31,29 +31,20 @@ #include "reaxc_system_props.h" #include "reaxc_traj.h" -int Init_Output_Files(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world, char *msg) +void Init_Output_Files(reax_system *system, control_params *control, + output_controls *out_control, MPI_Comm world) { - int ret; - - if (out_control->write_steps > 0) { - ret = Init_Traj( system, control, out_control, world, msg ); - if (ret == FAILURE) - return ret; - } - return SUCCESS; + if (out_control->write_steps > 0) + Init_Traj(system, control, out_control, world); } /************************ close output files ************************/ -int Close_Output_Files(reax_system *system, output_controls *out_control) +void Close_Output_Files(reax_system *system, output_controls *out_control) { if (out_control->write_steps > 0) - End_Traj( system->my_rank, out_control ); - - return SUCCESS; + End_Traj(system->my_rank, out_control); } - void Output_Results(reax_system *system, control_params *control, simulation_data *data, reax_list **lists, output_controls *out_control, MPI_Comm world) diff --git a/src/USER-REAXC/reaxc_io_tools.h b/src/USER-REAXC/reaxc_io_tools.h index 643b563f73..8b69125032 100644 --- a/src/USER-REAXC/reaxc_io_tools.h +++ b/src/USER-REAXC/reaxc_io_tools.h @@ -30,9 +30,8 @@ #include "reaxc_types.h" #include -int Init_Output_Files(reax_system *, control_params *, - output_controls *, MPI_Comm, char *); -int Close_Output_Files(reax_system *, output_controls *); +void Init_Output_Files(reax_system *, control_params *, output_controls *, MPI_Comm); +void Close_Output_Files(reax_system *, output_controls *); void Output_Results(reax_system *, control_params *, simulation_data *, reax_list **, output_controls *, MPI_Comm); #endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 280f40b7d3..6c8c1e079d 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -25,42 +25,79 @@ ----------------------------------------------------------------------*/ #include "reaxc_traj.h" + #include #include #include #include + #include "reaxc_defs.h" #include "reaxc_list.h" #include "error.h" -int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space ) +#define MAX_TRJ_LINE_LEN 120 +#define MAX_TRJ_BUFFER_SIZE (MAX_TRJ_LINE_LEN * 100) + +#define NUM_HEADER_LINES 37 +#define HEADER_LINE_LEN 62 +#define INIT_DESC_LEN 32 + +#define ATOM_BASIC_LEN 50 +#define ATOM_wV_LEN 80 +#define ATOM_wF_LEN 80 +#define ATOM_FULL_LEN 110 + +#define BOND_BASIC_LEN 39 +#define BOND_FULL_LEN 69 +#define ANGLE_BASIC_LEN 38 + +enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; +enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; +enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; + +std::string fmtline(const char *key, double val) +{ + return fmt::format("{:<37}{:<24.3f}\n",key,val); +} + +std::string fmtline(const char *key, double val1, double val2, double val3) +{ + return fmt::format("{:<32}{:>9.3f},{:>9.3f},{:>9.3f}\n",key,val1,val2,val3); +} + +template +std::string fmtline(const char *key, T val) +{ + return fmt::format("{:<37}{:<24}\n",key,val); +} + +template +std::string fmtline(const char *key, T val1, T val2) +{ + return fmt::format("{:<36}{:<12},{:<12}\n",key,val1,val2); +} + +void Reallocate_Output_Buffer(LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space) { if (out_control->buffer_len > 0) - free( out_control->buffer ); + free(out_control->buffer); out_control->buffer_len = (int)(req_space*REAX_SAFE_ZONE); out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); if (!out_control->buffer) error_ptr->one(FLERR,fmt::format("Insufficient memory for required buffer " "size {}", (req_space*REAX_SAFE_ZONE))); - return SUCCESS; } -void Write_Skip_Line(output_controls *out_control, - int my_rank, int skip, int num_section) +void Write_Skip_Line(output_controls *out_control, int my_rank, int skip, int num_section) { if (my_rank == MASTER_NODE) - fprintf( out_control->strj, INT2_LINE, - "chars_to_skip_section:", skip, num_section ); + fmt::print(out_control->strj,fmtline("chars_to_skip_section:",skip,num_section)); } - -int Write_Header(reax_system *system, control_params *control, - output_controls *out_control) +void Write_Header(reax_system *system, control_params *control, output_controls *out_control) { - int num_hdr_lines, my_hdr_lines, buffer_req; - char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", "xyz_q", "xyz_q_fxfyfz", @@ -71,166 +108,71 @@ int Write_Header(reax_system *system, control_params *control, "detailed_bond_info" }; char angle_formats[2][30] = { "none", "basic_angle_info" }; - /* set header lengths */ - num_hdr_lines = NUM_HEADER_LINES; - my_hdr_lines = num_hdr_lines * ( system->my_rank == MASTER_NODE ); - buffer_req = my_hdr_lines * HEADER_LINE_LEN; - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req ); - /* only the master node writes into trajectory header */ if (system->my_rank == MASTER_NODE) { - /* clear the contents of line & buffer */ - out_control->line[0] = 0; - out_control->buffer[0] = 0; - + std::string buffer(""); + /* to skip the header */ - sprintf( out_control->line, INT_LINE, "chars_to_skip_header:", - (num_hdr_lines-1) * HEADER_LINE_LEN ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("chars_to_skip_header:",(NUM_HEADER_LINES-1) * HEADER_LINE_LEN); /* general simulation info */ - sprintf( out_control->line, STR_LINE, "simulation_name:", - out_control->traj_title ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, BIGINT_LINE, "number_of_atoms:", system->bigN ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "ensemble_type:", "(unknown)"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "number_of_steps:", 0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "timestep_length_(in_fs):", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("simulation_name:", out_control->traj_title); + buffer += fmtline("number_of_atoms:", system->bigN); + buffer += fmtline("ensemble_type:", "(unknown)"); + buffer += fmtline("number_of_steps:", 0); + buffer += fmtline("timestep_length_(in_fs):", 0.0); /* restart info */ - sprintf( out_control->line, STR_LINE, "is_this_a_restart?:", "no"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "write_restart_files?:", "no"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "frequency_to_write_restarts:", 0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("is_this_a_restart?:", "no"); + buffer += fmtline("write_restart_files?:", "no"); + buffer += fmtline("frequency_to_write_restarts:", 0); /* preferences */ - sprintf( out_control->line, STR_LINE, "tabulate_long_range_intrs?:", - (control->tabulate ? "yes" : "no") ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "table_size:", control->tabulate ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "restrict_bonds?:", "no"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "bond_restriction_length:", 0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "reposition_atoms?:", "fit to periodic box"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "remove_CoM_velocity?:", 0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - /* cut-off values */ - sprintf( out_control->line, REAL_LINE, "bonded_intr_dist_cutoff:", - control->bond_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "nonbonded_intr_dist_cutoff:", - control->nonb_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "hbond_dist_cutoff:", - control->hbond_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "reax_bond_threshold:", - control->bo_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "physical_bond_threshold:", - control->bg_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "valence_angle_threshold:", - control->thb_cut ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, SCI_LINE, "QEq_tolerance:", 0.0 ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("tabulate_long_range_intrs?:",(control->tabulate ? "yes" : "no")); + buffer += fmtline("table_size:", control->tabulate); + buffer += fmtline("restrict_bonds?:", "no"); + buffer += fmtline("bond_restriction_length:", 0); + buffer += fmtline("reposition_atoms?:", "fit to periodic box"); + buffer += fmtline("remove_CoM_velocity?:", 0); + buffer += fmtline("bonded_intr_dist_cutoff:",control->bond_cut); + buffer += fmtline("nonbonded_intr_dist_cutoff:",control->nonb_cut); + buffer += fmtline("hbond_dist_cutoff:",control->hbond_cut); + buffer += fmtline("reax_bond_threshold:",control->bo_cut); + buffer += fmtline("physical_bond_threshold:", control->bg_cut); + buffer += fmtline("valence_angle_threshold:",control->thb_cut); + buffer += fmtline("QEq_tolerance:", 0.0); /* temperature controls */ - sprintf( out_control->line, REAL_LINE, "initial_temperature:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "target_temperature:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "thermal_inertia:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "temperature_regime:", "(unknown)"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "temperature_change_rate_(K/ps):", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("initial_temperature:", 0.0); + buffer += fmtline("target_temperature:", 0.0); + buffer += fmtline("thermal_inertia:", 0.0); + buffer += fmtline("temperature_regime:", "(unknown)"); + buffer += fmtline("temperature_change_rate_(K/ps):", 0.0); /* pressure controls */ - sprintf( out_control->line, REAL3_LINE, "target_pressure_(GPa):", 0.0, 0.0, 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL3_LINE, "virial_inertia:", 0.0, 0.0, 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("target_pressure_(GPa):", 0.0, 0.0, 0.0); + buffer += fmtline("virial_inertia:", 0.0, 0.0, 0.0); /* trajectory */ - sprintf( out_control->line, INT_LINE, "energy_dumping_freq:", - out_control->energy_update_freq ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, INT_LINE, "trajectory_dumping_freq:", - out_control->write_steps ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "compress_trajectory_output?:", "no"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "trajectory_format:", "regular"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "atom_info:", - atom_formats[ out_control->atom_info ] ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "bond_info:", - bond_formats[ out_control->bond_info ] ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, STR_LINE, "angle_info:", - angle_formats[ out_control->angle_info ] ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("energy_dumping_freq:", out_control->energy_update_freq); + buffer += fmtline("trajectory_dumping_freq:",out_control->write_steps); + buffer += fmtline("compress_trajectory_output?:", "no"); + buffer += fmtline("trajectory_format:", "regular"); + buffer += fmtline("atom_info:", atom_formats[out_control->atom_info]); + buffer += fmtline("bond_info:", bond_formats[out_control->bond_info]); + buffer += fmtline("angle_info:", angle_formats[out_control->angle_info]); /* analysis */ - sprintf( out_control->line, STR_LINE, "molecular_analysis:", "no"); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - sprintf( out_control->line, INT_LINE, "molecular_analysis_frequency:", 0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("molecular_analysis:", "no"); + buffer += fmtline("molecular_analysis_frequency:", 0); + + /* dump out the buffer */ + + fputs(buffer.c_str(),out_control->strj); } - - /* dump out the buffer */ - if (system->my_rank == MASTER_NODE) - fprintf( out_control->strj, "%s", out_control->buffer ); - - return SUCCESS; } - -int Write_Init_Desc(reax_system *system, output_controls *out_control, - MPI_Comm world) +void Write_Init_Desc(reax_system *system, output_controls *out_control, MPI_Comm world) { int i, me, np, cnt, buffer_len, buffer_req; reax_atom *p_atom; @@ -247,63 +189,55 @@ int Write_Init_Desc(reax_system *system, output_controls *out_control, else buffer_req = system->n * INIT_DESC_LEN + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - out_control->line[0] = 0; out_control->buffer[0] = 0; for (i = 0; i < system->n; ++i) { - p_atom = &( system->my_atoms[i] ); - sprintf( out_control->line, INIT_DESC, - p_atom->orig_id, p_atom->type, p_atom->name, - system->reax_param.sbp[ p_atom->type ].mass ); - strncpy( out_control->buffer + i*INIT_DESC_LEN, - out_control->line, INIT_DESC_LEN+1 ); + p_atom = &(system->my_atoms[i]); + auto buffer = fmt::format("{:9}{:3}{:9}{:10.3f}\n", + p_atom->orig_id, p_atom->type, p_atom->name, + system->reax_param.sbp[p_atom->type].mass); + strncpy(out_control->buffer + i*INIT_DESC_LEN, buffer.c_str(), INIT_DESC_LEN+1); } if (me != MASTER_NODE) { MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np * INIT_DESCS + me, world); + np * INIT_DESCS + me, world); } else { buffer_len = system->n * INIT_DESC_LEN; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { - MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*INIT_DESCS+i, world, &status ); - MPI_Get_count( &status, MPI_CHAR, &cnt ); + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*INIT_DESCS+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); buffer_len += cnt; } out_control->buffer[buffer_len] = 0; - fprintf( out_control->strj, "%s", out_control->buffer ); + fputs(out_control->buffer,out_control->strj); } - - return SUCCESS; } - -int Init_Traj(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world, char *msg) +void Init_Traj(reax_system *system, control_params *control, + output_controls *out_control, MPI_Comm world) { - int atom_line_len[ NR_OPT_ATOM ] = { 0, 0, 0, 0, - ATOM_BASIC_LEN, ATOM_wV_LEN, - ATOM_wF_LEN, ATOM_FULL_LEN }; - int bond_line_len[ NR_OPT_BOND ] = { 0, BOND_BASIC_LEN, BOND_FULL_LEN }; - int angle_line_len[ NR_OPT_ANGLE ] = { 0, ANGLE_BASIC_LEN }; + int atom_line_len[NR_OPT_ATOM] = { 0, 0, 0, 0, ATOM_BASIC_LEN, ATOM_wV_LEN, ATOM_wF_LEN, ATOM_FULL_LEN}; + int bond_line_len[NR_OPT_BOND] = { 0, BOND_BASIC_LEN, BOND_FULL_LEN }; + int angle_line_len[NR_OPT_ANGLE] = { 0, ANGLE_BASIC_LEN }; /* generate trajectory name */ auto fname = std::string(control->sim_name) + ".trj"; /* how should I write atoms? */ - out_control->atom_line_len = atom_line_len[ out_control->atom_info ]; - out_control->write_atoms = ( out_control->atom_line_len ? 1 : 0 ); + out_control->atom_line_len = atom_line_len[out_control->atom_info]; + out_control->write_atoms = (out_control->atom_line_len ? 1 : 0); /* bonds? */ - out_control->bond_line_len = bond_line_len[ out_control->bond_info ]; - out_control->write_bonds = ( out_control->bond_line_len ? 1 : 0 ); + out_control->bond_line_len = bond_line_len[out_control->bond_info]; + out_control->write_bonds = (out_control->bond_line_len ? 1 : 0); /* angles? */ - out_control->angle_line_len = angle_line_len[ out_control->angle_info ]; - out_control->write_angles = ( out_control->angle_line_len ? 1 : 0 ); + out_control->angle_line_len = angle_line_len[out_control->angle_info]; + out_control->write_angles = (out_control->angle_line_len ? 1 : 0); /* allocate line & buffer space */ - out_control->line = (char*) calloc( MAX_TRJ_LINE_LEN + 1, sizeof(char) ); out_control->buffer_len = 0; out_control->buffer = nullptr; @@ -313,59 +247,33 @@ int Init_Traj(reax_system *system, control_params *control, Write_Header(system, control, out_control); Write_Init_Desc(system, out_control, world); - - return SUCCESS; } - -int Write_Frame_Header(reax_system *system, control_params *control, - simulation_data *data, output_controls *out_control) +void Write_Frame_Header(reax_system *system, simulation_data *data, output_controls *out_control) { - int me, num_frm_hdr_lines, my_frm_hdr_lines, buffer_req; - - me = system->my_rank; + const int me = system->my_rank; /* frame header lengths */ - num_frm_hdr_lines = 22; - my_frm_hdr_lines = num_frm_hdr_lines * ( me == MASTER_NODE ); - buffer_req = my_frm_hdr_lines * HEADER_LINE_LEN; - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req ); + constexpr int num_frm_hdr_lines = 22; /* only the master node writes into trajectory header */ if (me == MASTER_NODE) { - /* clear the contents of line & buffer */ - out_control->line[0] = 0; - out_control->buffer[0] = 0; + std::string buffer(""); /* skip info */ - sprintf( out_control->line, INT_LINE, "chars_to_skip_frame_header:", - (num_frm_hdr_lines - 1) * HEADER_LINE_LEN ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("chars_to_skip_frame_header:", (num_frm_hdr_lines-1)*HEADER_LINE_LEN); /* step & time */ - sprintf( out_control->line, INT_LINE, "step:", data->step ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "time_in_ps:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("step:", data->step); + buffer += fmtline("time_in_ps:", 0.0); /* box info */ - sprintf( out_control->line, REAL_LINE, "volume:", 0.0 ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL3_LINE, "box_dimensions:", 0.0, 0.0, 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL3_LINE, - "coordinate_angles:", 90.0, 90.0, 90.0 ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("volume:", 0.0); + buffer += fmtline("box_dimensions:", 0.0, 0.0, 0.0); + buffer += fmtline("coordinate_angles:", 90.0, 90.0, 90.0); /* system T and P */ - sprintf( out_control->line, REAL_LINE, "temperature:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "pressure:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("temperature:", 0.0); + buffer += fmtline("pressure:", 0.0); /* energies */ double epot = data->sys_en.e_bond + data->sys_en.e_ov + data->sys_en.e_un @@ -374,71 +282,28 @@ int Write_Frame_Header(reax_system *system, control_params *control, + data->sys_en.e_con + data->sys_en.e_vdW + data->sys_en.e_ele + data->my_en.e_pol; - sprintf( out_control->line, REAL_LINE, "total_energy:", epot); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + buffer += fmtline("total_energy:", epot); + buffer += fmtline("total_kinetic:", 0.0); + buffer += fmtline("total_potential:", epot); + buffer += fmtline("bond_energy:", data->sys_en.e_bond); + buffer += fmtline("atom_energy:", data->sys_en.e_ov + data->sys_en.e_un); + buffer += fmtline("lone_pair_energy:", data->sys_en.e_lp); + buffer += fmtline("valence_angle_energy:", data->sys_en.e_ang + data->sys_en.e_pen); + buffer += fmtline("3-body_conjugation:", data->sys_en.e_coa); + buffer += fmtline("hydrogen_bond_energy:", data->sys_en.e_hb); + buffer += fmtline("torsion_angle_energy:", data->sys_en.e_tor); + buffer += fmtline("4-body_conjugation:", data->sys_en.e_con); + buffer += fmtline("vdWaals_energy:", data->sys_en.e_vdW); + buffer += fmtline("electrostatics_energy:", data->sys_en.e_ele); + buffer += fmtline("polarization_energy:", data->sys_en.e_pol); - sprintf( out_control->line, REAL_LINE, "total_kinetic:", 0.0); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "total_potential:", epot); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "bond_energy:", - data->sys_en.e_bond ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "atom_energy:", - data->sys_en.e_ov + data->sys_en.e_un ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "lone_pair_energy:", - data->sys_en.e_lp ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "valence_angle_energy:", - data->sys_en.e_ang + data->sys_en.e_pen ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "3-body_conjugation:", - data->sys_en.e_coa ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "hydrogen_bond_energy:", - data->sys_en.e_hb ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "torsion_angle_energy:", - data->sys_en.e_tor ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "4-body_conjugation:", - data->sys_en.e_con ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "vdWaals_energy:", - data->sys_en.e_vdW ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "electrostatics_energy:", - data->sys_en.e_ele ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); - - sprintf( out_control->line, REAL_LINE, "polarization_energy:", - data->sys_en.e_pol ); - strncat( out_control->buffer, out_control->line, HEADER_LINE_LEN+1 ); + /* dump out the buffer */ + fputs(buffer.c_str(),out_control->strj); } - - /* dump out the buffer */ - if (system->my_rank == MASTER_NODE) - fprintf( out_control->strj, "%s", out_control->buffer ); - - return SUCCESS; } - - -int Write_Atoms(reax_system *system, output_controls *out_control, - MPI_Comm world) +void Write_Atoms(reax_system *system, output_controls *out_control, + MPI_Comm world) { int i, me, np, line_len, buffer_len, buffer_req, cnt; MPI_Status status; @@ -455,65 +320,60 @@ int Write_Atoms(reax_system *system, output_controls *out_control, else buffer_req = system->n * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); /* fill in buffer */ - out_control->line[0] = 0; out_control->buffer[0] = 0; + for (i = 0; i < system->n; ++i) { - p_atom = &( system->my_atoms[i] ); - + std::string buffer(""); + p_atom = &(system->my_atoms[i]); + buffer += fmt::format("{:9}{:10.3f}{:10.3f}{:10.3f}",p_atom->orig_id, + p_atom->x[0], p_atom->x[1],p_atom->x[2]); + switch (out_control->atom_info) { case OPT_ATOM_BASIC: - sprintf( out_control->line, ATOM_BASIC, - p_atom->orig_id, p_atom->x[0], p_atom->x[1], p_atom->x[2], - p_atom->q ); + buffer += fmt::format("{:10.3f}\n",p_atom->q); break; case OPT_ATOM_wF: - sprintf( out_control->line, ATOM_wF, - p_atom->orig_id, p_atom->x[0], p_atom->x[1], p_atom->x[2], - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q ); + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); break; case OPT_ATOM_wV: - sprintf( out_control->line, ATOM_wV, - p_atom->orig_id, p_atom->x[0], p_atom->x[1], p_atom->x[2], - p_atom->v[0], p_atom->v[1], p_atom->v[2], p_atom->q ); + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->v[0], p_atom->v[1], p_atom->v[2], p_atom->q); break; case OPT_ATOM_FULL: - sprintf( out_control->line, ATOM_FULL, - p_atom->orig_id, p_atom->x[0], p_atom->x[1], p_atom->x[2], - p_atom->v[0], p_atom->v[1], p_atom->v[2], - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q ); + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->v[0], p_atom->v[1], p_atom->v[2], + p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); break; default: system->error_ptr->one(FLERR,"Write_traj_atoms: unknown atom trajectory format"); } - strncpy( out_control->buffer + i*line_len, out_control->line, line_len+1 ); + strncpy(out_control->buffer + i*line_len, buffer.c_str(), line_len+1); } if (me != MASTER_NODE) { - MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ATOM_LINES+me, world); + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np*ATOM_LINES+me, world); } else { buffer_len = system->n * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { - MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ATOM_LINES+i, world, &status ); - MPI_Get_count( &status, MPI_CHAR, &cnt ); + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*ATOM_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); buffer_len += cnt; } out_control->buffer[buffer_len] = 0; - fprintf( out_control->strj, "%s", out_control->buffer ); + fputs(out_control->buffer, out_control->strj); } - - return SUCCESS; } - -int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, - output_controls *out_control, MPI_Comm world) +void Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, + output_controls *out_control, MPI_Comm world) { int i, j, pj, me, np; int my_bonds, num_bonds; @@ -530,78 +390,71 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, for (i=0; i < system->n; ++i) for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { j = bonds->select.bond_list[pj].nbr; - if ( system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && - bonds->select.bond_list[pj].bo_data.BO >= control->bg_cut ) + if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && + bonds->select.bond_list[pj].bo_data.BO >= control->bg_cut) ++my_bonds; } /* allreduce - total number of bonds */ - MPI_Allreduce( &my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world ); + MPI_Allreduce(&my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world); - Write_Skip_Line( out_control, me, num_bonds*line_len, num_bonds ); + Write_Skip_Line(out_control, me, num_bonds*line_len, num_bonds); if (me == MASTER_NODE) buffer_req = num_bonds * line_len + 1; else buffer_req = my_bonds * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); /* fill in the buffer */ - out_control->line[0] = 0; out_control->buffer[0] = 0; my_bonds = 0; for (i=0; i < system->n; ++i) { for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - bo_ij = &( bonds->select.bond_list[pj] ); + bo_ij = &(bonds->select.bond_list[pj]); j = bo_ij->nbr; - if ( system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && + if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && bo_ij->bo_data.BO >= control->bg_cut) { + auto buffer = fmt::format("{:9}{:9}{:10.3f}{:10.3f}", system->my_atoms[i].orig_id, + system->my_atoms[j].orig_id,bo_ij->d,bo_ij->bo_data.BO); + switch (out_control->bond_info) { case OPT_BOND_BASIC: - sprintf( out_control->line, BOND_BASIC, - system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, - bo_ij->d, bo_ij->bo_data.BO ); + buffer += "\n"; break; case OPT_BOND_FULL: - sprintf( out_control->line, BOND_FULL, - system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, - bo_ij->d, bo_ij->bo_data.BO, bo_ij->bo_data.BO_s, - bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2 ); + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}\n", bo_ij->bo_data.BO_s, + bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2); break; default: system->error_ptr->one(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); } - strncpy( out_control->buffer + my_bonds*line_len, - out_control->line, line_len+1 ); + strncpy(out_control->buffer + my_bonds*line_len, buffer.c_str(), line_len+1); ++my_bonds; } } } if (me != MASTER_NODE) { - MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*BOND_LINES+me, world ); + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, np*BOND_LINES+me, world); } else { buffer_len = my_bonds * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { - MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*BOND_LINES+i, world, &status ); - MPI_Get_count( &status, MPI_CHAR, &cnt ); + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*BOND_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); buffer_len += cnt; } out_control->buffer[buffer_len] = 0; - fprintf( out_control->strj, "%s", out_control->buffer ); + fputs(out_control->buffer,out_control->strj); } - - return SUCCESS; } - -int Write_Angles( reax_system *system, control_params *control, +void Write_Angles(reax_system *system, control_params *control, reax_list *bonds, reax_list *thb_intrs, output_controls *out_control, MPI_Comm world) { @@ -624,32 +477,31 @@ int Write_Angles( reax_system *system, control_params *control, i = bo_ij->nbr; if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index( pi, thb_intrs); - pk < End_Index( pi, thb_intrs ); ++pk) { + for (pk = Start_Index(pi, thb_intrs); + pk < End_Index(pi, thb_intrs); ++pk) { angle_ijk = &(thb_intrs->select.three_body_list[pk]); k = angle_ijk->thb; bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); - if ( system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && - bo_jk->bo_data.BO >= control->bg_cut ) // physical j&k bond + if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && + bo_jk->bo_data.BO >= control->bg_cut) // physical j&k bond ++my_angles; } } /* total number of valences */ MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, world); - Write_Skip_Line( out_control, me, num_angles*line_len, num_angles ); + Write_Skip_Line(out_control, me, num_angles*line_len, num_angles); if (me == MASTER_NODE) buffer_req = num_angles * line_len + 1; else buffer_req = my_angles * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); /* fill in the buffer */ my_angles = 0; - out_control->line[0] = 0; out_control->buffer[0] = 0; for (j = 0; j < system->n; ++j) for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { @@ -657,50 +509,46 @@ int Write_Angles( reax_system *system, control_params *control, i = bo_ij->nbr; if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index( pi, thb_intrs); - pk < End_Index( pi, thb_intrs ); ++pk) { + for (pk = Start_Index(pi, thb_intrs); + pk < End_Index(pi, thb_intrs); ++pk) { angle_ijk = &(thb_intrs->select.three_body_list[pk]); k = angle_ijk->thb; bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); - if ( system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && + if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && bo_jk->bo_data.BO >= control->bg_cut) { // physical j&k bond - sprintf( out_control->line, ANGLE_BASIC, - system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, - system->my_atoms[k].orig_id, RAD2DEG( angle_ijk->theta ) ); + auto buffer = fmt::format("{:9}{:9}{:9}{:10.3f}\n", + system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, + system->my_atoms[k].orig_id, RAD2DEG(angle_ijk->theta)); - strncpy( out_control->buffer + my_angles*line_len, - out_control->line, line_len+1 ); + strncpy(out_control->buffer + my_angles*line_len, buffer.c_str(), line_len+1); ++my_angles; } } } if (me != MASTER_NODE) { - MPI_Send( out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ANGLE_LINES+me, world ); + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np*ANGLE_LINES+me, world); } else { buffer_len = my_angles * line_len; for (i = 0; i < np; ++i) if (i != MASTER_NODE) { - MPI_Recv( out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ANGLE_LINES+i, world, &status ); - MPI_Get_count( &status, MPI_CHAR, &cnt ); + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*ANGLE_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); buffer_len += cnt; } out_control->buffer[buffer_len] = 0; - fprintf( out_control->strj, "%s", out_control->buffer ); + fputs(out_control->buffer,out_control->strj); } - - return SUCCESS; } - -int Append_Frame(reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, MPI_Comm world) +void Append_Frame(reax_system *system, control_params *control, + simulation_data *data, reax_list **lists, + output_controls *out_control, MPI_Comm world) { - Write_Frame_Header(system, control, data, out_control); + Write_Frame_Header(system, data, out_control); if (out_control->write_atoms) Write_Atoms(system, out_control, world); @@ -710,19 +558,13 @@ int Append_Frame(reax_system *system, control_params *control, if (out_control->write_angles) Write_Angles(system, control, (*lists + BONDS), (*lists + THREE_BODIES), - out_control, world); - - return SUCCESS; + out_control, world); } - -int End_Traj(int my_rank, output_controls *out_control) +void End_Traj(int my_rank, output_controls *out_control) { if (my_rank == MASTER_NODE) fclose(out_control->strj); free(out_control->buffer); - free(out_control->line); - - return SUCCESS; } diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index cb3f12b6f4..93fa4a6771 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -24,81 +24,15 @@ . ----------------------------------------------------------------------*/ -#ifndef __TRAJ_H__ -#define __TRAJ_H__ +#ifndef LMP_REAXC_TRAJ_H +#define LMP_REAXC_TRAJ_H #include "reaxc_types.h" #include -#define MAX_TRJ_LINE_LEN 120 -#define MAX_TRJ_BUFFER_SIZE (MAX_TRJ_LINE_LEN * 100) - -#define NUM_HEADER_LINES 37 -#define HEADER_LINE_LEN 62 -#define STR_LINE "%-37s%-24s\n" -#define INT_LINE "%-37s%-24d\n" -#if defined(LAMMPS_SMALLSMALL) -#define BIGINT_LINE "%-37s%-24d\n" -#else -#define BIGINT_LINE "%-37s%-24lld\n" -#endif -#define INT2_LINE "%-36s%-12d,%-12d\n" -#define REAL_LINE "%-37s%-24.3f\n" -#define SCI_LINE "%-37s%-24g\n" -#define REAL3_LINE "%-32s%9.3f,%9.3f,%9.3f\n" - -#if defined(LAMMPS_BIGBIG) -#define INIT_DESC "%9lld%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass -#else -#define INIT_DESC "%9d%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass -#endif -#define INIT_DESC_LEN 32 - -#define SIZE_INFO_LINE2 "%-10d%-10d\n" -#define SIZE_INFO_LEN2 21 - -#define SIZE_INFO_LINE3 "%-10d%-10d%-10d\n" -#define SIZE_INFO_LEN3 31 - -#if defined(LAMMPS_BIGBIG) -#define ATOM_BASIC "%9lld%10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge -#define ATOM_wV "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge -#define ATOM_wF "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge -#define ATOM_FULL "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge -#else -#define ATOM_BASIC "%9d%10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge -#define ATOM_wV "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge -#define ATOM_wF "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge -#define ATOM_FULL "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge -#endif -#define ATOM_BASIC_LEN 50 -#define ATOM_wV_LEN 80 -#define ATOM_wF_LEN 80 -#define ATOM_FULL_LEN 110 - -#if defined(LAMMPS_BIGBIG) -#define BOND_BASIC "%9lld%9lld%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO -#define BOND_FULL "%9lld%9lld%10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 -#define ANGLE_BASIC "%9lld%9lld%9lld%10.3f\n" // Atom1 Atom2 Atom3 Theta -#else -#define BOND_BASIC "%9d%9d%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO -#define BOND_FULL "%9d%9d%10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 -#define ANGLE_BASIC "%9d%9d%9d%10.3f\n" // Atom1 Atom2 Atom3 Theta -#endif -#define BOND_BASIC_LEN 39 -#define BOND_FULL_LEN 69 -#define ANGLE_BASIC_LEN 38 - -enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; -enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; -enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; - - -int Init_Traj( reax_system*, control_params*, output_controls*, - MPI_Comm , char* ); -int End_Traj( int, output_controls* ); - -int Append_Frame( reax_system*, control_params*, simulation_data*, - reax_list**, output_controls*, MPI_Comm); +void Init_Traj(reax_system *, control_params *, output_controls *, MPI_Comm); +void End_Traj(int, output_controls *); +void Append_Frame(reax_system *, control_params *, simulation_data *, + reax_list **, output_controls *, MPI_Comm); #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index fcc21cbda2..94adf6c3f7 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -456,7 +456,6 @@ struct output_controls int write_atoms; int write_bonds; int write_angles; - char *line; int buffer_len; char *buffer; From f2772e58948a2d9c2aa555630c5231ca718508d8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Apr 2021 10:50:53 -0400 Subject: [PATCH 032/352] PIMPL-ify reax/c pair styles; first steps toward a ReaxFF namespace --- src/KOKKOS/pair_reaxc_kokkos.cpp | 319 +++++++++++----------- src/USER-OMP/pair_reaxc_omp.cpp | 196 +++++++------- src/USER-REAXC/fix_qeq_reax.cpp | 6 +- src/USER-REAXC/fix_reaxc_bonds.cpp | 14 +- src/USER-REAXC/pair_reaxc.cpp | 422 ++++++++++++++--------------- src/USER-REAXC/pair_reaxc.h | 22 +- src/USER-REAXC/reaxc_ffield.h | 4 +- src/USER-REAXC/reaxc_traj.cpp | 8 +- src/USER-REAXC/reaxc_types.h | 9 + src/USER-REAXC/reaxff_api.h | 38 +++ 10 files changed, 541 insertions(+), 497 deletions(-) create mode 100644 src/USER-REAXC/reaxff_api.h diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index f9f3ebfdfa..4ef82776d8 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -27,10 +27,13 @@ #include "math_special.h" #include "neigh_request.h" #include "neighbor.h" + #include "reaxc_defs.h" #include "reaxc_lookup.h" #include "reaxc_tool_box.h" +#include "reaxff_api.h" + #include @@ -174,14 +177,14 @@ void PairReaxCKokkos::setup() // general parameters for (i = 0; i < 39; i ++) - gp[i] = system->reax_param.gp.l[i]; + gp[i] = api->system->reax_param.gp.l[i]; p_boc1 = gp[0]; p_boc2 = gp[1]; // vdw parameters - vdwflag = system->reax_param.gp.vdw_type; - lgflag = control->lgflag; + vdwflag = api->system->reax_param.gp.vdw_type; + lgflag = api->control->lgflag; // atom, bond, angle, dihedral, H-bond specific parameters two_body_parameters *twbp; @@ -201,38 +204,38 @@ void PairReaxCKokkos::setup() if (map[i] == -1) continue; // general - k_params_sing.h_view(i).mass = system->reax_param.sbp[map[i]].mass; + k_params_sing.h_view(i).mass = api->system->reax_param.sbp[map[i]].mass; // polarization - k_params_sing.h_view(i).chi = system->reax_param.sbp[map[i]].chi; - k_params_sing.h_view(i).eta = system->reax_param.sbp[map[i]].eta; + k_params_sing.h_view(i).chi = api->system->reax_param.sbp[map[i]].chi; + k_params_sing.h_view(i).eta = api->system->reax_param.sbp[map[i]].eta; // bond order - k_params_sing.h_view(i).r_s = system->reax_param.sbp[map[i]].r_s; - k_params_sing.h_view(i).r_pi = system->reax_param.sbp[map[i]].r_pi; - k_params_sing.h_view(i).r_pi2 = system->reax_param.sbp[map[i]].r_pi_pi; - k_params_sing.h_view(i).valency = system->reax_param.sbp[map[i]].valency; - k_params_sing.h_view(i).valency_val = system->reax_param.sbp[map[i]].valency_val; - k_params_sing.h_view(i).valency_boc = system->reax_param.sbp[map[i]].valency_boc; - k_params_sing.h_view(i).valency_e = system->reax_param.sbp[map[i]].valency_e; - k_params_sing.h_view(i).nlp_opt = system->reax_param.sbp[map[i]].nlp_opt; + k_params_sing.h_view(i).r_s = api->system->reax_param.sbp[map[i]].r_s; + k_params_sing.h_view(i).r_pi = api->system->reax_param.sbp[map[i]].r_pi; + k_params_sing.h_view(i).r_pi2 = api->system->reax_param.sbp[map[i]].r_pi_pi; + k_params_sing.h_view(i).valency = api->system->reax_param.sbp[map[i]].valency; + k_params_sing.h_view(i).valency_val = api->system->reax_param.sbp[map[i]].valency_val; + k_params_sing.h_view(i).valency_boc = api->system->reax_param.sbp[map[i]].valency_boc; + k_params_sing.h_view(i).valency_e = api->system->reax_param.sbp[map[i]].valency_e; + k_params_sing.h_view(i).nlp_opt = api->system->reax_param.sbp[map[i]].nlp_opt; // multibody - k_params_sing.h_view(i).p_lp2 = system->reax_param.sbp[map[i]].p_lp2; - k_params_sing.h_view(i).p_ovun2 = system->reax_param.sbp[map[i]].p_ovun2; - k_params_sing.h_view(i).p_ovun5 = system->reax_param.sbp[map[i]].p_ovun5; + k_params_sing.h_view(i).p_lp2 = api->system->reax_param.sbp[map[i]].p_lp2; + k_params_sing.h_view(i).p_ovun2 = api->system->reax_param.sbp[map[i]].p_ovun2; + k_params_sing.h_view(i).p_ovun5 = api->system->reax_param.sbp[map[i]].p_ovun5; // angular - k_params_sing.h_view(i).p_val3 = system->reax_param.sbp[map[i]].p_val3; - k_params_sing.h_view(i).p_val5 = system->reax_param.sbp[map[i]].p_val5; + k_params_sing.h_view(i).p_val3 = api->system->reax_param.sbp[map[i]].p_val3; + k_params_sing.h_view(i).p_val5 = api->system->reax_param.sbp[map[i]].p_val5; // hydrogen bond - k_params_sing.h_view(i).p_hbond = system->reax_param.sbp[map[i]].p_hbond; + k_params_sing.h_view(i).p_hbond = api->system->reax_param.sbp[map[i]].p_hbond; for (j = 1; j <= n; j++) { if (map[j] == -1) continue; - twbp = &(system->reax_param.tbp[map[i]][map[j]]); + twbp = &(api->system->reax_param.tbp[map[i]][map[j]]); // vdW k_params_twbp.h_view(i,j).gamma = twbp->gamma; @@ -276,7 +279,7 @@ void PairReaxCKokkos::setup() if (map[k] == -1) continue; // Angular - thbh = &(system->reax_param.thbp[map[i]][map[j]][map[k]]); + thbh = &(api->system->reax_param.thbp[map[i]][map[j]][map[k]]); thbp = &(thbh->prm[0]); k_params_thbp.h_view(i,j,k).cnt = thbh->cnt; k_params_thbp.h_view(i,j,k).theta_00 = thbp->theta_00; @@ -288,7 +291,7 @@ void PairReaxCKokkos::setup() k_params_thbp.h_view(i,j,k).p_coa1 = thbp->p_coa1; // Hydrogen Bond - hbp = &(system->reax_param.hbp[map[i]][map[j]][map[k]]); + hbp = &(api->system->reax_param.hbp[map[i]][map[j]][map[k]]); k_params_hbp.h_view(i,j,k).p_hb1 = hbp->p_hb1; k_params_hbp.h_view(i,j,k).p_hb2 = hbp->p_hb2; k_params_hbp.h_view(i,j,k).p_hb3 = hbp->p_hb3; @@ -298,7 +301,7 @@ void PairReaxCKokkos::setup() if (map[m] == -1) continue; // Torsion - fbh = &(system->reax_param.fbp[map[i]][map[j]][map[k]][map[m]]); + fbh = &(api->system->reax_param.fbp[map[i]][map[j]][map[k]][map[m]]); fbp = &(fbh->prm[0]); k_params_fbp.h_view(i,j,k,m).p_tor1 = fbp->p_tor1; k_params_fbp.h_view(i,j,k,m).p_cot1 = fbp->p_cot1; @@ -316,13 +319,13 @@ void PairReaxCKokkos::setup() k_params_hbp.template modify(); // cutoffs - cut_nbsq = control->nonb_cut * control->nonb_cut; - cut_hbsq = control->hbond_cut * control->hbond_cut; - cut_bosq = control->bond_cut * control->bond_cut; + cut_nbsq = api->control->nonb_cut * api->control->nonb_cut; + cut_hbsq = api->control->hbond_cut * api->control->hbond_cut; + cut_bosq = api->control->bond_cut * api->control->bond_cut; // bond order cutoffs bo_cut = 0.01 * gp[29]; - thb_cut = control->thb_cut; + thb_cut = api->control->thb_cut; thb_cutsq = 0.000010; //thb_cut*thb_cut; if (atom->nmax > nmax) { @@ -338,13 +341,13 @@ void PairReaxCKokkos::init_md() { // init_taper() F_FLOAT d1, d7, swa, swa2, swa3, swb, swb2, swb3; - LR_lookup_table ** & LR = system->LR; + LR_lookup_table ** & LR = api->system->LR; - swa = control->nonb_low; - swb = control->nonb_cut; - enobondsflag = control->enobondsflag; + swa = api->control->nonb_low; + swb = api->control->nonb_cut; + enobondsflag = api->control->enobondsflag; - if (fabs(swa) > 0.01 ) + if (fabs(swa) > 0.01) error->warning(FLERR,"Warning: non-zero lower Taper-radius cutoff"); if (swb < 0) @@ -363,18 +366,18 @@ void PairReaxCKokkos::init_md() k_tap.h_view(7) = 20.0/d7; k_tap.h_view(6) = -70.0 * (swa + swb) / d7; k_tap.h_view(5) = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; - k_tap.h_view(4) = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3 ) / d7; - k_tap.h_view(3) = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; + k_tap.h_view(4) = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; + k_tap.h_view(3) = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; k_tap.h_view(2) =-210.0 * (swa3*swb2 + swa2*swb3) / d7; k_tap.h_view(1) = 140.0 * swa3 * swb3 / d7; k_tap.h_view(0) = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; + 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; k_tap.template modify(); k_tap.template sync(); - if (control->tabulate) { + if (api->control->tabulate) { int ntypes = atom->ntypes; Init_Lookup_Tables(); @@ -436,7 +439,7 @@ int PairReaxCKokkos::Init_Lookup_Tables() double dr; double *h, *fh, *fvdw, *fele, *fCEvd, *fCEclmb; double v0_vdw, v0_ele, vlast_vdw, vlast_ele; - LR_lookup_table ** & LR = system->LR; + LR_lookup_table ** & LR = api->system->LR; /* initializations */ v0_vdw = 0; @@ -445,49 +448,49 @@ int PairReaxCKokkos::Init_Lookup_Tables() vlast_ele = 0; num_atom_types = atom->ntypes; - dr = control->nonb_cut / control->tabulate; + dr = api->control->nonb_cut / api->control->tabulate; h = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:h"); fh = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:fh"); fvdw = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:fvdw"); fCEvd = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:fCEvd"); fele = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:fele"); fCEclmb = (double*) - smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); + smalloc(api->control->error_ptr, (api->control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); LR = (LR_lookup_table**) - scalloc( control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table*), "lookup:LR"); + scalloc(api->control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table*), "lookup:LR"); for (i = 0; i < num_atom_types+1; ++i) LR[i] = (LR_lookup_table*) - scalloc( control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table), "lookup:LR[i]"); + scalloc(api->control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table), "lookup:LR[i]"); for (i = 1; i <= num_atom_types; ++i) { for (j = i; j <= num_atom_types; ++j) { LR[i][j].xmin = 0; - LR[i][j].xmax = control->nonb_cut; - LR[i][j].n = control->tabulate + 2; + LR[i][j].xmax = api->control->nonb_cut; + LR[i][j].n = api->control->tabulate + 2; LR[i][j].dx = dr; - LR[i][j].inv_dx = control->tabulate / control->nonb_cut; + LR[i][j].inv_dx = api->control->tabulate / api->control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc( control->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); + smalloc(api->control->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); LR[i][j].H = (cubic_spline_coef*) - smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); + smalloc(api->control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); LR[i][j].vdW = (cubic_spline_coef*) - smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); + smalloc(api->control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); + smalloc(api->control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); LR[i][j].ele = (cubic_spline_coef*) - smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); + smalloc(api->control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), + smalloc(api->control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), "lookup:LR[i,j].CEclmb"); - for (r = 1; r <= control->tabulate; ++r) { - LR_vdW_Coulomb(i, j, r * dr, &(LR[i][j].y[r]) ); + for (r = 1; r <= api->control->tabulate; ++r) { + LR_vdW_Coulomb(i, j, r * dr, &(LR[i][j].y[r])); h[r] = LR[i][j].dx; fh[r] = LR[i][j].y[r].H; fvdw[r] = LR[i][j].y[r].e_vdW; @@ -508,20 +511,20 @@ int PairReaxCKokkos::Init_Lookup_Tables() vlast_vdw = fCEvd[r-1]; vlast_ele = fele[r-1]; - Natural_Cubic_Spline( control->error_ptr, &h[1], &fh[1], - &(LR[i][j].H[1]), control->tabulate+1 ); + Natural_Cubic_Spline(api->control->error_ptr, &h[1], &fh[1], + &(LR[i][j].H[1]), api->control->tabulate+1); - Complete_Cubic_Spline( control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, - &(LR[i][j].vdW[1]), control->tabulate+1 ); + Complete_Cubic_Spline(api->control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, + &(LR[i][j].vdW[1]), api->control->tabulate+1); - Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEvd[1], - &(LR[i][j].CEvd[1]), control->tabulate+1 ); + Natural_Cubic_Spline(api->control->error_ptr, &h[1], &fCEvd[1], + &(LR[i][j].CEvd[1]), api->control->tabulate+1); - Complete_Cubic_Spline( control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, - &(LR[i][j].ele[1]), control->tabulate+1 ); + Complete_Cubic_Spline(api->control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, + &(LR[i][j].ele[1]), api->control->tabulate+1); - Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEclmb[1], - &(LR[i][j].CEclmb[1]), control->tabulate+1 ); + Natural_Cubic_Spline(api->control->error_ptr, &h[1], &fCEclmb[1], + &(LR[i][j].CEclmb[1]), api->control->tabulate+1); } } free(h); @@ -541,7 +544,7 @@ void PairReaxCKokkos::Deallocate_Lookup_Tables() { int i, j; int ntypes; - LR_lookup_table ** & LR = system->LR; + LR_lookup_table ** & LR = api->system->LR; ntypes = atom->ntypes; @@ -550,25 +553,25 @@ void PairReaxCKokkos::Deallocate_Lookup_Tables() for (j = i; j <= ntypes; ++j) { if (map[i] == -1) continue; if (LR[i][j].n) { - sfree( control->error_ptr, LR[i][j].y, "LR[i,j].y" ); - sfree( control->error_ptr, LR[i][j].H, "LR[i,j].H" ); - sfree( control->error_ptr, LR[i][j].vdW, "LR[i,j].vdW" ); - sfree( control->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree( control->error_ptr, LR[i][j].ele, "LR[i,j].ele" ); - sfree( control->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); + sfree(api->control->error_ptr, LR[i][j].y, "LR[i,j].y"); + sfree(api->control->error_ptr, LR[i][j].H, "LR[i,j].H"); + sfree(api->control->error_ptr, LR[i][j].vdW, "LR[i,j].vdW"); + sfree(api->control->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd"); + sfree(api->control->error_ptr, LR[i][j].ele, "LR[i,j].ele"); + sfree(api->control->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb"); } } - sfree( control->error_ptr, LR[i], "LR[i]" ); + sfree(api->control->error_ptr, LR[i], "LR[i]"); } - sfree( control->error_ptr, LR, "LR" ); + sfree(api->control->error_ptr, LR, "LR"); } /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::LR_vdW_Coulomb( int i, int j, double r_ij, LR_data *lr ) +void PairReaxCKokkos::LR_vdW_Coulomb(int i, int j, double r_ij, LR_data *lr) { - double p_vdW1 = system->reax_param.gp.l[28]; + double p_vdW1 = api->system->reax_param.gp.l[28]; double p_vdW1i = 1.0 / p_vdW1; double powr_vdW1, powgi_vdW1; double tmp, fn13, exp1, exp2; @@ -578,7 +581,7 @@ void PairReaxCKokkos::LR_vdW_Coulomb( int i, int j, double r_ij, LR_ double e_lg, de_lg, r_ij5, r_ij6, re6; two_body_parameters *twbp; - twbp = &(system->reax_param.tbp[map[i]][map[j]]); + twbp = &(api->system->reax_param.tbp[map[i]][map[j]]); e_core = 0; de_core = 0; e_lg = de_lg = 0.0; @@ -600,32 +603,32 @@ void PairReaxCKokkos::LR_vdW_Coulomb( int i, int j, double r_ij, LR_ dTap += k_tap.h_view[1]/r_ij; /*vdWaals Calculations*/ - if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) + if (api->system->reax_param.gp.vdw_type==1 || api->system->reax_param.gp.vdw_type==3) { // shielding powr_vdW1 = pow(r_ij, p_vdW1); - powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); + powgi_vdW1 = pow(1.0 / twbp->gamma_w, p_vdW1); - fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); - exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); + fn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i); + exp1 = exp(twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); lr->e_vdW = Tap * twbp->D * (exp1 - 2.0 * exp2); - dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i-1.0) * pow(r_ij, p_vdW1-2.0); + dfn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i-1.0) * pow(r_ij, p_vdW1-2.0); lr->CEvd = dTap * twbp->D * (exp1 - 2.0 * exp2) - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; } else { // no shielding - exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); + exp1 = exp(twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); lr->e_vdW = Tap * twbp->D * (exp1 - 2.0 * exp2); lr->CEvd = dTap * twbp->D * (exp1 - 2.0 * exp2) - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; } - if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) + if (api->system->reax_param.gp.vdw_type==2 || api->system->reax_param.gp.vdw_type==3) { // inner wall e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); lr->e_vdW += Tap * e_core; @@ -634,14 +637,14 @@ void PairReaxCKokkos::LR_vdW_Coulomb( int i, int j, double r_ij, LR_ lr->CEvd += dTap * e_core + Tap * de_core / r_ij; // lg correction, only if lgvdw is yes - if (control->lgflag) { - r_ij5 = powint( r_ij, 5 ); - r_ij6 = powint( r_ij, 6 ); - re6 = powint( twbp->lgre, 6 ); - e_lg = -(twbp->lgcij/( r_ij6 + re6 )); + if (api->control->lgflag) { + r_ij5 = powint(r_ij, 5); + r_ij6 = powint(r_ij, 6); + re6 = powint(twbp->lgre, 6); + e_lg = -(twbp->lgcij/(r_ij6 + re6)); lr->e_vdW += Tap * e_lg; - de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; + de_lg = -6.0 * e_lg * r_ij5 / (r_ij6 + re6) ; lr->CEvd += dTap * e_lg + Tap * de_lg/r_ij; } @@ -649,14 +652,14 @@ void PairReaxCKokkos::LR_vdW_Coulomb( int i, int j, double r_ij, LR_ /* Coulomb calculations */ - dr3gamij_1 = ( r_ij * r_ij * r_ij + twbp->gamma ); - dr3gamij_3 = pow( dr3gamij_1 , 0.33333333333333 ); + dr3gamij_1 = (r_ij * r_ij * r_ij + twbp->gamma); + dr3gamij_3 = pow(dr3gamij_1 , 0.33333333333333); tmp = Tap / dr3gamij_3; lr->H = EV_to_KCALpMOL * tmp; lr->e_ele = C_ele * tmp; - lr->CEclmb = C_ele * ( dTap - Tap * r_ij / dr3gamij_1 ) / dr3gamij_3; + lr->CEclmb = C_ele * (dTap - Tap * r_ij / dr3gamij_1) / dr3gamij_3; } /* ---------------------------------------------------------------------- */ @@ -736,7 +739,7 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) pvector[13] = ev.ecoul; // LJ + Coulomb - if (control->tabulate) { + if (api->control->tabulate) { if (neighflag == HALF) { if (evflag) Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); @@ -1276,8 +1279,8 @@ void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb cut_nbsq) continue; const F_FLOAT rij = sqrt(rsq); - const int tmin = MIN( itype, jtype ); - const int tmax = MAX( itype, jtype ); + const int tmin = MIN(itype, jtype); + const int tmax = MAX(itype, jtype); const LR_lookup_table_kk& t = d_LR(tmin,tmax); @@ -1665,7 +1668,7 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsHalf, } d_hb_list[j_index] = j; - } else if ( j < nlocal && ihb == 2 && jhb == 1) { + } else if (j < nlocal && ihb == 2 && jhb == 1) { if (NEIGHFLAG == HALF) { i_index = d_hb_first[j] + d_hb_num[j]; d_hb_num[j]++; @@ -1880,7 +1883,7 @@ void PairReaxCKokkos::operator()(PairReaxBondOrder2, const int &ii) (-p_boc1 * exp_p1i + exp_p2i / (exp_p2i + exp_p2j)) + -p_boc1 * exp_p1i / u1_ji - ((val_j+f2) / (u1_ji*u1_ji)) * (-p_boc1 * exp_p1i + exp_p2i / (exp_p2i + exp_p2j))); - Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); + Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + Cf1B_ij * exp_p2j / (exp_p2i + exp_p2j); } else { f1 = 1.0; Cf1_ij = Cf1_ji = 0.0; @@ -2050,7 +2053,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2::operator()(PairReaxComputeMulti2template e_tally(ev,i,i,e_lp); // over coordination - const F_FLOAT exp_ovun1 = p_ovun3 * exp( p_ovun4 * d_sum_ovun(i,2) ); + const F_FLOAT exp_ovun1 = p_ovun3 * exp(p_ovun4 * d_sum_ovun(i,2)); const F_FLOAT inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); const F_FLOAT Delta_lpcorr = d_Delta[i] - (dfvl * d_Delta_lp_temp[i]) * inv_exp_ovun1; - const F_FLOAT exp_ovun2 = exp( p_ovun2 * Delta_lpcorr ); + const F_FLOAT exp_ovun2 = exp(p_ovun2 * Delta_lpcorr); const F_FLOAT inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); const F_FLOAT DlpVi = 1.0 / (Delta_lpcorr + val_i + 1e-8); @@ -2085,14 +2088,14 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2template e_tally(ev,i,i,e_ov); CEover2 = d_sum_ovun(i,1) * DlpVi * inv_exp_ovun2 * - (1.0 - Delta_lpcorr * ( DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2 )); - CEover3 = CEover2 * (1.0 - dfvl * d_dDelta_lp[i] * inv_exp_ovun1 ); + (1.0 - Delta_lpcorr * (DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2)); + CEover3 = CEover2 * (1.0 - dfvl * d_dDelta_lp[i] * inv_exp_ovun1); CEover4 = CEover2 * (dfvl * d_Delta_lp_temp[i]) * p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); // under coordination const F_FLOAT exp_ovun2n = 1.0 / exp_ovun2; - const F_FLOAT exp_ovun6 = exp( p_ovun6 * Delta_lpcorr ); + const F_FLOAT exp_ovun6 = exp(p_ovun6 * Delta_lpcorr); const F_FLOAT exp_ovun8 = p_ovun7 * exp(p_ovun8 * d_sum_ovun(i,2)); const F_FLOAT inv_exp_ovun2n = 1.0 / (1.0 + exp_ovun2n); const F_FLOAT inv_exp_ovun8 = 1.0 / (1.0 + exp_ovun8); @@ -2106,7 +2109,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2template e_tally(ev,i,i,e_un); CEunder1 = inv_exp_ovun2n * - ( p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + p_ovun2 * e_un * exp_ovun2n ); + (p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + p_ovun2 * e_un * exp_ovun2n); CEunder2 = -e_un * p_ovun8 * exp_ovun8 * inv_exp_ovun8; CEunder3 = CEunder1 * (1.0 - dfvl * d_dDelta_lp[i] * inv_exp_ovun1); CEunder4 = CEunder1 * (dfvl * d_Delta_lp_temp[i]) * @@ -2242,7 +2245,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular::operator()(PairReaxComputeAngular 0.0 && SBO <= 1.0) { - SBO2 = pow( SBO, p_val9 ); - CSBO2 = p_val9 * pow( SBO, p_val9 - 1.0 ); + SBO2 = pow(SBO, p_val9); + CSBO2 = p_val9 * pow(SBO, p_val9 - 1.0); } else if (SBO > 1.0 && SBO < 2.0) { - SBO2 = 2.0 - pow( 2.0-SBO, p_val9 ); - CSBO2 = p_val9 * pow( 2.0 - SBO, p_val9 - 1.0 ); + SBO2 = 2.0 - pow(2.0-SBO, p_val9); + CSBO2 = p_val9 * pow(2.0 - SBO, p_val9 - 1.0); } else { SBO2 = 2.0; CSBO2 = 0.0; } - expval6 = exp( p_val6 * d_Delta_boc[i] ); + expval6 = exp(p_val6 * d_Delta_boc[i]); F_FLOAT CdDelta_i = 0.0; F_FLOAT fitmp[3],fjtmp[3]; @@ -2349,21 +2352,21 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular= 0) expval12theta = p_val1 * (1.0 - expval2theta); else // To avoid linear Me-H-Me angles (6/6/06) @@ -2373,7 +2376,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular::operator()(PairReaxComputeAngular::operator()(PairReaxComputeAngular::operator()(PairReaxComputeTorsion::operator()(PairReaxComputeTorsion= 0 && sin_ijk <= 1e-10) tan_ijk_i = cos_ijk / 1e-10; else if (sin_ijk <= 0 && sin_ijk >= -1e-10) tan_ijk_i = -cos_ijk / 1e-10; else tan_ijk_i = cos_ijk / sin_ijk; - exp_tor2_ik = exp( -p_tor2 * BOA_ik ); - exp_cot2_ik = exp( -p_cot2 * SQR(BOA_ik -1.5) ); + exp_tor2_ik = exp(-p_tor2 * BOA_ik); + exp_cot2_ik = exp(-p_cot2 * SQR(BOA_ik -1.5)); for (int l = 0; l < 3; l++) fktmp[l] = 0.0; @@ -2648,7 +2651,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeTorsion= 0 && sin_jil <= 1e-10) tan_jil_i = cos_jil / 1e-10; else if (sin_jil <= 0 && sin_jil >= -1e-10) @@ -2676,13 +2679,13 @@ void PairReaxCKokkos::operator()(PairReaxComputeTorsion::operator()(PairReaxComputeTorsion::operator()(PairReaxComputeTorsion::operator()(PairReaxComputeBond1= 1.00) { if (gp[37] == 2 || (imass == 12.0000 && jmass == 15.9990) || (jmass == 12.0000 && imass == 15.9990)) { - const F_FLOAT exphu = exp(-gp[7] * SQR(BO_i - 2.50) ); + const F_FLOAT exphu = exp(-gp[7] * SQR(BO_i - 2.50)); const F_FLOAT exphua1 = exp(-gp[3] * (d_total_bo[i]-BO_i)); const F_FLOAT exphub1 = exp(-gp[3] * (d_total_bo[j]-BO_i)); const F_FLOAT exphuov = exp(gp[4] * (d_Delta[i] + d_Delta[j])); @@ -3148,7 +3151,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeBond1template e_tally(ev,i,j,estriph); const F_FLOAT decobdbo = gp[10] * exphu * hulpov * (exphua1 + exphub1) * - ( gp[3] - 2.0 * gp[7] * (BO_i-2.50) ); + (gp[3] - 2.0 * gp[7] * (BO_i-2.50)); const F_FLOAT decobdboua = -gp[10] * exphu * hulpov * (gp[3]*exphua1 + 25.0*gp[4]*exphuov*hulpov*(exphua1+exphub1)); const F_FLOAT decobdboub = -gp[10] * exphu * hulpov * @@ -3725,7 +3728,7 @@ void PairReaxCKokkos::FindBond(int &numbonds) copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); - bo_cut_bond = control->bg_cut; + bo_cut_bond = api->control->bg_cut; atomKK->sync(execution_space,TAG_MASK); tag = atomKK->k_tag.view(); diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index e754316ea0..e7e03520e0 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -60,6 +60,8 @@ #include "reaxc_reset_tools.h" #include "reaxc_tool_box.h" +#include "reaxff_api.h" + #if defined(_OPENMP) #include #endif @@ -89,8 +91,8 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) if (lmp->citeme) lmp->citeme->add(cite_pair_reax_c_omp); suffix_flag |= Suffix::OMP; - system->pair_ptr = this; - system->omp_active = 1; + api->system->pair_ptr = this; + api->system->omp_active = 1; num_nbrs_offset = nullptr; @@ -108,7 +110,7 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) PairReaxCOMP::~PairReaxCOMP() { if (setup_flag) { - reax_list * bonds = lists+BONDS; + reax_list * bonds = api->lists+BONDS; for (int i=0; inum_intrs; ++i) sfree(error, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); } @@ -189,22 +191,22 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) control->virial = 1; - else control->virial = 0; + if (vflag_global) api->control->virial = 1; + else api->control->virial = 0; if (vflag_atom) error->all(FLERR,"Pair style reax/c/omp does not support " "computing per-atom stress"); - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + api->system->bigN = static_cast (atom->natoms); // all atoms in the system // setup data structures setup(); - Reset( system, control, data, workspace, &lists ); + Reset( api->system, api->control, api->data, api->workspace, &api->lists ); // Why not update workspace like in MPI-only code? // Using the MPI-only way messes up the hb energy @@ -218,7 +220,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) startTimeBase = MPI_Wtime(); #endif - Compute_ForcesOMP(system,control,data,workspace,&lists,out_control); + Compute_ForcesOMP(api->system,api->control,api->data,api->workspace,&api->lists,api->out_control); read_reax_forces(vflag); #ifdef OMP_TIMING @@ -229,63 +231,63 @@ void PairReaxCOMP::compute(int eflag, int vflag) #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif - for (int k = 0; k < system->N; ++k) { - num_bonds[k] = system->my_atoms[k].num_bonds; - num_hbonds[k] = system->my_atoms[k].num_hbonds; + for (int k = 0; k < api->system->N; ++k) { + num_bonds[k] = api->system->my_atoms[k].num_bonds; + num_hbonds[k] = api->system->my_atoms[k].num_hbonds; } // energies and pressure if (eflag_global) { - evdwl += data->my_en.e_bond; - evdwl += data->my_en.e_ov; - evdwl += data->my_en.e_un; - evdwl += data->my_en.e_lp; - evdwl += data->my_en.e_ang; - evdwl += data->my_en.e_pen; - evdwl += data->my_en.e_coa; - evdwl += data->my_en.e_hb; - evdwl += data->my_en.e_tor; - evdwl += data->my_en.e_con; - evdwl += data->my_en.e_vdW; + evdwl += api->data->my_en.e_bond; + evdwl += api->data->my_en.e_ov; + evdwl += api->data->my_en.e_un; + evdwl += api->data->my_en.e_lp; + evdwl += api->data->my_en.e_ang; + evdwl += api->data->my_en.e_pen; + evdwl += api->data->my_en.e_coa; + evdwl += api->data->my_en.e_hb; + evdwl += api->data->my_en.e_tor; + evdwl += api->data->my_en.e_con; + evdwl += api->data->my_en.e_vdW; - ecoul += data->my_en.e_ele; - ecoul += data->my_en.e_pol; + ecoul += api->data->my_en.e_ele; + ecoul += api->data->my_en.e_pol; // Store the different parts of the energy // in a list for output by compute pair command - pvector[0] = data->my_en.e_bond; - pvector[1] = data->my_en.e_ov + data->my_en.e_un; - pvector[2] = data->my_en.e_lp; + pvector[0] = api->data->my_en.e_bond; + pvector[1] = api->data->my_en.e_ov + api->data->my_en.e_un; + pvector[2] = api->data->my_en.e_lp; pvector[3] = 0.0; - pvector[4] = data->my_en.e_ang; - pvector[5] = data->my_en.e_pen; - pvector[6] = data->my_en.e_coa; - pvector[7] = data->my_en.e_hb; - pvector[8] = data->my_en.e_tor; - pvector[9] = data->my_en.e_con; - pvector[10] = data->my_en.e_vdW; - pvector[11] = data->my_en.e_ele; + pvector[4] = api->data->my_en.e_ang; + pvector[5] = api->data->my_en.e_pen; + pvector[6] = api->data->my_en.e_coa; + pvector[7] = api->data->my_en.e_hb; + pvector[8] = api->data->my_en.e_tor; + pvector[9] = api->data->my_en.e_con; + pvector[10] = api->data->my_en.e_vdW; + pvector[11] = api->data->my_en.e_ele; pvector[12] = 0.0; - pvector[13] = data->my_en.e_pol; + pvector[13] = api->data->my_en.e_pol; } if (vflag_fdotr) virial_fdotr_compute(); // Set internal timestep counter to that of LAMMPS - data->step = update->ntimestep; + api->data->step = update->ntimestep; - Output_Results( system, control, data, &lists, out_control, world ); + Output_Results( api->system, api->control, api->data, &api->lists, api->out_control, world ); // populate tmpid and tmpbo arrays for fix reax/c/species if (fixspecies_flag) { - if (system->N > nmax) { + if (api->system->N > nmax) { memory->destroy(tmpid); memory->destroy(tmpbo); - nmax = system->N; + nmax = api->system->N; memory->create(tmpid,nmax,MAXSPECBOND,"pair:tmpid"); memory->create(tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); } @@ -293,7 +295,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) #if defined(_OPENMP) #pragma omp parallel for collapse(2) schedule(static) default(shared) #endif - for (int i = 0; i < system->N; i++) + for (int i = 0; i < api->system->N; i++) for (int j = 0; j < MAXSPECBOND; j++) { tmpbo[i][j] = 0.0; tmpid[i][j] = 0; @@ -317,10 +319,10 @@ void PairReaxCOMP::init_style( ) if (!have_qeq && qeqflag == 1) error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - system->bigN = static_cast (atom->natoms); // all atoms in the system - system->wsize = comm->nprocs; + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + api->system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->wsize = comm->nprocs; if (atom->tag_enable == 0) error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); @@ -343,20 +345,20 @@ void PairReaxCOMP::init_style( ) neighbor->requests[irequest]->newton = 2; neighbor->requests[irequest]->ghost = 1; - cutmax = MAX3(control->nonb_cut, control->hbond_cut, control->bond_cut); - if ((cutmax < 2.0*control->bond_cut) && (comm->me == 0)) + cutmax = MAX3(api->control->nonb_cut, api->control->hbond_cut, api->control->bond_cut); + if ((cutmax < 2.0*api->control->bond_cut) && (comm->me == 0)) error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); for (int i = 0; i < LIST_N; ++i) - lists[i].allocated = 0; + api->lists[i].allocated = 0; if (fix_reax == nullptr) { modify->add_fix(fmt::format("{} all REAXC",fix_id)); fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; } - control->nthreads = comm->nthreads; + api->control->nthreads = comm->nthreads; } /* ---------------------------------------------------------------------- */ @@ -364,18 +366,18 @@ void PairReaxCOMP::init_style( ) void PairReaxCOMP::setup( ) { int oldN; - int mincap = system->mincap; - double safezone = system->safezone; + int mincap = api->system->mincap; + double safezone = api->system->safezone; - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - oldN = system->N; - system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + oldN = api->system->N; + api->system->bigN = static_cast (atom->natoms); // all atoms in the system - if (system->N > nmax) { + if (api->system->N > nmax) { memory->destroy(num_nbrs_offset); // Don't update nmax here. It is updated at end of compute(). - memory->create(num_nbrs_offset, system->N, "pair:num_nbrs_offset"); + memory->create(num_nbrs_offset, api->system->N, "pair:num_nbrs_offset"); } if (setup_flag == 0) { @@ -387,26 +389,26 @@ void PairReaxCOMP::setup( ) // determine the local and total capacity - system->local_cap = MAX( (int)(system->n * safezone), mincap ); - system->total_cap = MAX( (int)(system->N * safezone), mincap ); + api->system->local_cap = MAX( (int)(api->system->n * safezone), mincap ); + api->system->total_cap = MAX( (int)(api->system->N * safezone), mincap ); // initialize my data structures - PreAllocate_Space( system, control, workspace ); + PreAllocate_Space( api->system, api->control, api->workspace ); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); - if (!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - lists+FAR_NBRS)) + if (!Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, + api->lists+FAR_NBRS)) error->all(FLERR,"Pair reax/c problem in far neighbor list"); write_reax_lists(); - InitializeOMP(system, control, data, workspace, &lists, out_control, world); + InitializeOMP(api->system, api->control, api->data, api->workspace, &api->lists, api->out_control, world); - for (int k = 0; k < system->N; ++k) { - num_bonds[k] = system->my_atoms[k].num_bonds; - num_hbonds[k] = system->my_atoms[k].num_hbonds; + for (int k = 0; k < api->system->N; ++k) { + num_bonds[k] = api->system->my_atoms[k].num_bonds; + num_hbonds[k] = api->system->my_atoms[k].num_hbonds; } } else { @@ -417,16 +419,16 @@ void PairReaxCOMP::setup( ) // reset the bond list info for new atoms - for (int k = oldN; k < system->N; ++k) - Set_End_Index( k, Start_Index( k, lists+BONDS ), lists+BONDS ); + for (int k = oldN; k < api->system->N; ++k) + Set_End_Index( k, Start_Index( k, api->lists+BONDS ), api->lists+BONDS ); // estimate far neighbor list size // Not present in MPI-only version - workspace->realloc.num_far = estimate_reax_lists(); + api->workspace->realloc.num_far = estimate_reax_lists(); // check if I need to shrink/extend my data-structs - ReAllocate( system, control, data, workspace, &lists ); + ReAllocate( api->system, api->control, api->data, api->workspace, &api->lists ); } } @@ -437,21 +439,21 @@ void PairReaxCOMP::write_reax_atoms() int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - if (system->N > system->total_cap) + if (api->system->N > api->system->total_cap) error->all(FLERR,"Too many ghost atoms"); #if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) #endif - for (int i = 0; i < system->N; ++i) { - system->my_atoms[i].orig_id = atom->tag[i]; - system->my_atoms[i].type = map[atom->type[i]]; - system->my_atoms[i].x[0] = atom->x[i][0]; - system->my_atoms[i].x[1] = atom->x[i][1]; - system->my_atoms[i].x[2] = atom->x[i][2]; - system->my_atoms[i].q = atom->q[i]; - system->my_atoms[i].num_bonds = num_bonds[i]; - system->my_atoms[i].num_hbonds = num_hbonds[i]; + for (int i = 0; i < api->system->N; ++i) { + api->system->my_atoms[i].orig_id = atom->tag[i]; + api->system->my_atoms[i].type = map[atom->type[i]]; + api->system->my_atoms[i].x[0] = atom->x[i][0]; + api->system->my_atoms[i].x[1] = atom->x[i][1]; + api->system->my_atoms[i].x[2] = atom->x[i][2]; + api->system->my_atoms[i].q = atom->q[i]; + api->system->my_atoms[i].num_bonds = num_bonds[i]; + api->system->my_atoms[i].num_hbonds = num_hbonds[i]; } } @@ -463,7 +465,7 @@ int PairReaxCOMP::estimate_reax_lists() int *ilist = list->ilist; int *numneigh = list->numneigh; int numall = list->inum + list->gnum; - int mincap = system->mincap; + int mincap = api->system->mincap; // for good performance in the OpenMP implementation, each thread needs // to know where to place the neighbors of the atoms it is responsible for. @@ -502,7 +504,7 @@ int PairReaxCOMP::write_reax_lists() int *ilist = list->ilist; int *numneigh = list->numneigh; int **firstneigh = list->firstneigh; - reax_list *far_nbrs = lists + FAR_NBRS; + reax_list *far_nbrs = api->lists + FAR_NBRS; far_neighbor_data *far_list = far_nbrs->select.far_nbr_list; int num_nbrs = 0; @@ -532,9 +534,9 @@ int PairReaxCOMP::write_reax_lists() Set_Start_Index( i, num_nbrs_offset[i], far_nbrs ); if (i < inum) - cutoff_sqr = control->nonb_cut*control->nonb_cut; + cutoff_sqr = SQR(api->control->nonb_cut); else - cutoff_sqr = control->bond_cut*control->bond_cut; + cutoff_sqr = SQR(api->control->bond_cut); num_mynbrs = 0; @@ -545,7 +547,7 @@ int PairReaxCOMP::write_reax_lists() if (d_sqr <= cutoff_sqr) { dist = sqrt( d_sqr ); - set_far_nbr( &far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); + set_far_nbr((ReaxFF::far_neighbor_data *) &far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); ++num_mynbrs; } } @@ -567,14 +569,14 @@ void PairReaxCOMP::read_reax_forces(int /* vflag */) #if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) #endif - for (int i = 0; i < system->N; ++i) { - system->my_atoms[i].f[0] = workspace->f[i][0]; - system->my_atoms[i].f[1] = workspace->f[i][1]; - system->my_atoms[i].f[2] = workspace->f[i][2]; + for (int i = 0; i < api->system->N; ++i) { + api->system->my_atoms[i].f[0] = api->workspace->f[i][0]; + api->system->my_atoms[i].f[1] = api->workspace->f[i][1]; + api->system->my_atoms[i].f[2] = api->workspace->f[i][2]; - atom->f[i][0] = -workspace->f[i][0]; - atom->f[i][1] = -workspace->f[i][1]; - atom->f[i][2] = -workspace->f[i][2]; + atom->f[i][0] = -api->workspace->f[i][0]; + atom->f[i][1] = -api->workspace->f[i][1]; + atom->f[i][2] = -api->workspace->f[i][2]; } } @@ -587,14 +589,14 @@ void PairReaxCOMP::FindBond() #if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) #endif - for (int i = 0; i < system->n; i++) { + for (int i = 0; i < api->system->n; i++) { int j, pj, nj; double bo_tmp; bond_data *bo_ij; nj = 0; - for (pj = Start_Index(i, lists); pj < End_Index(i, lists); ++pj) { - bo_ij = &( lists->select.bond_list[pj] ); + for (pj = Start_Index(i, api->lists); pj < End_Index(i, api->lists); ++pj) { + bo_ij = &( api->lists->select.bond_list[pj] ); j = bo_ij->nbr; if (j < i) continue; diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 2472fc3098..b4b28b587a 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -43,6 +43,8 @@ #include "reaxc_defs.h" #include "reaxc_types.h" +#include "reaxff_api.h" + using namespace LAMMPS_NS; using namespace FixConst; @@ -315,8 +317,8 @@ void FixQEqReax::allocate_matrix() double safezone; if (reaxflag) { - mincap = reaxc->system->mincap; - safezone = reaxc->system->safezone; + mincap = reaxc->api->system->mincap; + safezone = reaxc->api->system->safezone; } else { mincap = REAX_MIN_CAP; safezone = REAX_SAFE_ZONE; diff --git a/src/USER-REAXC/fix_reaxc_bonds.cpp b/src/USER-REAXC/fix_reaxc_bonds.cpp index 26cd7870ff..62e8427894 100644 --- a/src/USER-REAXC/fix_reaxc_bonds.cpp +++ b/src/USER-REAXC/fix_reaxc_bonds.cpp @@ -29,6 +29,8 @@ #include "reaxc_types.h" #include "reaxc_defs.h" +#include "reaxff_api.h" + #include using namespace LAMMPS_NS; @@ -186,7 +188,7 @@ void FixReaxCBonds::FindBond(struct _reax_list * /*lists*/, int &numbonds) inum = reaxc->list->inum; ilist = reaxc->list->ilist; bond_data *bo_ij; - bo_cut = reaxc->control->bg_cut; + bo_cut = reaxc->api->control->bg_cut; tagint *tag = atom->tag; @@ -194,8 +196,8 @@ void FixReaxCBonds::FindBond(struct _reax_list * /*lists*/, int &numbonds) i = ilist[ii]; nj = 0; - for (pj = Start_Index(i, reaxc->lists); pj < End_Index(i, reaxc->lists); ++pj) { - bo_ij = &( reaxc->lists->select.bond_list[pj] ); + for (pj = Start_Index(i, reaxc->api->lists); pj < End_Index(i, reaxc->api->lists); ++pj) { + bo_ij = &( reaxc->api->lists->select.bond_list[pj] ); j = bo_ij->nbr; jtag = tag[j]; bo_tmp = bo_ij->bo_data.BO; @@ -223,8 +225,8 @@ void FixReaxCBonds::PassBuffer(double *buf, int &nbuf_local) for (i = 0; i < nlocal; i++) { buf[j-1] = atom->tag[i]; buf[j+0] = atom->type[i]; - buf[j+1] = reaxc->workspace->total_bond_order[i]; - buf[j+2] = reaxc->workspace->nlp[i]; + buf[j+1] = reaxc->api->workspace->total_bond_order[i]; + buf[j+2] = reaxc->api->workspace->nlp[i]; buf[j+3] = atom->q[i]; buf[j+4] = numneigh[i]; numbonds = nint(buf[j+4]); @@ -258,7 +260,7 @@ void FixReaxCBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local, bigint ntimestep = update->ntimestep; double sbotmp, nlptmp, avqtmp, abotmp; - double cutof3 = reaxc->control->bg_cut; + double cutof3 = reaxc->api->control->bg_cut; MPI_Request irequest, irequest2; if (me == 0) { diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index e8a47658d1..87def7f06b 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -53,6 +53,8 @@ #include "reaxc_reset_tools.h" #include "reaxc_vector.h" +#include "reaxff_api.h" + using namespace LAMMPS_NS; static const char cite_pair_reax_c[] = @@ -81,38 +83,34 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) fix_id = utils::strdup("REAXC_" + std::to_string(instance_me)); - system = (reax_system *) - memory->smalloc(sizeof(reax_system),"reax:system"); - memset(system,0,sizeof(reax_system)); - control = (control_params *) - memory->smalloc(sizeof(control_params),"reax:control"); - memset(control,0,sizeof(control_params)); - data = (simulation_data *) - memory->smalloc(sizeof(simulation_data),"reax:data"); - workspace = (storage *) - memory->smalloc(sizeof(storage),"reax:storage"); - lists = (reax_list *) - memory->smalloc(LIST_N * sizeof(reax_list),"reax:lists"); - memset(lists,0,LIST_N * sizeof(reax_list)); - out_control = (output_controls *) - memory->smalloc(sizeof(output_controls),"reax:out_control"); - memset(out_control,0,sizeof(output_controls)); + api = new ReaxFF::API; - control->me = system->my_rank = comm->me; + api->system = new reax_system; + memset(api->system,0,sizeof(reax_system)); + api->control = new control_params; + memset(api->control,0,sizeof(control_params)); + api->out_control = new output_controls; + memset(api->out_control,0,sizeof(output_controls)); + api->data = new simulation_data; + api->workspace = new storage; + memory->create(api->lists, LIST_N,"reaxff:lists"); + memset(api->lists,0,LIST_N * sizeof(reax_list)); - system->num_nbrs = 0; - system->n = 0; // my atoms - system->N = 0; // mine + ghosts - system->bigN = 0; // all atoms in the system - system->local_cap = 0; - system->total_cap = 0; - system->my_atoms = nullptr; - system->pair_ptr = this; - system->error_ptr = error; - control->error_ptr = error; - control->lmp_ptr = lmp; + api->control->me = api->system->my_rank = comm->me; - system->omp_active = 0; + api->system->num_nbrs = 0; + api->system->n = 0; // my atoms + api->system->N = 0; // mine + ghosts + api->system->bigN = 0; // all atoms in the system + api->system->local_cap = 0; + api->system->total_cap = 0; + api->system->my_atoms = nullptr; + api->system->pair_ptr = this; + api->system->error_ptr = error; + api->control->error_ptr = error; + api->control->lmp_ptr = lmp; + + api->system->omp_active = 0; fix_reax = nullptr; tmpid = nullptr; @@ -137,27 +135,27 @@ PairReaxC::~PairReaxC() delete[] fix_id; if (setup_flag) { - Close_Output_Files(system,out_control); + Close_Output_Files(api->system,api->out_control); // deallocate reax data-structures - if (control->tabulate) Deallocate_Lookup_Tables(system); + if (api->control->tabulate) Deallocate_Lookup_Tables(api->system); - if (control->hbond_cut > 0) Delete_List(lists+HBONDS); - Delete_List(lists+BONDS); - Delete_List(lists+THREE_BODIES); - Delete_List(lists+FAR_NBRS); + if (api->control->hbond_cut > 0) Delete_List(api->lists+HBONDS); + Delete_List(api->lists+BONDS); + Delete_List(api->lists+THREE_BODIES); + Delete_List(api->lists+FAR_NBRS); - DeAllocate_Workspace(control, workspace); - DeAllocate_System(system); + DeAllocate_Workspace(api->control, api->workspace); + DeAllocate_System(api->system); } - memory->destroy(system); - memory->destroy(control); - memory->destroy( data ); - memory->destroy( workspace ); - memory->destroy( lists ); - memory->destroy( out_control ); + delete api->system; + delete api->control; + delete api->out_control; + delete api->data; + delete api->workspace; + memory->destroy(api->lists); // deallocate interface storage if (allocated) { @@ -179,7 +177,7 @@ PairReaxC::~PairReaxC() /* ---------------------------------------------------------------------- */ -void PairReaxC::allocate( ) +void PairReaxC::allocate() { allocated = 1; int n = atom->ntypes; @@ -204,42 +202,42 @@ void PairReaxC::settings(int narg, char **arg) // read name of control file or use default controls if (strcmp(arg[0],"NULL") == 0) { - strcpy( control->sim_name, "simulate" ); - out_control->energy_update_freq = 0; - control->tabulate = 0; + strcpy(api->control->sim_name, "simulate"); + api->out_control->energy_update_freq = 0; + api->control->tabulate = 0; - control->bond_cut = 5.; - control->hbond_cut = 7.50; - control->thb_cut = 0.001; - control->thb_cutsq = 0.00001; - control->bg_cut = 0.3; + api->control->bond_cut = 5.; + api->control->hbond_cut = 7.50; + api->control->thb_cut = 0.001; + api->control->thb_cutsq = 0.00001; + api->control->bg_cut = 0.3; - control->nthreads = 1; + api->control->nthreads = 1; - out_control->write_steps = 0; - strcpy( out_control->traj_title, "default_title" ); - out_control->atom_info = 0; - out_control->bond_info = 0; - out_control->angle_info = 0; - } else Read_Control_File(arg[0], control, out_control); + api->out_control->write_steps = 0; + strcpy(api->out_control->traj_title, "default_title"); + api->out_control->atom_info = 0; + api->out_control->bond_info = 0; + api->out_control->angle_info = 0; + } else Read_Control_File(arg[0], api->control, api->out_control); } - MPI_Bcast(control,sizeof(control_params),MPI_CHAR,0,world); - MPI_Bcast(out_control,sizeof(output_controls),MPI_CHAR,0,world); + MPI_Bcast(api->control,sizeof(control_params),MPI_CHAR,0,world); + MPI_Bcast(api->out_control,sizeof(output_controls),MPI_CHAR,0,world); // must reset these to local values after broadcast - control->me = comm->me; - control->error_ptr = error; - control->lmp_ptr = lmp; + api->control->me = comm->me; + api->control->error_ptr = error; + api->control->lmp_ptr = lmp; // default values qeqflag = 1; - control->lgflag = 0; - control->enobondsflag = 1; - system->mincap = REAX_MIN_CAP; - system->minhbonds = REAX_MIN_HBONDS; - system->safezone = REAX_SAFE_ZONE; - system->saferzone = REAX_SAFER_ZONE; + api->control->lgflag = 0; + api->control->enobondsflag = 1; + api->system->mincap = REAX_MIN_CAP; + api->system->minhbonds = REAX_MIN_HBONDS; + api->system->safezone = REAX_SAFE_ZONE; + api->system->saferzone = REAX_SAFER_ZONE; // process optional keywords @@ -254,33 +252,33 @@ void PairReaxC::settings(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"enobonds") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); - if (strcmp(arg[iarg+1],"yes") == 0) control->enobondsflag = 1; - else if (strcmp(arg[iarg+1],"no") == 0) control->enobondsflag = 0; + if (strcmp(arg[iarg+1],"yes") == 0) api->control->enobondsflag = 1; + else if (strcmp(arg[iarg+1],"no") == 0) api->control->enobondsflag = 0; else error->all(FLERR,"Illegal pair_style reax/c command"); iarg += 2; } else if (strcmp(arg[iarg],"lgvdw") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); - if (strcmp(arg[iarg+1],"yes") == 0) control->lgflag = 1; - else if (strcmp(arg[iarg+1],"no") == 0) control->lgflag = 0; + if (strcmp(arg[iarg+1],"yes") == 0) api->control->lgflag = 1; + else if (strcmp(arg[iarg+1],"no") == 0) api->control->lgflag = 0; else error->all(FLERR,"Illegal pair_style reax/c command"); iarg += 2; } else if (strcmp(arg[iarg],"safezone") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); - system->safezone = utils::numeric(FLERR,arg[iarg+1],false,lmp); - if (system->safezone < 0.0) + api->system->safezone = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (api->system->safezone < 0.0) error->all(FLERR,"Illegal pair_style reax/c safezone command"); - system->saferzone = system->safezone*1.2 + 0.2; + api->system->saferzone = api->system->safezone*1.2 + 0.2; iarg += 2; } else if (strcmp(arg[iarg],"mincap") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); - system->mincap = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - if (system->mincap < 0) + api->system->mincap = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + if (api->system->mincap < 0) error->all(FLERR,"Illegal pair_style reax/c mincap command"); iarg += 2; } else if (strcmp(arg[iarg],"minhbonds") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); - system->minhbonds = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - if (system->minhbonds < 0) + api->system->minhbonds = utils::inumeric(FLERR,arg[iarg+1],false,lmp); + if (api->system->minhbonds < 0) error->all(FLERR,"Illegal pair_style reax/c minhbonds command"); iarg += 2; } else error->all(FLERR,"Illegal pair_style reax/c command"); @@ -289,7 +287,7 @@ void PairReaxC::settings(int narg, char **arg) /* ---------------------------------------------------------------------- */ -void PairReaxC::coeff( int nargs, char **args ) +void PairReaxC::coeff(int nargs, char **args) { if (!allocated) allocate(); @@ -303,13 +301,13 @@ void PairReaxC::coeff( int nargs, char **args ) // read ffield file - Read_Force_Field(args[2], &(system->reax_param), control); + Read_Force_Field(args[2], &(api->system->reax_param), api->control); // read args that map atom types to elements in potential file // map[i] = which element the Ith atom type is, -1 if "NULL" int itmp = 0; - int nreax_types = system->reax_param.num_atom_types; + int nreax_types = api->system->reax_param.num_atom_types; for (int i = 3; i < nargs; i++) { if (strcmp(args[i],"NULL") == 0) { map[i-2] = -1; @@ -323,7 +321,7 @@ void PairReaxC::coeff( int nargs, char **args ) // pair_coeff element map for (int i = 3; i < nargs; i++) for (int j = 0; j < nreax_types; j++) - if (strcasecmp(args[i],system->reax_param.sbp[j].name) == 0) { + if (strcasecmp(args[i],api->system->reax_param.sbp[j].name) == 0) { map[i-2] = j; itmp ++; } @@ -352,7 +350,7 @@ void PairReaxC::coeff( int nargs, char **args ) /* ---------------------------------------------------------------------- */ -void PairReaxC::init_style( ) +void PairReaxC::init_style() { if (!atom->q_flag) error->all(FLERR,"Pair style reax/c requires atom attribute q"); @@ -364,10 +362,10 @@ void PairReaxC::init_style( ) if (!have_qeq && qeqflag == 1) error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - system->bigN = static_cast (atom->natoms); // all atoms in the system - system->wsize = comm->nprocs; + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + api->system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->wsize = comm->nprocs; if (atom->tag_enable == 0) error->all(FLERR,"Pair style reax/c requires atom IDs"); @@ -389,14 +387,14 @@ void PairReaxC::init_style( ) neighbor->requests[irequest]->newton = 2; neighbor->requests[irequest]->ghost = 1; - cutmax = MAX3(control->nonb_cut, control->hbond_cut, control->bond_cut); - if ((cutmax < 2.0*control->bond_cut) && (comm->me == 0)) + cutmax = MAX3(api->control->nonb_cut, api->control->hbond_cut, api->control->bond_cut); + if ((cutmax < 2.0*api->control->bond_cut) && (comm->me == 0)) error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); for (int i = 0; i < LIST_N; ++i) - if (lists[i].allocated != 1) - lists[i].allocated = 0; + if (api->lists[i].allocated != 1) + api->lists[i].allocated = 0; if (fix_reax == nullptr) { modify->add_fix(fmt::format("{} all REAXC",fix_id)); @@ -406,16 +404,16 @@ void PairReaxC::init_style( ) /* ---------------------------------------------------------------------- */ -void PairReaxC::setup( ) +void PairReaxC::setup() { int oldN; - int mincap = system->mincap; - double safezone = system->safezone; + int mincap = api->system->mincap; + double safezone = api->system->safezone; - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - oldN = system->N; - system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + oldN = api->system->N; + api->system->bigN = static_cast (atom->natoms); // all atoms in the system if (setup_flag == 0) { @@ -426,28 +424,28 @@ void PairReaxC::setup( ) // determine the local and total capacity - system->local_cap = MAX( (int)(system->n * safezone), mincap ); - system->total_cap = MAX( (int)(system->N * safezone), mincap ); + api->system->local_cap = MAX((int)(api->system->n * safezone), mincap); + api->system->total_cap = MAX((int)(api->system->N * safezone), mincap); // initialize my data structures - PreAllocate_Space( system, control, workspace ); + PreAllocate_Space(api->system, api->control, api->workspace); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); if (num_nbrs < 0) error->all(FLERR,"Too many neighbors for pair style reax/c"); - if (!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - lists+FAR_NBRS)) + if (!Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, + api->lists+FAR_NBRS)) error->all(FLERR,"Pair reax/c problem in far neighbor list"); - (lists+FAR_NBRS)->error_ptr=error; + (api->lists+FAR_NBRS)->error_ptr=error; write_reax_lists(); - system->wsize = comm->nprocs; - Initialize(system, control, data, workspace, &lists, out_control, world); - for (int k = 0; k < system->N; ++k) { - num_bonds[k] = system->my_atoms[k].num_bonds; - num_hbonds[k] = system->my_atoms[k].num_hbonds; + api->system->wsize = comm->nprocs; + Initialize(api->system, api->control, api->data, api->workspace, &api->lists, api->out_control, world); + for (int k = 0; k < api->system->N; ++k) { + num_bonds[k] = api->system->my_atoms[k].num_bonds; + num_hbonds[k] = api->system->my_atoms[k].num_hbonds; } } else { @@ -458,12 +456,12 @@ void PairReaxC::setup( ) // reset the bond list info for new atoms - for (int k = oldN; k < system->N; ++k) - Set_End_Index( k, Start_Index( k, lists+BONDS ), lists+BONDS ); + for (int k = oldN; k < api->system->N; ++k) + Set_End_Index(k, Start_Index(k, api->lists+BONDS), api->lists+BONDS); // check if I need to shrink/extend my data-structs - ReAllocate( system, control, data, workspace, &lists ); + ReAllocate(api->system, api->control, api->data, api->workspace, &api->lists); } bigint local_ngroup = list->inum; @@ -496,47 +494,47 @@ void PairReaxC::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) control->virial = 1; - else control->virial = 0; + if (vflag_global) api->control->virial = 1; + else api->control->virial = 0; - system->n = atom->nlocal; // my atoms - system->N = atom->nlocal + atom->nghost; // mine + ghosts - system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + api->system->bigN = static_cast (atom->natoms); // all atoms in the system // setup data structures setup(); - Reset( system, control, data, workspace, &lists ); - workspace->realloc.num_far = write_reax_lists(); + Reset(api->system, api->control, api->data, api->workspace, &api->lists); + api->workspace->realloc.num_far = write_reax_lists(); // forces - Compute_Forces(system,control,data,workspace,&lists,out_control); + Compute_Forces(api->system,api->control,api->data,api->workspace,&api->lists,api->out_control); read_reax_forces(vflag); - for (int k = 0; k < system->N; ++k) { - num_bonds[k] = system->my_atoms[k].num_bonds; - num_hbonds[k] = system->my_atoms[k].num_hbonds; + for (int k = 0; k < api->system->N; ++k) { + num_bonds[k] = api->system->my_atoms[k].num_bonds; + num_hbonds[k] = api->system->my_atoms[k].num_hbonds; } // energies and pressure if (eflag_global) { - evdwl += data->my_en.e_bond; - evdwl += data->my_en.e_ov; - evdwl += data->my_en.e_un; - evdwl += data->my_en.e_lp; - evdwl += data->my_en.e_ang; - evdwl += data->my_en.e_pen; - evdwl += data->my_en.e_coa; - evdwl += data->my_en.e_hb; - evdwl += data->my_en.e_tor; - evdwl += data->my_en.e_con; - evdwl += data->my_en.e_vdW; + evdwl += api->data->my_en.e_bond; + evdwl += api->data->my_en.e_ov; + evdwl += api->data->my_en.e_un; + evdwl += api->data->my_en.e_lp; + evdwl += api->data->my_en.e_ang; + evdwl += api->data->my_en.e_pen; + evdwl += api->data->my_en.e_coa; + evdwl += api->data->my_en.e_hb; + evdwl += api->data->my_en.e_tor; + evdwl += api->data->my_en.e_con; + evdwl += api->data->my_en.e_vdW; - ecoul += data->my_en.e_ele; - ecoul += data->my_en.e_pol; + ecoul += api->data->my_en.e_ele; + ecoul += api->data->my_en.e_pol; // eng_vdwl += evdwl; // eng_coul += ecoul; @@ -544,43 +542,43 @@ void PairReaxC::compute(int eflag, int vflag) // Store the different parts of the energy // in a list for output by compute pair command - pvector[0] = data->my_en.e_bond; - pvector[1] = data->my_en.e_ov + data->my_en.e_un; - pvector[2] = data->my_en.e_lp; + pvector[0] = api->data->my_en.e_bond; + pvector[1] = api->data->my_en.e_ov + api->data->my_en.e_un; + pvector[2] = api->data->my_en.e_lp; pvector[3] = 0.0; - pvector[4] = data->my_en.e_ang; - pvector[5] = data->my_en.e_pen; - pvector[6] = data->my_en.e_coa; - pvector[7] = data->my_en.e_hb; - pvector[8] = data->my_en.e_tor; - pvector[9] = data->my_en.e_con; - pvector[10] = data->my_en.e_vdW; - pvector[11] = data->my_en.e_ele; + pvector[4] = api->data->my_en.e_ang; + pvector[5] = api->data->my_en.e_pen; + pvector[6] = api->data->my_en.e_coa; + pvector[7] = api->data->my_en.e_hb; + pvector[8] = api->data->my_en.e_tor; + pvector[9] = api->data->my_en.e_con; + pvector[10] = api->data->my_en.e_vdW; + pvector[11] = api->data->my_en.e_ele; pvector[12] = 0.0; - pvector[13] = data->my_en.e_pol; + pvector[13] = api->data->my_en.e_pol; } if (vflag_fdotr) virial_fdotr_compute(); // Set internal timestep counter to that of LAMMPS - data->step = update->ntimestep; + api->data->step = update->ntimestep; - Output_Results(system, control, data, &lists, out_control, world); + Output_Results(api->system, api->control, api->data, &api->lists, api->out_control, world); // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; if (fixspecies_flag) { - if (system->N > nmax) { + if (api->system->N > nmax) { memory->destroy(tmpid); memory->destroy(tmpbo); - nmax = system->N; + nmax = api->system->N; memory->create(tmpid,nmax,MAXSPECBOND,"pair:tmpid"); memory->create(tmpbo,nmax,MAXSPECBOND,"pair:tmpbo"); } - for (i = 0; i < system->N; i ++) + for (i = 0; i < api->system->N; i ++) for (j = 0; j < MAXSPECBOND; j ++) { tmpbo[i][j] = 0.0; tmpid[i][j] = 0; @@ -597,24 +595,24 @@ void PairReaxC::write_reax_atoms() int *num_bonds = fix_reax->num_bonds; int *num_hbonds = fix_reax->num_hbonds; - if (system->N > system->total_cap) + if (api->system->N > api->system->total_cap) error->all(FLERR,"Too many ghost atoms"); - for (int i = 0; i < system->N; ++i) { - system->my_atoms[i].orig_id = atom->tag[i]; - system->my_atoms[i].type = map[atom->type[i]]; - system->my_atoms[i].x[0] = atom->x[i][0]; - system->my_atoms[i].x[1] = atom->x[i][1]; - system->my_atoms[i].x[2] = atom->x[i][2]; - system->my_atoms[i].q = atom->q[i]; - system->my_atoms[i].num_bonds = num_bonds[i]; - system->my_atoms[i].num_hbonds = num_hbonds[i]; + for (int i = 0; i < api->system->N; ++i) { + api->system->my_atoms[i].orig_id = atom->tag[i]; + api->system->my_atoms[i].type = map[atom->type[i]]; + api->system->my_atoms[i].x[0] = atom->x[i][0]; + api->system->my_atoms[i].x[1] = atom->x[i][1]; + api->system->my_atoms[i].x[2] = atom->x[i][2]; + api->system->my_atoms[i].q = atom->q[i]; + api->system->my_atoms[i].num_bonds = num_bonds[i]; + api->system->my_atoms[i].num_hbonds = num_hbonds[i]; } } /* ---------------------------------------------------------------------- */ -void PairReaxC::get_distance( rvec xj, rvec xi, double *d_sqr, rvec *dvec ) +void PairReaxC::get_distance(rvec xj, rvec xi, double *d_sqr, rvec *dvec) { (*dvec)[0] = xj[0] - xi[0]; (*dvec)[1] = xj[1] - xi[1]; @@ -624,13 +622,13 @@ void PairReaxC::get_distance( rvec xj, rvec xi, double *d_sqr, rvec *dvec ) /* ---------------------------------------------------------------------- */ -void PairReaxC::set_far_nbr( far_neighbor_data *fdest, - int j, double d, rvec dvec ) +void PairReaxC::set_far_nbr(ReaxFF::far_neighbor_data *fdest, + int j, double d, rvec dvec) { fdest->nbr = j; fdest->d = d; - rvec_Copy( fdest->dvec, dvec ); - ivec_MakeZero( fdest->rel_box ); + rvec_Copy(fdest->dvec, dvec); + ivec_MakeZero(fdest->rel_box); } /* ---------------------------------------------------------------------- */ @@ -644,8 +642,8 @@ int PairReaxC::estimate_reax_lists() rvec dvec; double **x; - int mincap = system->mincap; - double safezone = system->safezone; + int mincap = api->system->mincap; + double safezone = api->system->safezone; x = atom->x; ilist = list->ilist; @@ -654,7 +652,7 @@ int PairReaxC::estimate_reax_lists() num_nbrs = 0; num_marked = 0; - marked = (int*) calloc( system->N, sizeof(int) ); + marked = (int*) calloc(api->system->N, sizeof(int)); int numall = list->inum + list->gnum; @@ -667,14 +665,14 @@ int PairReaxC::estimate_reax_lists() for (itr_j = 0; itr_j < numneigh[i]; ++itr_j) { j = jlist[itr_j]; j &= NEIGHMASK; - get_distance( x[j], x[i], &d_sqr, &dvec ); + get_distance(x[j], x[i], &d_sqr, &dvec); - if (d_sqr <= SQR(control->nonb_cut)) + if (d_sqr <= SQR(api->control->nonb_cut)) ++num_nbrs; } } - free( marked ); + free(marked); return static_cast (MAX(num_nbrs*safezone, mincap*REAX_MIN_NBRS)); } @@ -697,40 +695,40 @@ int PairReaxC::write_reax_lists() numneigh = list->numneigh; firstneigh = list->firstneigh; - far_nbrs = lists + FAR_NBRS; + far_nbrs = api->lists + FAR_NBRS; far_list = far_nbrs->select.far_nbr_list; num_nbrs = 0; int inum = list->inum; - dist = (double*) calloc( system->N, sizeof(double) ); + dist = (double*) calloc(api->system->N, sizeof(double)); int numall = list->inum + list->gnum; for (itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; jlist = firstneigh[i]; - Set_Start_Index( i, num_nbrs, far_nbrs ); + Set_Start_Index(i, num_nbrs, far_nbrs); if (i < inum) - cutoff_sqr = control->nonb_cut*control->nonb_cut; + cutoff_sqr = SQR(api->control->nonb_cut); else - cutoff_sqr = control->bond_cut*control->bond_cut; + cutoff_sqr = SQR(api->control->bond_cut); for (itr_j = 0; itr_j < numneigh[i]; ++itr_j) { j = jlist[itr_j]; j &= NEIGHMASK; - get_distance( x[j], x[i], &d_sqr, &dvec ); + get_distance(x[j], x[i], &d_sqr, &dvec); if (d_sqr <= (cutoff_sqr)) { - dist[j] = sqrt( d_sqr ); - set_far_nbr( &far_list[num_nbrs], j, dist[j], dvec ); + dist[j] = sqrt(d_sqr); + set_far_nbr((ReaxFF::far_neighbor_data *)&far_list[num_nbrs], j, dist[j], dvec); ++num_nbrs; } } - Set_End_Index( i, num_nbrs, far_nbrs ); + Set_End_Index(i, num_nbrs, far_nbrs); } - free( dist ); + free(dist); return num_nbrs; } @@ -739,14 +737,14 @@ int PairReaxC::write_reax_lists() void PairReaxC::read_reax_forces(int /*vflag*/) { - for (int i = 0; i < system->N; ++i) { - system->my_atoms[i].f[0] = workspace->f[i][0]; - system->my_atoms[i].f[1] = workspace->f[i][1]; - system->my_atoms[i].f[2] = workspace->f[i][2]; + for (int i = 0; i < api->system->N; ++i) { + api->system->my_atoms[i].f[0] = api->workspace->f[i][0]; + api->system->my_atoms[i].f[1] = api->workspace->f[i][1]; + api->system->my_atoms[i].f[2] = api->workspace->f[i][2]; - atom->f[i][0] += -workspace->f[i][0]; - atom->f[i][1] += -workspace->f[i][1]; - atom->f[i][2] += -workspace->f[i][2]; + atom->f[i][0] += -api->workspace->f[i][0]; + atom->f[i][1] += -api->workspace->f[i][1]; + atom->f[i][2] += -api->workspace->f[i][2]; } } @@ -758,19 +756,19 @@ void *PairReaxC::extract(const char *str, int &dim) dim = 1; if (strcmp(str,"chi") == 0 && chi) { for (int i = 1; i <= atom->ntypes; i++) - if (map[i] >= 0) chi[i] = system->reax_param.sbp[map[i]].chi; + if (map[i] >= 0) chi[i] = api->system->reax_param.sbp[map[i]].chi; else chi[i] = 0.0; return (void *) chi; } if (strcmp(str,"eta") == 0 && eta) { for (int i = 1; i <= atom->ntypes; i++) - if (map[i] >= 0) eta[i] = system->reax_param.sbp[map[i]].eta; + if (map[i] >= 0) eta[i] = api->system->reax_param.sbp[map[i]].eta; else eta[i] = 0.0; return (void *) eta; } if (strcmp(str,"gamma") == 0 && gamma) { for (int i = 1; i <= atom->ntypes; i++) - if (map[i] >= 0) gamma[i] = system->reax_param.sbp[map[i]].gamma; + if (map[i] >= 0) gamma[i] = api->system->reax_param.sbp[map[i]].gamma; else gamma[i] = 0.0; return (void *) gamma; } @@ -784,22 +782,22 @@ double PairReaxC::memory_usage() double bytes = 0.0; // From pair_reax_c - bytes += (double)1.0 * system->N * sizeof(int); - bytes += (double)1.0 * system->N * sizeof(double); + bytes += (double)1.0 * api->system->N * sizeof(int); + bytes += (double)1.0 * api->system->N * sizeof(double); // From reaxc_allocate: BO - bytes += (double)1.0 * system->total_cap * sizeof(reax_atom); - bytes += (double)19.0 * system->total_cap * sizeof(double); - bytes += (double)3.0 * system->total_cap * sizeof(int); + bytes += (double)1.0 * api->system->total_cap * sizeof(reax_atom); + bytes += (double)19.0 * api->system->total_cap * sizeof(double); + bytes += (double)3.0 * api->system->total_cap * sizeof(int); // From reaxc_lists - bytes += (double)2.0 * lists->n * sizeof(int); - bytes += (double)lists->num_intrs * sizeof(three_body_interaction_data); - bytes += (double)lists->num_intrs * sizeof(bond_data); - bytes += (double)lists->num_intrs * sizeof(dbond_data); - bytes += (double)lists->num_intrs * sizeof(dDelta_data); - bytes += (double)lists->num_intrs * sizeof(far_neighbor_data); - bytes += (double)lists->num_intrs * sizeof(hbond_data); + bytes += (double)2.0 * api->lists->n * sizeof(int); + bytes += (double)api->lists->num_intrs * sizeof(three_body_interaction_data); + bytes += (double)api->lists->num_intrs * sizeof(bond_data); + bytes += (double)api->lists->num_intrs * sizeof(dbond_data); + bytes += (double)api->lists->num_intrs * sizeof(dDelta_data); + bytes += (double)api->lists->num_intrs * sizeof(far_neighbor_data); + bytes += (double)api->lists->num_intrs * sizeof(hbond_data); if (fixspecies_flag) bytes += (double)2 * nmax * MAXSPECBOND * sizeof(double); @@ -817,10 +815,10 @@ void PairReaxC::FindBond() bond_data *bo_ij; bo_cut = 0.10; - for (i = 0; i < system->n; i++) { + for (i = 0; i < api->system->n; i++) { nj = 0; - for (pj = Start_Index(i, lists); pj < End_Index(i, lists); ++pj) { - bo_ij = &( lists->select.bond_list[pj] ); + for (pj = Start_Index(i, api->lists); pj < End_Index(i, api->lists); ++pj) { + bo_ij = &(api->lists->select.bond_list[pj]); j = bo_ij->nbr; if (j < i) continue; diff --git a/src/USER-REAXC/pair_reaxc.h b/src/USER-REAXC/pair_reaxc.h index 5283824116..9372f23ff4 100644 --- a/src/USER-REAXC/pair_reaxc.h +++ b/src/USER-REAXC/pair_reaxc.h @@ -32,14 +32,10 @@ PairStyle(reax/c,PairReaxC) #include "pair.h" -// forward declarations -struct control_params; -struct reax_system; -struct output_controls; -struct simulation_data; -struct storage; -struct reax_list; -struct far_neighbor_data; +namespace ReaxFF { + struct API; + struct far_neighbor_data; +} namespace LAMMPS_NS { @@ -57,12 +53,7 @@ class PairReaxC : public Pair { int **tmpid; double **tmpbo,**tmpr; - control_params *control; - reax_system *system; - output_controls *out_control; - simulation_data *data; - storage *workspace; - reax_list *lists; + ReaxFF::API *api; bigint ngroup; typedef double rvec[3]; @@ -83,7 +74,7 @@ protected: void create_fix(); void write_reax_atoms(); void get_distance(rvec, rvec, double *, rvec *); - void set_far_nbr(far_neighbor_data *, int, double, rvec); + void set_far_nbr(ReaxFF::far_neighbor_data *, int, double, rvec); int estimate_reax_lists(); int write_reax_lists(); void read_reax_forces(int); @@ -91,7 +82,6 @@ protected: int nmax; void FindBond(); double memory_usage(); - }; } diff --git a/src/USER-REAXC/reaxc_ffield.h b/src/USER-REAXC/reaxc_ffield.h index d334047ab5..f7a97f0636 100644 --- a/src/USER-REAXC/reaxc_ffield.h +++ b/src/USER-REAXC/reaxc_ffield.h @@ -24,8 +24,8 @@ . ----------------------------------------------------------------------*/ -#ifndef __FFIELD_H_ -#define __FFIELD_H_ +#ifndef LMP_REAXC_FFIELD_H +#define LMP_REAXC_FFIELD_H #include "reaxc_types.h" diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 6c8c1e079d..a4678d52c5 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -111,7 +111,7 @@ void Write_Header(reax_system *system, control_params *control, output_controls /* only the master node writes into trajectory header */ if (system->my_rank == MASTER_NODE) { std::string buffer(""); - + /* to skip the header */ buffer += fmtline("chars_to_skip_header:",(NUM_HEADER_LINES-1) * HEADER_LINE_LEN); @@ -167,7 +167,7 @@ void Write_Header(reax_system *system, control_params *control, output_controls buffer += fmtline("molecular_analysis_frequency:", 0); /* dump out the buffer */ - + fputs(buffer.c_str(),out_control->strj); } } @@ -324,13 +324,13 @@ void Write_Atoms(reax_system *system, output_controls *out_control, /* fill in buffer */ out_control->buffer[0] = 0; - + for (i = 0; i < system->n; ++i) { std::string buffer(""); p_atom = &(system->my_atoms[i]); buffer += fmt::format("{:9}{:10.3f}{:10.3f}{:10.3f}",p_atom->orig_id, p_atom->x[0], p_atom->x[1],p_atom->x[2]); - + switch (out_control->atom_info) { case OPT_ATOM_BASIC: buffer += fmt::format("{:10.3f}\n",p_atom->q); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 94adf6c3f7..cd9b1be9c9 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -325,6 +325,15 @@ struct far_neighbor_data { rvec dvec; }; +namespace ReaxFF { + struct far_neighbor_data { + int nbr; + ivec rel_box; + double d; + rvec dvec; + }; +} + struct hbond_data { int nbr; int scl; diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h new file mode 100644 index 0000000000..489a7b487e --- /dev/null +++ b/src/USER-REAXC/reaxff_api.h @@ -0,0 +1,38 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Heavily modified and adapted for LAMMPS by the LAMMPS developers. +------------------------------------------------------------------------- */ + +#ifndef LMP_REAXFF_API_H +#define LMP_REAXFF_API_H + +#include "reaxc_types.h" + +namespace ReaxFF +{ + struct API { + control_params *control; + reax_system *system; + output_controls *out_control; + simulation_data *data; + storage *workspace; + reax_list *lists; + }; +} + +#endif From b96d1ac1a5c859a760c60e5059c70188f05e4183 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Apr 2021 16:45:46 -0400 Subject: [PATCH 033/352] first step of adopting a ReaxFF namespace and reorganizing the ReaxFF headers --- src/KOKKOS/pair_reaxc_kokkos.cpp | 7 +- src/KOKKOS/pair_reaxc_kokkos.h | 7 +- src/USER-OMP/pair_reaxc_omp.cpp | 15 +- src/USER-OMP/reaxff_omp.h | 75 +++++ src/USER-REAXC/fix_qeq_reax.cpp | 9 +- src/USER-REAXC/fix_reaxc_bonds.cpp | 7 +- src/USER-REAXC/pair_reaxc.cpp | 20 +- src/USER-REAXC/reaxff_api.h | 115 +++++++- src/USER-REAXC/reaxff_defs.h | 107 +++++++ src/USER-REAXC/reaxff_inline.h | 88 ++++++ src/USER-REAXC/reaxff_types.h | 453 +++++++++++++++++++++++++++++ 11 files changed, 855 insertions(+), 48 deletions(-) create mode 100644 src/USER-OMP/reaxff_omp.h create mode 100644 src/USER-REAXC/reaxff_defs.h create mode 100644 src/USER-REAXC/reaxff_inline.h create mode 100644 src/USER-REAXC/reaxff_types.h diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 4ef82776d8..deb1dc74fd 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -28,19 +28,16 @@ #include "neigh_request.h" #include "neighbor.h" -#include "reaxc_defs.h" -#include "reaxc_lookup.h" -#include "reaxc_tool_box.h" - #include "reaxff_api.h" #include - #define TEAMSIZE 128 /* ---------------------------------------------------------------------- */ +using namespace ReaxFF; + namespace LAMMPS_NS { using namespace MathConst; using namespace MathSpecial; diff --git a/src/KOKKOS/pair_reaxc_kokkos.h b/src/KOKKOS/pair_reaxc_kokkos.h index d54f275d6f..19b2f53f35 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.h +++ b/src/KOKKOS/pair_reaxc_kokkos.h @@ -26,7 +26,6 @@ PairStyle(reax/c/kk/host,PairReaxCKokkos) #include "pair_kokkos.h" #include "pair_reaxc.h" #include "neigh_list_kokkos.h" -#include "reaxc_types.h" #define C_ele 332.06371 #define SMALL 0.0001 @@ -36,12 +35,14 @@ PairStyle(reax/c/kk/host,PairReaxCKokkos) #define SQR(x) ((x)*(x)) +#include "reaxff_inline.h" + namespace LAMMPS_NS { template struct LR_lookup_table_kk { - typedef Kokkos::DualView tdual_cubic_spline_coef_1d; + typedef Kokkos::DualView tdual_cubic_spline_coef_1d; typedef typename tdual_cubic_spline_coef_1d::t_dev t_cubic_spline_coef_1d; double dx, inv_dx; @@ -338,7 +339,7 @@ class PairReaxCKokkos : public PairReaxC { void init_md(); int Init_Lookup_Tables(); void Deallocate_Lookup_Tables(); - void LR_vdW_Coulomb( int i, int j, double r_ij, LR_data *lr ); + void LR_vdW_Coulomb( int i, int j, double r_ij, ReaxFF::LR_data *lr ); typedef Kokkos::DualView tdual_int_1d; Kokkos::DualView k_params_sing; diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index e7e03520e0..ac1ddd17a6 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -49,18 +49,8 @@ #include "memory.h" #include "error.h" - -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_allocate.h" -#include "reaxc_forces_omp.h" -#include "reaxc_init_md_omp.h" -#include "reaxc_io_tools.h" -#include "reaxc_list.h" -#include "reaxc_reset_tools.h" -#include "reaxc_tool_box.h" - #include "reaxff_api.h" +#include "reaxff_omp.h" #if defined(_OPENMP) #include @@ -68,6 +58,7 @@ #include "suffix.h" using namespace LAMMPS_NS; +using namespace ReaxFF; #ifdef OMP_TIMING double ompTimingData[LASTTIMINGINDEX]; @@ -547,7 +538,7 @@ int PairReaxCOMP::write_reax_lists() if (d_sqr <= cutoff_sqr) { dist = sqrt( d_sqr ); - set_far_nbr((ReaxFF::far_neighbor_data *) &far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); + set_far_nbr(&far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); ++num_mynbrs; } } diff --git a/src/USER-OMP/reaxff_omp.h b/src/USER-OMP/reaxff_omp.h new file mode 100644 index 0000000000..f6ca7116ca --- /dev/null +++ b/src/USER-OMP/reaxff_omp.h @@ -0,0 +1,75 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Heavily modified and adapted for LAMMPS by the LAMMPS developers. +------------------------------------------------------------------------- */ + +#ifndef LMP_REAXFF_OMP_H +#define LMP_REAXFF_OMP_H + +#include "reaxff_types.h" + +namespace ReaxFF +{ + // uncomment to enabled collecting ReaxFF OpenMP timing data + // #define OMP_TIMING 1 + +#ifdef OMP_TIMING + // pkcoff timing fields + enum { COMPUTEINDEX=0, + COMPUTEWLINDEX, + COMPUTEBFINDEX, + COMPUTEQEQINDEX, + COMPUTENBFINDEX, + COMPUTEIFINDEX, + COMPUTETFINDEX, + COMPUTEBOINDEX, + COMPUTEBONDSINDEX, + COMPUTEATOMENERGYINDEX, + COMPUTEVALENCEANGLESBOINDEX, + COMPUTETORSIONANGLESBOINDEX, + COMPUTEHBONDSINDEX, + COMPUTECG1INDEX, + COMPUTECG2INDEX, + COMPUTECGCOMPUTEINDEX, + COMPUTECALCQINDEX, + COMPUTEINITMVINDEX, + COMPUTEMVCOMPINDEX, + LASTTIMINGINDEX + }; + + extern double ompTimingData[LASTTIMINGINDEX]; + extern int ompTimingCount[LASTTIMINGINDEX]; + extern int ompTimingCGCount[LASTTIMINGINDEX]; +#endif + + // exported Functions + + // forces OpenMP + + extern void Compute_ForcesOMP(reax_system *, control_params *, + simulation_data *, storage *, + reax_list **, output_controls *); + + // init md OpenMP + + extern void InitializeOMP(reax_system *, control_params *, + simulation_data *, storage *, reax_list **, + output_controls *, MPI_Comm); +} + +#endif diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index b4b28b587a..f37fa4ba4a 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -31,20 +31,17 @@ #include "neigh_request.h" #include "neighbor.h" #include "pair.h" -#include "pair_reaxc.h" #include "respa.h" #include "text_file_reader.h" #include "tokenizer.h" #include "update.h" +#include "pair_reaxc.h" +#include "reaxff_api.h" + #include #include -#include "reaxc_defs.h" -#include "reaxc_types.h" - -#include "reaxff_api.h" - using namespace LAMMPS_NS; using namespace FixConst; diff --git a/src/USER-REAXC/fix_reaxc_bonds.cpp b/src/USER-REAXC/fix_reaxc_bonds.cpp index 62e8427894..c741259810 100644 --- a/src/USER-REAXC/fix_reaxc_bonds.cpp +++ b/src/USER-REAXC/fix_reaxc_bonds.cpp @@ -22,19 +22,16 @@ #include "force.h" #include "memory.h" #include "neigh_list.h" -#include "pair_reaxc.h" #include "update.h" -#include "reaxc_list.h" -#include "reaxc_types.h" -#include "reaxc_defs.h" - +#include "pair_reaxc.h" #include "reaxff_api.h" #include using namespace LAMMPS_NS; using namespace FixConst; +using namespace ReaxFF; /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 87def7f06b..a1772f9551 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -40,22 +40,10 @@ #include #include // for strcasecmp() -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_allocate.h" -#include "reaxc_control.h" -#include "reaxc_ffield.h" -#include "reaxc_forces.h" -#include "reaxc_init_md.h" -#include "reaxc_io_tools.h" -#include "reaxc_list.h" -#include "reaxc_lookup.h" -#include "reaxc_reset_tools.h" -#include "reaxc_vector.h" - #include "reaxff_api.h" using namespace LAMMPS_NS; +using namespace ReaxFF; static const char cite_pair_reax_c[] = "pair reax/c command:\n\n" @@ -83,7 +71,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) fix_id = utils::strdup("REAXC_" + std::to_string(instance_me)); - api = new ReaxFF::API; + api = new API; api->system = new reax_system; memset(api->system,0,sizeof(reax_system)); @@ -622,7 +610,7 @@ void PairReaxC::get_distance(rvec xj, rvec xi, double *d_sqr, rvec *dvec) /* ---------------------------------------------------------------------- */ -void PairReaxC::set_far_nbr(ReaxFF::far_neighbor_data *fdest, +void PairReaxC::set_far_nbr(far_neighbor_data *fdest, int j, double d, rvec dvec) { fdest->nbr = j; @@ -721,7 +709,7 @@ int PairReaxC::write_reax_lists() if (d_sqr <= (cutoff_sqr)) { dist[j] = sqrt(d_sqr); - set_far_nbr((ReaxFF::far_neighbor_data *)&far_list[num_nbrs], j, dist[j], dvec); + set_far_nbr(&far_list[num_nbrs], j, dist[j], dvec); ++num_nbrs; } } diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index 489a7b487e..19f345636f 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -21,10 +21,13 @@ #ifndef LMP_REAXFF_API_H #define LMP_REAXFF_API_H -#include "reaxc_types.h" +#include "reaxff_types.h" + +#include namespace ReaxFF { + // per instance data struct API { control_params *control; reax_system *system; @@ -33,6 +36,116 @@ namespace ReaxFF storage *workspace; reax_list *lists; }; + + // exported Functions + + // allocate + + extern void DeAllocate_System(reax_system *); + extern void DeAllocate_Workspace(control_params *, storage *); + extern int PreAllocate_Space(reax_system *, control_params *, storage *); + extern void ReAllocate(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + + // control + + extern void Read_Control_File(const char *, control_params *, output_controls *); + + // ffield + + extern void Read_Force_Field(const char *, reax_interaction *, control_params *); + + // forces + + extern void Compute_Forces(reax_system *, control_params *, simulation_data *, + storage *, reax_list **, output_controls *); + + // init md + + extern void Initialize(reax_system *, control_params *, simulation_data *, + storage *, reax_list **, output_controls *, MPI_Comm); + + // io tools + + extern void Close_Output_Files(reax_system *, output_controls *); + extern void Output_Results(reax_system *, control_params *, simulation_data *, + reax_list **, output_controls *, MPI_Comm); + + // lists + + inline int Start_Index(int i, reax_list *l) { return l->index[i]; } + inline int End_Index(int i, reax_list *l) { return l->end_index[i]; } + inline void Set_Start_Index(int i, int val, reax_list *l) { + l->index[i] = val; + } + inline void Set_End_Index(int i, int val, reax_list *l) { + l->end_index[i] = val; + } + extern void Delete_List(reax_list*); + extern int Make_List(int, int, int, reax_list *); + + // lookup + + extern void Deallocate_Lookup_Tables(reax_system *); + extern void Natural_Cubic_Spline(LAMMPS_NS::Error*, const double *, + const double *, cubic_spline_coef *, + unsigned int); + extern void Complete_Cubic_Spline(LAMMPS_NS::Error*, const double *, + const double *, double v0, double vlast, + cubic_spline_coef *coef, unsigned int n); + + // reset tools + + extern void Reset(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + + // toolbox + + extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const char *); + extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const char *); + extern void sfree(LAMMPS_NS::Error *, void *, const char *); + + // vector + + inline void rvec_Add(rvec ret, rvec v) { + ret[0] += v[0]; ret[1] += v[1]; ret[2] += v[2]; + } + + inline void rvec_Copy(rvec dest, rvec src) { + dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; + } + + inline void rvec_Cross(rvec ret, rvec v1, rvec v2) + { + ret[0] = v1[1] * v2[2] - v1[2] * v2[1]; + ret[1] = v1[2] * v2[0] - v1[0] * v2[2]; + ret[2] = v1[0] * v2[1] - v1[1] * v2[0]; + } + + inline double rvec_Dot(rvec v1, rvec v2) { + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; + } + + inline double rvec_Norm( rvec v ) { + return sqrt( SQR(v[0]) + SQR(v[1]) + SQR(v[2]) ); + } + + inline void rvec_Scale(rvec ret, double c, rvec v) { + ret[0] = c * v[0]; ret[1] = c * v[1]; ret[2] = c * v[2]; + } + + inline void rvec_ScaledAdd(rvec ret, double c, rvec v) { + ret[0] += c * v[0], ret[1] += c * v[1], ret[2] += c * v[2]; + } + + inline void rvec_ScaledSum(rvec ret, double c1, rvec v1 ,double c2, rvec v2) + { + ret[0] = c1 * v1[0] + c2 * v2[0]; + ret[1] = c1 * v1[1] + c2 * v2[1]; + ret[2] = c1 * v1[2] + c2 * v2[2]; + } + + inline void ivec_MakeZero(ivec v) { v[0] = v[1] = v[2] = 0; } } #endif diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h new file mode 100644 index 0000000000..3bd3ad899b --- /dev/null +++ b/src/USER-REAXC/reaxff_defs.h @@ -0,0 +1,107 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Heavily modified and adapted for LAMMPS by the LAMMPS developers. +------------------------------------------------------------------------- */ + +#ifndef LMP_REAXFF_DEFS_H +#define LMP_REAXFF_DEFS_H + +#if defined(__IBMC__) +#define inline __inline__ +#endif /*IBMC*/ + +#ifndef SUCCESS +#define SUCCESS 1 +#endif +#ifndef FAILURE +#define FAILURE 0 +#endif + +#define SQR(x) ((x)*(x)) +#define CUBE(x) ((x)*(x)*(x)) +#define DEG2RAD(a) ((a)*constPI/180.0) +#define RAD2DEG(a) ((a)*180.0/constPI) +#define MAX3(x,y,z) MAX( MAX(x,y), z) + +#define constPI 3.14159265 +#define C_ele 332.06371 +//#define K_B 503.398008 // kcal/mol/K +#define K_B 0.831687 // amu A^2 / ps^2 / K +#define F_CONV 1e6 / 48.88821291 / 48.88821291 // --> amu A / ps^2 +#define E_CONV 0.002391 // amu A^2 / ps^2 --> kcal/mol +#define EV_to_KCALpMOL 14.400000 // ElectronVolt --> KCAL per MOLe +#define KCALpMOL_to_EV 23.02 // 23.060549 //KCAL per MOLe --> ElectronVolt +#define ECxA_to_DEBYE 4.803204 // elem. charge * Ang -> debye +#define CAL_to_JOULES 4.184000 // CALories --> JOULES +#define JOULES_to_CAL 1/4.184000 // JOULES --> CALories +#define AMU_to_GRAM 1.6605e-24 +#define ANG_to_CM 1e-8 +#define AVOGNR 6.0221367e23 +#define P_CONV 1e-24 * AVOGNR * JOULES_to_CAL + +#define MAX_STR 1024 +#define MAX_LINE 1024 +#define MAX_TOKENS 1024 +#define MAX_TOKEN_LEN 1024 + +#define NUM_INTRS 10 +#define ALMOST_ZERO 1e-10 +#define NEG_INF -1e10 +#define NO_BOND 1e-3 // 0.001 +#define HB_THRESHOLD 1e-2 // 0.01 + +#define REAX_MIN_CAP 50 +#define REAX_MIN_NBRS 100 +#define MIN_HENTRIES 100 +#define MAX_BONDS 30 +#define MIN_BONDS 25 +#define REAX_MIN_HBONDS 25 +#define MIN_3BODIES 1000 +#define REAX_SAFE_ZONE 1.2 +#define REAX_SAFER_ZONE 1.4 +#define DANGER_ZONE 0.90 +#define LOOSE_ZONE 0.75 +#define MAX_3BODY_PARAM 5 +#define MAX_4BODY_PARAM 5 + +#define MASTER_NODE 0 + +#define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ +#define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ + +/************* crucial for reaxff_types.h *********/ + +#define REAX_MAX_STR 1024 +#define REAX_MAX_3BODY_PARAM 5 +#define REAX_MAX_4BODY_PARAM 5 +#define REAX_MAX_ATOM_TYPES 25 + +namespace ReaxFF +{ + /******************* ENUMERATORS *************************/ + + enum lists { BONDS, OLD_BONDS, THREE_BODIES, + HBONDS, FAR_NBRS, DBOS, DDELTAS, LIST_N }; + + enum message_tags {NONE, INIT_DESCS, ATOM_LINES, BOND_LINES, ANGLE_LINES}; + + enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, + TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; +} + +#endif diff --git a/src/USER-REAXC/reaxff_inline.h b/src/USER-REAXC/reaxff_inline.h new file mode 100644 index 0000000000..9a4a2159f6 --- /dev/null +++ b/src/USER-REAXC/reaxff_inline.h @@ -0,0 +1,88 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Heavily modified and adapted for LAMMPS by the LAMMPS developers. +------------------------------------------------------------------------- */ + +#ifndef LMP_REAXFF_INLINE_H +#define LMP_REAXFF_INLINE_H + +#include "accelerator_kokkos.h" // for LAMMPS_INLINE + +namespace ReaxFF +{ + struct LR_data + { + double H; + double e_vdW, CEvd; + double e_ele, CEclmb; + + LAMMPS_INLINE + LR_data() {} + + LAMMPS_INLINE + void operator = (const LR_data& rhs) { + H = rhs.H; + e_vdW = rhs.e_vdW; + CEvd = rhs.CEvd; + e_ele = rhs.e_ele; + CEclmb = rhs.CEclmb; + } + LAMMPS_INLINE + void operator = (const LR_data& rhs) volatile { + H = rhs.H; + e_vdW = rhs.e_vdW; + CEvd = rhs.CEvd; + e_ele = rhs.e_ele; + CEclmb = rhs.CEclmb; + } + }; + + struct cubic_spline_coef + { + double a, b, c, d; + + LAMMPS_INLINE + cubic_spline_coef() {} + + LAMMPS_INLINE + cubic_spline_coef(const cubic_spline_coef &_c) { + a = _c.a; + b = _c.b; + c = _c.c; + d = _c.d; + } + + LAMMPS_INLINE + void operator=(const cubic_spline_coef &rhs) { + a = rhs.a; + b = rhs.b; + c = rhs.c; + d = rhs.d; + } + + LAMMPS_INLINE + void operator=(const cubic_spline_coef &rhs) volatile { + a = rhs.a; + b = rhs.b; + c = rhs.c; + d = rhs.d; + } + }; +} + +#endif diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h new file mode 100644 index 0000000000..eef3aaca4b --- /dev/null +++ b/src/USER-REAXC/reaxff_types.h @@ -0,0 +1,453 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing author: Hasan Metin Aktulga, Purdue University + (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + + Heavily modified and adapted for LAMMPS by the LAMMPS developers. +------------------------------------------------------------------------- */ + +#ifndef LMP_REAXFF_TYPES_H +#define LMP_REAXFF_TYPES_H + +#include "lmptype.h" + +#include "reaxff_defs.h" +#include "reaxff_inline.h" + +// forward declarations +namespace LAMMPS_NS { + class Error; + class LAMMPS; + class Pair; +} + +namespace ReaxFF +{ + /********************** TYPE DEFINITIONS ********************/ + typedef int ivec[3]; + typedef double rvec[3]; + typedef double rvec2[2]; + + // import LAMMPS' definition of tagint and bigint + typedef LAMMPS_NS::tagint rc_tagint; + typedef LAMMPS_NS::bigint rc_bigint; + + struct global_parameters + { + int n_global; + double* l; + int vdw_type; + }; + + struct single_body_parameters + { + char name[4]; // two character atom name + double r_s; + double valency; // Valency of the atom + double mass; // Mass of atom + double r_vdw; + double epsilon; + double gamma; + double r_pi; + double valency_e; + double nlp_opt; + + /* Line two in field file */ + double alpha; + double gamma_w; + double valency_boc; + double p_ovun5; + double chi; + double eta; + int p_hbond; // 1 for H, 2 for hbonding atoms (O,S,P,N), 0 for others + + /* Line three in field file */ + double r_pi_pi; + double p_lp2; + double b_o_131; + double b_o_132; + double b_o_133; + + /* Line four in the field file */ + double p_ovun2; + double p_val3; + double valency_val; + double p_val5; + double rcore2; + double ecore2; + double acore2; + + /* Line five in the ffield file, only for lgvdw yes */ + double lgcij; + double lgre; + + }; + + /* Two Body Parameters */ + struct two_body_parameters { + /* Bond Order parameters */ + double p_bo1,p_bo2,p_bo3,p_bo4,p_bo5,p_bo6; + double r_s, r_p, r_pp; // r_o distances in BO formula + double p_boc3, p_boc4, p_boc5; + + /* Bond Energy parameters */ + double p_be1, p_be2; + double De_s, De_p, De_pp; + + /* Over/Under coordination parameters */ + double p_ovun1; + + /* Van der Waal interaction parameters */ + double D; + double alpha; + double r_vdW; + double gamma_w; + double rcore, ecore, acore; + double lgcij, lgre; + + /* electrostatic parameters */ + double gamma; // note: this parameter is gamma^-3 and not gamma. + + double v13cor, ovc; + }; + + /* 3-body parameters */ + struct three_body_parameters { + /* valence angle */ + double theta_00; + double p_val1, p_val2, p_val4, p_val7; + + /* penalty */ + double p_pen1; + + /* 3-body conjugation */ + double p_coa1; + }; + + struct three_body_header + { + int cnt; + three_body_parameters prm[REAX_MAX_3BODY_PARAM]; + }; + + /* hydrogen-bond parameters */ + struct hbond_parameters + { + double r0_hb, p_hb1, p_hb2, p_hb3; + }; + + /* 4-body parameters */ + struct four_body_parameters + { + double V1, V2, V3; + + /* torsion angle */ + double p_tor1; + + /* 4-body conjugation */ + double p_cot1; + }; + + struct four_body_header + { + int cnt; + four_body_parameters prm[REAX_MAX_4BODY_PARAM]; + }; + + struct reax_interaction + { + int num_atom_types; + global_parameters gp; + single_body_parameters *sbp; + two_body_parameters **tbp; + three_body_header ***thbp; + hbond_parameters ***hbp; + four_body_header ****fbp; + }; + + struct reax_atom + { + rc_tagint orig_id; + int type; + char name[8]; + + rvec x; // position + rvec v; // velocity + rvec f; // force + double q; // charge + + int Hindex; + int num_bonds; + int num_hbonds; + }; + + struct LR_lookup_table; // forward declaration + struct reax_system + { + reax_interaction reax_param; + + rc_bigint bigN; + int n, N, numH; + int local_cap, total_cap, Hcap; + int wsize, my_rank, num_nbrs; + reax_atom *my_atoms; + + LAMMPS_NS::Error *error_ptr; + LAMMPS_NS::Pair *pair_ptr; + int my_bonds; + int mincap,minhbonds; + double safezone, saferzone; + + LR_lookup_table **LR; + + int omp_active; + }; + + /* system control parameters */ + struct control_params + { + char sim_name[REAX_MAX_STR]; + int nthreads; + + double bond_cut; + double nonb_cut, nonb_low; + double hbond_cut; + + double bg_cut; + double bo_cut; + double thb_cut; + double thb_cutsq; + + int tabulate; + int virial; + + int lgflag; + int enobondsflag; + LAMMPS_NS::Error *error_ptr; + LAMMPS_NS::LAMMPS *lmp_ptr; + int me; + }; + + struct energy_data + { + double e_bond; // Total bond energy + double e_ov; // Total over coordination + double e_un; // Total under coordination energy + double e_lp; // Total under coordination energy + double e_ang; // Total valance angle energy + double e_pen; // Total penalty energy + double e_coa; // Total three body conjgation energy + double e_hb; // Total Hydrogen bond energy + double e_tor; // Total torsional energy + double e_con; // Total four body conjugation energy + double e_vdW; // Total van der Waals energy + double e_ele; // Total electrostatics energy + double e_pol; // Polarization energy + }; + + struct simulation_data + { + rc_bigint step; + + energy_data my_en; // per MPI rank energies + energy_data sys_en; // global energies + }; + + struct three_body_interaction_data + { + int thb; + int pthb; // pointer to the third body on the central atom's nbrlist + double theta, cos_theta; + rvec dcos_di, dcos_dj, dcos_dk; + }; + + struct far_neighbor_data { + int nbr; + ivec rel_box; + double d; + rvec dvec; + }; + + namespace ReaxFF { + struct far_neighbor_data { + int nbr; + ivec rel_box; + double d; + rvec dvec; + }; + } + + struct hbond_data { + int nbr; + int scl; + far_neighbor_data *ptr; + }; + + struct dDelta_data { + int wrt; + rvec dVal; + }; + + struct dbond_data { + int wrt; + rvec dBO, dBOpi, dBOpi2; + }; + + struct bond_order_data { + double BO, BO_s, BO_pi, BO_pi2; + double Cdbo, Cdbopi, Cdbopi2; + double C1dbo, C2dbo, C3dbo; + double C1dbopi, C2dbopi, C3dbopi, C4dbopi; + double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; + rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2; + double *CdboReduction; + }; + + struct bond_data { + int nbr; + int sym_index; + int dbond_index; + ivec rel_box; + // rvec ext_factor; + double d; + rvec dvec; + bond_order_data bo_data; + }; + + struct sparse_matrix_entry { + int j; + double val; + }; + + struct sparse_matrix { + int cap, n, m; + int *start, *end; + sparse_matrix_entry *entries; + }; + + struct reallocate_data { + int num_far; + int H, Htop; + int hbonds, num_hbonds; + int bonds, num_bonds; + int num_3body; + }; + + struct storage + { + int allocated; + + /* bond order related storage */ + double *total_bond_order; + double *Deltap, *Deltap_boc; + double *Delta, *Delta_lp, *Delta_lp_temp, *Delta_e, *Delta_boc, *Delta_val; + double *dDelta_lp, *dDelta_lp_temp; + double *nlp, *nlp_temp, *Clp, *vlpex; + rvec *dDeltap_self; + int *bond_mark; + + /* QEq storage */ + sparse_matrix *H, *L, *U; + double *Hdia_inv, *b_s, *b_t, *b_prc, *b_prm, *s, *t; + rvec2 *b, *x; + + /* CG storage */ + double *r, *d, *q, *p; + rvec2 *r2, *d2, *q2, *p2; + /* Taper */ + double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0; + + /* force calculations */ + double *CdDelta; // coefficient of dDelta + rvec *f; + + /* omp */ + rvec *forceReduction; + double *CdDeltaReduction; + int *valence_angle_atom_myoffset; + + reallocate_data realloc; + }; + + union list_type + { + void *v; + three_body_interaction_data *three_body_list; + bond_data *bond_list; + dbond_data *dbo_list; + dDelta_data *dDelta_list; + far_neighbor_data *far_nbr_list; + hbond_data *hbond_list; + }; + + struct reax_list + { + int allocated; + + int n; + int num_intrs; + + int *index; + int *end_index; + + int type; + list_type select; + class LAMMPS_NS::Error *error_ptr; + }; + + struct output_controls + { + FILE *strj; + int atom_line_len; + int bond_line_len; + int angle_line_len; + int write_atoms; + int write_bonds; + int write_angles; + int buffer_len; + char *buffer; + + int write_steps; + char traj_title[81]; + int atom_info; + int bond_info; + int angle_info; + + int energy_update_freq; + }; + + struct LR_lookup_table + { + double xmin, xmax; + int n; + double dx, inv_dx; + double a; + double m; + double c; + + LR_data *y; + cubic_spline_coef *H; + cubic_spline_coef *vdW, *CEvd; + cubic_spline_coef *ele, *CEclmb; + }; + +/* function pointer defs */ + + typedef void (*interaction_function) (reax_system *, control_params *, + simulation_data *, storage *, + reax_list **, output_controls *); +} + +#endif From a46c901be6958844b07a647ade5aa40e9c48c1bb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Apr 2021 16:59:23 -0400 Subject: [PATCH 034/352] remove unused data structure members --- src/USER-REAXC/reaxc_allocate.cpp | 74 +------------------------------ src/USER-REAXC/reaxc_defs.h | 2 - src/USER-REAXC/reaxc_types.h | 46 ------------------- src/USER-REAXC/reaxff_types.h | 18 -------- 4 files changed, 1 insertion(+), 139 deletions(-) diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 3f0a251a97..3d68bb6944 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -110,8 +110,6 @@ void DeAllocate_System( reax_system *system ) /************* workspace *************/ void DeAllocate_Workspace( control_params * control, storage *workspace ) { - int i; - if (!workspace->allocated) return; @@ -136,39 +134,6 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) sfree(control->error_ptr, workspace->vlpex, "vlpex" ); sfree(control->error_ptr, workspace->bond_mark, "bond_mark" ); - /* QEq storage */ - sfree(control->error_ptr, workspace->Hdia_inv, "Hdia_inv" ); - sfree(control->error_ptr, workspace->b_s, "b_s" ); - sfree(control->error_ptr, workspace->b_t, "b_t" ); - sfree(control->error_ptr, workspace->b_prc, "b_prc" ); - sfree(control->error_ptr, workspace->b_prm, "b_prm" ); - sfree(control->error_ptr, workspace->s, "s" ); - sfree(control->error_ptr, workspace->t, "t" ); - sfree(control->error_ptr, workspace->b, "b" ); - sfree(control->error_ptr, workspace->x, "x" ); - - /* GMRES storage */ - for (i = 0; i < RESTART+1; ++i) { - sfree(control->error_ptr, workspace->h[i], "h[i]" ); - sfree(control->error_ptr, workspace->v[i], "v[i]" ); - } - sfree(control->error_ptr, workspace->h, "h" ); - sfree(control->error_ptr, workspace->v, "v" ); - sfree(control->error_ptr, workspace->y, "y" ); - sfree(control->error_ptr, workspace->z, "z" ); - sfree(control->error_ptr, workspace->g, "g" ); - sfree(control->error_ptr, workspace->hs, "hs" ); - sfree(control->error_ptr, workspace->hc, "hc" ); - /* CG storage */ - sfree(control->error_ptr, workspace->r, "r" ); - sfree(control->error_ptr, workspace->d, "d" ); - sfree(control->error_ptr, workspace->q, "q" ); - sfree(control->error_ptr, workspace->p, "p" ); - sfree(control->error_ptr, workspace->r2, "r2" ); - sfree(control->error_ptr, workspace->d2, "d2" ); - sfree(control->error_ptr, workspace->q2, "q2" ); - sfree(control->error_ptr, workspace->p2, "p2" ); - /* force related storage */ sfree(control->error_ptr, workspace->f, "f" ); sfree(control->error_ptr, workspace->CdDelta, "CdDelta" ); @@ -181,10 +146,9 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) #endif } - void Allocate_Workspace( control_params *control, storage *workspace, int total_cap) { - int i, total_real, total_rvec; + int total_real, total_rvec; workspace->allocated = 1; total_real = total_cap * sizeof(double); @@ -212,42 +176,6 @@ void Allocate_Workspace( control_params *control, storage *workspace, int total_ workspace->bond_mark = (int*) scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark"); - /* QEq storage */ - workspace->Hdia_inv = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "Hdia_inv"); - workspace->b_s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_s"); - workspace->b_t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_t"); - workspace->b_prc = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prc"); - workspace->b_prm = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prm"); - workspace->s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "s"); - workspace->t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "t"); - workspace->b = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "b"); - workspace->x = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "x"); - - /* GMRES storage */ - workspace->y = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "y"); - workspace->z = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "z"); - workspace->g = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "g"); - workspace->h = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "h"); - workspace->hs = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hs"); - workspace->hc = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hc"); - workspace->v = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "v"); - - for (i = 0; i < RESTART+1; ++i) { - workspace->h[i] = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "h[i]"); - workspace->v[i] = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "v[i]"); - } - - /* CG storage */ - workspace->r = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "r"); - workspace->d = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "d"); - workspace->q = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "q"); - workspace->p = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "p"); - workspace->r2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "r2"); - workspace->d2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "d2"); - workspace->q2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "q2"); - workspace->p2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "p2"); - /* force related storage */ workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f"); workspace->CdDelta = (double*) diff --git a/src/USER-REAXC/reaxc_defs.h b/src/USER-REAXC/reaxc_defs.h index 6df4460fb9..5f1fc0fd6f 100644 --- a/src/USER-REAXC/reaxc_defs.h +++ b/src/USER-REAXC/reaxc_defs.h @@ -89,8 +89,6 @@ #define MASTER_NODE 0 -#define RESTART 30 - #define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ #define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index cd9b1be9c9..66516d52a0 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -39,40 +39,6 @@ namespace LAMMPS_NS { class Pair; } -#if defined LMP_USER_OMP -#define OMP_TIMING 0 - -#ifdef OMP_TIMING -// pkcoff timing fields -enum { - COMPUTEINDEX=0, - COMPUTEWLINDEX, - COMPUTEBFINDEX, - COMPUTEQEQINDEX, - COMPUTENBFINDEX, - COMPUTEIFINDEX, - COMPUTETFINDEX, - COMPUTEBOINDEX, - COMPUTEBONDSINDEX, - COMPUTEATOMENERGYINDEX, - COMPUTEVALENCEANGLESBOINDEX, - COMPUTETORSIONANGLESBOINDEX, - COMPUTEHBONDSINDEX, - COMPUTECG1INDEX, - COMPUTECG2INDEX, - COMPUTECGCOMPUTEINDEX, - COMPUTECALCQINDEX, - COMPUTEINITMVINDEX, - COMPUTEMVCOMPINDEX, - LASTTIMINGINDEX -}; - -extern double ompTimingData[LASTTIMINGINDEX]; -extern int ompTimingCount[LASTTIMINGINDEX]; -extern int ompTimingCGCount[LASTTIMINGINDEX]; -#endif -#endif - /************* SOME DEFS - crucial for reax_types.h *********/ #define REAX_MAX_STR 1024 @@ -403,18 +369,6 @@ struct storage rvec *dDeltap_self; int *bond_mark; - /* QEq storage */ - sparse_matrix *H, *L, *U; - double *Hdia_inv, *b_s, *b_t, *b_prc, *b_prm, *s, *t; - rvec2 *b, *x; - - /* GMRES storage */ - double *y, *z, *g; - double *hc, *hs; - double **h, **v; - /* CG storage */ - double *r, *d, *q, *p; - rvec2 *r2, *d2, *q2, *p2; /* Taper */ double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0; diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index eef3aaca4b..544e67fbf2 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -280,15 +280,6 @@ namespace ReaxFF rvec dvec; }; - namespace ReaxFF { - struct far_neighbor_data { - int nbr; - ivec rel_box; - double d; - rvec dvec; - }; - } - struct hbond_data { int nbr; int scl; @@ -320,7 +311,6 @@ namespace ReaxFF int sym_index; int dbond_index; ivec rel_box; - // rvec ext_factor; double d; rvec dvec; bond_order_data bo_data; @@ -358,14 +348,6 @@ namespace ReaxFF rvec *dDeltap_self; int *bond_mark; - /* QEq storage */ - sparse_matrix *H, *L, *U; - double *Hdia_inv, *b_s, *b_t, *b_prc, *b_prm, *s, *t; - rvec2 *b, *x; - - /* CG storage */ - double *r, *d, *q, *p; - rvec2 *r2, *d2, *q2, *p2; /* Taper */ double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0; From 81458fe132958c8a93b4228b9bc464b2f7d88660 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Apr 2021 16:59:49 -0400 Subject: [PATCH 035/352] convert control file reader to ReaxFF namespace --- src/USER-REAXC/reaxc_control.cpp | 188 +++++++++++++++---------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index fe238ddb3c..aacb043600 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -24,9 +24,7 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_control.h" -#include "reaxc_defs.h" -#include "reaxc_tool_box.h" +#include "reaxff_api.h" #include "error.h" #include "utils.h" @@ -42,107 +40,109 @@ using LAMMPS_NS::utils::sfgets; using LAMMPS_NS::utils::logmesg; using LAMMPS_NS::ValueTokenizer; -static std::unordered_set ignored_keywords = { - "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", - "restart_format", "restart_freq", "reposition_atoms", - "restrict_bonds", "remove_CoM_vel", "debug_level", "reneighbor", - "vlist_buffer", "ghost_cutoff", "qeq_freq", "q_err", "ilu_refactor", - "ilu_droptol", "temp_init", "temp_final", "t_mass", "t_mode", "t_rate", - "t_freq", "pressure", "p_mass", "pt_mass", "compress", "press_mode", - "geo_format", "traj_compress", "traj_method", "molecular_analysis", - "ignore", "dipole_anal", "freq_dipole_anal", "diffusion_coef", - "freq_diffusion_coef", "restrict_type" -}; +namespace ReaxFF { + static std::unordered_set ignored_keywords = { + "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", + "restart_format", "restart_freq", "reposition_atoms", + "restrict_bonds", "remove_CoM_vel", "debug_level", "reneighbor", + "vlist_buffer", "ghost_cutoff", "qeq_freq", "q_err", "ilu_refactor", + "ilu_droptol", "temp_init", "temp_final", "t_mass", "t_mode", "t_rate", + "t_freq", "pressure", "p_mass", "pt_mass", "compress", "press_mode", + "geo_format", "traj_compress", "traj_method", "molecular_analysis", + "ignore", "dipole_anal", "freq_dipole_anal", "diffusion_coef", + "freq_diffusion_coef", "restrict_type" + }; -class parser_error : public std::exception { - std::string message; -public: - parser_error(const std::string &mesg) { message = mesg; } - const char *what() const noexcept { return message.c_str(); } -}; + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; -void Read_Control_File(const char *control_file, control_params *control, - output_controls *out_control) -{ - FILE *fp; - char line[MAX_LINE]; - auto error = control->error_ptr; - auto lmp = control->lmp_ptr; + void Read_Control_File(const char *control_file, control_params *control, + output_controls *out_control) + { + FILE *fp; + char line[MAX_LINE]; + auto error = control->error_ptr; + auto lmp = control->lmp_ptr; - /* open control file */ - fp = fopen(control_file, "r"); - if (!fp) - error->one(FLERR,fmt::format("The control file {} cannot be opened: {}", - control_file, getsyserror())); - /* assign default values */ - strcpy(control->sim_name, "simulate"); - control->nthreads = 1; - control->tabulate = 0; - control->virial = 0; - control->bond_cut = 5.0; - control->bg_cut = 0.3; - control->thb_cut = 0.001; - control->thb_cutsq = 0.00001; - control->hbond_cut = 7.5; + /* open control file */ + fp = fopen(control_file, "r"); + if (!fp) + error->one(FLERR,fmt::format("The control file {} cannot be opened: {}", + control_file, getsyserror())); + /* assign default values */ + strcpy(control->sim_name, "simulate"); + control->nthreads = 1; + control->tabulate = 0; + control->virial = 0; + control->bond_cut = 5.0; + control->bg_cut = 0.3; + control->thb_cut = 0.001; + control->thb_cutsq = 0.00001; + control->hbond_cut = 7.5; - out_control->write_steps = 0; - out_control->energy_update_freq = 0; - strcpy(out_control->traj_title, "default_title"); - out_control->atom_info = 0; - out_control->bond_info = 0; - out_control->angle_info = 0; + out_control->write_steps = 0; + out_control->energy_update_freq = 0; + strcpy(out_control->traj_title, "default_title"); + out_control->atom_info = 0; + out_control->bond_info = 0; + out_control->angle_info = 0; - /* read control parameters file */ - while (fgets(line, MAX_LINE, fp)) { - ValueTokenizer values(line); + /* read control parameters file */ + while (fgets(line, MAX_LINE, fp)) { + ValueTokenizer values(line); - // empty line - if (values.count() == 0) continue; + // empty line + if (values.count() == 0) continue; - try { - auto keyword = values.next_string(); + try { + auto keyword = values.next_string(); - if (!values.has_next()) - throw parser_error(fmt::format("No value(s) for control parameter: {}\n",keyword)); + if (!values.has_next()) + throw parser_error(fmt::format("No value(s) for control parameter: {}\n",keyword)); - if (ignored_keywords.find(keyword) != ignored_keywords.end()) { - logmesg(lmp,fmt::format("Ignoring inactive control parameter: {}\n",keyword)); - } else if (keyword == "simulation_name") { - strcpy(control->sim_name, values.next_string().c_str()); - } else if (keyword == "energy_update_freq") { - out_control->energy_update_freq = values.next_int(); - } else if (keyword == "nbrhood_cutoff") { - control->bond_cut = values.next_double(); - } else if (keyword == "bond_graph_cutoff") { - control->bg_cut = values.next_double(); - } else if (keyword == "thb_cutoff") { - control->thb_cut = values.next_double(); - } else if (keyword == "thb_cutoff_sq") { - control->thb_cutsq = values.next_double(); - } else if (keyword == "hbond_cutoff") { - control->hbond_cut = values.next_double(); - } else if (keyword == "tabulate_long_range") { - control->tabulate = values.next_int(); - } else if (keyword == "write_freq") { - out_control->write_steps = values.next_int(); - } else if (keyword == "traj_title") { - strcpy(out_control->traj_title, values.next_string().c_str()); - } else if (keyword == "atom_info") { - out_control->atom_info += values.next_int() * 4; - } else if (keyword == "atom_velocities") { - out_control->atom_info += values.next_int() * 2; - } else if (keyword == "atom_forces") { - out_control->atom_info += values.next_int() * 1; - } else if (keyword == "bond_info") { - out_control->bond_info = values.next_int(); - } else if (keyword == "angle_info") { - out_control->angle_info = values.next_int(); - } else { - throw parser_error(fmt::format("Unknown parameter {} in control file", keyword)); + if (ignored_keywords.find(keyword) != ignored_keywords.end()) { + logmesg(lmp,fmt::format("Ignoring inactive control parameter: {}\n",keyword)); + } else if (keyword == "simulation_name") { + strcpy(control->sim_name, values.next_string().c_str()); + } else if (keyword == "energy_update_freq") { + out_control->energy_update_freq = values.next_int(); + } else if (keyword == "nbrhood_cutoff") { + control->bond_cut = values.next_double(); + } else if (keyword == "bond_graph_cutoff") { + control->bg_cut = values.next_double(); + } else if (keyword == "thb_cutoff") { + control->thb_cut = values.next_double(); + } else if (keyword == "thb_cutoff_sq") { + control->thb_cutsq = values.next_double(); + } else if (keyword == "hbond_cutoff") { + control->hbond_cut = values.next_double(); + } else if (keyword == "tabulate_long_range") { + control->tabulate = values.next_int(); + } else if (keyword == "write_freq") { + out_control->write_steps = values.next_int(); + } else if (keyword == "traj_title") { + strcpy(out_control->traj_title, values.next_string().c_str()); + } else if (keyword == "atom_info") { + out_control->atom_info += values.next_int() * 4; + } else if (keyword == "atom_velocities") { + out_control->atom_info += values.next_int() * 2; + } else if (keyword == "atom_forces") { + out_control->atom_info += values.next_int() * 1; + } else if (keyword == "bond_info") { + out_control->bond_info = values.next_int(); + } else if (keyword == "angle_info") { + out_control->angle_info = values.next_int(); + } else { + throw parser_error(fmt::format("Unknown parameter {} in control file", keyword)); + } + } catch (std::exception &e) { + error->one(FLERR, e.what()); } - } catch (std::exception &e) { - error->one(FLERR, e.what()); } + fclose(fp); } - fclose(fp); } From 224c59384605fb94917974174f76fcb563272c31 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 02:18:35 -0400 Subject: [PATCH 036/352] convert USER-REAXC to use a ReaxFF namespace also bundle exported functions in fewer header files --- src/KOKKOS/fix_reaxc_species_kokkos.cpp | 16 +- src/USER-OMP/fix_qeq_reax_omp.cpp | 18 +- src/USER-OMP/pair_reaxc_omp.cpp | 33 +- src/USER-OMP/reaxc_bond_orders_omp.cpp | 1126 +++++++++--------- src/USER-OMP/reaxc_bond_orders_omp.h | 43 - src/USER-OMP/reaxc_bonds_omp.cpp | 238 ++-- src/USER-OMP/reaxc_bonds_omp.h | 37 - src/USER-OMP/reaxc_forces_omp.cpp | 759 ++++++------ src/USER-OMP/reaxc_forces_omp.h | 38 - src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 322 +++-- src/USER-OMP/reaxc_hydrogen_bonds_omp.h | 37 - src/USER-OMP/reaxc_init_md_omp.cpp | 163 ++- src/USER-OMP/reaxc_init_md_omp.h | 38 - src/USER-OMP/reaxc_multi_body_omp.cpp | 408 ++++--- src/USER-OMP/reaxc_multi_body_omp.h | 37 - src/USER-OMP/reaxc_nonbonded_omp.cpp | 563 +++++---- src/USER-OMP/reaxc_nonbonded_omp.h | 40 - src/USER-OMP/reaxc_torsion_angles_omp.cpp | 671 +++++------ src/USER-OMP/reaxc_torsion_angles_omp.h | 38 - src/USER-OMP/reaxc_valence_angles_omp.cpp | 872 +++++++------- src/USER-OMP/reaxc_valence_angles_omp.h | 39 - src/USER-OMP/reaxff_omp.h | 95 +- src/USER-REAXC/fix_reaxc_species.cpp | 6 +- src/USER-REAXC/pair_reaxc.cpp | 5 +- src/USER-REAXC/reaxc_allocate.cpp | 534 ++++----- src/USER-REAXC/reaxc_allocate.h | 41 - src/USER-REAXC/reaxc_bond_orders.cpp | 964 ++++++++------- src/USER-REAXC/reaxc_bond_orders.h | 45 - src/USER-REAXC/reaxc_bonds.cpp | 181 +-- src/USER-REAXC/reaxc_bonds.h | 34 - src/USER-REAXC/reaxc_control.h | 34 - src/USER-REAXC/reaxc_defs.h | 105 -- src/USER-REAXC/reaxc_ffield.cpp | 1295 +++++++++++---------- src/USER-REAXC/reaxc_ffield.h | 34 - src/USER-REAXC/reaxc_forces.cpp | 667 +++++------ src/USER-REAXC/reaxc_forces.h | 40 - src/USER-REAXC/reaxc_hydrogen_bonds.cpp | 254 ++-- src/USER-REAXC/reaxc_hydrogen_bonds.h | 35 - src/USER-REAXC/reaxc_init_md.cpp | 295 +++-- src/USER-REAXC/reaxc_init_md.h | 35 - src/USER-REAXC/reaxc_io_tools.cpp | 99 +- src/USER-REAXC/reaxc_io_tools.h | 37 - src/USER-REAXC/reaxc_list.cpp | 193 ++- src/USER-REAXC/reaxc_list.h | 66 -- src/USER-REAXC/reaxc_lookup.cpp | 444 ++++--- src/USER-REAXC/reaxc_lookup.h | 47 - src/USER-REAXC/reaxc_multi_body.cpp | 31 +- src/USER-REAXC/reaxc_multi_body.h | 35 - src/USER-REAXC/reaxc_nonbonded.cpp | 676 ++++++----- src/USER-REAXC/reaxc_nonbonded.h | 43 - src/USER-REAXC/reaxc_reset_tools.cpp | 215 ++-- src/USER-REAXC/reaxc_reset_tools.h | 39 - src/USER-REAXC/reaxc_system_props.cpp | 66 -- src/USER-REAXC/reaxc_system_props.h | 35 - src/USER-REAXC/reaxc_tool_box.cpp | 153 +-- src/USER-REAXC/reaxc_tool_box.h | 40 - src/USER-REAXC/reaxc_torsion_angles.cpp | 831 +++++++------ src/USER-REAXC/reaxc_torsion_angles.h | 35 - src/USER-REAXC/reaxc_traj.cpp | 937 ++++++++------- src/USER-REAXC/reaxc_traj.h | 38 - src/USER-REAXC/reaxc_types.h | 513 -------- src/USER-REAXC/reaxc_valence_angles.cpp | 614 +++++----- src/USER-REAXC/reaxc_valence_angles.h | 39 - src/USER-REAXC/reaxc_vector.cpp | 130 --- src/USER-REAXC/reaxc_vector.h | 50 - src/USER-REAXC/reaxff_api.h | 104 +- src/USER-REAXC/reaxff_defs.h | 1 - src/USER-REAXC/reaxff_types.h | 13 +- 68 files changed, 6766 insertions(+), 8993 deletions(-) delete mode 100644 src/USER-OMP/reaxc_bond_orders_omp.h delete mode 100644 src/USER-OMP/reaxc_bonds_omp.h delete mode 100644 src/USER-OMP/reaxc_forces_omp.h delete mode 100644 src/USER-OMP/reaxc_hydrogen_bonds_omp.h delete mode 100644 src/USER-OMP/reaxc_init_md_omp.h delete mode 100644 src/USER-OMP/reaxc_multi_body_omp.h delete mode 100644 src/USER-OMP/reaxc_nonbonded_omp.h delete mode 100644 src/USER-OMP/reaxc_torsion_angles_omp.h delete mode 100644 src/USER-OMP/reaxc_valence_angles_omp.h delete mode 100644 src/USER-REAXC/reaxc_allocate.h delete mode 100644 src/USER-REAXC/reaxc_bond_orders.h delete mode 100644 src/USER-REAXC/reaxc_bonds.h delete mode 100644 src/USER-REAXC/reaxc_control.h delete mode 100644 src/USER-REAXC/reaxc_defs.h delete mode 100644 src/USER-REAXC/reaxc_ffield.h delete mode 100644 src/USER-REAXC/reaxc_forces.h delete mode 100644 src/USER-REAXC/reaxc_hydrogen_bonds.h delete mode 100644 src/USER-REAXC/reaxc_init_md.h delete mode 100644 src/USER-REAXC/reaxc_io_tools.h delete mode 100644 src/USER-REAXC/reaxc_list.h delete mode 100644 src/USER-REAXC/reaxc_lookup.h delete mode 100644 src/USER-REAXC/reaxc_multi_body.h delete mode 100644 src/USER-REAXC/reaxc_nonbonded.h delete mode 100644 src/USER-REAXC/reaxc_reset_tools.h delete mode 100644 src/USER-REAXC/reaxc_system_props.cpp delete mode 100644 src/USER-REAXC/reaxc_system_props.h delete mode 100644 src/USER-REAXC/reaxc_tool_box.h delete mode 100644 src/USER-REAXC/reaxc_torsion_angles.h delete mode 100644 src/USER-REAXC/reaxc_traj.h delete mode 100644 src/USER-REAXC/reaxc_types.h delete mode 100644 src/USER-REAXC/reaxc_valence_angles.h delete mode 100644 src/USER-REAXC/reaxc_vector.cpp delete mode 100644 src/USER-REAXC/reaxc_vector.h diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.cpp b/src/KOKKOS/fix_reaxc_species_kokkos.cpp index 0a225a641d..5a0907fb07 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_species_kokkos.cpp @@ -16,18 +16,20 @@ ------------------------------------------------------------------------- */ #include "fix_reaxc_species_kokkos.h" + #include "atom.h" -#include "fix_ave_atom.h" -#include "reaxc_defs.h" -#include "pair_reaxc_kokkos.h" -#include "neigh_list.h" -#include "neigh_request.h" +#include "atom_masks.h" #include "comm.h" +#include "error.h" #include "force.h" #include "input.h" #include "memory_kokkos.h" -#include "error.h" -#include "atom_masks.h" +#include "neigh_list.h" +#include "neigh_request.h" + +#include "fix_ave_atom.h" +#include "pair_reaxc_kokkos.h" +#include "reaxff_defs.h" using namespace LAMMPS_NS; using namespace FixConst; diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 66760b8aa3..3f09fa7353 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -33,16 +33,17 @@ #include "fix_qeq_reax_omp.h" -#include -#include "pair_reaxc.h" #include "atom.h" #include "comm.h" +#include "error.h" +#include "memory.h" #include "neigh_list.h" #include "update.h" -#include "memory.h" -#include "error.h" -#include "reaxc_defs.h" -#include "reaxc_types.h" + +#include "pair_reaxc.h" +#include "reaxff_defs.h" + +#include #if defined(_OPENMP) #include @@ -51,11 +52,6 @@ using namespace LAMMPS_NS; using namespace FixConst; -#define EV_TO_KCAL_PER_MOL 14.4 -#define SQR(x) ((x)*(x)) -#define CUBE(x) ((x)*(x)*(x)) -#define MIN_NBRS 100 - /* ---------------------------------------------------------------------- */ FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index ac1ddd17a6..5693bef5e6 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -197,7 +197,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) setup(); - Reset( api->system, api->control, api->data, api->workspace, &api->lists ); + Reset(api->system, api->control, api->data, api->workspace, &api->lists); // Why not update workspace like in MPI-only code? // Using the MPI-only way messes up the hb energy @@ -270,7 +270,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) api->data->step = update->ntimestep; - Output_Results( api->system, api->control, api->data, &api->lists, api->out_control, world ); + Output_Results(api->system, api->control, api->data, &api->lists, api->out_control, world); // populate tmpid and tmpbo arrays for fix reax/c/species @@ -298,7 +298,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::init_style( ) +void PairReaxCOMP::init_style() { if (!atom->q_flag) error->all(FLERR,"Pair reax/c/omp requires atom attribute q"); @@ -354,7 +354,7 @@ void PairReaxCOMP::init_style( ) /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::setup( ) +void PairReaxCOMP::setup() { int oldN; int mincap = api->system->mincap; @@ -380,12 +380,12 @@ void PairReaxCOMP::setup( ) // determine the local and total capacity - api->system->local_cap = MAX( (int)(api->system->n * safezone), mincap ); - api->system->total_cap = MAX( (int)(api->system->N * safezone), mincap ); + api->system->local_cap = MAX((int)(api->system->n * safezone), mincap); + api->system->total_cap = MAX((int)(api->system->N * safezone), mincap); // initialize my data structures - PreAllocate_Space( api->system, api->control, api->workspace ); + PreAllocate_Space(api->system, api->workspace); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); @@ -395,7 +395,8 @@ void PairReaxCOMP::setup( ) write_reax_lists(); - InitializeOMP(api->system, api->control, api->data, api->workspace, &api->lists, api->out_control, world); + InitializeOMP(api->system, api->control, api->data, api->workspace, + &api->lists, api->out_control, world); for (int k = 0; k < api->system->N; ++k) { num_bonds[k] = api->system->my_atoms[k].num_bonds; @@ -411,7 +412,7 @@ void PairReaxCOMP::setup( ) // reset the bond list info for new atoms for (int k = oldN; k < api->system->N; ++k) - Set_End_Index( k, Start_Index( k, api->lists+BONDS ), api->lists+BONDS ); + Set_End_Index(k, Start_Index(k, api->lists+BONDS), api->lists+BONDS); // estimate far neighbor list size // Not present in MPI-only version @@ -419,7 +420,7 @@ void PairReaxCOMP::setup( ) // check if I need to shrink/extend my data-structs - ReAllocate( api->system, api->control, api->data, api->workspace, &api->lists ); + ReAllocate(api->system, api->control, api->data, api->workspace, &api->lists); } } @@ -522,7 +523,7 @@ int PairReaxCOMP::write_reax_lists() for (itr_i = 0; itr_i < numall; ++itr_i) { i = ilist[itr_i]; jlist = firstneigh[i]; - Set_Start_Index( i, num_nbrs_offset[i], far_nbrs ); + Set_Start_Index(i, num_nbrs_offset[i], far_nbrs); if (i < inum) cutoff_sqr = SQR(api->control->nonb_cut); @@ -534,15 +535,15 @@ int PairReaxCOMP::write_reax_lists() for (itr_j = 0; itr_j < numneigh[i]; ++itr_j) { j = jlist[itr_j]; j &= NEIGHMASK; - get_distance( x[j], x[i], &d_sqr, &dvec ); + get_distance(x[j], x[i], &d_sqr, &dvec); if (d_sqr <= cutoff_sqr) { - dist = sqrt( d_sqr ); - set_far_nbr(&far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec ); + dist = sqrt(d_sqr); + set_far_nbr(&far_list[num_nbrs_offset[i] + num_mynbrs], j, dist, dvec); ++num_mynbrs; } } - Set_End_Index( i, num_nbrs_offset[i] + num_mynbrs, far_nbrs ); + Set_End_Index(i, num_nbrs_offset[i] + num_mynbrs, far_nbrs); } #ifdef OMP_TIMING @@ -587,7 +588,7 @@ void PairReaxCOMP::FindBond() nj = 0; for (pj = Start_Index(i, api->lists); pj < End_Index(i, api->lists); ++pj) { - bo_ij = &( api->lists->select.bond_list[pj] ); + bo_ij = &(api->lists->select.bond_list[pj]); j = bo_ij->nbr; if (j < i) continue; diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index a2abb60f27..745290fa37 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -26,692 +26,622 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_bond_orders_omp.h" -#include "reaxc_bond_orders.h" +#include "reaxff_omp.h" #include "fix_omp.h" -#include "reaxc_defs.h" #include "pair_reaxc_omp.h" -#include "reaxc_types.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" -#include #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; -void Add_dBond_to_ForcesOMP( reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) { - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - int pk, k, j; +namespace ReaxFF { + void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, + storage *workspace, reax_list **lists) { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + int pk, k, j; - PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); + PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - long reductionOffset = (system->N * tid); + int tid = get_tid(); + ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); - /* Virial Tallying variables */ - rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; + /* Virial Tallying variables */ + rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); - double c = bo_ij->Cdbo + bo_ji->Cdbo; - coef.C1dbo = bo_ij->C1dbo * c; - coef.C2dbo = bo_ij->C2dbo * c; - coef.C3dbo = bo_ij->C3dbo * c; + double c = bo_ij->Cdbo + bo_ji->Cdbo; + coef.C1dbo = bo_ij->C1dbo * c; + coef.C2dbo = bo_ij->C2dbo * c; + coef.C3dbo = bo_ij->C3dbo * c; - c = bo_ij->Cdbopi + bo_ji->Cdbopi; - coef.C1dbopi = bo_ij->C1dbopi * c; - coef.C2dbopi = bo_ij->C2dbopi * c; - coef.C3dbopi = bo_ij->C3dbopi * c; - coef.C4dbopi = bo_ij->C4dbopi * c; + c = bo_ij->Cdbopi + bo_ji->Cdbopi; + coef.C1dbopi = bo_ij->C1dbopi * c; + coef.C2dbopi = bo_ij->C2dbopi * c; + coef.C3dbopi = bo_ij->C3dbopi * c; + coef.C4dbopi = bo_ij->C4dbopi * c; - c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; - coef.C1dbopi2 = bo_ij->C1dbopi2 * c; - coef.C2dbopi2 = bo_ij->C2dbopi2 * c; - coef.C3dbopi2 = bo_ij->C3dbopi2 * c; - coef.C4dbopi2 = bo_ij->C4dbopi2 * c; + c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; + coef.C1dbopi2 = bo_ij->C1dbopi2 * c; + coef.C2dbopi2 = bo_ij->C2dbopi2 * c; + coef.C3dbopi2 = bo_ij->C3dbopi2 * c; + coef.C4dbopi2 = bo_ij->C4dbopi2 * c; - c = workspace->CdDelta[i] + workspace->CdDelta[j]; - coef.C1dDelta = bo_ij->C1dbo * c; - coef.C2dDelta = bo_ij->C2dbo * c; - coef.C3dDelta = bo_ij->C3dbo * c; + c = workspace->CdDelta[i] + workspace->CdDelta[j]; + coef.C1dDelta = bo_ij->C1dbo * c; + coef.C2dDelta = bo_ij->C2dbo * c; + coef.C3dDelta = bo_ij->C3dbo * c; - // The same "c" refactoring here can be replicated below in Add_dBond_to_Forces_NPTOMP(), but - // I'd prefer to wait for a test to verify changes before doing so (just to be safe). + c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp ); - // forces on i - // rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); - // rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] ); - // rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); - // rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]); - // rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - // rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] ); + c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_ScaledAdd( temp, c, workspace->dDeltap_self[i] ); - c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); - rvec_ScaledAdd( temp, c, workspace->dDeltap_self[i] ); - - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - - rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fi_tmp, -1.0, temp); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, - fi_tmp[0],fi_tmp[1],fi_tmp[2], - delij[0],delij[1],delij[2],thr); - } - - // forces on j - // rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); - // rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]); - // rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); - // rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]); - // rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - // rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); - // rvec_ScaledAdd( temp, coef.C4dbopi2, workspace->dDeltap_self[j]); - - - c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp ); - - c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); - rvec_ScaledAdd( temp, c, workspace->dDeltap_self[j] ); - - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - - - rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fj_tmp, -1.0, temp); - rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, - fj_tmp[0],fj_tmp[1],fj_tmp[2], - delji[0],delji[1],delji[2],thr); - } - - // forces on k: i neighbor - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); - - const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); - rvec_Scale(temp, c, nbr_k->bo_data.dBOp); - - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + rvec_Scale(fi_tmp, -1.0, temp); + rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, + fi_tmp[0],fi_tmp[1],fi_tmp[2], + delij[0],delij[1],delij[2],thr); + } - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); + c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp ); + + c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_ScaledAdd( temp, c, workspace->dDeltap_self[j] ); + + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + + + rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fj_tmp, -1.0, temp); + rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, + fj_tmp[0],fj_tmp[1],fj_tmp[2], + delji[0],delji[1],delji[2],thr); + } + + // forces on k: i neighbor + for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + + const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } + } + + // forces on k: j neighbor + for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); + // rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + + const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } } } - // forces on k: j neighbor - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; +/* ---------------------------------------------------------------------- */ - // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); - // rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + void Add_dBond_to_Forces_NPTOMP(reax_system *system, int i, int pj, + storage *workspace, reax_list **lists) { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + rvec temp; + int pk, k, j; - const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); - rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + int tid = get_tid(); + long reductionOffset = (system->N * tid); - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); + coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); + coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + + + /************************************ + * forces related to atom i * + * first neighbors of atom i * + ************************************/ + for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ + rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ + rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ + + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); } - } -} -/* ---------------------------------------------------------------------- */ + /* then atom i itself */ + rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ -void Add_dBond_to_Forces_NPTOMP(reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) { - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - rvec temp; - int pk, k, j; - -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - long reductionOffset = (system->N * tid); - - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); - - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - - - /************************************ - * forces related to atom i * - * first neighbors of atom i * - ************************************/ - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ - rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); - } + rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); - /* then atom i itself */ - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ + rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ + rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); + /* force */ + rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + } - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; + /* then atom j itself */ + rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ + rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ + rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ + rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); } - /* then atom j itself */ - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ +/* ---------------------------------------------------------------------- */ - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + int BOp_OMP( storage * /* workspace */, reax_list *bonds, double bo_cut, + int i, int btop_i, far_neighbor_data *nbr_pj, + single_body_parameters * /* sbp_i */, single_body_parameters * /* sbp_j */, + two_body_parameters *twbp, + int btop_j, double C12, double C34, double C56, double BO, double BO_s, double BO_pi, double BO_pi2) { + int j; + double rr2; + double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; + bond_data *ibond, *jbond; + bond_order_data *bo_ij, *bo_ji; - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ - rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ + j = nbr_pj->nbr; + rr2 = 1.0 / SQR(nbr_pj->d); - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); -} + // Top portion of BOp() moved to reaxc_forces_omp.cpp::Init_Forces_noQEq_OMP() + + /* Initially BO values are the uncorrected ones, page 1 */ + + /****** bonds i-j and j-i ******/ + ibond = &( bonds->select.bond_list[btop_i] ); + jbond = &( bonds->select.bond_list[btop_j] ); + + ibond->nbr = j; + jbond->nbr = i; + ibond->d = nbr_pj->d; + jbond->d = nbr_pj->d; + rvec_Copy( ibond->dvec, nbr_pj->dvec ); + rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); + ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); + ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); + ibond->dbond_index = btop_i; + jbond->dbond_index = btop_i; + ibond->sym_index = btop_j; + jbond->sym_index = btop_i; + + bo_ij = &( ibond->bo_data ); + bo_ji = &( jbond->bo_data ); + bo_ji->BO = bo_ij->BO = BO; + bo_ji->BO_s = bo_ij->BO_s = BO_s; + bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; + bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; + + /* Bond Order page2-3, derivative of total bond order prime */ + Cln_BOp_s = twbp->p_bo2 * C12 * rr2; + Cln_BOp_pi = twbp->p_bo4 * C34 * rr2; + Cln_BOp_pi2 = twbp->p_bo6 * C56 * rr2; + + /* Only dln_BOp_xx wrt. dr_i is stored here, note that + dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ + rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi,-bo_ij->BO_pi*Cln_BOp_pi,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi2, + -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); + rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); + rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); + rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + + rvec_Scale( bo_ij->dBOp, + -(bo_ij->BO_s * Cln_BOp_s + + bo_ij->BO_pi * Cln_BOp_pi + + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); + rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); + + bo_ij->BO_s -= bo_cut; + bo_ij->BO -= bo_cut; + bo_ji->BO_s -= bo_cut; + bo_ji->BO -= bo_cut; + + bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; + bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; + + return 1; + } /* ---------------------------------------------------------------------- */ -int BOp_OMP( storage * /* workspace */, reax_list *bonds, double bo_cut, - int i, int btop_i, far_neighbor_data *nbr_pj, - single_body_parameters * /* sbp_i */, single_body_parameters * /* sbp_j */, - two_body_parameters *twbp, - int btop_j, double C12, double C34, double C56, double BO, double BO_s, double BO_pi, double BO_pi2) { - int j; - double rr2; - double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; - bond_data *ibond, *jbond; - bond_order_data *bo_ij, *bo_ji; - - j = nbr_pj->nbr; - rr2 = 1.0 / SQR(nbr_pj->d); - - // Top portion of BOp() moved to reaxc_forces_omp.cpp::Init_Forces_noQEq_OMP() - - /* Initially BO values are the uncorrected ones, page 1 */ - - /****** bonds i-j and j-i ******/ - ibond = &( bonds->select.bond_list[btop_i] ); - jbond = &( bonds->select.bond_list[btop_j] ); - - ibond->nbr = j; - jbond->nbr = i; - ibond->d = nbr_pj->d; - jbond->d = nbr_pj->d; - rvec_Copy( ibond->dvec, nbr_pj->dvec ); - rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); - ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); - ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); - ibond->dbond_index = btop_i; - jbond->dbond_index = btop_i; - ibond->sym_index = btop_j; - jbond->sym_index = btop_i; - - bo_ij = &( ibond->bo_data ); - bo_ji = &( jbond->bo_data ); - bo_ji->BO = bo_ij->BO = BO; - bo_ji->BO_s = bo_ij->BO_s = BO_s; - bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; - bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; - - /* Bond Order page2-3, derivative of total bond order prime */ - Cln_BOp_s = twbp->p_bo2 * C12 * rr2; - Cln_BOp_pi = twbp->p_bo4 * C34 * rr2; - Cln_BOp_pi2 = twbp->p_bo6 * C56 * rr2; - - /* Only dln_BOp_xx wrt. dr_i is stored here, note that - dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ - rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); - rvec_Scale(bo_ij->dln_BOp_pi,-bo_ij->BO_pi*Cln_BOp_pi,ibond->dvec); - rvec_Scale(bo_ij->dln_BOp_pi2, - -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); - rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); - rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); - rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); - - rvec_Scale( bo_ij->dBOp, - -(bo_ij->BO_s * Cln_BOp_s + - bo_ij->BO_pi * Cln_BOp_pi + - bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); - rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); - - bo_ij->BO_s -= bo_cut; - bo_ij->BO -= bo_cut; - bo_ji->BO_s -= bo_cut; - bo_ji->BO -= bo_cut; - - bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; - bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; - - return 1; -} - -/* ---------------------------------------------------------------------- */ - -void BOOMP( reax_system *system, control_params * /* control */, simulation_data * /* data */, - storage *workspace, reax_list **lists, output_controls * /* out_control */) -{ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - double p_lp1 = system->reax_param.gp.l[15]; - double p_boc1 = system->reax_param.gp.l[0]; - double p_boc2 = system->reax_param.gp.l[1]; - reax_list *bonds = (*lists) + BONDS; + void BOOMP( reax_system *system, control_params * /* control */, simulation_data * /* data */, + storage *workspace, reax_list **lists, output_controls * /* out_control */) + { + double p_lp1 = system->reax_param.gp.l[15]; + double p_boc1 = system->reax_param.gp.l[0]; + double p_boc2 = system->reax_param.gp.l[1]; + reax_list *bonds = (*lists) + BONDS; #if defined(_OPENMP) #pragma omp parallel default(shared) #endif - { - int i, j, pj, type_i, type_j; - int start_i, end_i, sym_index; - double val_i, Deltap_i, Deltap_boc_i; - double val_j, Deltap_j, Deltap_boc_j; - double f1, f2, f3, f4, f5, f4f5, exp_f4, exp_f5; - double exp_p1i, exp_p2i, exp_p1j, exp_p2j, explp1; - double temp, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; - double Cf45_ij, Cf45_ji; //u_ij, u_ji - double A0_ij, A1_ij, A2_ij, A2_ji, A3_ij, A3_ji; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - bond_order_data *bo_ij, *bo_ji; + { + int i, j, pj, type_i, type_j; + int start_i, end_i, sym_index; + double val_i, Deltap_i, Deltap_boc_i; + double val_j, Deltap_j, Deltap_boc_j; + double f1, f2, f3, f4, f5, f4f5, exp_f4, exp_f5; + double exp_p1i, exp_p2i, exp_p1j, exp_p2j, explp1; + double temp, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; + double Cf45_ij, Cf45_ji; //u_ij, u_ji + double A0_ij, A1_ij, A2_ij, A2_ji, A3_ij, A3_ji; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij, *bo_ji; - /* Calculate Deltaprime, Deltaprime_boc values */ + /* Calculate Deltaprime, Deltaprime_boc values */ #if defined(_OPENMP) #pragma omp for schedule(static) #endif - for (i = 0; i < system->N; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[type_i]); - workspace->Deltap[i] = workspace->total_bond_order[i] - sbp_i->valency; - workspace->Deltap_boc[i] = - workspace->total_bond_order[i] - sbp_i->valency_val; + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + workspace->Deltap[i] = workspace->total_bond_order[i] - sbp_i->valency; + workspace->Deltap_boc[i] = + workspace->total_bond_order[i] - sbp_i->valency_val; - workspace->total_bond_order[i] = 0; - } - - // Wait till initialization complete -#if defined(_OPENMP) -#pragma omp barrier -#endif - - /* Corrected Bond Order calculations */ -#if defined(_OPENMP) -#pragma omp for schedule(guided) -#endif - for (i = 0; i < system->N; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[type_i]); - val_i = sbp_i->valency; - Deltap_i = workspace->Deltap[i]; - Deltap_boc_i = workspace->Deltap_boc[i]; - start_i = Start_Index(i, bonds); - end_i = End_Index(i, bonds); - - for (pj = start_i; pj < end_i; ++pj) { - j = bonds->select.bond_list[pj].nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - bo_ij = &( bonds->select.bond_list[pj].bo_data ); - - if (i < j || workspace->bond_mark[j] > 3) { - twbp = &( system->reax_param.tbp[type_i][type_j] ); - - if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { - bo_ij->C1dbo = 1.000000; - bo_ij->C2dbo = 0.000000; - bo_ij->C3dbo = 0.000000; - - bo_ij->C1dbopi = 1.000000; - bo_ij->C2dbopi = 0.000000; - bo_ij->C3dbopi = 0.000000; - bo_ij->C4dbopi = 0.000000; - - bo_ij->C1dbopi2 = 1.000000; - bo_ij->C2dbopi2 = 0.000000; - bo_ij->C3dbopi2 = 0.000000; - bo_ij->C4dbopi2 = 0.000000; - - } - else { - val_j = system->reax_param.sbp[type_j].valency; - Deltap_j = workspace->Deltap[j]; - Deltap_boc_j = workspace->Deltap_boc[j]; - - /* on page 1 */ - if (twbp->ovc >= 0.001) { - /* Correction for overcoordination */ - exp_p1i = exp( -p_boc1 * Deltap_i ); - exp_p2i = exp( -p_boc2 * Deltap_i ); - exp_p1j = exp( -p_boc1 * Deltap_j ); - exp_p2j = exp( -p_boc2 * Deltap_j ); - - f2 = exp_p1i + exp_p1j; - f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); - f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + - ( val_j + f2 )/( val_j + f2 + f3 ) ); - - /* Now come the derivates */ - /* Bond Order pages 5-7, derivative of f1 */ - temp = f2 + f3; - u1_ij = val_i + temp; - u1_ji = val_j + temp; - Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + - 1.0 / SQR( u1_ji )); - Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + - ( u1_ji - f3 ) / SQR( u1_ji )); - - Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - - ((val_i+f2) / SQR(u1_ij)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) ) + - -p_boc1 * exp_p1i / u1_ji - - ((val_j+f2) / SQR(u1_ji)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) )); - - - Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + - Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); - } - else { - /* No overcoordination correction! */ - f1 = 1.0; - Cf1_ij = Cf1_ji = 0.0; - } - - if (twbp->v13cor >= 0.001) { - /* Correction for 1-3 bond orders */ - exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - - Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); - exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - - Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); - - f4 = 1. / (1. + exp_f4); - f5 = 1. / (1. + exp_f5); - f4f5 = f4 * f5; - - /* Bond Order pages 8-9, derivative of f4 and f5 */ - Cf45_ij = -f4 * exp_f4; - Cf45_ji = -f5 * exp_f5; - } - else { - f4 = f5 = f4f5 = 1.0; - Cf45_ij = Cf45_ji = 0.0; - } - - /* Bond Order page 10, derivative of total bond order */ - A0_ij = f1 * f4f5; - A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * - (Cf45_ij + Cf45_ji); - A2_ij = Cf1_ij / f1 + twbp->p_boc3 * Cf45_ij; - A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; - A3_ij = A2_ij + Cf1_ij / f1; - A3_ji = A2_ji + Cf1_ji / f1; - - /* find corrected bond orders and their derivative coef */ - bo_ij->BO = bo_ij->BO * A0_ij; - bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; - bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; - bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); - - bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; - bo_ij->C2dbo = bo_ij->BO * A2_ij; - bo_ij->C3dbo = bo_ij->BO * A2_ji; - - bo_ij->C1dbopi = f1*f1*f4*f5; - bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; - bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; - bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; - - bo_ij->C1dbopi2 = f1*f1*f4*f5; - bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; - bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; - bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; - } - - /* neglect bonds that are < 1e-10 */ - if (bo_ij->BO < 1e-10) - bo_ij->BO = 0.0; - if (bo_ij->BO_s < 1e-10) - bo_ij->BO_s = 0.0; - if (bo_ij->BO_pi < 1e-10) - bo_ij->BO_pi = 0.0; - if (bo_ij->BO_pi2 < 1e-10) - bo_ij->BO_pi2 = 0.0; - - workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO - } - // else { - // /* We only need to update bond orders from bo_ji - // everything else is set in uncorrected_bo calculations */ - // sym_index = bonds->select.bond_list[pj].sym_index; - // bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); - // bo_ij->BO = bo_ji->BO; - // bo_ij->BO_s = bo_ji->BO_s; - // bo_ij->BO_pi = bo_ji->BO_pi; - // bo_ij->BO_pi2 = bo_ji->BO_pi2; - - // workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO - // } + workspace->total_bond_order[i] = 0; } - } - - // Wait for bo_ij to be updated + // Wait till initialization complete #if defined(_OPENMP) #pragma omp barrier #endif - // Try to combine the following for-loop back into the for-loop above - /*-------------------------*/ + + /* Corrected Bond Order calculations */ #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < system->N; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - start_i = Start_Index(i, bonds); - end_i = End_Index(i, bonds); - - for (pj = start_i; pj < end_i; ++pj) { - j = bonds->select.bond_list[pj].nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - - if (i < j || workspace->bond_mark[j] > 3) { - // Computed in previous for-loop - } else { - /* We only need to update bond orders from bo_ji - everything else is set in uncorrected_bo calculations */ - sym_index = bonds->select.bond_list[pj].sym_index; + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + val_i = sbp_i->valency; + Deltap_i = workspace->Deltap[i]; + Deltap_boc_i = workspace->Deltap_boc[i]; + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; bo_ij = &( bonds->select.bond_list[pj].bo_data ); - bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); - bo_ij->BO = bo_ji->BO; - bo_ij->BO_s = bo_ji->BO_s; - bo_ij->BO_pi = bo_ji->BO_pi; - bo_ij->BO_pi2 = bo_ji->BO_pi2; - workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO + if (i < j || workspace->bond_mark[j] > 3) { + twbp = &( system->reax_param.tbp[type_i][type_j] ); + + if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { + bo_ij->C1dbo = 1.000000; + bo_ij->C2dbo = 0.000000; + bo_ij->C3dbo = 0.000000; + + bo_ij->C1dbopi = 1.000000; + bo_ij->C2dbopi = 0.000000; + bo_ij->C3dbopi = 0.000000; + bo_ij->C4dbopi = 0.000000; + + bo_ij->C1dbopi2 = 1.000000; + bo_ij->C2dbopi2 = 0.000000; + bo_ij->C3dbopi2 = 0.000000; + bo_ij->C4dbopi2 = 0.000000; + + } else { + val_j = system->reax_param.sbp[type_j].valency; + Deltap_j = workspace->Deltap[j]; + Deltap_boc_j = workspace->Deltap_boc[j]; + + /* on page 1 */ + if (twbp->ovc >= 0.001) { + /* Correction for overcoordination */ + exp_p1i = exp( -p_boc1 * Deltap_i ); + exp_p2i = exp( -p_boc2 * Deltap_i ); + exp_p1j = exp( -p_boc1 * Deltap_j ); + exp_p2j = exp( -p_boc2 * Deltap_j ); + + f2 = exp_p1i + exp_p1j; + f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); + f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + + ( val_j + f2 )/( val_j + f2 + f3 ) ); + + /* Now come the derivates */ + /* Bond Order pages 5-7, derivative of f1 */ + temp = f2 + f3; + u1_ij = val_i + temp; + u1_ji = val_j + temp; + Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + + 1.0 / SQR( u1_ji )); + Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + + ( u1_ji - f3 ) / SQR( u1_ji )); + + Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - + ((val_i+f2) / SQR(u1_ij)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) ) + + -p_boc1 * exp_p1i / u1_ji - + ((val_j+f2) / SQR(u1_ji)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) )); + + + Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + + Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); + } else { + /* No overcoordination correction! */ + f1 = 1.0; + Cf1_ij = Cf1_ji = 0.0; + } + + if (twbp->v13cor >= 0.001) { + /* Correction for 1-3 bond orders */ + exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); + exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); + + f4 = 1. / (1. + exp_f4); + f5 = 1. / (1. + exp_f5); + f4f5 = f4 * f5; + + /* Bond Order pages 8-9, derivative of f4 and f5 */ + Cf45_ij = -f4 * exp_f4; + Cf45_ji = -f5 * exp_f5; + } else { + f4 = f5 = f4f5 = 1.0; + Cf45_ij = Cf45_ji = 0.0; + } + + /* Bond Order page 10, derivative of total bond order */ + A0_ij = f1 * f4f5; + A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * + (Cf45_ij + Cf45_ji); + A2_ij = Cf1_ij / f1 + twbp->p_boc3 * Cf45_ij; + A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; + A3_ij = A2_ij + Cf1_ij / f1; + A3_ji = A2_ji + Cf1_ji / f1; + + /* find corrected bond orders and their derivative coef */ + bo_ij->BO = bo_ij->BO * A0_ij; + bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; + bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; + bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + + bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; + bo_ij->C2dbo = bo_ij->BO * A2_ij; + bo_ij->C3dbo = bo_ij->BO * A2_ji; + + bo_ij->C1dbopi = f1*f1*f4*f5; + bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; + bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; + bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; + + bo_ij->C1dbopi2 = f1*f1*f4*f5; + bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; + bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; + bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; + } + + /* neglect bonds that are < 1e-10 */ + if (bo_ij->BO < 1e-10) + bo_ij->BO = 0.0; + if (bo_ij->BO_s < 1e-10) + bo_ij->BO_s = 0.0; + if (bo_ij->BO_pi < 1e-10) + bo_ij->BO_pi = 0.0; + if (bo_ij->BO_pi2 < 1e-10) + bo_ij->BO_pi2 = 0.0; + + workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO + } } } - } - - /*-------------------------*/ - - // Need to wait for total_bond_order to be accumulated. + // Wait for bo_ij to be updated #if defined(_OPENMP) #pragma omp barrier #endif - /* Calculate some helper variables that are used at many places - throughout force calculations */ + // Try to combine the following for-loop back into the for-loop above + /*-------------------------*/ #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (j = 0; j < system->N; ++j) { - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[ type_j ]); + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); - workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; - workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; - workspace->Delta_boc[j] = workspace->total_bond_order[j] - - sbp_j->valency_boc; - workspace->Delta_val[j] = workspace->total_bond_order[j] - - sbp_j->valency_val; + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; - workspace->vlpex[j] = workspace->Delta_e[j] - - 2.0 * (int)(workspace->Delta_e[j]/2.0); - explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); - workspace->nlp[j] = explp1 - (int)(workspace->Delta_e[j] / 2.0); - workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; - workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); - workspace->dDelta_lp[j] = workspace->Clp[j]; + if (i < j || workspace->bond_mark[j] > 3) { + // Computed in previous for-loop + } else { + /* We only need to update bond orders from bo_ji + everything else is set in uncorrected_bo calculations */ + sym_index = bonds->select.bond_list[pj].sym_index; + + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + bo_ij->BO = bo_ji->BO; + bo_ij->BO_s = bo_ji->BO_s; + bo_ij->BO_pi = bo_ji->BO_pi; + bo_ij->BO_pi2 = bo_ji->BO_pi2; + + workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO + } + } - if (sbp_j->mass > 21.0) { - workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); - workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; - workspace->dDelta_lp_temp[j] = 0.; } - else { - workspace->nlp_temp[j] = workspace->nlp[j]; - workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; - workspace->dDelta_lp_temp[j] = workspace->Clp[j]; - } - } - } // parallel region - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEBOINDEX] += (endTimeBase-startTimeBase); + /*-------------------------*/ + // Need to wait for total_bond_order to be accumulated. +#if defined(_OPENMP) +#pragma omp barrier #endif + /* Calculate some helper variables that are used at many places + throughout force calculations */ +#if defined(_OPENMP) +#pragma omp for schedule(guided) +#endif + for (j = 0; j < system->N; ++j) { + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[ type_j ]); + + workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; + workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; + workspace->Delta_boc[j] = workspace->total_bond_order[j] - + sbp_j->valency_boc; + workspace->Delta_val[j] = workspace->total_bond_order[j] - + sbp_j->valency_val; + + workspace->vlpex[j] = workspace->Delta_e[j] - + 2.0 * (int)(workspace->Delta_e[j]/2.0); + explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); + workspace->nlp[j] = explp1 - (int)(workspace->Delta_e[j] / 2.0); + workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; + workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); + workspace->dDelta_lp[j] = workspace->Clp[j]; + + if (sbp_j->mass > 21.0) { + workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = 0.; + } + else { + workspace->nlp_temp[j] = workspace->nlp[j]; + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = workspace->Clp[j]; + } + } + + } // parallel region + } } diff --git a/src/USER-OMP/reaxc_bond_orders_omp.h b/src/USER-OMP/reaxc_bond_orders_omp.h deleted file mode 100644 index 1711a9ca0c..0000000000 --- a/src/USER-OMP/reaxc_bond_orders_omp.h +++ /dev/null @@ -1,43 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __BOND_ORDERS_OMP_H_ -#define __BOND_ORDERS_OMP_H_ - -#include "reaxc_types.h" - -void Add_dBond_to_ForcesOMP(reax_system *, int, int, storage *, reax_list **); -void Add_dBond_to_Forces_NPTOMP(reax_system *, int, int, storage *, reax_list **); - -int BOp_OMP(storage *, reax_list *, double, int, int, far_neighbor_data *, - single_body_parameters *, single_body_parameters *, two_body_parameters *, - int, double, double, double, double, double, double, double); - -void BOOMP(reax_system *, control_params *, simulation_data *, - storage *, reax_list **, output_controls *); -#endif diff --git a/src/USER-OMP/reaxc_bonds_omp.cpp b/src/USER-OMP/reaxc_bonds_omp.cpp index 30d50a4e70..0cc0f995fb 100644 --- a/src/USER-OMP/reaxc_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_bonds_omp.cpp @@ -26,163 +26,145 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_bonds_omp.h" -#include -#include -#include "fix_omp.h" -#include "reaxc_defs.h" -#include "pair_reaxc_omp.h" -#include "reaxc_list.h" +#include "reaxff_omp.h" -#if defined(_OPENMP) -#include -#endif +#include "fix_omp.h" +#include "pair_reaxc_omp.h" +#include "reaxff_api.h" + +#include using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -void BondsOMP( reax_system *system, control_params * /* control */, - simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /* out_control */) -{ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - const int natoms = system->n; - reax_list *bonds = (*lists) + BONDS; - const double gp3 = system->reax_param.gp.l[3]; - const double gp4 = system->reax_param.gp.l[4]; - const double gp7 = system->reax_param.gp.l[7]; - const double gp10 = system->reax_param.gp.l[10]; - const int gp37 = (int) system->reax_param.gp.l[37]; - double total_Ebond = 0.0; +namespace ReaxFF { + void BondsOMP(reax_system *system, simulation_data *data, + storage *workspace, reax_list **lists) + { + const int natoms = system->n; + reax_list *bonds = (*lists) + BONDS; + const double gp3 = system->reax_param.gp.l[3]; + const double gp4 = system->reax_param.gp.l[4]; + const double gp7 = system->reax_param.gp.l[7]; + const double gp10 = system->reax_param.gp.l[10]; + const int gp37 = (int) system->reax_param.gp.l[37]; + double total_Ebond = 0.0; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+: total_Ebond) #endif - { - int i, j, pj; - int start_i, end_i; - int type_i, type_j; - double ebond, pow_BOs_be2, exp_be12, CEbo; - double exphu, exphua1, exphub1, exphuov, hulpov, estriph; - double decobdbo, decobdboua, decobdboub; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - bond_order_data *bo_ij; + { + int i, j, pj; + int start_i, end_i; + int type_i, type_j; + double ebond, pow_BOs_be2, exp_be12, CEbo; + double exphu, exphua1, exphub1, exphuov, hulpov, estriph; + double decobdbo, decobdboua, decobdboub; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - long reductionOffset = (system->N * tid); + int tid = get_tid(); + long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, system->N, - system->pair_ptr->eatom, - system->pair_ptr->vatom, nullptr, thr); + pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, system->N, + system->pair_ptr->eatom, + system->pair_ptr->vatom, nullptr, thr); #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < natoms; ++i) { - start_i = Start_Index(i, bonds); - end_i = End_Index(i, bonds); + for (i = 0; i < natoms; ++i) { + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); - for (pj = start_i; pj < end_i; ++pj) { - j = bonds->select.bond_list[pj].nbr; + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; - if (system->my_atoms[i].orig_id > system->my_atoms[j].orig_id) continue; + if (system->my_atoms[i].orig_id > system->my_atoms[j].orig_id) continue; - if (system->my_atoms[i].orig_id == system->my_atoms[j].orig_id) { - if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && - system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && - system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && - system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; - } + if (system->my_atoms[i].orig_id == system->my_atoms[j].orig_id) { + if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && + system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; + } - /* set the pointers */ - type_i = system->my_atoms[i].type; - type_j = system->my_atoms[j].type; - sbp_i = &( system->reax_param.sbp[type_i] ); - sbp_j = &( system->reax_param.sbp[type_j] ); - twbp = &( system->reax_param.tbp[type_i][type_j] ); - bo_ij = &( bonds->select.bond_list[pj].bo_data ); + /* set the pointers */ + type_i = system->my_atoms[i].type; + type_j = system->my_atoms[j].type; + sbp_i = &(system->reax_param.sbp[type_i]); + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); + bo_ij = &(bonds->select.bond_list[pj].bo_data); - /* calculate the constants */ - if (bo_ij->BO_s == 0.0) pow_BOs_be2 = 0.0; - else pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); - exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); - CEbo = -twbp->De_s * exp_be12 * - ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); + /* calculate the constants */ + if (bo_ij->BO_s == 0.0) pow_BOs_be2 = 0.0; + else pow_BOs_be2 = pow(bo_ij->BO_s, twbp->p_be2); + exp_be12 = exp(twbp->p_be1 * (1.0 - pow_BOs_be2)); + CEbo = -twbp->De_s * exp_be12 * + (1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2); - /* calculate the Bond Energy */ - total_Ebond += ebond = - -twbp->De_s * bo_ij->BO_s * exp_be12 - -twbp->De_p * bo_ij->BO_pi - -twbp->De_pp * bo_ij->BO_pi2; - - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, - ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - - /* calculate derivatives of Bond Orders */ - bo_ij->Cdbo += CEbo; - bo_ij->Cdbopi -= (CEbo + twbp->De_p); - bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); - - /* Stabilisation terminal triple bond */ - if (bo_ij->BO >= 1.00) { - if (gp37 == 2 || - (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || - (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { - exphu = exp( -gp7 * SQR(bo_ij->BO - 2.50) ); - exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); - exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); - exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); - hulpov = 1.0 / (1.0 + 25.0 * exphuov); - - estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); - total_Ebond += estriph; - - decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * - ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); - decobdboua = -gp10 * exphu * hulpov * - (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); - decobdboub = -gp10 * exphu * hulpov * - (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + /* calculate the Bond Energy */ + total_Ebond += ebond = + -twbp->De_s * bo_ij->BO_s * exp_be12 + -twbp->De_p * bo_ij->BO_pi + -twbp->De_pp * bo_ij->BO_pi2; /* tally into per-atom energy */ if (system->pair_ptr->evflag) pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, - estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - bo_ij->Cdbo += decobdbo; - workspace->CdDelta[i] += decobdboua; - workspace->CdDeltaReduction[reductionOffset+j] += decobdboub; + /* calculate derivatives of Bond Orders */ + bo_ij->Cdbo += CEbo; + bo_ij->Cdbopi -= (CEbo + twbp->De_p); + bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); + + /* Stabilisation terminal triple bond */ + if (bo_ij->BO >= 1.00) { + if (gp37 == 2 || + (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || + (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { + exphu = exp(-gp7 * SQR(bo_ij->BO - 2.50)); + exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); + exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); + exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); + hulpov = 1.0 / (1.0 + 25.0 * exphuov); + + estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); + total_Ebond += estriph; + + decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * + (gp3 - 2.0 * gp7 * (bo_ij->BO-2.50)); + decobdboua = -gp10 * exphu * hulpov * + (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + decobdboub = -gp10 * exphu * hulpov * + (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + + bo_ij->Cdbo += decobdbo; + workspace->CdDelta[i] += decobdboua; + workspace->CdDeltaReduction[reductionOffset+j] += decobdboub; + } + } } - } - } - } // for (i) + } // for (i) - } // omp - - data->my_en.e_bond += total_Ebond; - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEBONDSINDEX] += (endTimeBase-startTimeBase); -#endif + } // omp + data->my_en.e_bond += total_Ebond; + } } diff --git a/src/USER-OMP/reaxc_bonds_omp.h b/src/USER-OMP/reaxc_bonds_omp.h deleted file mode 100644 index e5fb0f99e1..0000000000 --- a/src/USER-OMP/reaxc_bonds_omp.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __BONDS_OMP_H_ -#define __BONDS_OMP_H_ - -#include "reaxc_types.h" - -void BondsOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index aff543225d..566edf7d05 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -26,440 +26,348 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_forces_omp.h" +#include "reaxff_omp.h" #include "error.h" #include "fix_omp.h" #include "pair_reaxc_omp.h" -#include "reaxc_defs.h" -#include "reaxc_bond_orders_omp.h" -#include "reaxc_bonds_omp.h" -#include "reaxc_hydrogen_bonds_omp.h" -#include "reaxc_list.h" -#include "reaxc_multi_body_omp.h" -#include "reaxc_nonbonded_omp.h" -#include "reaxc_torsion_angles_omp.h" -#include "reaxc_valence_angles_omp.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" -#include #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; -// Functions defined in reaxc_forces.cpp -extern interaction_function Interaction_Functions[]; -extern double Compute_H(double, double, double*); -extern double Compute_tabH(double, int, int); -extern void Dummy_Interaction(reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*); - +namespace ReaxFF { /* ---------------------------------------------------------------------- */ -void Init_Force_FunctionsOMP( control_params *control ) -{ - Interaction_Functions[0] = BOOMP; - Interaction_Functions[1] = BondsOMP; //Dummy_Interaction; - Interaction_Functions[2] = Atom_EnergyOMP; //Dummy_Interaction; - Interaction_Functions[3] = Valence_AnglesOMP; //Dummy_Interaction; - Interaction_Functions[4] = Torsion_AnglesOMP; //Dummy_Interaction; - if (control->hbond_cut > 0) - Interaction_Functions[5] = Hydrogen_BondsOMP; - else Interaction_Functions[5] = Dummy_Interaction; - Interaction_Functions[6] = Dummy_Interaction; //empty - Interaction_Functions[7] = Dummy_Interaction; //empty - Interaction_Functions[8] = Dummy_Interaction; //empty - Interaction_Functions[9] = Dummy_Interaction; //empty -} + void Compute_Bonded_ForcesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) + { -/* ---------------------------------------------------------------------- */ - -// Only difference with MPI-only version is inclusion of OMP_TIMING statements -void Compute_Bonded_ForcesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ - int i; - -#ifdef OMP_TIMING - double startTimeBase, endTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - /* Implement all force calls as function pointers */ - for (i = 0; i < NUM_INTRS; i++) { - (Interaction_Functions[i])( system, control, data, workspace, - lists, out_control ); + BOOMP(system, control, data, workspace, lists, out_control); + BondsOMP(system, data, workspace, lists); + Atom_EnergyOMP(system, data, workspace, lists); + Valence_AnglesOMP(system, control, data, workspace, lists); + Torsion_AnglesOMP(system, control, data, workspace, lists); + if (control->hbond_cut > 0) + Hydrogen_BondsOMP(system, control, data, workspace, lists); } -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEBFINDEX] += (endTimeBase-startTimeBase); -#endif - -} - // Only difference with MPI-only version is inclusion of OMP_TIMING statements -void Compute_NonBonded_ForcesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ - /* van der Waals and Coulomb interactions */ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif + void Compute_NonBonded_ForcesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) + { + /* van der Waals and Coulomb interactions */ - if (control->tabulate == 0) - vdW_Coulomb_Energy_OMP( system, control, data, workspace, - lists, out_control ); - else - Tabulated_vdW_Coulomb_Energy_OMP( system, control, data, workspace, - lists, out_control ); - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTENBFINDEX] += (endTimeBase-startTimeBase); -#endif -} + if (control->tabulate == 0) + vdW_Coulomb_Energy_OMP(system, control, data, workspace, lists); + else + Tabulated_vdW_Coulomb_Energy_OMP(system, control, data, workspace, lists); + } /* ---------------------------------------------------------------------- */ /* this version of Compute_Total_Force computes forces from coefficients accumulated by all interaction functions. Saves enormous time & space! */ -void Compute_Total_ForceOMP(reax_system *system, control_params *control, - storage *workspace, reax_list **lists) -{ -#ifdef OMP_TIMING - double startTimeBase,endTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - int natoms = system->N; - int nthreads = control->nthreads; - long totalReductionSize = (bigint)system->N * nthreads; - reax_list *bonds = (*lists) + BONDS; + void Compute_Total_ForceOMP(reax_system *system, control_params *control, + storage *workspace, reax_list **lists) + { + int natoms = system->N; + int nthreads = control->nthreads; + long totalReductionSize = (bigint)system->N * nthreads; + reax_list *bonds = (*lists) + BONDS; #if defined(_OPENMP) #pragma omp parallel default(shared) //LMP_DEFAULT_NONE #endif - { - int i, j, k, pj, pk, start_j, end_j; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - bond_order_data *bo_jk; + { + int i, j, k, pj, pk, start_j, end_j; - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + int tid = get_tid(); + bond_order_data *bo_jk; - pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, - system->pair_ptr->vatom, nullptr, thr); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + + pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, + system->pair_ptr->vatom, nullptr, thr); #if defined(_OPENMP) #pragma omp for schedule(guided) -#endif - for (i = 0; i < system->N; ++i) { - for (j = 0; j < nthreads; ++j) - workspace->CdDelta[i] += workspace->CdDeltaReduction[system->N*j+i]; - } - -#if defined(_OPENMP) -#pragma omp for schedule(dynamic,50) -#endif - for (j = 0; j < system->N; ++j) { - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); - - for (pk = start_j; pk < end_j; ++pk) { - bo_jk = &( bonds->select.bond_list[pk].bo_data ); - for (k = 0; k < nthreads; ++k) - bo_jk->Cdbo += bo_jk->CdboReduction[k]; - } - } - - if (control->virial == 0) { - -#if defined(_OPENMP) -#pragma omp for schedule(dynamic,50) #endif for (i = 0; i < system->N; ++i) { - const int startj = Start_Index(i, bonds); - const int endj = End_Index(i, bonds); - for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) - Add_dBond_to_ForcesOMP( system, i, pj, workspace, lists ); + for (j = 0; j < nthreads; ++j) + workspace->CdDelta[i] += workspace->CdDeltaReduction[system->N*j+i]; } - } else { - #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < system->N; ++i) { - const int startj = Start_Index(i, bonds); - const int endj = End_Index(i, bonds); - for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) - Add_dBond_to_Forces_NPTOMP(system, i, pj, workspace, lists ); + for (j = 0; j < system->N; ++j) { + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + for (pk = start_j; pk < end_j; ++pk) { + bo_jk = &(bonds->select.bond_list[pk].bo_data); + for (k = 0; k < nthreads; ++k) + bo_jk->Cdbo += bo_jk->CdboReduction[k]; + } } - } // if (virial == 0) + if (control->virial == 0) { - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, 0, 1, thr); +#if defined(_OPENMP) +#pragma omp for schedule(dynamic,50) +#endif + for (i = 0; i < system->N; ++i) { + const int startj = Start_Index(i, bonds); + const int endj = End_Index(i, bonds); + for (pj = startj; pj < endj; ++pj) + if (i < bonds->select.bond_list[pj].nbr) + Add_dBond_to_ForcesOMP(system, i, pj, workspace, lists); + } + + } else { + +#if defined(_OPENMP) +#pragma omp for schedule(dynamic,50) +#endif + for (i = 0; i < system->N; ++i) { + const int startj = Start_Index(i, bonds); + const int endj = End_Index(i, bonds); + for (pj = startj; pj < endj; ++pj) + if (i < bonds->select.bond_list[pj].nbr) + Add_dBond_to_Forces_NPTOMP(system, i, pj, workspace, lists); + } + + } // if (virial == 0) + + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, 0, 1, thr); #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < system->N; ++i) { - for (j = 0; j < nthreads; ++j) - rvec_Add( workspace->f[i], workspace->forceReduction[system->N*j+i] ); - } + for (i = 0; i < system->N; ++i) { + for (j = 0; j < nthreads; ++j) + rvec_Add(workspace->f[i], workspace->forceReduction[system->N*j+i]); + } #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < totalReductionSize; i++) { - workspace->forceReduction[i][0] = 0; - workspace->forceReduction[i][1] = 0; - workspace->forceReduction[i][2] = 0; - workspace->CdDeltaReduction[i] = 0; - } - } // parallel region - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTETFINDEX] += (endTimeBase-startTimeBase); -#endif -} + for (i = 0; i < totalReductionSize; i++) { + workspace->forceReduction[i][0] = 0; + workspace->forceReduction[i][1] = 0; + workspace->forceReduction[i][2] = 0; + workspace->CdDeltaReduction[i] = 0; + } + } // parallel region + } /* ---------------------------------------------------------------------- */ -void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list **lists, - int step, int n, int N, int numH) -{ - int comp, Hindex; - reax_list *bonds, *hbonds; - double saferzone = system->saferzone; + void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list **lists, + int step, int n, int N, int numH) + { + int comp, Hindex; + reax_list *bonds, *hbonds; + double saferzone = system->saferzone; #if defined(_OPENMP) #pragma omp parallel default(shared) private(comp,Hindex) #endif - { + { - /* bond list */ - if (N > 0) { - bonds = *lists + BONDS; + /* bond list */ + if (N > 0) { + bonds = *lists + BONDS; #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (int i = 0; i < N; ++i) { - system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); + for (int i = 0; i < N; ++i) { + system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); - if (i < N-1) - comp = Start_Index(i+1, bonds); - else comp = bonds->num_intrs; + if (i < N-1) + comp = Start_Index(i+1, bonds); + else comp = bonds->num_intrs; - 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)); - } - } - - - /* hbonds list */ - if (numH > 0) { - hbonds = *lists + HBONDS; - -#if defined(_OPENMP) -#pragma omp for schedule(guided) -#endif - for (int i = 0; i < n; ++i) { - Hindex = system->my_atoms[i].Hindex; - if (Hindex > -1) { - system->my_atoms[i].num_hbonds = - (int)(MAX(Num_Entries(Hindex,hbonds)*saferzone,system->minhbonds)); - - if (Hindex < numH-1) - comp = Start_Index(Hindex+1, hbonds); - else comp = hbonds->num_intrs; - - 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)); + 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)); + } } - } - } - - } // omp parallel -} -void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists) { -#ifdef OMP_TIMING - double startTimeBase, endTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - int j, pj; - int start_i, end_i; - int type_i, type_j; - int ihb, jhb, ihb_top, jhb_top; - double cutoff; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - far_neighbor_data *nbr_pj; - reax_atom *atom_i, *atom_j; - reax_list *far_nbrs = *lists + FAR_NBRS; - reax_list *bonds = *lists + BONDS; - reax_list *hbonds = *lists + HBONDS; - int num_bonds = 0; - int num_hbonds = 0; - int btop_i = 0; - - // We will use CdDeltaReduction as a temporary (double) buffer to accumulate total_bond_order - // This is safe because CdDeltaReduction is currently zeroed and its accumulation doesn't start until BondsOMP() - double * tmp_bond_order = workspace->CdDeltaReduction; - - // We do the same with forceReduction as a temporary (rvec) buffer to accumulate dDeltap_self - // This is safe because forceReduction is currently zeroed and its accumulation does start until Hydrogen_BondsOMP() - rvec * tmp_ddelta = workspace->forceReduction; - - /* uncorrected bond orders */ - cutoff = control->bond_cut; + /* hbonds list */ + if (numH > 0) { + hbonds = *lists + HBONDS; #if defined(_OPENMP) -#pragma omp parallel default(shared) \ - private(atom_i, type_i, start_i, end_i, sbp_i, btop_i, ihb, ihb_top, \ +#pragma omp for schedule(guided) +#endif + for (int i = 0; i < n; ++i) { + Hindex = system->my_atoms[i].Hindex; + if (Hindex > -1) { + system->my_atoms[i].num_hbonds = + (int)(MAX(Num_Entries(Hindex,hbonds)*saferzone,system->minhbonds)); + + if (Hindex < numH-1) + comp = Start_Index(Hindex+1, hbonds); + else comp = hbonds->num_intrs; + + 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)); + } + } + } + + } // omp parallel + } + + + void Init_Forces_noQEq_OMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) { + int j, pj; + int start_i, end_i; + int type_i, type_j; + int ihb, jhb, ihb_top, jhb_top; + double cutoff; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + reax_atom *atom_i, *atom_j; + reax_list *far_nbrs = *lists + FAR_NBRS; + reax_list *bonds = *lists + BONDS; + reax_list *hbonds = *lists + HBONDS; + int num_bonds = 0; + int num_hbonds = 0; + int btop_i = 0; + + // We will use CdDeltaReduction as a temporary (double) buffer to accumulate total_bond_order + // This is safe because CdDeltaReduction is currently zeroed and its accumulation doesn't start until BondsOMP() + double * tmp_bond_order = workspace->CdDeltaReduction; + + // We do the same with forceReduction as a temporary (rvec) buffer to accumulate dDeltap_self + // This is safe because forceReduction is currently zeroed and its accumulation does start until Hydrogen_BondsOMP() + rvec * tmp_ddelta = workspace->forceReduction; + + /* uncorrected bond orders */ + cutoff = control->bond_cut; + +#if defined(_OPENMP) +#pragma omp parallel default(shared) \ + private(atom_i, type_i, start_i, end_i, sbp_i, btop_i, ihb, ihb_top, \ atom_j, type_j, pj, sbp_j, nbr_pj, jhb, twbp) #endif - { + { - int nthreads = control->nthreads; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - long reductionOffset = (bigint)system->N * tid; - long totalReductionSize = (bigint)system->N * nthreads; + int nthreads = control->nthreads; + int tid = get_tid(); + long reductionOffset = (bigint)system->N * tid; + long totalReductionSize = (bigint)system->N * nthreads; #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) reduction(+:num_bonds) #endif - for (int i = 0; i < system->N; ++i) { - atom_i = &(system->my_atoms[i]); - type_i = atom_i->type; - sbp_i = &(system->reax_param.sbp[type_i]); + for (int i = 0; i < system->N; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + sbp_i = &(system->reax_param.sbp[type_i]); - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); - if (nbr_pj->d <= cutoff) { - int j = nbr_pj->nbr; - atom_j = &(system->my_atoms[j]); - type_j = atom_j->type; - sbp_j = &(system->reax_param.sbp[type_j]); - twbp = &(system->reax_param.tbp[type_i][type_j]); + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + if (nbr_pj->d <= cutoff) { + int j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); + type_j = atom_j->type; + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); -// #pragma omp critical -// { -// btop_i = End_Index(i, bonds); -// if (BOp(workspace, bonds, control->bo_cut, i, btop_i, nbr_pj, sbp_i, sbp_j, twbp)) { -// num_bonds++; -// btop_i++; -// Set_End_Index(i, btop_i, bonds); -// } + // Trying to minimize time spent in critical section by moving initial part of BOp() + // outside of critical section. -// } + // Start top portion of BOp() + double C12, C34, C56; + double BO, BO_s, BO_pi, BO_pi2; + double bo_cut = control->bo_cut; - // Trying to minimize time spent in critical section by moving initial part of BOp() - // outside of critical section. + if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { + C12 = twbp->p_bo1 * pow(nbr_pj->d / twbp->r_s, twbp->p_bo2); + BO_s = (1.0 + bo_cut) * exp(C12); + } + else BO_s = C12 = 0.0; - // Start top portion of BOp() - double C12, C34, C56; - double BO, BO_s, BO_pi, BO_pi2; - double bo_cut = control->bo_cut; + if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { + C34 = twbp->p_bo3 * pow(nbr_pj->d / twbp->r_p, twbp->p_bo4); + BO_pi = exp(C34); + } + else BO_pi = C34 = 0.0; - if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { - C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 ); - BO_s = (1.0 + bo_cut) * exp( C12 ); - } - else BO_s = C12 = 0.0; + if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { + C56 = twbp->p_bo5 * pow(nbr_pj->d / twbp->r_pp, twbp->p_bo6); + BO_pi2= exp(C56); + } + else BO_pi2 = C56 = 0.0; - if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { - C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 ); - BO_pi = exp( C34 ); - } - else BO_pi = C34 = 0.0; + /* Initially BO values are the uncorrected ones, page 1 */ + BO = BO_s + BO_pi + BO_pi2; + // End top portion of BOp() - if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { - C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 ); - BO_pi2= exp( C56 ); - } - else BO_pi2 = C56 = 0.0; + if (BO >= bo_cut) { + int btop_j; - /* Initially BO values are the uncorrected ones, page 1 */ - BO = BO_s + BO_pi + BO_pi2; - // End top portion of BOp() - - if (BO >= bo_cut) { - int btop_j; - - // Update indices in critical section + // Update indices in critical section #if defined(_OPENMP) #pragma omp critical #endif - { - btop_i = End_Index( i, bonds ); - btop_j = End_Index( j, bonds ); - Set_End_Index( j, btop_j+1, bonds ); - Set_End_Index( i, btop_i+1, bonds ); - } // omp critical + { + btop_i = End_Index(i, bonds); + btop_j = End_Index(j, bonds); + Set_End_Index(j, btop_j+1, bonds); + Set_End_Index(i, btop_i+1, bonds); + } // omp critical - // Finish remaining BOp() work - BOp_OMP(workspace, bonds, bo_cut, - i , btop_i, nbr_pj, sbp_i, sbp_j, twbp, btop_j, - C12, C34, C56, BO, BO_s, BO_pi, BO_pi2); + // Finish remaining BOp() work + BOp_OMP(workspace, bonds, bo_cut, + i , btop_i, nbr_pj, sbp_i, sbp_j, twbp, btop_j, + C12, C34, C56, BO, BO_s, BO_pi, BO_pi2); - bond_data * ibond = &(bonds->select.bond_list[btop_i]); - bond_order_data * bo_ij = &(ibond->bo_data); + bond_data * ibond = &(bonds->select.bond_list[btop_i]); + bond_order_data * bo_ij = &(ibond->bo_data); - bond_data * jbond = &(bonds->select.bond_list[btop_j]); - bond_order_data * bo_ji = &(jbond->bo_data); + bond_data * jbond = &(bonds->select.bond_list[btop_j]); + bond_order_data * bo_ji = &(jbond->bo_data); - workspace->total_bond_order[i] += bo_ij->BO; - tmp_bond_order[reductionOffset + j] += bo_ji->BO; + workspace->total_bond_order[i] += bo_ij->BO; + tmp_bond_order[reductionOffset + j] += bo_ji->BO; - rvec_Add(workspace->dDeltap_self[i], bo_ij->dBOp); - rvec_Add(tmp_ddelta[reductionOffset + j], bo_ji->dBOp); + rvec_Add(workspace->dDeltap_self[i], bo_ij->dBOp); + rvec_Add(tmp_ddelta[reductionOffset + j], bo_ji->dBOp); - btop_i++; - num_bonds++; - } // if (BO>=bo_cut) + btop_i++; + num_bonds++; + } // if (BO>=bo_cut) - } // if (cutoff) + } // if (cutoff) - } // for (pj) - } // for (i) + } // for (pj) + } // for (i) - // Need to wait for all indices and tmp arrays accumulated. + // Need to wait for all indices and tmp arrays accumulated. #if defined(_OPENMP) #pragma omp barrier #endif @@ -467,126 +375,123 @@ void Init_Forces_noQEq_OMP( reax_system *system, control_params *control, #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (int i=0; iN; i++) - for (int t=0; tN + i; - workspace->dDeltap_self[i][0] += tmp_ddelta[indx][0]; - workspace->dDeltap_self[i][1] += tmp_ddelta[indx][1]; - workspace->dDeltap_self[i][2] += tmp_ddelta[indx][2]; - workspace->total_bond_order[i] += tmp_bond_order[indx]; - } + for (int i=0; iN; i++) + for (int t=0; tN + i; + workspace->dDeltap_self[i][0] += tmp_ddelta[indx][0]; + workspace->dDeltap_self[i][1] += tmp_ddelta[indx][1]; + workspace->dDeltap_self[i][2] += tmp_ddelta[indx][2]; + workspace->total_bond_order[i] += tmp_bond_order[indx]; + } - /* hydrogen bond list */ - if (control->hbond_cut > 0) { - cutoff = control->hbond_cut; + /* hydrogen bond list */ + if (control->hbond_cut > 0) { + cutoff = control->hbond_cut; #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) reduction(+ : num_hbonds) #endif - for (int i = 0; i < system->n; ++i) { - atom_i = &(system->my_atoms[i]); - type_i = atom_i->type; - sbp_i = &(system->reax_param.sbp[type_i]); - ihb = sbp_i->p_hbond; + for (int i = 0; i < system->n; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + sbp_i = &(system->reax_param.sbp[type_i]); + ihb = sbp_i->p_hbond; #if defined(_OPENMP) #pragma omp critical #endif - { + { - if (ihb == 1 || ihb == 2) { - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); + if (ihb == 1 || ihb == 2) { + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); - j = nbr_pj->nbr; - atom_j = &(system->my_atoms[j]); - type_j = atom_j->type; - if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[type_j]); - jhb = sbp_j->p_hbond; + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); + type_j = atom_j->type; + if (type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[type_j]); + jhb = sbp_j->p_hbond; - if (nbr_pj->d <= control->hbond_cut) { - int iflag = 0; - int jflag = 0; + if (nbr_pj->d <= control->hbond_cut) { + int iflag = 0; + int jflag = 0; - if (ihb==1 && jhb==2) iflag = 1; - else if (jn && ihb == 2 && jhb == 1) jflag = 1; + if (ihb==1 && jhb==2) iflag = 1; + else if (jn && ihb == 2 && jhb == 1) jflag = 1; - if (iflag || jflag) { - if (iflag) { - ihb_top = End_Index(atom_i->Hindex, hbonds); - Set_End_Index(atom_i->Hindex, ihb_top+1, hbonds); - } else if (jflag) { - jhb_top = End_Index(atom_j->Hindex, hbonds); - Set_End_Index(atom_j->Hindex, jhb_top+1, hbonds); - } + if (iflag || jflag) { + if (iflag) { + ihb_top = End_Index(atom_i->Hindex, hbonds); + Set_End_Index(atom_i->Hindex, ihb_top+1, hbonds); + } else if (jflag) { + jhb_top = End_Index(atom_j->Hindex, hbonds); + Set_End_Index(atom_j->Hindex, jhb_top+1, hbonds); + } - if (iflag) { - hbonds->select.hbond_list[ihb_top].nbr = j; - hbonds->select.hbond_list[ihb_top].scl = 1; - hbonds->select.hbond_list[ihb_top].ptr = nbr_pj; - } else if (jflag) { - hbonds->select.hbond_list[jhb_top].nbr = i; - hbonds->select.hbond_list[jhb_top].scl = -1; - hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; - } + if (iflag) { + hbonds->select.hbond_list[ihb_top].nbr = j; + hbonds->select.hbond_list[ihb_top].scl = 1; + hbonds->select.hbond_list[ihb_top].ptr = nbr_pj; + } else if (jflag) { + hbonds->select.hbond_list[jhb_top].nbr = i; + hbonds->select.hbond_list[jhb_top].scl = -1; + hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; + } - num_hbonds++; - } // if (iflag || jflag) + num_hbonds++; + } // if (iflag || jflag) - } - } - } + } + } + } - } // omp critical - } + } // omp critical + } - } // if (control->hbond > 0) + } // if (control->hbond > 0) - // Zero buffers for others to use as intended. + // Zero buffers for others to use as intended. #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (int i=0; irealloc.num_bonds = num_bonds; + workspace->realloc.num_hbonds = num_hbonds; + + Validate_ListsOMP(system, workspace, lists, data->step, + system->n, system->N, system->numH); + } - } // omp - - workspace->realloc.num_bonds = num_bonds; - workspace->realloc.num_hbonds = num_hbonds; - - Validate_ListsOMP( system, workspace, lists, data->step, - system->n, system->N, system->numH); - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEIFINDEX] += (endTimeBase-startTimeBase); -#endif -} - /* ---------------------------------------------------------------------- */ -void Compute_ForcesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ - // Init Forces - Init_Forces_noQEq_OMP( system, control, data, workspace, lists); + void Compute_ForcesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) + { + // Init Forces + Init_Forces_noQEq_OMP(system, control, data, workspace, lists); - // Bonded Interactions - Compute_Bonded_ForcesOMP( system, control, data, workspace, - lists, out_control ); + // Bonded Interactions + Compute_Bonded_ForcesOMP(system, control, data, workspace, + lists, out_control); - // Nonbonded Interactions - Compute_NonBonded_ForcesOMP( system, control, data, workspace, - lists, out_control); + // Nonbonded Interactions + Compute_NonBonded_ForcesOMP(system, control, data, workspace, + lists, out_control); - // Total Force - Compute_Total_ForceOMP( system, control, workspace, lists); + // Total Force + Compute_Total_ForceOMP(system, control, workspace, lists); + } } diff --git a/src/USER-OMP/reaxc_forces_omp.h b/src/USER-OMP/reaxc_forces_omp.h deleted file mode 100644 index e2065d8305..0000000000 --- a/src/USER-OMP/reaxc_forces_omp.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __FORCES_OMP_H_ -#define __FORCES_OMP_H_ - -#include "reaxc_types.h" -#include - -void Init_Force_FunctionsOMP( control_params* ); -void Compute_ForcesOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*); -#endif diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index b21b8b7cac..b2bd04d82a 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -26,220 +26,202 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_hydrogen_bonds_omp.h" +#include "reaxff_omp.h" #include "fix_omp.h" #include "pair_reaxc_omp.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_valence_angles.h" // To access Calculate_Theta() -#include "reaxc_valence_angles_omp.h" // To access Calculate_dCos_ThetaOMP() -#include "reaxc_vector.h" -#include +#include "reaxff_api.h" + #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- */ +namespace ReaxFF { + + /* ---------------------------------------------------------------------- */ -void Hydrogen_BondsOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /* out_control */) -{ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif + void Hydrogen_BondsOMP( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists) + { - const int nthreads = control->nthreads; + const int nthreads = control->nthreads; #if defined(_OPENMP) #pragma omp parallel default(shared) //LMP_DEFAULT_NONE #endif - { - int i, j, k, pi, pk; - int type_i, type_j, type_k; - int start_j, end_j, hb_start_j, hb_end_j; - int hblist[MAX_BONDS]; - int itr, top; - int num_hb_intrs = 0; - ivec rel_jk; - double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; - double e_hb, e_hb_thr = 0.0, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; - rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force; - hbond_parameters *hbp; - bond_order_data *bo_ij; - bond_data *pbond_ij; - far_neighbor_data *nbr_jk; - reax_list *bonds, *hbonds; - bond_data *bond_list; - hbond_data *hbond_list; + { + int i, j, k, pi, pk; + int type_i, type_j, type_k; + int start_j, end_j, hb_start_j, hb_end_j; + int hblist[MAX_BONDS]; + int itr, top; + int num_hb_intrs = 0; + ivec rel_jk; + double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; + double e_hb, e_hb_thr = 0.0, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; + rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; + rvec dvec_jk, force; + hbond_parameters *hbp; + bond_order_data *bo_ij; + bond_data *pbond_ij; + far_neighbor_data *nbr_jk; + reax_list *bonds, *hbonds; + bond_data *bond_list; + hbond_data *hbond_list; - // tally variables - double fi_tmp[3], fk_tmp[3], delij[3], delkj[3]; + // tally variables + double fi_tmp[3], fk_tmp[3], delij[3], delkj[3]; - bonds = (*lists) + BONDS; - bond_list = bonds->select.bond_list; - hbonds = (*lists) + HBONDS; - hbond_list = hbonds->select.hbond_list; + bonds = (*lists) + BONDS; + bond_list = bonds->select.bond_list; + hbonds = (*lists) + HBONDS; + hbond_list = hbonds->select.hbond_list; - int natoms = system->n; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - const int idelta = 1 + natoms/nthreads; - int ifrom = tid*idelta; - int ito = ((ifrom + idelta) > natoms) ? natoms : ifrom + idelta; + int natoms = system->n; + int tid = get_tid(); - long reductionOffset = (system->N * tid); + const int idelta = 1 + natoms/nthreads; + int ifrom = tid*idelta; + int ito = ((ifrom + idelta) > natoms) ? natoms : ifrom + idelta; - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + long reductionOffset = (system->N * tid); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); - /* loops below discover the Hydrogen bonds between i-j-k triplets. - here j is H atom and there has to be some bond between i and j. - Hydrogen bond is between j and k. - so in this function i->X, j->H, k->Z when we map - variables onto the ones in the handout.*/ - // for (j = 0; j < system->n; ++j) - for (j = ifrom; j < ito; ++j) { - /* j has to be of type H */ - if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { - /*set j's variables */ - type_j = system->my_atoms[j].type; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); - hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); - hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); - if (type_j < 0) continue; + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - top = 0; - for (pi = start_j; pi < end_j; ++pi) { - pbond_ij = &( bond_list[pi] ); - i = pbond_ij->nbr; - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - bo_ij = &(pbond_ij->bo_data); + /* loops below discover the Hydrogen bonds between i-j-k triplets. + here j is H atom and there has to be some bond between i and j. + Hydrogen bond is between j and k. + so in this function i->X, j->H, k->Z when we map + variables onto the ones in the handout.*/ + // for (j = 0; j < system->n; ++j) + for (j = ifrom; j < ito; ++j) { + /* j has to be of type H */ + if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { + /*set j's variables */ + type_j = system->my_atoms[j].type; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); + hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); + if (type_j < 0) continue; - if ( system->reax_param.sbp[type_i].p_hbond == 2 && - bo_ij->BO >= HB_THRESHOLD ) - hblist[top++] = pi; - } - - for (pk = hb_start_j; pk < hb_end_j; ++pk) { - /* set k's varibles */ - k = hbond_list[pk].nbr; - type_k = system->my_atoms[k].type; - if (type_k < 0) continue; - nbr_jk = hbond_list[pk].ptr; - r_jk = nbr_jk->d; - rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); - - for (itr = 0; itr < top; ++itr) { - pi = hblist[itr]; - pbond_ij = &( bonds->select.bond_list[pi] ); - i = pbond_ij->nbr; - - if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { - bo_ij = &(pbond_ij->bo_data); + top = 0; + for (pi = start_j; pi < end_j; ++pi) { + pbond_ij = &( bond_list[pi] ); + i = pbond_ij->nbr; type_i = system->my_atoms[i].type; if (type_i < 0) continue; - hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); - ++num_hb_intrs; + bo_ij = &(pbond_ij->bo_data); - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &theta, &cos_theta ); - /* the derivative of cos(theta) */ - Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &dcos_theta_di, &dcos_theta_dj, - &dcos_theta_dk ); + if ( system->reax_param.sbp[type_i].p_hbond == 2 && + bo_ij->BO >= HB_THRESHOLD ) + hblist[top++] = pi; + } - /* hydrogen bond energy*/ - sin_theta2 = sin( theta/2.0 ); - sin_xhz4 = SQR(sin_theta2); - sin_xhz4 *= sin_xhz4; - cos_xhz1 = ( 1.0 - cos_theta ); - exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); - exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + - r_jk / hbp->r0_hb - 2.0 ) ); + for (pk = hb_start_j; pk < hb_end_j; ++pk) { + /* set k's varibles */ + k = hbond_list[pk].nbr; + type_k = system->my_atoms[k].type; + if (type_k < 0) continue; + nbr_jk = hbond_list[pk].ptr; + r_jk = nbr_jk->d; + rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); - e_hb_thr += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; + for (itr = 0; itr < top; ++itr) { + pi = hblist[itr]; + pbond_ij = &( bonds->select.bond_list[pi] ); + i = pbond_ij->nbr; - CEhb1 = hbp->p_hb1 * hbp->p_hb2 * exp_hb2 * exp_hb3 * sin_xhz4; - CEhb2 = -hbp->p_hb1/2.0 * (1.0 - exp_hb2) * exp_hb3 * cos_xhz1; - CEhb3 = -hbp->p_hb3 * - (-hbp->r0_hb / SQR(r_jk) + 1.0 / hbp->r0_hb) * e_hb; + if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { + bo_ij = &(pbond_ij->bo_data); + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); + ++num_hb_intrs; - /* hydrogen bond forces */ - bo_ij->Cdbo += CEhb1; // dbo term + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &theta, &cos_theta ); + /* the derivative of cos(theta) */ + Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &dcos_theta_di, &dcos_theta_dj, + &dcos_theta_dk ); - if (control->virial == 0) { - // dcos terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk ); - // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk ); - } - else { - /* for pressure coupling, terms that are not related to bond order - derivatives are added directly into pressure vector/tensor */ - rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms - rvec_Add(workspace->forceReduction[reductionOffset+i], force ); + /* hydrogen bond energy*/ + sin_theta2 = sin( theta/2.0 ); + sin_xhz4 = SQR(sin_theta2); + sin_xhz4 *= sin_xhz4; + cos_xhz1 = ( 1.0 - cos_theta ); + exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); + exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + + r_jk / hbp->r0_hb - 2.0 ) ); + + e_hb_thr += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; + + CEhb1 = hbp->p_hb1 * hbp->p_hb2 * exp_hb2 * exp_hb3 * sin_xhz4; + CEhb2 = -hbp->p_hb1/2.0 * (1.0 - exp_hb2) * exp_hb3 * cos_xhz1; + CEhb3 = -hbp->p_hb3 * + (-hbp->r0_hb / SQR(r_jk) + 1.0 / hbp->r0_hb) * e_hb; + + /* hydrogen bond forces */ + bo_ij->Cdbo += CEhb1; // dbo term + + if (control->virial == 0) { + // dcos terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk ); + // dr terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk ); + } + else { + /* for pressure coupling, terms that are not related to bond order + derivatives are added directly into pressure vector/tensor */ + rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms + rvec_Add(workspace->forceReduction[reductionOffset+i], force ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); - ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); - rvec_Scale( force, +CEhb2, dcos_theta_dk ); - rvec_Add(workspace->forceReduction[reductionOffset+k], force ); - // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk ); + ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); + rvec_Scale( force, +CEhb2, dcos_theta_dk ); + rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + // dr terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk ); - rvec_Scale( force, CEhb3/r_jk, dvec_jk ); - rvec_Add(workspace->forceReduction[reductionOffset+k], force ); - } + rvec_Scale( force, CEhb3/r_jk, dvec_jk ); + rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + } - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - rvec_ScaledSum( delij, 1., system->my_atoms[j].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, - -1., system->my_atoms[k].x ); + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + rvec_ScaledSum( delij, 1., system->my_atoms[j].x, + -1., system->my_atoms[i].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, + -1., system->my_atoms[k].x ); - rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); - rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); - rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); + rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); + rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); + rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); - pair_reax_ptr->ev_tally3_thr_proxy(system->pair_ptr,i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj,thr); + pair_reax_ptr->ev_tally3_thr_proxy(system->pair_ptr,i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj,thr); + } + } } } + } } - - } - } #if defined(_OPENMP) #pragma omp critical #endif - { - data->my_en.e_hb += e_hb_thr; + { + data->my_en.e_hb += e_hb_thr; + } + } } } - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEHBONDSINDEX] += (endTimeBase-startTimeBase); -#endif -} diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.h b/src/USER-OMP/reaxc_hydrogen_bonds_omp.h deleted file mode 100644 index 8c3d04448a..0000000000 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __HBONDS_OMP_H_ -#define __HBONDS_OMP_H_ - -#include "reaxc_types.h" - -void Hydrogen_BondsOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index d20ab954fe..94458d2691 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -26,114 +26,97 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_init_md_omp.h" +#include "reaxff_omp.h" -#include "reaxc_defs.h" -#include "reaxc_forces.h" -#include "reaxc_forces_omp.h" -#include "reaxc_io_tools.h" -#include "reaxc_list.h" -#include "reaxc_lookup.h" -#include "reaxc_tool_box.h" #include "error.h" -#include "fmt/format.h" + +#include "reaxff_api.h" #include -// Functions defined in reaxc_init_md.cpp -extern void Init_System(reax_system*, control_params*); -extern void Init_Simulation_Data(control_params*, simulation_data*); -extern void Init_Workspace(reax_system*, control_params*, storage*); - /* ---------------------------------------------------------------------- */ -int Init_ListsOMP(reax_system *system, control_params *control, - reax_list **lists) -{ - int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; - int *hb_top, *bond_top; +namespace ReaxFF { + int Init_ListsOMP(reax_system *system, control_params *control, + reax_list **lists) + { + int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; + int *hb_top, *bond_top; - int mincap = system->mincap; - double safezone = system->safezone; - double saferzone = system->saferzone; - LAMMPS_NS::Error *error = system->error_ptr; + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; + auto error = system->error_ptr; - bond_top = (int*) calloc(system->total_cap, sizeof(int)); - hb_top = (int*) calloc(system->local_cap, sizeof(int)); - Estimate_Storages(system, control, lists, - &Htop, hb_top, bond_top, &num_3body); + bond_top = (int*) calloc(system->total_cap, sizeof(int)); + hb_top = (int*) calloc(system->local_cap, sizeof(int)); + Estimate_Storages(system, control, lists, + &Htop, hb_top, bond_top, &num_3body); - if (control->hbond_cut > 0) { - /* init H indexes */ - total_hbonds = 0; - for (i = 0; i < system->n; ++i) { - system->my_atoms[i].num_hbonds = hb_top[i]; - total_hbonds += hb_top[i]; + if (control->hbond_cut > 0) { + /* init H indexes */ + total_hbonds = 0; + for (i = 0; i < system->n; ++i) { + system->my_atoms[i].num_hbonds = hb_top[i]; + total_hbonds += hb_top[i]; + } + total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); + + if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, + *lists+HBONDS)) { + error->one(FLERR, "Not enough space for hbonds list. Terminating!"); + } } - total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); - if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS)) { - error->one(FLERR, "Not enough space for hbonds list. Terminating!"); + total_bonds = 0; + for (i = 0; i < system->N; ++i) { + system->my_atoms[i].num_bonds = bond_top[i]; + total_bonds += bond_top[i]; } + bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); + + if (!Make_List(system->total_cap, bond_cap, TYP_BOND, + *lists+BONDS)) { + error->one(FLERR, "Not enough space for bonds list. Terminating!\n"); + } + + int nthreads = control->nthreads; + reax_list *bonds = (*lists)+BONDS; + + for (i = 0; i < bonds->num_intrs; ++i) + bonds->select.bond_list[i].bo_data.CdboReduction = + (double*) smalloc(error, sizeof(double)*nthreads, "CdboReduction"); + + /* 3bodies list */ + cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); + if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, + *lists+THREE_BODIES)) { + + error->one(FLERR, "Problem in initializing angles list. Terminating!"); + } + + free(hb_top); + free(bond_top); + + return SUCCESS; } - total_bonds = 0; - for (i = 0; i < system->N; ++i) { - system->my_atoms[i].num_bonds = bond_top[i]; - total_bonds += bond_top[i]; - } - bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); - - if (!Make_List(system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS)) { - error->one(FLERR, "Not enough space for bonds list. Terminating!\n"); - } - - int nthreads = control->nthreads; - reax_list *bonds = (*lists)+BONDS; - - for (i = 0; i < bonds->num_intrs; ++i) - bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(error, sizeof(double)*nthreads, "CdboReduction"); - - /* 3bodies list */ - cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); - if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES)) { - - error->one(FLERR, "Problem in initializing angles list. Terminating!"); - } - - free(hb_top); - free(bond_top); - - return SUCCESS; -} - /* ---------------------------------------------------------------------- */ // The only difference with the MPI-only function is calls to Init_ListsOMP and Init_Force_FunctionsOMP(). -void InitializeOMP(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm world) -{ - char msg[MAX_STR]; - LAMMPS_NS::Error *error = system->error_ptr; + void InitializeOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + MPI_Comm world) + { + Init_System(system,control); + Init_Simulation_Data(data); + Init_Workspace(system,control,workspace); + Init_ListsOMP(system,control,lists); - Init_System(system,control); - Init_Simulation_Data(control,data); - Init_Workspace(system,control,workspace); - Init_ListsOMP(system,control,lists); + Init_Output_Files(system,control,out_control,world); - Init_Output_Files(system,control,out_control,world); - - if (control->tabulate) - if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Could not create lookup " - "table. Terminating.",msg)); - - Init_Force_FunctionsOMP(control); + if (control->tabulate) + Init_Lookup_Tables(system,control,workspace,world); + } } - diff --git a/src/USER-OMP/reaxc_init_md_omp.h b/src/USER-OMP/reaxc_init_md_omp.h deleted file mode 100644 index 422e2aa452..0000000000 --- a/src/USER-OMP/reaxc_init_md_omp.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __INIT_MD_OMP_H_ -#define __INIT_MD_OMP_H_ - -#include "reaxc_types.h" - -#include - -void InitializeOMP( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*, MPI_Comm ); -#endif diff --git a/src/USER-OMP/reaxc_multi_body_omp.cpp b/src/USER-OMP/reaxc_multi_body_omp.cpp index e2af2d96ad..2ec73e738b 100644 --- a/src/USER-OMP/reaxc_multi_body_omp.cpp +++ b/src/USER-OMP/reaxc_multi_body_omp.cpp @@ -26,266 +26,248 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_multi_body_omp.h" +#include "reaxff_omp.h" #include "fix_omp.h" #include "pair_reaxc_omp.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" +#include "reaxff_api.h" #include #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -void Atom_EnergyOMP( reax_system *system, control_params * /* control */, - simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /* out_control */) -{ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif +namespace ReaxFF { + void Atom_EnergyOMP(reax_system *system, simulation_data *data, + storage *workspace, reax_list **lists) + { + /* Initialize parameters */ + const double p_lp3 = system->reax_param.gp.l[5]; + const double p_ovun3 = system->reax_param.gp.l[32]; + const double p_ovun4 = system->reax_param.gp.l[31]; + const double p_ovun6 = system->reax_param.gp.l[6]; + const double p_ovun7 = system->reax_param.gp.l[8]; + const double p_ovun8 = system->reax_param.gp.l[9]; - /* Initialize parameters */ - const double p_lp3 = system->reax_param.gp.l[5]; - const double p_ovun3 = system->reax_param.gp.l[32]; - const double p_ovun4 = system->reax_param.gp.l[31]; - const double p_ovun6 = system->reax_param.gp.l[6]; - const double p_ovun7 = system->reax_param.gp.l[8]; - const double p_ovun8 = system->reax_param.gp.l[9]; + reax_list *bonds = (*lists) + BONDS; - reax_list *bonds = (*lists) + BONDS; - - double total_Elp = 0.0; - double total_Eun = 0.0; - double total_Eov = 0.0; + double total_Elp = 0.0; + double total_Eun = 0.0; + double total_Eov = 0.0; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+:total_Elp, total_Eun, total_Eov) #endif -{ - int i, j, pj, type_i, type_j; - double Delta_lpcorr, dfvl; - double e_lp, expvd2, inv_expvd2, dElp, CElp, DlpVi; - double e_lph, Di, vov3, deahu2dbo, deahu2dsbo; - double e_ov, CEover1, CEover2, CEover3, CEover4; - double exp_ovun1, exp_ovun2, sum_ovun1, sum_ovun2; - double exp_ovun2n, exp_ovun6, exp_ovun8; - double inv_exp_ovun1, inv_exp_ovun2, inv_exp_ovun2n, inv_exp_ovun8; - double e_un, CEunder1, CEunder2, CEunder3, CEunder4; - double eng_tmp; - double p_lp2, p_ovun2, p_ovun5; - int numbonds; + { + int i, j, pj, type_i, type_j; + double Delta_lpcorr, dfvl; + double e_lp, expvd2, inv_expvd2, dElp, CElp, DlpVi; + double e_lph, Di, vov3, deahu2dbo, deahu2dsbo; + double e_ov, CEover1, CEover2, CEover3, CEover4; + double exp_ovun1, exp_ovun2, sum_ovun1, sum_ovun2; + double exp_ovun2n, exp_ovun6, exp_ovun8; + double inv_exp_ovun1, inv_exp_ovun2, inv_exp_ovun2n, inv_exp_ovun8; + double e_un, CEunder1, CEunder2, CEunder3, CEunder4; + double eng_tmp; + double p_lp2, p_ovun2, p_ovun5; + int numbonds; - single_body_parameters *sbp_i; - two_body_parameters *twbp; - bond_data *pbond; - bond_order_data *bo_ij; + single_body_parameters *sbp_i; + two_body_parameters *twbp; + bond_data *pbond; + bond_order_data *bo_ij; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif + int tid = get_tid(); - long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for ( i = 0; i < system->n; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + for (i = 0; i < system->n; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[ type_i ]); - /* lone-pair Energy */ - p_lp2 = sbp_i->p_lp2; - expvd2 = exp( -75 * workspace->Delta_lp[i] ); - inv_expvd2 = 1. / (1. + expvd2 ); + /* lone-pair Energy */ + p_lp2 = sbp_i->p_lp2; + expvd2 = exp(-75 * workspace->Delta_lp[i]); + inv_expvd2 = 1. / (1. + expvd2); - numbonds = 0; - e_lp = 0.0; - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) - numbonds ++; + numbonds = 0; + e_lp = 0.0; + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) + numbonds ++; - /* calculate the energy */ - if (numbonds > 0) - total_Elp += e_lp = - p_lp2 * workspace->Delta_lp[i] * inv_expvd2; + /* calculate the energy */ + if (numbonds > 0) + total_Elp += e_lp = + p_lp2 * workspace->Delta_lp[i] * inv_expvd2; - dElp = p_lp2 * inv_expvd2 + - 75 * p_lp2 * workspace->Delta_lp[i] * expvd2 * SQR(inv_expvd2); - CElp = dElp * workspace->dDelta_lp[i]; + dElp = p_lp2 * inv_expvd2 + + 75 * p_lp2 * workspace->Delta_lp[i] * expvd2 * SQR(inv_expvd2); + CElp = dElp * workspace->dDelta_lp[i]; - if (numbonds > 0) workspace->CdDelta[i] += CElp; // lp - 1st term + if (numbonds > 0) workspace->CdDelta[i] += CElp; // lp - 1st term - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, - e_lp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + e_lp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - /* correction for C2 */ - if (p_lp3 > 0.001 && !strcmp(system->reax_param.sbp[type_i].name, "C")) - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - j = bonds->select.bond_list[pj].nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; + /* correction for C2 */ + if (p_lp3 > 0.001 && !strcmp(system->reax_param.sbp[type_i].name, "C")) + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; - if (!strcmp( system->reax_param.sbp[type_j].name, "C" )) { - twbp = &( system->reax_param.tbp[type_i][type_j]); - bo_ij = &( bonds->select.bond_list[pj].bo_data ); - Di = workspace->Delta[i]; - vov3 = bo_ij->BO - Di - 0.040*pow(Di, 4.); + if (!strcmp(system->reax_param.sbp[type_j].name, "C")) { + twbp = &(system->reax_param.tbp[type_i][type_j]); + bo_ij = &(bonds->select.bond_list[pj].bo_data); + Di = workspace->Delta[i]; + vov3 = bo_ij->BO - Di - 0.040*pow(Di, 4.); - if (vov3 > 3.) { - total_Elp += e_lph = p_lp3 * SQR(vov3-3.0); + if (vov3 > 3.) { + total_Elp += e_lph = p_lp3 * SQR(vov3-3.0); - deahu2dbo = 2.*p_lp3*(vov3 - 3.); - deahu2dsbo = 2.*p_lp3*(vov3 - 3.)*(-1. - 0.16*pow(Di, 3.)); + deahu2dbo = 2.*p_lp3*(vov3 - 3.); + deahu2dsbo = 2.*p_lp3*(vov3 - 3.)*(-1. - 0.16*pow(Di, 3.)); - bo_ij->Cdbo += deahu2dbo; - workspace->CdDelta[i] += deahu2dsbo; + bo_ij->Cdbo += deahu2dbo; + workspace->CdDelta[i] += deahu2dsbo; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, - e_lph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, + e_lph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + } + } } - } } - } #if defined(_OPENMP) #pragma omp barrier #pragma omp for schedule(guided) #endif - for (i = 0; i < system->n; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + for (i = 0; i < system->n; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[ type_i ]); - /* over-coordination energy */ - if (sbp_i->mass > 21.0) - dfvl = 0.0; - else dfvl = 1.0; // only for 1st-row elements + /* over-coordination energy */ + if (sbp_i->mass > 21.0) + dfvl = 0.0; + else dfvl = 1.0; // only for 1st-row elements - p_ovun2 = sbp_i->p_ovun2; - sum_ovun1 = sum_ovun2 = 0; - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - j = bonds->select.bond_list[pj].nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - bo_ij = &(bonds->select.bond_list[pj].bo_data); - twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); + p_ovun2 = sbp_i->p_ovun2; + sum_ovun1 = sum_ovun2 = 0; + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + bo_ij = &(bonds->select.bond_list[pj].bo_data); + twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); - sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; - sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; + sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* + (bo_ij->BO_pi + bo_ij->BO_pi2); + } + + exp_ovun1 = p_ovun3 * exp(p_ovun4 * sum_ovun2); + inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); + Delta_lpcorr = workspace->Delta[i] - + (dfvl * workspace->Delta_lp_temp[i]) * inv_exp_ovun1; + + exp_ovun2 = exp(p_ovun2 * Delta_lpcorr); + inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); + + DlpVi = 1.0 / (Delta_lpcorr + sbp_i->valency + 1e-8); + CEover1 = Delta_lpcorr * DlpVi * inv_exp_ovun2; + + total_Eov += e_ov = sum_ovun1 * CEover1; + + CEover2 = sum_ovun1 * DlpVi * inv_exp_ovun2 * + (1.0 - Delta_lpcorr * (DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2)); + + CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1); + + CEover4 = CEover2 * (dfvl * workspace->Delta_lp_temp[i]) * + p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); + + + /* under-coordination potential */ + p_ovun2 = sbp_i->p_ovun2; + p_ovun5 = sbp_i->p_ovun5; + + exp_ovun2n = 1.0 / exp_ovun2; + exp_ovun6 = exp(p_ovun6 * Delta_lpcorr); + exp_ovun8 = p_ovun7 * exp(p_ovun8 * sum_ovun2); + inv_exp_ovun2n = 1.0 / (1.0 + exp_ovun2n); + inv_exp_ovun8 = 1.0 / (1.0 + exp_ovun8); + + numbonds = 0; + e_un = 0.0; + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) + numbonds ++; + + if (numbonds > 0) total_Eun += e_un = + -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; + + CEunder1 = inv_exp_ovun2n * + (p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + + p_ovun2 * e_un * exp_ovun2n); + CEunder2 = -e_un * p_ovun8 * exp_ovun8 * inv_exp_ovun8; + CEunder3 = CEunder1 * (1.0 - dfvl*workspace->dDelta_lp[i]*inv_exp_ovun1); + CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * + p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) { + eng_tmp = e_ov; + if (numbonds > 0) eng_tmp+= e_un; + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + } + + /* forces */ + workspace->CdDelta[i] += CEover3; // OvCoor - 2nd term + if (numbonds > 0) workspace->CdDelta[i] += CEunder3; // UnCoor - 1st term + + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + pbond = &(bonds->select.bond_list[pj]); + j = pbond->nbr; + bo_ij = &(pbond->bo_data); + twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + [system->my_atoms[pbond->nbr].type]); + + bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s; // OvCoor-1st + workspace->CdDeltaReduction[reductionOffset+j] += + CEover4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // OvCoor-3a + + bo_ij->Cdbopi += CEover4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b + bo_ij->Cdbopi2 += CEover4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b + + workspace->CdDeltaReduction[reductionOffset+j] += + CEunder4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // UnCoor - 2a + + bo_ij->Cdbopi += CEunder4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b + bo_ij->Cdbopi2 += CEunder4 * + (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b + } + } } - exp_ovun1 = p_ovun3 * exp( p_ovun4 * sum_ovun2 ); - inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); - Delta_lpcorr = workspace->Delta[i] - - (dfvl * workspace->Delta_lp_temp[i]) * inv_exp_ovun1; - - exp_ovun2 = exp( p_ovun2 * Delta_lpcorr ); - inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); - - DlpVi = 1.0 / (Delta_lpcorr + sbp_i->valency + 1e-8); - CEover1 = Delta_lpcorr * DlpVi * inv_exp_ovun2; - - total_Eov += e_ov = sum_ovun1 * CEover1; - - CEover2 = sum_ovun1 * DlpVi * inv_exp_ovun2 * - (1.0 - Delta_lpcorr * ( DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2 )); - - CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1 ); - - CEover4 = CEover2 * (dfvl * workspace->Delta_lp_temp[i]) * - p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); - - - /* under-coordination potential */ - p_ovun2 = sbp_i->p_ovun2; - p_ovun5 = sbp_i->p_ovun5; - - exp_ovun2n = 1.0 / exp_ovun2; - exp_ovun6 = exp( p_ovun6 * Delta_lpcorr ); - exp_ovun8 = p_ovun7 * exp(p_ovun8 * sum_ovun2); - inv_exp_ovun2n = 1.0 / (1.0 + exp_ovun2n); - inv_exp_ovun8 = 1.0 / (1.0 + exp_ovun8); - - numbonds = 0; - e_un = 0.0; - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) - numbonds ++; - - if (numbonds > 0) total_Eun += e_un = - -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; - - CEunder1 = inv_exp_ovun2n * - ( p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + - p_ovun2 * e_un * exp_ovun2n ); - CEunder2 = -e_un * p_ovun8 * exp_ovun8 * inv_exp_ovun8; - CEunder3 = CEunder1 * (1.0 - dfvl*workspace->dDelta_lp[i]*inv_exp_ovun1); - CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * - p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; - - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) { - eng_tmp = e_ov; - if (numbonds > 0) eng_tmp+= e_un; - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, - eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - } - - /* forces */ - workspace->CdDelta[i] += CEover3; // OvCoor - 2nd term - if (numbonds > 0) workspace->CdDelta[i] += CEunder3; // UnCoor - 1st term - - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - pbond = &(bonds->select.bond_list[pj]); - j = pbond->nbr; - bo_ij = &(pbond->bo_data); - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] - [system->my_atoms[pbond->nbr].type]); - - bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s; // OvCoor-1st - workspace->CdDeltaReduction[reductionOffset+j] += - CEover4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // OvCoor-3a - - bo_ij->Cdbopi += CEover4 * - (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b - bo_ij->Cdbopi2 += CEover4 * - (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b - - workspace->CdDeltaReduction[reductionOffset+j] += - CEunder4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // UnCoor - 2a - - bo_ij->Cdbopi += CEunder4 * - (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b - bo_ij->Cdbopi2 += CEunder4 * - (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b - } + data->my_en.e_lp += total_Elp; + data->my_en.e_ov += total_Eov; + data->my_en.e_un += total_Eun; } - } - - data->my_en.e_lp += total_Elp; - data->my_en.e_ov += total_Eov; - data->my_en.e_un += total_Eun; - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEATOMENERGYINDEX] += (endTimeBase-startTimeBase); -#endif } diff --git a/src/USER-OMP/reaxc_multi_body_omp.h b/src/USER-OMP/reaxc_multi_body_omp.h deleted file mode 100644 index 772aafbb31..0000000000 --- a/src/USER-OMP/reaxc_multi_body_omp.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __MULTI_BODY_OMP_H_ -#define __MULTI_BODY_OMP_H_ - -#include "reaxc_types.h" - -void Atom_EnergyOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index f4a4e988bc..496e5476b0 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -26,357 +26,342 @@ . ----------------------------------------------------------------------*/ +#include "reaxff_omp.h" + #include "pair_reaxc_omp.h" - -#include "reaxc_types.h" -#include "reaxc_nonbonded.h" -#include "reaxc_nonbonded_omp.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" - -#include "reaxc_defs.h" +#include "reaxff_api.h" #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /* out_control */ ) -{ - int natoms = system->n; - reax_list *far_nbrs = (*lists) + FAR_NBRS; - double p_vdW1 = system->reax_param.gp.l[28]; - double p_vdW1i = 1.0 / p_vdW1; - double total_EvdW = 0.; - double total_Eele = 0.; +namespace ReaxFF { + void vdW_Coulomb_Energy_OMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int natoms = system->n; + reax_list *far_nbrs = (*lists) + FAR_NBRS; + double p_vdW1 = system->reax_param.gp.l[28]; + double p_vdW1i = 1.0 / p_vdW1; + double total_EvdW = 0.; + double total_Eele = 0.; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+: total_EvdW, total_Eele) #endif - { -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - int i, j, pj; - int start_i, end_i, orig_i, orig_j, flag; - double powr_vdW1, powgi_vdW1; - double tmp, r_ij, fn13, exp1, exp2; - double Tap, dTap, dfn13, CEvd, CEclmb, de_core; - double dr3gamij_1, dr3gamij_3; - double e_ele, e_vdW, e_core; - const double SMALL = 0.0001; - double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp; - two_body_parameters *twbp; - far_neighbor_data *nbr_pj; + { + int tid = get_tid(); + int i, j, pj; + int start_i, end_i, orig_i, orig_j, flag; + double powr_vdW1, powgi_vdW1; + double tmp, r_ij, fn13, exp1, exp2; + double Tap, dTap, dfn13, CEvd, CEclmb, de_core; + double dr3gamij_1, dr3gamij_3; + double e_ele, e_vdW, e_core; + const double SMALL = 0.0001; + double e_lg, de_lg, r_ij5, r_ij6, re6; + rvec temp; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; - // Tallying variables: - double pe_vdw, f_tmp, delij[3]; + // Tallying variables: + double pe_vdw, f_tmp, delij[3]; - long reductionOffset = (system->N * tid); + long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - e_core = 0; - e_vdW = 0; - e_lg = 0; - de_lg = 0.0; + e_core = 0; + e_vdW = 0; + e_lg = 0; + de_lg = 0.0; #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < natoms; ++i) { - if (system->my_atoms[i].type < 0) continue; - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); - orig_i = system->my_atoms[i].orig_id; + for (i = 0; i < natoms; ++i) { + if (system->my_atoms[i].type < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + orig_i = system->my_atoms[i].orig_id; - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); - j = nbr_pj->nbr; - orig_j = system->my_atoms[j].orig_id; + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + orig_j = system->my_atoms[j].orig_id; - flag = 0; - if (nbr_pj->d <= control->nonb_cut) { - if (j < natoms) flag = 1; - else if (orig_i < orig_j) flag = 1; - else if (orig_i == orig_j) { - if (nbr_pj->dvec[2] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[2]) < SMALL) { - if (nbr_pj->dvec[1] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) - flag = 1; + flag = 0; + if (nbr_pj->d <= control->nonb_cut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } } - } - } - if (flag) { + if (flag) { - r_ij = nbr_pj->d; - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] - [ system->my_atoms[j].type ]); + r_ij = nbr_pj->d; + twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + [ system->my_atoms[j].type ]); - /* Calculate Taper and its derivative */ - // Tap = nbr_pj->Tap; -- precomputed during compte_H - Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; - Tap = Tap * r_ij + workspace->Tap[5]; - Tap = Tap * r_ij + workspace->Tap[4]; - Tap = Tap * r_ij + workspace->Tap[3]; - Tap = Tap * r_ij + workspace->Tap[2]; - Tap = Tap * r_ij + workspace->Tap[1]; - Tap = Tap * r_ij + workspace->Tap[0]; + /* Calculate Taper and its derivative */ + // Tap = nbr_pj->Tap; -- precomputed during compte_H + Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; + Tap = Tap * r_ij + workspace->Tap[5]; + Tap = Tap * r_ij + workspace->Tap[4]; + Tap = Tap * r_ij + workspace->Tap[3]; + Tap = Tap * r_ij + workspace->Tap[2]; + Tap = Tap * r_ij + workspace->Tap[1]; + Tap = Tap * r_ij + workspace->Tap[0]; - dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; - dTap = dTap * r_ij + 5*workspace->Tap[5]; - dTap = dTap * r_ij + 4*workspace->Tap[4]; - dTap = dTap * r_ij + 3*workspace->Tap[3]; - dTap = dTap * r_ij + 2*workspace->Tap[2]; - dTap += workspace->Tap[1]/r_ij; + dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; + dTap = dTap * r_ij + 5*workspace->Tap[5]; + dTap = dTap * r_ij + 4*workspace->Tap[4]; + dTap = dTap * r_ij + 3*workspace->Tap[3]; + dTap = dTap * r_ij + 2*workspace->Tap[2]; + dTap += workspace->Tap[1]/r_ij; - /*vdWaals Calculations*/ - if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) - { // shielding - powr_vdW1 = pow(r_ij, p_vdW1); - powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); + /*vdWaals Calculations*/ + if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) + { // shielding + powr_vdW1 = pow(r_ij, p_vdW1); + powgi_vdW1 = pow(1.0 / twbp->gamma_w, p_vdW1); - fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); - exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); + fn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i); + exp1 = exp(twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); - e_vdW = twbp->D * (exp1 - 2.0 * exp2); - total_EvdW += Tap * e_vdW; + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + total_EvdW += Tap * e_vdW; - dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * - pow(r_ij, p_vdW1 - 2.0); + dfn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * + pow(r_ij, p_vdW1 - 2.0); - CEvd = dTap * e_vdW - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; - } - else { // no shielding - exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; + } + else { // no shielding + exp1 = exp(twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); - e_vdW = twbp->D * (exp1 - 2.0 * exp2); - total_EvdW += Tap * e_vdW; + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + total_EvdW += Tap * e_vdW; - CEvd = dTap * e_vdW - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; - } - - if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) - { // innner wall - e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); - total_EvdW += Tap * e_core; - - de_core = -(twbp->acore/twbp->rcore) * e_core; - CEvd += dTap * e_core + Tap * de_core / r_ij; - - // lg correction, only if lgvdw is yes - if (control->lgflag) { - r_ij5 = pow( r_ij, 5.0 ); - r_ij6 = pow( r_ij, 6.0 ); - re6 = pow( twbp->lgre, 6.0 ); - - e_lg = -(twbp->lgcij/( r_ij6 + re6 )); - total_EvdW += Tap * e_lg; - - de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; - CEvd += dTap * e_lg + Tap * de_lg / r_ij; + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; } + if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) + { // innner wall + e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); + total_EvdW += Tap * e_core; + + de_core = -(twbp->acore/twbp->rcore) * e_core; + CEvd += dTap * e_core + Tap * de_core / r_ij; + + // lg correction, only if lgvdw is yes + if (control->lgflag) { + r_ij5 = pow(r_ij, 5.0); + r_ij6 = pow(r_ij, 6.0); + re6 = pow(twbp->lgre, 6.0); + + e_lg = -(twbp->lgcij/(r_ij6 + re6)); + total_EvdW += Tap * e_lg; + + de_lg = -6.0 * e_lg * r_ij5 / (r_ij6 + re6) ; + CEvd += dTap * e_lg + Tap * de_lg / r_ij; + } + + } + + /*Coulomb Calculations*/ + dr3gamij_1 = (r_ij * r_ij * r_ij + twbp->gamma); + dr3gamij_3 = pow(dr3gamij_1 , 0.33333333333333); + + tmp = Tap / dr3gamij_3; + total_Eele += e_ele = + C_ele * system->my_atoms[i].q * system->my_atoms[j].q * tmp; + + CEclmb = C_ele * system->my_atoms[i].q * system->my_atoms[j].q * + (dTap - Tap * r_ij / dr3gamij_1) / dr3gamij_3; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + pe_vdw = Tap * (e_vdW + e_core + e_lg); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + f_tmp = -(CEvd + CEclmb); + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, + 1, pe_vdw, e_ele, f_tmp, + delij[0], delij[1], delij[2], thr); + } + + if (control->virial == 0) { + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], + +(CEvd + CEclmb), nbr_pj->dvec); + } else { /* NPT, iNPT or sNPT */ + /* for pressure coupling, terms not related to bond order + derivatives are added directly into pressure vector/tensor */ + + rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); + rvec_ScaledAdd(workspace->f[reductionOffset+i], -1., temp); + rvec_Add(workspace->forceReduction[reductionOffset+j], temp); + } } - - /*Coulomb Calculations*/ - dr3gamij_1 = ( r_ij * r_ij * r_ij + twbp->gamma ); - dr3gamij_3 = pow( dr3gamij_1 , 0.33333333333333 ); - - tmp = Tap / dr3gamij_3; - total_Eele += e_ele = - C_ele * system->my_atoms[i].q * system->my_atoms[j].q * tmp; - - CEclmb = C_ele * system->my_atoms[i].q * system->my_atoms[j].q * - ( dTap - Tap * r_ij / dr3gamij_1 ) / dr3gamij_3; - - /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { - pe_vdw = Tap * (e_vdW + e_core + e_lg); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, - 1, pe_vdw, e_ele, f_tmp, - delij[0], delij[1], delij[2], thr); - } - - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+j], - +(CEvd + CEclmb), nbr_pj->dvec ); - } else { /* NPT, iNPT or sNPT */ - /* for pressure coupling, terms not related to bond order - derivatives are added directly into pressure vector/tensor */ - - rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); - rvec_ScaledAdd( workspace->f[reductionOffset+i], -1., temp ); - rvec_Add( workspace->forceReduction[reductionOffset+j], temp); - } } } - } - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, thr); - } // parallel region + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // parallel region - data->my_en.e_vdW = total_EvdW; - data->my_en.e_ele = total_Eele; + data->my_en.e_vdW = total_EvdW; + data->my_en.e_ele = total_Eele; - Compute_Polarization_Energy( system, data ); -} + Compute_Polarization_Energy(system, data); + } /* ---------------------------------------------------------------------- */ -void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, - output_controls * /* out_control */) { + void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *system,control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) { - double SMALL = 0.0001; - int natoms = system->n; - reax_list *far_nbrs = (*lists) + FAR_NBRS; - double total_EvdW = 0.; - double total_Eele = 0.; + double SMALL = 0.0001; + int natoms = system->n; + reax_list *far_nbrs = (*lists) + FAR_NBRS; + double total_EvdW = 0.; + double total_Eele = 0.; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+:total_EvdW, total_Eele) #endif - { - int i, j, pj, r; - int type_i, type_j, tmin, tmax; - int start_i, end_i, orig_i, orig_j, flag; - double r_ij, base, dif; - double e_vdW, e_ele; - double CEvd, CEclmb; - double f_tmp, delij[3]; - rvec temp; - far_neighbor_data *nbr_pj; - LR_lookup_table *t; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); - #else - int tid = 0; -#endif - long froffset = (system->N * tid); - LR_lookup_table ** & LR = system->LR; + { + int i, j, pj, r; + int type_i, type_j, tmin, tmax; + int start_i, end_i, orig_i, orig_j, flag; + double r_ij, base, dif; + double e_vdW, e_ele; + double CEvd, CEclmb; + double f_tmp, delij[3]; + rvec temp; + far_neighbor_data *nbr_pj; + LR_lookup_table *t; - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + int tid = get_tid(); + long froffset = (system->N * tid); + LR_lookup_table ** & LR = system->LR; + + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) #pragma omp for schedule(guided) #endif - for (i = 0; i < natoms; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - start_i = Start_Index(i,far_nbrs); - end_i = End_Index(i,far_nbrs); - orig_i = system->my_atoms[i].orig_id; + for (i = 0; i < natoms; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + start_i = Start_Index(i,far_nbrs); + end_i = End_Index(i,far_nbrs); + orig_i = system->my_atoms[i].orig_id; - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); - j = nbr_pj->nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - orig_j = system->my_atoms[j].orig_id; + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + orig_j = system->my_atoms[j].orig_id; - flag = 0; - if (nbr_pj->d <= control->nonb_cut) { - if (j < natoms) flag = 1; - else if (orig_i < orig_j) flag = 1; - else if (orig_i == orig_j) { - if (nbr_pj->dvec[2] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[2]) < SMALL) { - if (nbr_pj->dvec[1] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) - flag = 1; + flag = 0; + if (nbr_pj->d <= control->nonb_cut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + + } + + if (flag) { + + r_ij = nbr_pj->d; + tmin = MIN(type_i, type_j); + tmax = MAX(type_i, type_j); + t = &(LR[tmin][tmax]); + + /* Cubic Spline Interpolation */ + r = (int)(r_ij * t->inv_dx); + if (r == 0) ++r; + base = (double)(r+1) * t->dx; + dif = r_ij - base; + + e_vdW = ((t->vdW[r].d*dif + t->vdW[r].c)*dif + t->vdW[r].b)*dif + + t->vdW[r].a; + + e_ele = ((t->ele[r].d*dif + t->ele[r].c)*dif + t->ele[r].b)*dif + + t->ele[r].a; + e_ele *= system->my_atoms[i].q * system->my_atoms[j].q; + + total_EvdW += e_vdW; + total_Eele += e_ele; + + CEvd = ((t->CEvd[r].d*dif + t->CEvd[r].c)*dif + t->CEvd[r].b)*dif + + t->CEvd[r].a; + + CEclmb = ((t->CEclmb[r].d*dif+t->CEclmb[r].c)*dif+t->CEclmb[r].b)*dif + + t->CEclmb[r].a; + CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + f_tmp = -(CEvd + CEclmb); + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, e_vdW, e_ele, + f_tmp, delij[0], delij[1], delij[2], thr); + } + + if (control->virial == 0) { + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->forceReduction[froffset+j], + +(CEvd + CEclmb), nbr_pj->dvec); + } else { // NPT, iNPT or sNPT + /* for pressure coupling, terms not related to bond order derivatives + are added directly into pressure vector/tensor */ + rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); + + rvec_ScaledAdd(workspace->f[i], -1., temp); + rvec_Add(workspace->forceReduction[froffset+j], temp); + } } } - } - if (flag) { + pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, + system->pair_ptr->vflag_either, thr); + } // end omp parallel - r_ij = nbr_pj->d; - tmin = MIN( type_i, type_j ); - tmax = MAX( type_i, type_j ); - t = &( LR[tmin][tmax] ); + data->my_en.e_vdW = total_EvdW; + data->my_en.e_ele = total_Eele; - /* Cubic Spline Interpolation */ - r = (int)(r_ij * t->inv_dx); - if (r == 0) ++r; - base = (double)(r+1) * t->dx; - dif = r_ij - base; - - e_vdW = ((t->vdW[r].d*dif + t->vdW[r].c)*dif + t->vdW[r].b)*dif + - t->vdW[r].a; - - e_ele = ((t->ele[r].d*dif + t->ele[r].c)*dif + t->ele[r].b)*dif + - t->ele[r].a; - e_ele *= system->my_atoms[i].q * system->my_atoms[j].q; - - total_EvdW += e_vdW; - total_Eele += e_ele; - - CEvd = ((t->CEvd[r].d*dif + t->CEvd[r].c)*dif + t->CEvd[r].b)*dif + - t->CEvd[r].a; - - CEclmb = ((t->CEclmb[r].d*dif+t->CEclmb[r].c)*dif+t->CEclmb[r].b)*dif + - t->CEclmb[r].a; - CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; - - /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, e_vdW, e_ele, - f_tmp, delij[0], delij[1], delij[2], thr); - } - - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->forceReduction[froffset+j], - +(CEvd + CEclmb), nbr_pj->dvec ); - } else { // NPT, iNPT or sNPT - /* for pressure coupling, terms not related to bond order derivatives - are added directly into pressure vector/tensor */ - rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); - - rvec_ScaledAdd( workspace->f[i], -1., temp ); - rvec_Add( workspace->forceReduction[froffset+j], temp ); - } - } - } + Compute_Polarization_Energy(system, data); } - - pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, system->pair_ptr->eflag_either, - system->pair_ptr->vflag_either, thr); - } // end omp parallel - - data->my_en.e_vdW = total_EvdW; - data->my_en.e_ele = total_Eele; - - Compute_Polarization_Energy( system, data ); } diff --git a/src/USER-OMP/reaxc_nonbonded_omp.h b/src/USER-OMP/reaxc_nonbonded_omp.h deleted file mode 100644 index a5d895533a..0000000000 --- a/src/USER-OMP/reaxc_nonbonded_omp.h +++ /dev/null @@ -1,40 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __NONBONDED_OMP_H_ -#define __NONBONDED_OMP_H_ - -#include "reaxc_types.h" - -void vdW_Coulomb_Energy_OMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -void Tabulated_vdW_Coulomb_Energy_OMP( reax_system*, control_params*, - simulation_data*, storage*, - reax_list**, output_controls* ); -#endif diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index 642efd836e..f8c8d4262c 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -26,436 +26,411 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_torsion_angles_omp.h" +#include "reaxff_omp.h" #include "fix_omp.h" #include "pair_reaxc_omp.h" - -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" #include -#if defined(_OPENMP) -#include -#endif - #define MIN_SINE 1e-10 using namespace LAMMPS_NS; -// Functions defined in reaxc_torsion_angles.cpp -extern double Calculate_Omega(rvec, double, rvec, double, rvec, double, rvec, double, - three_body_interaction_data*, three_body_interaction_data*, - rvec, rvec, rvec, rvec, output_controls*); - -/* ---------------------------------------------------------------------- */ - -void Torsion_AnglesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control ) -{ -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif - - int natoms = system->n; - reax_list *bonds = (*lists) + BONDS; - reax_list *thb_intrs = (*lists) + THREE_BODIES; - double p_tor2 = system->reax_param.gp.l[23]; - double p_tor3 = system->reax_param.gp.l[24]; - double p_tor4 = system->reax_param.gp.l[25]; - double p_cot2 = system->reax_param.gp.l[27]; - double total_Etor = 0; - double total_Econ = 0; - int nthreads = control->nthreads; +namespace ReaxFF { + + /* ---------------------------------------------------------------------- */ + void Torsion_AnglesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int natoms = system->n; + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; + double p_tor2 = system->reax_param.gp.l[23]; + double p_tor3 = system->reax_param.gp.l[24]; + double p_tor4 = system->reax_param.gp.l[25]; + double p_cot2 = system->reax_param.gp.l[27]; + double total_Etor = 0; + double total_Econ = 0; + int nthreads = control->nthreads; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+: total_Etor, total_Econ) #endif - { - int i, j, k, l, pi, pj, pk, pl, pij, plk; - int type_i, type_j, type_k, type_l; - int start_j, end_j; - int start_pj, end_pj, start_pk, end_pk; - int num_frb_intrs = 0; + { + int i, j, k, l, pi, pj, pk, pl, pij, plk; + int type_i, type_j, type_k, type_l; + int start_j, end_j; + int start_pj, end_pj, start_pk, end_pk; + int num_frb_intrs = 0; - double Delta_j, Delta_k; - double r_ij, r_jk, r_kl, r_li; - double BOA_ij, BOA_jk, BOA_kl; + double Delta_j, Delta_k; + double r_ij, r_jk, r_kl, r_li; + double BOA_ij, BOA_jk, BOA_kl; - double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; - double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; - double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; - double fn10, f11_DjDk, dfn11, fn12; - double theta_ijk, theta_jkl; - double sin_ijk, sin_jkl; - double cos_ijk, cos_jkl; - double tan_ijk_i, tan_jkl_i; - double omega, cos_omega, cos2omega, cos3omega; - rvec dcos_omega_di, dcos_omega_dj, dcos_omega_dk, dcos_omega_dl; - double CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; - double CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; - double Cconj, CEconj1, CEconj2, CEconj3; - double CEconj4, CEconj5, CEconj6; - double e_tor, e_con; - rvec dvec_li; - rvec force; - ivec rel_box_jl; - four_body_header *fbh; - four_body_parameters *fbp; - bond_data *pbond_ij, *pbond_jk, *pbond_kl; - bond_order_data *bo_ij, *bo_jk, *bo_kl; - three_body_interaction_data *p_ijk, *p_jkl; + double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; + double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; + double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; + double fn10, f11_DjDk, dfn11, fn12; + double theta_ijk, theta_jkl; + double sin_ijk, sin_jkl; + double cos_ijk, cos_jkl; + double tan_ijk_i, tan_jkl_i; + double omega, cos_omega, cos2omega, cos3omega; + rvec dcos_omega_di, dcos_omega_dj, dcos_omega_dk, dcos_omega_dl; + double CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; + double CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; + double Cconj, CEconj1, CEconj2, CEconj3; + double CEconj4, CEconj5, CEconj6; + double e_tor, e_con; + rvec dvec_li; + rvec force; + ivec rel_box_jl; + four_body_header *fbh; + four_body_parameters *fbp; + bond_data *pbond_ij, *pbond_jk, *pbond_kl; + bond_order_data *bo_ij, *bo_jk, *bo_kl; + three_body_interaction_data *p_ijk, *p_jkl; - // Virial tallying variables - double delil[3], deljl[3], delkl[3]; - double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + // Virial tallying variables + double delil[3], deljl[3], delkl[3]; + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + int tid = get_tid(); + + long reductionOffset = (system->N * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) #pragma omp for schedule(static) #endif - for (j = 0; j < system->N; ++j) { - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + for (j = 0; j < system->N; ++j) { + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - for (pk = start_j; pk < end_j; ++pk) { - bo_jk = &( bonds->select.bond_list[pk].bo_data ); - for (k = 0; k < nthreads; ++k) - bo_jk->CdboReduction[k] = 0.; - } - } + for (pk = start_j; pk < end_j; ++pk) { + bo_jk = &(bonds->select.bond_list[pk].bo_data); + for (k = 0; k < nthreads; ++k) + bo_jk->CdboReduction[k] = 0.; + } + } #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (j = 0; j < natoms; ++j) { - type_j = system->my_atoms[j].type; - Delta_j = workspace->Delta_boc[j]; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + for (j = 0; j < natoms; ++j) { + type_j = system->my_atoms[j].type; + Delta_j = workspace->Delta_boc[j]; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - for (pk = start_j; pk < end_j; ++pk) { - pbond_jk = &( bonds->select.bond_list[pk] ); - k = pbond_jk->nbr; - bo_jk = &( pbond_jk->bo_data ); - BOA_jk = bo_jk->BO - control->thb_cut; + for (pk = start_j; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + k = pbond_jk->nbr; + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; - /* see if there are any 3-body interactions involving j&k - where j is the central atom. Otherwise there is no point in - trying to form a 4-body interaction out of this neighborhood */ - if (system->my_atoms[j].orig_id < system->my_atoms[k].orig_id && - bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { - pj = pbond_jk->sym_index; // pj points to j on k's list + /* see if there are any 3-body interactions involving j&k + where j is the central atom. Otherwise there is no point in + trying to form a 4-body interaction out of this neighborhood */ + if (system->my_atoms[j].orig_id < system->my_atoms[k].orig_id && + bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { + pj = pbond_jk->sym_index; // pj points to j on k's list - /* do the same check as above: - are there any 3-body interactions involving k&j - where k is the central atom */ - if (Num_Entries(pj, thb_intrs)) { - type_k = system->my_atoms[k].type; - Delta_k = workspace->Delta_boc[k]; - r_jk = pbond_jk->d; + /* do the same check as above: + are there any 3-body interactions involving k&j + where k is the central atom */ + if (Num_Entries(pj, thb_intrs)) { + type_k = system->my_atoms[k].type; + Delta_k = workspace->Delta_boc[k]; + r_jk = pbond_jk->d; - start_pk = Start_Index(pk, thb_intrs ); - end_pk = End_Index(pk, thb_intrs ); - start_pj = Start_Index(pj, thb_intrs ); - end_pj = End_Index(pj, thb_intrs ); + start_pk = Start_Index(pk, thb_intrs); + end_pk = End_Index(pk, thb_intrs); + start_pj = Start_Index(pj, thb_intrs); + end_pj = End_Index(pj, thb_intrs); - exp_tor2_jk = exp( -p_tor2 * BOA_jk ); - exp_cot2_jk = exp( -p_cot2 * SQR(BOA_jk - 1.5) ); - exp_tor3_DjDk = exp( -p_tor3 * (Delta_j + Delta_k) ); - exp_tor4_DjDk = exp( p_tor4 * (Delta_j + Delta_k) ); - exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); - f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; + exp_tor2_jk = exp(-p_tor2 * BOA_jk); + exp_cot2_jk = exp(-p_cot2 * SQR(BOA_jk - 1.5)); + exp_tor3_DjDk = exp(-p_tor3 * (Delta_j + Delta_k)); + exp_tor4_DjDk = exp(p_tor4 * (Delta_j + Delta_k)); + exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); + f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; - /* pick i up from j-k interaction where j is the central atom */ - for (pi = start_pk; pi < end_pk; ++pi) { - p_ijk = &( thb_intrs->select.three_body_list[pi] ); - pij = p_ijk->pthb; // pij is pointer to i on j's bond_list - pbond_ij = &( bonds->select.bond_list[pij] ); - bo_ij = &( pbond_ij->bo_data ); + /* pick i up from j-k interaction where j is the central atom */ + for (pi = start_pk; pi < end_pk; ++pi) { + p_ijk = &(thb_intrs->select.three_body_list[pi]); + pij = p_ijk->pthb; // pij is pointer to i on j's bond_list + pbond_ij = &(bonds->select.bond_list[pij]); + bo_ij = &(pbond_ij->bo_data); - if (bo_ij->BO > control->thb_cut/*0*/) { - i = p_ijk->thb; - type_i = system->my_atoms[i].type; - r_ij = pbond_ij->d; - BOA_ij = bo_ij->BO - control->thb_cut; + if (bo_ij->BO > control->thb_cut/*0*/) { + i = p_ijk->thb; + type_i = system->my_atoms[i].type; + r_ij = pbond_ij->d; + BOA_ij = bo_ij->BO - control->thb_cut; - theta_ijk = p_ijk->theta; - sin_ijk = sin( theta_ijk ); - cos_ijk = cos( theta_ijk ); - //tan_ijk_i = 1. / tan( theta_ijk ); - if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) - tan_ijk_i = cos_ijk / MIN_SINE; - else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) - tan_ijk_i = cos_ijk / -MIN_SINE; - else tan_ijk_i = cos_ijk / sin_ijk; + theta_ijk = p_ijk->theta; + sin_ijk = sin(theta_ijk); + cos_ijk = cos(theta_ijk); + //tan_ijk_i = 1. / tan(theta_ijk); + if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) + tan_ijk_i = cos_ijk / MIN_SINE; + else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) + tan_ijk_i = cos_ijk / -MIN_SINE; + else tan_ijk_i = cos_ijk / sin_ijk; - exp_tor2_ij = exp( -p_tor2 * BOA_ij ); - exp_cot2_ij = exp( -p_cot2 * SQR(BOA_ij -1.5) ); + exp_tor2_ij = exp(-p_tor2 * BOA_ij); + exp_cot2_ij = exp(-p_cot2 * SQR(BOA_ij -1.5)); - /* pick l up from j-k interaction where k is the central atom */ - for (pl = start_pj; pl < end_pj; ++pl) { - p_jkl = &( thb_intrs->select.three_body_list[pl] ); - l = p_jkl->thb; - plk = p_jkl->pthb; //pointer to l on k's bond_list! - pbond_kl = &( bonds->select.bond_list[plk] ); - bo_kl = &( pbond_kl->bo_data ); - type_l = system->my_atoms[l].type; - fbh = &(system->reax_param.fbp[type_i][type_j] - [type_k][type_l]); - fbp = &(system->reax_param.fbp[type_i][type_j] - [type_k][type_l].prm[0]); + /* pick l up from j-k interaction where k is the central atom */ + for (pl = start_pj; pl < end_pj; ++pl) { + p_jkl = &(thb_intrs->select.three_body_list[pl]); + l = p_jkl->thb; + plk = p_jkl->pthb; //pointer to l on k's bond_list! + pbond_kl = &(bonds->select.bond_list[plk]); + bo_kl = &(pbond_kl->bo_data); + type_l = system->my_atoms[l].type; + fbh = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l]); + fbp = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l].prm[0]); - if (i != l && fbh->cnt && - bo_kl->BO > control->thb_cut/*0*/ && - bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { - ++num_frb_intrs; - //fprintf(stderr, - // "%5d: %6d %6d %6d %6d\n", num_frb_intrs, - // system->my_atoms[i].orig_id,system->my_atoms[j].orig_id, - // system->my_atoms[k].orig_id,system->my_atoms[l].orig_id); + if (i != l && fbh->cnt && + bo_kl->BO > control->thb_cut/*0*/ && + bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { + ++num_frb_intrs; + //fprintf(stderr, + // "%5d: %6d %6d %6d %6d\n", num_frb_intrs, + // system->my_atoms[i].orig_id,system->my_atoms[j].orig_id, + // system->my_atoms[k].orig_id,system->my_atoms[l].orig_id); - r_kl = pbond_kl->d; - BOA_kl = bo_kl->BO - control->thb_cut; + r_kl = pbond_kl->d; + BOA_kl = bo_kl->BO - control->thb_cut; - theta_jkl = p_jkl->theta; - sin_jkl = sin( theta_jkl ); - cos_jkl = cos( theta_jkl ); - //tan_jkl_i = 1. / tan( theta_jkl ); - if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) - tan_jkl_i = cos_jkl / MIN_SINE; - else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) - tan_jkl_i = cos_jkl / -MIN_SINE; - else tan_jkl_i = cos_jkl /sin_jkl; + theta_jkl = p_jkl->theta; + sin_jkl = sin(theta_jkl); + cos_jkl = cos(theta_jkl); + //tan_jkl_i = 1. / tan(theta_jkl); + if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) + tan_jkl_i = cos_jkl / MIN_SINE; + else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) + tan_jkl_i = cos_jkl / -MIN_SINE; + else tan_jkl_i = cos_jkl /sin_jkl; - rvec_ScaledSum( dvec_li, 1., system->my_atoms[i].x, - -1., system->my_atoms[l].x ); - r_li = rvec_Norm( dvec_li ); + rvec_ScaledSum(dvec_li, 1., system->my_atoms[i].x, + -1., system->my_atoms[l].x); + r_li = rvec_Norm(dvec_li); - /* omega and its derivative */ - omega = Calculate_Omega( pbond_ij->dvec, r_ij, - pbond_jk->dvec, r_jk, - pbond_kl->dvec, r_kl, - dvec_li, r_li, - p_ijk, p_jkl, - dcos_omega_di, dcos_omega_dj, - dcos_omega_dk, dcos_omega_dl, - out_control ); + /* omega and its derivative */ + omega = Calculate_Omega(pbond_ij->dvec, r_ij, + pbond_jk->dvec, r_jk, + pbond_kl->dvec, r_kl, + dvec_li, r_li, + p_ijk, p_jkl, + dcos_omega_di, dcos_omega_dj, + dcos_omega_dk, dcos_omega_dl); - cos_omega = cos( omega ); - cos2omega = cos( 2. * omega ); - cos3omega = cos( 3. * omega ); - /* end omega calculations */ + cos_omega = cos(omega); + cos2omega = cos(2. * omega); + cos3omega = cos(3. * omega); + /* end omega calculations */ - /* torsion energy */ - exp_tor1 = exp( fbp->p_tor1 * - SQR(2.0 - bo_jk->BO_pi - f11_DjDk) ); - exp_tor2_kl = exp( -p_tor2 * BOA_kl ); - exp_cot2_kl = exp( -p_cot2 * SQR(BOA_kl - 1.5) ); - fn10 = (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * - (1.0 - exp_tor2_kl); + /* torsion energy */ + exp_tor1 = exp(fbp->p_tor1 * + SQR(2.0 - bo_jk->BO_pi - f11_DjDk)); + exp_tor2_kl = exp(-p_tor2 * BOA_kl); + exp_cot2_kl = exp(-p_cot2 * SQR(BOA_kl - 1.5)); + fn10 = (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * + (1.0 - exp_tor2_kl); - CV = 0.5 * ( fbp->V1 * (1.0 + cos_omega) + - fbp->V2 * exp_tor1 * (1.0 - cos2omega) + - fbp->V3 * (1.0 + cos3omega) ); + CV = 0.5 * (fbp->V1 * (1.0 + cos_omega) + + fbp->V2 * exp_tor1 * (1.0 - cos2omega) + + fbp->V3 * (1.0 + cos3omega)); - total_Etor += e_tor = fn10 * sin_ijk * sin_jkl * CV; + total_Etor += e_tor = fn10 * sin_ijk * sin_jkl * CV; - dfn11 = (-p_tor3 * exp_tor3_DjDk + - (p_tor3 * exp_tor3_DjDk - p_tor4 * exp_tor4_DjDk) * - (2.0 + exp_tor3_DjDk) * exp_tor34_inv) * - exp_tor34_inv; + dfn11 = (-p_tor3 * exp_tor3_DjDk + + (p_tor3 * exp_tor3_DjDk - p_tor4 * exp_tor4_DjDk) * + (2.0 + exp_tor3_DjDk) * exp_tor34_inv) * + exp_tor34_inv; - CEtors1 = sin_ijk * sin_jkl * CV; + CEtors1 = sin_ijk * sin_jkl * CV; - CEtors2 = -fn10 * 2.0 * fbp->p_tor1 * fbp->V2 * exp_tor1 * - (2.0 - bo_jk->BO_pi - f11_DjDk) * (1.0 - SQR(cos_omega)) * - sin_ijk * sin_jkl; - CEtors3 = CEtors2 * dfn11; + CEtors2 = -fn10 * 2.0 * fbp->p_tor1 * fbp->V2 * exp_tor1 * + (2.0 - bo_jk->BO_pi - f11_DjDk) * (1.0 - SQR(cos_omega)) * + sin_ijk * sin_jkl; + CEtors3 = CEtors2 * dfn11; - CEtors4 = CEtors1 * p_tor2 * exp_tor2_ij * - (1.0 - exp_tor2_jk) * (1.0 - exp_tor2_kl); - CEtors5 = CEtors1 * p_tor2 * - (1.0 - exp_tor2_ij) * exp_tor2_jk * (1.0 - exp_tor2_kl); - CEtors6 = CEtors1 * p_tor2 * - (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * exp_tor2_kl; + CEtors4 = CEtors1 * p_tor2 * exp_tor2_ij * + (1.0 - exp_tor2_jk) * (1.0 - exp_tor2_kl); + CEtors5 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * exp_tor2_jk * (1.0 - exp_tor2_kl); + CEtors6 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * exp_tor2_kl; - cmn = -fn10 * CV; - CEtors7 = cmn * sin_jkl * tan_ijk_i; - CEtors8 = cmn * sin_ijk * tan_jkl_i; + cmn = -fn10 * CV; + CEtors7 = cmn * sin_jkl * tan_ijk_i; + CEtors8 = cmn * sin_ijk * tan_jkl_i; - CEtors9 = fn10 * sin_ijk * sin_jkl * - (0.5 * fbp->V1 - 2.0 * fbp->V2 * exp_tor1 * cos_omega + - 1.5 * fbp->V3 * (cos2omega + 2.0 * SQR(cos_omega))); - /* end of torsion energy */ + CEtors9 = fn10 * sin_ijk * sin_jkl * + (0.5 * fbp->V1 - 2.0 * fbp->V2 * exp_tor1 * cos_omega + + 1.5 * fbp->V3 * (cos2omega + 2.0 * SQR(cos_omega))); + /* end of torsion energy */ - /* 4-body conjugation energy */ - fn12 = exp_cot2_ij * exp_cot2_jk * exp_cot2_kl; - //data->my_en.e_con += e_con = - total_Econ += e_con = - fbp->p_cot1 * fn12 * - (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + /* 4-body conjugation energy */ + fn12 = exp_cot2_ij * exp_cot2_jk * exp_cot2_kl; + //data->my_en.e_con += e_con = + total_Econ += e_con = + fbp->p_cot1 * fn12 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); - Cconj = -2.0 * fn12 * fbp->p_cot1 * p_cot2 * - (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + Cconj = -2.0 * fn12 * fbp->p_cot1 * p_cot2 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); - CEconj1 = Cconj * (BOA_ij - 1.5e0); - CEconj2 = Cconj * (BOA_jk - 1.5e0); - CEconj3 = Cconj * (BOA_kl - 1.5e0); + CEconj1 = Cconj * (BOA_ij - 1.5e0); + CEconj2 = Cconj * (BOA_jk - 1.5e0); + CEconj3 = Cconj * (BOA_kl - 1.5e0); - CEconj4 = -fbp->p_cot1 * fn12 * - (SQR(cos_omega) - 1.0) * sin_jkl * tan_ijk_i; - CEconj5 = -fbp->p_cot1 * fn12 * - (SQR(cos_omega) - 1.0) * sin_ijk * tan_jkl_i; - CEconj6 = 2.0 * fbp->p_cot1 * fn12 * - cos_omega * sin_ijk * sin_jkl; - /* end 4-body conjugation energy */ + CEconj4 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_jkl * tan_ijk_i; + CEconj5 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_ijk * tan_jkl_i; + CEconj6 = 2.0 * fbp->p_cot1 * fn12 * + cos_omega * sin_ijk * sin_jkl; + /* end 4-body conjugation energy */ - /* FORCES */ - bo_jk->Cdbopi += CEtors2; - workspace->CdDelta[j] += CEtors3; - //workspace->CdDelta[k] += CEtors3; - workspace->CdDeltaReduction[reductionOffset+k] += CEtors3; - bo_ij->Cdbo += (CEtors4 + CEconj1); - bo_jk->Cdbo += (CEtors5 + CEconj2); - //bo_kl->Cdbo += (CEtors6 + CEconj3); - bo_kl->CdboReduction[tid] += (CEtors6 + CEconj3); + /* FORCES */ + bo_jk->Cdbopi += CEtors2; + workspace->CdDelta[j] += CEtors3; + //workspace->CdDelta[k] += CEtors3; + workspace->CdDeltaReduction[reductionOffset+k] += CEtors3; + bo_ij->Cdbo += (CEtors4 + CEconj1); + bo_jk->Cdbo += (CEtors5 + CEconj2); + //bo_kl->Cdbo += (CEtors6 + CEconj3); + bo_kl->CdboReduction[tid] += (CEtors6 + CEconj3); - if (control->virial == 0) { - /* dcos_theta_ijk */ - rvec_ScaledAdd( workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], - CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], - CEtors7 + CEconj4, p_ijk->dcos_di ); + if (control->virial == 0) { + /* dcos_theta_ijk */ + rvec_ScaledAdd(workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], + CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors7 + CEconj4, p_ijk->dcos_di); - /* dcos_theta_jkl */ - rvec_ScaledAdd( workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], - CEtors8 + CEconj5, p_jkl->dcos_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+l], - CEtors8 + CEconj5, p_jkl->dcos_dk ); + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], + CEtors8 + CEconj5, p_jkl->dcos_dk); - /* dcos_omega */ - rvec_ScaledAdd( workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], - CEtors9 + CEconj6, dcos_omega_di ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], - CEtors9 + CEconj6, dcos_omega_dk ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+l], - CEtors9 + CEconj6, dcos_omega_dl ); - } - else { - ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); + /* dcos_omega */ + rvec_ScaledAdd(workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], + CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors9 + CEconj6, dcos_omega_dk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], + CEtors9 + CEconj6, dcos_omega_dl); + } + else { + ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); - /* dcos_theta_ijk */ - rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + /* dcos_theta_ijk */ + rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_Add(workspace->forceReduction[reductionOffset+i], force); - rvec_ScaledAdd( workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj ); + rvec_ScaledAdd(workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj); - rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); - rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_di); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); - /* dcos_theta_jkl */ - rvec_ScaledAdd( workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di ); + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di); - rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); - rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); - rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); - rvec_Add( workspace->forceReduction[reductionOffset+l], force ); + rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dk); + rvec_Add(workspace->forceReduction[reductionOffset+l], force); - /* dcos_omega */ - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); - rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + /* dcos_omega */ + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_di); + rvec_Add(workspace->forceReduction[reductionOffset+i], force); - rvec_ScaledAdd( workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj ); + rvec_ScaledAdd(workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj); - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dk ); - rvec_Add( workspace->forceReduction[reductionOffset+k], force ); + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dk); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dl ); - rvec_Add( workspace->forceReduction[reductionOffset+i], force ); - } + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dl); + rvec_Add(workspace->forceReduction[reductionOffset+i], force); + } - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - // acquire vectors - rvec_ScaledSum( delil, 1., system->my_atoms[l].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( deljl, 1., system->my_atoms[l].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkl, 1., system->my_atoms[l].x, - -1., system->my_atoms[k].x ); - // dcos_theta_ijk - rvec_Scale( fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_Scale( fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di ); + // acquire vectors + rvec_ScaledSum(delil, 1., system->my_atoms[l].x, + -1., system->my_atoms[i].x); + rvec_ScaledSum(deljl, 1., system->my_atoms[l].x, + -1., system->my_atoms[j].x); + rvec_ScaledSum(delkl, 1., system->my_atoms[l].x, + -1., system->my_atoms[k].x); + // dcos_theta_ijk + rvec_Scale(fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_Scale(fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_Scale(fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di); - // dcos_theta_jkl - rvec_ScaledAdd( fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di ); - rvec_ScaledAdd( fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj ); + // dcos_theta_jkl + rvec_ScaledAdd(fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj); - // dcos_omega - rvec_ScaledAdd( fi_tmp, CEtors9 + CEconj6, dcos_omega_di ); - rvec_ScaledAdd( fj_tmp, CEtors9 + CEconj6, dcos_omega_dj ); - rvec_ScaledAdd( fk_tmp, CEtors9 + CEconj6, dcos_omega_dk ); + // dcos_omega + rvec_ScaledAdd(fi_tmp, CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(fj_tmp, CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(fk_tmp, CEtors9 + CEconj6, dcos_omega_dk); - // tally - eng_tmp = e_tor + e_con; + // tally + eng_tmp = e_tor + e_con; - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, - eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - // NEED TO MAKE AN OMP VERSION OF THIS CALL! - if (system->pair_ptr->vflag_atom) - system->pair_ptr->v_tally4(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, - delil, deljl, delkl ); - } + // NEED TO MAKE AN OMP VERSION OF THIS CALL! + if (system->pair_ptr->vflag_atom) + system->pair_ptr->v_tally4(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, + delil, deljl, delkl); + } - } // pl check ends - } // pl loop ends - } // pi check ends - } // pi loop ends - } // k-j neighbor check ends - } // jmy_en.e_tor = total_Etor; - data->my_en.e_con = total_Econ; - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTETORSIONANGLESBOINDEX] += (endTimeBase-startTimeBase); -#endif + data->my_en.e_tor = total_Etor; + data->my_en.e_con = total_Econ; + } } diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.h b/src/USER-OMP/reaxc_torsion_angles_omp.h deleted file mode 100644 index 62cb760f41..0000000000 --- a/src/USER-OMP/reaxc_torsion_angles_omp.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __TORSION_ANGLES_OMP_H_ -#define __TORSION_ANGLES_OMP_H_ - -#include "reaxc_types.h" -#include "reaxc_torsion_angles.h" - -void Torsion_AnglesOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 167f647790..4719fcfbab 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -26,583 +26,561 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_valence_angles_omp.h" +#include "reaxff_omp.h" #include "error.h" #include "fix_omp.h" #include "pair_reaxc_omp.h" - -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_valence_angles.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" #include -#if defined(_OPENMP) -#include -#endif - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -void Calculate_dCos_ThetaOMP( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, - rvec* dcos_theta_di, - rvec* dcos_theta_dj, - rvec* dcos_theta_dk ) -{ - double sqr_d_ji = SQR(d_ji); - double sqr_d_jk = SQR(d_jk); - double inv_dists = 1.0 / (d_ji * d_jk); - double inv_dists3 = inv_dists * inv_dists * inv_dists; - double dot_dvecs = dvec_ji[0]*dvec_jk[0] + dvec_ji[1]*dvec_jk[1] + dvec_ji[2]*dvec_jk[2]; - double Cdot_inv3 = dot_dvecs * inv_dists3; +namespace ReaxFF { + void Calculate_dCos_ThetaOMP(rvec dvec_ji, double d_ji, rvec dvec_jk, + double d_jk, rvec *dcos_theta_di, + rvec *dcos_theta_dj, rvec *dcos_theta_dk) + { + double sqr_d_ji = SQR(d_ji); + double sqr_d_jk = SQR(d_jk); + double inv_dists = 1.0 / (d_ji * d_jk); + double inv_dists3 = inv_dists * inv_dists * inv_dists; + double dot_dvecs = dvec_ji[0]*dvec_jk[0] + dvec_ji[1]*dvec_jk[1] + dvec_ji[2]*dvec_jk[2]; + double Cdot_inv3 = dot_dvecs * inv_dists3; - double csqr_jk = Cdot_inv3 * sqr_d_jk; - double csqr_ji = Cdot_inv3 * sqr_d_ji; + double csqr_jk = Cdot_inv3 * sqr_d_jk; + double csqr_ji = Cdot_inv3 * sqr_d_ji; - // Try to help compiler out by unrolling - // x-component - double dinv_jk = dvec_jk[0] * inv_dists; - double dinv_ji = dvec_ji[0] * inv_dists; + // Try to help compiler out by unrolling + // x-component + double dinv_jk = dvec_jk[0] * inv_dists; + double dinv_ji = dvec_ji[0] * inv_dists; - double cdev_ji = csqr_jk * dvec_ji[0]; - double cdev_jk = csqr_ji * dvec_jk[0]; + double cdev_ji = csqr_jk * dvec_ji[0]; + double cdev_jk = csqr_ji * dvec_jk[0]; - (*dcos_theta_di)[0] = dinv_jk - cdev_ji; - (*dcos_theta_dj)[0] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; - (*dcos_theta_dk)[0] = dinv_ji - cdev_jk; + (*dcos_theta_di)[0] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[0] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[0] = dinv_ji - cdev_jk; - // y-component - dinv_jk = dvec_jk[1] * inv_dists; - dinv_ji = dvec_ji[1] * inv_dists; + // y-component + dinv_jk = dvec_jk[1] * inv_dists; + dinv_ji = dvec_ji[1] * inv_dists; - cdev_ji = csqr_jk * dvec_ji[1]; - cdev_jk = csqr_ji * dvec_jk[1]; + cdev_ji = csqr_jk * dvec_ji[1]; + cdev_jk = csqr_ji * dvec_jk[1]; - (*dcos_theta_di)[1] = dinv_jk - cdev_ji; - (*dcos_theta_dj)[1] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; - (*dcos_theta_dk)[1] = dinv_ji - cdev_jk; + (*dcos_theta_di)[1] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[1] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[1] = dinv_ji - cdev_jk; - // z-component - dinv_jk = dvec_jk[2] * inv_dists; - dinv_ji = dvec_ji[2] * inv_dists; + // z-component + dinv_jk = dvec_jk[2] * inv_dists; + dinv_ji = dvec_ji[2] * inv_dists; - cdev_ji = csqr_jk * dvec_ji[2]; - cdev_jk = csqr_ji * dvec_jk[2]; + cdev_ji = csqr_jk * dvec_ji[2]; + cdev_jk = csqr_ji * dvec_jk[2]; - (*dcos_theta_di)[2] = dinv_jk - cdev_ji; - (*dcos_theta_dj)[2] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; - (*dcos_theta_dk)[2] = dinv_ji - cdev_jk; -} + (*dcos_theta_di)[2] = dinv_jk - cdev_ji; + (*dcos_theta_dj)[2] = -(dinv_jk + dinv_ji) + cdev_ji + cdev_jk; + (*dcos_theta_dk)[2] = dinv_ji - cdev_jk; + } -/* ---------------------------------------------------------------------- */ + /* ---------------------------------------------------------------------- */ -/* this is a 3-body interaction in which the main role is - played by j which sits in the middle of the other two. */ -void Valence_AnglesOMP( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /* out_control */) -{ + /* this is a 3-body interaction in which the main role is + played by j which sits in the middle of the other two. */ + void Valence_AnglesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif + // Precompute and store valence_angle offsets for OpenMP code. + int * _my_offset = workspace->valence_angle_atom_myoffset; - reax_list *bonds = (*lists) + BONDS; - reax_list *thb_intrs = (*lists) + THREE_BODIES; + /* global parameters used in these calculations */ + double p_val6 = system->reax_param.gp.l[14]; + double p_val8 = system->reax_param.gp.l[33]; + double p_val9 = system->reax_param.gp.l[16]; + double p_val10 = system->reax_param.gp.l[17]; + double total_Eang = 0; + double total_Epen = 0; + double total_Ecoa = 0; - // Precompute and store valence_angle offsets for OpenMP code. - int * _my_offset = workspace->valence_angle_atom_myoffset; - - /* global parameters used in these calculations */ - double p_val6 = system->reax_param.gp.l[14]; - double p_val8 = system->reax_param.gp.l[33]; - double p_val9 = system->reax_param.gp.l[16]; - double p_val10 = system->reax_param.gp.l[17]; - double total_Eang = 0; - double total_Epen = 0; - double total_Ecoa = 0; - - int nthreads = control->nthreads; - int num_thb_intrs = 0; - int TWICE = 2; + int nthreads = control->nthreads; + int num_thb_intrs = 0; + int TWICE = 2; #if defined(_OPENMP) #pragma omp parallel default(shared) reduction(+:total_Eang, total_Epen, total_Ecoa, num_thb_intrs) #endif - { - int i, j, pi, k, pk, t; - int type_i, type_j, type_k; - int start_j, end_j, start_pk, end_pk; - int cnt, my_offset; + { + int i, j, pi, k, pk, t; + int type_i, type_j, type_k; + int start_j, end_j, start_pk, end_pk; + int cnt, my_offset; - double temp, temp_bo_jt, pBOjt7; - double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; - double p_pen1, p_pen2, p_pen3, p_pen4; - double p_coa1, p_coa2, p_coa3, p_coa4; - double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; - double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; - double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; - double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; - double CEpen1, CEpen2, CEpen3; - double e_ang, e_coa, e_pen; - double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; - double Cf7ij, Cf7jk, Cf8j, Cf9j; - double f7_ij, f7_jk, f8_Dj, f9_Dj; - double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; - double BOA_ij, BOA_jk; - rvec force; + double temp, temp_bo_jt, pBOjt7; + double p_val1, p_val2, p_val3, p_val4, p_val5, p_val7; + double p_pen1, p_pen2, p_pen3, p_pen4; + double p_coa1, p_coa2, p_coa3, p_coa4; + double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; + double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; + double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; + double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; + double CEpen1, CEpen2, CEpen3; + double e_ang, e_coa, e_pen; + double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; + double Cf7ij, Cf7jk, Cf8j, Cf9j; + double f7_ij, f7_jk, f8_Dj, f9_Dj; + double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; + double BOA_ij, BOA_jk; + rvec force; - // Tallying variables - double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - double delij[3], delkj[3]; + // Tallying variables + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + double delij[3], delkj[3]; - three_body_header *thbh; - three_body_parameters *thbp; - three_body_interaction_data *p_ijk, *p_kji; - bond_data *pbond_ij, *pbond_jk, *pbond_jt; - bond_order_data *bo_ij, *bo_jk, *bo_jt; + three_body_header *thbh; + three_body_parameters *thbp; + three_body_interaction_data *p_ijk, *p_kji; + bond_data *pbond_ij, *pbond_jk, *pbond_jt; + bond_order_data *bo_ij, *bo_jk, *bo_jt; -#if defined(_OPENMP) - int tid = omp_get_thread_num(); -#else - int tid = 0; -#endif - long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); - class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + int tid = get_tid(); - // Run through a minimal for (jN * tid); + class PairReaxCOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); + class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - const int per_thread = thb_intrs->num_intrs / nthreads; + // Run through a minimal for (jnum_intrs / nthreads; #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (j = 0; j < system->N; ++j) { - type_j = system->my_atoms[j].type; - _my_offset[j] = 0; - if (type_j < 0) continue; + for (j = 0; j < system->N; ++j) { + type_j = system->my_atoms[j].type; + _my_offset[j] = 0; + if (type_j < 0) continue; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - // Always point to start of workspace to count angles - my_offset = tid * per_thread; + // Always point to start of workspace to count angles + my_offset = tid * per_thread; - for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, my_offset, thb_intrs ); - pbond_ij = &(bonds->select.bond_list[pi]); - bo_ij = &(pbond_ij->bo_data); - BOA_ij = bo_ij->BO - control->thb_cut; + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index(pi, my_offset, thb_intrs); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; - if (BOA_ij > 0.0) { - i = pbond_ij->nbr; + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; - /* first copy 3-body intrs from previously computed ones where i>k. - in the second for-loop below, - we compute only new 3-body intrs where i < k */ - for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index(pk, thb_intrs); + end_pk = End_Index(pk, thb_intrs); - for (t = start_pk; t < end_pk; ++t) - if (thb_intrs->select.three_body_list[t].thb == i) { + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); - p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk = &(thb_intrs->select.three_body_list[my_offset]); + p_ijk->thb = bonds->select.bond_list[pk].nbr; - ++my_offset; - break; - } - } // for (pk) + ++my_offset; + break; + } + } // for (pk) - /* and this is the second for loop mentioned above */ - for (pk = pi+1; pk < end_j; ++pk) { - pbond_jk = &(bonds->select.bond_list[pk]); - k = pbond_jk->nbr; + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + k = pbond_jk->nbr; - if (j >= system->n && i >= system->n && k >= system->n) continue; + if (j >= system->n && i >= system->n && k >= system->n) continue; - p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); - p_ijk->thb = k; + p_ijk = &(thb_intrs->select.three_body_list[my_offset]); + p_ijk->thb = k; - ++my_offset; // add this to the list of 3-body interactions - } // for (pk) - } // if () + ++my_offset; // add this to the list of 3-body interactions + } // for (pk) + } // if () - Set_End_Index(pi, my_offset, thb_intrs ); - } // for (pi) + Set_End_Index(pi, my_offset, thb_intrs); + } // for (pi) - // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom - if (my_offset >= (tid+1)*per_thread) - control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " - "angle_list for atom {}:\n" - " nthreads={} tid={} my_offset={} per_thread={}\n" - " num_intrs={} N={}",data->step,j,nthreads,tid, - my_offset,per_thread,thb_intrs->num_intrs,system->N)); - // Number of angles owned by this atom - _my_offset[j] = my_offset - tid * per_thread; - } // for (j) + // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom + if (my_offset >= (tid+1)*per_thread) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list for atom {}:\n" + " nthreads={} tid={} my_offset={} per_thread={}\n" + " num_intrs={} N={}",data->step,j,nthreads,tid, + my_offset,per_thread,thb_intrs->num_intrs,system->N)); + // Number of angles owned by this atom + _my_offset[j] = my_offset - tid * per_thread; + } // for (j) - // Wait for all threads to finish counting angles + // Wait for all threads to finish counting angles #if defined(_OPENMP) && !defined(__NVCC__) #pragma omp barrier #endif - // Master thread uses angle counts to compute offsets - // This can be threaded + // Master thread uses angle counts to compute offsets + // This can be threaded #if defined(_OPENMP) && !defined(__NVCC__) #pragma omp master #endif - { - int current_count = 0; - int m = _my_offset[0]; - _my_offset[0] = current_count; - for (j=1; jN; j++) { - current_count+= m; - m = _my_offset[j]; - _my_offset[j] = current_count; + { + int current_count = 0; + int m = _my_offset[0]; + _my_offset[0] = current_count; + for (j=1; jN; j++) { + current_count+= m; + m = _my_offset[j]; + _my_offset[j] = current_count; + } + _my_offset[system->N] = current_count + m; // Used to test if last particle has any angles } - _my_offset[system->N] = current_count + m; // Used to test if last particle has any angles - } - // All threads wait till master thread finished computing offsets + // All threads wait till master thread finished computing offsets #if defined(_OPENMP) && !defined(__NVCC__) #pragma omp barrier #endif - // Original loop, but now using precomputed offsets - // Safe to use all threads available, regardless of threads tasked above - // We also now skip over atoms that have no angles assigned + // Original loop, but now using precomputed offsets + // Safe to use all threads available, regardless of threads tasked above + // We also now skip over atoms that have no angles assigned #if defined(_OPENMP) #pragma omp for schedule(dynamic,50)//(dynamic,chunksize)//(guided) #endif - for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; + for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; - // Skip if no angles for this atom - if (_my_offset[j] == _my_offset[j+1]) continue; + // Skip if no angles for this atom + if (_my_offset[j] == _my_offset[j+1]) continue; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); - type_j = system->my_atoms[j].type; + type_j = system->my_atoms[j].type; - my_offset = _my_offset[j]; + my_offset = _my_offset[j]; - p_val3 = system->reax_param.sbp[ type_j ].p_val3; - p_val5 = system->reax_param.sbp[ type_j ].p_val5; + p_val3 = system->reax_param.sbp[ type_j ].p_val3; + p_val5 = system->reax_param.sbp[ type_j ].p_val5; - SBOp = 0, prod_SBO = 1; - for (t = start_j; t < end_j; ++t) { - bo_jt = &(bonds->select.bond_list[t].bo_data); - SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); - temp = SQR( bo_jt->BO ); - temp *= temp; - temp *= temp; - prod_SBO *= exp( -temp ); - } + SBOp = 0, prod_SBO = 1; + for (t = start_j; t < end_j; ++t) { + bo_jt = &(bonds->select.bond_list[t].bo_data); + SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); + temp = SQR(bo_jt->BO); + temp *= temp; + temp *= temp; + prod_SBO *= exp(-temp); + } - // modifications to match Adri's code - 09/01/09 - if (workspace->vlpex[j] >= 0) { - vlpadj = 0; - dSBO2 = prod_SBO - 1; - } else { - vlpadj = workspace->nlp[j]; - dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); - } + // modifications to match Adri's code - 09/01/09 + if (workspace->vlpex[j] >= 0) { + vlpadj = 0; + dSBO2 = prod_SBO - 1; + } else { + vlpadj = workspace->nlp[j]; + dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); + } - SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); - dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); + dSBO1 = -8 * prod_SBO * (workspace->Delta_boc[j] + p_val8 * vlpadj); - if (SBO <= 0) - SBO2 = 0, CSBO2 = 0; - else if (SBO > 0 && SBO <= 1) { - SBO2 = pow( SBO, p_val9 ); - CSBO2 = p_val9 * pow( SBO, p_val9 - 1 ); - } - else if (SBO > 1 && SBO < 2) { - SBO2 = 2 - pow( 2-SBO, p_val9 ); - CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); - } - else - SBO2 = 2, CSBO2 = 0; + if (SBO <= 0) + SBO2 = 0, CSBO2 = 0; + else if (SBO > 0 && SBO <= 1) { + SBO2 = pow(SBO, p_val9); + CSBO2 = p_val9 * pow(SBO, p_val9 - 1); + } + else if (SBO > 1 && SBO < 2) { + SBO2 = 2 - pow(2-SBO, p_val9); + CSBO2 = p_val9 * pow(2 - SBO, p_val9 - 1); + } + else + SBO2 = 2, CSBO2 = 0; - expval6 = exp( p_val6 * workspace->Delta_boc[j] ); + expval6 = exp(p_val6 * workspace->Delta_boc[j]); - for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, my_offset, thb_intrs ); - pbond_ij = &(bonds->select.bond_list[pi]); - bo_ij = &(pbond_ij->bo_data); - BOA_ij = bo_ij->BO - control->thb_cut; + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index(pi, my_offset, thb_intrs); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; - if (BOA_ij > 0.0) { - i = pbond_ij->nbr; - type_i = system->my_atoms[i].type; + if (BOA_ij > 0.0) { + i = pbond_ij->nbr; + type_i = system->my_atoms[i].type; - /* first copy 3-body intrs from previously computed ones where i>k. - in the second for-loop below, - we compute only new 3-body intrs where i < k */ - for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + /* first copy 3-body intrs from previously computed ones where i>k. + in the second for-loop below, + we compute only new 3-body intrs where i < k */ + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index(pk, thb_intrs); + end_pk = End_Index(pk, thb_intrs); - for (t = start_pk; t < end_pk; ++t) - if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[my_offset] ); - p_kji = &(thb_intrs->select.three_body_list[t]); + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { + p_ijk = &(thb_intrs->select.three_body_list[my_offset]); + p_kji = &(thb_intrs->select.three_body_list[t]); - p_ijk->thb = bonds->select.bond_list[pk].nbr; - p_ijk->pthb = pk; - p_ijk->theta = p_kji->theta; - rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); - rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); - rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); + p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk->pthb = pk; + p_ijk->theta = p_kji->theta; + rvec_Copy(p_ijk->dcos_di, p_kji->dcos_dk); + rvec_Copy(p_ijk->dcos_dj, p_kji->dcos_dj); + rvec_Copy(p_ijk->dcos_dk, p_kji->dcos_di); - ++my_offset; - ++num_thb_intrs; - break; - } - } // for (pk) + ++my_offset; + ++num_thb_intrs; + break; + } + } // for (pk) - /* and this is the second for loop mentioned above */ - for (pk = pi+1; pk < end_j; ++pk) { - pbond_jk = &(bonds->select.bond_list[pk]); - bo_jk = &(pbond_jk->bo_data); - BOA_jk = bo_jk->BO - control->thb_cut; - k = pbond_jk->nbr; - type_k = system->my_atoms[k].type; - p_ijk = &( thb_intrs->select.three_body_list[my_offset] ); + /* and this is the second for loop mentioned above */ + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; + k = pbond_jk->nbr; + type_k = system->my_atoms[k].type; + p_ijk = &(thb_intrs->select.three_body_list[my_offset]); - // Fix by Sudhir - // if (BOA_jk <= 0) continue; - if (j >= system->n && i >= system->n && k >= system->n) continue; + // Fix by Sudhir + // if (BOA_jk <= 0) continue; + if (j >= system->n && i >= system->n && k >= system->n) continue; - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &theta, &cos_theta ); + Calculate_Theta(pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &theta, &cos_theta); - Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &(p_ijk->dcos_di), &(p_ijk->dcos_dj), - &(p_ijk->dcos_dk) ); - p_ijk->thb = k; - p_ijk->pthb = pk; - p_ijk->theta = theta; + Calculate_dCos_ThetaOMP(pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &(p_ijk->dcos_di), &(p_ijk->dcos_dj), + &(p_ijk->dcos_dk)); + p_ijk->thb = k; + p_ijk->pthb = pk; + p_ijk->theta = theta; - sin_theta = sin( theta ); - if (sin_theta < 1.0e-5) - sin_theta = 1.0e-5; + sin_theta = sin(theta); + if (sin_theta < 1.0e-5) + sin_theta = 1.0e-5; - ++my_offset; // add this to the list of 3-body interactions - ++num_thb_intrs; + ++my_offset; // add this to the list of 3-body interactions + ++num_thb_intrs; - if ((j < system->n) && (BOA_jk > 0.0) && - (bo_ij->BO > control->thb_cut) && - (bo_jk->BO > control->thb_cut) && - (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { - thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); + if ((j < system->n) && (BOA_jk > 0.0) && + (bo_ij->BO > control->thb_cut) && + (bo_jk->BO > control->thb_cut) && + (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { + thbh = &(system->reax_param.thbp[ type_i ][ type_j ][ type_k ]); - for (cnt = 0; cnt < thbh->cnt; ++cnt) { + for (cnt = 0; cnt < thbh->cnt; ++cnt) { - if (fabs(thbh->prm[cnt].p_val1) > 0.001) { - thbp = &( thbh->prm[cnt] ); + if (fabs(thbh->prm[cnt].p_val1) > 0.001) { + thbp = &(thbh->prm[cnt]); - /* ANGLE ENERGY */ - p_val1 = thbp->p_val1; - p_val2 = thbp->p_val2; - p_val4 = thbp->p_val4; - p_val7 = thbp->p_val7; - theta_00 = thbp->theta_00; + /* ANGLE ENERGY */ + p_val1 = thbp->p_val1; + p_val2 = thbp->p_val2; + p_val4 = thbp->p_val4; + p_val7 = thbp->p_val7; + theta_00 = thbp->theta_00; - exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); - f7_ij = 1.0 - exp3ij; - Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; + exp3ij = exp(-p_val3 * pow(BOA_ij, p_val4)); + f7_ij = 1.0 - exp3ij; + Cf7ij = p_val3 * p_val4 * pow(BOA_ij, p_val4 - 1.0) * exp3ij; - exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); - f7_jk = 1.0 - exp3jk; - Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; + exp3jk = exp(-p_val3 * pow(BOA_jk, p_val4)); + f7_jk = 1.0 - exp3jk; + Cf7jk = p_val3 * p_val4 * pow(BOA_jk, p_val4 - 1.0) * exp3jk; - expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); - trm8 = 1.0 + expval6 + expval7; - f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); - Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * - ( p_val6 * expval6 * trm8 - - (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); + expval7 = exp(-p_val7 * workspace->Delta_boc[j]); + trm8 = 1.0 + expval6 + expval7; + f8_Dj = p_val5 - ((p_val5 - 1.0) * (2.0 + expval6) / trm8); + Cf8j = ((1.0 - p_val5) / SQR(trm8)) * + (p_val6 * expval6 * trm8 - + (2.0 + expval6) * (p_val6*expval6 - p_val7*expval7)); - theta_0 = 180.0 - theta_00 * (1.0 - - exp(-p_val10 * (2.0 - SBO2))); - theta_0 = DEG2RAD( theta_0 ); + theta_0 = 180.0 - theta_00 * (1.0 - + exp(-p_val10 * (2.0 - SBO2))); + theta_0 = DEG2RAD(theta_0); - expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); - if (p_val1 >= 0) - expval12theta = p_val1 * (1.0 - expval2theta); - else // To avoid linear Me-H-Me angles (6/6/06) - expval12theta = p_val1 * -expval2theta; + expval2theta = exp(-p_val2 * SQR(theta_0 - theta)); + if (p_val1 >= 0) + expval12theta = p_val1 * (1.0 - expval2theta); + else // To avoid linear Me-H-Me angles (6/6/06) + expval12theta = p_val1 * -expval2theta; - CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; - CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; - CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; - CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * - expval2theta * (theta_0 - theta); + CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; + CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; + CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; + CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * + expval2theta * (theta_0 - theta); - Ctheta_0 = p_val10 * DEG2RAD(theta_00) * - exp( -p_val10 * (2.0 - SBO2) ); + Ctheta_0 = p_val10 * DEG2RAD(theta_00) * + exp(-p_val10 * (2.0 - SBO2)); - CEval5 = -CEval4 * Ctheta_0 * CSBO2; - CEval6 = CEval5 * dSBO1; - CEval7 = CEval5 * dSBO2; - CEval8 = -CEval4 / sin_theta; + CEval5 = -CEval4 * Ctheta_0 * CSBO2; + CEval6 = CEval5 * dSBO1; + CEval7 = CEval5 * dSBO2; + CEval8 = -CEval4 / sin_theta; - total_Eang += e_ang = - f7_ij * f7_jk * f8_Dj * expval12theta; - /* END ANGLE ENERGY*/ + total_Eang += e_ang = + f7_ij * f7_jk * f8_Dj * expval12theta; + /* END ANGLE ENERGY*/ - /* PENALTY ENERGY */ - p_pen1 = thbp->p_pen1; - p_pen2 = system->reax_param.gp.l[19]; - p_pen3 = system->reax_param.gp.l[20]; - p_pen4 = system->reax_param.gp.l[21]; + /* PENALTY ENERGY */ + p_pen1 = thbp->p_pen1; + p_pen2 = system->reax_param.gp.l[19]; + p_pen3 = system->reax_param.gp.l[20]; + p_pen4 = system->reax_param.gp.l[21]; - exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); - exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); - exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); - exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); - trm_pen34 = 1.0 + exp_pen3 + exp_pen4; - f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; - Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - - (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + - p_pen4 * exp_pen4 ) ) / - SQR( trm_pen34 ); + exp_pen2ij = exp(-p_pen2 * SQR(BOA_ij - 2.0)); + exp_pen2jk = exp(-p_pen2 * SQR(BOA_jk - 2.0)); + exp_pen3 = exp(-p_pen3 * workspace->Delta[j]); + exp_pen4 = exp( p_pen4 * workspace->Delta[j]); + trm_pen34 = 1.0 + exp_pen3 + exp_pen4; + f9_Dj = (2.0 + exp_pen3) / trm_pen34; + Cf9j = (-p_pen3 * exp_pen3 * trm_pen34 - + (2.0 + exp_pen3) * (-p_pen3 * exp_pen3 + + p_pen4 * exp_pen4)) / + SQR(trm_pen34); - total_Epen += e_pen = - p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; + total_Epen += e_pen = + p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; - CEpen1 = e_pen * Cf9j / f9_Dj; - temp = -2.0 * p_pen2 * e_pen; - CEpen2 = temp * (BOA_ij - 2.0); - CEpen3 = temp * (BOA_jk - 2.0); - /* END PENALTY ENERGY */ + CEpen1 = e_pen * Cf9j / f9_Dj; + temp = -2.0 * p_pen2 * e_pen; + CEpen2 = temp * (BOA_ij - 2.0); + CEpen3 = temp * (BOA_jk - 2.0); + /* END PENALTY ENERGY */ - /* COALITION ENERGY */ - p_coa1 = thbp->p_coa1; - p_coa2 = system->reax_param.gp.l[2]; - p_coa3 = system->reax_param.gp.l[38]; - p_coa4 = system->reax_param.gp.l[30]; + /* COALITION ENERGY */ + p_coa1 = thbp->p_coa1; + p_coa2 = system->reax_param.gp.l[2]; + p_coa3 = system->reax_param.gp.l[38]; + p_coa4 = system->reax_param.gp.l[30]; - exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); - total_Ecoa += e_coa = - p_coa1 / (1. + exp_coa2) * - exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * - exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * - exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * - exp( -p_coa4 * SQR(BOA_jk - 1.5) ); + exp_coa2 = exp(p_coa2 * workspace->Delta_val[j]); + total_Ecoa += e_coa = + p_coa1 / (1. + exp_coa2) * + exp(-p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij)) * + exp(-p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk)) * + exp(-p_coa4 * SQR(BOA_ij - 1.5)) * + exp(-p_coa4 * SQR(BOA_jk - 1.5)); - CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; - CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; - CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); - CEcoa4 = -2 * p_coa3 * - (workspace->total_bond_order[i]-BOA_ij) * e_coa; - CEcoa5 = -2 * p_coa3 * - (workspace->total_bond_order[k]-BOA_jk) * e_coa; - /* END COALITION ENERGY */ + CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; + CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; + CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); + CEcoa4 = -2 * p_coa3 * + (workspace->total_bond_order[i]-BOA_ij) * e_coa; + CEcoa5 = -2 * p_coa3 * + (workspace->total_bond_order[k]-BOA_jk) * e_coa; + /* END COALITION ENERGY */ - /* FORCES */ - bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); - workspace->CdDeltaReduction[reductionOffset+i] += CEcoa4; - workspace->CdDeltaReduction[reductionOffset+k] += CEcoa5; + /* FORCES */ + bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); + workspace->CdDeltaReduction[reductionOffset+i] += CEcoa4; + workspace->CdDeltaReduction[reductionOffset+k] += CEcoa5; - for (t = start_j; t < end_j; ++t) { - pbond_jt = &( bonds->select.bond_list[t] ); - bo_jt = &(pbond_jt->bo_data); - temp_bo_jt = bo_jt->BO; - temp = CUBE( temp_bo_jt ); - pBOjt7 = temp * temp * temp_bo_jt; + for (t = start_j; t < end_j; ++t) { + pbond_jt = &(bonds->select.bond_list[t]); + bo_jt = &(pbond_jt->bo_data); + temp_bo_jt = bo_jt->BO; + temp = CUBE(temp_bo_jt); + pBOjt7 = temp * temp * temp_bo_jt; - bo_jt->Cdbo += (CEval6 * pBOjt7); - bo_jt->Cdbopi += CEval5; - bo_jt->Cdbopi2 += CEval5; - } + bo_jt->Cdbo += (CEval6 * pBOjt7); + bo_jt->Cdbopi += CEval5; + bo_jt->Cdbopi2 += CEval5; + } - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+i], - CEval8, p_ijk->dcos_di ); - rvec_ScaledAdd( workspace->forceReduction[reductionOffset+k], - CEval8, p_ijk->dcos_dk ); - } else { - /* terms not related to bond order derivatives are - added directly into forces and pressure vector/tensor */ - rvec_Scale( force, CEval8, p_ijk->dcos_di ); - rvec_Add( workspace->forceReduction[reductionOffset+i], force ); + if (control->virial == 0) { + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], + CEval8, p_ijk->dcos_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEval8, p_ijk->dcos_dk); + } else { + /* terms not related to bond order derivatives are + added directly into forces and pressure vector/tensor */ + rvec_Scale(force, CEval8, p_ijk->dcos_di); + rvec_Add(workspace->forceReduction[reductionOffset+i], force); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - rvec_Scale( force, CEval8, p_ijk->dcos_dk ); - rvec_Add( workspace->forceReduction[reductionOffset+k], force ); - } + rvec_Scale(force, CEval8, p_ijk->dcos_dk); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); + } - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - /* Acquire vectors */ - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, - -1., system->my_atoms[j].x ); + /* Acquire vectors */ + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[k].x, + -1., system->my_atoms[j].x); - rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); - rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); + rvec_Scale(fi_tmp, -CEval8, p_ijk->dcos_di); + rvec_Scale(fj_tmp, -CEval8, p_ijk->dcos_dj); + rvec_Scale(fk_tmp, -CEval8, p_ijk->dcos_dk); - eng_tmp = e_ang + e_pen + e_coa; + eng_tmp = e_ang + e_pen + e_coa; - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, - eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - if (system->pair_ptr->vflag_atom) - // NEED TO MAKE AN OMP VERSION OF THIS CALL! - system->pair_ptr->v_tally3( i, j, k, fi_tmp, fk_tmp, delij, delkj); - } + if (system->pair_ptr->evflag) + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, + eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + if (system->pair_ptr->vflag_atom) + // NEED TO MAKE AN OMP VERSION OF THIS CALL! + system->pair_ptr->v_tally3(i, j, k, fi_tmp, fk_tmp, delij, delkj); + } - } // if (p_val1>0.001) - } // for (cnt) - } // if (j0) - } // for (pk) - } // if (BOA_ij>0) + } // if (p_val1>0.001) + } // for (cnt) + } // if (j0) + } // for (pk) + } // if (BOA_ij>0) - Set_End_Index(pi, my_offset, thb_intrs ); - } // for (pi) - } // for (j) - } // end omp parallel + Set_End_Index(pi, my_offset, thb_intrs); + } // for (pi) + } // for (j) + } // end omp parallel - data->my_en.e_ang = total_Eang; - data->my_en.e_pen = total_Epen; - data->my_en.e_coa = total_Ecoa; + data->my_en.e_ang = total_Eang; + data->my_en.e_pen = total_Epen; + data->my_en.e_coa = total_Ecoa; - if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { - workspace->realloc.num_3body = num_thb_intrs * TWICE; - if (num_thb_intrs > thb_intrs->num_intrs) - control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " - "angle_list: top={}, max={}", - data->step, num_thb_intrs, - thb_intrs->num_intrs)); + if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { + workspace->realloc.num_3body = num_thb_intrs * TWICE; + if (num_thb_intrs > thb_intrs->num_intrs) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list: top={}, max={}", + data->step, num_thb_intrs, + thb_intrs->num_intrs)); + } } - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEVALENCEANGLESBOINDEX] += (endTimeBase-startTimeBase); -#endif } diff --git a/src/USER-OMP/reaxc_valence_angles_omp.h b/src/USER-OMP/reaxc_valence_angles_omp.h deleted file mode 100644 index 5a8d992b0d..0000000000 --- a/src/USER-OMP/reaxc_valence_angles_omp.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd - - Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __VALENCE_ANGLES_OMP_H_ -#define __VALENCE_ANGLES_OMP_H_ - -#include "reaxc_types.h" - -void Valence_AnglesOMP( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -void Calculate_dCos_ThetaOMP( rvec, double, rvec, double, rvec*, rvec*, rvec* ); - -#endif diff --git a/src/USER-OMP/reaxff_omp.h b/src/USER-OMP/reaxff_omp.h index f6ca7116ca..630fe07a43 100644 --- a/src/USER-OMP/reaxff_omp.h +++ b/src/USER-OMP/reaxff_omp.h @@ -23,53 +23,84 @@ #include "reaxff_types.h" -namespace ReaxFF -{ - // uncomment to enabled collecting ReaxFF OpenMP timing data - // #define OMP_TIMING 1 - -#ifdef OMP_TIMING - // pkcoff timing fields - enum { COMPUTEINDEX=0, - COMPUTEWLINDEX, - COMPUTEBFINDEX, - COMPUTEQEQINDEX, - COMPUTENBFINDEX, - COMPUTEIFINDEX, - COMPUTETFINDEX, - COMPUTEBOINDEX, - COMPUTEBONDSINDEX, - COMPUTEATOMENERGYINDEX, - COMPUTEVALENCEANGLESBOINDEX, - COMPUTETORSIONANGLESBOINDEX, - COMPUTEHBONDSINDEX, - COMPUTECG1INDEX, - COMPUTECG2INDEX, - COMPUTECGCOMPUTEINDEX, - COMPUTECALCQINDEX, - COMPUTEINITMVINDEX, - COMPUTEMVCOMPINDEX, - LASTTIMINGINDEX - }; - - extern double ompTimingData[LASTTIMINGINDEX]; - extern int ompTimingCount[LASTTIMINGINDEX]; - extern int ompTimingCGCount[LASTTIMINGINDEX]; +#if defined(_OPENMP) +#include #endif +namespace ReaxFF +{ // exported Functions + // bond orders OpenMP + + extern void Add_dBond_to_ForcesOMP(reax_system *, int, int, storage *, reax_list **); + extern void Add_dBond_to_Forces_NPTOMP(reax_system *, int, int, storage *, reax_list **); + extern int BOp_OMP(storage *, reax_list *, double, int, int, far_neighbor_data *, + single_body_parameters *, single_body_parameters *, + two_body_parameters *, int, double, double, double, + double, double, double, double); + + extern void BOOMP(reax_system *, control_params *, simulation_data *, + storage *, reax_list **, output_controls *); + + // bonds OpenMP + + extern void BondsOMP(reax_system *, simulation_data *, + storage *, reax_list **); + // forces OpenMP extern void Compute_ForcesOMP(reax_system *, control_params *, simulation_data *, storage *, reax_list **, output_controls *); + // hydrogen bonds + + extern void Hydrogen_BondsOMP(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); + // init md OpenMP extern void InitializeOMP(reax_system *, control_params *, simulation_data *, storage *, reax_list **, output_controls *, MPI_Comm); + + // multi body + + extern void Atom_EnergyOMP(reax_system *, simulation_data *, storage *, reax_list **); + + // nonbonded + + extern void vdW_Coulomb_Energy_OMP(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); + extern void Tabulated_vdW_Coulomb_Energy_OMP(reax_system *, control_params *, + simulation_data *, storage *, + reax_list **); + extern void LR_vdW_CoulombOMP(reax_system *, storage *, control_params *, + int, int, double, LR_data *); + + // torsion angles + + extern void Torsion_AnglesOMP(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); + + // valence angles + + extern void Calculate_ThetaOMP(rvec, double, rvec, double, double *, double *); + extern void Calculate_dCos_ThetaOMP(rvec, double, rvec, double, + rvec *, rvec *, rvec *); + extern void Valence_AnglesOMP(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + + // OpenMP helpers + + inline int get_tid() { +#if defined(_OPENMP) + return omp_get_thread_num(); +#else + return 0; +#endif + } } #endif diff --git a/src/USER-REAXC/fix_reaxc_species.cpp b/src/USER-REAXC/fix_reaxc_species.cpp index 8128b23662..2f7029e960 100644 --- a/src/USER-REAXC/fix_reaxc_species.cpp +++ b/src/USER-REAXC/fix_reaxc_species.cpp @@ -28,12 +28,12 @@ #include "modify.h" #include "neigh_list.h" #include "neighbor.h" -#include "pair_reaxc.h" #include "update.h" -#include +#include "pair_reaxc.h" +#include "reaxff_defs.h" -#include "reaxc_defs.h" +#include using namespace LAMMPS_NS; using namespace FixConst; diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index a1772f9551..aa445d765d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -417,7 +417,7 @@ void PairReaxC::setup() // initialize my data structures - PreAllocate_Space(api->system, api->control, api->workspace); + PreAllocate_Space(api->system, api->workspace); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); @@ -430,7 +430,8 @@ void PairReaxC::setup() write_reax_lists(); api->system->wsize = comm->nprocs; - Initialize(api->system, api->control, api->data, api->workspace, &api->lists, api->out_control, world); + Initialize(api->system, api->control, api->data, api->workspace, + &api->lists, api->out_control, world); for (int k = 0; k < api->system->N; ++k) { num_bonds[k] = api->system->my_atoms[k].num_bonds; num_hbonds[k] = api->system->my_atoms[k].num_hbonds; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 3d68bb6944..143da54849 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -24,344 +24,312 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_allocate.h" -#include -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_tool_box.h" - -#if defined(LMP_USER_OMP) && defined(_OPENMP) -#include -#endif +#include "reaxff_api.h" #include "error.h" -/* allocate space for my_atoms - important: we cannot know the exact number of atoms that will fall into a - process's box throughout the whole simulation. therefore - we need to make upper bound estimates for various data structures */ -int PreAllocate_Space( reax_system *system, control_params * /*control*/, - storage * workspace ) -{ - int mincap = system->mincap; - double safezone = system->safezone; +namespace ReaxFF { - // determine the local and total capacity + /* allocate space for my_atoms + important: we cannot know the exact number of atoms that will fall into a + process's box throughout the whole simulation. therefore + we need to make upper bound estimates for various data structures */ + void PreAllocate_Space(reax_system *system, storage * workspace) + { + const int mincap = system->mincap; + const double safezone = system->safezone; - system->local_cap = MAX( (int)(system->n * safezone), mincap ); - system->total_cap = MAX( (int)(system->N * safezone), mincap ); + // determine the local and total capacity - system->my_atoms = (reax_atom*) - scalloc(system->error_ptr, system->total_cap, sizeof(reax_atom), "my_atoms"); + system->local_cap = MAX((int)(system->n * safezone), mincap); + system->total_cap = MAX((int)(system->N * safezone), mincap); - // Nullify some arrays only used in omp styles - // Should be safe to do here since called in pair->setup(); -#ifdef LMP_USER_OMP - workspace->CdDeltaReduction = nullptr; - workspace->forceReduction = nullptr; - workspace->valence_angle_atom_myoffset = nullptr; -#else - LMP_UNUSED_PARAM(workspace); -#endif + system->my_atoms = (reax_atom*) scalloc(system->error_ptr, + system->total_cap, sizeof(reax_atom), "my_atoms"); - return SUCCESS; -} + // Nullify some arrays only used in omp styles + // Should be safe to do here since called in pair->setup(); + workspace->CdDeltaReduction = nullptr; + workspace->forceReduction = nullptr; + workspace->valence_angle_atom_myoffset = nullptr; + } -/************* system *************/ + /************* system *************/ -void DeAllocate_System( reax_system *system ) -{ - int i, j, k; - int ntypes; - reax_interaction *ff_params; + void DeAllocate_System(reax_system *system) + { + int i, j, k; + int ntypes; + reax_interaction *ff_params; + auto error = system->error_ptr; - // deallocate the atom list - sfree(system->error_ptr, system->my_atoms, "system->my_atoms" ); + // deallocate the atom list + sfree(error, system->my_atoms, "system->my_atoms"); - // deallocate the ffield parameters storage - ff_params = &(system->reax_param); - ntypes = ff_params->num_atom_types; + // deallocate the ffield parameters storage + ff_params = &(system->reax_param); + ntypes = ff_params->num_atom_types; - sfree(system->error_ptr, ff_params->gp.l, "ff:globals" ); + sfree(error, ff_params->gp.l, "ff:globals"); - for (i = 0; i < ntypes; ++i) { - for (j = 0; j < ntypes; ++j) { - for (k = 0; k < ntypes; ++k) { - sfree(system->error_ptr, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]" ); + for (i = 0; i < ntypes; ++i) { + for (j = 0; j < ntypes; ++j) { + for (k = 0; k < ntypes; ++k) { + sfree(error, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]"); + } + sfree(error, ff_params->fbp[i][j], "ff:fbp[i,j]"); + sfree(error, ff_params->thbp[i][j], "ff:thbp[i,j]"); + sfree(error, ff_params->hbp[i][j], "ff:hbp[i,j]"); } - sfree(system->error_ptr, ff_params->fbp[i][j], "ff:fbp[i,j]" ); - sfree(system->error_ptr, ff_params->thbp[i][j], "ff:thbp[i,j]" ); - sfree(system->error_ptr, ff_params->hbp[i][j], "ff:hbp[i,j]" ); + sfree(error, ff_params->fbp[i], "ff:fbp[i]"); + sfree(error, ff_params->thbp[i], "ff:thbp[i]"); + sfree(error, ff_params->hbp[i], "ff:hbp[i]"); + sfree(error, ff_params->tbp[i], "ff:tbp[i]"); } - sfree(system->error_ptr, ff_params->fbp[i], "ff:fbp[i]" ); - sfree(system->error_ptr, ff_params->thbp[i], "ff:thbp[i]" ); - sfree(system->error_ptr, ff_params->hbp[i], "ff:hbp[i]" ); - sfree(system->error_ptr, ff_params->tbp[i], "ff:tbp[i]" ); + sfree(error, ff_params->fbp, "ff:fbp"); + sfree(error, ff_params->thbp, "ff:thbp"); + sfree(error, ff_params->hbp, "ff:hbp"); + sfree(error, ff_params->tbp, "ff:tbp"); + sfree(error, ff_params->sbp, "ff:sbp"); } - sfree(system->error_ptr, ff_params->fbp, "ff:fbp" ); - sfree(system->error_ptr, ff_params->thbp, "ff:thbp" ); - sfree(system->error_ptr, ff_params->hbp, "ff:hbp" ); - sfree(system->error_ptr, ff_params->tbp, "ff:tbp" ); - sfree(system->error_ptr, ff_params->sbp, "ff:sbp" ); -} + /************* workspace *************/ + void DeAllocate_Workspace(control_params *control, storage *workspace) + { + if (!workspace->allocated) + return; -/************* workspace *************/ -void DeAllocate_Workspace( control_params * control, storage *workspace ) -{ - if (!workspace->allocated) - return; + workspace->allocated = 0; + auto error = control->error_ptr; - workspace->allocated = 0; + /* bond order storage */ + sfree(error, workspace->total_bond_order, "total_bo"); + sfree(error, workspace->Deltap, "Deltap"); + sfree(error, workspace->Deltap_boc, "Deltap_boc"); + sfree(error, workspace->dDeltap_self, "dDeltap_self"); + sfree(error, workspace->Delta, "Delta"); + sfree(error, workspace->Delta_lp, "Delta_lp"); + sfree(error, workspace->Delta_lp_temp, "Delta_lp_temp"); + sfree(error, workspace->dDelta_lp, "dDelta_lp"); + sfree(error, workspace->dDelta_lp_temp, "dDelta_lp_temp"); + sfree(error, workspace->Delta_e, "Delta_e"); + sfree(error, workspace->Delta_boc, "Delta_boc"); + sfree(error, workspace->Delta_val, "Delta_val"); + sfree(error, workspace->nlp, "nlp"); + sfree(error, workspace->nlp_temp, "nlp_temp"); + sfree(error, workspace->Clp, "Clp"); + sfree(error, workspace->vlpex, "vlpex"); + sfree(error, workspace->bond_mark, "bond_mark"); - /* bond order storage */ - sfree(control->error_ptr, workspace->total_bond_order, "total_bo" ); - sfree(control->error_ptr, workspace->Deltap, "Deltap" ); - sfree(control->error_ptr, workspace->Deltap_boc, "Deltap_boc" ); - sfree(control->error_ptr, workspace->dDeltap_self, "dDeltap_self" ); - sfree(control->error_ptr, workspace->Delta, "Delta" ); - sfree(control->error_ptr, workspace->Delta_lp, "Delta_lp" ); - sfree(control->error_ptr, workspace->Delta_lp_temp, "Delta_lp_temp" ); - sfree(control->error_ptr, workspace->dDelta_lp, "dDelta_lp" ); - sfree(control->error_ptr, workspace->dDelta_lp_temp, "dDelta_lp_temp" ); - sfree(control->error_ptr, workspace->Delta_e, "Delta_e" ); - sfree(control->error_ptr, workspace->Delta_boc, "Delta_boc" ); - sfree(control->error_ptr, workspace->Delta_val, "Delta_val" ); - sfree(control->error_ptr, workspace->nlp, "nlp" ); - sfree(control->error_ptr, workspace->nlp_temp, "nlp_temp" ); - sfree(control->error_ptr, workspace->Clp, "Clp" ); - sfree(control->error_ptr, workspace->vlpex, "vlpex" ); - sfree(control->error_ptr, workspace->bond_mark, "bond_mark" ); + /* force related storage */ + sfree(error, workspace->f, "f"); + sfree(error, workspace->CdDelta, "CdDelta"); - /* force related storage */ - sfree(control->error_ptr, workspace->f, "f" ); - sfree(control->error_ptr, workspace->CdDelta, "CdDelta" ); + /* reductions */ - /* reductions */ -#ifdef LMP_USER_OMP - if (workspace->CdDeltaReduction) sfree(control->error_ptr, workspace->CdDeltaReduction, "cddelta_reduce" ); - if (workspace->forceReduction) sfree(control->error_ptr, workspace->forceReduction, "f_reduce" ); - if (workspace->valence_angle_atom_myoffset) sfree(control->error_ptr, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); -#endif -} - -void Allocate_Workspace( control_params *control, storage *workspace, int total_cap) -{ - int total_real, total_rvec; - - workspace->allocated = 1; - total_real = total_cap * sizeof(double); - total_rvec = total_cap * sizeof(rvec); - - /* bond order related storage */ - workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo"); - workspace->Deltap = (double*) smalloc(control->error_ptr, total_real, "Deltap"); - workspace->Deltap_boc = (double*) smalloc(control->error_ptr, total_real, "Deltap_boc"); - workspace->dDeltap_self = (rvec*) smalloc(control->error_ptr, total_rvec, "dDeltap_self"); - workspace->Delta = (double*) smalloc(control->error_ptr, total_real, "Delta"); - workspace->Delta_lp = (double*) smalloc(control->error_ptr, total_real, "Delta_lp"); - workspace->Delta_lp_temp = (double*) - smalloc(control->error_ptr, total_real, "Delta_lp_temp"); - workspace->dDelta_lp = (double*) smalloc(control->error_ptr, total_real, "dDelta_lp"); - workspace->dDelta_lp_temp = (double*) - smalloc(control->error_ptr, total_real, "dDelta_lp_temp"); - workspace->Delta_e = (double*) smalloc(control->error_ptr, total_real, "Delta_e"); - workspace->Delta_boc = (double*) smalloc(control->error_ptr, total_real, "Delta_boc"); - workspace->Delta_val = (double*) smalloc(control->error_ptr, total_real, "Delta_val"); - workspace->nlp = (double*) smalloc(control->error_ptr, total_real, "nlp"); - workspace->nlp_temp = (double*) smalloc(control->error_ptr, total_real, "nlp_temp"); - workspace->Clp = (double*) smalloc(control->error_ptr, total_real, "Clp"); - workspace->vlpex = (double*) smalloc(control->error_ptr, total_real, "vlpex"); - workspace->bond_mark = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark"); - - /* force related storage */ - workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f"); - workspace->CdDelta = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "CdDelta"); - - // storage for reductions with multiple threads -#ifdef LMP_USER_OMP - workspace->CdDeltaReduction = (double *) scalloc(control->error_ptr, sizeof(double), (rc_bigint)total_cap*control->nthreads, - "cddelta_reduce"); - - workspace->forceReduction = (rvec *) scalloc(control->error_ptr, sizeof(rvec), (rc_bigint)total_cap*control->nthreads, - "forceReduction"); - - workspace->valence_angle_atom_myoffset = (int *) scalloc(control->error_ptr, sizeof(int), total_cap, "valence_angle_atom_myoffset"); -#else - LMP_UNUSED_PARAM(control); -#endif -} - - -static void Reallocate_Neighbor_List( reax_list *far_nbrs, int n, - int num_intrs ) -{ - Delete_List( far_nbrs); - if (!Make_List( n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs )) { - far_nbrs->error_ptr->one(FLERR,"Problem in initializing far neighbors list"); + if (workspace->CdDeltaReduction) + sfree(error, workspace->CdDeltaReduction, "cddelta_reduce"); + if (workspace->forceReduction) + sfree(error, workspace->forceReduction, "f_reduce"); + if (workspace->valence_angle_atom_myoffset) + sfree(error, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + } + + void Allocate_Workspace(control_params *control, storage *workspace, int total_cap) + { + int total_real, total_rvec; + auto error = control->error_ptr; + + workspace->allocated = 1; + total_real = total_cap * sizeof(double); + total_rvec = total_cap * sizeof(rvec); + + /* bond order related storage */ + workspace->total_bond_order = (double*) smalloc(error, total_real, "total_bo"); + workspace->Deltap = (double*) smalloc(error, total_real, "Deltap"); + workspace->Deltap_boc = (double*) smalloc(error, total_real, "Deltap_boc"); + workspace->dDeltap_self = (rvec*) smalloc(error, total_rvec, "dDeltap_self"); + workspace->Delta = (double*) smalloc(error, total_real, "Delta"); + workspace->Delta_lp = (double*) smalloc(error, total_real, "Delta_lp"); + workspace->Delta_lp_temp = (double*) smalloc(error, total_real, "Delta_lp_temp"); + workspace->dDelta_lp = (double*) smalloc(error, total_real, "dDelta_lp"); + workspace->dDelta_lp_temp = (double*) smalloc(error, total_real, "dDelta_lp_temp"); + workspace->Delta_e = (double*) smalloc(error, total_real, "Delta_e"); + workspace->Delta_boc = (double*) smalloc(error, total_real, "Delta_boc"); + workspace->Delta_val = (double*) smalloc(error, total_real, "Delta_val"); + workspace->nlp = (double*) smalloc(error, total_real, "nlp"); + workspace->nlp_temp = (double*) smalloc(error, total_real, "nlp_temp"); + workspace->Clp = (double*) smalloc(error, total_real, "Clp"); + workspace->vlpex = (double*) smalloc(error, total_real, "vlpex"); + workspace->bond_mark = (int*) scalloc(error, total_cap, sizeof(int), "bond_mark"); + + /* force related storage */ + workspace->f = (rvec*) scalloc(error, total_cap, sizeof(rvec), "f"); + workspace->CdDelta = (double*) scalloc(error, total_cap, sizeof(double), "CdDelta"); + + // storage for reductions with multiple threads + + workspace->CdDeltaReduction = (double *) scalloc(error, + sizeof(double), (rc_bigint)total_cap*control->nthreads, "cddelta_reduce"); + workspace->forceReduction = (rvec *) scalloc(error, + sizeof(rvec), (rc_bigint)total_cap*control->nthreads, "forceReduction"); + workspace->valence_angle_atom_myoffset = (int *) scalloc(error, + sizeof(int), total_cap, "valence_angle_atom_myoffset"); } -} -static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds ) -{ - int i, total_hbonds; - - int mincap = system->mincap; - double saferzone = system->saferzone; - - total_hbonds = 0; - for (i = 0; i < system->n; ++i) - if ((system->my_atoms[i].Hindex) >= 0) { - total_hbonds += system->my_atoms[i].num_hbonds; + static void Reallocate_Neighbor_List(reax_list *far_nbrs, int n, int num_intrs) + { + Delete_List(far_nbrs); + if (!Make_List(n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs)) { + far_nbrs->error_ptr->one(FLERR,"Problem in initializing far neighbors list"); } - total_hbonds = (int)(MAX(total_hbonds*saferzone, mincap*system->minhbonds)); - - Delete_List( hbonds); - if (!Make_List( system->Hcap, total_hbonds, TYP_HBOND, hbonds )) { - hbonds->error_ptr->one(FLERR, "Not enough space for hydrogen bonds list"); } - return total_hbonds; -} + static int Reallocate_HBonds_List(reax_system *system, reax_list *hbonds) + { + int i, total_hbonds; + int mincap = system->mincap; + double saferzone = system->saferzone; -static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, - int *total_bonds, int *est_3body ) -{ - int i; + total_hbonds = 0; + for (i = 0; i < system->n; ++i) + if ((system->my_atoms[i].Hindex) >= 0) { + total_hbonds += system->my_atoms[i].num_hbonds; + } + total_hbonds = (int)(MAX(total_hbonds*saferzone, mincap*system->minhbonds)); - int mincap = system->mincap; - double safezone = system->safezone; + Delete_List(hbonds); + if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, hbonds)) { + hbonds->error_ptr->one(FLERR, "Not enough space for hydrogen bonds list"); + } - *total_bonds = 0; - *est_3body = 0; - for (i = 0; i < system->N; ++i) { - *est_3body += SQR(system->my_atoms[i].num_bonds); - *total_bonds += system->my_atoms[i].num_bonds; - } - *total_bonds = (int)(MAX( *total_bonds * safezone, mincap*MIN_BONDS )); - -#ifdef LMP_USER_OMP - if (system->omp_active) - for (i = 0; i < bonds->num_intrs; ++i) - sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); -#endif - - Delete_List( bonds); - if (!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds)) { - bonds->error_ptr->one(FLERR, "Not enough space for bonds list"); + return total_hbonds; } -#ifdef LMP_USER_OMP -#if defined(_OPENMP) - int nthreads = omp_get_num_threads(); -#else - int nthreads = 1; -#endif + static int Reallocate_Bonds_List(control_params *control, reax_system *system, + reax_list *bonds, int *total_bonds, int *est_3body) + { + int i; - if (system->omp_active) - for (i = 0; i < bonds->num_intrs; ++i) - bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(system->error_ptr, sizeof(double)*nthreads, "CdboReduction"); -#endif + int mincap = system->mincap; + double safezone = system->safezone; - return SUCCESS; -} + *total_bonds = 0; + *est_3body = 0; + for (i = 0; i < system->N; ++i) { + *est_3body += SQR(system->my_atoms[i].num_bonds); + *total_bonds += system->my_atoms[i].num_bonds; + } + *total_bonds = (int)(MAX(*total_bonds * safezone, mincap*MIN_BONDS)); + if (system->omp_active) + for (i = 0; i < bonds->num_intrs; ++i) + sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); -void ReAllocate( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, reax_list **lists ) -{ - auto error = system->error_ptr; - int num_bonds, est_3body, Hflag; - int newsize; - reallocate_data *wsr; - reax_list *far_nbrs; + Delete_List(bonds); + if (!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds)) { + bonds->error_ptr->one(FLERR, "Not enough space for bonds list"); + } - int mincap = system->mincap; - double safezone = system->safezone; - double saferzone = system->saferzone; + if (system->omp_active) + for (i = 0; i < bonds->num_intrs; ++i) + bonds->select.bond_list[i].bo_data.CdboReduction = + (double*) smalloc(system->error_ptr, sizeof(double)*control->nthreads, "CdboReduction"); - wsr = &(workspace->realloc); - - if ( system->n >= DANGER_ZONE * system->local_cap || - (0 && system->n <= LOOSE_ZONE * system->local_cap)) { - system->local_cap = MAX( (int)(system->n * safezone), mincap ); + return SUCCESS; } - int Nflag = 0; - if ( system->N >= DANGER_ZONE * system->total_cap || - (0 && system->N <= LOOSE_ZONE * system->total_cap)) { - Nflag = 1; - system->total_cap = MAX( (int)(system->N * safezone), mincap ); - } + void ReAllocate(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists) + { + int num_bonds, est_3body, Hflag; + int newsize; + reax_list *far_nbrs; - if (Nflag) { - /* system */ - system->my_atoms = (reax_atom *)::realloc(system->my_atoms, - system->total_cap*sizeof(reax_atom)); - /* workspace */ - DeAllocate_Workspace(control, workspace); - Allocate_Workspace(control, workspace, system->total_cap); - } + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; - /* far neighbors */ + auto error = system->error_ptr; + reallocate_data *wsr = &(workspace->realloc); - far_nbrs = *lists + FAR_NBRS; + if (system->n >= DANGER_ZONE * system->local_cap || + (0 && system->n <= LOOSE_ZONE * system->local_cap)) { + system->local_cap = MAX((int)(system->n * safezone), mincap); + } - if (Nflag || wsr->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { - if (wsr->num_far > far_nbrs->num_intrs) - error->one(FLERR,fmt::format("step{}: ran out of space on far_nbrs: top={}, max={}", + int Nflag = 0; + if (system->N >= DANGER_ZONE * system->total_cap || + (0 && system->N <= LOOSE_ZONE * system->total_cap)) { + Nflag = 1; + system->total_cap = MAX((int)(system->N * safezone), mincap); + } + + if (Nflag) { + /* system */ + system->my_atoms = (reax_atom *)::realloc(system->my_atoms, + system->total_cap*sizeof(reax_atom)); + /* workspace */ + DeAllocate_Workspace(control, workspace); + Allocate_Workspace(control, workspace, system->total_cap); + } + + /* far neighbors */ + + far_nbrs = *lists + FAR_NBRS; + + if (Nflag || wsr->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { + if (wsr->num_far > far_nbrs->num_intrs) + error->one(FLERR,fmt::format("step{}: ran out of space on far_nbrs: top={}, max={}", data->step, wsr->num_far, far_nbrs->num_intrs)); - newsize = static_cast - (MAX( wsr->num_far*safezone, mincap*REAX_MIN_NBRS)); + newsize = static_cast + (MAX(wsr->num_far*safezone, mincap*REAX_MIN_NBRS)); - Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize); - wsr->num_far = 0; - } - - /* hydrogen bonds list */ - if (control->hbond_cut > 0) { - Hflag = 0; - if ( system->numH >= DANGER_ZONE * system->Hcap || - (0 && system->numH <= LOOSE_ZONE * system->Hcap)) { - Hflag = 1; - system->Hcap = int(MAX( system->numH * saferzone, mincap )); + Reallocate_Neighbor_List(far_nbrs, system->total_cap, newsize); + wsr->num_far = 0; } - if (Hflag || wsr->hbonds) { - Reallocate_HBonds_List( system, (*lists)+HBONDS); - wsr->hbonds = 0; + /* hydrogen bonds list */ + if (control->hbond_cut > 0) { + Hflag = 0; + if (system->numH >= DANGER_ZONE * system->Hcap || + (0 && system->numH <= LOOSE_ZONE * system->Hcap)) { + Hflag = 1; + system->Hcap = int(MAX(system->numH * saferzone, mincap)); + } + + if (Hflag || wsr->hbonds) { + Reallocate_HBonds_List(system, (*lists)+HBONDS); + wsr->hbonds = 0; + } } - } - /* bonds list */ - num_bonds = est_3body = -1; - if (Nflag || wsr->bonds) { - Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, - &est_3body); - wsr->bonds = 0; - wsr->num_3body = MAX( wsr->num_3body, est_3body ) * 2; - } - - /* 3-body list */ - if (wsr->num_3body > 0) { - Delete_List( (*lists)+THREE_BODIES); - - if (num_bonds == -1) - num_bonds = ((*lists)+BONDS)->num_intrs; - - wsr->num_3body = (int)(MAX(wsr->num_3body*safezone, MIN_3BODIES)); - - if ( !Make_List( num_bonds, wsr->num_3body, TYP_THREE_BODY, - (*lists)+THREE_BODIES )) { - error->one(FLERR, "Problem in initializing angles list"); + /* bonds list */ + num_bonds = est_3body = -1; + if (Nflag || wsr->bonds) { + Reallocate_Bonds_List(control, system, (*lists)+BONDS, &num_bonds, &est_3body); + wsr->bonds = 0; + wsr->num_3body = MAX(wsr->num_3body, est_3body) * 2; + } + + /* 3-body list */ + if (wsr->num_3body > 0) { + Delete_List((*lists)+THREE_BODIES); + + if (num_bonds == -1) + num_bonds = ((*lists)+BONDS)->num_intrs; + + wsr->num_3body = (int)(MAX(wsr->num_3body*safezone, MIN_3BODIES)); + + if (!Make_List(num_bonds, wsr->num_3body, TYP_THREE_BODY, + (*lists)+THREE_BODIES)) { + error->one(FLERR, "Problem in initializing angles list"); + } + wsr->num_3body = -1; } - wsr->num_3body = -1; } } diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h deleted file mode 100644 index 7229927b57..0000000000 --- a/src/USER-REAXC/reaxc_allocate.h +++ /dev/null @@ -1,41 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __ALLOCATE_H_ -#define __ALLOCATE_H_ - -#include "reaxc_types.h" - -int PreAllocate_Space(reax_system *, control_params *, storage *); - -void DeAllocate_System(reax_system *); - -void Allocate_Workspace(control_params *, storage *, int); -void DeAllocate_Workspace(control_params *, storage *); - -void ReAllocate(reax_system *, control_params *, simulation_data *, - storage*, reax_list**); -#endif diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index 0c26784ccb..ae6fc3b823 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -24,555 +24,543 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_bond_orders.h" -#include +#include "reaxff_api.h" + #include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" -void Add_dBond_to_Forces_NPT( int i, int pj, - storage *workspace, reax_list **lists ) -{ - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - rvec temp; - int pk, k, j; +#include - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); +namespace ReaxFF { + void Add_dBond_to_Forces_NPT( int i, int pj, storage *workspace, reax_list **lists ) + { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + rvec temp; + int pk, k, j; - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; + coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ - rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ + for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ + rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ + rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ + + /* force */ + rvec_Add( workspace->f[k], temp ); + } + + /* then atom i itself */ + rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ + rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ + rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ /* force */ - rvec_Add( workspace->f[k], temp ); - } + rvec_Add( workspace->f[i], temp ); - /* then atom i itself */ - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ + rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ + rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ - /* force */ - rvec_Add( workspace->f[i], temp ); + /* force */ + rvec_Add( workspace->f[k], temp ); + } - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; + /* then atom j itself */ + rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ + rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ + rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ + rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ + rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ + rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ + rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ /* force */ - rvec_Add( workspace->f[k], temp ); + rvec_Add( workspace->f[j], temp ); } - /* then atom j itself */ - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ + void Add_dBond_to_Forces( reax_system *system, int i, int pj, + storage *workspace, reax_list **lists ) + { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + int pk, k, j; - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + /* Virial Tallying variables */ + rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ - rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); - /* force */ - rvec_Add( workspace->f[j], temp ); -} + coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); -void Add_dBond_to_Forces( reax_system *system, int i, int pj, - storage *workspace, reax_list **lists ) -{ - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - int pk, k, j; + coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - /* Virial Tallying variables */ - rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; + coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - - // forces on i - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] ); - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]); - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] ); - rvec_Add( workspace->f[i], temp ); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fi_tmp, -1.0, temp); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); - system->pair_ptr->v_tally(i,fi_tmp,delij); - } - - // forces on j - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]); - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]); - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C4dbopi2, workspace->dDeltap_self[j]); - rvec_Add( workspace->f[j], temp ); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fj_tmp, -1.0, temp); - rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); - system->pair_ptr->v_tally(j,fj_tmp,delji); - } - - // forces on k: i neighbor - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); - rvec_Add( workspace->f[k], temp ); + // forces on i + rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); + rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] ); + rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]); + rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] ); + rvec_Add( workspace->f[i], temp ); if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - system->pair_ptr->v_tally(k,fk_tmp,delki); - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - system->pair_ptr->v_tally(k,fk_tmp,delkj); + rvec_Scale(fi_tmp, -1.0, temp); + rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); + system->pair_ptr->v_tally(i,fi_tmp,delij); + } + + // forces on j + rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); + rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]); + rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); + rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]); + rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); + rvec_ScaledAdd( temp, coef.C4dbopi2, workspace->dDeltap_self[j]); + rvec_Add( workspace->f[j], temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fj_tmp, -1.0, temp); + rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); + system->pair_ptr->v_tally(j,fj_tmp,delji); + } + + // forces on k: i neighbor + for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); + rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); + rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); + rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + rvec_Add( workspace->f[k], temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + system->pair_ptr->v_tally(k,fk_tmp,delki); + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + system->pair_ptr->v_tally(k,fk_tmp,delkj); + } + } + + // forces on k: j neighbor + for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); + rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); + rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); + rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + rvec_Add( workspace->f[k], temp ); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + system->pair_ptr->v_tally(k,fk_tmp,delki); + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + system->pair_ptr->v_tally(k,fk_tmp,delkj); + } } } - // forces on k: j neighbor - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; + int BOp(storage *workspace, reax_list *bonds, double bo_cut, + int i, int btop_i, far_neighbor_data *nbr_pj, + single_body_parameters *sbp_i, single_body_parameters *sbp_j, + two_body_parameters *twbp) { + int j, btop_j; + double r2, C12, C34, C56; + double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; + double BO, BO_s, BO_pi, BO_pi2; + bond_data *ibond, *jbond; + bond_order_data *bo_ij, *bo_ji; - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); - rvec_Add( workspace->f[k], temp ); + j = nbr_pj->nbr; + r2 = SQR(nbr_pj->d); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - system->pair_ptr->v_tally(k,fk_tmp,delki); - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - system->pair_ptr->v_tally(k,fk_tmp,delkj); + if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { + C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 ); + BO_s = (1.0 + bo_cut) * exp( C12 ); + } else BO_s = C12 = 0.0; + + if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { + C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 ); + BO_pi = exp( C34 ); + } else BO_pi = C34 = 0.0; + + if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { + C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 ); + BO_pi2= exp( C56 ); + } else BO_pi2 = C56 = 0.0; + + /* Initially BO values are the uncorrected ones, page 1 */ + BO = BO_s + BO_pi + BO_pi2; + + if (BO >= bo_cut) { + /****** bonds i-j and j-i ******/ + ibond = &( bonds->select.bond_list[btop_i] ); + btop_j = End_Index( j, bonds ); + jbond = &(bonds->select.bond_list[btop_j]); + + ibond->nbr = j; + jbond->nbr = i; + ibond->d = nbr_pj->d; + jbond->d = nbr_pj->d; + rvec_Copy( ibond->dvec, nbr_pj->dvec ); + rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); + ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); + ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); + ibond->dbond_index = btop_i; + jbond->dbond_index = btop_i; + ibond->sym_index = btop_j; + jbond->sym_index = btop_i; + Set_End_Index( j, btop_j+1, bonds ); + + bo_ij = &( ibond->bo_data ); + bo_ji = &( jbond->bo_data ); + bo_ji->BO = bo_ij->BO = BO; + bo_ji->BO_s = bo_ij->BO_s = BO_s; + bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; + bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; + + /* Bond Order page2-3, derivative of total bond order prime */ + Cln_BOp_s = twbp->p_bo2 * C12 / r2; + Cln_BOp_pi = twbp->p_bo4 * C34 / r2; + Cln_BOp_pi2 = twbp->p_bo6 * C56 / r2; + + /* Only dln_BOp_xx wrt. dr_i is stored here, note that + dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ + rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi,-bo_ij->BO_pi*Cln_BOp_pi,ibond->dvec); + rvec_Scale(bo_ij->dln_BOp_pi2, + -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); + rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); + rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); + rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + + rvec_Scale( bo_ij->dBOp, + -(bo_ij->BO_s * Cln_BOp_s + + bo_ij->BO_pi * Cln_BOp_pi + + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); + rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); + + rvec_Add( workspace->dDeltap_self[i], bo_ij->dBOp ); + rvec_Add( workspace->dDeltap_self[j], bo_ji->dBOp ); + + bo_ij->BO_s -= bo_cut; + bo_ij->BO -= bo_cut; + bo_ji->BO_s -= bo_cut; + bo_ji->BO -= bo_cut; + workspace->total_bond_order[i] += bo_ij->BO; //currently total_BOp + workspace->total_bond_order[j] += bo_ji->BO; //currently total_BOp + bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; + bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; + + return 1; } + + return 0; } -} + + void BO(reax_system *system, control_params * /*control*/, simulation_data * /*data*/, + storage *workspace, reax_list **lists, output_controls * /*out_control*/ ) + { + int i, j, pj, type_i, type_j; + int start_i, end_i, sym_index; + double val_i, Deltap_i, Deltap_boc_i; + double val_j, Deltap_j, Deltap_boc_j; + double f1, f2, f3, f4, f5, f4f5, exp_f4, exp_f5; + double exp_p1i, exp_p2i, exp_p1j, exp_p2j; + double temp, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; + double Cf45_ij, Cf45_ji, p_lp1; //u_ij, u_ji + double A0_ij, A1_ij, A2_ij, A2_ji, A3_ij, A3_ji; + double explp1, p_boc1, p_boc2; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij, *bo_ji; + reax_list *bonds = (*lists) + BONDS; + + p_boc1 = system->reax_param.gp.l[0]; + p_boc2 = system->reax_param.gp.l[1]; + + /* Calculate Deltaprime, Deltaprime_boc values */ + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + workspace->Deltap[i] = workspace->total_bond_order[i] - sbp_i->valency; + workspace->Deltap_boc[i] = + workspace->total_bond_order[i] - sbp_i->valency_val; + + workspace->total_bond_order[i] = 0; + } + + /* Corrected Bond Order calculations */ + for (i = 0; i < system->N; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + sbp_i = &(system->reax_param.sbp[type_i]); + val_i = sbp_i->valency; + Deltap_i = workspace->Deltap[i]; + Deltap_boc_i = workspace->Deltap_boc[i]; + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); + + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + bo_ij = &( bonds->select.bond_list[pj].bo_data ); + // fprintf( stderr, "\tj:%d - ubo: %8.3f\n", j+1, bo_ij->BO ); + + if (i < j || workspace->bond_mark[j] > 3) { + twbp = &( system->reax_param.tbp[type_i][type_j] ); + + if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { + bo_ij->C1dbo = 1.000000; + bo_ij->C2dbo = 0.000000; + bo_ij->C3dbo = 0.000000; + + bo_ij->C1dbopi = 1.000000; + bo_ij->C2dbopi = 0.000000; + bo_ij->C3dbopi = 0.000000; + bo_ij->C4dbopi = 0.000000; + + bo_ij->C1dbopi2 = 1.000000; + bo_ij->C2dbopi2 = 0.000000; + bo_ij->C3dbopi2 = 0.000000; + bo_ij->C4dbopi2 = 0.000000; + + } else { + val_j = system->reax_param.sbp[type_j].valency; + Deltap_j = workspace->Deltap[j]; + Deltap_boc_j = workspace->Deltap_boc[j]; + + /* on page 1 */ + if (twbp->ovc >= 0.001) { + /* Correction for overcoordination */ + exp_p1i = exp( -p_boc1 * Deltap_i ); + exp_p2i = exp( -p_boc2 * Deltap_i ); + exp_p1j = exp( -p_boc1 * Deltap_j ); + exp_p2j = exp( -p_boc2 * Deltap_j ); + + f2 = exp_p1i + exp_p1j; + f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); + f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + + ( val_j + f2 )/( val_j + f2 + f3 ) ); + + temp = f2 + f3; + u1_ij = val_i + temp; + u1_ji = val_j + temp; + Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + + 1.0 / SQR( u1_ji )); + Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + + ( u1_ji - f3 ) / SQR( u1_ji )); + + Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - + ((val_i+f2) / SQR(u1_ij)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) ) + + -p_boc1 * exp_p1i / u1_ji - + ((val_j+f2) / SQR(u1_ji)) * + ( -p_boc1 * exp_p1i + + exp_p2i / ( exp_p2i + exp_p2j ) )); -int BOp( storage *workspace, reax_list *bonds, double bo_cut, - int i, int btop_i, far_neighbor_data *nbr_pj, - single_body_parameters *sbp_i, single_body_parameters *sbp_j, - two_body_parameters *twbp) { - int j, btop_j; - double r2, C12, C34, C56; - double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; - double BO, BO_s, BO_pi, BO_pi2; - bond_data *ibond, *jbond; - bond_order_data *bo_ij, *bo_ji; + Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + + Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); - j = nbr_pj->nbr; - r2 = SQR(nbr_pj->d); + } else { + /* No overcoordination correction! */ + f1 = 1.0; + Cf1_ij = Cf1_ji = 0.0; + } - if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { - C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 ); - BO_s = (1.0 + bo_cut) * exp( C12 ); - } - else BO_s = C12 = 0.0; + if (twbp->v13cor >= 0.001) { + /* Correction for 1-3 bond orders */ + exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); + exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); - if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { - C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 ); - BO_pi = exp( C34 ); - } - else BO_pi = C34 = 0.0; + f4 = 1. / (1. + exp_f4); + f5 = 1. / (1. + exp_f5); + f4f5 = f4 * f5; - if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { - C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 ); - BO_pi2= exp( C56 ); - } - else BO_pi2 = C56 = 0.0; + /* Bond Order pages 8-9, derivative of f4 and f5 */ + Cf45_ij = -f4 * exp_f4; + Cf45_ji = -f5 * exp_f5; + } else { + f4 = f5 = f4f5 = 1.0; + Cf45_ij = Cf45_ji = 0.0; + } - /* Initially BO values are the uncorrected ones, page 1 */ - BO = BO_s + BO_pi + BO_pi2; + /* Bond Order page 10, derivative of total bond order */ + A0_ij = f1 * f4f5; + A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * + (Cf45_ij + Cf45_ji); + A2_ij = Cf1_ij / f1 + twbp->p_boc3 * Cf45_ij; + A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; + A3_ij = A2_ij + Cf1_ij / f1; + A3_ji = A2_ji + Cf1_ji / f1; - if (BO >= bo_cut) { - /****** bonds i-j and j-i ******/ - ibond = &( bonds->select.bond_list[btop_i] ); - btop_j = End_Index( j, bonds ); - jbond = &(bonds->select.bond_list[btop_j]); + /* find corrected bond orders and their derivative coef */ + bo_ij->BO = bo_ij->BO * A0_ij; + bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; + bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; + bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); - ibond->nbr = j; - jbond->nbr = i; - ibond->d = nbr_pj->d; - jbond->d = nbr_pj->d; - rvec_Copy( ibond->dvec, nbr_pj->dvec ); - rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); - ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); - ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); - ibond->dbond_index = btop_i; - jbond->dbond_index = btop_i; - ibond->sym_index = btop_j; - jbond->sym_index = btop_i; - Set_End_Index( j, btop_j+1, bonds ); + bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; + bo_ij->C2dbo = bo_ij->BO * A2_ij; + bo_ij->C3dbo = bo_ij->BO * A2_ji; - bo_ij = &( ibond->bo_data ); - bo_ji = &( jbond->bo_data ); - bo_ji->BO = bo_ij->BO = BO; - bo_ji->BO_s = bo_ij->BO_s = BO_s; - bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; - bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; + bo_ij->C1dbopi = f1*f1*f4*f5; + bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; + bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; + bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; - /* Bond Order page2-3, derivative of total bond order prime */ - Cln_BOp_s = twbp->p_bo2 * C12 / r2; - Cln_BOp_pi = twbp->p_bo4 * C34 / r2; - Cln_BOp_pi2 = twbp->p_bo6 * C56 / r2; + bo_ij->C1dbopi2 = f1*f1*f4*f5; + bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; + bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; + bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; + } - /* Only dln_BOp_xx wrt. dr_i is stored here, note that - dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ - rvec_Scale(bo_ij->dln_BOp_s,-bo_ij->BO_s*Cln_BOp_s,ibond->dvec); - rvec_Scale(bo_ij->dln_BOp_pi,-bo_ij->BO_pi*Cln_BOp_pi,ibond->dvec); - rvec_Scale(bo_ij->dln_BOp_pi2, - -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); - rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); - rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); - rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + /* neglect bonds that are < 1e-10 */ + if (bo_ij->BO < 1e-10) + bo_ij->BO = 0.0; + if (bo_ij->BO_s < 1e-10) + bo_ij->BO_s = 0.0; + if (bo_ij->BO_pi < 1e-10) + bo_ij->BO_pi = 0.0; + if (bo_ij->BO_pi2 < 1e-10) + bo_ij->BO_pi2 = 0.0; - rvec_Scale( bo_ij->dBOp, - -(bo_ij->BO_s * Cln_BOp_s + - bo_ij->BO_pi * Cln_BOp_pi + - bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); - rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); - - rvec_Add( workspace->dDeltap_self[i], bo_ij->dBOp ); - rvec_Add( workspace->dDeltap_self[j], bo_ji->dBOp ); - - bo_ij->BO_s -= bo_cut; - bo_ij->BO -= bo_cut; - bo_ji->BO_s -= bo_cut; - bo_ji->BO -= bo_cut; - workspace->total_bond_order[i] += bo_ij->BO; //currently total_BOp - workspace->total_bond_order[j] += bo_ji->BO; //currently total_BOp - bo_ij->Cdbo = bo_ij->Cdbopi = bo_ij->Cdbopi2 = 0.0; - bo_ji->Cdbo = bo_ji->Cdbopi = bo_ji->Cdbopi2 = 0.0; - - return 1; - } - - return 0; -} - - -void BO( reax_system *system, control_params * /*control*/, simulation_data * /*data*/, - storage *workspace, reax_list **lists, output_controls * /*out_control*/ ) -{ - int i, j, pj, type_i, type_j; - int start_i, end_i, sym_index; - double val_i, Deltap_i, Deltap_boc_i; - double val_j, Deltap_j, Deltap_boc_j; - double f1, f2, f3, f4, f5, f4f5, exp_f4, exp_f5; - double exp_p1i, exp_p2i, exp_p1j, exp_p2j; - double temp, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; - double Cf45_ij, Cf45_ji, p_lp1; //u_ij, u_ji - double A0_ij, A1_ij, A2_ij, A2_ji, A3_ij, A3_ji; - double explp1, p_boc1, p_boc2; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - bond_order_data *bo_ij, *bo_ji; - reax_list *bonds = (*lists) + BONDS; - - p_boc1 = system->reax_param.gp.l[0]; - p_boc2 = system->reax_param.gp.l[1]; - - /* Calculate Deltaprime, Deltaprime_boc values */ - for (i = 0; i < system->N; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[type_i]); - workspace->Deltap[i] = workspace->total_bond_order[i] - sbp_i->valency; - workspace->Deltap_boc[i] = - workspace->total_bond_order[i] - sbp_i->valency_val; - - workspace->total_bond_order[i] = 0; - } - - /* Corrected Bond Order calculations */ - for (i = 0; i < system->N; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[type_i]); - val_i = sbp_i->valency; - Deltap_i = workspace->Deltap[i]; - Deltap_boc_i = workspace->Deltap_boc[i]; - start_i = Start_Index(i, bonds); - end_i = End_Index(i, bonds); - - for (pj = start_i; pj < end_i; ++pj) { - j = bonds->select.bond_list[pj].nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - bo_ij = &( bonds->select.bond_list[pj].bo_data ); - // fprintf( stderr, "\tj:%d - ubo: %8.3f\n", j+1, bo_ij->BO ); - - if (i < j || workspace->bond_mark[j] > 3) { - twbp = &( system->reax_param.tbp[type_i][type_j] ); - - if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { - bo_ij->C1dbo = 1.000000; - bo_ij->C2dbo = 0.000000; - bo_ij->C3dbo = 0.000000; - - bo_ij->C1dbopi = 1.000000; - bo_ij->C2dbopi = 0.000000; - bo_ij->C3dbopi = 0.000000; - bo_ij->C4dbopi = 0.000000; - - bo_ij->C1dbopi2 = 1.000000; - bo_ij->C2dbopi2 = 0.000000; - bo_ij->C3dbopi2 = 0.000000; - bo_ij->C4dbopi2 = 0.000000; + workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO } else { - val_j = system->reax_param.sbp[type_j].valency; - Deltap_j = workspace->Deltap[j]; - Deltap_boc_j = workspace->Deltap_boc[j]; - - /* on page 1 */ - if (twbp->ovc >= 0.001) { - /* Correction for overcoordination */ - exp_p1i = exp( -p_boc1 * Deltap_i ); - exp_p2i = exp( -p_boc2 * Deltap_i ); - exp_p1j = exp( -p_boc1 * Deltap_j ); - exp_p2j = exp( -p_boc2 * Deltap_j ); - - f2 = exp_p1i + exp_p1j; - f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); - f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + - ( val_j + f2 )/( val_j + f2 + f3 ) ); - - temp = f2 + f3; - u1_ij = val_i + temp; - u1_ji = val_j + temp; - Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + - 1.0 / SQR( u1_ji )); - Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + - ( u1_ji - f3 ) / SQR( u1_ji )); - - Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - - ((val_i+f2) / SQR(u1_ij)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) ) + - -p_boc1 * exp_p1i / u1_ji - - ((val_j+f2) / SQR(u1_ji)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) )); - - - Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + - Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); - - } - else { - /* No overcoordination correction! */ - f1 = 1.0; - Cf1_ij = Cf1_ji = 0.0; - } - - if (twbp->v13cor >= 0.001) { - /* Correction for 1-3 bond orders */ - exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - - Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); - exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - - Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); - - f4 = 1. / (1. + exp_f4); - f5 = 1. / (1. + exp_f5); - f4f5 = f4 * f5; - - /* Bond Order pages 8-9, derivative of f4 and f5 */ - Cf45_ij = -f4 * exp_f4; - Cf45_ji = -f5 * exp_f5; - } - else { - f4 = f5 = f4f5 = 1.0; - Cf45_ij = Cf45_ji = 0.0; - } - - /* Bond Order page 10, derivative of total bond order */ - A0_ij = f1 * f4f5; - A1_ij = -2 * twbp->p_boc3 * twbp->p_boc4 * bo_ij->BO * - (Cf45_ij + Cf45_ji); - A2_ij = Cf1_ij / f1 + twbp->p_boc3 * Cf45_ij; - A2_ji = Cf1_ji / f1 + twbp->p_boc3 * Cf45_ji; - A3_ij = A2_ij + Cf1_ij / f1; - A3_ji = A2_ji + Cf1_ji / f1; - - /* find corrected bond orders and their derivative coef */ - bo_ij->BO = bo_ij->BO * A0_ij; - bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; - bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; - bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); - - bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; - bo_ij->C2dbo = bo_ij->BO * A2_ij; - bo_ij->C3dbo = bo_ij->BO * A2_ji; - - bo_ij->C1dbopi = f1*f1*f4*f5; - bo_ij->C2dbopi = bo_ij->BO_pi * A1_ij; - bo_ij->C3dbopi = bo_ij->BO_pi * A3_ij; - bo_ij->C4dbopi = bo_ij->BO_pi * A3_ji; - - bo_ij->C1dbopi2 = f1*f1*f4*f5; - bo_ij->C2dbopi2 = bo_ij->BO_pi2 * A1_ij; - bo_ij->C3dbopi2 = bo_ij->BO_pi2 * A3_ij; - bo_ij->C4dbopi2 = bo_ij->BO_pi2 * A3_ji; + /* We only need to update bond orders from bo_ji + everything else is set in uncorrected_bo calculations */ + sym_index = bonds->select.bond_list[pj].sym_index; + bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + bo_ij->BO = bo_ji->BO; + bo_ij->BO_s = bo_ji->BO_s; + bo_ij->BO_pi = bo_ji->BO_pi; + bo_ij->BO_pi2 = bo_ji->BO_pi2; + workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO } + } - /* neglect bonds that are < 1e-10 */ - if (bo_ij->BO < 1e-10) - bo_ij->BO = 0.0; - if (bo_ij->BO_s < 1e-10) - bo_ij->BO_s = 0.0; - if (bo_ij->BO_pi < 1e-10) - bo_ij->BO_pi = 0.0; - if (bo_ij->BO_pi2 < 1e-10) - bo_ij->BO_pi2 = 0.0; + } - workspace->total_bond_order[i] += bo_ij->BO; //now keeps total_BO + p_lp1 = system->reax_param.gp.l[15]; + for (j = 0; j < system->N; ++j) { + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[ type_j ]); + workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; + workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; + workspace->Delta_boc[j] = workspace->total_bond_order[j] - + sbp_j->valency_boc; + workspace->Delta_val[j] = workspace->total_bond_order[j] - + sbp_j->valency_val; + + workspace->vlpex[j] = workspace->Delta_e[j] - + 2.0 * (int)(workspace->Delta_e[j]/2.0); + explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); + workspace->nlp[j] = explp1 - (int)(workspace->Delta_e[j] / 2.0); + workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; + workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); + workspace->dDelta_lp[j] = workspace->Clp[j]; + + if (sbp_j->mass > 21.0) { + workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = 0.; } else { - /* We only need to update bond orders from bo_ji - everything else is set in uncorrected_bo calculations */ - sym_index = bonds->select.bond_list[pj].sym_index; - bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); - bo_ij->BO = bo_ji->BO; - bo_ij->BO_s = bo_ji->BO_s; - bo_ij->BO_pi = bo_ji->BO_pi; - bo_ij->BO_pi2 = bo_ji->BO_pi2; - - workspace->total_bond_order[i] += bo_ij->BO;// now keeps total_BO + workspace->nlp_temp[j] = workspace->nlp[j]; + workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; + workspace->dDelta_lp_temp[j] = workspace->Clp[j]; } } - } - - p_lp1 = system->reax_param.gp.l[15]; - for (j = 0; j < system->N; ++j) { - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[ type_j ]); - - workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; - workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; - workspace->Delta_boc[j] = workspace->total_bond_order[j] - - sbp_j->valency_boc; - workspace->Delta_val[j] = workspace->total_bond_order[j] - - sbp_j->valency_val; - - workspace->vlpex[j] = workspace->Delta_e[j] - - 2.0 * (int)(workspace->Delta_e[j]/2.0); - explp1 = exp(-p_lp1 * SQR(2.0 + workspace->vlpex[j])); - workspace->nlp[j] = explp1 - (int)(workspace->Delta_e[j] / 2.0); - workspace->Delta_lp[j] = sbp_j->nlp_opt - workspace->nlp[j]; - workspace->Clp[j] = 2.0 * p_lp1 * explp1 * (2.0 + workspace->vlpex[j]); - workspace->dDelta_lp[j] = workspace->Clp[j]; - - if (sbp_j->mass > 21.0) { - workspace->nlp_temp[j] = 0.5 * (sbp_j->valency_e - sbp_j->valency); - workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; - workspace->dDelta_lp_temp[j] = 0.; - } - else { - workspace->nlp_temp[j] = workspace->nlp[j]; - workspace->Delta_lp_temp[j] = sbp_j->nlp_opt - workspace->nlp_temp[j]; - workspace->dDelta_lp_temp[j] = workspace->Clp[j]; - } - - } - } diff --git a/src/USER-REAXC/reaxc_bond_orders.h b/src/USER-REAXC/reaxc_bond_orders.h deleted file mode 100644 index 09137a7afb..0000000000 --- a/src/USER-REAXC/reaxc_bond_orders.h +++ /dev/null @@ -1,45 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __BOND_ORDERS_H_ -#define __BOND_ORDERS_H_ - -#include "reaxc_types.h" - -typedef struct{ - double C1dbo, C2dbo, C3dbo; - double C1dbopi, C2dbopi, C3dbopi, C4dbopi; - double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; - double C1dDelta, C2dDelta, C3dDelta; -}dbond_coefficients; - -void Add_dBond_to_Forces( reax_system*, int, int, storage*, reax_list** ); -void Add_dBond_to_Forces_NPT( int, int, storage*, reax_list** ); -int BOp(storage*, reax_list*, double, int, int, far_neighbor_data*, - single_body_parameters*, single_body_parameters*, two_body_parameters*); -void BO( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); -#endif diff --git a/src/USER-REAXC/reaxc_bonds.cpp b/src/USER-REAXC/reaxc_bonds.cpp index c706a2fd79..a06700bb3b 100644 --- a/src/USER-REAXC/reaxc_bonds.cpp +++ b/src/USER-REAXC/reaxc_bonds.cpp @@ -24,112 +24,113 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_bonds.h" -#include +#include "reaxff_api.h" + #include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -void Bonds( reax_system *system, control_params * /*control*/, - simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/ ) -{ - int i, j, pj, natoms; - int start_i, end_i; - int type_i, type_j; - double ebond, pow_BOs_be2, exp_be12, CEbo; - double gp3, gp4, gp7, gp10, gp37; - double exphu, exphua1, exphub1, exphuov, hulpov, estriph; - double decobdbo, decobdboua, decobdboub; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - bond_order_data *bo_ij; - reax_list *bonds; +#include - bonds = (*lists) + BONDS; - gp3 = system->reax_param.gp.l[3]; - gp4 = system->reax_param.gp.l[4]; - gp7 = system->reax_param.gp.l[7]; - gp10 = system->reax_param.gp.l[10]; - gp37 = (int) system->reax_param.gp.l[37]; - natoms = system->n; +namespace ReaxFF { + void Bonds(reax_system *system, simulation_data *data, + storage *workspace, reax_list **lists) + { + int i, j, pj, natoms; + int start_i, end_i; + int type_i, type_j; + double ebond, pow_BOs_be2, exp_be12, CEbo; + double gp3, gp4, gp7, gp10, gp37; + double exphu, exphua1, exphub1, exphuov, hulpov, estriph; + double decobdbo, decobdboua, decobdboub; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + bond_order_data *bo_ij; + reax_list *bonds; - for (i = 0; i < natoms; ++i) { - start_i = Start_Index(i, bonds); - end_i = End_Index(i, bonds); + bonds = (*lists) + BONDS; + gp3 = system->reax_param.gp.l[3]; + gp4 = system->reax_param.gp.l[4]; + gp7 = system->reax_param.gp.l[7]; + gp10 = system->reax_param.gp.l[10]; + gp37 = (int) system->reax_param.gp.l[37]; + natoms = system->n; - for (pj = start_i; pj < end_i; ++pj) { - j = bonds->select.bond_list[pj].nbr; + for (i = 0; i < natoms; ++i) { + start_i = Start_Index(i, bonds); + end_i = End_Index(i, bonds); - if (system->my_atoms[i].orig_id > system->my_atoms[j].orig_id) - continue; - if (system->my_atoms[i].orig_id == system->my_atoms[j].orig_id) { - if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && - system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; - if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && - system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && - system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; - } + for (pj = start_i; pj < end_i; ++pj) { + j = bonds->select.bond_list[pj].nbr; - /* set the pointers */ - type_i = system->my_atoms[i].type; - type_j = system->my_atoms[j].type; - sbp_i = &( system->reax_param.sbp[type_i] ); - sbp_j = &( system->reax_param.sbp[type_j] ); - twbp = &( system->reax_param.tbp[type_i][type_j] ); - bo_ij = &( bonds->select.bond_list[pj].bo_data ); + if (system->my_atoms[i].orig_id > system->my_atoms[j].orig_id) + continue; + if (system->my_atoms[i].orig_id == system->my_atoms[j].orig_id) { + if (system->my_atoms[j].x[2] < system->my_atoms[i].x[2]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] < system->my_atoms[i].x[1]) continue; + if (system->my_atoms[j].x[2] == system->my_atoms[i].x[2] && + system->my_atoms[j].x[1] == system->my_atoms[i].x[1] && + system->my_atoms[j].x[0] < system->my_atoms[i].x[0]) continue; + } - /* calculate the constants */ - if (bo_ij->BO_s == 0.0) pow_BOs_be2 = 0.0; - else pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); - exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); - CEbo = -twbp->De_s * exp_be12 * - ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); + /* set the pointers */ + type_i = system->my_atoms[i].type; + type_j = system->my_atoms[j].type; + sbp_i = &( system->reax_param.sbp[type_i] ); + sbp_j = &( system->reax_param.sbp[type_j] ); + twbp = &( system->reax_param.tbp[type_i][type_j] ); + bo_ij = &( bonds->select.bond_list[pj].bo_data ); - /* calculate the Bond Energy */ - data->my_en.e_bond += ebond = - -twbp->De_s * bo_ij->BO_s * exp_be12 - -twbp->De_p * bo_ij->BO_pi - -twbp->De_pp * bo_ij->BO_pi2; + /* calculate the constants */ + if (bo_ij->BO_s == 0.0) pow_BOs_be2 = 0.0; + else pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); + exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); + CEbo = -twbp->De_s * exp_be12 * + ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(i,j,natoms,1,ebond,0.0,0.0,0.0,0.0,0.0); + /* calculate the Bond Energy */ + data->my_en.e_bond += ebond = + -twbp->De_s * bo_ij->BO_s * exp_be12 + -twbp->De_p * bo_ij->BO_pi + -twbp->De_pp * bo_ij->BO_pi2; - /* calculate derivatives of Bond Orders */ - bo_ij->Cdbo += CEbo; - bo_ij->Cdbopi -= (CEbo + twbp->De_p); - bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + system->pair_ptr->ev_tally(i,j,natoms,1,ebond,0.0,0.0,0.0,0.0,0.0); - /* Stabilisation terminal triple bond */ - if (bo_ij->BO >= 1.00) { - if ( gp37 == 2 || - (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || - (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { - exphu = exp( -gp7 * SQR(bo_ij->BO - 2.50) ); - exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); - exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); - exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); - hulpov = 1.0 / (1.0 + 25.0 * exphuov); + /* calculate derivatives of Bond Orders */ + bo_ij->Cdbo += CEbo; + bo_ij->Cdbopi -= (CEbo + twbp->De_p); + bo_ij->Cdbopi2 -= (CEbo + twbp->De_pp); - estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); - data->my_en.e_bond += estriph; + /* Stabilisation terminal triple bond */ + if (bo_ij->BO >= 1.00) { + if ( gp37 == 2 || + (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || + (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { + exphu = exp( -gp7 * SQR(bo_ij->BO - 2.50) ); + exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); + exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); + exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); + hulpov = 1.0 / (1.0 + 25.0 * exphuov); - decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * - ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); - decobdboua = -gp10 * exphu * hulpov * - (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); - decobdboub = -gp10 * exphu * hulpov * - (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + estriph = gp10 * exphu * hulpov * (exphua1 + exphub1); + data->my_en.e_bond += estriph; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(i,j,natoms,1,estriph,0.0,0.0,0.0,0.0,0.0); + decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * + ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); + decobdboua = -gp10 * exphu * hulpov * + (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); + decobdboub = -gp10 * exphu * hulpov * + (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); - bo_ij->Cdbo += decobdbo; - workspace->CdDelta[i] += decobdboua; - workspace->CdDelta[j] += decobdboub; + /* tally into per-atom energy */ + if (system->pair_ptr->evflag) + system->pair_ptr->ev_tally(i,j,natoms,1,estriph,0.0,0.0,0.0,0.0,0.0); + + bo_ij->Cdbo += decobdbo; + workspace->CdDelta[i] += decobdboua; + workspace->CdDelta[j] += decobdboub; + } } } } diff --git a/src/USER-REAXC/reaxc_bonds.h b/src/USER-REAXC/reaxc_bonds.h deleted file mode 100644 index a4a1fb0b44..0000000000 --- a/src/USER-REAXC/reaxc_bonds.h +++ /dev/null @@ -1,34 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __BONDS_H_ -#define __BONDS_H_ - -#include "reaxc_types.h" - -void Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); -#endif diff --git a/src/USER-REAXC/reaxc_control.h b/src/USER-REAXC/reaxc_control.h deleted file mode 100644 index 5739d97574..0000000000 --- a/src/USER-REAXC/reaxc_control.h +++ /dev/null @@ -1,34 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __CONTROL_H_ -#define __CONTROL_H_ - -#include "reaxc_types.h" - -void Read_Control_File(const char *, control_params *, output_controls *); - -#endif diff --git a/src/USER-REAXC/reaxc_defs.h b/src/USER-REAXC/reaxc_defs.h deleted file mode 100644 index 5f1fc0fd6f..0000000000 --- a/src/USER-REAXC/reaxc_defs.h +++ /dev/null @@ -1,105 +0,0 @@ - - -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef LMP_REAXC_DEFS_H -#define LMP_REAXC_DEFS_H - -#if defined(__IBMC__) -#define inline __inline__ -#endif /*IBMC*/ - -#ifndef SUCCESS -#define SUCCESS 1 -#endif -#ifndef FAILURE -#define FAILURE 0 -#endif - -#define SQR(x) ((x)*(x)) -#define CUBE(x) ((x)*(x)*(x)) -#define DEG2RAD(a) ((a)*constPI/180.0) -#define RAD2DEG(a) ((a)*180.0/constPI) -#define MAX3(x,y,z) MAX( MAX(x,y), z) - -#define constPI 3.14159265 -#define C_ele 332.06371 -//#define K_B 503.398008 // kcal/mol/K -#define K_B 0.831687 // amu A^2 / ps^2 / K -#define F_CONV 1e6 / 48.88821291 / 48.88821291 // --> amu A / ps^2 -#define E_CONV 0.002391 // amu A^2 / ps^2 --> kcal/mol -#define EV_to_KCALpMOL 14.400000 // ElectronVolt --> KCAL per MOLe -#define KCALpMOL_to_EV 23.02 // 23.060549 //KCAL per MOLe --> ElectronVolt -#define ECxA_to_DEBYE 4.803204 // elem. charge * Ang -> debye -#define CAL_to_JOULES 4.184000 // CALories --> JOULES -#define JOULES_to_CAL 1/4.184000 // JOULES --> CALories -#define AMU_to_GRAM 1.6605e-24 -#define ANG_to_CM 1e-8 -#define AVOGNR 6.0221367e23 -#define P_CONV 1e-24 * AVOGNR * JOULES_to_CAL - -#define MAX_STR 1024 -#define MAX_LINE 1024 -#define MAX_TOKENS 1024 -#define MAX_TOKEN_LEN 1024 - -#define NUM_INTRS 10 -#define ALMOST_ZERO 1e-10 -#define NEG_INF -1e10 -#define NO_BOND 1e-3 // 0.001 -#define HB_THRESHOLD 1e-2 // 0.01 - -#define REAX_MIN_CAP 50 -#define REAX_MIN_NBRS 100 -#define MIN_HENTRIES 100 -#define MAX_BONDS 30 -#define MIN_BONDS 25 -#define REAX_MIN_HBONDS 25 -#define MIN_3BODIES 1000 -#define REAX_SAFE_ZONE 1.2 -#define REAX_SAFER_ZONE 1.4 -#define DANGER_ZONE 0.90 -#define LOOSE_ZONE 0.75 -#define MAX_3BODY_PARAM 5 -#define MAX_4BODY_PARAM 5 - -#define MASTER_NODE 0 - -#define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ -#define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ - -/******************* ENUMERATIONS *************************/ - -enum lists { BONDS, OLD_BONDS, THREE_BODIES, - HBONDS, FAR_NBRS, DBOS, DDELTAS, LIST_N }; - -enum message_tags {NONE, INIT_DESCS, ATOM_LINES, BOND_LINES, ANGLE_LINES}; - -enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, - TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; - -#endif diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index a48ba93e85..88381040c2 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -24,7 +24,7 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_ffield.h" +#include "reaxff_api.h" #include #include @@ -32,717 +32,720 @@ #include #include #include -#include "reaxc_defs.h" #include "error.h" -#include "reaxc_tool_box.h" + #include "utils.h" using LAMMPS_NS::utils::open_potential; using LAMMPS_NS::utils::getsyserror; -void Read_Force_Field(const char *filename, reax_interaction *reax, - control_params *control ) -{ - char *s; - char **tmp; - char ****tor_flag; - int c, i, j, k, l, m, n, o, p, cnt; - int lgflag = control->lgflag; - int errorflag = 1; - double val; - int me = control->me; +namespace ReaxFF { + extern int Tokenize(char* s, char*** tok); + + void Read_Force_Field(const char *filename, reax_interaction *reax, + control_params *control) + { + char *s; + char **tmp; + char ****tor_flag; + int c, i, j, k, l, m, n, o, p, cnt; + int lgflag = control->lgflag; + int errorflag = 1; + double val; + int me = control->me; - FILE *fp = open_potential(filename,control->lmp_ptr,nullptr); - if (!fp) - control->error_ptr->all(FLERR,fmt::format("Cannot open ReaxFF potential " - "file {}: {}",filename, - getsyserror())); - s = (char*) malloc(sizeof(char)*MAX_LINE); - tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); - for (i=0; i < MAX_TOKENS; i++) - tmp[i] = (char*) malloc(sizeof(char)*MAX_TOKEN_LEN); + FILE *fp = open_potential(filename,control->lmp_ptr,nullptr); + if (!fp) + control->error_ptr->all(FLERR,fmt::format("Cannot open ReaxFF potential " + "file {}: {}",filename, + getsyserror())); + s = (char*) malloc(sizeof(char)*MAX_LINE); + tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); + for (i=0; i < MAX_TOKENS; i++) + tmp[i] = (char*) malloc(sizeof(char)*MAX_TOKEN_LEN); - /* reading first header comment */ - fgets( s, MAX_LINE, fp ); + /* reading first header comment */ + fgets(s, MAX_LINE, fp); - /* line 2 is number of global parameters */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); + /* line 2 is number of global parameters */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); - /* reading the number of global parameters */ - n = atoi(tmp[0]); - if (n < 1) { - if (me == 0) - control->error_ptr->warning( FLERR, "Number of globals in ffield file is 0. The file will not be read." ); - fclose(fp); - free(s); - free(tmp); - return; - } + /* reading the number of global parameters */ + n = atoi(tmp[0]); + if (n < 1) { + if (me == 0) + control->error_ptr->warning(FLERR, "Number of globals in ffield file is 0. The file will not be read."); + fclose(fp); + free(s); + free(tmp); + return; + } - reax->gp.n_global = n; - reax->gp.l = (double*) malloc(sizeof(double)*n); + reax->gp.n_global = n; + reax->gp.l = (double*) malloc(sizeof(double)*n); - /* see reax_types.h for mapping between l[i] and the lambdas used in ff */ - for (i=0; i < n; i++) { + /* see reax_types.h for mapping between l[i] and the lambdas used in ff */ + for (i=0; i < n; i++) { + fgets(s,MAX_LINE,fp); + c = Tokenize(s,&tmp); + + val = (double) atof(tmp[0]); + reax->gp.l[i] = val; + } + + control->bo_cut = 0.01 * reax->gp.l[29]; + control->nonb_low = reax->gp.l[11]; + control->nonb_cut = reax->gp.l[12]; + + /* next line is number of atom types and some comments */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + reax->num_atom_types = atoi(tmp[0]); + + /* 3 lines of comments */ + fgets(s,MAX_LINE,fp); + fgets(s,MAX_LINE,fp); fgets(s,MAX_LINE,fp); - c = Tokenize(s,&tmp); - val = (double) atof(tmp[0]); - reax->gp.l[i] = val; - } + /* Allocating structures in reax_interaction */ + reax->sbp = (single_body_parameters*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp"); + reax->tbp = (two_body_parameters**) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp"); + reax->thbp= (three_body_header***) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp"); + reax->hbp = (hbond_parameters***) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp"); + reax->fbp = (four_body_header****) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp"); + tor_flag = (char****) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag"); - control->bo_cut = 0.01 * reax->gp.l[29]; - control->nonb_low = reax->gp.l[11]; - control->nonb_cut = reax->gp.l[12]; + for (i = 0; i < reax->num_atom_types; i++) { + reax->tbp[i] = (two_body_parameters*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]"); + reax->thbp[i]= (three_body_header**) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]"); + reax->hbp[i] = (hbond_parameters**) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]"); + reax->fbp[i] = (four_body_header***) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]"); + tor_flag[i] = (char***) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]"); - /* next line is number of atom types and some comments */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - reax->num_atom_types = atoi(tmp[0]); + for (j = 0; j < reax->num_atom_types; j++) { + reax->thbp[i][j]= (three_body_header*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]"); + reax->hbp[i][j] = (hbond_parameters*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]"); + reax->fbp[i][j] = (four_body_header**) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]"); + tor_flag[i][j] = (char**) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]"); - /* 3 lines of comments */ - fgets(s,MAX_LINE,fp); - fgets(s,MAX_LINE,fp); - fgets(s,MAX_LINE,fp); - - /* Allocating structures in reax_interaction */ - reax->sbp = (single_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp"); - reax->tbp = (two_body_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp"); - reax->thbp= (three_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp"); - reax->hbp = (hbond_parameters***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp"); - reax->fbp = (four_body_header****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp"); - tor_flag = (char****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag"); - - for (i = 0; i < reax->num_atom_types; i++) { - reax->tbp[i] = (two_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]"); - reax->thbp[i]= (three_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]"); - reax->hbp[i] = (hbond_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]"); - reax->fbp[i] = (four_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]"); - tor_flag[i] = (char***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]"); - - for (j = 0; j < reax->num_atom_types; j++) { - reax->thbp[i][j]= (three_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]"); - reax->hbp[i][j] = (hbond_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]"); - reax->fbp[i][j] = (four_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]"); - tor_flag[i][j] = (char**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]"); - - for (k=0; k < reax->num_atom_types; k++) { - reax->fbp[i][j][k] = (four_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]"); - tor_flag[i][j][k] = (char*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]"); + for (k=0; k < reax->num_atom_types; k++) { + reax->fbp[i][j][k] = (four_body_header*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]"); + tor_flag[i][j][k] = (char*) + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]"); + } } } - } - reax->gp.vdw_type = 0; + reax->gp.vdw_type = 0; - char errmsg[1024]; + char errmsg[1024]; - for (i = 0; i < reax->num_atom_types; i++) { - /* line one */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); + for (i = 0; i < reax->num_atom_types; i++) { + /* line one */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); - /* Sanity checks */ - if (c == 2 && !lgflag) + /* Sanity checks */ + if (c == 2 && !lgflag) control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); - if (c < 9) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - for (j = 0; j < (int)(strlen(tmp[0])); ++j) - reax->sbp[i].name[j] = toupper( tmp[0][j] ); - - val = atof(tmp[1]); reax->sbp[i].r_s = val; - val = atof(tmp[2]); reax->sbp[i].valency = val; - val = atof(tmp[3]); reax->sbp[i].mass = val; - val = atof(tmp[4]); reax->sbp[i].r_vdw = val; - val = atof(tmp[5]); reax->sbp[i].epsilon = val; - val = atof(tmp[6]); reax->sbp[i].gamma = val; - val = atof(tmp[7]); reax->sbp[i].r_pi = val; - val = atof(tmp[8]); reax->sbp[i].valency_e = val; - reax->sbp[i].nlp_opt = 0.5 * (reax->sbp[i].valency_e-reax->sbp[i].valency); - - /* line two */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].alpha = val; - val = atof(tmp[1]); reax->sbp[i].gamma_w = val; - val = atof(tmp[2]); reax->sbp[i].valency_boc= val; - val = atof(tmp[3]); reax->sbp[i].p_ovun5 = val; - val = atof(tmp[4]); - val = atof(tmp[5]); reax->sbp[i].chi = val; - val = atof(tmp[6]); reax->sbp[i].eta = 2.0 * val; - val = atof(tmp[7]); reax->sbp[i].p_hbond = (int) val; - - /* line 3 */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; - val = atof(tmp[1]); reax->sbp[i].p_lp2 = val; - val = atof(tmp[2]); - val = atof(tmp[3]); reax->sbp[i].b_o_131 = val; - val = atof(tmp[4]); reax->sbp[i].b_o_132 = val; - val = atof(tmp[5]); reax->sbp[i].b_o_133 = val; - val = atof(tmp[6]); - val = atof(tmp[7]); - - /* line 4 */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; - val = atof(tmp[1]); reax->sbp[i].p_val3 = val; - val = atof(tmp[2]); - val = atof(tmp[3]); reax->sbp[i].valency_val= val; - val = atof(tmp[4]); reax->sbp[i].p_val5 = val; - val = atof(tmp[5]); reax->sbp[i].rcore2 = val; - val = atof(tmp[6]); reax->sbp[i].ecore2 = val; - val = atof(tmp[7]); reax->sbp[i].acore2 = val; - - /* line 5, only if lgvdw is yes */ - if (lgflag) { - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - - /* Sanity check */ - if (c > 2) { - control->error_ptr->all(FLERR,"Force field file incompatible with 'lgvdw yes'"); - } - - val = atof(tmp[0]); reax->sbp[i].lgcij = val; - val = atof(tmp[1]); reax->sbp[i].lgre = val; - } - - if (reax->sbp[i].rcore2>0.01 && reax->sbp[i].acore2>0.01) { // Inner-wall - if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { - if (errorflag && (me == 0)) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals-parameters for element %s " - "indicate inner wall+shielding, but earlier " - "atoms indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - errorflag = 0; - } else { - reax->gp.vdw_type = 3; - } - } else { // No shielding vdWaals parameters present - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 2) { - if (me == 0) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals-parameters for element %s " - "indicate inner wall without shielding, but earlier " - "atoms indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - } else { - reax->gp.vdw_type = 2; - } - } - } else { // No Inner wall parameters present - if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 1) { - if (me == 0) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals parameters for element %s " - "indicate shielding without inner wall, but earlier " - "elements indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - } else { - reax->gp.vdw_type = 1; - } - } else { - char errmsg[256]; - snprintf(errmsg, 256, "Inconsistent vdWaals-parameters: " - "No shielding or inner-wall set for element %s", - reax->sbp[i].name); + if (c < 9) { + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); control->error_ptr->all(FLERR, errmsg); } - } - } - /* Equate vval3 to valf for first-row elements (25/10/2004) */ - for (i = 0; i < reax->num_atom_types; i++) - if ( reax->sbp[i].mass < 21 && - reax->sbp[i].valency_val != reax->sbp[i].valency_boc) { - if (me == 0) { - char errmsg[256]; - snprintf(errmsg, 256, "Changed valency_val to valency_boc for %s", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); + for (j = 0; j < (int)(strlen(tmp[0])); ++j) + reax->sbp[i].name[j] = toupper(tmp[0][j]); + + val = atof(tmp[1]); reax->sbp[i].r_s = val; + val = atof(tmp[2]); reax->sbp[i].valency = val; + val = atof(tmp[3]); reax->sbp[i].mass = val; + val = atof(tmp[4]); reax->sbp[i].r_vdw = val; + val = atof(tmp[5]); reax->sbp[i].epsilon = val; + val = atof(tmp[6]); reax->sbp[i].gamma = val; + val = atof(tmp[7]); reax->sbp[i].r_pi = val; + val = atof(tmp[8]); reax->sbp[i].valency_e = val; + reax->sbp[i].nlp_opt = 0.5 * (reax->sbp[i].valency_e-reax->sbp[i].valency); + + /* line two */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + + /* Sanity check */ + if (c < 8) { + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); + } + + val = atof(tmp[0]); reax->sbp[i].alpha = val; + val = atof(tmp[1]); reax->sbp[i].gamma_w = val; + val = atof(tmp[2]); reax->sbp[i].valency_boc= val; + val = atof(tmp[3]); reax->sbp[i].p_ovun5 = val; + val = atof(tmp[4]); + val = atof(tmp[5]); reax->sbp[i].chi = val; + val = atof(tmp[6]); reax->sbp[i].eta = 2.0 * val; + val = atof(tmp[7]); reax->sbp[i].p_hbond = (int) val; + + /* line 3 */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + + /* Sanity check */ + if (c < 8) { + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); + } + + val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; + val = atof(tmp[1]); reax->sbp[i].p_lp2 = val; + val = atof(tmp[2]); + val = atof(tmp[3]); reax->sbp[i].b_o_131 = val; + val = atof(tmp[4]); reax->sbp[i].b_o_132 = val; + val = atof(tmp[5]); reax->sbp[i].b_o_133 = val; + val = atof(tmp[6]); + val = atof(tmp[7]); + + /* line 4 */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + + /* Sanity check */ + if (c < 8) { + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); + } + + val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; + val = atof(tmp[1]); reax->sbp[i].p_val3 = val; + val = atof(tmp[2]); + val = atof(tmp[3]); reax->sbp[i].valency_val= val; + val = atof(tmp[4]); reax->sbp[i].p_val5 = val; + val = atof(tmp[5]); reax->sbp[i].rcore2 = val; + val = atof(tmp[6]); reax->sbp[i].ecore2 = val; + val = atof(tmp[7]); reax->sbp[i].acore2 = val; + + /* line 5, only if lgvdw is yes */ + if (lgflag) { + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + + /* Sanity check */ + if (c > 2) { + control->error_ptr->all(FLERR,"Force field file incompatible with 'lgvdw yes'"); + } + + val = atof(tmp[0]); reax->sbp[i].lgcij = val; + val = atof(tmp[1]); reax->sbp[i].lgre = val; + } + + if (reax->sbp[i].rcore2>0.01 && reax->sbp[i].acore2>0.01) { // Inner-wall + if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals + if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { + if (errorflag && (me == 0)) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals-parameters for element %s " + "indicate inner wall+shielding, but earlier " + "atoms indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + control->error_ptr->warning(FLERR,errmsg); + } + errorflag = 0; + } else { + reax->gp.vdw_type = 3; + } + } else { // No shielding vdWaals parameters present + if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 2) { + if (me == 0) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals-parameters for element %s " + "indicate inner wall without shielding, but earlier " + "atoms indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + control->error_ptr->warning(FLERR,errmsg); + } + } else { + reax->gp.vdw_type = 2; + } + } + } else { // No Inner wall parameters present + if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals + if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 1) { + if (me == 0) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals parameters for element %s " + "indicate shielding without inner wall, but earlier " + "elements indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + control->error_ptr->warning(FLERR,errmsg); + } + } else { + reax->gp.vdw_type = 1; + } + } else { + char errmsg[256]; + snprintf(errmsg, 256, "Inconsistent vdWaals-parameters: " + "No shielding or inner-wall set for element %s", + reax->sbp[i].name); + control->error_ptr->all(FLERR, errmsg); + } } - reax->sbp[i].valency_val = reax->sbp[i].valency_boc; } - /* next line is number of two body combination and some comments */ - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); + /* Equate vval3 to valf for first-row elements (25/10/2004) */ + for (i = 0; i < reax->num_atom_types; i++) + if (reax->sbp[i].mass < 21 && + reax->sbp[i].valency_val != reax->sbp[i].valency_boc) { + if (me == 0) { + char errmsg[256]; + snprintf(errmsg, 256, "Changed valency_val to valency_boc for %s", + reax->sbp[i].name); + control->error_ptr->warning(FLERR,errmsg); + } + reax->sbp[i].valency_val = reax->sbp[i].valency_boc; + } - if (c == 2 && !lgflag) { + /* next line is number of two body combination and some comments */ + fgets(s,MAX_LINE,fp); + c=Tokenize(s,&tmp); + + if (c == 2 && !lgflag) { control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); } - l = atoi(tmp[0]); + l = atoi(tmp[0]); - /* a line of comments */ - fgets(s,MAX_LINE,fp); - - for (i=0; i < l; i++) { - /* line 1 */ + /* a line of comments */ fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - if ((c < 10) || (j < 0) || (k < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types) { - - val = atof(tmp[2]); reax->tbp[j][k].De_s = val; - reax->tbp[k][j].De_s = val; - val = atof(tmp[3]); reax->tbp[j][k].De_p = val; - reax->tbp[k][j].De_p = val; - val = atof(tmp[4]); reax->tbp[j][k].De_pp = val; - reax->tbp[k][j].De_pp = val; - val = atof(tmp[5]); reax->tbp[j][k].p_be1 = val; - reax->tbp[k][j].p_be1 = val; - val = atof(tmp[6]); reax->tbp[j][k].p_bo5 = val; - reax->tbp[k][j].p_bo5 = val; - val = atof(tmp[7]); reax->tbp[j][k].v13cor = val; - reax->tbp[k][j].v13cor = val; - - val = atof(tmp[8]); reax->tbp[j][k].p_bo6 = val; - reax->tbp[k][j].p_bo6 = val; - val = atof(tmp[9]); reax->tbp[j][k].p_ovun1 = val; - reax->tbp[k][j].p_ovun1 = val; - - /* line 2 */ + for (i=0; i < l; i++) { + /* line 1 */ fgets(s,MAX_LINE,fp); c=Tokenize(s,&tmp); - if (c < 8) + + j = atoi(tmp[0]) - 1; + k = atoi(tmp[1]) - 1; + if ((c < 10) || (j < 0) || (k < 0)) control->error_ptr->all(FLERR, "Inconsistent force field file"); - val = atof(tmp[0]); reax->tbp[j][k].p_be2 = val; - reax->tbp[k][j].p_be2 = val; - val = atof(tmp[1]); reax->tbp[j][k].p_bo3 = val; - reax->tbp[k][j].p_bo3 = val; - val = atof(tmp[2]); reax->tbp[j][k].p_bo4 = val; - reax->tbp[k][j].p_bo4 = val; - val = atof(tmp[3]); + if (j < reax->num_atom_types && k < reax->num_atom_types) { - val = atof(tmp[4]); reax->tbp[j][k].p_bo1 = val; - reax->tbp[k][j].p_bo1 = val; - val = atof(tmp[5]); reax->tbp[j][k].p_bo2 = val; - reax->tbp[k][j].p_bo2 = val; - val = atof(tmp[6]); reax->tbp[j][k].ovc = val; - reax->tbp[k][j].ovc = val; + val = atof(tmp[2]); reax->tbp[j][k].De_s = val; + reax->tbp[k][j].De_s = val; + val = atof(tmp[3]); reax->tbp[j][k].De_p = val; + reax->tbp[k][j].De_p = val; + val = atof(tmp[4]); reax->tbp[j][k].De_pp = val; + reax->tbp[k][j].De_pp = val; + val = atof(tmp[5]); reax->tbp[j][k].p_be1 = val; + reax->tbp[k][j].p_be1 = val; + val = atof(tmp[6]); reax->tbp[j][k].p_bo5 = val; + reax->tbp[k][j].p_bo5 = val; + val = atof(tmp[7]); reax->tbp[j][k].v13cor = val; + reax->tbp[k][j].v13cor = val; - val = atof(tmp[7]); - } - } + val = atof(tmp[8]); reax->tbp[j][k].p_bo6 = val; + reax->tbp[k][j].p_bo6 = val; + val = atof(tmp[9]); reax->tbp[j][k].p_ovun1 = val; + reax->tbp[k][j].p_ovun1 = val; - for (i=0; i < reax->num_atom_types; i++) - for (j=i; j < reax->num_atom_types; j++) { - reax->tbp[i][j].r_s = 0.5 * - (reax->sbp[i].r_s + reax->sbp[j].r_s); - reax->tbp[j][i].r_s = 0.5 * - (reax->sbp[j].r_s + reax->sbp[i].r_s); + /* line 2 */ + fgets(s,MAX_LINE,fp); + c=Tokenize(s,&tmp); + if (c < 8) + control->error_ptr->all(FLERR, "Inconsistent force field file"); - reax->tbp[i][j].r_p = 0.5 * - (reax->sbp[i].r_pi + reax->sbp[j].r_pi); - reax->tbp[j][i].r_p = 0.5 * - (reax->sbp[j].r_pi + reax->sbp[i].r_pi); + val = atof(tmp[0]); reax->tbp[j][k].p_be2 = val; + reax->tbp[k][j].p_be2 = val; + val = atof(tmp[1]); reax->tbp[j][k].p_bo3 = val; + reax->tbp[k][j].p_bo3 = val; + val = atof(tmp[2]); reax->tbp[j][k].p_bo4 = val; + reax->tbp[k][j].p_bo4 = val; + val = atof(tmp[3]); - reax->tbp[i][j].r_pp = 0.5 * - (reax->sbp[i].r_pi_pi + reax->sbp[j].r_pi_pi); - reax->tbp[j][i].r_pp = 0.5 * - (reax->sbp[j].r_pi_pi + reax->sbp[i].r_pi_pi); - - - reax->tbp[i][j].p_boc3 = - sqrt(reax->sbp[i].b_o_132 * - reax->sbp[j].b_o_132); - reax->tbp[j][i].p_boc3 = - sqrt(reax->sbp[j].b_o_132 * - reax->sbp[i].b_o_132); - - reax->tbp[i][j].p_boc4 = - sqrt(reax->sbp[i].b_o_131 * - reax->sbp[j].b_o_131); - reax->tbp[j][i].p_boc4 = - sqrt(reax->sbp[j].b_o_131 * - reax->sbp[i].b_o_131); - - reax->tbp[i][j].p_boc5 = - sqrt(reax->sbp[i].b_o_133 * - reax->sbp[j].b_o_133); - reax->tbp[j][i].p_boc5 = - sqrt(reax->sbp[j].b_o_133 * - reax->sbp[i].b_o_133); - - - reax->tbp[i][j].D = - sqrt(reax->sbp[i].epsilon * - reax->sbp[j].epsilon); - - reax->tbp[j][i].D = - sqrt(reax->sbp[j].epsilon * - reax->sbp[i].epsilon); - - reax->tbp[i][j].alpha = - sqrt(reax->sbp[i].alpha * - reax->sbp[j].alpha); - - reax->tbp[j][i].alpha = - sqrt(reax->sbp[j].alpha * - reax->sbp[i].alpha); - - reax->tbp[i][j].r_vdW = - 2.0 * sqrt(reax->sbp[i].r_vdw * reax->sbp[j].r_vdw); - - reax->tbp[j][i].r_vdW = - 2.0 * sqrt(reax->sbp[j].r_vdw * reax->sbp[i].r_vdw); - - reax->tbp[i][j].gamma_w = - sqrt(reax->sbp[i].gamma_w * - reax->sbp[j].gamma_w); - - reax->tbp[j][i].gamma_w = - sqrt(reax->sbp[j].gamma_w * - reax->sbp[i].gamma_w); - - reax->tbp[i][j].gamma = - pow(reax->sbp[i].gamma * - reax->sbp[j].gamma,-1.5); - - reax->tbp[j][i].gamma = - pow(reax->sbp[j].gamma * - reax->sbp[i].gamma,-1.5); - - // additions for additional vdWaals interaction types - inner core - - reax->tbp[i][j].rcore = reax->tbp[j][i].rcore = - sqrt( reax->sbp[i].rcore2 * reax->sbp[j].rcore2 ); - - reax->tbp[i][j].ecore = reax->tbp[j][i].ecore = - sqrt( reax->sbp[i].ecore2 * reax->sbp[j].ecore2 ); - - reax->tbp[i][j].acore = reax->tbp[j][i].acore = - sqrt( reax->sbp[i].acore2 * reax->sbp[j].acore2 ); - - // additions for additional vdWalls interaction types lg correction - - reax->tbp[i][j].lgcij = reax->tbp[j][i].lgcij = - sqrt( reax->sbp[i].lgcij * reax->sbp[j].lgcij ); - - reax->tbp[i][j].lgre = reax->tbp[j][i].lgre = 2.0 * reax->gp.l[35] * - sqrt( reax->sbp[i].lgre*reax->sbp[j].lgre ); - - } - - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - l = atoi(tmp[0]); - - for (i=0; i < l; i++) { - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - - if ((c < (lgflag ? 9 : 8)) || (j < 0) || (k < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types) { - val = atof(tmp[2]); - if (val > 0.0) { - reax->tbp[j][k].D = val; - reax->tbp[k][j].D = val; - } - - val = atof(tmp[3]); - if (val > 0.0) { - reax->tbp[j][k].r_vdW = 2 * val; - reax->tbp[k][j].r_vdW = 2 * val; - } - - val = atof(tmp[4]); - if (val > 0.0) { - reax->tbp[j][k].alpha = val; - reax->tbp[k][j].alpha = val; - } - - val = atof(tmp[5]); - if (val > 0.0) { - reax->tbp[j][k].r_s = val; - reax->tbp[k][j].r_s = val; - } - - val = atof(tmp[6]); - if (val > 0.0) { - reax->tbp[j][k].r_p = val; - reax->tbp[k][j].r_p = val; - } - - val = atof(tmp[7]); - if (val > 0.0) { - reax->tbp[j][k].r_pp = val; - reax->tbp[k][j].r_pp = val; - } - - if (lgflag) { - val = atof(tmp[8]); - if (val >= 0.0) { - reax->tbp[j][k].lgcij = val; - reax->tbp[k][j].lgcij = val; - } - } - } - } - - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - reax->thbp[i][j][k].cnt = 0; - - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - l = atoi( tmp[0] ); - - for (i = 0; i < l; i++) { - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - if ((c < 10) || (j < 0) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types && - m < reax->num_atom_types) { - cnt = reax->thbp[j][k][m].cnt; - reax->thbp[j][k][m].cnt++; - reax->thbp[m][k][j].cnt++; - - val = atof(tmp[3]); - reax->thbp[j][k][m].prm[cnt].theta_00 = val; - reax->thbp[m][k][j].prm[cnt].theta_00 = val; - - val = atof(tmp[4]); - reax->thbp[j][k][m].prm[cnt].p_val1 = val; - reax->thbp[m][k][j].prm[cnt].p_val1 = val; - - val = atof(tmp[5]); - reax->thbp[j][k][m].prm[cnt].p_val2 = val; - reax->thbp[m][k][j].prm[cnt].p_val2 = val; - - val = atof(tmp[6]); - reax->thbp[j][k][m].prm[cnt].p_coa1 = val; - reax->thbp[m][k][j].prm[cnt].p_coa1 = val; - - val = atof(tmp[7]); - reax->thbp[j][k][m].prm[cnt].p_val7 = val; - reax->thbp[m][k][j].prm[cnt].p_val7 = val; - - val = atof(tmp[8]); - reax->thbp[j][k][m].prm[cnt].p_pen1 = val; - reax->thbp[m][k][j].prm[cnt].p_pen1 = val; - - val = atof(tmp[9]); - reax->thbp[j][k][m].prm[cnt].p_val4 = val; - reax->thbp[m][k][j].prm[cnt].p_val4 = val; - } - } - - /* clear all entries first */ - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - for (m = 0; m < reax->num_atom_types; ++m) { - reax->fbp[i][j][k][m].cnt = 0; - tor_flag[i][j][k][m] = 0; - } - - /* next line is number of 4-body params and some comments */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - l = atoi( tmp[0] ); - - for (i = 0; i < l; i++) { - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - n = atoi(tmp[3]) - 1; - if ((c < 9) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j >= 0 && n >= 0) { // this means the entry is not in compact form - if (j < reax->num_atom_types && k < reax->num_atom_types && - m < reax->num_atom_types && n < reax->num_atom_types) { - tor_flag[j][k][m][n] = 1; - tor_flag[n][m][k][j] = 1; - - reax->fbp[j][k][m][n].cnt = 1; - reax->fbp[n][m][k][j].cnt = 1; - - val = atof(tmp[4]); - reax->fbp[j][k][m][n].prm[0].V1 = val; - reax->fbp[n][m][k][j].prm[0].V1 = val; - - val = atof(tmp[5]); - reax->fbp[j][k][m][n].prm[0].V2 = val; - reax->fbp[n][m][k][j].prm[0].V2 = val; - - val = atof(tmp[6]); - reax->fbp[j][k][m][n].prm[0].V3 = val; - reax->fbp[n][m][k][j].prm[0].V3 = val; + val = atof(tmp[4]); reax->tbp[j][k].p_bo1 = val; + reax->tbp[k][j].p_bo1 = val; + val = atof(tmp[5]); reax->tbp[j][k].p_bo2 = val; + reax->tbp[k][j].p_bo2 = val; + val = atof(tmp[6]); reax->tbp[j][k].ovc = val; + reax->tbp[k][j].ovc = val; val = atof(tmp[7]); - reax->fbp[j][k][m][n].prm[0].p_tor1 = val; - reax->fbp[n][m][k][j].prm[0].p_tor1 = val; + } + } + + for (i=0; i < reax->num_atom_types; i++) + for (j=i; j < reax->num_atom_types; j++) { + reax->tbp[i][j].r_s = 0.5 * + (reax->sbp[i].r_s + reax->sbp[j].r_s); + reax->tbp[j][i].r_s = 0.5 * + (reax->sbp[j].r_s + reax->sbp[i].r_s); + + reax->tbp[i][j].r_p = 0.5 * + (reax->sbp[i].r_pi + reax->sbp[j].r_pi); + reax->tbp[j][i].r_p = 0.5 * + (reax->sbp[j].r_pi + reax->sbp[i].r_pi); + + reax->tbp[i][j].r_pp = 0.5 * + (reax->sbp[i].r_pi_pi + reax->sbp[j].r_pi_pi); + reax->tbp[j][i].r_pp = 0.5 * + (reax->sbp[j].r_pi_pi + reax->sbp[i].r_pi_pi); + + + reax->tbp[i][j].p_boc3 = + sqrt(reax->sbp[i].b_o_132 * + reax->sbp[j].b_o_132); + reax->tbp[j][i].p_boc3 = + sqrt(reax->sbp[j].b_o_132 * + reax->sbp[i].b_o_132); + + reax->tbp[i][j].p_boc4 = + sqrt(reax->sbp[i].b_o_131 * + reax->sbp[j].b_o_131); + reax->tbp[j][i].p_boc4 = + sqrt(reax->sbp[j].b_o_131 * + reax->sbp[i].b_o_131); + + reax->tbp[i][j].p_boc5 = + sqrt(reax->sbp[i].b_o_133 * + reax->sbp[j].b_o_133); + reax->tbp[j][i].p_boc5 = + sqrt(reax->sbp[j].b_o_133 * + reax->sbp[i].b_o_133); + + + reax->tbp[i][j].D = + sqrt(reax->sbp[i].epsilon * + reax->sbp[j].epsilon); + + reax->tbp[j][i].D = + sqrt(reax->sbp[j].epsilon * + reax->sbp[i].epsilon); + + reax->tbp[i][j].alpha = + sqrt(reax->sbp[i].alpha * + reax->sbp[j].alpha); + + reax->tbp[j][i].alpha = + sqrt(reax->sbp[j].alpha * + reax->sbp[i].alpha); + + reax->tbp[i][j].r_vdW = + 2.0 * sqrt(reax->sbp[i].r_vdw * reax->sbp[j].r_vdw); + + reax->tbp[j][i].r_vdW = + 2.0 * sqrt(reax->sbp[j].r_vdw * reax->sbp[i].r_vdw); + + reax->tbp[i][j].gamma_w = + sqrt(reax->sbp[i].gamma_w * + reax->sbp[j].gamma_w); + + reax->tbp[j][i].gamma_w = + sqrt(reax->sbp[j].gamma_w * + reax->sbp[i].gamma_w); + + reax->tbp[i][j].gamma = + pow(reax->sbp[i].gamma * + reax->sbp[j].gamma,-1.5); + + reax->tbp[j][i].gamma = + pow(reax->sbp[j].gamma * + reax->sbp[i].gamma,-1.5); + + // additions for additional vdWaals interaction types - inner core + + reax->tbp[i][j].rcore = reax->tbp[j][i].rcore = + sqrt(reax->sbp[i].rcore2 * reax->sbp[j].rcore2); + + reax->tbp[i][j].ecore = reax->tbp[j][i].ecore = + sqrt(reax->sbp[i].ecore2 * reax->sbp[j].ecore2); + + reax->tbp[i][j].acore = reax->tbp[j][i].acore = + sqrt(reax->sbp[i].acore2 * reax->sbp[j].acore2); + + // additions for additional vdWalls interaction types lg correction + + reax->tbp[i][j].lgcij = reax->tbp[j][i].lgcij = + sqrt(reax->sbp[i].lgcij * reax->sbp[j].lgcij); + + reax->tbp[i][j].lgre = reax->tbp[j][i].lgre = 2.0 * reax->gp.l[35] * + sqrt(reax->sbp[i].lgre*reax->sbp[j].lgre); + + } + + fgets(s,MAX_LINE,fp); + c=Tokenize(s,&tmp); + l = atoi(tmp[0]); + + for (i=0; i < l; i++) { + fgets(s,MAX_LINE,fp); + c=Tokenize(s,&tmp); + + j = atoi(tmp[0]) - 1; + k = atoi(tmp[1]) - 1; + + if ((c < (lgflag ? 9 : 8)) || (j < 0) || (k < 0)) + control->error_ptr->all(FLERR, "Inconsistent force field file"); + + if (j < reax->num_atom_types && k < reax->num_atom_types) { + val = atof(tmp[2]); + if (val > 0.0) { + reax->tbp[j][k].D = val; + reax->tbp[k][j].D = val; + } + + val = atof(tmp[3]); + if (val > 0.0) { + reax->tbp[j][k].r_vdW = 2 * val; + reax->tbp[k][j].r_vdW = 2 * val; + } + + val = atof(tmp[4]); + if (val > 0.0) { + reax->tbp[j][k].alpha = val; + reax->tbp[k][j].alpha = val; + } + + val = atof(tmp[5]); + if (val > 0.0) { + reax->tbp[j][k].r_s = val; + reax->tbp[k][j].r_s = val; + } + + val = atof(tmp[6]); + if (val > 0.0) { + reax->tbp[j][k].r_p = val; + reax->tbp[k][j].r_p = val; + } + + val = atof(tmp[7]); + if (val > 0.0) { + reax->tbp[j][k].r_pp = val; + reax->tbp[k][j].r_pp = val; + } + + if (lgflag) { + val = atof(tmp[8]); + if (val >= 0.0) { + reax->tbp[j][k].lgcij = val; + reax->tbp[k][j].lgcij = val; + } + } + } + } + + for (i = 0; i < reax->num_atom_types; ++i) + for (j = 0; j < reax->num_atom_types; ++j) + for (k = 0; k < reax->num_atom_types; ++k) + reax->thbp[i][j][k].cnt = 0; + + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + l = atoi(tmp[0]); + + for (i = 0; i < l; i++) { + fgets(s,MAX_LINE,fp); + c=Tokenize(s,&tmp); + + j = atoi(tmp[0]) - 1; + k = atoi(tmp[1]) - 1; + m = atoi(tmp[2]) - 1; + if ((c < 10) || (j < 0) || (k < 0) || (m < 0)) + control->error_ptr->all(FLERR, "Inconsistent force field file"); + + if (j < reax->num_atom_types && k < reax->num_atom_types && + m < reax->num_atom_types) { + cnt = reax->thbp[j][k][m].cnt; + reax->thbp[j][k][m].cnt++; + reax->thbp[m][k][j].cnt++; + + val = atof(tmp[3]); + reax->thbp[j][k][m].prm[cnt].theta_00 = val; + reax->thbp[m][k][j].prm[cnt].theta_00 = val; + + val = atof(tmp[4]); + reax->thbp[j][k][m].prm[cnt].p_val1 = val; + reax->thbp[m][k][j].prm[cnt].p_val1 = val; + + val = atof(tmp[5]); + reax->thbp[j][k][m].prm[cnt].p_val2 = val; + reax->thbp[m][k][j].prm[cnt].p_val2 = val; + + val = atof(tmp[6]); + reax->thbp[j][k][m].prm[cnt].p_coa1 = val; + reax->thbp[m][k][j].prm[cnt].p_coa1 = val; + + val = atof(tmp[7]); + reax->thbp[j][k][m].prm[cnt].p_val7 = val; + reax->thbp[m][k][j].prm[cnt].p_val7 = val; val = atof(tmp[8]); - reax->fbp[j][k][m][n].prm[0].p_cot1 = val; - reax->fbp[n][m][k][j].prm[0].p_cot1 = val; + reax->thbp[j][k][m].prm[cnt].p_pen1 = val; + reax->thbp[m][k][j].prm[cnt].p_pen1 = val; + + val = atof(tmp[9]); + reax->thbp[j][k][m].prm[cnt].p_val4 = val; + reax->thbp[m][k][j].prm[cnt].p_val4 = val; } - } else { /* This means the entry is of the form 0-X-Y-0 */ - if (k < reax->num_atom_types && m < reax->num_atom_types) - for (p = 0; p < reax->num_atom_types; p++) - for (o = 0; o < reax->num_atom_types; o++) { - reax->fbp[p][k][m][o].cnt = 1; - reax->fbp[o][m][k][p].cnt = 1; + } - if (tor_flag[p][k][m][o] == 0) { - reax->fbp[p][k][m][o].prm[0].V1 = atof(tmp[4]); - reax->fbp[p][k][m][o].prm[0].V2 = atof(tmp[5]); - reax->fbp[p][k][m][o].prm[0].V3 = atof(tmp[6]); - reax->fbp[p][k][m][o].prm[0].p_tor1 = atof(tmp[7]); - reax->fbp[p][k][m][o].prm[0].p_cot1 = atof(tmp[8]); - } - - if (tor_flag[o][m][k][p] == 0) { - reax->fbp[o][m][k][p].prm[0].V1 = atof(tmp[4]); - reax->fbp[o][m][k][p].prm[0].V2 = atof(tmp[5]); - reax->fbp[o][m][k][p].prm[0].V3 = atof(tmp[6]); - reax->fbp[o][m][k][p].prm[0].p_tor1 = atof(tmp[7]); - reax->fbp[o][m][k][p].prm[0].p_cot1 = atof(tmp[8]); - } + /* clear all entries first */ + for (i = 0; i < reax->num_atom_types; ++i) + for (j = 0; j < reax->num_atom_types; ++j) + for (k = 0; k < reax->num_atom_types; ++k) + for (m = 0; m < reax->num_atom_types; ++m) { + reax->fbp[i][j][k][m].cnt = 0; + tor_flag[i][j][k][m] = 0; } - } - } - /* next line is number of hydrogen bond params and some comments */ - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); - l = atoi( tmp[0] ); + /* next line is number of 4-body params and some comments */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + l = atoi(tmp[0]); - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - reax->hbp[i][j][k].r0_hb = -1.0; + for (i = 0; i < l; i++) { + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); - for (i = 0; i < l; i++) { - fgets( s, MAX_LINE, fp ); - c = Tokenize( s, &tmp ); + j = atoi(tmp[0]) - 1; + k = atoi(tmp[1]) - 1; + m = atoi(tmp[2]) - 1; + n = atoi(tmp[3]) - 1; + if ((c < 9) || (k < 0) || (m < 0)) + control->error_ptr->all(FLERR, "Inconsistent force field file"); - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - if ((c < 7) || (j < 0) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); + if (j >= 0 && n >= 0) { // this means the entry is not in compact form + if (j < reax->num_atom_types && k < reax->num_atom_types && + m < reax->num_atom_types && n < reax->num_atom_types) { + tor_flag[j][k][m][n] = 1; + tor_flag[n][m][k][j] = 1; - if (j < reax->num_atom_types && m < reax->num_atom_types) { - val = atof(tmp[3]); - reax->hbp[j][k][m].r0_hb = val; + reax->fbp[j][k][m][n].cnt = 1; + reax->fbp[n][m][k][j].cnt = 1; - val = atof(tmp[4]); - reax->hbp[j][k][m].p_hb1 = val; + val = atof(tmp[4]); + reax->fbp[j][k][m][n].prm[0].V1 = val; + reax->fbp[n][m][k][j].prm[0].V1 = val; - val = atof(tmp[5]); - reax->hbp[j][k][m].p_hb2 = val; + val = atof(tmp[5]); + reax->fbp[j][k][m][n].prm[0].V2 = val; + reax->fbp[n][m][k][j].prm[0].V2 = val; - val = atof(tmp[6]); - reax->hbp[j][k][m].p_hb3 = val; - } - } + val = atof(tmp[6]); + reax->fbp[j][k][m][n].prm[0].V3 = val; + reax->fbp[n][m][k][j].prm[0].V3 = val; - /* deallocate helper storage */ - for (i = 0; i < MAX_TOKENS; i++) - free( tmp[i] ); - free( tmp ); - free( s ); + val = atof(tmp[7]); + reax->fbp[j][k][m][n].prm[0].p_tor1 = val; + reax->fbp[n][m][k][j].prm[0].p_tor1 = val; + val = atof(tmp[8]); + reax->fbp[j][k][m][n].prm[0].p_cot1 = val; + reax->fbp[n][m][k][j].prm[0].p_cot1 = val; + } + } else { /* This means the entry is of the form 0-X-Y-0 */ + if (k < reax->num_atom_types && m < reax->num_atom_types) + for (p = 0; p < reax->num_atom_types; p++) + for (o = 0; o < reax->num_atom_types; o++) { + reax->fbp[p][k][m][o].cnt = 1; + reax->fbp[o][m][k][p].cnt = 1; - /* deallocate tor_flag */ - for (i = 0; i < reax->num_atom_types; i++) { - for (j = 0; j < reax->num_atom_types; j++) { - for (k = 0; k < reax->num_atom_types; k++) { - free( tor_flag[i][j][k] ); + if (tor_flag[p][k][m][o] == 0) { + reax->fbp[p][k][m][o].prm[0].V1 = atof(tmp[4]); + reax->fbp[p][k][m][o].prm[0].V2 = atof(tmp[5]); + reax->fbp[p][k][m][o].prm[0].V3 = atof(tmp[6]); + reax->fbp[p][k][m][o].prm[0].p_tor1 = atof(tmp[7]); + reax->fbp[p][k][m][o].prm[0].p_cot1 = atof(tmp[8]); + } + + if (tor_flag[o][m][k][p] == 0) { + reax->fbp[o][m][k][p].prm[0].V1 = atof(tmp[4]); + reax->fbp[o][m][k][p].prm[0].V2 = atof(tmp[5]); + reax->fbp[o][m][k][p].prm[0].V3 = atof(tmp[6]); + reax->fbp[o][m][k][p].prm[0].p_tor1 = atof(tmp[7]); + reax->fbp[o][m][k][p].prm[0].p_cot1 = atof(tmp[8]); + } + } } - free( tor_flag[i][j] ); } - free( tor_flag[i] ); + + /* next line is number of hydrogen bond params and some comments */ + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + l = atoi(tmp[0]); + + for (i = 0; i < reax->num_atom_types; ++i) + for (j = 0; j < reax->num_atom_types; ++j) + for (k = 0; k < reax->num_atom_types; ++k) + reax->hbp[i][j][k].r0_hb = -1.0; + + for (i = 0; i < l; i++) { + fgets(s, MAX_LINE, fp); + c = Tokenize(s, &tmp); + + j = atoi(tmp[0]) - 1; + k = atoi(tmp[1]) - 1; + m = atoi(tmp[2]) - 1; + if ((c < 7) || (j < 0) || (k < 0) || (m < 0)) + control->error_ptr->all(FLERR, "Inconsistent force field file"); + + if (j < reax->num_atom_types && m < reax->num_atom_types) { + val = atof(tmp[3]); + reax->hbp[j][k][m].r0_hb = val; + + val = atof(tmp[4]); + reax->hbp[j][k][m].p_hb1 = val; + + val = atof(tmp[5]); + reax->hbp[j][k][m].p_hb2 = val; + + val = atof(tmp[6]); + reax->hbp[j][k][m].p_hb3 = val; + } + } + + /* deallocate helper storage */ + for (i = 0; i < MAX_TOKENS; i++) + free(tmp[i]); + free(tmp); + free(s); + + + /* deallocate tor_flag */ + for (i = 0; i < reax->num_atom_types; i++) { + for (j = 0; j < reax->num_atom_types; j++) { + for (k = 0; k < reax->num_atom_types; k++) { + free(tor_flag[i][j][k]); + } + free(tor_flag[i][j]); + } + free(tor_flag[i]); + } + free(tor_flag); + + // close file + + fclose(fp); } - free( tor_flag ); - - // close file - - fclose(fp); } diff --git a/src/USER-REAXC/reaxc_ffield.h b/src/USER-REAXC/reaxc_ffield.h deleted file mode 100644 index f7a97f0636..0000000000 --- a/src/USER-REAXC/reaxc_ffield.h +++ /dev/null @@ -1,34 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef LMP_REAXC_FFIELD_H -#define LMP_REAXC_FFIELD_H - -#include "reaxc_types.h" - -void Read_Force_Field(const char *, reax_interaction *, control_params *); - -#endif diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 7e412afbd6..ebc042ebe5 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -24,410 +24,369 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_forces.h" +#include "reaxff_api.h" + #include #include #include -#include "reaxc_bond_orders.h" -#include "reaxc_bonds.h" -#include "reaxc_hydrogen_bonds.h" -#include "reaxc_list.h" -#include "reaxc_multi_body.h" -#include "reaxc_nonbonded.h" -#include "reaxc_torsion_angles.h" -#include "reaxc_valence_angles.h" -#include "reaxc_vector.h" #include "error.h" -interaction_function Interaction_Functions[NUM_INTRS]; - -void Dummy_Interaction(reax_system * /*system*/, control_params * /*control*/, - simulation_data * /*data*/, storage * /*workspace*/, - reax_list ** /*lists*/, output_controls * /*out_control*/ ) -{ -} - - -void Init_Force_Functions(control_params *control) -{ - Interaction_Functions[0] = BO; - Interaction_Functions[1] = Bonds; //Dummy_Interaction; - Interaction_Functions[2] = Atom_Energy; //Dummy_Interaction; - Interaction_Functions[3] = Valence_Angles; //Dummy_Interaction; - Interaction_Functions[4] = Torsion_Angles; //Dummy_Interaction; - if (control->hbond_cut > 0) - Interaction_Functions[5] = Hydrogen_Bonds; - else Interaction_Functions[5] = Dummy_Interaction; - Interaction_Functions[6] = Dummy_Interaction; //empty - Interaction_Functions[7] = Dummy_Interaction; //empty - Interaction_Functions[8] = Dummy_Interaction; //empty - Interaction_Functions[9] = Dummy_Interaction; //empty -} - - -void Compute_Bonded_Forces(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ - int i; - - /* Implement all force calls as function pointers */ - for (i = 0; i < NUM_INTRS; i++) { - (Interaction_Functions[i])( system, control, data, workspace, - lists, out_control ); +namespace ReaxFF { + + static void Compute_Bonded_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) + { + BO(system, control, data, workspace, lists, out_control); + Bonds(system, data, workspace, lists); + Atom_Energy(system, control, data, workspace, lists); + Valence_Angles(system, control, data, workspace, lists); + Torsion_Angles(system, control, data, workspace, lists); + if (control->hbond_cut > 0) + Hydrogen_Bonds(system, control, data, workspace, lists); } -} + static void Compute_NonBonded_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { -void Compute_NonBonded_Forces(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ + /* van der Waals and Coulomb interactions */ + if (control->tabulate == 0) + vdW_Coulomb_Energy(system, control, data, workspace, lists); + else + Tabulated_vdW_Coulomb_Energy(system, control, data, workspace, lists); + } - /* van der Waals and Coulomb interactions */ - if (control->tabulate == 0) - vdW_Coulomb_Energy( system, control, data, workspace, - lists, out_control ); - else - Tabulated_vdW_Coulomb_Energy( system, control, data, workspace, - lists, out_control ); -} + static void Compute_Total_Force(reax_system *system, control_params *control, + storage *workspace, reax_list **lists) + { + int i, pj; + reax_list *bonds = (*lists) + BONDS; + for (i = 0; i < system->N; ++i) + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) + if (i < bonds->select.bond_list[pj].nbr) { + if (control->virial == 0) + Add_dBond_to_Forces(system, i, pj, workspace, lists); + else + Add_dBond_to_Forces_NPT(i, pj, workspace, lists); + } -void Compute_Total_Force(reax_system *system, control_params *control, - storage *workspace, reax_list **lists) -{ - int i, pj; - reax_list *bonds = (*lists) + BONDS; + } - for (i = 0; i < system->N; ++i) - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) - if (i < bonds->select.bond_list[pj].nbr) { - if (control->virial == 0) - Add_dBond_to_Forces( system, i, pj, workspace, lists ); - else - Add_dBond_to_Forces_NPT( i, pj, workspace, lists ); + static void Validate_Lists(reax_system *system, reax_list **lists, + int step, int N, int numH) + { + int i, comp, Hindex; + reax_list *bonds, *hbonds; + + double saferzone = system->saferzone; + + /* bond list */ + if (N > 0) { + bonds = *lists + BONDS; + + for (i = 0; i < N; ++i) { + system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); + + if (i < N-1) + comp = Start_Index(i+1, bonds); + else comp = bonds->num_intrs; + + 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)); } + } -} -void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **lists, - int step, int /*n*/, int N, int numH ) -{ - int i, comp, Hindex; - reax_list *bonds, *hbonds; + /* hbonds list */ + if (numH > 0) { + hbonds = *lists + HBONDS; - double saferzone = system->saferzone; + for (i = 0; i < N; ++i) { + Hindex = system->my_atoms[i].Hindex; + if (Hindex > -1) { + system->my_atoms[i].num_hbonds = + (int)(MAX(Num_Entries(Hindex, hbonds)*saferzone, system->minhbonds)); - /* bond list */ - if (N > 0) { - bonds = *lists + BONDS; + //if(Num_Entries(i, hbonds) >= + //(Start_Index(i+1,hbonds)-Start_Index(i,hbonds))*0.90/*DANGER_ZONE*/) { + // workspace->realloc.hbonds = 1; - for (i = 0; i < N; ++i) { - system->my_atoms[i].num_bonds = MAX(Num_Entries(i,bonds)*2, MIN_BONDS); + if (Hindex < numH-1) + comp = Start_Index(Hindex+1, hbonds); + else comp = hbonds->num_intrs; - if (i < N-1) - comp = Start_Index(i+1, bonds); - else comp = bonds->num_intrs; - - 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)); + 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)); + } + } } } + static void Init_Forces_noQEq(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) { + int i, j, pj; + int start_i, end_i; + int type_i, type_j; + int btop_i, num_bonds, num_hbonds; + int ihb, jhb, ihb_top, jhb_top; + int local, flag; + double cutoff; + reax_list *far_nbrs, *bonds, *hbonds; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + reax_atom *atom_i, *atom_j; - /* hbonds list */ - if (numH > 0) { + far_nbrs = *lists + FAR_NBRS; + bonds = *lists + BONDS; hbonds = *lists + HBONDS; - for (i = 0; i < N; ++i) { - Hindex = system->my_atoms[i].Hindex; - if (Hindex > -1) { - system->my_atoms[i].num_hbonds = - (int)(MAX(Num_Entries(Hindex, hbonds)*saferzone, system->minhbonds)); + for (i = 0; i < system->n; ++i) + workspace->bond_mark[i] = 0; + for (i = system->n; i < system->N; ++i) { + workspace->bond_mark[i] = 1000; // put ghost atoms to an infinite distance + } - //if( Num_Entries(i, hbonds) >= - //(Start_Index(i+1,hbonds)-Start_Index(i,hbonds))*0.90/*DANGER_ZONE*/) { - // workspace->realloc.hbonds = 1; + num_bonds = 0; + num_hbonds = 0; + btop_i = 0; - if (Hindex < numH-1) - comp = Start_Index(Hindex+1, hbonds); - else comp = hbonds->num_intrs; + for (i = 0; i < system->N; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + if (type_i < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + btop_i = End_Index(i, bonds); + sbp_i = &(system->reax_param.sbp[type_i]); - 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)); + if (i < system->n) { + local = 1; + cutoff = MAX(control->hbond_cut, control->bond_cut); + } else { + local = 0; + cutoff = control->bond_cut; } - } - } -} - -void Init_Forces_noQEq( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/) { - int i, j, pj; - int start_i, end_i; - int type_i, type_j; - int btop_i, num_bonds, num_hbonds; - int ihb, jhb, ihb_top, jhb_top; - int local, flag; - double cutoff; - reax_list *far_nbrs, *bonds, *hbonds; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - far_neighbor_data *nbr_pj; - reax_atom *atom_i, *atom_j; - - far_nbrs = *lists + FAR_NBRS; - bonds = *lists + BONDS; - hbonds = *lists + HBONDS; - - for (i = 0; i < system->n; ++i) - workspace->bond_mark[i] = 0; - for (i = system->n; i < system->N; ++i) { - workspace->bond_mark[i] = 1000; // put ghost atoms to an infinite distance - } - - num_bonds = 0; - num_hbonds = 0; - btop_i = 0; - - for (i = 0; i < system->N; ++i) { - atom_i = &(system->my_atoms[i]); - type_i = atom_i->type; - if (type_i < 0) continue; - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); - btop_i = End_Index( i, bonds ); - sbp_i = &(system->reax_param.sbp[type_i]); - - if (i < system->n) { - local = 1; - cutoff = MAX( control->hbond_cut, control->bond_cut ); - } else { - local = 0; - cutoff = control->bond_cut; - } - - ihb = -1; - ihb_top = -1; - if (local && control->hbond_cut > 0) { - ihb = sbp_i->p_hbond; - if (ihb == 1) - ihb_top = End_Index( atom_i->Hindex, hbonds ); - else ihb_top = -1; - } - - /* update i-j distance - check if j is within cutoff */ - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); - j = nbr_pj->nbr; - atom_j = &(system->my_atoms[j]); - - if (nbr_pj->d <= cutoff) - flag = 1; - else flag = 0; - - if (flag) { - type_j = atom_j->type; - if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[type_j]); - twbp = &(system->reax_param.tbp[type_i][type_j]); - - if (local) { - /* hydrogen bond lists */ - if (control->hbond_cut > 0 && (ihb==1 || ihb==2) && - nbr_pj->d <= control->hbond_cut) { - // fprintf( stderr, "%d %d\n", atom1, atom2 ); - jhb = sbp_j->p_hbond; - if (ihb == 1 && jhb == 2) { - hbonds->select.hbond_list[ihb_top].nbr = j; - hbonds->select.hbond_list[ihb_top].scl = 1; - hbonds->select.hbond_list[ihb_top].ptr = nbr_pj; - ++ihb_top; - ++num_hbonds; - } - else if (j < system->n && ihb == 2 && jhb == 1) { - jhb_top = End_Index( atom_j->Hindex, hbonds ); - hbonds->select.hbond_list[jhb_top].nbr = i; - hbonds->select.hbond_list[jhb_top].scl = -1; - hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; - Set_End_Index( atom_j->Hindex, jhb_top+1, hbonds ); - ++num_hbonds; - } - } - } - - if (//(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) && - nbr_pj->d <= control->bond_cut && - BOp( workspace, bonds, control->bo_cut, - i , btop_i, nbr_pj, sbp_i, sbp_j, twbp )) { - num_bonds += 2; - ++btop_i; - - if (workspace->bond_mark[j] > workspace->bond_mark[i] + 1) - workspace->bond_mark[j] = workspace->bond_mark[i] + 1; - else if (workspace->bond_mark[i] > workspace->bond_mark[j] + 1) { - workspace->bond_mark[i] = workspace->bond_mark[j] + 1; - } - } - } - } - - Set_End_Index( i, btop_i, bonds ); - if (local && ihb == 1) - Set_End_Index( atom_i->Hindex, ihb_top, hbonds ); - } - - - workspace->realloc.num_bonds = num_bonds; - workspace->realloc.num_hbonds = num_hbonds; - - Validate_Lists( system, workspace, lists, data->step, - system->n, system->N, system->numH); -} - - -void Estimate_Storages( reax_system *system, control_params *control, - reax_list **lists, int *Htop, int *hb_top, - int *bond_top, int *num_3body ) -{ - int i, j, pj; - int start_i, end_i; - int type_i, type_j; - int ihb, jhb; - int local; - double cutoff; - double r_ij; - double C12, C34, C56; - double BO, BO_s, BO_pi, BO_pi2; - reax_list *far_nbrs; - single_body_parameters *sbp_i, *sbp_j; - two_body_parameters *twbp; - far_neighbor_data *nbr_pj; - reax_atom *atom_i, *atom_j; - - int mincap = system->mincap; - double safezone = system->safezone; - double saferzone = system->saferzone; - - far_nbrs = *lists + FAR_NBRS; - *Htop = 0; - memset( hb_top, 0, sizeof(int) * system->local_cap ); - memset( bond_top, 0, sizeof(int) * system->total_cap ); - *num_3body = 0; - - for (i = 0; i < system->N; ++i) { - atom_i = &(system->my_atoms[i]); - type_i = atom_i->type; - if (type_i < 0) continue; - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); - sbp_i = &(system->reax_param.sbp[type_i]); - - if (i < system->n) { - local = 1; - cutoff = control->nonb_cut; - ++(*Htop); - ihb = sbp_i->p_hbond; - } else { - local = 0; - cutoff = control->bond_cut; ihb = -1; - } + ihb_top = -1; + if (local && control->hbond_cut > 0) { + ihb = sbp_i->p_hbond; + if (ihb == 1) + ihb_top = End_Index(atom_i->Hindex, hbonds); + else ihb_top = -1; + } - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &( far_nbrs->select.far_nbr_list[pj] ); - j = nbr_pj->nbr; - atom_j = &(system->my_atoms[j]); + /* update i-j distance - check if j is within cutoff */ + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); - if (nbr_pj->d <= cutoff) { - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - r_ij = nbr_pj->d; - sbp_j = &(system->reax_param.sbp[type_j]); - twbp = &(system->reax_param.tbp[type_i][type_j]); + if (nbr_pj->d <= cutoff) + flag = 1; + else flag = 0; - if (local) { - if (j < system->n || atom_i->orig_id < atom_j->orig_id) //tryQEq ||1 - ++(*Htop); + if (flag) { + type_j = atom_j->type; + if (type_j < 0) continue; + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); - /* hydrogen bond lists */ - if (control->hbond_cut > 0.1 && (ihb==1 || ihb==2) && - nbr_pj->d <= control->hbond_cut) { - jhb = sbp_j->p_hbond; - if (ihb == 1 && jhb == 2) - ++hb_top[i]; - else if (j < system->n && ihb == 2 && jhb == 1) - ++hb_top[j]; + if (local) { + /* hydrogen bond lists */ + if (control->hbond_cut > 0 && (ihb==1 || ihb==2) && + nbr_pj->d <= control->hbond_cut) { + // fprintf(stderr, "%d %d\n", atom1, atom2); + jhb = sbp_j->p_hbond; + if (ihb == 1 && jhb == 2) { + hbonds->select.hbond_list[ihb_top].nbr = j; + hbonds->select.hbond_list[ihb_top].scl = 1; + hbonds->select.hbond_list[ihb_top].ptr = nbr_pj; + ++ihb_top; + ++num_hbonds; + } + else if (j < system->n && ihb == 2 && jhb == 1) { + jhb_top = End_Index(atom_j->Hindex, hbonds); + hbonds->select.hbond_list[jhb_top].nbr = i; + hbonds->select.hbond_list[jhb_top].scl = -1; + hbonds->select.hbond_list[jhb_top].ptr = nbr_pj; + Set_End_Index(atom_j->Hindex, jhb_top+1, hbonds); + ++num_hbonds; + } + } + } + + if (//(workspace->bond_mark[i] < 3 || workspace->bond_mark[j] < 3) && + nbr_pj->d <= control->bond_cut && + BOp(workspace, bonds, control->bo_cut, + i , btop_i, nbr_pj, sbp_i, sbp_j, twbp)) { + num_bonds += 2; + ++btop_i; + + if (workspace->bond_mark[j] > workspace->bond_mark[i] + 1) + workspace->bond_mark[j] = workspace->bond_mark[i] + 1; + else if (workspace->bond_mark[i] > workspace->bond_mark[j] + 1) { + workspace->bond_mark[i] = workspace->bond_mark[j] + 1; + } } } + } - /* uncorrected bond orders */ - if (nbr_pj->d <= control->bond_cut) { - if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { - C12 = twbp->p_bo1 * pow( r_ij / twbp->r_s, twbp->p_bo2 ); - BO_s = (1.0 + control->bo_cut) * exp( C12 ); + Set_End_Index(i, btop_i, bonds); + if (local && ihb == 1) + Set_End_Index(atom_i->Hindex, ihb_top, hbonds); + } + + + workspace->realloc.num_bonds = num_bonds; + workspace->realloc.num_hbonds = num_hbonds; + + Validate_Lists(system, lists, data->step, system->N, system->numH); + } + + void Estimate_Storages(reax_system *system, control_params *control, + reax_list **lists, int *Htop, int *hb_top, + int *bond_top, int *num_3body) + { + int i, j, pj; + int start_i, end_i; + int type_i, type_j; + int ihb, jhb; + int local; + double cutoff; + double r_ij; + double C12, C34, C56; + double BO, BO_s, BO_pi, BO_pi2; + reax_list *far_nbrs; + single_body_parameters *sbp_i, *sbp_j; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + reax_atom *atom_i, *atom_j; + + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; + + far_nbrs = *lists + FAR_NBRS; + *Htop = 0; + memset(hb_top, 0, sizeof(int) * system->local_cap); + memset(bond_top, 0, sizeof(int) * system->total_cap); + *num_3body = 0; + + for (i = 0; i < system->N; ++i) { + atom_i = &(system->my_atoms[i]); + type_i = atom_i->type; + if (type_i < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + sbp_i = &(system->reax_param.sbp[type_i]); + + if (i < system->n) { + local = 1; + cutoff = control->nonb_cut; + ++(*Htop); + ihb = sbp_i->p_hbond; + } else { + local = 0; + cutoff = control->bond_cut; + ihb = -1; + } + + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + atom_j = &(system->my_atoms[j]); + + if (nbr_pj->d <= cutoff) { + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + r_ij = nbr_pj->d; + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); + + if (local) { + if (j < system->n || atom_i->orig_id < atom_j->orig_id) //tryQEq ||1 + ++(*Htop); + + /* hydrogen bond lists */ + if (control->hbond_cut > 0.1 && (ihb==1 || ihb==2) && + nbr_pj->d <= control->hbond_cut) { + jhb = sbp_j->p_hbond; + if (ihb == 1 && jhb == 2) + ++hb_top[i]; + else if (j < system->n && ihb == 2 && jhb == 1) + ++hb_top[j]; + } } - else BO_s = C12 = 0.0; - if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { - C34 = twbp->p_bo3 * pow( r_ij / twbp->r_p, twbp->p_bo4 ); - BO_pi = exp( C34 ); - } - else BO_pi = C34 = 0.0; + /* uncorrected bond orders */ + if (nbr_pj->d <= control->bond_cut) { + if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { + C12 = twbp->p_bo1 * pow(r_ij / twbp->r_s, twbp->p_bo2); + BO_s = (1.0 + control->bo_cut) * exp(C12); + } + else BO_s = C12 = 0.0; - if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { - C56 = twbp->p_bo5 * pow( r_ij / twbp->r_pp, twbp->p_bo6 ); - BO_pi2= exp( C56 ); - } - else BO_pi2 = C56 = 0.0; + if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { + C34 = twbp->p_bo3 * pow(r_ij / twbp->r_p, twbp->p_bo4); + BO_pi = exp(C34); + } + else BO_pi = C34 = 0.0; - /* Initially BO values are the uncorrected ones, page 1 */ - BO = BO_s + BO_pi + BO_pi2; + if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { + C56 = twbp->p_bo5 * pow(r_ij / twbp->r_pp, twbp->p_bo6); + BO_pi2= exp(C56); + } + else BO_pi2 = C56 = 0.0; - if (BO >= control->bo_cut) { - ++bond_top[i]; - ++bond_top[j]; + /* Initially BO values are the uncorrected ones, page 1 */ + BO = BO_s + BO_pi + BO_pi2; + + if (BO >= control->bo_cut) { + ++bond_top[i]; + ++bond_top[j]; + } } } } } + + *Htop = (int)(MAX(*Htop * safezone, mincap * MIN_HENTRIES)); + for (i = 0; i < system->n; ++i) + hb_top[i] = (int)(MAX(hb_top[i] * saferzone, system->minhbonds)); + + for (i = 0; i < system->N; ++i) { + *num_3body += SQR(bond_top[i]); + bond_top[i] = MAX(bond_top[i] * 2, MIN_BONDS); + } + } - *Htop = (int)(MAX( *Htop * safezone, mincap * MIN_HENTRIES )); - for (i = 0; i < system->n; ++i) - hb_top[i] = (int)(MAX(hb_top[i] * saferzone, system->minhbonds)); + void Compute_Forces(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) + { - for (i = 0; i < system->N; ++i) { - *num_3body += SQR(bond_top[i]); - bond_top[i] = MAX( bond_top[i] * 2, MIN_BONDS ); + Init_Forces_noQEq(system, control, data, workspace, lists); + + /********* bonded interactions ************/ + Compute_Bonded_Forces(system, control, data, workspace, + lists, out_control); + + /********* nonbonded interactions ************/ + Compute_NonBonded_Forces(system, control, data, workspace, lists); + + /*********** total force ***************/ + Compute_Total_Force(system, control, workspace, lists); } - -} - - -void Compute_Forces(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) -{ - - Init_Forces_noQEq(system, control, data, workspace, - lists, out_control); - - /********* bonded interactions ************/ - Compute_Bonded_Forces(system, control, data, workspace, - lists, out_control); - - /********* nonbonded interactions ************/ - Compute_NonBonded_Forces(system, control, data, workspace, - lists, out_control); - - /*********** total force ***************/ - Compute_Total_Force(system, control, workspace, lists); } diff --git a/src/USER-REAXC/reaxc_forces.h b/src/USER-REAXC/reaxc_forces.h deleted file mode 100644 index b679a66650..0000000000 --- a/src/USER-REAXC/reaxc_forces.h +++ /dev/null @@ -1,40 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __FORCES_H_ -#define __FORCES_H_ - -#include "reaxc_types.h" -#include "reaxc_defs.h" - -extern interaction_function Interaction_Functions[NUM_INTRS]; - -void Init_Force_Functions(control_params *); -void Compute_Forces( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*); -void Estimate_Storages( reax_system*, control_params*, reax_list**, - int*, int*, int*, int* ); -#endif diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp index 4391bf769a..43362ac878 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp @@ -24,157 +24,157 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_hydrogen_bonds.h" +#include "reaxff_api.h" + #include + #include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_valence_angles.h" -#include "reaxc_vector.h" -void Hydrogen_Bonds( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/ ) -{ - int i, j, k, pi, pk; - int type_i, type_j, type_k; - int start_j, end_j, hb_start_j, hb_end_j; - int hblist[MAX_BONDS]; - int itr, top; - int num_hb_intrs = 0; - ivec rel_jk; - double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; - double e_hb, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; - rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force; - hbond_parameters *hbp; - bond_order_data *bo_ij; - bond_data *pbond_ij; - far_neighbor_data *nbr_jk; - reax_list *bonds, *hbonds; - bond_data *bond_list; - hbond_data *hbond_list; +namespace ReaxFF { + void Hydrogen_Bonds(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int i, j, k, pi, pk; + int type_i, type_j, type_k; + int start_j, end_j, hb_start_j, hb_end_j; + int hblist[MAX_BONDS]; + int itr, top; + int num_hb_intrs = 0; + ivec rel_jk; + double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; + double e_hb, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; + rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; + rvec dvec_jk, force; + hbond_parameters *hbp; + bond_order_data *bo_ij; + bond_data *pbond_ij; + far_neighbor_data *nbr_jk; + reax_list *bonds, *hbonds; + bond_data *bond_list; + hbond_data *hbond_list; - // tally variables - double fi_tmp[3], fk_tmp[3], delij[3], delkj[3]; + // tally variables + double fi_tmp[3], fk_tmp[3], delij[3], delkj[3]; - bonds = (*lists) + BONDS; - bond_list = bonds->select.bond_list; - hbonds = (*lists) + HBONDS; - hbond_list = hbonds->select.hbond_list; + bonds = (*lists) + BONDS; + bond_list = bonds->select.bond_list; + hbonds = (*lists) + HBONDS; + hbond_list = hbonds->select.hbond_list; - for (j = 0; j < system->n; ++j) - if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { - type_j = system->my_atoms[j].type; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); - hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); - hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); - if (type_j < 0) continue; + for (j = 0; j < system->n; ++j) + if (system->reax_param.sbp[system->my_atoms[j].type].p_hbond == 1) { + type_j = system->my_atoms[j].type; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); + hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); + if (type_j < 0) continue; - top = 0; - for (pi = start_j; pi < end_j; ++pi) { - pbond_ij = &( bond_list[pi] ); - i = pbond_ij->nbr; - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - bo_ij = &(pbond_ij->bo_data); - - if ( system->reax_param.sbp[type_i].p_hbond == 2 && - bo_ij->BO >= HB_THRESHOLD ) - hblist[top++] = pi; - } - - for (pk = hb_start_j; pk < hb_end_j; ++pk) { - /* set k's varibles */ - k = hbond_list[pk].nbr; - type_k = system->my_atoms[k].type; - if (type_k < 0) continue; - nbr_jk = hbond_list[pk].ptr; - r_jk = nbr_jk->d; - rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); - - for (itr = 0; itr < top; ++itr) { - pi = hblist[itr]; - pbond_ij = &( bonds->select.bond_list[pi] ); + top = 0; + for (pi = start_j; pi < end_j; ++pi) { + pbond_ij = &( bond_list[pi] ); i = pbond_ij->nbr; + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + bo_ij = &(pbond_ij->bo_data); - if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { - bo_ij = &(pbond_ij->bo_data); - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); - if (hbp->r0_hb <= 0.0) continue; - ++num_hb_intrs; + if ( system->reax_param.sbp[type_i].p_hbond == 2 && + bo_ij->BO >= HB_THRESHOLD ) + hblist[top++] = pi; + } - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &theta, &cos_theta ); - /* the derivative of cos(theta) */ - Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &dcos_theta_di, &dcos_theta_dj, - &dcos_theta_dk ); + for (pk = hb_start_j; pk < hb_end_j; ++pk) { + /* set k's varibles */ + k = hbond_list[pk].nbr; + type_k = system->my_atoms[k].type; + if (type_k < 0) continue; + nbr_jk = hbond_list[pk].ptr; + r_jk = nbr_jk->d; + rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); - /* hyrogen bond energy*/ - sin_theta2 = sin( theta/2.0 ); - sin_xhz4 = SQR(sin_theta2); - sin_xhz4 *= sin_xhz4; - cos_xhz1 = ( 1.0 - cos_theta ); - exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); - exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + - r_jk / hbp->r0_hb - 2.0 ) ); + for (itr = 0; itr < top; ++itr) { + pi = hblist[itr]; + pbond_ij = &( bonds->select.bond_list[pi] ); + i = pbond_ij->nbr; - data->my_en.e_hb += e_hb = - hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; + if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { + bo_ij = &(pbond_ij->bo_data); + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); + if (hbp->r0_hb <= 0.0) continue; + ++num_hb_intrs; - CEhb1 = hbp->p_hb1 * hbp->p_hb2 * exp_hb2 * exp_hb3 * sin_xhz4; - CEhb2 = -hbp->p_hb1/2.0 * (1.0 - exp_hb2) * exp_hb3 * cos_xhz1; - CEhb3 = -hbp->p_hb3 * - (-hbp->r0_hb / SQR(r_jk) + 1.0 / hbp->r0_hb) * e_hb; + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &theta, &cos_theta ); + /* the derivative of cos(theta) */ + Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &dcos_theta_di, &dcos_theta_dj, + &dcos_theta_dk ); - /* hydrogen bond forces */ - bo_ij->Cdbo += CEhb1; // dbo term + /* hyrogen bond energy*/ + sin_theta2 = sin( theta/2.0 ); + sin_xhz4 = SQR(sin_theta2); + sin_xhz4 *= sin_xhz4; + cos_xhz1 = ( 1.0 - cos_theta ); + exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); + exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + + r_jk / hbp->r0_hb - 2.0 ) ); - if (control->virial == 0) { - // dcos terms - rvec_ScaledAdd( workspace->f[i], +CEhb2, dcos_theta_di ); - rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); - rvec_ScaledAdd( workspace->f[k], +CEhb2, dcos_theta_dk ); - // dr terms - rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); - rvec_ScaledAdd( workspace->f[k], +CEhb3/r_jk, dvec_jk ); - } - else { - rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms - rvec_Add( workspace->f[i], force ); + data->my_en.e_hb += e_hb = + hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; - rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); + CEhb1 = hbp->p_hb1 * hbp->p_hb2 * exp_hb2 * exp_hb3 * sin_xhz4; + CEhb2 = -hbp->p_hb1/2.0 * (1.0 - exp_hb2) * exp_hb3 * cos_xhz1; + CEhb3 = -hbp->p_hb3 * + (-hbp->r0_hb / SQR(r_jk) + 1.0 / hbp->r0_hb) * e_hb; - ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); - rvec_Scale( force, +CEhb2, dcos_theta_dk ); - rvec_Add( workspace->f[k], force ); + /* hydrogen bond forces */ + bo_ij->Cdbo += CEhb1; // dbo term - // dr terms - rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); + if (control->virial == 0) { + // dcos terms + rvec_ScaledAdd( workspace->f[i], +CEhb2, dcos_theta_di ); + rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd( workspace->f[k], +CEhb2, dcos_theta_dk ); + // dr terms + rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd( workspace->f[k], +CEhb3/r_jk, dvec_jk ); + } + else { + rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms + rvec_Add( workspace->f[i], force ); - rvec_Scale( force, CEhb3/r_jk, dvec_jk ); - rvec_Add( workspace->f[k], force ); - } + rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - rvec_ScaledSum( delij, 1., system->my_atoms[j].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, - -1., system->my_atoms[k].x ); + ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); + rvec_Scale( force, +CEhb2, dcos_theta_dk ); + rvec_Add( workspace->f[k], force ); - rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); - rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); - rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); + // dr terms + rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); - system->pair_ptr->ev_tally3(i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj); + rvec_Scale( force, CEhb3/r_jk, dvec_jk ); + rvec_Add( workspace->f[k], force ); + } + + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + rvec_ScaledSum( delij, 1., system->my_atoms[j].x, + -1., system->my_atoms[i].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, + -1., system->my_atoms[k].x ); + + rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); + rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); + rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); + + system->pair_ptr->ev_tally3(i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj); + } } } } } - } + } } diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.h b/src/USER-REAXC/reaxc_hydrogen_bonds.h deleted file mode 100644 index 04d3d26d5c..0000000000 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.h +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __HBONDS_H_ -#define __HBONDS_H_ - -#include "reaxc_types.h" - -void Hydrogen_Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index beb7d1b87c..8704852a64 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -24,185 +24,174 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_init_md.h" +#include "reaxff_api.h" + #include #include #include #include -#include "reaxc_defs.h" -#include "reaxc_allocate.h" -#include "reaxc_forces.h" -#include "reaxc_io_tools.h" -#include "reaxc_list.h" -#include "reaxc_lookup.h" -#include "reaxc_reset_tools.h" -#include "reaxc_tool_box.h" #include "error.h" -#include "fmt/format.h" -void Init_System(reax_system *system, control_params *control) -{ - int i; - reax_atom *atom; +namespace ReaxFF { - int mincap = system->mincap; - double safezone = system->safezone; - double saferzone = system->saferzone; + void Init_System(reax_system *system, control_params *control) + { + int i; + reax_atom *atom; - // determine the local and total capacity + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; - system->local_cap = MAX((int)(system->n * safezone), mincap); - system->total_cap = MAX((int)(system->N * safezone), mincap); + // determine the local and total capacity - /* estimate numH and Hcap */ - system->numH = 0; - if (control->hbond_cut > 0) - for (i = 0; i < system->n; ++i) { - atom = &(system->my_atoms[i]); - if (system->reax_param.sbp[ atom->type ].p_hbond == 1 && atom->type >= 0) - atom->Hindex = system->numH++; - else atom->Hindex = -1; + system->local_cap = MAX((int)(system->n * safezone), mincap); + system->total_cap = MAX((int)(system->N * safezone), mincap); + + /* estimate numH and Hcap */ + system->numH = 0; + if (control->hbond_cut > 0) + for (i = 0; i < system->n; ++i) { + atom = &(system->my_atoms[i]); + if (system->reax_param.sbp[ atom->type ].p_hbond == 1 && atom->type >= 0) + atom->Hindex = system->numH++; + else atom->Hindex = -1; + } + system->Hcap = (int)(MAX(system->numH * saferzone, mincap)); + } + + void Init_Simulation_Data(simulation_data *data) + { + Reset_Simulation_Data(data); + data->step = 0; + } + + static void Init_Taper(control_params *control, storage *workspace) + { + double d1, d7; + double swa, swa2, swa3; + double swb, swb2, swb3; + LAMMPS_NS::Error *error = control->error_ptr; + + swa = control->nonb_low; + swb = control->nonb_cut; + + if (fabs(swa) > 0.01 && control->me == 0) + error->warning(FLERR, "Non-zero lower Taper-radius cutoff"); + + if (swb < 0) { + error->all(FLERR,"Negative upper Taper-radius cutoff"); } - system->Hcap = (int)(MAX(system->numH * saferzone, mincap)); -} + else if (swb < 5 && control->me == 0) + error->warning(FLERR,fmt::format("Warning: very low Taper-radius cutoff: " + "{}\n", swb)); + d1 = swb - swa; + d7 = pow(d1, 7.0); + swa2 = SQR(swa); + swa3 = CUBE(swa); + swb2 = SQR(swb); + swb3 = CUBE(swb); - -void Init_Simulation_Data(control_params *control, simulation_data *data) -{ - Reset_Simulation_Data(data, control->virial); - data->step = 0; -} - -void Init_Taper(control_params *control, storage *workspace) -{ - double d1, d7; - double swa, swa2, swa3; - double swb, swb2, swb3; - LAMMPS_NS::Error *error = control->error_ptr; - - swa = control->nonb_low; - swb = control->nonb_cut; - - if (fabs(swa) > 0.01 && control->me == 0) - error->warning(FLERR, "Non-zero lower Taper-radius cutoff"); - - if (swb < 0) { - error->all(FLERR,"Negative upper Taper-radius cutoff"); + workspace->Tap[7] = 20.0 / d7; + workspace->Tap[6] = -70.0 * (swa + swb) / d7; + workspace->Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; + workspace->Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; + workspace->Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; + workspace->Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; + workspace->Tap[1] = 140.0 * swa3 * swb3 / d7; + workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - + 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } - else if (swb < 5 && control->me == 0) - error->warning(FLERR,fmt::format("Warning: very low Taper-radius cutoff: " - "{}\n", swb)); - d1 = swb - swa; - d7 = pow(d1, 7.0); - swa2 = SQR(swa); - swa3 = CUBE(swa); - swb2 = SQR(swb); - swb3 = CUBE(swb); - workspace->Tap[7] = 20.0 / d7; - workspace->Tap[6] = -70.0 * (swa + swb) / d7; - workspace->Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; - workspace->Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; - workspace->Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; - workspace->Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; - workspace->Tap[1] = 140.0 * swa3 * swb3 / d7; - workspace->Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - - 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; -} + void Init_Workspace(reax_system *system, control_params *control, storage *workspace) + { + Allocate_Workspace(control, workspace,system->total_cap); -void Init_Workspace(reax_system *system, control_params *control, storage *workspace) -{ - Allocate_Workspace(control, workspace,system->total_cap); + memset(&(workspace->realloc), 0, sizeof(reallocate_data)); + Reset_Workspace(system, workspace); - memset(&(workspace->realloc), 0, sizeof(reallocate_data)); - Reset_Workspace(system, workspace); + /* Initialize the Taper function */ + Init_Taper(control, workspace); + } - /* Initialize the Taper function */ - Init_Taper(control, workspace); -} + static int Init_Lists(reax_system *system, control_params *control, reax_list **lists) + { + int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; + int *hb_top, *bond_top; -int Init_Lists(reax_system *system, control_params *control, reax_list **lists) -{ - int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; - int *hb_top, *bond_top; + int mincap = system->mincap; + double safezone = system->safezone; + double saferzone = system->saferzone; + LAMMPS_NS::Error *error = system->error_ptr; - int mincap = system->mincap; - double safezone = system->safezone; - double saferzone = system->saferzone; - LAMMPS_NS::Error *error = system->error_ptr; + bond_top = (int*) calloc(system->total_cap, sizeof(int)); + hb_top = (int*) calloc(system->local_cap, sizeof(int)); + Estimate_Storages(system, control, lists, + &Htop, hb_top, bond_top, &num_3body); - bond_top = (int*) calloc(system->total_cap, sizeof(int)); - hb_top = (int*) calloc(system->local_cap, sizeof(int)); - Estimate_Storages(system, control, lists, - &Htop, hb_top, bond_top, &num_3body); + if (control->hbond_cut > 0) { + /* init H indexes */ + total_hbonds = 0; + for (i = 0; i < system->n; ++i) { + system->my_atoms[i].num_hbonds = hb_top[i]; + total_hbonds += hb_top[i]; + } + total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); - if (control->hbond_cut > 0) { - /* init H indexes */ - total_hbonds = 0; - for (i = 0; i < system->n; ++i) { - system->my_atoms[i].num_hbonds = hb_top[i]; - total_hbonds += hb_top[i]; + if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, + *lists+HBONDS)) + error->one(FLERR, "Not enough space for hbonds list."); + + (*lists+HBONDS)->error_ptr = system->error_ptr; } - total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); - if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS)) - error->one(FLERR, "Not enough space for hbonds list."); + total_bonds = 0; + for (i = 0; i < system->N; ++i) { + system->my_atoms[i].num_bonds = bond_top[i]; + total_bonds += bond_top[i]; + } + bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); - (*lists+HBONDS)->error_ptr = system->error_ptr; + if (!Make_List(system->total_cap, bond_cap, TYP_BOND, + *lists+BONDS)) + error->one(FLERR, "Not enough space for bonds list."); + + (*lists+BONDS)->error_ptr = system->error_ptr; + + /* 3bodies list */ + cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); + if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, + *lists+THREE_BODIES)) + error->one(FLERR,"Problem in initializing angles list."); + + (*lists+THREE_BODIES)->error_ptr = system->error_ptr; + + free(hb_top); + free(bond_top); + + return SUCCESS; } - total_bonds = 0; - for (i = 0; i < system->N; ++i) { - system->my_atoms[i].num_bonds = bond_top[i]; - total_bonds += bond_top[i]; + void Initialize(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control, + MPI_Comm world) + { + char msg[MAX_STR]; + LAMMPS_NS::Error *error = system->error_ptr; + + Init_System(system, control); + Init_Simulation_Data(data); + Init_Workspace(system, control, workspace); + + if (Init_Lists(system, control, lists) ==FAILURE) + error->one(FLERR,fmt::format("Error on: {}. System could not be " + "initialized. Terminating.",msg)); + + Init_Output_Files(system, control, out_control,world); + + if (control->tabulate) + Init_Lookup_Tables(system, control, workspace, world); } - bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); - - if (!Make_List(system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS)) - error->one(FLERR, "Not enough space for bonds list."); - - (*lists+BONDS)->error_ptr = system->error_ptr; - - /* 3bodies list */ - cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); - if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES)) - error->one(FLERR,"Problem in initializing angles list."); - - (*lists+THREE_BODIES)->error_ptr = system->error_ptr; - - free(hb_top); - free(bond_top); - - return SUCCESS; -} - -void Initialize(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm world) -{ - char msg[MAX_STR]; - LAMMPS_NS::Error *error = system->error_ptr; - - Init_System(system,control); - Init_Simulation_Data(control,data); - Init_Workspace( system,control,workspace); - - if (Init_Lists(system, control, lists) ==FAILURE) - error->one(FLERR,fmt::format("Error on: {}. System could not be " - "initialized. Terminating.",msg)); - - Init_Output_Files(system,control,out_control,world); - - if (control->tabulate) - if (Init_Lookup_Tables(system,control,workspace,world,msg) == FAILURE) - error->one(FLERR,fmt::format("Error on: {}. Could not create lookup " - "table. Terminating.",msg)); - - - Init_Force_Functions(control); } diff --git a/src/USER-REAXC/reaxc_init_md.h b/src/USER-REAXC/reaxc_init_md.h deleted file mode 100644 index 4528ee95b1..0000000000 --- a/src/USER-REAXC/reaxc_init_md.h +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __INIT_MD_H_ -#define __INIT_MD_H_ - -#include "reaxc_types.h" -#include - -void Initialize(reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*, MPI_Comm); -#endif diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 2f5c6b8f65..6ca0b29b6e 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -24,43 +24,76 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_io_tools.h" -#include -#include -#include "reaxc_defs.h" -#include "reaxc_system_props.h" -#include "reaxc_traj.h" +#include "reaxff_api.h" -void Init_Output_Files(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world) -{ - if (out_control->write_steps > 0) - Init_Traj(system, control, out_control, world); -} +namespace ReaxFF { + void Collect_System_Energy(reax_system *system, simulation_data *data, + MPI_Comm comm) + { + double my_en[13], sys_en[13]; -/************************ close output files ************************/ -void Close_Output_Files(reax_system *system, output_controls *out_control) -{ - if (out_control->write_steps > 0) - End_Traj(system->my_rank, out_control); -} + my_en[0] = data->my_en.e_bond; + my_en[1] = data->my_en.e_ov; + my_en[2] = data->my_en.e_un; + my_en[3] = data->my_en.e_lp; + my_en[4] = data->my_en.e_ang; + my_en[5] = data->my_en.e_pen; + my_en[6] = data->my_en.e_coa; + my_en[7] = data->my_en.e_hb; + my_en[8] = data->my_en.e_tor; + my_en[9] = data->my_en.e_con; + my_en[10] = data->my_en.e_vdW; + my_en[11] = data->my_en.e_ele; + my_en[12] = data->my_en.e_pol; + MPI_Reduce( my_en, sys_en, 13, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); -void Output_Results(reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, MPI_Comm world) -{ - - if ((out_control->energy_update_freq > 0 && - data->step%out_control->energy_update_freq == 0) || - (out_control->write_steps > 0 && - data->step%out_control->write_steps == 0)) { - /* update system-wide energies */ - Compute_System_Energy(system, data, world); - - /* write current frame */ - if ( out_control->write_steps > 0 && data->step % out_control->write_steps == 0) { - Append_Frame( system, control, data, lists, out_control, world); + if (system->my_rank == MASTER_NODE) { + data->sys_en.e_bond = sys_en[0]; + data->sys_en.e_ov = sys_en[1]; + data->sys_en.e_un = sys_en[2]; + data->sys_en.e_lp = sys_en[3]; + data->sys_en.e_ang = sys_en[4]; + data->sys_en.e_pen = sys_en[5]; + data->sys_en.e_coa = sys_en[6]; + data->sys_en.e_hb = sys_en[7]; + data->sys_en.e_tor = sys_en[8]; + data->sys_en.e_con = sys_en[9]; + data->sys_en.e_vdW = sys_en[10]; + data->sys_en.e_ele = sys_en[11]; + data->sys_en.e_pol = sys_en[12]; } + } + + void Init_Output_Files(reax_system *system, control_params *control, + output_controls *out_control, MPI_Comm world) + { + if (out_control->write_steps > 0) + Init_Traj(system, control, out_control, world); } + /************************ close output files ************************/ + void Close_Output_Files(reax_system *system, output_controls *out_control) + { + if (out_control->write_steps > 0) + End_Traj(system->my_rank, out_control); + } + + void Output_Results(reax_system *system, control_params *control, + simulation_data *data, reax_list **lists, + output_controls *out_control, MPI_Comm world) + { + + if ((out_control->energy_update_freq > 0 && + data->step%out_control->energy_update_freq == 0) || + (out_control->write_steps > 0 && + data->step%out_control->write_steps == 0)) { + /* update system-wide energies */ + Collect_System_Energy(system, data, world); + + /* write current frame */ + if (out_control->write_steps > 0 && data->step % out_control->write_steps == 0) { + Append_Frame(system, control, data, lists, out_control, world); + } + } + } } diff --git a/src/USER-REAXC/reaxc_io_tools.h b/src/USER-REAXC/reaxc_io_tools.h deleted file mode 100644 index 8b69125032..0000000000 --- a/src/USER-REAXC/reaxc_io_tools.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __IO_TOOLS_H_ -#define __IO_TOOLS_H_ - -#include "reaxc_types.h" -#include - -void Init_Output_Files(reax_system *, control_params *, output_controls *, MPI_Comm); -void Close_Output_Files(reax_system *, output_controls *); -void Output_Results(reax_system *, control_params *, simulation_data *, - reax_list **, output_controls *, MPI_Comm); -#endif diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index b48a9a540e..94d4a0a4b5 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -24,121 +24,120 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_list.h" -#include "reaxc_defs.h" -#include "reaxc_tool_box.h" +#include "reaxff_api.h" #include "error.h" -/************* allocate list space ******************/ -int Make_List(int n, int num_intrs, int type, reax_list *l ) -{ - l->allocated = 1; +namespace ReaxFF { + + /************* allocate list space ******************/ + int Make_List(int n, int num_intrs, int type, reax_list *l) + { + l->allocated = 1; - l->n = n; - l->num_intrs = num_intrs; + l->n = n; + l->num_intrs = num_intrs; - if (l->index) sfree(l->error_ptr, l->index, "list:index"); - if (l->end_index) sfree(l->error_ptr, l->end_index, "list:end_index"); - l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index"); - l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index"); + if (l->index) sfree(l->error_ptr, l->index, "list:index"); + if (l->end_index) sfree(l->error_ptr, l->end_index, "list:end_index"); + l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index"); + l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index"); - l->type = type; + l->type = type; - switch(l->type) { - case TYP_VOID: - if (l->select.v) sfree(l->error_ptr, l->select.v, "list:v"); - l->select.v = (void*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(void*), "list:v"); - break; + switch(l->type) { + case TYP_VOID: + if (l->select.v) sfree(l->error_ptr, l->select.v, "list:v"); + l->select.v = (void*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(void*), "list:v"); + break; - case TYP_THREE_BODY: - if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); - l->select.three_body_list = (three_body_interaction_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(three_body_interaction_data), - "list:three_bodies"); - break; + case TYP_THREE_BODY: + if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); + l->select.three_body_list = (three_body_interaction_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(three_body_interaction_data), + "list:three_bodies"); + break; - case TYP_BOND: - if (l->select.bond_list) sfree(l->error_ptr, l->select.bond_list,"list:bonds"); - l->select.bond_list = (bond_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(bond_data), "list:bonds"); - break; + case TYP_BOND: + if (l->select.bond_list) sfree(l->error_ptr, l->select.bond_list,"list:bonds"); + l->select.bond_list = (bond_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(bond_data), "list:bonds"); + break; - case TYP_DBO: - if (l->select.dbo_list) sfree(l->error_ptr, l->select.dbo_list,"list:dbonds"); - l->select.dbo_list = (dbond_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dbond_data), "list:dbonds"); - break; + case TYP_DBO: + if (l->select.dbo_list) sfree(l->error_ptr, l->select.dbo_list,"list:dbonds"); + l->select.dbo_list = (dbond_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dbond_data), "list:dbonds"); + break; - case TYP_DDELTA: - if (l->select.dDelta_list) sfree(l->error_ptr, l->select.dDelta_list,"list:dDeltas"); - l->select.dDelta_list = (dDelta_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dDelta_data), "list:dDeltas"); - break; + case TYP_DDELTA: + if (l->select.dDelta_list) sfree(l->error_ptr, l->select.dDelta_list,"list:dDeltas"); + l->select.dDelta_list = (dDelta_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dDelta_data), "list:dDeltas"); + break; - case TYP_FAR_NEIGHBOR: - if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); - l->select.far_nbr_list = (far_neighbor_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(far_neighbor_data), "list:far_nbrs"); - break; + case TYP_FAR_NEIGHBOR: + if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); + l->select.far_nbr_list = (far_neighbor_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(far_neighbor_data), "list:far_nbrs"); + break; - case TYP_HBOND: - if (l->select.hbond_list) sfree(l->error_ptr, l->select.hbond_list,"list:hbonds"); - l->select.hbond_list = (hbond_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(hbond_data), "list:hbonds"); - break; + case TYP_HBOND: + if (l->select.hbond_list) sfree(l->error_ptr, l->select.hbond_list,"list:hbonds"); + l->select.hbond_list = (hbond_data*) + smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(hbond_data), "list:hbonds"); + break; - default: - l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); + default: + l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); + } + + return SUCCESS; } - return SUCCESS; -} + void Delete_List(reax_list *l) + { + if (l->allocated == 0) + return; + l->allocated = 0; + sfree(l->error_ptr, l->index, "list:index"); + sfree(l->error_ptr, l->end_index, "list:end_index"); + l->index = nullptr; + l->end_index = nullptr; -void Delete_List( reax_list *l ) -{ - if (l->allocated == 0) - return; - l->allocated = 0; + switch(l->type) { + case TYP_VOID: + sfree(l->error_ptr, l->select.v, "list:v"); + l->select.v = nullptr; + break; + case TYP_HBOND: + sfree(l->error_ptr, l->select.hbond_list, "list:hbonds"); + l->select.hbond_list = nullptr; + break; + case TYP_FAR_NEIGHBOR: + sfree(l->error_ptr, l->select.far_nbr_list, "list:far_nbrs"); + l->select.far_nbr_list = nullptr; + break; + case TYP_BOND: + sfree(l->error_ptr, l->select.bond_list, "list:bonds"); + l->select.bond_list = nullptr; + break; + case TYP_DBO: + sfree(l->error_ptr, l->select.dbo_list, "list:dbos"); + l->select.dbo_list = nullptr; + break; + case TYP_DDELTA: + sfree(l->error_ptr, l->select.dDelta_list, "list:dDeltas"); + l->select.dDelta_list = nullptr; + break; + case TYP_THREE_BODY: + sfree(l->error_ptr, l->select.three_body_list, "list:three_bodies"); + l->select.three_body_list = nullptr; + break; - sfree(l->error_ptr, l->index, "list:index" ); - sfree(l->error_ptr, l->end_index, "list:end_index" ); - l->index = nullptr; - l->end_index = nullptr; - - switch(l->type) { - case TYP_VOID: - sfree(l->error_ptr, l->select.v, "list:v" ); - l->select.v = nullptr; - break; - case TYP_HBOND: - sfree(l->error_ptr, l->select.hbond_list, "list:hbonds" ); - l->select.hbond_list = nullptr; - break; - case TYP_FAR_NEIGHBOR: - sfree(l->error_ptr, l->select.far_nbr_list, "list:far_nbrs" ); - l->select.far_nbr_list = nullptr; - break; - case TYP_BOND: - sfree(l->error_ptr, l->select.bond_list, "list:bonds" ); - l->select.bond_list = nullptr; - break; - case TYP_DBO: - sfree(l->error_ptr, l->select.dbo_list, "list:dbos" ); - l->select.dbo_list = nullptr; - break; - case TYP_DDELTA: - sfree(l->error_ptr, l->select.dDelta_list, "list:dDeltas" ); - l->select.dDelta_list = nullptr; - break; - case TYP_THREE_BODY: - sfree(l->error_ptr, l->select.three_body_list, "list:three_bodies" ); - l->select.three_body_list = nullptr; - break; - - default: - l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); + default: + l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); + } } } - diff --git a/src/USER-REAXC/reaxc_list.h b/src/USER-REAXC/reaxc_list.h deleted file mode 100644 index 1894f6cbbd..0000000000 --- a/src/USER-REAXC/reaxc_list.h +++ /dev/null @@ -1,66 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __LIST_H_ -#define __LIST_H_ - -#include "reaxc_types.h" - -int Make_List( int, int, int, reax_list* ); -void Delete_List( reax_list* ); - -inline int Num_Entries(int,reax_list*); -inline int Start_Index( int, reax_list* ); -inline int End_Index( int, reax_list* ); -inline void Set_Start_Index(int,int,reax_list*); -inline void Set_End_Index(int,int,reax_list*); - -inline int Num_Entries( int i, reax_list *l ) -{ - return l->end_index[i] - l->index[i]; -} - -inline int Start_Index( int i, reax_list *l ) -{ - return l->index[i]; -} - -inline int End_Index( int i, reax_list *l ) -{ - return l->end_index[i]; -} - -inline void Set_Start_Index( int i, int val, reax_list *l ) -{ - l->index[i] = val; -} - -inline void Set_End_Index( int i, int val, reax_list *l ) -{ - l->end_index[i] = val; -} - -#endif diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index 7584c34b82..58eab80d17 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -24,270 +24,266 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_lookup.h" +#include "reaxff_api.h" + #include #include -#include "reaxc_nonbonded.h" -#include "reaxc_tool_box.h" -void Tridiagonal_Solve( const double *a, const double *b, - double *c, double *d, double *x, unsigned int n) { - int i; - double id; +namespace ReaxFF { + static void Tridiagonal_Solve(const double *a, const double *b, + double *c, double *d, double *x, unsigned int n) { + int i; + double id; - c[0] /= b[0]; /* Division by zero risk. */ - d[0] /= b[0]; /* Division by zero would imply a singular matrix. */ - for (i = 1; i < (int)n; i++) { - id = (b[i] - c[i-1] * a[i]); /* Division by zero risk. */ - c[i] /= id; /* Last value calculated is redundant. */ - d[i] = (d[i] - d[i-1] * a[i])/id; + c[0] /= b[0]; /* Division by zero risk. */ + d[0] /= b[0]; /* Division by zero would imply a singular matrix. */ + for (i = 1; i < (int)n; i++) { + id = (b[i] - c[i-1] * a[i]); /* Division by zero risk. */ + c[i] /= id; /* Last value calculated is redundant. */ + d[i] = (d[i] - d[i-1] * a[i])/id; + } + + x[n - 1] = d[n - 1]; + for (i = n - 2; i >= 0; i--) + x[i] = d[i] - c[i] * x[i + 1]; } - x[n - 1] = d[n - 1]; - for (i = n - 2; i >= 0; i--) - x[i] = d[i] - c[i] * x[i + 1]; -} + void Natural_Cubic_Spline(LAMMPS_NS::Error* error_ptr, const double *h, const double *f, + cubic_spline_coef *coef, unsigned int n) + { + int i; + double *a, *b, *c, *d, *v; + /* allocate space for the linear system */ + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); -void Natural_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, - cubic_spline_coef *coef, unsigned int n ) -{ - int i; - double *a, *b, *c, *d, *v; + /* build the linear system */ + a[0] = a[1] = a[n-1] = 0; + for (i = 2; i < (int)n-1; ++i) + a[i] = h[i-1]; - /* allocate space for the linear system */ - a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + b[0] = b[n-1] = 0; + for (i = 1; i < (int)n-1; ++i) + b[i] = 2 * (h[i-1] + h[i]); - /* build the linear system */ - a[0] = a[1] = a[n-1] = 0; - for (i = 2; i < (int)n-1; ++i) - a[i] = h[i-1]; + c[0] = c[n-2] = c[n-1] = 0; + for (i = 1; i < (int)n-2; ++i) + c[i] = h[i]; - b[0] = b[n-1] = 0; - for (i = 1; i < (int)n-1; ++i) - b[i] = 2 * (h[i-1] + h[i]); + d[0] = d[n-1] = 0; + for (i = 1; i < (int)n-1; ++i) + d[i] = 6 * ((f[i+1]-f[i])/h[i] - (f[i]-f[i-1])/h[i-1]); - c[0] = c[n-2] = c[n-1] = 0; - for (i = 1; i < (int)n-2; ++i) - c[i] = h[i]; + v[0] = 0; + v[n-1] = 0; + Tridiagonal_Solve(&(a[1]), &(b[1]), &(c[1]), &(d[1]), &(v[1]), n-2); - d[0] = d[n-1] = 0; - for (i = 1; i < (int)n-1; ++i) - d[i] = 6 * ((f[i+1]-f[i])/h[i] - (f[i]-f[i-1])/h[i-1]); + for (i = 1; i < (int)n; ++i) { + coef[i-1].d = (v[i] - v[i-1]) / (6*h[i-1]); + coef[i-1].c = v[i]/2; + coef[i-1].b = (f[i]-f[i-1])/h[i-1] + h[i-1]*(2*v[i] + v[i-1])/6; + coef[i-1].a = f[i]; + } - v[0] = 0; - v[n-1] = 0; - Tridiagonal_Solve( &(a[1]), &(b[1]), &(c[1]), &(d[1]), &(v[1]), n-2 ); - - for (i = 1; i < (int)n; ++i) { - coef[i-1].d = (v[i] - v[i-1]) / (6*h[i-1]); - coef[i-1].c = v[i]/2; - coef[i-1].b = (f[i]-f[i-1])/h[i-1] + h[i-1]*(2*v[i] + v[i-1])/6; - coef[i-1].a = f[i]; + sfree(error_ptr, a, "cubic_spline:a"); + sfree(error_ptr, b, "cubic_spline:b"); + sfree(error_ptr, c, "cubic_spline:c"); + sfree(error_ptr, d, "cubic_spline:d"); + sfree(error_ptr, v, "cubic_spline:v"); } - sfree(error_ptr, a, "cubic_spline:a" ); - sfree(error_ptr, b, "cubic_spline:b" ); - sfree(error_ptr, c, "cubic_spline:c" ); - sfree(error_ptr, d, "cubic_spline:d" ); - sfree(error_ptr, v, "cubic_spline:v" ); -} + void Complete_Cubic_Spline(LAMMPS_NS::Error* error_ptr, const double *h, + const double *f, double v0, double vlast, + cubic_spline_coef *coef, unsigned int n) + { + int i; + double *a, *b, *c, *d, *v; + /* allocate space for the linear system */ + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + /* build the linear system */ + a[0] = 0; + for (i = 1; i < (int)n; ++i) + a[i] = h[i-1]; -void Complete_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, double v0, double vlast, - cubic_spline_coef *coef, unsigned int n ) -{ - int i; - double *a, *b, *c, *d, *v; + b[0] = 2*h[0]; + for (i = 1; i < (int)n; ++i) + b[i] = 2 * (h[i-1] + h[i]); - /* allocate space for the linear system */ - a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); - v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + c[n-1] = 0; + for (i = 0; i < (int)n-1; ++i) + c[i] = h[i]; - /* build the linear system */ - a[0] = 0; - for (i = 1; i < (int)n; ++i) - a[i] = h[i-1]; + d[0] = 6 * (f[1]-f[0])/h[0] - 6 * v0; + d[n-1] = 6 * vlast - 6 * (f[n-1]-f[n-2]/h[n-2]); + for (i = 1; i < (int)n-1; ++i) + d[i] = 6 * ((f[i+1]-f[i])/h[i] - (f[i]-f[i-1])/h[i-1]); - b[0] = 2*h[0]; - for (i = 1; i < (int)n; ++i) - b[i] = 2 * (h[i-1] + h[i]); + Tridiagonal_Solve(&(a[0]), &(b[0]), &(c[0]), &(d[0]), &(v[0]), n); - c[n-1] = 0; - for (i = 0; i < (int)n-1; ++i) - c[i] = h[i]; + for (i = 1; i < (int)n; ++i) { + coef[i-1].d = (v[i] - v[i-1]) / (6*h[i-1]); + coef[i-1].c = v[i]/2; + coef[i-1].b = (f[i]-f[i-1])/h[i-1] + h[i-1]*(2*v[i] + v[i-1])/6; + coef[i-1].a = f[i]; + } - d[0] = 6 * (f[1]-f[0])/h[0] - 6 * v0; - d[n-1] = 6 * vlast - 6 * (f[n-1]-f[n-2]/h[n-2]); - for (i = 1; i < (int)n-1; ++i) - d[i] = 6 * ((f[i+1]-f[i])/h[i] - (f[i]-f[i-1])/h[i-1]); - - Tridiagonal_Solve( &(a[0]), &(b[0]), &(c[0]), &(d[0]), &(v[0]), n ); - - for (i = 1; i < (int)n; ++i) { - coef[i-1].d = (v[i] - v[i-1]) / (6*h[i-1]); - coef[i-1].c = v[i]/2; - coef[i-1].b = (f[i]-f[i-1])/h[i-1] + h[i-1]*(2*v[i] + v[i-1])/6; - coef[i-1].a = f[i]; + sfree(error_ptr, a, "cubic_spline:a"); + sfree(error_ptr, b, "cubic_spline:b"); + sfree(error_ptr, c, "cubic_spline:c"); + sfree(error_ptr, d, "cubic_spline:d"); + sfree(error_ptr, v, "cubic_spline:v"); } - sfree(error_ptr, a, "cubic_spline:a" ); - sfree(error_ptr, b, "cubic_spline:b" ); - sfree(error_ptr, c, "cubic_spline:c" ); - sfree(error_ptr, d, "cubic_spline:d" ); - sfree(error_ptr, v, "cubic_spline:v" ); -} + void Init_Lookup_Tables(reax_system *system, control_params *control, + storage *workspace, MPI_Comm world) + { + int i, j, r; + int num_atom_types; + int existing_types[REAX_MAX_ATOM_TYPES], aggregated[REAX_MAX_ATOM_TYPES]; + double dr; + double *h, *fh, *fvdw, *fele, *fCEvd, *fCEclmb; + double v0_vdw, v0_ele, vlast_vdw, vlast_ele; + LR_lookup_table ** & LR = system->LR; + /* initializations */ + v0_vdw = 0; + v0_ele = 0; + vlast_vdw = 0; + vlast_ele = 0; -int Init_Lookup_Tables(reax_system *system, control_params *control, - storage *workspace, MPI_Comm world, char * /*msg*/) -{ - int i, j, r; - int num_atom_types; - int existing_types[REAX_MAX_ATOM_TYPES], aggregated[REAX_MAX_ATOM_TYPES]; - double dr; - double *h, *fh, *fvdw, *fele, *fCEvd, *fCEclmb; - double v0_vdw, v0_ele, vlast_vdw, vlast_ele; - LR_lookup_table ** & LR = system->LR; + num_atom_types = system->reax_param.num_atom_types; + dr = control->nonb_cut / control->tabulate; + h = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); + fh = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh"); + fvdw = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw"); + fCEvd = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd"); + fele = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele"); + fCEclmb = (double*) + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); - /* initializations */ - v0_vdw = 0; - v0_ele = 0; - vlast_vdw = 0; - vlast_ele = 0; + LR = (LR_lookup_table**) + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR"); + for (i = 0; i < num_atom_types; ++i) + LR[i] = (LR_lookup_table*) + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]"); - num_atom_types = system->reax_param.num_atom_types; - dr = control->nonb_cut / control->tabulate; - h = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); - fh = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh"); - fvdw = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw"); - fCEvd = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd"); - fele = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele"); - fCEclmb = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); + for (i = 0; i < REAX_MAX_ATOM_TYPES; ++i) + existing_types[i] = 0; + for (i = 0; i < system->n; ++i) + existing_types[ system->my_atoms[i].type ] = 1; - LR = (LR_lookup_table**) - scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR"); - for (i = 0; i < num_atom_types; ++i) - LR[i] = (LR_lookup_table*) - scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]"); + MPI_Allreduce(existing_types, aggregated, REAX_MAX_ATOM_TYPES, + MPI_INT, MPI_SUM, world); - for (i = 0; i < REAX_MAX_ATOM_TYPES; ++i) - existing_types[i] = 0; - for (i = 0; i < system->n; ++i) - existing_types[ system->my_atoms[i].type ] = 1; + for (i = 0; i < num_atom_types; ++i) { + if (aggregated[i]) { + for (j = i; j < num_atom_types; ++j) { + if (aggregated[j]) { + LR[i][j].xmin = 0; + LR[i][j].xmax = control->nonb_cut; + LR[i][j].n = control->tabulate + 2; + LR[i][j].dx = dr; + LR[i][j].inv_dx = control->tabulate / control->nonb_cut; + LR[i][j].y = (LR_data*) + smalloc(system->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); + LR[i][j].H = (cubic_spline_coef*) + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); + LR[i][j].vdW = (cubic_spline_coef*) + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); + LR[i][j].CEvd = (cubic_spline_coef*) + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); + LR[i][j].ele = (cubic_spline_coef*) + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); + LR[i][j].CEclmb = (cubic_spline_coef*) + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), + "lookup:LR[i,j].CEclmb"); - MPI_Allreduce(existing_types, aggregated, REAX_MAX_ATOM_TYPES, - MPI_INT, MPI_SUM, world); + for (r = 1; r <= control->tabulate; ++r) { + LR_vdW_Coulomb(system, workspace, control, i, j, r * dr, &(LR[i][j].y[r])); + h[r] = LR[i][j].dx; + fh[r] = LR[i][j].y[r].H; + fvdw[r] = LR[i][j].y[r].e_vdW; + fCEvd[r] = LR[i][j].y[r].CEvd; + fele[r] = LR[i][j].y[r].e_ele; + fCEclmb[r] = LR[i][j].y[r].CEclmb; + } - for (i = 0; i < num_atom_types; ++i) { - if (aggregated[i]) { - for (j = i; j < num_atom_types; ++j) { - if (aggregated[j]) { - LR[i][j].xmin = 0; - LR[i][j].xmax = control->nonb_cut; - LR[i][j].n = control->tabulate + 2; - LR[i][j].dx = dr; - LR[i][j].inv_dx = control->tabulate / control->nonb_cut; - LR[i][j].y = (LR_data*) - smalloc(system->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); - LR[i][j].H = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); - LR[i][j].vdW = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); - LR[i][j].CEvd = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); - LR[i][j].ele = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); - LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), - "lookup:LR[i,j].CEclmb"); - - for (r = 1; r <= control->tabulate; ++r) { - LR_vdW_Coulomb( system, workspace, control, i, j, r * dr, &(LR[i][j].y[r]) ); + // init the start-end points h[r] = LR[i][j].dx; - fh[r] = LR[i][j].y[r].H; - fvdw[r] = LR[i][j].y[r].e_vdW; - fCEvd[r] = LR[i][j].y[r].CEvd; - fele[r] = LR[i][j].y[r].e_ele; - fCEclmb[r] = LR[i][j].y[r].CEclmb; + v0_vdw = LR[i][j].y[1].CEvd; + v0_ele = LR[i][j].y[1].CEclmb; + fh[r] = fh[r-1]; + fvdw[r] = fvdw[r-1]; + fCEvd[r] = fCEvd[r-1]; + fele[r] = fele[r-1]; + fCEclmb[r] = fCEclmb[r-1]; + vlast_vdw = fCEvd[r-1]; + vlast_ele = fele[r-1]; + + Natural_Cubic_Spline(control->error_ptr, &h[1], &fh[1], + &(LR[i][j].H[1]), control->tabulate+1); + + Complete_Cubic_Spline(control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, + &(LR[i][j].vdW[1]), control->tabulate+1); + + Natural_Cubic_Spline(control->error_ptr, &h[1], &fCEvd[1], + &(LR[i][j].CEvd[1]), control->tabulate+1); + + Complete_Cubic_Spline(control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, + &(LR[i][j].ele[1]), control->tabulate+1); + + Natural_Cubic_Spline(control->error_ptr, &h[1], &fCEclmb[1], + &(LR[i][j].CEclmb[1]), control->tabulate+1); + } else { + LR[i][j].n = 0; } - - // init the start-end points - h[r] = LR[i][j].dx; - v0_vdw = LR[i][j].y[1].CEvd; - v0_ele = LR[i][j].y[1].CEclmb; - fh[r] = fh[r-1]; - fvdw[r] = fvdw[r-1]; - fCEvd[r] = fCEvd[r-1]; - fele[r] = fele[r-1]; - fCEclmb[r] = fCEclmb[r-1]; - vlast_vdw = fCEvd[r-1]; - vlast_ele = fele[r-1]; - - Natural_Cubic_Spline( control->error_ptr, &h[1], &fh[1], - &(LR[i][j].H[1]), control->tabulate+1); - - Complete_Cubic_Spline( control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, - &(LR[i][j].vdW[1]), control->tabulate+1); - - Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEvd[1], - &(LR[i][j].CEvd[1]), control->tabulate+1); - - Complete_Cubic_Spline( control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, - &(LR[i][j].ele[1]), control->tabulate+1); - - Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEclmb[1], - &(LR[i][j].CEclmb[1]), control->tabulate+1); - } else { - LR[i][j].n = 0; } } } + free(h); + free(fh); + free(fvdw); + free(fCEvd); + free(fele); + free(fCEclmb); } - free(h); - free(fh); - free(fvdw); - free(fCEvd); - free(fele); - free(fCEclmb); - return 1; + void Deallocate_Lookup_Tables(reax_system *system) + { + int i, j; + int ntypes; + LR_lookup_table ** & LR = system->LR; + + ntypes = system->reax_param.num_atom_types; + + for (i = 0; i < ntypes; ++i) { + for (j = i; j < ntypes; ++j) + if (LR[i][j].n) { + sfree(system->error_ptr, LR[i][j].y, "LR[i,j].y"); + sfree(system->error_ptr, LR[i][j].H, "LR[i,j].H"); + sfree(system->error_ptr, LR[i][j].vdW, "LR[i,j].vdW"); + sfree(system->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd"); + sfree(system->error_ptr, LR[i][j].ele, "LR[i,j].ele"); + sfree(system->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb"); + } + sfree(system->error_ptr, LR[i], "LR[i]"); + } + sfree(system->error_ptr, LR, "LR"); + } } - -void Deallocate_Lookup_Tables( reax_system *system ) -{ - int i, j; - int ntypes; - LR_lookup_table ** & LR = system->LR; - - ntypes = system->reax_param.num_atom_types; - - for (i = 0; i < ntypes; ++i) { - for (j = i; j < ntypes; ++j) - if (LR[i][j].n) { - sfree(system->error_ptr, LR[i][j].y, "LR[i,j].y" ); - sfree(system->error_ptr, LR[i][j].H, "LR[i,j].H" ); - sfree(system->error_ptr, LR[i][j].vdW, "LR[i,j].vdW" ); - sfree(system->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree(system->error_ptr, LR[i][j].ele, "LR[i,j].ele" ); - sfree(system->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); - } - sfree(system->error_ptr, LR[i], "LR[i]" ); - } - sfree(system->error_ptr, LR, "LR" ); -} diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h deleted file mode 100644 index 39b0b14ef1..0000000000 --- a/src/USER-REAXC/reaxc_lookup.h +++ /dev/null @@ -1,47 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __LOOKUP_H_ -#define __LOOKUP_H_ - -#include "reaxc_types.h" -namespace LAMMPS_NS { class Error; } - -void Tridiagonal_Solve( const double *a, const double *b, - double *c, double *d, double *x, unsigned int n); - -void Natural_Cubic_Spline( LAMMPS_NS::Error*, const double *h, const double *f, - cubic_spline_coef *coef, unsigned int n ); - -void Complete_Cubic_Spline( LAMMPS_NS::Error*, const double *h, const double *f, - double v0, double vlast, cubic_spline_coef *coef, - unsigned int n ); - -int Init_Lookup_Tables(reax_system*, control_params*, storage*, MPI_Comm, char* ); - -void Deallocate_Lookup_Tables( reax_system* ); - -#endif diff --git a/src/USER-REAXC/reaxc_multi_body.cpp b/src/USER-REAXC/reaxc_multi_body.cpp index ab66e3352a..f2e629c65c 100644 --- a/src/USER-REAXC/reaxc_multi_body.cpp +++ b/src/USER-REAXC/reaxc_multi_body.cpp @@ -24,17 +24,18 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_multi_body.h" +#include "reaxff_api.h" + +#include "pair.h" + #include #include -#include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -void Atom_Energy( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/ ) -{ +namespace ReaxFF { + + void Atom_Energy(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists) + { int i, j, pj, type_i, type_j; double Delta_lpcorr, dfvl; double e_lp, expvd2, inv_expvd2, dElp, CElp, DlpVi; @@ -67,7 +68,7 @@ void Atom_Energy( reax_system *system, control_params *control, /* set the parameter pointer */ type_i = system->my_atoms[i].type; if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + sbp_i = &(system->reax_param.sbp[type_i]); /* lone-pair Energy */ p_lp2 = sbp_i->p_lp2; @@ -126,11 +127,10 @@ void Atom_Energy( reax_system *system, control_params *control, } } - for (i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + sbp_i = &(system->reax_param.sbp[type_i]); /* over-coordination energy */ if (sbp_i->mass > 21.0) @@ -144,7 +144,7 @@ void Atom_Energy( reax_system *system, control_params *control, type_j = system->my_atoms[j].type; if (type_j < 0) continue; bo_ij = &(bonds->select.bond_list[pj].bo_data); - twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); + twbp = &(system->reax_param.tbp[type_i][type_j]); sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* @@ -218,10 +218,9 @@ void Atom_Energy( reax_system *system, control_params *control, pbond = &(bonds->select.bond_list[pj]); j = pbond->nbr; bo_ij = &(pbond->bo_data); - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + twbp = &(system->reax_param.tbp[system->my_atoms[i].type] [system->my_atoms[pbond->nbr].type]); - bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s;// OvCoor-1st workspace->CdDelta[j] += CEover4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // OvCoor-3a @@ -230,15 +229,13 @@ void Atom_Energy( reax_system *system, control_params *control, bo_ij->Cdbopi2 += CEover4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // OvCoor-3b - workspace->CdDelta[j] += CEunder4 * (1.0 - dfvl*workspace->dDelta_lp[j]) * (bo_ij->BO_pi + bo_ij->BO_pi2); // UnCoor - 2a bo_ij->Cdbopi += CEunder4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b bo_ij->Cdbopi2 += CEunder4 * (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j]); // UnCoor-2b - } - } } +} diff --git a/src/USER-REAXC/reaxc_multi_body.h b/src/USER-REAXC/reaxc_multi_body.h deleted file mode 100644 index a17c9f484e..0000000000 --- a/src/USER-REAXC/reaxc_multi_body.h +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __MULTI_BODY_H_ -#define __MULTI_BODY_H_ - -#include "reaxc_types.h" - -void Atom_Energy( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-REAXC/reaxc_nonbonded.cpp b/src/USER-REAXC/reaxc_nonbonded.cpp index c5a1f808c5..e4adf6c7b1 100644 --- a/src/USER-REAXC/reaxc_nonbonded.cpp +++ b/src/USER-REAXC/reaxc_nonbonded.cpp @@ -24,403 +24,399 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_nonbonded.h" -#include +#include "reaxff_api.h" + #include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_types.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" -void vdW_Coulomb_Energy( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/ ) -{ - int i, j, pj, natoms; - int start_i, end_i, flag; - rc_tagint orig_i, orig_j; - double p_vdW1, p_vdW1i; - double powr_vdW1, powgi_vdW1; - double tmp, r_ij, fn13, exp1, exp2; - double Tap, dTap, dfn13, CEvd, CEclmb, de_core; - double dr3gamij_1, dr3gamij_3; - double e_ele, e_vdW, e_core, SMALL = 0.0001; - double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp; - two_body_parameters *twbp; - far_neighbor_data *nbr_pj; - reax_list *far_nbrs; +#include - // Tallying variables: - double pe_vdw, f_tmp, delij[3]; +namespace ReaxFF { + void Compute_Polarization_Energy(reax_system *system, simulation_data *data) + { + int i, type_i; + double q, en_tmp; - natoms = system->n; - far_nbrs = (*lists) + FAR_NBRS; - p_vdW1 = system->reax_param.gp.l[28]; - p_vdW1i = 1.0 / p_vdW1; - e_core = 0; - e_vdW = 0; - e_lg = de_lg = 0.0; + data->my_en.e_pol = 0.0; + for (i = 0; i < system->n; i++) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + q = system->my_atoms[i].q; - for (i = 0; i < natoms; ++i) { - if (system->my_atoms[i].type < 0) continue; - start_i = Start_Index(i, far_nbrs); - end_i = End_Index(i, far_nbrs); - orig_i = system->my_atoms[i].orig_id; - - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); - j = nbr_pj->nbr; - if (system->my_atoms[j].type < 0) continue; - orig_j = system->my_atoms[j].orig_id; - - flag = 0; - if (nbr_pj->d <= control->nonb_cut) { - if (j < natoms) flag = 1; - else if (orig_i < orig_j) flag = 1; - else if (orig_i == orig_j) { - if (nbr_pj->dvec[2] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[2]) < SMALL) { - if (nbr_pj->dvec[1] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) - flag = 1; - } - } - } - - if (flag) { - - r_ij = nbr_pj->d; - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] - [ system->my_atoms[j].type ]); - - Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; - Tap = Tap * r_ij + workspace->Tap[5]; - Tap = Tap * r_ij + workspace->Tap[4]; - Tap = Tap * r_ij + workspace->Tap[3]; - Tap = Tap * r_ij + workspace->Tap[2]; - Tap = Tap * r_ij + workspace->Tap[1]; - Tap = Tap * r_ij + workspace->Tap[0]; - - dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; - dTap = dTap * r_ij + 5*workspace->Tap[5]; - dTap = dTap * r_ij + 4*workspace->Tap[4]; - dTap = dTap * r_ij + 3*workspace->Tap[3]; - dTap = dTap * r_ij + 2*workspace->Tap[2]; - dTap += workspace->Tap[1]/r_ij; - - /*vdWaals Calculations*/ - if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) - { // shielding - powr_vdW1 = pow(r_ij, p_vdW1); - powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); - - fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); - exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - - e_vdW = twbp->D * (exp1 - 2.0 * exp2); - data->my_en.e_vdW += Tap * e_vdW; - - dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * - pow(r_ij, p_vdW1 - 2.0); - - CEvd = dTap * e_vdW - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; - } - else { // no shielding - exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - - e_vdW = twbp->D * (exp1 - 2.0 * exp2); - data->my_en.e_vdW += Tap * e_vdW; - - CEvd = dTap * e_vdW - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; - } - - if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) - { // inner wall - e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); - data->my_en.e_vdW += Tap * e_core; - - de_core = -(twbp->acore/twbp->rcore) * e_core; - CEvd += dTap * e_core + Tap * de_core / r_ij; - - // lg correction, only if lgvdw is yes - if (control->lgflag) { - r_ij5 = pow( r_ij, 5.0 ); - r_ij6 = pow( r_ij, 6.0 ); - re6 = pow( twbp->lgre, 6.0 ); - e_lg = -(twbp->lgcij/( r_ij6 + re6 )); - data->my_en.e_vdW += Tap * e_lg; - - de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; - CEvd += dTap * e_lg + Tap * de_lg / r_ij; - } - - } - - /*Coulomb Calculations*/ - dr3gamij_1 = ( r_ij * r_ij * r_ij + twbp->gamma ); - dr3gamij_3 = pow( dr3gamij_1 , 0.33333333333333 ); - - tmp = Tap / dr3gamij_3; - data->my_en.e_ele += e_ele = - C_ele * system->my_atoms[i].q * system->my_atoms[j].q * tmp; - - CEclmb = C_ele * system->my_atoms[i].q * system->my_atoms[j].q * - ( dTap - Tap * r_ij / dr3gamij_1 ) / dr3gamij_3; + en_tmp = KCALpMOL_to_EV * (system->reax_param.sbp[type_i].chi * q + + (system->reax_param.sbp[type_i].eta / 2.) * SQR(q)); + data->my_en.e_pol += en_tmp; /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { - pe_vdw = Tap * (e_vdW + e_core + e_lg); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - f_tmp = -(CEvd + CEclmb); - system->pair_ptr->ev_tally(i,j,natoms,1,pe_vdw,e_ele, - f_tmp,delij[0],delij[1],delij[2]); - } - - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec ); - } else { /* NPT, iNPT or sNPT */ - rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); - - rvec_ScaledAdd( workspace->f[i], -1., temp ); - rvec_Add( workspace->f[j], temp ); - } - } + if (system->pair_ptr->evflag) + system->pair_ptr->ev_tally(i,i,system->n,1,0.0,en_tmp,0.0,0.0,0.0,0.0); } } - Compute_Polarization_Energy( system, data ); -} + void vdW_Coulomb_Energy(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int i, j, pj, natoms; + int start_i, end_i, flag; + rc_tagint orig_i, orig_j; + double p_vdW1, p_vdW1i; + double powr_vdW1, powgi_vdW1; + double tmp, r_ij, fn13, exp1, exp2; + double Tap, dTap, dfn13, CEvd, CEclmb, de_core; + double dr3gamij_1, dr3gamij_3; + double e_ele, e_vdW, e_core, SMALL = 0.0001; + double e_lg, de_lg, r_ij5, r_ij6, re6; + rvec temp; + two_body_parameters *twbp; + far_neighbor_data *nbr_pj; + reax_list *far_nbrs; + // Tallying variables: + double pe_vdw, f_tmp, delij[3]; + natoms = system->n; + far_nbrs = (*lists) + FAR_NBRS; + p_vdW1 = system->reax_param.gp.l[28]; + p_vdW1i = 1.0 / p_vdW1; + e_core = 0; + e_vdW = 0; + e_lg = de_lg = 0.0; -void Tabulated_vdW_Coulomb_Energy( reax_system *system,control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, - output_controls * /*out_control*/ ) -{ - int i, j, pj, r, natoms; - int type_i, type_j, tmin, tmax; - int start_i, end_i, flag; - rc_tagint orig_i, orig_j; - double r_ij, base, dif; - double e_vdW, e_ele; - double CEvd, CEclmb, SMALL = 0.0001; - double f_tmp, delij[3]; + for (i = 0; i < natoms; ++i) { + if (system->my_atoms[i].type < 0) continue; + start_i = Start_Index(i, far_nbrs); + end_i = End_Index(i, far_nbrs); + orig_i = system->my_atoms[i].orig_id; - rvec temp; - far_neighbor_data *nbr_pj; - reax_list *far_nbrs; - LR_lookup_table *t; - LR_lookup_table ** & LR = system->LR; + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + if (system->my_atoms[j].type < 0) continue; + orig_j = system->my_atoms[j].orig_id; - natoms = system->n; - far_nbrs = (*lists) + FAR_NBRS; + flag = 0; + if (nbr_pj->d <= control->nonb_cut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + } - e_ele = e_vdW = 0; + if (flag) { - for (i = 0; i < natoms; ++i) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - start_i = Start_Index(i,far_nbrs); - end_i = End_Index(i,far_nbrs); - orig_i = system->my_atoms[i].orig_id; + r_ij = nbr_pj->d; + twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + [ system->my_atoms[j].type ]); - for (pj = start_i; pj < end_i; ++pj) { - nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); - j = nbr_pj->nbr; - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - orig_j = system->my_atoms[j].orig_id; + Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; + Tap = Tap * r_ij + workspace->Tap[5]; + Tap = Tap * r_ij + workspace->Tap[4]; + Tap = Tap * r_ij + workspace->Tap[3]; + Tap = Tap * r_ij + workspace->Tap[2]; + Tap = Tap * r_ij + workspace->Tap[1]; + Tap = Tap * r_ij + workspace->Tap[0]; - flag = 0; - if (nbr_pj->d <= control->nonb_cut) { - if (j < natoms) flag = 1; - else if (orig_i < orig_j) flag = 1; - else if (orig_i == orig_j) { - if (nbr_pj->dvec[2] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[2]) < SMALL) { - if (nbr_pj->dvec[1] > SMALL) flag = 1; - else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) - flag = 1; + dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; + dTap = dTap * r_ij + 5*workspace->Tap[5]; + dTap = dTap * r_ij + 4*workspace->Tap[4]; + dTap = dTap * r_ij + 3*workspace->Tap[3]; + dTap = dTap * r_ij + 2*workspace->Tap[2]; + dTap += workspace->Tap[1]/r_ij; + + /*vdWaals Calculations*/ + if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) + { // shielding + powr_vdW1 = pow(r_ij, p_vdW1); + powgi_vdW1 = pow(1.0 / twbp->gamma_w, p_vdW1); + + fn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i); + exp1 = exp(twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); + + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + data->my_en.e_vdW += Tap * e_vdW; + + dfn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i - 1.0) * + pow(r_ij, p_vdW1 - 2.0); + + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; + } else { // no shielding + exp1 = exp(twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); + + e_vdW = twbp->D * (exp1 - 2.0 * exp2); + data->my_en.e_vdW += Tap * e_vdW; + + CEvd = dTap * e_vdW - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; + } + + if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) + { // inner wall + e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); + data->my_en.e_vdW += Tap * e_core; + + de_core = -(twbp->acore/twbp->rcore) * e_core; + CEvd += dTap * e_core + Tap * de_core / r_ij; + + // lg correction, only if lgvdw is yes + if (control->lgflag) { + r_ij5 = pow(r_ij, 5.0); + r_ij6 = pow(r_ij, 6.0); + re6 = pow(twbp->lgre, 6.0); + e_lg = -(twbp->lgcij/(r_ij6 + re6)); + data->my_en.e_vdW += Tap * e_lg; + + de_lg = -6.0 * e_lg * r_ij5 / (r_ij6 + re6) ; + CEvd += dTap * e_lg + Tap * de_lg / r_ij; + } + + } + + /*Coulomb Calculations*/ + dr3gamij_1 = (r_ij * r_ij * r_ij + twbp->gamma); + dr3gamij_3 = pow(dr3gamij_1 , 0.33333333333333); + + tmp = Tap / dr3gamij_3; + data->my_en.e_ele += e_ele = + C_ele * system->my_atoms[i].q * system->my_atoms[j].q * tmp; + + CEclmb = C_ele * system->my_atoms[i].q * system->my_atoms[j].q * + (dTap - Tap * r_ij / dr3gamij_1) / dr3gamij_3; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + pe_vdw = Tap * (e_vdW + e_core + e_lg); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + f_tmp = -(CEvd + CEclmb); + system->pair_ptr->ev_tally(i,j,natoms,1,pe_vdw,e_ele, + f_tmp,delij[0],delij[1],delij[2]); + } + + if (control->virial == 0) { + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); + } else { /* NPT, iNPT or sNPT */ + rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); + + rvec_ScaledAdd(workspace->f[i], -1., temp); + rvec_Add(workspace->f[j], temp); } } } + } - if (flag) { + Compute_Polarization_Energy(system, data); + } - r_ij = nbr_pj->d; - tmin = MIN( type_i, type_j ); - tmax = MAX( type_i, type_j ); - t = &( LR[tmin][tmax] ); + void Tabulated_vdW_Coulomb_Energy(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int i, j, pj, r, natoms; + int type_i, type_j, tmin, tmax; + int start_i, end_i, flag; + rc_tagint orig_i, orig_j; + double r_ij, base, dif; + double e_vdW, e_ele; + double CEvd, CEclmb, SMALL = 0.0001; + double f_tmp, delij[3]; - /* Cubic Spline Interpolation */ - r = (int)(r_ij * t->inv_dx); - if (r == 0) ++r; - base = (double)(r+1) * t->dx; - dif = r_ij - base; + rvec temp; + far_neighbor_data *nbr_pj; + reax_list *far_nbrs; + LR_lookup_table *t; + LR_lookup_table ** & LR = system->LR; - e_vdW = ((t->vdW[r].d*dif + t->vdW[r].c)*dif + t->vdW[r].b)*dif + - t->vdW[r].a; + natoms = system->n; + far_nbrs = (*lists) + FAR_NBRS; - e_ele = ((t->ele[r].d*dif + t->ele[r].c)*dif + t->ele[r].b)*dif + - t->ele[r].a; - e_ele *= system->my_atoms[i].q * system->my_atoms[j].q; + e_ele = e_vdW = 0; - data->my_en.e_vdW += e_vdW; - data->my_en.e_ele += e_ele; + for (i = 0; i < natoms; ++i) { + type_i = system->my_atoms[i].type; + if (type_i < 0) continue; + start_i = Start_Index(i,far_nbrs); + end_i = End_Index(i,far_nbrs); + orig_i = system->my_atoms[i].orig_id; - CEvd = ((t->CEvd[r].d*dif + t->CEvd[r].c)*dif + t->CEvd[r].b)*dif + - t->CEvd[r].a; + for (pj = start_i; pj < end_i; ++pj) { + nbr_pj = &(far_nbrs->select.far_nbr_list[pj]); + j = nbr_pj->nbr; + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + orig_j = system->my_atoms[j].orig_id; - CEclmb = ((t->CEclmb[r].d*dif+t->CEclmb[r].c)*dif+t->CEclmb[r].b)*dif + - t->CEclmb[r].a; - CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; + flag = 0; + if (nbr_pj->d <= control->nonb_cut) { + if (j < natoms) flag = 1; + else if (orig_i < orig_j) flag = 1; + else if (orig_i == orig_j) { + if (nbr_pj->dvec[2] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[2]) < SMALL) { + if (nbr_pj->dvec[1] > SMALL) flag = 1; + else if (fabs(nbr_pj->dvec[1]) < SMALL && nbr_pj->dvec[0] > SMALL) + flag = 1; + } + } + } - /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - f_tmp = -(CEvd + CEclmb); - system->pair_ptr->ev_tally(i,j,natoms,1,e_vdW,e_ele, - f_tmp,delij[0],delij[1],delij[2]); - } + if (flag) { - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec ); - rvec_ScaledAdd( workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec ); - } else { // NPT, iNPT or sNPT - rvec_Scale( temp, CEvd + CEclmb, nbr_pj->dvec ); + r_ij = nbr_pj->d; + tmin = MIN(type_i, type_j); + tmax = MAX(type_i, type_j); + t = &(LR[tmin][tmax]); - rvec_ScaledAdd( workspace->f[i], -1., temp ); - rvec_Add( workspace->f[j], temp ); - } + /* Cubic Spline Interpolation */ + r = (int)(r_ij * t->inv_dx); + if (r == 0) ++r; + base = (double)(r+1) * t->dx; + dif = r_ij - base; + + e_vdW = ((t->vdW[r].d*dif + t->vdW[r].c)*dif + t->vdW[r].b)*dif + + t->vdW[r].a; + + e_ele = ((t->ele[r].d*dif + t->ele[r].c)*dif + t->ele[r].b)*dif + + t->ele[r].a; + e_ele *= system->my_atoms[i].q * system->my_atoms[j].q; + + data->my_en.e_vdW += e_vdW; + data->my_en.e_ele += e_ele; + + CEvd = ((t->CEvd[r].d*dif + t->CEvd[r].c)*dif + t->CEvd[r].b)*dif + + t->CEvd[r].a; + + CEclmb = ((t->CEclmb[r].d*dif+t->CEclmb[r].c)*dif+t->CEclmb[r].b)*dif + + t->CEclmb[r].a; + CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; + + /* tally into per-atom energy */ + if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + f_tmp = -(CEvd + CEclmb); + system->pair_ptr->ev_tally(i,j,natoms,1,e_vdW,e_ele, + f_tmp,delij[0],delij[1],delij[2]); + } + + if (control->virial == 0) { + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); + } else { // NPT, iNPT or sNPT + rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); + + rvec_ScaledAdd(workspace->f[i], -1., temp); + rvec_Add(workspace->f[j], temp); + } + } } } + + Compute_Polarization_Energy(system, data); } - Compute_Polarization_Energy( system, data ); -} + void LR_vdW_Coulomb(reax_system *system, storage *workspace, + control_params *control, int i, int j, + double r_ij, LR_data *lr) + { + double p_vdW1 = system->reax_param.gp.l[28]; + double p_vdW1i = 1.0 / p_vdW1; + double powr_vdW1, powgi_vdW1; + double tmp, fn13, exp1, exp2; + double Tap, dTap, dfn13; + double dr3gamij_1, dr3gamij_3; + double e_core, de_core; + double e_lg, de_lg, r_ij5, r_ij6, re6; + two_body_parameters *twbp; + twbp = &(system->reax_param.tbp[i][j]); + e_core = 0; + de_core = 0; + e_lg = de_lg = 0.0; + /* calculate taper and its derivative */ + Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; + Tap = Tap * r_ij + workspace->Tap[5]; + Tap = Tap * r_ij + workspace->Tap[4]; + Tap = Tap * r_ij + workspace->Tap[3]; + Tap = Tap * r_ij + workspace->Tap[2]; + Tap = Tap * r_ij + workspace->Tap[1]; + Tap = Tap * r_ij + workspace->Tap[0]; -void Compute_Polarization_Energy( reax_system *system, simulation_data *data ) -{ - int i, type_i; - double q, en_tmp; + dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; + dTap = dTap * r_ij + 5*workspace->Tap[5]; + dTap = dTap * r_ij + 4*workspace->Tap[4]; + dTap = dTap * r_ij + 3*workspace->Tap[3]; + dTap = dTap * r_ij + 2*workspace->Tap[2]; + dTap += workspace->Tap[1]/r_ij; - data->my_en.e_pol = 0.0; - for (i = 0; i < system->n; i++) { - type_i = system->my_atoms[i].type; - if (type_i < 0) continue; - q = system->my_atoms[i].q; + /*vdWaals Calculations*/ + if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) + { // shielding + powr_vdW1 = pow(r_ij, p_vdW1); + powgi_vdW1 = pow(1.0 / twbp->gamma_w, p_vdW1); - en_tmp = KCALpMOL_to_EV * (system->reax_param.sbp[type_i].chi * q + - (system->reax_param.sbp[type_i].eta / 2.) * SQR(q)); - data->my_en.e_pol += en_tmp; + fn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i); + exp1 = exp(twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW)); - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(i,i,system->n,1,0.0,en_tmp,0.0,0.0,0.0,0.0); - } -} + lr->e_vdW = Tap * twbp->D * (exp1 - 2.0 * exp2); -void LR_vdW_Coulomb( reax_system *system, storage *workspace, - control_params *control, int i, int j, double r_ij, LR_data *lr ) -{ - double p_vdW1 = system->reax_param.gp.l[28]; - double p_vdW1i = 1.0 / p_vdW1; - double powr_vdW1, powgi_vdW1; - double tmp, fn13, exp1, exp2; - double Tap, dTap, dfn13; - double dr3gamij_1, dr3gamij_3; - double e_core, de_core; - double e_lg, de_lg, r_ij5, r_ij6, re6; - two_body_parameters *twbp; + dfn13 = pow(powr_vdW1 + powgi_vdW1, p_vdW1i-1.0) * pow(r_ij, p_vdW1-2.0); - twbp = &(system->reax_param.tbp[i][j]); - e_core = 0; - de_core = 0; - e_lg = de_lg = 0.0; - - /* calculate taper and its derivative */ - Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; - Tap = Tap * r_ij + workspace->Tap[5]; - Tap = Tap * r_ij + workspace->Tap[4]; - Tap = Tap * r_ij + workspace->Tap[3]; - Tap = Tap * r_ij + workspace->Tap[2]; - Tap = Tap * r_ij + workspace->Tap[1]; - Tap = Tap * r_ij + workspace->Tap[0]; - - dTap = 7*workspace->Tap[7] * r_ij + 6*workspace->Tap[6]; - dTap = dTap * r_ij + 5*workspace->Tap[5]; - dTap = dTap * r_ij + 4*workspace->Tap[4]; - dTap = dTap * r_ij + 3*workspace->Tap[3]; - dTap = dTap * r_ij + 2*workspace->Tap[2]; - dTap += workspace->Tap[1]/r_ij; - - /*vdWaals Calculations*/ - if (system->reax_param.gp.vdw_type==1 || system->reax_param.gp.vdw_type==3) - { // shielding - powr_vdW1 = pow(r_ij, p_vdW1); - powgi_vdW1 = pow( 1.0 / twbp->gamma_w, p_vdW1); - - fn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i ); - exp1 = exp( twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - fn13 / twbp->r_vdW) ); + lr->CEvd = dTap * twbp->D * (exp1 - 2.0 * exp2) - + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; + } + else { // no shielding + exp1 = exp(twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); + exp2 = exp(0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW)); lr->e_vdW = Tap * twbp->D * (exp1 - 2.0 * exp2); - - dfn13 = pow( powr_vdW1 + powgi_vdW1, p_vdW1i-1.0) * pow(r_ij, p_vdW1-2.0); - lr->CEvd = dTap * twbp->D * (exp1 - 2.0 * exp2) - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) * dfn13; + Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; } - else { // no shielding - exp1 = exp( twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - exp2 = exp( 0.5 * twbp->alpha * (1.0 - r_ij / twbp->r_vdW) ); - lr->e_vdW = Tap * twbp->D * (exp1 - 2.0 * exp2); - lr->CEvd = dTap * twbp->D * (exp1 - 2.0 * exp2) - - Tap * twbp->D * (twbp->alpha / twbp->r_vdW) * (exp1 - exp2) / r_ij; - } + if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) + { // inner wall + e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); + lr->e_vdW += Tap * e_core; - if (system->reax_param.gp.vdw_type==2 || system->reax_param.gp.vdw_type==3) - { // inner wall - e_core = twbp->ecore * exp(twbp->acore * (1.0-(r_ij/twbp->rcore))); - lr->e_vdW += Tap * e_core; + de_core = -(twbp->acore/twbp->rcore) * e_core; + lr->CEvd += dTap * e_core + Tap * de_core / r_ij; - de_core = -(twbp->acore/twbp->rcore) * e_core; - lr->CEvd += dTap * e_core + Tap * de_core / r_ij; + // lg correction, only if lgvdw is yes + if (control->lgflag) { + r_ij5 = pow(r_ij, 5.0); + r_ij6 = pow(r_ij, 6.0); + re6 = pow(twbp->lgre, 6.0); + e_lg = -(twbp->lgcij/(r_ij6 + re6)); + lr->e_vdW += Tap * e_lg; - // lg correction, only if lgvdw is yes - if (control->lgflag) { - r_ij5 = pow( r_ij, 5.0 ); - r_ij6 = pow( r_ij, 6.0 ); - re6 = pow( twbp->lgre, 6.0 ); - e_lg = -(twbp->lgcij/( r_ij6 + re6 )); - lr->e_vdW += Tap * e_lg; + de_lg = -6.0 * e_lg * r_ij5 / (r_ij6 + re6) ; + lr->CEvd += dTap * e_lg + Tap * de_lg/r_ij; + } - de_lg = -6.0 * e_lg * r_ij5 / ( r_ij6 + re6 ) ; - lr->CEvd += dTap * e_lg + Tap * de_lg/r_ij; } - } + /* Coulomb calculations */ + dr3gamij_1 = (r_ij * r_ij * r_ij + twbp->gamma); + dr3gamij_3 = pow(dr3gamij_1 , 0.33333333333333); - /* Coulomb calculations */ - dr3gamij_1 = ( r_ij * r_ij * r_ij + twbp->gamma ); - dr3gamij_3 = pow( dr3gamij_1 , 0.33333333333333 ); + tmp = Tap / dr3gamij_3; + lr->H = EV_to_KCALpMOL * tmp; + lr->e_ele = C_ele * tmp; - tmp = Tap / dr3gamij_3; - lr->H = EV_to_KCALpMOL * tmp; - lr->e_ele = C_ele * tmp; - - lr->CEclmb = C_ele * ( dTap - Tap * r_ij / dr3gamij_1 ) / dr3gamij_3; + lr->CEclmb = C_ele * (dTap - Tap * r_ij / dr3gamij_1) / dr3gamij_3; + } } + diff --git a/src/USER-REAXC/reaxc_nonbonded.h b/src/USER-REAXC/reaxc_nonbonded.h deleted file mode 100644 index 9a29d4d8c1..0000000000 --- a/src/USER-REAXC/reaxc_nonbonded.h +++ /dev/null @@ -1,43 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __NONBONDED_H_ -#define __NONBONDED_H_ - -#include "reaxc_types.h" - -void vdW_Coulomb_Energy( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -void Tabulated_vdW_Coulomb_Energy( reax_system*, control_params*, - simulation_data*, storage*, - reax_list**, output_controls* ); - -void Compute_Polarization_Energy( reax_system*, simulation_data* ); - -void LR_vdW_Coulomb( reax_system*, storage*, control_params*, - int, int, double, LR_data* ); -#endif diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 5d3053fb37..a2276023a4 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -24,129 +24,124 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_reset_tools.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_tool_box.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" #include "error.h" #include #include -void Reset_Atoms( reax_system* system, control_params *control ) -{ - int i; - reax_atom *atom; +namespace ReaxFF { + + static void Reset_Atoms(reax_system* system, control_params *control) + { + int i; + reax_atom *atom; - system->numH = 0; - if (control->hbond_cut > 0) - for (i = 0; i < system->n; ++i) { - atom = &(system->my_atoms[i]); - if (atom->type < 0) continue; - if (system->reax_param.sbp[ atom->type ].p_hbond == 1) - atom->Hindex = system->numH++; - else atom->Hindex = -1; - } -} - - -void Reset_Energies( energy_data *en ) -{ - en->e_bond = 0; - en->e_ov = 0; - en->e_un = 0; - en->e_lp = 0; - en->e_ang = 0; - en->e_pen = 0; - en->e_coa = 0; - en->e_hb = 0; - en->e_tor = 0; - en->e_con = 0; - en->e_vdW = 0; - en->e_ele = 0; - en->e_pol = 0; -} - -void Reset_Simulation_Data( simulation_data* data, int /*virial*/ ) -{ - Reset_Energies( &data->my_en ); - Reset_Energies( &data->sys_en ); -} - -void Reset_Workspace( reax_system *system, storage *workspace ) -{ - memset( workspace->total_bond_order, 0, system->total_cap * sizeof( double ) ); - memset( workspace->dDeltap_self, 0, system->total_cap * sizeof( rvec ) ); - memset( workspace->CdDelta, 0, system->total_cap * sizeof( double ) ); - memset( workspace->f, 0, system->total_cap * sizeof( rvec ) ); - -} - -void Reset_Neighbor_Lists( reax_system *system, control_params *control, - storage *workspace, reax_list **lists ) -{ - int i, total_bonds, Hindex, total_hbonds; - reax_list *bonds, *hbonds; - - /* bonds list */ - if (system->N > 0) { - bonds = (*lists) + BONDS; - total_bonds = 0; - - /* reset start-end indexes */ - for (i = 0; i < system->N; ++i) { - Set_Start_Index( i, total_bonds, bonds ); - Set_End_Index( i, total_bonds, bonds ); - total_bonds += system->my_atoms[i].num_bonds; - } - - /* is reallocation needed? */ - if (total_bonds >= bonds->num_intrs * DANGER_ZONE) { - workspace->realloc.bonds = 1; - if (total_bonds >= bonds->num_intrs) - control->error_ptr->one(FLERR,fmt::format("Not enough space for bonds! " - "total={} allocated={}\n", - total_bonds, bonds->num_intrs)); - } + system->numH = 0; + if (control->hbond_cut > 0) + for (i = 0; i < system->n; ++i) { + atom = &(system->my_atoms[i]); + if (atom->type < 0) continue; + if (system->reax_param.sbp[ atom->type ].p_hbond == 1) + atom->Hindex = system->numH++; + else atom->Hindex = -1; + } } - if (control->hbond_cut > 0 && system->numH > 0) { - hbonds = (*lists) + HBONDS; - total_hbonds = 0; - /* reset start-end indexes */ - for (i = 0; i < system->n; ++i) { - Hindex = system->my_atoms[i].Hindex; - if (Hindex > -1) { - Set_Start_Index( Hindex, total_hbonds, hbonds ); - Set_End_Index( Hindex, total_hbonds, hbonds ); - total_hbonds += system->my_atoms[i].num_hbonds; + static void Reset_Energies(energy_data *en) + { + en->e_bond = 0; + en->e_ov = 0; + en->e_un = 0; + en->e_lp = 0; + en->e_ang = 0; + en->e_pen = 0; + en->e_coa = 0; + en->e_hb = 0; + en->e_tor = 0; + en->e_con = 0; + en->e_vdW = 0; + en->e_ele = 0; + en->e_pol = 0; + } + + void Reset_Simulation_Data(simulation_data* data) + { + Reset_Energies(&data->my_en); + Reset_Energies(&data->sys_en); + } + + void Reset_Workspace(reax_system *system, storage *workspace) + { + memset(workspace->total_bond_order, 0, system->total_cap * sizeof(double)); + memset(workspace->dDeltap_self, 0, system->total_cap * sizeof(rvec)); + memset(workspace->CdDelta, 0, system->total_cap * sizeof(double)); + memset(workspace->f, 0, system->total_cap * sizeof(rvec)); + + } + + static void Reset_Neighbor_Lists(reax_system *system, control_params *control, + storage *workspace, reax_list **lists) + { + int i, total_bonds, Hindex, total_hbonds; + reax_list *bonds, *hbonds; + + /* bonds list */ + if (system->N > 0) { + bonds = (*lists) + BONDS; + total_bonds = 0; + + /* reset start-end indexes */ + for (i = 0; i < system->N; ++i) { + Set_Start_Index(i, total_bonds, bonds); + Set_End_Index(i, total_bonds, bonds); + total_bonds += system->my_atoms[i].num_bonds; + } + + /* is reallocation needed? */ + if (total_bonds >= bonds->num_intrs * DANGER_ZONE) { + workspace->realloc.bonds = 1; + if (total_bonds >= bonds->num_intrs) + control->error_ptr->one(FLERR,fmt::format("Not enough space for bonds! " + "total={} allocated={}\n", + total_bonds, bonds->num_intrs)); } } - /* is reallocation needed? */ - if (total_hbonds >= hbonds->num_intrs * 0.90/*DANGER_ZONE*/) { - workspace->realloc.hbonds = 1; - if (total_hbonds >= hbonds->num_intrs) - control->error_ptr->one(FLERR,fmt::format("Not enough space for hbonds! " - "total={} allocated={}\n", - total_hbonds, hbonds->num_intrs)); + if (control->hbond_cut > 0 && system->numH > 0) { + hbonds = (*lists) + HBONDS; + total_hbonds = 0; + + /* reset start-end indexes */ + for (i = 0; i < system->n; ++i) { + Hindex = system->my_atoms[i].Hindex; + if (Hindex > -1) { + Set_Start_Index(Hindex, total_hbonds, hbonds); + Set_End_Index(Hindex, total_hbonds, hbonds); + total_hbonds += system->my_atoms[i].num_hbonds; + } + } + + /* is reallocation needed? */ + if (total_hbonds >= hbonds->num_intrs * 0.90/*DANGER_ZONE*/) { + workspace->realloc.hbonds = 1; + if (total_hbonds >= hbonds->num_intrs) + control->error_ptr->one(FLERR,fmt::format("Not enough space for hbonds! " + "total={} allocated={}\n", + total_hbonds, hbonds->num_intrs)); + } } } -} - - -void Reset( reax_system *system, control_params *control, simulation_data *data, - storage *workspace, reax_list **lists ) -{ - Reset_Atoms( system, control ); - - Reset_Simulation_Data( data, control->virial ); - - Reset_Workspace( system, workspace ); - - Reset_Neighbor_Lists( system, control, workspace, lists ); - + + + void Reset(reax_system *system, control_params *control, simulation_data *data, + storage *workspace, reax_list **lists) + { + Reset_Atoms(system, control); + Reset_Simulation_Data(data); + Reset_Workspace(system, workspace); + Reset_Neighbor_Lists(system, control, workspace, lists); + } } diff --git a/src/USER-REAXC/reaxc_reset_tools.h b/src/USER-REAXC/reaxc_reset_tools.h deleted file mode 100644 index 39cda0ac9b..0000000000 --- a/src/USER-REAXC/reaxc_reset_tools.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __RESET_TOOLS_H_ -#define __RESET_TOOLS_H_ - -#include "reaxc_types.h" - -void Reset_Pressures( simulation_data* ); -void Reset_Simulation_Data( simulation_data*, int ); -void Reset_Workspace( reax_system*, storage* ); -void Reset_Neighbor_Lists( reax_system*, control_params*, storage*, - reax_list** ); -void Reset( reax_system*, control_params*, simulation_data*, storage*, - reax_list** ); -#endif diff --git a/src/USER-REAXC/reaxc_system_props.cpp b/src/USER-REAXC/reaxc_system_props.cpp deleted file mode 100644 index de513e11de..0000000000 --- a/src/USER-REAXC/reaxc_system_props.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#include "reaxc_system_props.h" -#include -#include "reaxc_defs.h" - -void Compute_System_Energy( reax_system *system, simulation_data *data, - MPI_Comm comm ) -{ - double my_en[13], sys_en[13]; - - my_en[0] = data->my_en.e_bond; - my_en[1] = data->my_en.e_ov; - my_en[2] = data->my_en.e_un; - my_en[3] = data->my_en.e_lp; - my_en[4] = data->my_en.e_ang; - my_en[5] = data->my_en.e_pen; - my_en[6] = data->my_en.e_coa; - my_en[7] = data->my_en.e_hb; - my_en[8] = data->my_en.e_tor; - my_en[9] = data->my_en.e_con; - my_en[10] = data->my_en.e_vdW; - my_en[11] = data->my_en.e_ele; - my_en[12] = data->my_en.e_pol; - MPI_Reduce( my_en, sys_en, 13, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); - - if (system->my_rank == MASTER_NODE) { - data->sys_en.e_bond = sys_en[0]; - data->sys_en.e_ov = sys_en[1]; - data->sys_en.e_un = sys_en[2]; - data->sys_en.e_lp = sys_en[3]; - data->sys_en.e_ang = sys_en[4]; - data->sys_en.e_pen = sys_en[5]; - data->sys_en.e_coa = sys_en[6]; - data->sys_en.e_hb = sys_en[7]; - data->sys_en.e_tor = sys_en[8]; - data->sys_en.e_con = sys_en[9]; - data->sys_en.e_vdW = sys_en[10]; - data->sys_en.e_ele = sys_en[11]; - data->sys_en.e_pol = sys_en[12]; - } -} diff --git a/src/USER-REAXC/reaxc_system_props.h b/src/USER-REAXC/reaxc_system_props.h deleted file mode 100644 index 4d80e22966..0000000000 --- a/src/USER-REAXC/reaxc_system_props.h +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __SYSTEM_PROP_H_ -#define __SYSTEM_PROP_H_ - -#include "reaxc_types.h" -#include - -void Compute_System_Energy( reax_system*, simulation_data*, MPI_Comm ); - -#endif diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index abab3f2b43..ab8ba6317c 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -24,8 +24,7 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_tool_box.h" -#include "reaxc_defs.h" +#include "reaxff_api.h" #include #include @@ -33,93 +32,95 @@ #include "error.h" -int Tokenize( char* s, char*** tok ) -{ - char test[MAX_LINE]; - const char *sep = (const char *)"\t \n\r\f!="; - char *word; - int count=0; +namespace ReaxFF { + + int Tokenize(char* s, char*** tok) + { + char test[MAX_LINE]; + const char *sep = (const char *)"\t \n\r\f!="; + char *word; + int count=0; - strncpy( test, s, MAX_LINE-1); + strncpy(test, s, MAX_LINE-1); - for (word = strtok(test, sep); word; word = strtok(nullptr, sep)) { - strncpy( (*tok)[count], word, MAX_LINE ); - count++; + for (word = strtok(test, sep); word; word = strtok(nullptr, sep)) { + strncpy((*tok)[count], word, MAX_LINE); + count++; + } + + return count; } - return count; -} - /* safe malloc */ -void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name ) -{ - void *ptr; + void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name) + { + void *ptr; - if (n <= 0) { - auto errmsg = fmt::format("Trying to allocate {} bytes for array {}. " - "returning NULL.", n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); + if (n <= 0) { + auto errmsg = fmt::format("Trying to allocate {} bytes for array {}. " + "returning NULL.", n, name); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); - return nullptr; + return nullptr; + } + + ptr = malloc(n); + if (ptr == nullptr) { + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", + n, name); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); + } + + return ptr; } - ptr = malloc( n ); - if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", - n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - } - - return ptr; -} - /* safe calloc */ -void *scalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name ) -{ - void *ptr; + void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name) + { + void *ptr; - if (n <= 0) { - auto errmsg = fmt::format("Trying to allocate {} elements for array {}. " - "returning NULL.\n", n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - return nullptr; + if (n <= 0) { + auto errmsg = fmt::format("Trying to allocate {} elements for array {}. " + "returning NULL.\n", n, name); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); + return nullptr; + } + + if (size <= 0) { + auto errmsg = fmt::format("Elements size for array {} is {}. " + "returning NULL", name, size); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); + return nullptr; + } + + ptr = calloc(n, size); + if (ptr == nullptr) { + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", + n*size, name); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); + } + + return ptr; } - if (size <= 0) { - auto errmsg = fmt::format("Elements size for array {} is {}. " - "returning NULL", name, size); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - return nullptr; - } - ptr = calloc( n, size ); - if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", - n*size, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - } + /* safe free */ + void sfree(LAMMPS_NS::Error* error_ptr, void *ptr, const char *name) + { + if (ptr == nullptr) { + auto errmsg = fmt::format("Trying to free the already free()'d pointer {}", + name); + if (error_ptr) error_ptr->one(FLERR,errmsg); + else fputs(errmsg.c_str(),stderr); + return; + } - return ptr; + free(ptr); + ptr = nullptr; + } } - - -/* safe free */ -void sfree( LAMMPS_NS::Error* error_ptr, void *ptr, const char *name ) -{ - if (ptr == nullptr) { - auto errmsg = fmt::format("Trying to free the already free()'d pointer {}", - name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - return; - } - - free(ptr); - ptr = nullptr; -} - diff --git a/src/USER-REAXC/reaxc_tool_box.h b/src/USER-REAXC/reaxc_tool_box.h deleted file mode 100644 index 773b4f3f3d..0000000000 --- a/src/USER-REAXC/reaxc_tool_box.h +++ /dev/null @@ -1,40 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __TOOL_BOX_H_ -#define __TOOL_BOX_H_ - -#include "reaxc_types.h" -namespace LAMMPS_NS { class Error; } - -/* from io_tools.h */ -int Tokenize( char*, char*** ); - -/* from lammps */ -void *smalloc( LAMMPS_NS::Error*, rc_bigint, const char* ); -void *scalloc( LAMMPS_NS::Error*, rc_bigint, rc_bigint, const char* ); -void sfree( LAMMPS_NS::Error*, void*, const char* ); -#endif diff --git a/src/USER-REAXC/reaxc_torsion_angles.cpp b/src/USER-REAXC/reaxc_torsion_angles.cpp index 04e7bfcc1c..00019d5130 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.cpp +++ b/src/USER-REAXC/reaxc_torsion_angles.cpp @@ -24,440 +24,435 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_torsion_angles.h" -#include +#include "reaxff_api.h" + #include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" + +#include #define MIN_SINE 1e-10 -double Calculate_Omega( rvec dvec_ij, double r_ij, - rvec dvec_jk, double r_jk, - rvec dvec_kl, double r_kl, - rvec dvec_li, double r_li, - three_body_interaction_data *p_ijk, - three_body_interaction_data *p_jkl, - rvec dcos_omega_di, rvec dcos_omega_dj, - rvec dcos_omega_dk, rvec dcos_omega_dl, - output_controls * /*out_control*/ ) -{ - double unnorm_cos_omega, unnorm_sin_omega, omega; - double sin_ijk, cos_ijk, sin_jkl, cos_jkl; - double htra, htrb, htrc, hthd, hthe, hnra, hnrc, hnhd, hnhe; - double arg, poem, tel; - rvec cross_jk_kl; +namespace ReaxFF { + double Calculate_Omega(rvec dvec_ij, double r_ij, rvec dvec_jk, double r_jk, + rvec dvec_kl, double r_kl, rvec dvec_li, double r_li, + three_body_interaction_data *p_ijk, + three_body_interaction_data *p_jkl, + rvec dcos_omega_di, rvec dcos_omega_dj, + rvec dcos_omega_dk, rvec dcos_omega_dl) + { + double unnorm_cos_omega, unnorm_sin_omega, omega; + double sin_ijk, cos_ijk, sin_jkl, cos_jkl; + double htra, htrb, htrc, hthd, hthe, hnra, hnrc, hnhd, hnhe; + double arg, poem, tel; + rvec cross_jk_kl; - sin_ijk = sin( p_ijk->theta ); - cos_ijk = cos( p_ijk->theta ); - sin_jkl = sin( p_jkl->theta ); - cos_jkl = cos( p_jkl->theta ); + sin_ijk = sin(p_ijk->theta); + cos_ijk = cos(p_ijk->theta); + sin_jkl = sin(p_jkl->theta); + cos_jkl = cos(p_jkl->theta); - /* omega */ - unnorm_cos_omega = -rvec_Dot(dvec_ij, dvec_jk) * rvec_Dot(dvec_jk, dvec_kl) + - SQR( r_jk ) * rvec_Dot( dvec_ij, dvec_kl ); + /* omega */ + unnorm_cos_omega = -rvec_Dot(dvec_ij, dvec_jk) * rvec_Dot(dvec_jk, dvec_kl) + + SQR(r_jk) * rvec_Dot(dvec_ij, dvec_kl); - rvec_Cross( cross_jk_kl, dvec_jk, dvec_kl ); - unnorm_sin_omega = -r_jk * rvec_Dot( dvec_ij, cross_jk_kl ); + rvec_Cross(cross_jk_kl, dvec_jk, dvec_kl); + unnorm_sin_omega = -r_jk * rvec_Dot(dvec_ij, cross_jk_kl); - omega = atan2( unnorm_sin_omega, unnorm_cos_omega ); + omega = atan2(unnorm_sin_omega, unnorm_cos_omega); - htra = r_ij + cos_ijk * ( r_kl * cos_jkl - r_jk ); - htrb = r_jk - r_ij * cos_ijk - r_kl * cos_jkl; - htrc = r_kl + cos_jkl * ( r_ij * cos_ijk - r_jk ); - hthd = r_ij * sin_ijk * ( r_jk - r_kl * cos_jkl ); - hthe = r_kl * sin_jkl * ( r_jk - r_ij * cos_ijk ); - hnra = r_kl * sin_ijk * sin_jkl; - hnrc = r_ij * sin_ijk * sin_jkl; - hnhd = r_ij * r_kl * cos_ijk * sin_jkl; - hnhe = r_ij * r_kl * sin_ijk * cos_jkl; + htra = r_ij + cos_ijk * (r_kl * cos_jkl - r_jk); + htrb = r_jk - r_ij * cos_ijk - r_kl * cos_jkl; + htrc = r_kl + cos_jkl * (r_ij * cos_ijk - r_jk); + hthd = r_ij * sin_ijk * (r_jk - r_kl * cos_jkl); + hthe = r_kl * sin_jkl * (r_jk - r_ij * cos_ijk); + hnra = r_kl * sin_ijk * sin_jkl; + hnrc = r_ij * sin_ijk * sin_jkl; + hnhd = r_ij * r_kl * cos_ijk * sin_jkl; + hnhe = r_ij * r_kl * sin_ijk * cos_jkl; - poem = 2.0 * r_ij * r_kl * sin_ijk * sin_jkl; - if (poem < 1e-20) poem = 1e-20; + poem = 2.0 * r_ij * r_kl * sin_ijk * sin_jkl; + if (poem < 1e-20) poem = 1e-20; - tel = SQR( r_ij ) + SQR( r_jk ) + SQR( r_kl ) - SQR( r_li ) - - 2.0 * ( r_ij * r_jk * cos_ijk - r_ij * r_kl * cos_ijk * cos_jkl + - r_jk * r_kl * cos_jkl ); + tel = SQR(r_ij) + SQR(r_jk) + SQR(r_kl) - SQR(r_li) - + 2.0 * (r_ij * r_jk * cos_ijk - r_ij * r_kl * cos_ijk * cos_jkl + + r_jk * r_kl * cos_jkl); - arg = tel / poem; - if (arg > 1.0) arg = 1.0; - if (arg < -1.0) arg = -1.0; + arg = tel / poem; + if (arg > 1.0) arg = 1.0; + if (arg < -1.0) arg = -1.0; - if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) sin_ijk = MIN_SINE; - else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) sin_ijk = -MIN_SINE; - if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) sin_jkl = MIN_SINE; - else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) sin_jkl = -MIN_SINE; + if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) sin_ijk = MIN_SINE; + else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) sin_ijk = -MIN_SINE; + if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) sin_jkl = MIN_SINE; + else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) sin_jkl = -MIN_SINE; - // dcos_omega_di - rvec_ScaledSum( dcos_omega_di, (htra-arg*hnra)/r_ij, dvec_ij, -1., dvec_li ); - rvec_ScaledAdd( dcos_omega_di,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_dk ); - rvec_Scale( dcos_omega_di, 2.0 / poem, dcos_omega_di ); + // dcos_omega_di + rvec_ScaledSum(dcos_omega_di, (htra-arg*hnra)/r_ij, dvec_ij, -1., dvec_li); + rvec_ScaledAdd(dcos_omega_di,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_dk); + rvec_Scale(dcos_omega_di, 2.0 / poem, dcos_omega_di); - // dcos_omega_dj - rvec_ScaledSum( dcos_omega_dj,-(htra-arg*hnra)/r_ij, dvec_ij, - -htrb / r_jk, dvec_jk ); - rvec_ScaledAdd( dcos_omega_dj,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_dj ); - rvec_ScaledAdd( dcos_omega_dj,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_di ); - rvec_Scale( dcos_omega_dj, 2.0 / poem, dcos_omega_dj ); + // dcos_omega_dj + rvec_ScaledSum(dcos_omega_dj,-(htra-arg*hnra)/r_ij, dvec_ij, + -htrb / r_jk, dvec_jk); + rvec_ScaledAdd(dcos_omega_dj,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_dj); + rvec_ScaledAdd(dcos_omega_dj,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_di); + rvec_Scale(dcos_omega_dj, 2.0 / poem, dcos_omega_dj); - // dcos_omega_dk - rvec_ScaledSum( dcos_omega_dk,-(htrc-arg*hnrc)/r_kl, dvec_kl, - htrb / r_jk, dvec_jk ); - rvec_ScaledAdd( dcos_omega_dk,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_di ); - rvec_ScaledAdd( dcos_omega_dk,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_dj ); - rvec_Scale( dcos_omega_dk, 2.0 / poem, dcos_omega_dk ); + // dcos_omega_dk + rvec_ScaledSum(dcos_omega_dk,-(htrc-arg*hnrc)/r_kl, dvec_kl, + htrb / r_jk, dvec_jk); + rvec_ScaledAdd(dcos_omega_dk,-(hthd-arg*hnhd)/sin_ijk, p_ijk->dcos_di); + rvec_ScaledAdd(dcos_omega_dk,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_dj); + rvec_Scale(dcos_omega_dk, 2.0 / poem, dcos_omega_dk); - // dcos_omega_dl - rvec_ScaledSum( dcos_omega_dl, (htrc-arg*hnrc)/r_kl, dvec_kl, 1., dvec_li ); - rvec_ScaledAdd( dcos_omega_dl,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_dk ); - rvec_Scale( dcos_omega_dl, 2.0 / poem, dcos_omega_dl ); + // dcos_omega_dl + rvec_ScaledSum(dcos_omega_dl, (htrc-arg*hnrc)/r_kl, dvec_kl, 1., dvec_li); + rvec_ScaledAdd(dcos_omega_dl,-(hthe-arg*hnhe)/sin_jkl, p_jkl->dcos_dk); + rvec_Scale(dcos_omega_dl, 2.0 / poem, dcos_omega_dl); - return omega; -} - - - -void Torsion_Angles( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control ) -{ - int i, j, k, l, pi, pj, pk, pl, pij, plk, natoms; - int type_i, type_j, type_k, type_l; - int start_j, end_j; - int start_pj, end_pj, start_pk, end_pk; - int num_frb_intrs = 0; - - double Delta_j, Delta_k; - double r_ij, r_jk, r_kl, r_li; - double BOA_ij, BOA_jk, BOA_kl; - - double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; - double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; - double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; - double fn10, f11_DjDk, dfn11, fn12; - double theta_ijk, theta_jkl; - double sin_ijk, sin_jkl; - double cos_ijk, cos_jkl; - double tan_ijk_i, tan_jkl_i; - double omega, cos_omega, cos2omega, cos3omega; - rvec dcos_omega_di, dcos_omega_dj, dcos_omega_dk, dcos_omega_dl; - double CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; - double CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; - double Cconj, CEconj1, CEconj2, CEconj3; - double CEconj4, CEconj5, CEconj6; - double e_tor, e_con; - rvec dvec_li; - rvec force; - ivec rel_box_jl; - four_body_header *fbh; - four_body_parameters *fbp; - bond_data *pbond_ij, *pbond_jk, *pbond_kl; - bond_order_data *bo_ij, *bo_jk, *bo_kl; - three_body_interaction_data *p_ijk, *p_jkl; - double p_tor2 = system->reax_param.gp.l[23]; - double p_tor3 = system->reax_param.gp.l[24]; - double p_tor4 = system->reax_param.gp.l[25]; - double p_cot2 = system->reax_param.gp.l[27]; - reax_list *bonds = (*lists) + BONDS; - reax_list *thb_intrs = (*lists) + THREE_BODIES; - - // Virial tallying variables - double delil[3], deljl[3], delkl[3]; - double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - - natoms = system->n; - - for (j = 0; j < natoms; ++j) { - type_j = system->my_atoms[j].type; - Delta_j = workspace->Delta_boc[j]; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); - - for (pk = start_j; pk < end_j; ++pk) { - pbond_jk = &( bonds->select.bond_list[pk] ); - k = pbond_jk->nbr; - bo_jk = &( pbond_jk->bo_data ); - BOA_jk = bo_jk->BO - control->thb_cut; - - if (system->my_atoms[j].orig_id > system->my_atoms[k].orig_id) - continue; - if (system->my_atoms[j].orig_id == system->my_atoms[k].orig_id) { - if (system->my_atoms[k].x[2] < system->my_atoms[j].x[2]) continue; - if (system->my_atoms[k].x[2] == system->my_atoms[j].x[2] && - system->my_atoms[k].x[1] < system->my_atoms[j].x[1]) continue; - if (system->my_atoms[k].x[2] == system->my_atoms[j].x[2] && - system->my_atoms[k].x[1] == system->my_atoms[j].x[1] && - system->my_atoms[k].x[0] < system->my_atoms[j].x[0]) continue; - } - - if (bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { - pj = pbond_jk->sym_index; // pj points to j on k's list - - if (Num_Entries(pj, thb_intrs)) { - type_k = system->my_atoms[k].type; - Delta_k = workspace->Delta_boc[k]; - r_jk = pbond_jk->d; - - start_pk = Start_Index(pk, thb_intrs ); - end_pk = End_Index(pk, thb_intrs ); - start_pj = Start_Index(pj, thb_intrs ); - end_pj = End_Index(pj, thb_intrs ); - - exp_tor2_jk = exp( -p_tor2 * BOA_jk ); - exp_cot2_jk = exp( -p_cot2 * SQR(BOA_jk - 1.5) ); - exp_tor3_DjDk = exp( -p_tor3 * (Delta_j + Delta_k) ); - exp_tor4_DjDk = exp( p_tor4 * (Delta_j + Delta_k) ); - exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); - f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; - - for (pi = start_pk; pi < end_pk; ++pi) { - p_ijk = &( thb_intrs->select.three_body_list[pi] ); - pij = p_ijk->pthb; // pij is pointer to i on j's bond_list - pbond_ij = &( bonds->select.bond_list[pij] ); - bo_ij = &( pbond_ij->bo_data ); - - if (bo_ij->BO > control->thb_cut/*0*/) { - i = p_ijk->thb; - type_i = system->my_atoms[i].type; - r_ij = pbond_ij->d; - BOA_ij = bo_ij->BO - control->thb_cut; - - theta_ijk = p_ijk->theta; - sin_ijk = sin( theta_ijk ); - cos_ijk = cos( theta_ijk ); - //tan_ijk_i = 1. / tan( theta_ijk ); - if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) - tan_ijk_i = cos_ijk / MIN_SINE; - else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) - tan_ijk_i = cos_ijk / -MIN_SINE; - else tan_ijk_i = cos_ijk / sin_ijk; - - exp_tor2_ij = exp( -p_tor2 * BOA_ij ); - exp_cot2_ij = exp( -p_cot2 * SQR(BOA_ij -1.5) ); - - for (pl = start_pj; pl < end_pj; ++pl) { - p_jkl = &( thb_intrs->select.three_body_list[pl] ); - l = p_jkl->thb; - plk = p_jkl->pthb; //pointer to l on k's bond_list! - pbond_kl = &( bonds->select.bond_list[plk] ); - bo_kl = &( pbond_kl->bo_data ); - type_l = system->my_atoms[l].type; - fbh = &(system->reax_param.fbp[type_i][type_j] - [type_k][type_l]); - fbp = &(system->reax_param.fbp[type_i][type_j] - [type_k][type_l].prm[0]); - - if ( i != l && fbh->cnt && - bo_kl->BO > control->thb_cut/*0*/ && - bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { - ++num_frb_intrs; - r_kl = pbond_kl->d; - BOA_kl = bo_kl->BO - control->thb_cut; - - theta_jkl = p_jkl->theta; - sin_jkl = sin( theta_jkl ); - cos_jkl = cos( theta_jkl ); - //tan_jkl_i = 1. / tan( theta_jkl ); - if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) - tan_jkl_i = cos_jkl / MIN_SINE; - else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) - tan_jkl_i = cos_jkl / -MIN_SINE; - else tan_jkl_i = cos_jkl /sin_jkl; - - rvec_ScaledSum( dvec_li, 1., system->my_atoms[i].x, - -1., system->my_atoms[l].x ); - r_li = rvec_Norm( dvec_li ); - - - /* omega and its derivative */ - omega = Calculate_Omega( pbond_ij->dvec, r_ij, - pbond_jk->dvec, r_jk, - pbond_kl->dvec, r_kl, - dvec_li, r_li, - p_ijk, p_jkl, - dcos_omega_di, dcos_omega_dj, - dcos_omega_dk, dcos_omega_dl, - out_control ); - - cos_omega = cos( omega ); - cos2omega = cos( 2. * omega ); - cos3omega = cos( 3. * omega ); - /* end omega calculations */ - - /* torsion energy */ - exp_tor1 = exp( fbp->p_tor1 * - SQR(2.0 - bo_jk->BO_pi - f11_DjDk) ); - exp_tor2_kl = exp( -p_tor2 * BOA_kl ); - exp_cot2_kl = exp( -p_cot2 * SQR(BOA_kl - 1.5) ); - fn10 = (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * - (1.0 - exp_tor2_kl); - - CV = 0.5 * ( fbp->V1 * (1.0 + cos_omega) + - fbp->V2 * exp_tor1 * (1.0 - cos2omega) + - fbp->V3 * (1.0 + cos3omega) ); - - data->my_en.e_tor += e_tor = fn10 * sin_ijk * sin_jkl * CV; - - dfn11 = (-p_tor3 * exp_tor3_DjDk + - (p_tor3 * exp_tor3_DjDk - p_tor4 * exp_tor4_DjDk) * - (2.0 + exp_tor3_DjDk) * exp_tor34_inv) * - exp_tor34_inv; - - CEtors1 = sin_ijk * sin_jkl * CV; - - CEtors2 = -fn10 * 2.0 * fbp->p_tor1 * fbp->V2 * exp_tor1 * - (2.0 - bo_jk->BO_pi - f11_DjDk) * (1.0 - SQR(cos_omega)) * - sin_ijk * sin_jkl; - CEtors3 = CEtors2 * dfn11; - - CEtors4 = CEtors1 * p_tor2 * exp_tor2_ij * - (1.0 - exp_tor2_jk) * (1.0 - exp_tor2_kl); - CEtors5 = CEtors1 * p_tor2 * - (1.0 - exp_tor2_ij) * exp_tor2_jk * (1.0 - exp_tor2_kl); - CEtors6 = CEtors1 * p_tor2 * - (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * exp_tor2_kl; - - cmn = -fn10 * CV; - CEtors7 = cmn * sin_jkl * tan_ijk_i; - CEtors8 = cmn * sin_ijk * tan_jkl_i; - - CEtors9 = fn10 * sin_ijk * sin_jkl * - (0.5 * fbp->V1 - 2.0 * fbp->V2 * exp_tor1 * cos_omega + - 1.5 * fbp->V3 * (cos2omega + 2.0 * SQR(cos_omega))); - /* end of torsion energy */ - - /* 4-body conjugation energy */ - fn12 = exp_cot2_ij * exp_cot2_jk * exp_cot2_kl; - data->my_en.e_con += e_con = - fbp->p_cot1 * fn12 * - (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); - - Cconj = -2.0 * fn12 * fbp->p_cot1 * p_cot2 * - (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); - - CEconj1 = Cconj * (BOA_ij - 1.5e0); - CEconj2 = Cconj * (BOA_jk - 1.5e0); - CEconj3 = Cconj * (BOA_kl - 1.5e0); - - CEconj4 = -fbp->p_cot1 * fn12 * - (SQR(cos_omega) - 1.0) * sin_jkl * tan_ijk_i; - CEconj5 = -fbp->p_cot1 * fn12 * - (SQR(cos_omega) - 1.0) * sin_ijk * tan_jkl_i; - CEconj6 = 2.0 * fbp->p_cot1 * fn12 * - cos_omega * sin_ijk * sin_jkl; - /* end 4-body conjugation energy */ - - /* forces */ - bo_jk->Cdbopi += CEtors2; - workspace->CdDelta[j] += CEtors3; - workspace->CdDelta[k] += CEtors3; - bo_ij->Cdbo += (CEtors4 + CEconj1); - bo_jk->Cdbo += (CEtors5 + CEconj2); - bo_kl->Cdbo += (CEtors6 + CEconj3); - - if (control->virial == 0) { - /* dcos_theta_ijk */ - rvec_ScaledAdd( workspace->f[i], - CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_ScaledAdd( workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->f[k], - CEtors7 + CEconj4, p_ijk->dcos_di ); - - /* dcos_theta_jkl */ - rvec_ScaledAdd( workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di ); - rvec_ScaledAdd( workspace->f[k], - CEtors8 + CEconj5, p_jkl->dcos_dj ); - rvec_ScaledAdd( workspace->f[l], - CEtors8 + CEconj5, p_jkl->dcos_dk ); - - /* dcos_omega */ - rvec_ScaledAdd( workspace->f[i], - CEtors9 + CEconj6, dcos_omega_di ); - rvec_ScaledAdd( workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj ); - rvec_ScaledAdd( workspace->f[k], - CEtors9 + CEconj6, dcos_omega_dk ); - rvec_ScaledAdd( workspace->f[l], - CEtors9 + CEconj6, dcos_omega_dl ); - } - else { - ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); - - /* dcos_theta_ijk */ - rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_Add( workspace->f[i], force ); - - rvec_ScaledAdd( workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj ); - - rvec_Scale( force, CEtors7 + CEconj4, p_ijk->dcos_di ); - rvec_Add( workspace->f[k], force ); - - /* dcos_theta_jkl */ - rvec_ScaledAdd( workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di ); - - rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dj ); - rvec_Add( workspace->f[k], force ); - - rvec_Scale( force, CEtors8 + CEconj5, p_jkl->dcos_dk ); - rvec_Add( workspace->f[l], force ); - - - /* dcos_omega */ - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_di ); - rvec_Add( workspace->f[i], force ); - - rvec_ScaledAdd( workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj ); - - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dk ); - rvec_Add( workspace->f[k], force ); - - rvec_Scale( force, CEtors9 + CEconj6, dcos_omega_dl ); - rvec_Add( workspace->f[l], force ); - } - - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - - // acquire vectors - rvec_ScaledSum( delil, 1., system->my_atoms[l].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( deljl, 1., system->my_atoms[l].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkl, 1., system->my_atoms[l].x, - -1., system->my_atoms[k].x ); - // dcos_theta_ijk - rvec_Scale( fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk ); - rvec_Scale( fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di ); - - // dcos_theta_jkl - rvec_ScaledAdd( fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di ); - rvec_ScaledAdd( fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj ); - - // dcos_omega - rvec_ScaledAdd( fi_tmp, CEtors9 + CEconj6, dcos_omega_di ); - rvec_ScaledAdd( fj_tmp, CEtors9 + CEconj6, dcos_omega_dj ); - rvec_ScaledAdd( fk_tmp, CEtors9 + CEconj6, dcos_omega_dk ); - - // tally - eng_tmp = e_tor + e_con; - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(j,k,natoms,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); - if (system->pair_ptr->vflag_atom) - system->pair_ptr->v_tally4(i,j,k,l,fi_tmp,fj_tmp,fk_tmp,delil,deljl,delkl); - } - } // pl check ends - } // pl loop ends - } // pi check ends - } // pi loop ends - } // k-j neighbor check ends - } // j-k neighbor check ends - } // pk loop ends - } // j loop + return omega; + } + + void Torsion_Angles(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int i, j, k, l, pi, pj, pk, pl, pij, plk, natoms; + int type_i, type_j, type_k, type_l; + int start_j, end_j; + int start_pj, end_pj, start_pk, end_pk; + int num_frb_intrs = 0; + + double Delta_j, Delta_k; + double r_ij, r_jk, r_kl, r_li; + double BOA_ij, BOA_jk, BOA_kl; + + double exp_tor2_ij, exp_tor2_jk, exp_tor2_kl; + double exp_tor1, exp_tor3_DjDk, exp_tor4_DjDk, exp_tor34_inv; + double exp_cot2_jk, exp_cot2_ij, exp_cot2_kl; + double fn10, f11_DjDk, dfn11, fn12; + double theta_ijk, theta_jkl; + double sin_ijk, sin_jkl; + double cos_ijk, cos_jkl; + double tan_ijk_i, tan_jkl_i; + double omega, cos_omega, cos2omega, cos3omega; + rvec dcos_omega_di, dcos_omega_dj, dcos_omega_dk, dcos_omega_dl; + double CV, cmn, CEtors1, CEtors2, CEtors3, CEtors4; + double CEtors5, CEtors6, CEtors7, CEtors8, CEtors9; + double Cconj, CEconj1, CEconj2, CEconj3; + double CEconj4, CEconj5, CEconj6; + double e_tor, e_con; + rvec dvec_li; + rvec force; + ivec rel_box_jl; + four_body_header *fbh; + four_body_parameters *fbp; + bond_data *pbond_ij, *pbond_jk, *pbond_kl; + bond_order_data *bo_ij, *bo_jk, *bo_kl; + three_body_interaction_data *p_ijk, *p_jkl; + double p_tor2 = system->reax_param.gp.l[23]; + double p_tor3 = system->reax_param.gp.l[24]; + double p_tor4 = system->reax_param.gp.l[25]; + double p_cot2 = system->reax_param.gp.l[27]; + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; + + // Virial tallying variables + double delil[3], deljl[3], delkl[3]; + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + + natoms = system->n; + + for (j = 0; j < natoms; ++j) { + type_j = system->my_atoms[j].type; + Delta_j = workspace->Delta_boc[j]; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + for (pk = start_j; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + k = pbond_jk->nbr; + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; + + if (system->my_atoms[j].orig_id > system->my_atoms[k].orig_id) + continue; + if (system->my_atoms[j].orig_id == system->my_atoms[k].orig_id) { + if (system->my_atoms[k].x[2] < system->my_atoms[j].x[2]) continue; + if (system->my_atoms[k].x[2] == system->my_atoms[j].x[2] && + system->my_atoms[k].x[1] < system->my_atoms[j].x[1]) continue; + if (system->my_atoms[k].x[2] == system->my_atoms[j].x[2] && + system->my_atoms[k].x[1] == system->my_atoms[j].x[1] && + system->my_atoms[k].x[0] < system->my_atoms[j].x[0]) continue; + } + + if (bo_jk->BO > control->thb_cut/*0*/ && Num_Entries(pk, thb_intrs)) { + pj = pbond_jk->sym_index; // pj points to j on k's list + + if (Num_Entries(pj, thb_intrs)) { + type_k = system->my_atoms[k].type; + Delta_k = workspace->Delta_boc[k]; + r_jk = pbond_jk->d; + + start_pk = Start_Index(pk, thb_intrs); + end_pk = End_Index(pk, thb_intrs); + start_pj = Start_Index(pj, thb_intrs); + end_pj = End_Index(pj, thb_intrs); + + exp_tor2_jk = exp(-p_tor2 * BOA_jk); + exp_cot2_jk = exp(-p_cot2 * SQR(BOA_jk - 1.5)); + exp_tor3_DjDk = exp(-p_tor3 * (Delta_j + Delta_k)); + exp_tor4_DjDk = exp(p_tor4 * (Delta_j + Delta_k)); + exp_tor34_inv = 1.0 / (1.0 + exp_tor3_DjDk + exp_tor4_DjDk); + f11_DjDk = (2.0 + exp_tor3_DjDk) * exp_tor34_inv; + + for (pi = start_pk; pi < end_pk; ++pi) { + p_ijk = &(thb_intrs->select.three_body_list[pi]); + pij = p_ijk->pthb; // pij is pointer to i on j's bond_list + pbond_ij = &(bonds->select.bond_list[pij]); + bo_ij = &(pbond_ij->bo_data); + + if (bo_ij->BO > control->thb_cut/*0*/) { + i = p_ijk->thb; + type_i = system->my_atoms[i].type; + r_ij = pbond_ij->d; + BOA_ij = bo_ij->BO - control->thb_cut; + + theta_ijk = p_ijk->theta; + sin_ijk = sin(theta_ijk); + cos_ijk = cos(theta_ijk); + //tan_ijk_i = 1. / tan(theta_ijk); + if (sin_ijk >= 0 && sin_ijk <= MIN_SINE) + tan_ijk_i = cos_ijk / MIN_SINE; + else if (sin_ijk <= 0 && sin_ijk >= -MIN_SINE) + tan_ijk_i = cos_ijk / -MIN_SINE; + else tan_ijk_i = cos_ijk / sin_ijk; + + exp_tor2_ij = exp(-p_tor2 * BOA_ij); + exp_cot2_ij = exp(-p_cot2 * SQR(BOA_ij -1.5)); + + for (pl = start_pj; pl < end_pj; ++pl) { + p_jkl = &(thb_intrs->select.three_body_list[pl]); + l = p_jkl->thb; + plk = p_jkl->pthb; //pointer to l on k's bond_list! + pbond_kl = &(bonds->select.bond_list[plk]); + bo_kl = &(pbond_kl->bo_data); + type_l = system->my_atoms[l].type; + fbh = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l]); + fbp = &(system->reax_param.fbp[type_i][type_j] + [type_k][type_l].prm[0]); + + if (i != l && fbh->cnt && + bo_kl->BO > control->thb_cut/*0*/ && + bo_ij->BO * bo_jk->BO * bo_kl->BO > control->thb_cut/*0*/) { + ++num_frb_intrs; + r_kl = pbond_kl->d; + BOA_kl = bo_kl->BO - control->thb_cut; + + theta_jkl = p_jkl->theta; + sin_jkl = sin(theta_jkl); + cos_jkl = cos(theta_jkl); + //tan_jkl_i = 1. / tan(theta_jkl); + if (sin_jkl >= 0 && sin_jkl <= MIN_SINE) + tan_jkl_i = cos_jkl / MIN_SINE; + else if (sin_jkl <= 0 && sin_jkl >= -MIN_SINE) + tan_jkl_i = cos_jkl / -MIN_SINE; + else tan_jkl_i = cos_jkl /sin_jkl; + + rvec_ScaledSum(dvec_li, 1., system->my_atoms[i].x, + -1., system->my_atoms[l].x); + r_li = rvec_Norm(dvec_li); + + + /* omega and its derivative */ + omega = Calculate_Omega(pbond_ij->dvec, r_ij, + pbond_jk->dvec, r_jk, + pbond_kl->dvec, r_kl, + dvec_li, r_li, + p_ijk, p_jkl, + dcos_omega_di, dcos_omega_dj, + dcos_omega_dk, dcos_omega_dl); + + cos_omega = cos(omega); + cos2omega = cos(2. * omega); + cos3omega = cos(3. * omega); + /* end omega calculations */ + + /* torsion energy */ + exp_tor1 = exp(fbp->p_tor1 * + SQR(2.0 - bo_jk->BO_pi - f11_DjDk)); + exp_tor2_kl = exp(-p_tor2 * BOA_kl); + exp_cot2_kl = exp(-p_cot2 * SQR(BOA_kl - 1.5)); + fn10 = (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * + (1.0 - exp_tor2_kl); + + CV = 0.5 * (fbp->V1 * (1.0 + cos_omega) + + fbp->V2 * exp_tor1 * (1.0 - cos2omega) + + fbp->V3 * (1.0 + cos3omega)); + + data->my_en.e_tor += e_tor = fn10 * sin_ijk * sin_jkl * CV; + + dfn11 = (-p_tor3 * exp_tor3_DjDk + + (p_tor3 * exp_tor3_DjDk - p_tor4 * exp_tor4_DjDk) * + (2.0 + exp_tor3_DjDk) * exp_tor34_inv) * + exp_tor34_inv; + + CEtors1 = sin_ijk * sin_jkl * CV; + + CEtors2 = -fn10 * 2.0 * fbp->p_tor1 * fbp->V2 * exp_tor1 * + (2.0 - bo_jk->BO_pi - f11_DjDk) * (1.0 - SQR(cos_omega)) * + sin_ijk * sin_jkl; + CEtors3 = CEtors2 * dfn11; + + CEtors4 = CEtors1 * p_tor2 * exp_tor2_ij * + (1.0 - exp_tor2_jk) * (1.0 - exp_tor2_kl); + CEtors5 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * exp_tor2_jk * (1.0 - exp_tor2_kl); + CEtors6 = CEtors1 * p_tor2 * + (1.0 - exp_tor2_ij) * (1.0 - exp_tor2_jk) * exp_tor2_kl; + + cmn = -fn10 * CV; + CEtors7 = cmn * sin_jkl * tan_ijk_i; + CEtors8 = cmn * sin_ijk * tan_jkl_i; + + CEtors9 = fn10 * sin_ijk * sin_jkl * + (0.5 * fbp->V1 - 2.0 * fbp->V2 * exp_tor1 * cos_omega + + 1.5 * fbp->V3 * (cos2omega + 2.0 * SQR(cos_omega))); + /* end of torsion energy */ + + /* 4-body conjugation energy */ + fn12 = exp_cot2_ij * exp_cot2_jk * exp_cot2_kl; + data->my_en.e_con += e_con = + fbp->p_cot1 * fn12 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + + Cconj = -2.0 * fn12 * fbp->p_cot1 * p_cot2 * + (1.0 + (SQR(cos_omega) - 1.0) * sin_ijk * sin_jkl); + + CEconj1 = Cconj * (BOA_ij - 1.5e0); + CEconj2 = Cconj * (BOA_jk - 1.5e0); + CEconj3 = Cconj * (BOA_kl - 1.5e0); + + CEconj4 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_jkl * tan_ijk_i; + CEconj5 = -fbp->p_cot1 * fn12 * + (SQR(cos_omega) - 1.0) * sin_ijk * tan_jkl_i; + CEconj6 = 2.0 * fbp->p_cot1 * fn12 * + cos_omega * sin_ijk * sin_jkl; + /* end 4-body conjugation energy */ + + /* forces */ + bo_jk->Cdbopi += CEtors2; + workspace->CdDelta[j] += CEtors3; + workspace->CdDelta[k] += CEtors3; + bo_ij->Cdbo += (CEtors4 + CEconj1); + bo_jk->Cdbo += (CEtors5 + CEconj2); + bo_kl->Cdbo += (CEtors6 + CEconj3); + + if (control->virial == 0) { + /* dcos_theta_ijk */ + rvec_ScaledAdd(workspace->f[i], + CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_ScaledAdd(workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->f[k], + CEtors7 + CEconj4, p_ijk->dcos_di); + + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(workspace->f[k], + CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_ScaledAdd(workspace->f[l], + CEtors8 + CEconj5, p_jkl->dcos_dk); + + /* dcos_omega */ + rvec_ScaledAdd(workspace->f[i], + CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(workspace->f[k], + CEtors9 + CEconj6, dcos_omega_dk); + rvec_ScaledAdd(workspace->f[l], + CEtors9 + CEconj6, dcos_omega_dl); + } + else { + ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); + + /* dcos_theta_ijk */ + rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_Add(workspace->f[i], force); + + rvec_ScaledAdd(workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj); + + rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_di); + rvec_Add(workspace->f[k], force); + + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di); + + rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_Add(workspace->f[k], force); + + rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dk); + rvec_Add(workspace->f[l], force); + + + /* dcos_omega */ + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_di); + rvec_Add(workspace->f[i], force); + + rvec_ScaledAdd(workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj); + + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dk); + rvec_Add(workspace->f[k], force); + + rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dl); + rvec_Add(workspace->f[l], force); + } + + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + + // acquire vectors + rvec_ScaledSum(delil, 1., system->my_atoms[l].x, + -1., system->my_atoms[i].x); + rvec_ScaledSum(deljl, 1., system->my_atoms[l].x, + -1., system->my_atoms[j].x); + rvec_ScaledSum(delkl, 1., system->my_atoms[l].x, + -1., system->my_atoms[k].x); + // dcos_theta_ijk + rvec_Scale(fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_Scale(fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_Scale(fk_tmp, CEtors7 + CEconj4, p_ijk->dcos_di); + + // dcos_theta_jkl + rvec_ScaledAdd(fj_tmp, CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(fk_tmp, CEtors8 + CEconj5, p_jkl->dcos_dj); + + // dcos_omega + rvec_ScaledAdd(fi_tmp, CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(fj_tmp, CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(fk_tmp, CEtors9 + CEconj6, dcos_omega_dk); + + // tally + eng_tmp = e_tor + e_con; + if (system->pair_ptr->evflag) + system->pair_ptr->ev_tally(j,k,natoms,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); + if (system->pair_ptr->vflag_atom) + system->pair_ptr->v_tally4(i,j,k,l,fi_tmp,fj_tmp,fk_tmp,delil,deljl,delkl); + } + } // pl check ends + } // pl loop ends + } // pi check ends + } // pi loop ends + } // k-j neighbor check ends + } // j-k neighbor check ends + } // pk loop ends + } // j loop + } } diff --git a/src/USER-REAXC/reaxc_torsion_angles.h b/src/USER-REAXC/reaxc_torsion_angles.h deleted file mode 100644 index 755e8c6532..0000000000 --- a/src/USER-REAXC/reaxc_torsion_angles.h +++ /dev/null @@ -1,35 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __TORSION_ANGLES_H_ -#define __TORSION_ANGLES_H_ - -#include "reaxc_types.h" - -void Torsion_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -#endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index a4678d52c5..f134713936 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -24,16 +24,11 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_traj.h" +#include "reaxff_api.h" -#include #include -#include #include -#include "reaxc_defs.h" -#include "reaxc_list.h" - #include "error.h" #define MAX_TRJ_LINE_LEN 120 @@ -52,519 +47,523 @@ #define BOND_FULL_LEN 69 #define ANGLE_BASIC_LEN 38 -enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; -enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; -enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; +namespace ReaxFF { + + enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; + enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; + enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; -std::string fmtline(const char *key, double val) -{ - return fmt::format("{:<37}{:<24.3f}\n",key,val); -} -std::string fmtline(const char *key, double val1, double val2, double val3) -{ - return fmt::format("{:<32}{:>9.3f},{:>9.3f},{:>9.3f}\n",key,val1,val2,val3); -} - -template -std::string fmtline(const char *key, T val) -{ - return fmt::format("{:<37}{:<24}\n",key,val); -} - -template -std::string fmtline(const char *key, T val1, T val2) -{ - return fmt::format("{:<36}{:<12},{:<12}\n",key,val1,val2); -} - -void Reallocate_Output_Buffer(LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space) -{ - if (out_control->buffer_len > 0) - free(out_control->buffer); - - out_control->buffer_len = (int)(req_space*REAX_SAFE_ZONE); - out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); - if (!out_control->buffer) - error_ptr->one(FLERR,fmt::format("Insufficient memory for required buffer " - "size {}", (req_space*REAX_SAFE_ZONE))); -} - -void Write_Skip_Line(output_controls *out_control, int my_rank, int skip, int num_section) -{ - if (my_rank == MASTER_NODE) - fmt::print(out_control->strj,fmtline("chars_to_skip_section:",skip,num_section)); -} - -void Write_Header(reax_system *system, control_params *control, output_controls *out_control) -{ - char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", - "xyz_q", - "xyz_q_fxfyfz", - "xyz_q_vxvyvz", - "detailed_atom_info" }; - char bond_formats[3][30] = { "none", - "basic_bond_info", - "detailed_bond_info" }; - char angle_formats[2][30] = { "none", "basic_angle_info" }; - - /* only the master node writes into trajectory header */ - if (system->my_rank == MASTER_NODE) { - std::string buffer(""); - - /* to skip the header */ - buffer += fmtline("chars_to_skip_header:",(NUM_HEADER_LINES-1) * HEADER_LINE_LEN); - - /* general simulation info */ - buffer += fmtline("simulation_name:", out_control->traj_title); - buffer += fmtline("number_of_atoms:", system->bigN); - buffer += fmtline("ensemble_type:", "(unknown)"); - buffer += fmtline("number_of_steps:", 0); - buffer += fmtline("timestep_length_(in_fs):", 0.0); - - /* restart info */ - buffer += fmtline("is_this_a_restart?:", "no"); - buffer += fmtline("write_restart_files?:", "no"); - buffer += fmtline("frequency_to_write_restarts:", 0); - - /* preferences */ - buffer += fmtline("tabulate_long_range_intrs?:",(control->tabulate ? "yes" : "no")); - buffer += fmtline("table_size:", control->tabulate); - buffer += fmtline("restrict_bonds?:", "no"); - buffer += fmtline("bond_restriction_length:", 0); - buffer += fmtline("reposition_atoms?:", "fit to periodic box"); - buffer += fmtline("remove_CoM_velocity?:", 0); - buffer += fmtline("bonded_intr_dist_cutoff:",control->bond_cut); - buffer += fmtline("nonbonded_intr_dist_cutoff:",control->nonb_cut); - buffer += fmtline("hbond_dist_cutoff:",control->hbond_cut); - buffer += fmtline("reax_bond_threshold:",control->bo_cut); - buffer += fmtline("physical_bond_threshold:", control->bg_cut); - buffer += fmtline("valence_angle_threshold:",control->thb_cut); - buffer += fmtline("QEq_tolerance:", 0.0); - - /* temperature controls */ - buffer += fmtline("initial_temperature:", 0.0); - buffer += fmtline("target_temperature:", 0.0); - buffer += fmtline("thermal_inertia:", 0.0); - buffer += fmtline("temperature_regime:", "(unknown)"); - buffer += fmtline("temperature_change_rate_(K/ps):", 0.0); - - /* pressure controls */ - buffer += fmtline("target_pressure_(GPa):", 0.0, 0.0, 0.0); - buffer += fmtline("virial_inertia:", 0.0, 0.0, 0.0); - - /* trajectory */ - buffer += fmtline("energy_dumping_freq:", out_control->energy_update_freq); - buffer += fmtline("trajectory_dumping_freq:",out_control->write_steps); - buffer += fmtline("compress_trajectory_output?:", "no"); - buffer += fmtline("trajectory_format:", "regular"); - buffer += fmtline("atom_info:", atom_formats[out_control->atom_info]); - buffer += fmtline("bond_info:", bond_formats[out_control->bond_info]); - buffer += fmtline("angle_info:", angle_formats[out_control->angle_info]); - - /* analysis */ - buffer += fmtline("molecular_analysis:", "no"); - buffer += fmtline("molecular_analysis_frequency:", 0); - - /* dump out the buffer */ - - fputs(buffer.c_str(),out_control->strj); - } -} - -void Write_Init_Desc(reax_system *system, output_controls *out_control, MPI_Comm world) -{ - int i, me, np, cnt, buffer_len, buffer_req; - reax_atom *p_atom; - MPI_Status status; - - me = system->my_rank; - np = system->wsize; - - /* skip info */ - Write_Skip_Line(out_control, me, system->bigN*INIT_DESC_LEN, system->bigN); - - if (me == MASTER_NODE) - buffer_req = system->bigN * INIT_DESC_LEN + 1; - else buffer_req = system->n * INIT_DESC_LEN + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - out_control->buffer[0] = 0; - for (i = 0; i < system->n; ++i) { - p_atom = &(system->my_atoms[i]); - auto buffer = fmt::format("{:9}{:3}{:9}{:10.3f}\n", - p_atom->orig_id, p_atom->type, p_atom->name, - system->reax_param.sbp[p_atom->type].mass); - strncpy(out_control->buffer + i*INIT_DESC_LEN, buffer.c_str(), INIT_DESC_LEN+1); + std::string fmtline(const char *key, double val) + { + return fmt::format("{:<37}{:<24.3f}\n",key,val); } - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np * INIT_DESCS + me, world); - } else { - buffer_len = system->n * INIT_DESC_LEN; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*INIT_DESCS+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); + std::string fmtline(const char *key, double val1, double val2, double val3) + { + return fmt::format("{:<32}{:>9.3f},{:>9.3f},{:>9.3f}\n",key,val1,val2,val3); } -} -void Init_Traj(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world) -{ - int atom_line_len[NR_OPT_ATOM] = { 0, 0, 0, 0, ATOM_BASIC_LEN, ATOM_wV_LEN, ATOM_wF_LEN, ATOM_FULL_LEN}; - int bond_line_len[NR_OPT_BOND] = { 0, BOND_BASIC_LEN, BOND_FULL_LEN }; - int angle_line_len[NR_OPT_ANGLE] = { 0, ANGLE_BASIC_LEN }; + template + std::string fmtline(const char *key, T val) + { + return fmt::format("{:<37}{:<24}\n",key,val); + } - /* generate trajectory name */ - auto fname = std::string(control->sim_name) + ".trj"; + template + std::string fmtline(const char *key, T val1, T val2) + { + return fmt::format("{:<36}{:<12},{:<12}\n",key,val1,val2); + } - /* how should I write atoms? */ - out_control->atom_line_len = atom_line_len[out_control->atom_info]; - out_control->write_atoms = (out_control->atom_line_len ? 1 : 0); - /* bonds? */ - out_control->bond_line_len = bond_line_len[out_control->bond_info]; - out_control->write_bonds = (out_control->bond_line_len ? 1 : 0); - /* angles? */ - out_control->angle_line_len = angle_line_len[out_control->angle_info]; - out_control->write_angles = (out_control->angle_line_len ? 1 : 0); + static void Reallocate_Output_Buffer(LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space) + { + if (out_control->buffer_len > 0) + free(out_control->buffer); - /* allocate line & buffer space */ - out_control->buffer_len = 0; - out_control->buffer = nullptr; + out_control->buffer_len = (int)(req_space*REAX_SAFE_ZONE); + out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); + if (!out_control->buffer) + error_ptr->one(FLERR,fmt::format("Insufficient memory for required buffer " + "size {}", (req_space*REAX_SAFE_ZONE))); + } - /* write trajectory header and atom info, if applicable */ - if (system->my_rank == MASTER_NODE) - out_control->strj = fopen(fname.c_str(), "w"); + static void Write_Skip_Line(output_controls *out_control, int my_rank, int skip, int num_section) + { + if (my_rank == MASTER_NODE) + fmt::print(out_control->strj,fmtline("chars_to_skip_section:",skip,num_section)); + } - Write_Header(system, control, out_control); - Write_Init_Desc(system, out_control, world); -} + static void Write_Header(reax_system *system, control_params *control, output_controls *out_control) + { + char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", + "xyz_q", + "xyz_q_fxfyfz", + "xyz_q_vxvyvz", + "detailed_atom_info" }; + char bond_formats[3][30] = { "none", + "basic_bond_info", + "detailed_bond_info" }; + char angle_formats[2][30] = { "none", "basic_angle_info" }; -void Write_Frame_Header(reax_system *system, simulation_data *data, output_controls *out_control) -{ - const int me = system->my_rank; - /* frame header lengths */ - constexpr int num_frm_hdr_lines = 22; + /* only the master node writes into trajectory header */ + if (system->my_rank == MASTER_NODE) { + std::string buffer(""); - /* only the master node writes into trajectory header */ - if (me == MASTER_NODE) { - std::string buffer(""); + /* to skip the header */ + buffer += fmtline("chars_to_skip_header:",(NUM_HEADER_LINES-1) * HEADER_LINE_LEN); + + /* general simulation info */ + buffer += fmtline("simulation_name:", out_control->traj_title); + buffer += fmtline("number_of_atoms:", system->bigN); + buffer += fmtline("ensemble_type:", "(unknown)"); + buffer += fmtline("number_of_steps:", 0); + buffer += fmtline("timestep_length_(in_fs):", 0.0); + + /* restart info */ + buffer += fmtline("is_this_a_restart?:", "no"); + buffer += fmtline("write_restart_files?:", "no"); + buffer += fmtline("frequency_to_write_restarts:", 0); + + /* preferences */ + buffer += fmtline("tabulate_long_range_intrs?:",(control->tabulate ? "yes" : "no")); + buffer += fmtline("table_size:", control->tabulate); + buffer += fmtline("restrict_bonds?:", "no"); + buffer += fmtline("bond_restriction_length:", 0); + buffer += fmtline("reposition_atoms?:", "fit to periodic box"); + buffer += fmtline("remove_CoM_velocity?:", 0); + buffer += fmtline("bonded_intr_dist_cutoff:",control->bond_cut); + buffer += fmtline("nonbonded_intr_dist_cutoff:",control->nonb_cut); + buffer += fmtline("hbond_dist_cutoff:",control->hbond_cut); + buffer += fmtline("reax_bond_threshold:",control->bo_cut); + buffer += fmtline("physical_bond_threshold:", control->bg_cut); + buffer += fmtline("valence_angle_threshold:",control->thb_cut); + buffer += fmtline("QEq_tolerance:", 0.0); + + /* temperature controls */ + buffer += fmtline("initial_temperature:", 0.0); + buffer += fmtline("target_temperature:", 0.0); + buffer += fmtline("thermal_inertia:", 0.0); + buffer += fmtline("temperature_regime:", "(unknown)"); + buffer += fmtline("temperature_change_rate_(K/ps):", 0.0); + + /* pressure controls */ + buffer += fmtline("target_pressure_(GPa):", 0.0, 0.0, 0.0); + buffer += fmtline("virial_inertia:", 0.0, 0.0, 0.0); + + /* trajectory */ + buffer += fmtline("energy_dumping_freq:", out_control->energy_update_freq); + buffer += fmtline("trajectory_dumping_freq:",out_control->write_steps); + buffer += fmtline("compress_trajectory_output?:", "no"); + buffer += fmtline("trajectory_format:", "regular"); + buffer += fmtline("atom_info:", atom_formats[out_control->atom_info]); + buffer += fmtline("bond_info:", bond_formats[out_control->bond_info]); + buffer += fmtline("angle_info:", angle_formats[out_control->angle_info]); + + /* analysis */ + buffer += fmtline("molecular_analysis:", "no"); + buffer += fmtline("molecular_analysis_frequency:", 0); + + /* dump out the buffer */ + + fputs(buffer.c_str(),out_control->strj); + } + } + + static void Write_Init_Desc(reax_system *system, output_controls *out_control, MPI_Comm world) + { + int i, me, np, cnt, buffer_len, buffer_req; + reax_atom *p_atom; + MPI_Status status; + + me = system->my_rank; + np = system->wsize; /* skip info */ - buffer += fmtline("chars_to_skip_frame_header:", (num_frm_hdr_lines-1)*HEADER_LINE_LEN); + Write_Skip_Line(out_control, me, system->bigN*INIT_DESC_LEN, system->bigN); - /* step & time */ - buffer += fmtline("step:", data->step); - buffer += fmtline("time_in_ps:", 0.0); + if (me == MASTER_NODE) + buffer_req = system->bigN * INIT_DESC_LEN + 1; + else buffer_req = system->n * INIT_DESC_LEN + 1; - /* box info */ - buffer += fmtline("volume:", 0.0); - buffer += fmtline("box_dimensions:", 0.0, 0.0, 0.0); - buffer += fmtline("coordinate_angles:", 90.0, 90.0, 90.0); + if (buffer_req > out_control->buffer_len * DANGER_ZONE) + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - /* system T and P */ - buffer += fmtline("temperature:", 0.0); - buffer += fmtline("pressure:", 0.0); - - /* energies */ - double epot = data->sys_en.e_bond + data->sys_en.e_ov + data->sys_en.e_un - + data->sys_en.e_lp + data->sys_en.e_ang + data->sys_en.e_pen - + data->sys_en.e_coa + data->sys_en.e_hb + data->sys_en.e_tor - + data->sys_en.e_con + data->sys_en.e_vdW - + data->sys_en.e_ele + data->my_en.e_pol; - - buffer += fmtline("total_energy:", epot); - buffer += fmtline("total_kinetic:", 0.0); - buffer += fmtline("total_potential:", epot); - buffer += fmtline("bond_energy:", data->sys_en.e_bond); - buffer += fmtline("atom_energy:", data->sys_en.e_ov + data->sys_en.e_un); - buffer += fmtline("lone_pair_energy:", data->sys_en.e_lp); - buffer += fmtline("valence_angle_energy:", data->sys_en.e_ang + data->sys_en.e_pen); - buffer += fmtline("3-body_conjugation:", data->sys_en.e_coa); - buffer += fmtline("hydrogen_bond_energy:", data->sys_en.e_hb); - buffer += fmtline("torsion_angle_energy:", data->sys_en.e_tor); - buffer += fmtline("4-body_conjugation:", data->sys_en.e_con); - buffer += fmtline("vdWaals_energy:", data->sys_en.e_vdW); - buffer += fmtline("electrostatics_energy:", data->sys_en.e_ele); - buffer += fmtline("polarization_energy:", data->sys_en.e_pol); - - /* dump out the buffer */ - fputs(buffer.c_str(),out_control->strj); - } -} - -void Write_Atoms(reax_system *system, output_controls *out_control, - MPI_Comm world) -{ - int i, me, np, line_len, buffer_len, buffer_req, cnt; - MPI_Status status; - reax_atom *p_atom; - - me = system->my_rank; - np = system->wsize; - line_len = out_control->atom_line_len; - - Write_Skip_Line(out_control, me, system->bigN*line_len, system->bigN); - - if (me == MASTER_NODE) - buffer_req = system->bigN * line_len + 1; - else buffer_req = system->n * line_len + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - /* fill in buffer */ - out_control->buffer[0] = 0; - - for (i = 0; i < system->n; ++i) { - std::string buffer(""); - p_atom = &(system->my_atoms[i]); - buffer += fmt::format("{:9}{:10.3f}{:10.3f}{:10.3f}",p_atom->orig_id, - p_atom->x[0], p_atom->x[1],p_atom->x[2]); - - switch (out_control->atom_info) { - case OPT_ATOM_BASIC: - buffer += fmt::format("{:10.3f}\n",p_atom->q); - break; - case OPT_ATOM_wF: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); - break; - case OPT_ATOM_wV: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->v[0], p_atom->v[1], p_atom->v[2], p_atom->q); - break; - case OPT_ATOM_FULL: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->v[0], p_atom->v[1], p_atom->v[2], - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); - break; - default: - system->error_ptr->one(FLERR,"Write_traj_atoms: unknown atom trajectory format"); + out_control->buffer[0] = 0; + for (i = 0; i < system->n; ++i) { + p_atom = &(system->my_atoms[i]); + auto buffer = fmt::format("{:9}{:3}{:9}{:10.3f}\n", + p_atom->orig_id, p_atom->type, p_atom->name, + system->reax_param.sbp[p_atom->type].mass); + strncpy(out_control->buffer + i*INIT_DESC_LEN, buffer.c_str(), INIT_DESC_LEN+1); } - strncpy(out_control->buffer + i*line_len, buffer.c_str(), line_len+1); + if (me != MASTER_NODE) { + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np * INIT_DESCS + me, world); + } else { + buffer_len = system->n * INIT_DESC_LEN; + for (i = 0; i < np; ++i) + if (i != MASTER_NODE) { + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*INIT_DESCS+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); + buffer_len += cnt; + } + out_control->buffer[buffer_len] = 0; + fputs(out_control->buffer,out_control->strj); + } } - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ATOM_LINES+me, world); - } else { - buffer_len = system->n * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ATOM_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer, out_control->strj); - } -} - -void Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, + void Init_Traj(reax_system *system, control_params *control, output_controls *out_control, MPI_Comm world) -{ - int i, j, pj, me, np; - int my_bonds, num_bonds; - int line_len, buffer_len, buffer_req, cnt; - MPI_Status status; - bond_data *bo_ij; + { + int atom_line_len[NR_OPT_ATOM] = { 0, 0, 0, 0, ATOM_BASIC_LEN, ATOM_wV_LEN, ATOM_wF_LEN, ATOM_FULL_LEN}; + int bond_line_len[NR_OPT_BOND] = { 0, BOND_BASIC_LEN, BOND_FULL_LEN }; + int angle_line_len[NR_OPT_ANGLE] = { 0, ANGLE_BASIC_LEN }; - me = system->my_rank; - np = system->wsize; - line_len = out_control->bond_line_len; + /* generate trajectory name */ + auto fname = std::string(control->sim_name) + ".trj"; - /* count the number of bonds I will write */ - my_bonds = 0; - for (i=0; i < system->n; ++i) - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - j = bonds->select.bond_list[pj].nbr; - if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && - bonds->select.bond_list[pj].bo_data.BO >= control->bg_cut) - ++my_bonds; - } + /* how should I write atoms? */ + out_control->atom_line_len = atom_line_len[out_control->atom_info]; + out_control->write_atoms = (out_control->atom_line_len ? 1 : 0); + /* bonds? */ + out_control->bond_line_len = bond_line_len[out_control->bond_info]; + out_control->write_bonds = (out_control->bond_line_len ? 1 : 0); + /* angles? */ + out_control->angle_line_len = angle_line_len[out_control->angle_info]; + out_control->write_angles = (out_control->angle_line_len ? 1 : 0); - /* allreduce - total number of bonds */ - MPI_Allreduce(&my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world); + /* allocate line & buffer space */ + out_control->buffer_len = 0; + out_control->buffer = nullptr; - Write_Skip_Line(out_control, me, num_bonds*line_len, num_bonds); + /* write trajectory header and atom info, if applicable */ + if (system->my_rank == MASTER_NODE) + out_control->strj = fopen(fname.c_str(), "w"); - if (me == MASTER_NODE) - buffer_req = num_bonds * line_len + 1; - else buffer_req = my_bonds * line_len + 1; + Write_Header(system, control, out_control); + Write_Init_Desc(system, out_control, world); + } - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); + static void Write_Frame_Header(reax_system *system, simulation_data *data, output_controls *out_control) + { + const int me = system->my_rank; + /* frame header lengths */ + constexpr int num_frm_hdr_lines = 22; - /* fill in the buffer */ - out_control->buffer[0] = 0; + /* only the master node writes into trajectory header */ + if (me == MASTER_NODE) { + std::string buffer(""); - my_bonds = 0; - for (i=0; i < system->n; ++i) { - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - bo_ij = &(bonds->select.bond_list[pj]); - j = bo_ij->nbr; + /* skip info */ + buffer += fmtline("chars_to_skip_frame_header:", (num_frm_hdr_lines-1)*HEADER_LINE_LEN); - if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && - bo_ij->bo_data.BO >= control->bg_cut) { - auto buffer = fmt::format("{:9}{:9}{:10.3f}{:10.3f}", system->my_atoms[i].orig_id, - system->my_atoms[j].orig_id,bo_ij->d,bo_ij->bo_data.BO); + /* step & time */ + buffer += fmtline("step:", data->step); + buffer += fmtline("time_in_ps:", 0.0); - switch (out_control->bond_info) { - case OPT_BOND_BASIC: - buffer += "\n"; - break; - case OPT_BOND_FULL: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}\n", bo_ij->bo_data.BO_s, - bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2); - break; - default: - system->error_ptr->one(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); - } - strncpy(out_control->buffer + my_bonds*line_len, buffer.c_str(), line_len+1); - ++my_bonds; - } + /* box info */ + buffer += fmtline("volume:", 0.0); + buffer += fmtline("box_dimensions:", 0.0, 0.0, 0.0); + buffer += fmtline("coordinate_angles:", 90.0, 90.0, 90.0); + + /* system T and P */ + buffer += fmtline("temperature:", 0.0); + buffer += fmtline("pressure:", 0.0); + + /* energies */ + double epot = data->sys_en.e_bond + data->sys_en.e_ov + data->sys_en.e_un + + data->sys_en.e_lp + data->sys_en.e_ang + data->sys_en.e_pen + + data->sys_en.e_coa + data->sys_en.e_hb + data->sys_en.e_tor + + data->sys_en.e_con + data->sys_en.e_vdW + + data->sys_en.e_ele + data->my_en.e_pol; + + buffer += fmtline("total_energy:", epot); + buffer += fmtline("total_kinetic:", 0.0); + buffer += fmtline("total_potential:", epot); + buffer += fmtline("bond_energy:", data->sys_en.e_bond); + buffer += fmtline("atom_energy:", data->sys_en.e_ov + data->sys_en.e_un); + buffer += fmtline("lone_pair_energy:", data->sys_en.e_lp); + buffer += fmtline("valence_angle_energy:", data->sys_en.e_ang + data->sys_en.e_pen); + buffer += fmtline("3-body_conjugation:", data->sys_en.e_coa); + buffer += fmtline("hydrogen_bond_energy:", data->sys_en.e_hb); + buffer += fmtline("torsion_angle_energy:", data->sys_en.e_tor); + buffer += fmtline("4-body_conjugation:", data->sys_en.e_con); + buffer += fmtline("vdWaals_energy:", data->sys_en.e_vdW); + buffer += fmtline("electrostatics_energy:", data->sys_en.e_ele); + buffer += fmtline("polarization_energy:", data->sys_en.e_pol); + + /* dump out the buffer */ + fputs(buffer.c_str(),out_control->strj); } } - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, np*BOND_LINES+me, world); - } else { - buffer_len = my_bonds * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*BOND_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; + static void Write_Atoms(reax_system *system, output_controls *out_control, + MPI_Comm world) + { + int i, me, np, line_len, buffer_len, buffer_req, cnt; + MPI_Status status; + reax_atom *p_atom; + + me = system->my_rank; + np = system->wsize; + line_len = out_control->atom_line_len; + + Write_Skip_Line(out_control, me, system->bigN*line_len, system->bigN); + + if (me == MASTER_NODE) + buffer_req = system->bigN * line_len + 1; + else buffer_req = system->n * line_len + 1; + + if (buffer_req > out_control->buffer_len * DANGER_ZONE) + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); + + /* fill in buffer */ + out_control->buffer[0] = 0; + + for (i = 0; i < system->n; ++i) { + std::string buffer(""); + p_atom = &(system->my_atoms[i]); + buffer += fmt::format("{:9}{:10.3f}{:10.3f}{:10.3f}",p_atom->orig_id, + p_atom->x[0], p_atom->x[1],p_atom->x[2]); + + switch (out_control->atom_info) { + case OPT_ATOM_BASIC: + buffer += fmt::format("{:10.3f}\n",p_atom->q); + break; + case OPT_ATOM_wF: + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); + break; + case OPT_ATOM_wV: + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->v[0], p_atom->v[1], p_atom->v[2], p_atom->q); + break; + case OPT_ATOM_FULL: + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", + p_atom->v[0], p_atom->v[1], p_atom->v[2], + p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); + break; + default: + system->error_ptr->one(FLERR,"Write_traj_atoms: unknown atom trajectory format"); } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); - } -} -void Write_Angles(reax_system *system, control_params *control, - reax_list *bonds, reax_list *thb_intrs, - output_controls *out_control, MPI_Comm world) -{ - int i, j, k, pi, pk, me, np; - int my_angles, num_angles; - int line_len, buffer_len, buffer_req, cnt; - bond_data *bo_ij, *bo_jk; - three_body_interaction_data *angle_ijk; - MPI_Status status; - - me = system->my_rank; - np = system->wsize; - line_len = out_control->angle_line_len; - - /* count the number of valence angles I will output */ - my_angles = 0; - for (j = 0; j < system->n; ++j) - for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { - bo_ij = &(bonds->select.bond_list[pi]); - i = bo_ij->nbr; - - if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index(pi, thb_intrs); - pk < End_Index(pi, thb_intrs); ++pk) { - angle_ijk = &(thb_intrs->select.three_body_list[pk]); - k = angle_ijk->thb; - bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); - - if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && - bo_jk->bo_data.BO >= control->bg_cut) // physical j&k bond - ++my_angles; - } + strncpy(out_control->buffer + i*line_len, buffer.c_str(), line_len+1); } - /* total number of valences */ - MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, world); - Write_Skip_Line(out_control, me, num_angles*line_len, num_angles); + if (me != MASTER_NODE) { + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np*ATOM_LINES+me, world); + } else { + buffer_len = system->n * line_len; + for (i = 0; i < np; ++i) + if (i != MASTER_NODE) { + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*ATOM_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); + buffer_len += cnt; + } + out_control->buffer[buffer_len] = 0; + fputs(out_control->buffer, out_control->strj); + } + } - if (me == MASTER_NODE) - buffer_req = num_angles * line_len + 1; - else buffer_req = my_angles * line_len + 1; + static void Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, + output_controls *out_control, MPI_Comm world) + { + int i, j, pj, me, np; + int my_bonds, num_bonds; + int line_len, buffer_len, buffer_req, cnt; + MPI_Status status; + bond_data *bo_ij; - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); + me = system->my_rank; + np = system->wsize; + line_len = out_control->bond_line_len; - /* fill in the buffer */ - my_angles = 0; - out_control->buffer[0] = 0; - for (j = 0; j < system->n; ++j) - for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { - bo_ij = &(bonds->select.bond_list[pi]); - i = bo_ij->nbr; + /* count the number of bonds I will write */ + my_bonds = 0; + for (i=0; i < system->n; ++i) + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + j = bonds->select.bond_list[pj].nbr; + if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && + bonds->select.bond_list[pj].bo_data.BO >= control->bg_cut) + ++my_bonds; + } - if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index(pi, thb_intrs); - pk < End_Index(pi, thb_intrs); ++pk) { - angle_ijk = &(thb_intrs->select.three_body_list[pk]); - k = angle_ijk->thb; - bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); + /* allreduce - total number of bonds */ + MPI_Allreduce(&my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world); - if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && - bo_jk->bo_data.BO >= control->bg_cut) { // physical j&k bond - auto buffer = fmt::format("{:9}{:9}{:9}{:10.3f}\n", - system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, - system->my_atoms[k].orig_id, RAD2DEG(angle_ijk->theta)); + Write_Skip_Line(out_control, me, num_bonds*line_len, num_bonds); - strncpy(out_control->buffer + my_angles*line_len, buffer.c_str(), line_len+1); - ++my_angles; + if (me == MASTER_NODE) + buffer_req = num_bonds * line_len + 1; + else buffer_req = my_bonds * line_len + 1; + + if (buffer_req > out_control->buffer_len * DANGER_ZONE) + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); + + /* fill in the buffer */ + out_control->buffer[0] = 0; + + my_bonds = 0; + for (i=0; i < system->n; ++i) { + for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { + bo_ij = &(bonds->select.bond_list[pj]); + j = bo_ij->nbr; + + if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && + bo_ij->bo_data.BO >= control->bg_cut) { + auto buffer = fmt::format("{:9}{:9}{:10.3f}{:10.3f}", system->my_atoms[i].orig_id, + system->my_atoms[j].orig_id,bo_ij->d,bo_ij->bo_data.BO); + + switch (out_control->bond_info) { + case OPT_BOND_BASIC: + buffer += "\n"; + break; + case OPT_BOND_FULL: + buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}\n", bo_ij->bo_data.BO_s, + bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2); + break; + default: + system->error_ptr->one(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); } + strncpy(out_control->buffer + my_bonds*line_len, buffer.c_str(), line_len+1); + ++my_bonds; } + } } - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ANGLE_LINES+me, world); - } else { - buffer_len = my_angles * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ANGLE_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; + if (me != MASTER_NODE) { + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, np*BOND_LINES+me, world); + } else { + buffer_len = my_bonds * line_len; + for (i = 0; i < np; ++i) + if (i != MASTER_NODE) { + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*BOND_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); + buffer_len += cnt; + } + out_control->buffer[buffer_len] = 0; + fputs(out_control->buffer,out_control->strj); + } + } + + static void Write_Angles(reax_system *system, control_params *control, + reax_list *bonds, reax_list *thb_intrs, + output_controls *out_control, MPI_Comm world) + { + int i, j, k, pi, pk, me, np; + int my_angles, num_angles; + int line_len, buffer_len, buffer_req, cnt; + bond_data *bo_ij, *bo_jk; + three_body_interaction_data *angle_ijk; + MPI_Status status; + + me = system->my_rank; + np = system->wsize; + line_len = out_control->angle_line_len; + + /* count the number of valence angles I will output */ + my_angles = 0; + for (j = 0; j < system->n; ++j) + for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { + bo_ij = &(bonds->select.bond_list[pi]); + i = bo_ij->nbr; + + if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond + for (pk = Start_Index(pi, thb_intrs); + pk < End_Index(pi, thb_intrs); ++pk) { + angle_ijk = &(thb_intrs->select.three_body_list[pk]); + k = angle_ijk->thb; + bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); + + if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && + bo_jk->bo_data.BO >= control->bg_cut) // physical j&k bond + ++my_angles; + } } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); + /* total number of valences */ + MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, world); + + Write_Skip_Line(out_control, me, num_angles*line_len, num_angles); + + if (me == MASTER_NODE) + buffer_req = num_angles * line_len + 1; + else buffer_req = my_angles * line_len + 1; + + if (buffer_req > out_control->buffer_len * DANGER_ZONE) + Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); + + /* fill in the buffer */ + my_angles = 0; + out_control->buffer[0] = 0; + for (j = 0; j < system->n; ++j) + for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { + bo_ij = &(bonds->select.bond_list[pi]); + i = bo_ij->nbr; + + if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond + for (pk = Start_Index(pi, thb_intrs); + pk < End_Index(pi, thb_intrs); ++pk) { + angle_ijk = &(thb_intrs->select.three_body_list[pk]); + k = angle_ijk->thb; + bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); + + if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && + bo_jk->bo_data.BO >= control->bg_cut) { // physical j&k bond + auto buffer = fmt::format("{:9}{:9}{:9}{:10.3f}\n", + system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, + system->my_atoms[k].orig_id, RAD2DEG(angle_ijk->theta)); + + strncpy(out_control->buffer + my_angles*line_len, buffer.c_str(), line_len+1); + ++my_angles; + } + } + } + + if (me != MASTER_NODE) { + MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, + np*ANGLE_LINES+me, world); + } else { + buffer_len = my_angles * line_len; + for (i = 0; i < np; ++i) + if (i != MASTER_NODE) { + MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, + MPI_CHAR, i, np*ANGLE_LINES+i, world, &status); + MPI_Get_count(&status, MPI_CHAR, &cnt); + buffer_len += cnt; + } + out_control->buffer[buffer_len] = 0; + fputs(out_control->buffer,out_control->strj); + } + } + + void Append_Frame(reax_system *system, control_params *control, + simulation_data *data, reax_list **lists, + output_controls *out_control, MPI_Comm world) + { + Write_Frame_Header(system, data, out_control); + + if (out_control->write_atoms) + Write_Atoms(system, out_control, world); + + if (out_control->write_bonds) + Write_Bonds(system, control, (*lists + BONDS), out_control, world); + + if (out_control->write_angles) + Write_Angles(system, control, (*lists + BONDS), (*lists + THREE_BODIES), + out_control, world); + } + + void End_Traj(int my_rank, output_controls *out_control) + { + if (my_rank == MASTER_NODE) + fclose(out_control->strj); + + free(out_control->buffer); } } - -void Append_Frame(reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, MPI_Comm world) -{ - Write_Frame_Header(system, data, out_control); - - if (out_control->write_atoms) - Write_Atoms(system, out_control, world); - - if (out_control->write_bonds) - Write_Bonds(system, control, (*lists + BONDS), out_control, world); - - if (out_control->write_angles) - Write_Angles(system, control, (*lists + BONDS), (*lists + THREE_BODIES), - out_control, world); -} - -void End_Traj(int my_rank, output_controls *out_control) -{ - if (my_rank == MASTER_NODE) - fclose(out_control->strj); - - free(out_control->buffer); -} diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h deleted file mode 100644 index 93fa4a6771..0000000000 --- a/src/USER-REAXC/reaxc_traj.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef LMP_REAXC_TRAJ_H -#define LMP_REAXC_TRAJ_H - -#include "reaxc_types.h" -#include - -void Init_Traj(reax_system *, control_params *, output_controls *, MPI_Comm); -void End_Traj(int, output_controls *); - -void Append_Frame(reax_system *, control_params *, simulation_data *, - reax_list **, output_controls *, MPI_Comm); -#endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h deleted file mode 100644 index 66516d52a0..0000000000 --- a/src/USER-REAXC/reaxc_types.h +++ /dev/null @@ -1,513 +0,0 @@ -/*- -*- c++ -*- -------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef LMP_REAXC_TYPES_H -#define LMP_REAXC_TYPES_H - -#include "lmptype.h" -#include -#include -#include "accelerator_kokkos.h" - -// forward declarations -namespace LAMMPS_NS { - class Error; - class LAMMPS; - class Pair; -} - -/************* SOME DEFS - crucial for reax_types.h *********/ - -#define REAX_MAX_STR 1024 -#define REAX_MAX_3BODY_PARAM 5 -#define REAX_MAX_4BODY_PARAM 5 -#define REAX_MAX_ATOM_TYPES 25 - -/********************** TYPE DEFINITIONS ********************/ -typedef int ivec[3]; -typedef double rvec[3]; -typedef double rvec2[2]; - -// import LAMMPS' definition of tagint and bigint -typedef LAMMPS_NS::tagint rc_tagint; -typedef LAMMPS_NS::bigint rc_bigint; - -struct global_parameters -{ - int n_global; - double* l; - int vdw_type; -}; - -struct single_body_parameters -{ - char name[4]; // two character atom name - double r_s; - double valency; // Valency of the atom - double mass; // Mass of atom - double r_vdw; - double epsilon; - double gamma; - double r_pi; - double valency_e; - double nlp_opt; - - /* Line two in field file */ - double alpha; - double gamma_w; - double valency_boc; - double p_ovun5; - double chi; - double eta; - int p_hbond; // 1 for H, 2 for hbonding atoms (O,S,P,N), 0 for others - - /* Line three in field file */ - double r_pi_pi; - double p_lp2; - double b_o_131; - double b_o_132; - double b_o_133; - - /* Line four in the field file */ - double p_ovun2; - double p_val3; - double valency_val; - double p_val5; - double rcore2; - double ecore2; - double acore2; - - /* Line five in the ffield file, only for lgvdw yes */ - double lgcij; - double lgre; - -}; - -/* Two Body Parameters */ -struct two_body_parameters { - /* Bond Order parameters */ - double p_bo1,p_bo2,p_bo3,p_bo4,p_bo5,p_bo6; - double r_s, r_p, r_pp; // r_o distances in BO formula - double p_boc3, p_boc4, p_boc5; - - /* Bond Energy parameters */ - double p_be1, p_be2; - double De_s, De_p, De_pp; - - /* Over/Under coordination parameters */ - double p_ovun1; - - /* Van der Waal interaction parameters */ - double D; - double alpha; - double r_vdW; - double gamma_w; - double rcore, ecore, acore; - double lgcij, lgre; - - /* electrostatic parameters */ - double gamma; // note: this parameter is gamma^-3 and not gamma. - - double v13cor, ovc; -}; - -/* 3-body parameters */ -struct three_body_parameters { - /* valence angle */ - double theta_00; - double p_val1, p_val2, p_val4, p_val7; - - /* penalty */ - double p_pen1; - - /* 3-body conjugation */ - double p_coa1; -}; - -struct three_body_header -{ - int cnt; - three_body_parameters prm[REAX_MAX_3BODY_PARAM]; -}; - -/* hydrogen-bond parameters */ -struct hbond_parameters -{ - double r0_hb, p_hb1, p_hb2, p_hb3; -}; - -/* 4-body parameters */ -struct four_body_parameters -{ - double V1, V2, V3; - - /* torsion angle */ - double p_tor1; - - /* 4-body conjugation */ - double p_cot1; -}; - -struct four_body_header -{ - int cnt; - four_body_parameters prm[REAX_MAX_4BODY_PARAM]; -}; - -struct reax_interaction -{ - int num_atom_types; - global_parameters gp; - single_body_parameters *sbp; - two_body_parameters **tbp; - three_body_header ***thbp; - hbond_parameters ***hbp; - four_body_header ****fbp; -}; - -struct reax_atom -{ - rc_tagint orig_id; - int type; - char name[8]; - - rvec x; // position - rvec v; // velocity - rvec f; // force - double q; // charge - - int Hindex; - int num_bonds; - int num_hbonds; -}; - -struct LR_lookup_table; // forward declaration -struct reax_system -{ - reax_interaction reax_param; - - rc_bigint bigN; - int n, N, numH; - int local_cap, total_cap, Hcap; - int wsize, my_rank, num_nbrs; - reax_atom *my_atoms; - - LAMMPS_NS::Error *error_ptr; - LAMMPS_NS::Pair *pair_ptr; - int my_bonds; - int mincap,minhbonds; - double safezone, saferzone; - - LR_lookup_table **LR; - - int omp_active; -}; - -/* system control parameters */ -struct control_params -{ - char sim_name[REAX_MAX_STR]; - int nthreads; - - double bond_cut; - double nonb_cut, nonb_low; - double hbond_cut; - - double bg_cut; - double bo_cut; - double thb_cut; - double thb_cutsq; - - int tabulate; - int virial; - - int lgflag; - int enobondsflag; - LAMMPS_NS::Error *error_ptr; - LAMMPS_NS::LAMMPS *lmp_ptr; - int me; -}; - -struct energy_data -{ - double e_bond; // Total bond energy - double e_ov; // Total over coordination - double e_un; // Total under coordination energy - double e_lp; // Total under coordination energy - double e_ang; // Total valance angle energy - double e_pen; // Total penalty energy - double e_coa; // Total three body conjgation energy - double e_hb; // Total Hydrogen bond energy - double e_tor; // Total torsional energy - double e_con; // Total four body conjugation energy - double e_vdW; // Total van der Waals energy - double e_ele; // Total electrostatics energy - double e_pol; // Polarization energy -}; - -struct simulation_data -{ - rc_bigint step; - - energy_data my_en; // per MPI rank energies - energy_data sys_en; // global energies -}; - -struct three_body_interaction_data -{ - int thb; - int pthb; // pointer to the third body on the central atom's nbrlist - double theta, cos_theta; - rvec dcos_di, dcos_dj, dcos_dk; -}; - -struct far_neighbor_data { - int nbr; - ivec rel_box; - double d; - rvec dvec; -}; - -namespace ReaxFF { - struct far_neighbor_data { - int nbr; - ivec rel_box; - double d; - rvec dvec; - }; -} - -struct hbond_data { - int nbr; - int scl; - far_neighbor_data *ptr; -}; - -struct dDelta_data { - int wrt; - rvec dVal; -}; - -struct dbond_data { - int wrt; - rvec dBO, dBOpi, dBOpi2; -}; - -struct bond_order_data { - double BO, BO_s, BO_pi, BO_pi2; - double Cdbo, Cdbopi, Cdbopi2; - double C1dbo, C2dbo, C3dbo; - double C1dbopi, C2dbopi, C3dbopi, C4dbopi; - double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; - rvec dBOp, dln_BOp_s, dln_BOp_pi, dln_BOp_pi2; - double *CdboReduction; -}; - -struct bond_data { - int nbr; - int sym_index; - int dbond_index; - ivec rel_box; - // rvec ext_factor; - double d; - rvec dvec; - bond_order_data bo_data; -}; - -struct sparse_matrix_entry { - int j; - double val; -}; - -struct sparse_matrix { - int cap, n, m; - int *start, *end; - sparse_matrix_entry *entries; -}; - -struct reallocate_data { - int num_far; - int H, Htop; - int hbonds, num_hbonds; - int bonds, num_bonds; - int num_3body; -}; - -struct storage -{ - int allocated; - - /* bond order related storage */ - double *total_bond_order; - double *Deltap, *Deltap_boc; - double *Delta, *Delta_lp, *Delta_lp_temp, *Delta_e, *Delta_boc, *Delta_val; - double *dDelta_lp, *dDelta_lp_temp; - double *nlp, *nlp_temp, *Clp, *vlpex; - rvec *dDeltap_self; - int *bond_mark; - - /* Taper */ - double Tap[8]; //Tap7, Tap6, Tap5, Tap4, Tap3, Tap2, Tap1, Tap0; - - /* force calculations */ - double *CdDelta; // coefficient of dDelta - rvec *f; - - /* omp */ - rvec *forceReduction; - double *CdDeltaReduction; - int *valence_angle_atom_myoffset; - - reallocate_data realloc; -}; - -union list_type -{ - void *v; - three_body_interaction_data *three_body_list; - bond_data *bond_list; - dbond_data *dbo_list; - dDelta_data *dDelta_list; - far_neighbor_data *far_nbr_list; - hbond_data *hbond_list; -}; - -struct reax_list -{ - int allocated; - - int n; - int num_intrs; - - int *index; - int *end_index; - - int type; - list_type select; - class LAMMPS_NS::Error *error_ptr; -}; - -struct output_controls -{ - FILE *strj; - int atom_line_len; - int bond_line_len; - int angle_line_len; - int write_atoms; - int write_bonds; - int write_angles; - int buffer_len; - char *buffer; - - int write_steps; - char traj_title[81]; - int atom_info; - int bond_info; - int angle_info; - - int energy_update_freq; -}; - -struct LR_data -{ - double H; - double e_vdW, CEvd; - double e_ele, CEclmb; - - LAMMPS_INLINE - LR_data() {} - - LAMMPS_INLINE - void operator = (const LR_data& rhs) { - H = rhs.H; - e_vdW = rhs.e_vdW; - CEvd = rhs.CEvd; - e_ele = rhs.e_ele; - CEclmb = rhs.CEclmb; - } - LAMMPS_INLINE - void operator = (const LR_data& rhs) volatile { - H = rhs.H; - e_vdW = rhs.e_vdW; - CEvd = rhs.CEvd; - e_ele = rhs.e_ele; - CEclmb = rhs.CEclmb; - } -}; - -struct cubic_spline_coef -{ - double a, b, c, d; - - LAMMPS_INLINE - cubic_spline_coef() {} - - LAMMPS_INLINE - cubic_spline_coef(const cubic_spline_coef &_c) { - a = _c.a; - b = _c.b; - c = _c.c; - d = _c.d; - } - - LAMMPS_INLINE - void operator=(const cubic_spline_coef &rhs) { - a = rhs.a; - b = rhs.b; - c = rhs.c; - d = rhs.d; - } - - LAMMPS_INLINE - void operator=(const cubic_spline_coef &rhs) volatile { - a = rhs.a; - b = rhs.b; - c = rhs.c; - d = rhs.d; - } -}; - -struct LR_lookup_table -{ - double xmin, xmax; - int n; - double dx, inv_dx; - double a; - double m; - double c; - - LR_data *y; - cubic_spline_coef *H; - cubic_spline_coef *vdW, *CEvd; - cubic_spline_coef *ele, *CEclmb; -}; - -/* function pointer defs */ - -typedef void (*interaction_function) (reax_system *, control_params *, - simulation_data *, storage *, - reax_list **, output_controls *); -#endif diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index b363fd8e04..9c1bf15c4b 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -24,328 +24,317 @@ . ----------------------------------------------------------------------*/ -#include "reaxc_valence_angles.h" -#include -#include "pair.h" -#include "reaxc_defs.h" -#include "reaxc_list.h" -#include "reaxc_vector.h" +#include "reaxff_api.h" +#include + +#include "pair.h" #include "error.h" -static double Dot( double* v1, double* v2, int k ) -{ - double ret = 0.0; +namespace ReaxFF { + void Calculate_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, + double *theta, double *cos_theta ) + { + (*cos_theta) = rvec_Dot(dvec_ji,dvec_jk) / ( d_ji * d_jk ); + if (*cos_theta > 1.) *cos_theta = 1.0; + if (*cos_theta < -1.) *cos_theta = -1.0; - for (int i=0; i < k; ++i) - ret += v1[i] * v2[i]; - - return ret; -} - -void Calculate_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, - double *theta, double *cos_theta ) -{ - (*cos_theta) = Dot( dvec_ji, dvec_jk, 3 ) / ( d_ji * d_jk ); - if (*cos_theta > 1.) *cos_theta = 1.0; - if (*cos_theta < -1.) *cos_theta = -1.0; - - (*theta) = acos( *cos_theta ); -} - -void Calculate_dCos_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, - rvec* dcos_theta_di, - rvec* dcos_theta_dj, - rvec* dcos_theta_dk ) -{ - int t; - double sqr_d_ji = SQR(d_ji); - double sqr_d_jk = SQR(d_jk); - double inv_dists = 1.0 / (d_ji * d_jk); - double inv_dists3 = pow( inv_dists, 3.0 ); - double dot_dvecs = Dot( dvec_ji, dvec_jk, 3 ); - double Cdot_inv3 = dot_dvecs * inv_dists3; - - for (t = 0; t < 3; ++t) { - (*dcos_theta_di)[t] = dvec_jk[t] * inv_dists - - Cdot_inv3 * sqr_d_jk * dvec_ji[t]; - (*dcos_theta_dj)[t] = -(dvec_jk[t] + dvec_ji[t]) * inv_dists + - Cdot_inv3 * ( sqr_d_jk * dvec_ji[t] + sqr_d_ji * dvec_jk[t] ); - (*dcos_theta_dk)[t] = dvec_ji[t] * inv_dists - - Cdot_inv3 * sqr_d_ji * dvec_jk[t]; + (*theta) = acos( *cos_theta ); } -} + void Calculate_dCos_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, + rvec* dcos_theta_di, + rvec* dcos_theta_dj, + rvec* dcos_theta_dk ) + { + int t; + double sqr_d_ji = SQR(d_ji); + double sqr_d_jk = SQR(d_jk); + double inv_dists = 1.0 / (d_ji * d_jk); + double inv_dists3 = CUBE(inv_dists); + double dot_dvecs = rvec_Dot(dvec_ji,dvec_jk); + double Cdot_inv3 = dot_dvecs * inv_dists3; -void Valence_Angles( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/ ) -{ - int i, j, pi, k, pk, t; - int type_i, type_j, type_k; - int start_j, end_j, start_pk, end_pk; - int cnt, num_thb_intrs; - - double temp, temp_bo_jt, pBOjt7; - double p_val1, p_val2, p_val3, p_val4, p_val5; - double p_val6, p_val7, p_val8, p_val9, p_val10; - double p_pen1, p_pen2, p_pen3, p_pen4; - double p_coa1, p_coa2, p_coa3, p_coa4; - double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; - double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; - double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; - double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; - double CEpen1, CEpen2, CEpen3; - double e_ang, e_coa, e_pen; - double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; - double Cf7ij, Cf7jk, Cf8j, Cf9j; - double f7_ij, f7_jk, f8_Dj, f9_Dj; - double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; - double BOA_ij, BOA_jk; - rvec force; - - // Tallying variables - double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; - double delij[3], delkj[3]; - - three_body_header *thbh; - three_body_parameters *thbp; - three_body_interaction_data *p_ijk, *p_kji; - bond_data *pbond_ij, *pbond_jk, *pbond_jt; - bond_order_data *bo_ij, *bo_jk, *bo_jt; - reax_list *bonds = (*lists) + BONDS; - reax_list *thb_intrs = (*lists) + THREE_BODIES; - - /* global parameters used in these calculations */ - p_val6 = system->reax_param.gp.l[14]; - p_val8 = system->reax_param.gp.l[33]; - p_val9 = system->reax_param.gp.l[16]; - p_val10 = system->reax_param.gp.l[17]; - num_thb_intrs = 0; - - - for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N - type_j = system->my_atoms[j].type; - if (type_j < 0) continue; - start_j = Start_Index(j, bonds); - end_j = End_Index(j, bonds); - - p_val3 = system->reax_param.sbp[ type_j ].p_val3; - p_val5 = system->reax_param.sbp[ type_j ].p_val5; - - SBOp = 0, prod_SBO = 1; - for (t = start_j; t < end_j; ++t) { - bo_jt = &(bonds->select.bond_list[t].bo_data); - SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); - temp = SQR( bo_jt->BO ); - temp *= temp; - temp *= temp; - prod_SBO *= exp( -temp ); + for (t = 0; t < 3; ++t) { + (*dcos_theta_di)[t] = dvec_jk[t] * inv_dists - + Cdot_inv3 * sqr_d_jk * dvec_ji[t]; + (*dcos_theta_dj)[t] = -(dvec_jk[t] + dvec_ji[t]) * inv_dists + + Cdot_inv3 * ( sqr_d_jk * dvec_ji[t] + sqr_d_ji * dvec_jk[t] ); + (*dcos_theta_dk)[t] = dvec_ji[t] * inv_dists - + Cdot_inv3 * sqr_d_ji * dvec_jk[t]; } + } - if (workspace->vlpex[j] >= 0) { - vlpadj = 0; - dSBO2 = prod_SBO - 1; - } else { - vlpadj = workspace->nlp[j]; - dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); - } - SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); - dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + void Valence_Angles( reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) + { + int i, j, pi, k, pk, t; + int type_i, type_j, type_k; + int start_j, end_j, start_pk, end_pk; + int cnt, num_thb_intrs; - if (SBO <= 0) - SBO2 = 0, CSBO2 = 0; - else if (SBO > 0 && SBO <= 1) { + double temp, temp_bo_jt, pBOjt7; + double p_val1, p_val2, p_val3, p_val4, p_val5; + double p_val6, p_val7, p_val8, p_val9, p_val10; + double p_pen1, p_pen2, p_pen3, p_pen4; + double p_coa1, p_coa2, p_coa3, p_coa4; + double trm8, expval6, expval7, expval2theta, expval12theta, exp3ij, exp3jk; + double exp_pen2ij, exp_pen2jk, exp_pen3, exp_pen4, trm_pen34, exp_coa2; + double dSBO1, dSBO2, SBO, SBO2, CSBO2, SBOp, prod_SBO, vlpadj; + double CEval1, CEval2, CEval3, CEval4, CEval5, CEval6, CEval7, CEval8; + double CEpen1, CEpen2, CEpen3; + double e_ang, e_coa, e_pen; + double CEcoa1, CEcoa2, CEcoa3, CEcoa4, CEcoa5; + double Cf7ij, Cf7jk, Cf8j, Cf9j; + double f7_ij, f7_jk, f8_Dj, f9_Dj; + double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; + double BOA_ij, BOA_jk; + rvec force; + + // Tallying variables + double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; + double delij[3], delkj[3]; + + three_body_header *thbh; + three_body_parameters *thbp; + three_body_interaction_data *p_ijk, *p_kji; + bond_data *pbond_ij, *pbond_jk, *pbond_jt; + bond_order_data *bo_ij, *bo_jk, *bo_jt; + reax_list *bonds = (*lists) + BONDS; + reax_list *thb_intrs = (*lists) + THREE_BODIES; + + /* global parameters used in these calculations */ + p_val6 = system->reax_param.gp.l[14]; + p_val8 = system->reax_param.gp.l[33]; + p_val9 = system->reax_param.gp.l[16]; + p_val10 = system->reax_param.gp.l[17]; + num_thb_intrs = 0; + + + for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N + type_j = system->my_atoms[j].type; + if (type_j < 0) continue; + start_j = Start_Index(j, bonds); + end_j = End_Index(j, bonds); + + p_val3 = system->reax_param.sbp[ type_j ].p_val3; + p_val5 = system->reax_param.sbp[ type_j ].p_val5; + + SBOp = 0, prod_SBO = 1; + for (t = start_j; t < end_j; ++t) { + bo_jt = &(bonds->select.bond_list[t].bo_data); + SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); + temp = SQR( bo_jt->BO ); + temp *= temp; + temp *= temp; + prod_SBO *= exp( -temp ); + } + + if (workspace->vlpex[j] >= 0) { + vlpadj = 0; + dSBO2 = prod_SBO - 1; + } else { + vlpadj = workspace->nlp[j]; + dSBO2 = (prod_SBO - 1) * (1 - p_val8 * workspace->dDelta_lp[j]); + } + + SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); + dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + + if (SBO <= 0) + SBO2 = 0, CSBO2 = 0; + else if (SBO > 0 && SBO <= 1) { SBO2 = pow( SBO, p_val9 ); CSBO2 = p_val9 * pow( SBO, p_val9 - 1 ); - } - else if (SBO > 1 && SBO < 2) { - SBO2 = 2 - pow( 2-SBO, p_val9 ); - CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); - } - else - SBO2 = 2, CSBO2 = 0; + } + else if (SBO > 1 && SBO < 2) { + SBO2 = 2 - pow( 2-SBO, p_val9 ); + CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); + } + else + SBO2 = 2, CSBO2 = 0; - expval6 = exp( p_val6 * workspace->Delta_boc[j] ); + expval6 = exp( p_val6 * workspace->Delta_boc[j] ); - for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, num_thb_intrs, thb_intrs ); - pbond_ij = &(bonds->select.bond_list[pi]); - bo_ij = &(pbond_ij->bo_data); - BOA_ij = bo_ij->BO - control->thb_cut; + for (pi = start_j; pi < end_j; ++pi) { + Set_Start_Index( pi, num_thb_intrs, thb_intrs ); + pbond_ij = &(bonds->select.bond_list[pi]); + bo_ij = &(pbond_ij->bo_data); + BOA_ij = bo_ij->BO - control->thb_cut; - if ( BOA_ij/*bo_ij->BO*/ > 0.0 && - ( j < system->n || pbond_ij->nbr < system->n )) { - i = pbond_ij->nbr; - type_i = system->my_atoms[i].type; + if ( BOA_ij/*bo_ij->BO*/ > 0.0 && + ( j < system->n || pbond_ij->nbr < system->n )) { + i = pbond_ij->nbr; + type_i = system->my_atoms[i].type; - for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + for (pk = start_j; pk < pi; ++pk) { + start_pk = Start_Index( pk, thb_intrs ); + end_pk = End_Index( pk, thb_intrs ); - for (t = start_pk; t < end_pk; ++t) - if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[num_thb_intrs] ); - p_kji = &(thb_intrs->select.three_body_list[t]); + for (t = start_pk; t < end_pk; ++t) + if (thb_intrs->select.three_body_list[t].thb == i) { + p_ijk = &(thb_intrs->select.three_body_list[num_thb_intrs] ); + p_kji = &(thb_intrs->select.three_body_list[t]); - p_ijk->thb = bonds->select.bond_list[pk].nbr; - p_ijk->pthb = pk; - p_ijk->theta = p_kji->theta; - rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); - rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); - rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); + p_ijk->thb = bonds->select.bond_list[pk].nbr; + p_ijk->pthb = pk; + p_ijk->theta = p_kji->theta; + rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); + rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); + rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); - ++num_thb_intrs; - break; - } - } + ++num_thb_intrs; + break; + } + } - for (pk = pi+1; pk < end_j; ++pk) { - pbond_jk = &(bonds->select.bond_list[pk]); - bo_jk = &(pbond_jk->bo_data); - BOA_jk = bo_jk->BO - control->thb_cut; - k = pbond_jk->nbr; - type_k = system->my_atoms[k].type; - p_ijk = &( thb_intrs->select.three_body_list[num_thb_intrs] ); + for (pk = pi+1; pk < end_j; ++pk) { + pbond_jk = &(bonds->select.bond_list[pk]); + bo_jk = &(pbond_jk->bo_data); + BOA_jk = bo_jk->BO - control->thb_cut; + k = pbond_jk->nbr; + type_k = system->my_atoms[k].type; + p_ijk = &( thb_intrs->select.three_body_list[num_thb_intrs] ); - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &theta, &cos_theta ); + Calculate_Theta( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &theta, &cos_theta ); - Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, - pbond_jk->dvec, pbond_jk->d, - &(p_ijk->dcos_di), &(p_ijk->dcos_dj), - &(p_ijk->dcos_dk) ); - p_ijk->thb = k; - p_ijk->pthb = pk; - p_ijk->theta = theta; + Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, + pbond_jk->dvec, pbond_jk->d, + &(p_ijk->dcos_di), &(p_ijk->dcos_dj), + &(p_ijk->dcos_dk) ); + p_ijk->thb = k; + p_ijk->pthb = pk; + p_ijk->theta = theta; - sin_theta = sin( theta ); - if (sin_theta < 1.0e-5) - sin_theta = 1.0e-5; + sin_theta = sin( theta ); + if (sin_theta < 1.0e-5) + sin_theta = 1.0e-5; - ++num_thb_intrs; + ++num_thb_intrs; - if ((j < system->n) && (BOA_jk > 0.0) && - (bo_ij->BO > control->thb_cut) && - (bo_jk->BO > control->thb_cut) && - (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { - thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); + if ((j < system->n) && (BOA_jk > 0.0) && + (bo_ij->BO > control->thb_cut) && + (bo_jk->BO > control->thb_cut) && + (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { + thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); - for (cnt = 0; cnt < thbh->cnt; ++cnt) { - if (fabs(thbh->prm[cnt].p_val1) > 0.001) { - thbp = &( thbh->prm[cnt] ); + for (cnt = 0; cnt < thbh->cnt; ++cnt) { + if (fabs(thbh->prm[cnt].p_val1) > 0.001) { + thbp = &( thbh->prm[cnt] ); - /* ANGLE ENERGY */ - p_val1 = thbp->p_val1; - p_val2 = thbp->p_val2; - p_val4 = thbp->p_val4; - p_val7 = thbp->p_val7; - theta_00 = thbp->theta_00; + /* ANGLE ENERGY */ + p_val1 = thbp->p_val1; + p_val2 = thbp->p_val2; + p_val4 = thbp->p_val4; + p_val7 = thbp->p_val7; + theta_00 = thbp->theta_00; - exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); - f7_ij = 1.0 - exp3ij; - Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; + exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); + f7_ij = 1.0 - exp3ij; + Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; - exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); - f7_jk = 1.0 - exp3jk; - Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; + exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); + f7_jk = 1.0 - exp3jk; + Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; - expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); - trm8 = 1.0 + expval6 + expval7; - f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); - Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * - ( p_val6 * expval6 * trm8 - - (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); + expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); + trm8 = 1.0 + expval6 + expval7; + f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); + Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * + ( p_val6 * expval6 * trm8 - + (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); - theta_0 = 180.0 - theta_00 * (1.0 - - exp(-p_val10 * (2.0 - SBO2))); - theta_0 = DEG2RAD( theta_0 ); + theta_0 = 180.0 - theta_00 * (1.0 - + exp(-p_val10 * (2.0 - SBO2))); + theta_0 = DEG2RAD( theta_0 ); - expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); - if (p_val1 >= 0) - expval12theta = p_val1 * (1.0 - expval2theta); - else // To avoid linear Me-H-Me angles (6/6/06) - expval12theta = p_val1 * -expval2theta; + expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); + if (p_val1 >= 0) + expval12theta = p_val1 * (1.0 - expval2theta); + else // To avoid linear Me-H-Me angles (6/6/06) + expval12theta = p_val1 * -expval2theta; - CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; - CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; - CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; - CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * - expval2theta * (theta_0 - theta); + CEval1 = Cf7ij * f7_jk * f8_Dj * expval12theta; + CEval2 = Cf7jk * f7_ij * f8_Dj * expval12theta; + CEval3 = Cf8j * f7_ij * f7_jk * expval12theta; + CEval4 = -2.0 * p_val1 * p_val2 * f7_ij * f7_jk * f8_Dj * + expval2theta * (theta_0 - theta); - Ctheta_0 = p_val10 * DEG2RAD(theta_00) * - exp( -p_val10 * (2.0 - SBO2) ); + Ctheta_0 = p_val10 * DEG2RAD(theta_00) * + exp( -p_val10 * (2.0 - SBO2) ); - CEval5 = -CEval4 * Ctheta_0 * CSBO2; - CEval6 = CEval5 * dSBO1; - CEval7 = CEval5 * dSBO2; - CEval8 = -CEval4 / sin_theta; + CEval5 = -CEval4 * Ctheta_0 * CSBO2; + CEval6 = CEval5 * dSBO1; + CEval7 = CEval5 * dSBO2; + CEval8 = -CEval4 / sin_theta; - data->my_en.e_ang += e_ang = - f7_ij * f7_jk * f8_Dj * expval12theta; - /* END ANGLE ENERGY*/ + data->my_en.e_ang += e_ang = + f7_ij * f7_jk * f8_Dj * expval12theta; + /* END ANGLE ENERGY*/ - /* PENALTY ENERGY */ - p_pen1 = thbp->p_pen1; - p_pen2 = system->reax_param.gp.l[19]; - p_pen3 = system->reax_param.gp.l[20]; - p_pen4 = system->reax_param.gp.l[21]; + /* PENALTY ENERGY */ + p_pen1 = thbp->p_pen1; + p_pen2 = system->reax_param.gp.l[19]; + p_pen3 = system->reax_param.gp.l[20]; + p_pen4 = system->reax_param.gp.l[21]; - exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); - exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); - exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); - exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); - trm_pen34 = 1.0 + exp_pen3 + exp_pen4; - f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; - Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - - (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + - p_pen4 * exp_pen4 ) ) / - SQR( trm_pen34 ); + exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); + exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); + exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); + exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); + trm_pen34 = 1.0 + exp_pen3 + exp_pen4; + f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; + Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - + (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + + p_pen4 * exp_pen4 ) ) / + SQR( trm_pen34 ); - data->my_en.e_pen += e_pen = - p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; + data->my_en.e_pen += e_pen = + p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; - CEpen1 = e_pen * Cf9j / f9_Dj; - temp = -2.0 * p_pen2 * e_pen; - CEpen2 = temp * (BOA_ij - 2.0); - CEpen3 = temp * (BOA_jk - 2.0); - /* END PENALTY ENERGY */ + CEpen1 = e_pen * Cf9j / f9_Dj; + temp = -2.0 * p_pen2 * e_pen; + CEpen2 = temp * (BOA_ij - 2.0); + CEpen3 = temp * (BOA_jk - 2.0); + /* END PENALTY ENERGY */ - /* COALITION ENERGY */ - p_coa1 = thbp->p_coa1; - p_coa2 = system->reax_param.gp.l[2]; - p_coa3 = system->reax_param.gp.l[38]; - p_coa4 = system->reax_param.gp.l[30]; + /* COALITION ENERGY */ + p_coa1 = thbp->p_coa1; + p_coa2 = system->reax_param.gp.l[2]; + p_coa3 = system->reax_param.gp.l[38]; + p_coa4 = system->reax_param.gp.l[30]; - exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); - data->my_en.e_coa += e_coa = - p_coa1 / (1. + exp_coa2) * - exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * - exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * - exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * - exp( -p_coa4 * SQR(BOA_jk - 1.5) ); + exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); + data->my_en.e_coa += e_coa = + p_coa1 / (1. + exp_coa2) * + exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * + exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * + exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * + exp( -p_coa4 * SQR(BOA_jk - 1.5) ); - CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; - CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; - CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); - CEcoa4 = -2 * p_coa3 * - (workspace->total_bond_order[i]-BOA_ij) * e_coa; - CEcoa5 = -2 * p_coa3 * - (workspace->total_bond_order[k]-BOA_jk) * e_coa; - /* END COALITION ENERGY */ + CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; + CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; + CEcoa3 = -p_coa2 * exp_coa2 * e_coa / (1 + exp_coa2); + CEcoa4 = -2 * p_coa3 * + (workspace->total_bond_order[i]-BOA_ij) * e_coa; + CEcoa5 = -2 * p_coa3 * + (workspace->total_bond_order[k]-BOA_jk) * e_coa; + /* END COALITION ENERGY */ - /* FORCES */ - bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); - bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); - workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); - workspace->CdDelta[i] += CEcoa4; - workspace->CdDelta[k] += CEcoa5; + /* FORCES */ + bo_ij->Cdbo += (CEval1 + CEpen2 + (CEcoa1 - CEcoa4)); + bo_jk->Cdbo += (CEval2 + CEpen3 + (CEcoa2 - CEcoa5)); + workspace->CdDelta[j] += ((CEval3 + CEval7) + CEpen1 + CEcoa3); + workspace->CdDelta[i] += CEcoa4; + workspace->CdDelta[k] += CEcoa5; - for (t = start_j; t < end_j; ++t) { + for (t = start_j; t < end_j; ++t) { pbond_jt = &( bonds->select.bond_list[t] ); bo_jt = &(pbond_jt->bo_data); temp_bo_jt = bo_jt->BO; @@ -355,58 +344,59 @@ void Valence_Angles( reax_system *system, control_params *control, bo_jt->Cdbo += (CEval6 * pBOjt7); bo_jt->Cdbopi += CEval5; bo_jt->Cdbopi2 += CEval5; - } + } - if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], CEval8, p_ijk->dcos_di ); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->f[k], CEval8, p_ijk->dcos_dk ); - } else { - rvec_Scale( force, CEval8, p_ijk->dcos_di ); - rvec_Add( workspace->f[i], force ); + if (control->virial == 0) { + rvec_ScaledAdd( workspace->f[i], CEval8, p_ijk->dcos_di ); + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->f[k], CEval8, p_ijk->dcos_dk ); + } else { + rvec_Scale( force, CEval8, p_ijk->dcos_di ); + rvec_Add( workspace->f[i], force ); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_Scale( force, CEval8, p_ijk->dcos_dk ); - rvec_Add( workspace->f[k], force ); - } + rvec_Scale( force, CEval8, p_ijk->dcos_dk ); + rvec_Add( workspace->f[k], force ); + } - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + /* tally into per-atom virials */ + if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - /* Acquire vectors */ - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, - -1., system->my_atoms[j].x ); + /* Acquire vectors */ + rvec_ScaledSum( delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x ); + rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, + -1., system->my_atoms[j].x ); - rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); - rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); + rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); + rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); + rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); - eng_tmp = e_ang + e_pen + e_coa; + eng_tmp = e_ang + e_pen + e_coa; - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(j,j,system->N,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); - if (system->pair_ptr->vflag_atom) - system->pair_ptr->v_tally3(i,j,k,fi_tmp,fk_tmp,delij,delkj); + if (system->pair_ptr->evflag) + system->pair_ptr->ev_tally(j,j,system->N,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); + if (system->pair_ptr->vflag_atom) + system->pair_ptr->v_tally3(i,j,k,fi_tmp,fk_tmp,delij,delkj); + } } } } } } - } - Set_End_Index(pi, num_thb_intrs, thb_intrs ); + Set_End_Index(pi, num_thb_intrs, thb_intrs ); + } + } + + if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { + workspace->realloc.num_3body = num_thb_intrs; + if (num_thb_intrs > thb_intrs->num_intrs) + control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " + "angle_list: top={}, max={}", + data->step, num_thb_intrs, + thb_intrs->num_intrs)); } } - - if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { - workspace->realloc.num_3body = num_thb_intrs; - if (num_thb_intrs > thb_intrs->num_intrs) - control->error_ptr->one(FLERR, fmt::format("step {}: ran out of space on " - "angle_list: top={}, max={}", - data->step, num_thb_intrs, - thb_intrs->num_intrs)); - } } diff --git a/src/USER-REAXC/reaxc_valence_angles.h b/src/USER-REAXC/reaxc_valence_angles.h deleted file mode 100644 index 31936ba190..0000000000 --- a/src/USER-REAXC/reaxc_valence_angles.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __VALENCE_ANGLES_H_ -#define __VALENCE_ANGLES_H_ - -#include "reaxc_types.h" - -void Valence_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); - -void Calculate_Theta( rvec, double, rvec, double, double*, double* ); - -void Calculate_dCos_Theta( rvec, double, rvec, double, rvec*, rvec*, rvec* ); - -#endif diff --git a/src/USER-REAXC/reaxc_vector.cpp b/src/USER-REAXC/reaxc_vector.cpp deleted file mode 100644 index 2f06b57c02..0000000000 --- a/src/USER-REAXC/reaxc_vector.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#include "reaxc_vector.h" -#include -#include "reaxc_defs.h" - -void rvec_Copy( rvec dest, rvec src ) -{ - dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; -} - - -void rvec_Scale( rvec ret, double c, rvec v ) -{ - ret[0] = c * v[0], ret[1] = c * v[1], ret[2] = c * v[2]; -} - - -void rvec_Add( rvec ret, rvec v ) -{ - ret[0] += v[0], ret[1] += v[1], ret[2] += v[2]; -} - - -void rvec_ScaledAdd( rvec ret, double c, rvec v ) -{ - ret[0] += c * v[0], ret[1] += c * v[1], ret[2] += c * v[2]; -} - - -void rvec_ScaledSum( rvec ret, double c1, rvec v1 ,double c2, rvec v2 ) -{ - ret[0] = c1 * v1[0] + c2 * v2[0]; - ret[1] = c1 * v1[1] + c2 * v2[1]; - ret[2] = c1 * v1[2] + c2 * v2[2]; -} - - -double rvec_Dot( rvec v1, rvec v2 ) -{ - return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; -} - - -void rvec_iMultiply( rvec r, ivec v1, rvec v2 ) -{ - r[0] = v1[0] * v2[0]; - r[1] = v1[1] * v2[1]; - r[2] = v1[2] * v2[2]; -} - - -void rvec_Cross( rvec ret, rvec v1, rvec v2 ) -{ - ret[0] = v1[1] * v2[2] - v1[2] * v2[1]; - ret[1] = v1[2] * v2[0] - v1[0] * v2[2]; - ret[2] = v1[0] * v2[1] - v1[1] * v2[0]; -} - - -double rvec_Norm_Sqr( rvec v ) -{ - return SQR(v[0]) + SQR(v[1]) + SQR(v[2]); -} - - -double rvec_Norm( rvec v ) -{ - return sqrt( SQR(v[0]) + SQR(v[1]) + SQR(v[2]) ); -} - - -void rvec_MakeZero( rvec v ) -{ - v[0] = v[1] = v[2] = 0.000000000000000e+00; -} - - -void ivec_MakeZero( ivec v ) -{ - v[0] = v[1] = v[2] = 0; -} - - -void ivec_Copy( ivec dest, ivec src ) -{ - dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; -} - - -void ivec_Scale( ivec dest, double C, ivec src ) -{ - dest[0] = (int)(C * src[0]); - dest[1] = (int)(C * src[1]); - dest[2] = (int)(C * src[2]); -} - - -void ivec_Sum( ivec dest, ivec v1, ivec v2 ) -{ - dest[0] = v1[0] + v2[0]; - dest[1] = v1[1] + v2[1]; - dest[2] = v1[2] + v2[2]; -} - - diff --git a/src/USER-REAXC/reaxc_vector.h b/src/USER-REAXC/reaxc_vector.h deleted file mode 100644 index 3dc36f96ef..0000000000 --- a/src/USER-REAXC/reaxc_vector.h +++ /dev/null @@ -1,50 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#ifndef __VECTOR_H_ -#define __VECTOR_H_ - -#include "reaxc_types.h" - -void rvec_Copy( rvec, rvec ); -void rvec_Scale( rvec, double, rvec ); -void rvec_Add( rvec, rvec ); -void rvec_ScaledAdd( rvec, double, rvec ); -void rvec_ScaledSum( rvec, double, rvec, double, rvec ); -double rvec_Dot( rvec, rvec ); -void rvec_iMultiply( rvec, ivec, rvec ); -void rvec_Cross( rvec, rvec, rvec ); -double rvec_Norm_Sqr( rvec ); -double rvec_Norm( rvec ); -void rvec_MakeZero( rvec ); -void rvec_Random( rvec ); - -void ivec_MakeZero( ivec ); -void ivec_Copy( ivec, ivec ); -void ivec_Scale( ivec, double, ivec ); -void ivec_Sum( ivec, ivec, ivec ); - -#endif diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index 19f345636f..36579e83e4 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -39,14 +39,29 @@ namespace ReaxFF // exported Functions - // allocate + // allocate X + extern void Allocate_Workspace(control_params *, storage *, int); extern void DeAllocate_System(reax_system *); extern void DeAllocate_Workspace(control_params *, storage *); - extern int PreAllocate_Space(reax_system *, control_params *, storage *); + extern void PreAllocate_Space(reax_system *, storage *); extern void ReAllocate(reax_system *, control_params *, simulation_data *, storage *, reax_list **); + // bond orders + + extern void BO(reax_system *, control_params *, simulation_data *, + storage *, reax_list **, output_controls *); + extern int BOp(storage *, reax_list *, double, int, int, far_neighbor_data *, + single_body_parameters *, single_body_parameters *, + two_body_parameters *); + extern void Add_dBond_to_Forces(reax_system*, int, int, storage*, reax_list**); + extern void Add_dBond_to_Forces_NPT(int, int, storage*, reax_list**); + + // bonds + + extern void Bonds(reax_system *, simulation_data *, storage *, reax_list **); + // control extern void Read_Control_File(const char *, control_params *, output_controls *); @@ -59,20 +74,35 @@ namespace ReaxFF extern void Compute_Forces(reax_system *, control_params *, simulation_data *, storage *, reax_list **, output_controls *); + extern void Estimate_Storages(reax_system *, control_params *, reax_list **, + int *, int *, int *, int *); + // hydrogen bonds + + extern void Hydrogen_Bonds(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); // init md + extern void Init_System(reax_system *, control_params *); + extern void Init_Simulation_Data(simulation_data *); + extern void Init_Workspace(reax_system *, control_params *, storage *); extern void Initialize(reax_system *, control_params *, simulation_data *, storage *, reax_list **, output_controls *, MPI_Comm); // io tools + extern void Init_Output_Files(reax_system *, control_params *, + output_controls *, MPI_Comm); extern void Close_Output_Files(reax_system *, output_controls *); extern void Output_Results(reax_system *, control_params *, simulation_data *, reax_list **, output_controls *, MPI_Comm); + extern void Collect_System_Energy(reax_system *, simulation_data *, MPI_Comm); // lists + extern int Make_List(int, int, int, reax_list *); + extern void Delete_List(reax_list*); + inline int Start_Index(int i, reax_list *l) { return l->index[i]; } inline int End_Index(int i, reax_list *l) { return l->end_index[i]; } inline void Set_Start_Index(int i, int val, reax_list *l) { @@ -81,11 +111,14 @@ namespace ReaxFF inline void Set_End_Index(int i, int val, reax_list *l) { l->end_index[i] = val; } - extern void Delete_List(reax_list*); - extern int Make_List(int, int, int, reax_list *); + inline int Num_Entries(int i, reax_list *l) { + return l->end_index[i] - l->index[i]; + } // lookup + extern void Init_Lookup_Tables(reax_system *, control_params *, + storage *, MPI_Comm); extern void Deallocate_Lookup_Tables(reax_system *); extern void Natural_Cubic_Spline(LAMMPS_NS::Error*, const double *, const double *, cubic_spline_coef *, @@ -94,17 +127,60 @@ namespace ReaxFF const double *, double v0, double vlast, cubic_spline_coef *coef, unsigned int n); + // multi body + + extern void Atom_Energy(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + + // nonbonded + + extern void Compute_Polarization_Energy(reax_system *, simulation_data *); + extern void vdW_Coulomb_Energy(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); + extern void Tabulated_vdW_Coulomb_Energy(reax_system *, control_params *, + simulation_data *, storage *, + reax_list **); + extern void LR_vdW_Coulomb(reax_system *, storage *, control_params *, + int, int, double, LR_data *); + // reset tools extern void Reset(reax_system *, control_params *, simulation_data *, storage *, reax_list **); - + extern void Reset_Simulation_Data(simulation_data *); + extern void Reset_Workspace(reax_system *, storage *); + // toolbox extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const char *); extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const char *); extern void sfree(LAMMPS_NS::Error *, void *, const char *); + // torsion angles + + extern double Calculate_Omega(rvec, double, rvec, double, rvec, double, + rvec, double, three_body_interaction_data *, + three_body_interaction_data *, rvec, rvec, + rvec, rvec); + extern void Torsion_Angles(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + + // traj + + extern void Init_Traj(reax_system *, control_params *, + output_controls *, MPI_Comm); + extern void End_Traj(int, output_controls *); + extern void Append_Frame(reax_system *, control_params *, simulation_data *, + reax_list **, output_controls *, MPI_Comm); + + // valence angles + + extern void Calculate_Theta(rvec, double, rvec, double, double *, double *); + extern void Calculate_dCos_Theta(rvec, double, rvec, double, + rvec *, rvec *, rvec *); + extern void Valence_Angles(reax_system *, control_params *, simulation_data *, + storage *, reax_list **); + // vector inline void rvec_Add(rvec ret, rvec v) { @@ -146,6 +222,24 @@ namespace ReaxFF } inline void ivec_MakeZero(ivec v) { v[0] = v[1] = v[2] = 0; } + + inline void ivec_Copy(ivec dest, ivec src) { + dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; + } + + inline void ivec_Scale(ivec dest, double C, ivec src) + { + dest[0] = (int)(C * src[0]); + dest[1] = (int)(C * src[1]); + dest[2] = (int)(C * src[2]); + } + + inline void ivec_Sum(ivec dest, ivec v1, ivec v2) + { + dest[0] = v1[0] + v2[0]; + dest[1] = v1[1] + v2[1]; + dest[2] = v1[2] + v2[2]; + } } #endif diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index 3bd3ad899b..f8cc255fd9 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -59,7 +59,6 @@ #define MAX_TOKENS 1024 #define MAX_TOKEN_LEN 1024 -#define NUM_INTRS 10 #define ALMOST_ZERO 1e-10 #define NEG_INF -1e10 #define NO_BOND 1e-3 // 0.001 diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index 544e67fbf2..c04d886656 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -123,6 +123,13 @@ namespace ReaxFF double v13cor, ovc; }; + struct dbond_coefficients { + double C1dbo, C2dbo, C3dbo; + double C1dbopi, C2dbopi, C3dbopi, C4dbopi; + double C1dbopi2, C2dbopi2, C3dbopi2, C4dbopi2; + double C1dDelta, C2dDelta, C3dDelta; + }; + /* 3-body parameters */ struct three_body_parameters { /* valence angle */ @@ -424,12 +431,6 @@ namespace ReaxFF cubic_spline_coef *vdW, *CEvd; cubic_spline_coef *ele, *CEclmb; }; - -/* function pointer defs */ - - typedef void (*interaction_function) (reax_system *, control_params *, - simulation_data *, storage *, - reax_list **, output_controls *); } #endif From eb4d7efd32d22c684c1066ca54a9ee88eb48551c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 02:27:45 -0400 Subject: [PATCH 037/352] silence compiler warning --- src/SPIN/pair_spin_exchange_biquadratic.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/SPIN/pair_spin_exchange_biquadratic.cpp b/src/SPIN/pair_spin_exchange_biquadratic.cpp index a00d1cc8b0..3c5a95e3dd 100644 --- a/src/SPIN/pair_spin_exchange_biquadratic.cpp +++ b/src/SPIN/pair_spin_exchange_biquadratic.cpp @@ -473,16 +473,13 @@ double PairSpinExchangeBiquadratic::compute_energy(int i, int j, double rsq, { int *type = atom->type; int itype,jtype; - double Jex,Kex,ra,sdots; - double rj,rk,r2j,r2k; + double Jex,Kex,sdots; + double r2j,r2k; double energy = 0.0; itype = type[i]; jtype = type[j]; - ra = sqrt(rsq); - rj = ra/J3[itype][jtype]; r2j = rsq/J3[itype][jtype]/J3[itype][jtype]; - rk = ra/K3[itype][jtype]; r2k = rsq/K3[itype][jtype]/K3[itype][jtype]; Jex = 4.0*J1_mech[itype][jtype]*r2j; From dcdb5cc0e0657cca9f75cdee4067f57156c974f2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 02:28:32 -0400 Subject: [PATCH 038/352] whitespace fixes --- src/USER-OMP/reaxc_forces_omp.cpp | 29 ++++++++++------------- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 2 +- src/USER-OMP/reaxc_torsion_angles_omp.cpp | 2 +- src/USER-OMP/reaxff_omp.h | 8 +++---- src/USER-REAXC/reaxc_ffield.cpp | 2 +- src/USER-REAXC/reaxc_forces.cpp | 2 +- src/USER-REAXC/reaxc_io_tools.cpp | 2 +- src/USER-REAXC/reaxc_list.cpp | 2 +- src/USER-REAXC/reaxc_multi_body.cpp | 2 +- src/USER-REAXC/reaxc_reset_tools.cpp | 2 +- src/USER-REAXC/reaxc_tool_box.cpp | 2 +- src/USER-REAXC/reaxc_traj.cpp | 2 +- src/USER-REAXC/reaxc_valence_angles.cpp | 2 +- src/USER-REAXC/reaxff_api.h | 8 +++---- src/USER-REAXC/reaxff_defs.h | 2 +- src/USER-REAXC/reaxff_inline.h | 2 +- src/USER-REAXC/reaxff_types.h | 2 +- 17 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 566edf7d05..29b70c10a4 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -41,9 +41,9 @@ using namespace LAMMPS_NS; namespace ReaxFF { /* ---------------------------------------------------------------------- */ - void Compute_Bonded_ForcesOMP(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + static void Compute_Bonded_ForcesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists, output_controls *out_control) { BOOMP(system, control, data, workspace, lists, out_control); @@ -55,10 +55,9 @@ namespace ReaxFF { Hydrogen_BondsOMP(system, control, data, workspace, lists); } -// Only difference with MPI-only version is inclusion of OMP_TIMING statements - void Compute_NonBonded_ForcesOMP(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + static void Compute_NonBonded_ForcesOMP(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, + reax_list **lists) { /* van der Waals and Coulomb interactions */ @@ -73,8 +72,8 @@ namespace ReaxFF { /* this version of Compute_Total_Force computes forces from coefficients accumulated by all interaction functions. Saves enormous time & space! */ - void Compute_Total_ForceOMP(reax_system *system, control_params *control, - storage *workspace, reax_list **lists) + static void Compute_Total_ForceOMP(reax_system *system, control_params *control, + storage *workspace, reax_list **lists) { int natoms = system->N; int nthreads = control->nthreads; @@ -172,7 +171,7 @@ namespace ReaxFF { /* ---------------------------------------------------------------------- */ - void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list **lists, + static void Validate_ListsOMP(reax_system *system, reax_list **lists, int step, int n, int N, int numH) { int comp, Hindex; @@ -469,9 +468,8 @@ namespace ReaxFF { workspace->realloc.num_bonds = num_bonds; workspace->realloc.num_hbonds = num_hbonds; - Validate_ListsOMP(system, workspace, lists, data->step, - system->n, system->N, system->numH); - + Validate_ListsOMP(system, lists, data->step, + system->n, system->N, system->numH); } /* ---------------------------------------------------------------------- */ @@ -485,11 +483,10 @@ namespace ReaxFF { // Bonded Interactions Compute_Bonded_ForcesOMP(system, control, data, workspace, - lists, out_control); + lists, out_control); // Nonbonded Interactions - Compute_NonBonded_ForcesOMP(system, control, data, workspace, - lists, out_control); + Compute_NonBonded_ForcesOMP(system, control, data, workspace, lists); // Total Force Compute_Total_ForceOMP(system, control, workspace, lists); diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index b2bd04d82a..8c9ffe577e 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -38,7 +38,7 @@ using namespace LAMMPS_NS; namespace ReaxFF { - + /* ---------------------------------------------------------------------- */ void Hydrogen_BondsOMP( reax_system *system, control_params *control, diff --git a/src/USER-OMP/reaxc_torsion_angles_omp.cpp b/src/USER-OMP/reaxc_torsion_angles_omp.cpp index f8c8d4262c..6f01d269eb 100644 --- a/src/USER-OMP/reaxc_torsion_angles_omp.cpp +++ b/src/USER-OMP/reaxc_torsion_angles_omp.cpp @@ -39,7 +39,7 @@ using namespace LAMMPS_NS; namespace ReaxFF { - + /* ---------------------------------------------------------------------- */ void Torsion_AnglesOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, diff --git a/src/USER-OMP/reaxff_omp.h b/src/USER-OMP/reaxff_omp.h index 630fe07a43..952b1a292e 100644 --- a/src/USER-OMP/reaxff_omp.h +++ b/src/USER-OMP/reaxff_omp.h @@ -27,7 +27,7 @@ #include #endif -namespace ReaxFF +namespace ReaxFF { // exported Functions @@ -42,9 +42,9 @@ namespace ReaxFF extern void BOOMP(reax_system *, control_params *, simulation_data *, storage *, reax_list **, output_controls *); - + // bonds OpenMP - + extern void BondsOMP(reax_system *, simulation_data *, storage *, reax_list **); @@ -55,7 +55,7 @@ namespace ReaxFF reax_list **, output_controls *); // hydrogen bonds - + extern void Hydrogen_BondsOMP(reax_system *, control_params *, simulation_data *, storage *, reax_list **); diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 88381040c2..b60022dd03 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -41,7 +41,7 @@ using LAMMPS_NS::utils::getsyserror; namespace ReaxFF { extern int Tokenize(char* s, char*** tok); - + void Read_Force_Field(const char *filename, reax_interaction *reax, control_params *control) { diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index ebc042ebe5..a2e01db478 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -33,7 +33,7 @@ #include "error.h" namespace ReaxFF { - + static void Compute_Bonded_Forces(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control) diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index 6ca0b29b6e..d6fd4b3aa4 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -62,7 +62,7 @@ namespace ReaxFF { data->sys_en.e_ele = sys_en[11]; data->sys_en.e_pol = sys_en[12]; } - } + } void Init_Output_Files(reax_system *system, control_params *control, output_controls *out_control, MPI_Comm world) diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index 94d4a0a4b5..db57aa4f40 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -29,7 +29,7 @@ #include "error.h" namespace ReaxFF { - + /************* allocate list space ******************/ int Make_List(int n, int num_intrs, int type, reax_list *l) { diff --git a/src/USER-REAXC/reaxc_multi_body.cpp b/src/USER-REAXC/reaxc_multi_body.cpp index f2e629c65c..09fb848a08 100644 --- a/src/USER-REAXC/reaxc_multi_body.cpp +++ b/src/USER-REAXC/reaxc_multi_body.cpp @@ -32,7 +32,7 @@ #include namespace ReaxFF { - + void Atom_Energy(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists) { diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index a2276023a4..bb0fc1eb5a 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -32,7 +32,7 @@ #include namespace ReaxFF { - + static void Reset_Atoms(reax_system* system, control_params *control) { int i; diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index ab8ba6317c..bfaa6b94aa 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -33,7 +33,7 @@ #include "error.h" namespace ReaxFF { - + int Tokenize(char* s, char*** tok) { char test[MAX_LINE]; diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index f134713936..91afc9e8d1 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -48,7 +48,7 @@ #define ANGLE_BASIC_LEN 38 namespace ReaxFF { - + enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index 9c1bf15c4b..e1a535e193 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -31,7 +31,7 @@ #include "pair.h" #include "error.h" -namespace ReaxFF { +namespace ReaxFF { void Calculate_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, double *theta, double *cos_theta ) { diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index 36579e83e4..c52fa8a711 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -25,7 +25,7 @@ #include -namespace ReaxFF +namespace ReaxFF { // per instance data struct API { @@ -61,7 +61,7 @@ namespace ReaxFF // bonds extern void Bonds(reax_system *, simulation_data *, storage *, reax_list **); - + // control extern void Read_Control_File(const char *, control_params *, output_controls *); @@ -78,7 +78,7 @@ namespace ReaxFF int *, int *, int *, int *); // hydrogen bonds - + extern void Hydrogen_Bonds(reax_system *, control_params *, simulation_data *, storage *, reax_list **); // init md @@ -149,7 +149,7 @@ namespace ReaxFF storage *, reax_list **); extern void Reset_Simulation_Data(simulation_data *); extern void Reset_Workspace(reax_system *, storage *); - + // toolbox extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const char *); diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index f8cc255fd9..b3d3d4acdd 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -90,7 +90,7 @@ #define REAX_MAX_4BODY_PARAM 5 #define REAX_MAX_ATOM_TYPES 25 -namespace ReaxFF +namespace ReaxFF { /******************* ENUMERATORS *************************/ diff --git a/src/USER-REAXC/reaxff_inline.h b/src/USER-REAXC/reaxff_inline.h index 9a4a2159f6..ba9927e5d3 100644 --- a/src/USER-REAXC/reaxff_inline.h +++ b/src/USER-REAXC/reaxff_inline.h @@ -23,7 +23,7 @@ #include "accelerator_kokkos.h" // for LAMMPS_INLINE -namespace ReaxFF +namespace ReaxFF { struct LR_data { diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index c04d886656..56bbbe43b7 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -33,7 +33,7 @@ namespace LAMMPS_NS { class Pair; } -namespace ReaxFF +namespace ReaxFF { /********************** TYPE DEFINITIONS ********************/ typedef int ivec[3]; From 1c6db4b0cb745ede9d4127fffde9dbc2ac98e5f3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 02:51:18 -0400 Subject: [PATCH 039/352] some more smaller tweaks --- src/USER-OMP/pair_reaxc_omp.cpp | 4 +- src/USER-OMP/reaxc_init_md_omp.cpp | 22 +++------- src/USER-REAXC/pair_reaxc.cpp | 5 +-- src/USER-REAXC/reaxc_allocate.cpp | 66 +++++++++++++----------------- src/USER-REAXC/reaxc_init_md.cpp | 32 +++------------ src/USER-REAXC/reaxc_list.cpp | 4 +- src/USER-REAXC/reaxff_api.h | 2 +- src/USER-REAXC/reaxff_defs.h | 7 ---- 8 files changed, 44 insertions(+), 98 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 5693bef5e6..0f8ae18009 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -389,9 +389,7 @@ void PairReaxCOMP::setup() write_reax_atoms(); int num_nbrs = estimate_reax_lists(); - if (!Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - api->lists+FAR_NBRS)) - error->all(FLERR,"Pair reax/c problem in far neighbor list"); + Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, api->lists+FAR_NBRS); write_reax_lists(); diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index 94458d2691..eb81fe8280 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -37,8 +37,8 @@ /* ---------------------------------------------------------------------- */ namespace ReaxFF { - int Init_ListsOMP(reax_system *system, control_params *control, - reax_list **lists) + static void Init_ListsOMP(reax_system *system, control_params *control, + reax_list **lists) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; @@ -62,10 +62,7 @@ namespace ReaxFF { } total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); - if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS)) { - error->one(FLERR, "Not enough space for hbonds list. Terminating!"); - } + Make_List(system->Hcap, total_hbonds, TYP_HBOND,*lists+HBONDS); } total_bonds = 0; @@ -75,10 +72,7 @@ namespace ReaxFF { } bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); - if (!Make_List(system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS)) { - error->one(FLERR, "Not enough space for bonds list. Terminating!\n"); - } + Make_List(system->total_cap, bond_cap, TYP_BOND,*lists+BONDS); int nthreads = control->nthreads; reax_list *bonds = (*lists)+BONDS; @@ -89,16 +83,10 @@ namespace ReaxFF { /* 3bodies list */ cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); - if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES)) { - - error->one(FLERR, "Problem in initializing angles list. Terminating!"); - } + Make_List(bond_cap, cap_3body, TYP_THREE_BODY,*lists+THREE_BODIES); free(hb_top); free(bond_top); - - return SUCCESS; } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index aa445d765d..26c7428245 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -423,9 +423,8 @@ void PairReaxC::setup() int num_nbrs = estimate_reax_lists(); if (num_nbrs < 0) error->all(FLERR,"Too many neighbors for pair style reax/c"); - if (!Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - api->lists+FAR_NBRS)) - error->all(FLERR,"Pair reax/c problem in far neighbor list"); + Make_List(api->system->total_cap, num_nbrs, + TYP_FAR_NEIGHBOR, api->lists+FAR_NBRS); (api->lists+FAR_NBRS)->error_ptr=error; write_reax_lists(); diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 143da54849..9ee2a1d3a1 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -65,13 +65,13 @@ namespace ReaxFF { auto error = system->error_ptr; // deallocate the atom list - sfree(error, system->my_atoms, "system->my_atoms"); + sfree(error, system->my_atoms, "system->my_atoms"); // deallocate the ffield parameters storage ff_params = &(system->reax_param); ntypes = ff_params->num_atom_types; - sfree(error, ff_params->gp.l, "ff:globals"); + sfree(error, ff_params->gp.l, "ff:globals"); for (i = 0; i < ntypes; ++i) { for (j = 0; j < ntypes; ++j) { @@ -104,27 +104,27 @@ namespace ReaxFF { auto error = control->error_ptr; /* bond order storage */ - sfree(error, workspace->total_bond_order, "total_bo"); - sfree(error, workspace->Deltap, "Deltap"); - sfree(error, workspace->Deltap_boc, "Deltap_boc"); - sfree(error, workspace->dDeltap_self, "dDeltap_self"); - sfree(error, workspace->Delta, "Delta"); - sfree(error, workspace->Delta_lp, "Delta_lp"); - sfree(error, workspace->Delta_lp_temp, "Delta_lp_temp"); - sfree(error, workspace->dDelta_lp, "dDelta_lp"); - sfree(error, workspace->dDelta_lp_temp, "dDelta_lp_temp"); - sfree(error, workspace->Delta_e, "Delta_e"); - sfree(error, workspace->Delta_boc, "Delta_boc"); - sfree(error, workspace->Delta_val, "Delta_val"); - sfree(error, workspace->nlp, "nlp"); - sfree(error, workspace->nlp_temp, "nlp_temp"); - sfree(error, workspace->Clp, "Clp"); - sfree(error, workspace->vlpex, "vlpex"); - sfree(error, workspace->bond_mark, "bond_mark"); + sfree(error, workspace->total_bond_order, "total_bo"); + sfree(error, workspace->Deltap, "Deltap"); + sfree(error, workspace->Deltap_boc, "Deltap_boc"); + sfree(error, workspace->dDeltap_self, "dDeltap_self"); + sfree(error, workspace->Delta, "Delta"); + sfree(error, workspace->Delta_lp, "Delta_lp"); + sfree(error, workspace->Delta_lp_temp, "Delta_lp_temp"); + sfree(error, workspace->dDelta_lp, "dDelta_lp"); + sfree(error, workspace->dDelta_lp_temp, "dDelta_lp_temp"); + sfree(error, workspace->Delta_e, "Delta_e"); + sfree(error, workspace->Delta_boc, "Delta_boc"); + sfree(error, workspace->Delta_val, "Delta_val"); + sfree(error, workspace->nlp, "nlp"); + sfree(error, workspace->nlp_temp, "nlp_temp"); + sfree(error, workspace->Clp, "Clp"); + sfree(error, workspace->vlpex, "vlpex"); + sfree(error, workspace->bond_mark, "bond_mark"); /* force related storage */ - sfree(error, workspace->f, "f"); - sfree(error, workspace->CdDelta, "CdDelta"); + sfree(error, workspace->f, "f"); + sfree(error, workspace->CdDelta, "CdDelta"); /* reductions */ @@ -182,9 +182,7 @@ namespace ReaxFF { static void Reallocate_Neighbor_List(reax_list *far_nbrs, int n, int num_intrs) { Delete_List(far_nbrs); - if (!Make_List(n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs)) { - far_nbrs->error_ptr->one(FLERR,"Problem in initializing far neighbors list"); - } + Make_List(n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs); } static int Reallocate_HBonds_List(reax_system *system, reax_list *hbonds) @@ -202,15 +200,13 @@ namespace ReaxFF { total_hbonds = (int)(MAX(total_hbonds*saferzone, mincap*system->minhbonds)); Delete_List(hbonds); - if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, hbonds)) { - hbonds->error_ptr->one(FLERR, "Not enough space for hydrogen bonds list"); - } + Make_List(system->Hcap, total_hbonds, TYP_HBOND, hbonds); return total_hbonds; } - static int Reallocate_Bonds_List(control_params *control, reax_system *system, - reax_list *bonds, int *total_bonds, int *est_3body) + static void Reallocate_Bonds_List(control_params *control, reax_system *system, + reax_list *bonds, int *total_bonds, int *est_3body) { int i; @@ -230,16 +226,12 @@ namespace ReaxFF { sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); Delete_List(bonds); - if (!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds)) { - bonds->error_ptr->one(FLERR, "Not enough space for bonds list"); - } + Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds); if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) bonds->select.bond_list[i].bo_data.CdboReduction = (double*) smalloc(system->error_ptr, sizeof(double)*control->nthreads, "CdboReduction"); - - return SUCCESS; } void ReAllocate(reax_system *system, control_params *control, @@ -325,10 +317,8 @@ namespace ReaxFF { wsr->num_3body = (int)(MAX(wsr->num_3body*safezone, MIN_3BODIES)); - if (!Make_List(num_bonds, wsr->num_3body, TYP_THREE_BODY, - (*lists)+THREE_BODIES)) { - error->one(FLERR, "Problem in initializing angles list"); - } + Make_List(num_bonds, wsr->num_3body, TYP_THREE_BODY, + (*lists)+THREE_BODIES); wsr->num_3body = -1; } } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 8704852a64..adc9bc137d 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -115,7 +115,7 @@ namespace ReaxFF { Init_Taper(control, workspace); } - static int Init_Lists(reax_system *system, control_params *control, reax_list **lists) + static void Init_Lists(reax_system *system, control_params *control, reax_list **lists) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; @@ -123,7 +123,6 @@ namespace ReaxFF { int mincap = system->mincap; double safezone = system->safezone; double saferzone = system->saferzone; - LAMMPS_NS::Error *error = system->error_ptr; bond_top = (int*) calloc(system->total_cap, sizeof(int)); hb_top = (int*) calloc(system->local_cap, sizeof(int)); @@ -139,10 +138,7 @@ namespace ReaxFF { } total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); - if (!Make_List(system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS)) - error->one(FLERR, "Not enough space for hbonds list."); - + Make_List(system->Hcap, total_hbonds, TYP_HBOND,*lists+HBONDS); (*lists+HBONDS)->error_ptr = system->error_ptr; } @@ -153,24 +149,16 @@ namespace ReaxFF { } bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); - if (!Make_List(system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS)) - error->one(FLERR, "Not enough space for bonds list."); - + Make_List(system->total_cap, bond_cap, TYP_BOND,*lists+BONDS); (*lists+BONDS)->error_ptr = system->error_ptr; /* 3bodies list */ cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); - if (!Make_List(bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES)) - error->one(FLERR,"Problem in initializing angles list."); - + Make_List(bond_cap, cap_3body, TYP_THREE_BODY,*lists+THREE_BODIES); (*lists+THREE_BODIES)->error_ptr = system->error_ptr; free(hb_top); free(bond_top); - - return SUCCESS; } void Initialize(reax_system *system, control_params *control, @@ -178,19 +166,11 @@ namespace ReaxFF { reax_list **lists, output_controls *out_control, MPI_Comm world) { - char msg[MAX_STR]; - LAMMPS_NS::Error *error = system->error_ptr; - Init_System(system, control); Init_Simulation_Data(data); Init_Workspace(system, control, workspace); - - if (Init_Lists(system, control, lists) ==FAILURE) - error->one(FLERR,fmt::format("Error on: {}. System could not be " - "initialized. Terminating.",msg)); - - Init_Output_Files(system, control, out_control,world); - + Init_Lists(system, control, lists); + Init_Output_Files(system, control, out_control, world); if (control->tabulate) Init_Lookup_Tables(system, control, workspace, world); } diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index db57aa4f40..1063328f8e 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -31,7 +31,7 @@ namespace ReaxFF { /************* allocate list space ******************/ - int Make_List(int n, int num_intrs, int type, reax_list *l) + void Make_List(int n, int num_intrs, int type, reax_list *l) { l->allocated = 1; @@ -91,8 +91,6 @@ namespace ReaxFF { default: l->error_ptr->all(FLERR,fmt::format("No list type {} defined", l->type)); } - - return SUCCESS; } void Delete_List(reax_list *l) diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index c52fa8a711..dda2161c86 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -100,7 +100,7 @@ namespace ReaxFF // lists - extern int Make_List(int, int, int, reax_list *); + extern void Make_List(int, int, int, reax_list *); extern void Delete_List(reax_list*); inline int Start_Index(int i, reax_list *l) { return l->index[i]; } diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index b3d3d4acdd..917255c5f0 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -25,13 +25,6 @@ #define inline __inline__ #endif /*IBMC*/ -#ifndef SUCCESS -#define SUCCESS 1 -#endif -#ifndef FAILURE -#define FAILURE 0 -#endif - #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) #define DEG2RAD(a) ((a)*constPI/180.0) From 3b55872a18c4a69be5848526e525909269cf93d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 03:06:21 -0400 Subject: [PATCH 040/352] updates for legacy build system --- src/.gitignore | 33 +++++++++------------------------ src/Purge.list | 34 ++++++++++++++++++++++++++++++++++ src/USER-OMP/Install.sh | 2 ++ 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index 96a89ae667..818b9bfcae 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -544,6 +544,8 @@ /fix_bond_react.h /fix_bond_swap.cpp /fix_bond_swap.h +/fix_charge_regulation.cpp +/fix_charge_regulation.h /fix_client_md.cpp /fix_client_md.h /fix_cmap.cpp @@ -804,6 +806,8 @@ /gridcomm.h /group_ndx.cpp /group_ndx.h +/gz_file_writer.cpp +/gz_file_writer.h /ndx_group.cpp /ndx_group.h /hyper.cpp @@ -1178,6 +1182,7 @@ /python_impl.cpp /python_impl.h /python_compat.h +/python_utils.h /fix_python_move.cpp /fix_python_move.h /fix_python_invoke.cpp @@ -1189,49 +1194,29 @@ /reader_molfile.cpp /reader_molfile.h /reaxc_allocate.cpp -/reaxc_allocate.h /reaxc_basic_comm.cpp -/reaxc_basic_comm.h /reaxc_bond_orders.cpp -/reaxc_bond_orders.h /reaxc_bonds.cpp -/reaxc_bonds.h /reaxc_control.cpp -/reaxc_control.h -/reaxc_defs.h /reaxc_ffield.cpp /reaxc_ffield.h /reaxc_forces.cpp -/reaxc_forces.h /reaxc_hydrogen_bonds.cpp -/reaxc_hydrogen_bonds.h /reaxc_init_md.cpp -/reaxc_init_md.h /reaxc_io_tools.cpp -/reaxc_io_tools.h /reaxc_list.cpp -/reaxc_list.h /reaxc_lookup.cpp -/reaxc_lookup.h /reaxc_multi_body.cpp -/reaxc_multi_body.h /reaxc_nonbonded.cpp -/reaxc_nonbonded.h /reaxc_reset_tools.cpp -/reaxc_reset_tools.h -/reaxc_system_props.cpp -/reaxc_system_props.h /reaxc_tool_box.cpp -/reaxc_tool_box.h /reaxc_torsion_angles.cpp -/reaxc_torsion_angles.h /reaxc_traj.cpp -/reaxc_traj.h -/reaxc_types.h /reaxc_valence_angles.cpp -/reaxc_valence_angles.h -/reaxc_vector.cpp -/reaxc_vector.h +/reaxff_api.h +/reaxff_defs.h +/reaxff_inline.h +/reaxff_types.h /remap.cpp /remap.h /remap_wrap.cpp diff --git a/src/Purge.list b/src/Purge.list index 2853ce2a7c..17f7291a38 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -51,6 +51,40 @@ lmpinstalledpkgs.h lmpgitversion.h mliap_model_python_couple.cpp mliap_model_python_couple.h +# removed on 17 Apr 2021 +reaxc_allocate.h +reaxc_bond_orders.h +reaxc_bonds.h +reaxc_control.h +reaxc_defs.h +reaxc_ffield.h +reaxc_forces.h +reaxc_hydrogen_bonds.h +reaxc_init_md.h +reaxc_io_tools.h +reaxc_list.h +reaxc_lookup.h +reaxc_multi_body.h +reaxc_nonbonded.h +reaxc_reset_tools.h +reaxc_system_props.h +reaxc_system_props.cpp +reaxc_tool_box.h +reaxc_torsion_angles.h +reaxc_traj.h +reaxc_types.h +reaxc_valence_angles.h +reaxc_vector.h +reaxc_vector.cpp +reaxc_bond_orders_omp.h +reaxc_bonds_omp.h +reaxc_forces_omp.h +reaxc_hydrogen_bonds_omp.h +reaxc_init_md_omp.h +reaxc_multi_body_omp.h +reaxc_nonbonded_omp.h +reaxc_torsion_angles_omp.h +reaxc_valence_angles_omp.h # removed on 9 Sep 2020 mergesort.h # renamed on 8 May 2020 diff --git a/src/USER-OMP/Install.sh b/src/USER-OMP/Install.sh index bb4ef6c3aa..6d9423033e 100755 --- a/src/USER-OMP/Install.sh +++ b/src/USER-OMP/Install.sh @@ -37,10 +37,12 @@ done for file in *_omp.h; do test $file = thr_omp.h && continue + test $file = reaxff_omp.h && continue dep=${file%_omp.h}.h action $file $dep done +action reaxff_omp.h reaxff_api.h action thr_omp.h action thr_omp.cpp action thr_data.h From 04c5b23d90a10c7392b215bd436d8030fbe94aa1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 15:41:45 -0400 Subject: [PATCH 041/352] add custom constructor for TextFileReader that uses an already opened file descriptor --- src/text_file_reader.cpp | 14 +++++++++++++- src/text_file_reader.h | 3 ++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp index 7a6e914639..57aaaf6bb5 100644 --- a/src/text_file_reader.cpp +++ b/src/text_file_reader.cpp @@ -41,7 +41,7 @@ using namespace LAMMPS_NS; * \param filetype Description of file type for error messages */ TextFileReader::TextFileReader(const std::string &filename, const std::string &filetype) - : filename(filename), filetype(filetype), ignore_comments(true) + : filetype(filetype), ignore_comments(true) { fp = fopen(filename.c_str(), "r"); @@ -51,6 +51,18 @@ TextFileReader::TextFileReader(const std::string &filename, const std::string &f } } +/** + * \overload + * + * \param fp File descriptor of the already opened file + * \param filetype Description of file type for error messages */ + +TextFileReader::TextFileReader(FILE *fp, const std::string &filetype) + : filetype(filetype), fp(fp), ignore_comments(true) +{ + if (fp == nullptr) throw FileReaderException("Invalid file descriptor"); +} + /** Closes the file */ TextFileReader::~TextFileReader() { diff --git a/src/text_file_reader.h b/src/text_file_reader.h index 0da21e4581..1b978fabfa 100644 --- a/src/text_file_reader.h +++ b/src/text_file_reader.h @@ -25,7 +25,6 @@ namespace LAMMPS_NS { class TextFileReader { - std::string filename; std::string filetype; static constexpr int MAXLINE = 1024; char line[MAXLINE]; @@ -35,6 +34,8 @@ namespace LAMMPS_NS bool ignore_comments; //!< Controls whether comments are ignored TextFileReader(const std::string &filename, const std::string &filetype); + TextFileReader(FILE *fp, const std::string &filetype); + ~TextFileReader(); void skip_line(); From 87e74bc721f0f2288a201403acad1bbad357f77f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 15:42:22 -0400 Subject: [PATCH 042/352] small tweaks for better alignment and access to the LAMMPS Memory class --- src/USER-REAXC/pair_reaxc.cpp | 1 + src/USER-REAXC/reaxff_types.h | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 26c7428245..c387c1b203 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -94,6 +94,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) api->system->total_cap = 0; api->system->my_atoms = nullptr; api->system->pair_ptr = this; + api->system->mem_ptr = memory; api->system->error_ptr = error; api->control->error_ptr = error; api->control->lmp_ptr = lmp; diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index 56bbbe43b7..fc88e43dca 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -30,6 +30,7 @@ namespace LAMMPS_NS { class Error; class LAMMPS; + class Memory; class Pair; } @@ -47,8 +48,8 @@ namespace ReaxFF struct global_parameters { int n_global; - double* l; int vdw_type; + double *l; }; struct single_body_parameters @@ -213,6 +214,8 @@ namespace ReaxFF LAMMPS_NS::Error *error_ptr; LAMMPS_NS::Pair *pair_ptr; + LAMMPS_NS::Memory *mem_ptr; + int my_bonds; int mincap,minhbonds; double safezone, saferzone; From f0ef44a496a74b8a0237ed3bae8e259b5be3b43a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 18:23:36 -0400 Subject: [PATCH 043/352] fix small memory leak --- src/USER-REAXC/pair_reaxc.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index c387c1b203..db2cfb3811 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -145,6 +145,7 @@ PairReaxC::~PairReaxC() delete api->data; delete api->workspace; memory->destroy(api->lists); + delete api; // deallocate interface storage if (allocated) { From 545f551c9d76303fb364efff891d85166085d64e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Apr 2021 18:27:23 -0400 Subject: [PATCH 044/352] modernize force field parser for ReaxFF --- src/USER-REAXC/pair_reaxc.cpp | 2 +- src/USER-REAXC/reaxc_allocate.cpp | 36 +- src/USER-REAXC/reaxc_ffield.cpp | 1293 +++++++++++++---------------- src/USER-REAXC/reaxff_api.h | 3 +- src/text_file_reader.h | 4 +- 5 files changed, 610 insertions(+), 728 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index db2cfb3811..3525b40b1d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -291,7 +291,7 @@ void PairReaxC::coeff(int nargs, char **args) // read ffield file - Read_Force_Field(args[2], &(api->system->reax_param), api->control); + Read_Force_Field(args[2], &(api->system->reax_param), api->control, world); // read args that map atom types to elements in potential file // map[i] = which element the Ith atom type is, -1 if "NULL" diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 9ee2a1d3a1..b79c5fe57c 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -27,6 +27,8 @@ #include "reaxff_api.h" #include "error.h" +#include "memory.h" +#include "pair.h" namespace ReaxFF { @@ -59,39 +61,19 @@ namespace ReaxFF { void DeAllocate_System(reax_system *system) { - int i, j, k; - int ntypes; - reax_interaction *ff_params; auto error = system->error_ptr; + auto memory = system->mem_ptr; // deallocate the atom list sfree(error, system->my_atoms, "system->my_atoms"); // deallocate the ffield parameters storage - ff_params = &(system->reax_param); - ntypes = ff_params->num_atom_types; - - sfree(error, ff_params->gp.l, "ff:globals"); - - for (i = 0; i < ntypes; ++i) { - for (j = 0; j < ntypes; ++j) { - for (k = 0; k < ntypes; ++k) { - sfree(error, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]"); - } - sfree(error, ff_params->fbp[i][j], "ff:fbp[i,j]"); - sfree(error, ff_params->thbp[i][j], "ff:thbp[i,j]"); - sfree(error, ff_params->hbp[i][j], "ff:hbp[i,j]"); - } - sfree(error, ff_params->fbp[i], "ff:fbp[i]"); - sfree(error, ff_params->thbp[i], "ff:thbp[i]"); - sfree(error, ff_params->hbp[i], "ff:hbp[i]"); - sfree(error, ff_params->tbp[i], "ff:tbp[i]"); - } - sfree(error, ff_params->fbp, "ff:fbp"); - sfree(error, ff_params->thbp, "ff:thbp"); - sfree(error, ff_params->hbp, "ff:hbp"); - sfree(error, ff_params->tbp, "ff:tbp"); - sfree(error, ff_params->sbp, "ff:sbp"); + memory->destroy(system->reax_param.gp.l); + memory->destroy(system->reax_param.sbp); + memory->destroy(system->reax_param.tbp); + memory->destroy(system->reax_param.thbp); + memory->destroy(system->reax_param.hbp); + memory->destroy(system->reax_param.fbp); } /************* workspace *************/ diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index b60022dd03..3cbb4a6f82 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -26,726 +26,625 @@ #include "reaxff_api.h" -#include +#include "error.h" +#include "memory.h" +#include "text_file_reader.h" +#include "utils.h" + #include #include -#include -#include -#include -#include "error.h" - -#include "utils.h" +#include using LAMMPS_NS::utils::open_potential; using LAMMPS_NS::utils::getsyserror; namespace ReaxFF { + + class parser_error : public std::exception { + std::string message; + public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } + }; + extern int Tokenize(char* s, char*** tok); void Read_Force_Field(const char *filename, reax_interaction *reax, - control_params *control) + control_params *control, MPI_Comm world) { - char *s; - char **tmp; char ****tor_flag; - int c, i, j, k, l, m, n, o, p, cnt; - int lgflag = control->lgflag; - int errorflag = 1; - double val; - int me = control->me; + auto error = control->error_ptr; + auto lmp = control->lmp_ptr; + auto memory = control->lmp_ptr->memory; - FILE *fp = open_potential(filename,control->lmp_ptr,nullptr); - if (!fp) - control->error_ptr->all(FLERR,fmt::format("Cannot open ReaxFF potential " - "file {}: {}",filename, - getsyserror())); - s = (char*) malloc(sizeof(char)*MAX_LINE); - tmp = (char**) malloc(sizeof(char*)*MAX_TOKENS); - for (i=0; i < MAX_TOKENS; i++) - tmp[i] = (char*) malloc(sizeof(char)*MAX_TOKEN_LEN); + // read and parse the force field only on rank 0 - /* reading first header comment */ - fgets(s, MAX_LINE, fp); +#define THROW_ERROR(txt) \ + throw parser_error(fmt::format("{}:{}: {}",filename,lineno,txt)) - /* line 2 is number of global parameters */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); + if (control->me == 0) { + FILE *fp = LAMMPS_NS::utils::open_potential(filename, lmp, nullptr); + if (!fp) + error->one(FLERR,fmt::format("The ReaxFF parameter file {} cannot be opened: {}", + filename, getsyserror())); + LAMMPS_NS::TextFileReader reader(fp, "ReaxFF parameter"); - /* reading the number of global parameters */ - n = atoi(tmp[0]); - if (n < 1) { - if (me == 0) - control->error_ptr->warning(FLERR, "Number of globals in ffield file is 0. The file will not be read."); - fclose(fp); - free(s); - free(tmp); - return; + try { + int i,j,k,l,m,n,lineno = 0; + + // skip header comment line + + reader.skip_line(); + ++lineno; + + // set some defaults + + reax->gp.vdw_type = 0; + + // get number of global parameters + + auto values = reader.next_values(0); + n = values.next_int(); + reax->gp.n_global = n; + ++lineno; + + if (n < 1) + THROW_ERROR("Invalid number of global parameters"); + + memory->create(reax->gp.l,n,"reaxff:gp.l"); + + // see reaxff_types.h for mapping between l[i] and the lambdas used in ff + + for (i = 0; i < n; ++i) { + values = reader.next_values(0); + ++lineno; + reax->gp.l[i] = values.next_double(); + } + + // next line is number of atom types followed by 3 lines of comments + + values = reader.next_values(0); + n = values.next_int(); + reax->num_atom_types = n; + reader.skip_line(); + reader.skip_line(); + reader.skip_line(); + lineno += 4; + + // allocate and clear storage for ffield data + + memory->create(reax->sbp,n,"reaxff:sbp"); + memory->create(reax->tbp,n,n,"reaxff:tbp"); + memory->create(reax->thbp,n,n,n,"reaxff:thbp"); + memory->create(reax->hbp,n,n,n,"reaxff:hbp"); + memory->create(reax->fbp,n,n,n,n,"reaxff:fbp"); + memory->create(tor_flag,n,n,n,n,"reaxff:tor_flag"); + memset(&(reax->sbp[0]),0,sizeof(single_body_parameters)*n); + memset(&(reax->tbp[0][0]),0,sizeof(two_body_parameters)*n*n); + memset(&(reax->thbp[0][0][0]),0,sizeof(three_body_header)*n*n*n); + memset(&(reax->hbp[0][0][0]),0,sizeof(hbond_parameters)*n*n*n); + memset(&(reax->fbp[0][0][0][0]),0,sizeof(four_body_header)*n*n*n*n); + memset(&tor_flag[0][0][0][0],0,sizeof(char)*n*n*n*n); + + // atomic parameters + // four lines per atom type, or 5 if lgvdw != 0 + // the first starts with the symbol and has 9 words + // the next three have 8 words + // the fifth will have 2 words, if present + + const int lgflag = control->lgflag; + const int ntypes = n; + for (i = 0; i < ntypes; ++i) { + + // line one + + values = reader.next_values(0); + ++lineno; + + if ((values.count() < 8) && !lgflag) + THROW_ERROR("This force field file requires using 'lgvdw yes'"); + if (values.count() < 9) + THROW_ERROR("Invalid force field file format"); + + auto element = values.next_string(); + int len = MIN(element.size(),3); + for (j = 0; j < len; ++j) + reax->sbp[i].name[j] = toupper(element[j]); + reax->sbp[i].name[j] = '\0'; + + reax->sbp[i].r_s = values.next_double(); + reax->sbp[i].valency = values.next_double(); + reax->sbp[i].mass = values.next_double(); + reax->sbp[i].r_vdw = values.next_double(); + reax->sbp[i].epsilon = values.next_double(); + reax->sbp[i].gamma = values.next_double(); + reax->sbp[i].r_pi = values.next_double(); + reax->sbp[i].valency_e = values.next_double(); + reax->sbp[i].nlp_opt = 0.5 * (reax->sbp[i].valency_e-reax->sbp[i].valency); + + // line two + + values = reader.next_values(0); + ++lineno; + if (values.count() < 8) + THROW_ERROR("Invalid force field file format"); + + reax->sbp[i].alpha = values.next_double(); + reax->sbp[i].gamma_w = values.next_double(); + reax->sbp[i].valency_boc= values.next_double(); + reax->sbp[i].p_ovun5 = values.next_double(); + values.skip(); + reax->sbp[i].chi = values.next_double(); + reax->sbp[i].eta = 2.0*values.next_double(); + reax->sbp[i].p_hbond = (int) values.next_double(); + + // line three + + values = reader.next_values(0); + ++lineno; + if (values.count() < 8) + THROW_ERROR("Invalid force field file format"); + + reax->sbp[i].r_pi_pi = values.next_double(); + reax->sbp[i].p_lp2 = values.next_double(); + values.skip(); + reax->sbp[i].b_o_131 = values.next_double(); + reax->sbp[i].b_o_132 = values.next_double(); + reax->sbp[i].b_o_133 = values.next_double(); + + // line four + + values = reader.next_values(0); + ++lineno; + if (values.count() < 8) + THROW_ERROR("Invalid force field file format"); + + reax->sbp[i].p_ovun2 = values.next_double(); + reax->sbp[i].p_val3 = values.next_double(); + values.skip(); + reax->sbp[i].valency_val= values.next_double(); + reax->sbp[i].p_val5 = values.next_double(); + reax->sbp[i].rcore2 = values.next_double(); + reax->sbp[i].ecore2 = values.next_double(); + reax->sbp[i].acore2 = values.next_double(); + + // read line five only when lgflag != 0 + + if (lgflag) { + values = reader.next_values(0); + ++lineno; + if (values.count() < 2) + THROW_ERROR("Invalid force field file format"); + reax->sbp[i].lgcij = values.next_double(); + reax->sbp[i].lgre = values.next_double(); + } else reax->sbp[i].lgcij = reax->sbp[i].lgre = 0.0; + + // van der Waals settings check: + + // Inner-wall? + if ((reax->sbp[i].rcore2 > 0.01) && (reax->sbp[i].acore2 > 0.01)) { + // Shielding van der Waals? + if (reax->sbp[i].gamma_w > 0.5) { + if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { + const auto errmsg + = fmt::format("Van der Waals parameters for element {} " + "indicate inner wall+shielding, but earlier " + "atoms indicate a different van der Waals " + "method. This may cause division-by-zero " + "errors. Keeping van der Waals setting for " + "earlier atoms.",reax->sbp[i].name); + error->warning(FLERR,errmsg); + } else { + reax->gp.vdw_type = 3; + } + } else { // No shielding van der Waals parameters present + if ((reax->gp.vdw_type != 0) && (reax->gp.vdw_type != 2)) { + const auto errmsg + = fmt::format("Van der Waals parameters for element {} " + "indicate inner wall withou shielding, but " + "earlier atoms indicate a different van der " + "Waals-method. This may cause division-by-" + "zero errors. Keeping van der Waals setting " + "for earlier atoms.", reax->sbp[i].name); + error->warning(FLERR,errmsg); + } else { + reax->gp.vdw_type = 2; + } + } + } else { // No Inner wall parameters present + if (reax->sbp[i].gamma_w > 0.5) { // Shielding vdWaals + if ((reax->gp.vdw_type != 0) && (reax->gp.vdw_type != 1)) { + const auto errmsg + = fmt::format("Van der Waals parameters for element {} " + "indicate shielding without inner wall, but " + "earlier elements indicate a different van der " + "Waals method. This may cause division-by-zero " + "errors. Keeping van der Waals setting for " + "earlier atoms.", reax->sbp[i].name); + error->warning(FLERR,errmsg); + } else { + reax->gp.vdw_type = 1; + } + } else { + error->one(FLERR,fmt::format("Inconsistent van der Waals " + "parameters: No shielding or inner " + "wall set for element {}", + reax->sbp[i].name)); + } + } + } + + /* Equate vval3 to valf for first-row elements (25/10/2004) */ + for (i = 0; i < ntypes; i++) { + if ((reax->sbp[i].mass < 21) && + (reax->sbp[i].valency_val != reax->sbp[i].valency_boc)) { + error->warning(FLERR,fmt::format("Changed valency_val to valency" + "_boc for {}", reax->sbp[i].name)); + reax->sbp[i].valency_val = reax->sbp[i].valency_boc; + } + } + + // next line is number of two body parameters followed by 1 comment line + + values = reader.next_values(0); + n = values.next_int(); + reader.skip_line(); + lineno += 2; + + for (i = 0; i < n; ++i) { + + // first line + + values = reader.next_values(0); + ++lineno; + if (values.count() < 10) + THROW_ERROR("Invalid force field file format"); + + j = values.next_int() - 1; + k = values.next_int() - 1; + + if ((j < 0) || (k < 0)) + THROW_ERROR("Inconsistent force field file"); + + if ((j < ntypes) && (k < ntypes)) { + reax->tbp[j][k].De_s = reax->tbp[k][j].De_s = values.next_double(); + reax->tbp[j][k].De_p = reax->tbp[k][j].De_p = values.next_double(); + reax->tbp[j][k].De_pp = reax->tbp[k][j].De_pp = values.next_double(); + reax->tbp[j][k].p_be1 = reax->tbp[k][j].p_be1 = values.next_double(); + reax->tbp[j][k].p_bo5 = reax->tbp[k][j].p_bo5 = values.next_double(); + reax->tbp[j][k].v13cor = reax->tbp[k][j].v13cor = values.next_double(); + reax->tbp[j][k].p_bo6 = reax->tbp[k][j].p_bo6 = values.next_double(); + reax->tbp[j][k].p_ovun1 = reax->tbp[k][j].p_ovun1 = values.next_double(); + } + + // second line + + values = reader.next_values(0); + ++lineno; + if (values.count() < 8) + THROW_ERROR("Invalid force field file format"); + + if ((j < ntypes) && (k < ntypes)) { + reax->tbp[j][k].p_be2 = reax->tbp[k][j].p_be2 = values.next_double(); + reax->tbp[j][k].p_bo3 = reax->tbp[k][j].p_bo3 = values.next_double(); + reax->tbp[j][k].p_bo4 = reax->tbp[k][j].p_bo4 = values.next_double(); + values.skip(); + reax->tbp[j][k].p_bo1 = reax->tbp[k][j].p_bo1 = values.next_double(); + reax->tbp[j][k].p_bo2 = reax->tbp[k][j].p_bo2 = values.next_double(); + reax->tbp[j][k].ovc = reax->tbp[k][j].ovc = values.next_double(); + } + } + + for (i=0; i < ntypes; ++i) { + for (j=i; j < ntypes; ++j) { + reax->tbp[i][j].r_s = reax->tbp[j][i].r_s = + 0.5*(reax->sbp[j].r_s + reax->sbp[i].r_s); + + reax->tbp[i][j].r_p = reax->tbp[j][i].r_p = + 0.5*(reax->sbp[j].r_pi + reax->sbp[i].r_pi); + + reax->tbp[i][j].r_pp = reax->tbp[j][i].r_pp = + 0.5*(reax->sbp[j].r_pi_pi + reax->sbp[i].r_pi_pi); + + reax->tbp[i][j].p_boc3 = reax->tbp[j][i].p_boc3 = + sqrt(reax->sbp[j].b_o_132 * reax->sbp[i].b_o_132); + + reax->tbp[i][j].p_boc4 = reax->tbp[j][i].p_boc4 = + sqrt(reax->sbp[j].b_o_131 * reax->sbp[i].b_o_131); + + reax->tbp[i][j].p_boc5 = reax->tbp[j][i].p_boc5 = + sqrt(reax->sbp[j].b_o_133 * reax->sbp[i].b_o_133); + + reax->tbp[i][j].D = reax->tbp[j][i].D = + sqrt(reax->sbp[j].epsilon * reax->sbp[i].epsilon); + + reax->tbp[i][j].alpha = reax->tbp[j][i].alpha = + sqrt(reax->sbp[j].alpha * reax->sbp[i].alpha); + + reax->tbp[i][j].r_vdW = reax->tbp[j][i].r_vdW = + 2.0*sqrt(reax->sbp[j].r_vdw * reax->sbp[i].r_vdw); + + reax->tbp[i][j].gamma_w = reax->tbp[j][i].gamma_w = + sqrt(reax->sbp[j].gamma_w * reax->sbp[i].gamma_w); + + reax->tbp[i][j].gamma = reax->tbp[j][i].gamma = + pow(reax->sbp[j].gamma * reax->sbp[i].gamma,-1.5); + + // additions for additional vdWaals interaction types - inner core + + reax->tbp[i][j].rcore = reax->tbp[j][i].rcore = + sqrt(reax->sbp[i].rcore2 * reax->sbp[j].rcore2); + + reax->tbp[i][j].ecore = reax->tbp[j][i].ecore = + sqrt(reax->sbp[i].ecore2 * reax->sbp[j].ecore2); + + reax->tbp[i][j].acore = reax->tbp[j][i].acore = + sqrt(reax->sbp[i].acore2 * reax->sbp[j].acore2); + + // additions for additional vdWalls interaction types lg correction + + reax->tbp[i][j].lgcij = reax->tbp[j][i].lgcij = + sqrt(reax->sbp[i].lgcij * reax->sbp[j].lgcij); + + reax->tbp[i][j].lgre = reax->tbp[j][i].lgre + = 2.0 * reax->gp.l[35] * sqrt(reax->sbp[i].lgre*reax->sbp[j].lgre); + } + } + + // next line is number of two body off-diagonal parameters + + values = reader.next_values(0); + n = values.next_int(); + ++lineno; + + double val; + for (i = 0; i < n; ++i) { + values = reader.next_values(0); + ++lineno; + if ((int)values.count() < 8 + lgflag) + THROW_ERROR("Invalid force field file format"); + + j = values.next_int() - 1; + k = values.next_int() - 1; + + if ((j < 0) || (k < 0)) + THROW_ERROR("Inconsistent force field file"); + + if ((j < ntypes) && (k < ntypes)) { + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].D = reax->tbp[k][j].D = val; + + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].r_vdW = reax->tbp[k][j].r_vdW = 2*val; + + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].alpha = reax->tbp[k][j].alpha = val; + + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].r_s = reax->tbp[k][j].r_s = val; + + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].r_p = reax->tbp[k][j].r_p = val; + + val = values.next_double(); + if (val > 0.0) reax->tbp[j][k].r_pp = reax->tbp[k][j].r_pp = val; + + if (lgflag) { + val = values.next_double(); + if (val >= 0.0) reax->tbp[j][k].lgcij = reax->tbp[k][j].lgcij = val; + } + } + } + + // next line is number of three body parameters + + values = reader.next_values(0); + n = values.next_int(); + ++lineno; + + int cnt; + for (i = 0; i < n; ++i) { + values = reader.next_values(0); + ++lineno; + if (values.count() < 10) + THROW_ERROR("Invalid force field file format"); + + j = values.next_int() - 1; + k = values.next_int() - 1; + l = values.next_int() - 1; + + if ((j < 0) || (k < 0) || (l < 0)) + THROW_ERROR("Inconsistent force field file"); + + if ((j < ntypes) && (k < ntypes) && (l < ntypes)) { + + cnt = reax->thbp[j][k][l].cnt; + reax->thbp[j][k][l].cnt++; + reax->thbp[l][k][j].cnt++; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].theta_00 = val; + reax->thbp[l][k][j].prm[cnt].theta_00 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_val1 = val; + reax->thbp[l][k][j].prm[cnt].p_val1 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_val2 = val; + reax->thbp[l][k][j].prm[cnt].p_val2 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_coa1 = val; + reax->thbp[l][k][j].prm[cnt].p_coa1 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_val7 = val; + reax->thbp[l][k][j].prm[cnt].p_val7 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_pen1 = val; + reax->thbp[l][k][j].prm[cnt].p_pen1 = val; + + val = values.next_double(); + reax->thbp[j][k][l].prm[cnt].p_val4 = val; + reax->thbp[l][k][j].prm[cnt].p_val4 = val; + } + } + + // next line is number of four body parameters + + values = reader.next_values(0); + n = values.next_int(); + ++lineno; + + for (i = 0; i < n; ++i) { + values = reader.next_values(0); + ++lineno; + if (values.count() < 9) + THROW_ERROR("Invalid force field file format"); + + j = values.next_int() - 1; + k = values.next_int() - 1; + l = values.next_int() - 1; + m = values.next_int() - 1; + + if ((j < -1) || (k < 0) || (l < 0) || (m < -1)) + THROW_ERROR("Inconsistent force field file"); + + if ((j >= 0) && (m >= 0)) { // this means the entry is not in compact form + + if ((j < ntypes) && (k < ntypes) && (l < ntypes) && (m < ntypes)) { + + tor_flag[j][k][l][m] = 1; + tor_flag[m][l][k][j] = 1; + + reax->fbp[j][k][l][m].cnt = 1; + reax->fbp[m][l][k][j].cnt = 1; + + val = values.next_double(); + reax->fbp[j][k][l][m].prm[0].V1 = val; + reax->fbp[m][l][k][j].prm[0].V1 = val; + + val = values.next_double(); + reax->fbp[j][k][l][m].prm[0].V2 = val; + reax->fbp[m][l][k][j].prm[0].V2 = val; + + val = values.next_double(); + reax->fbp[j][k][l][m].prm[0].V3 = val; + reax->fbp[m][l][k][j].prm[0].V3 = val; + + val = values.next_double(); + reax->fbp[j][k][l][m].prm[0].p_tor1 = val; + reax->fbp[m][l][k][j].prm[0].p_tor1 = val; + + val = values.next_double(); + reax->fbp[j][k][l][m].prm[0].p_cot1 = val; + reax->fbp[m][l][k][j].prm[0].p_cot1 = val; + } + + } else { /* This means the entry is of the form 0-X-Y-0 */ + + if ((k < ntypes) && (l < ntypes)) { + const double val1 = values.next_double(); + const double val2 = values.next_double(); + const double val3 = values.next_double(); + const double val4 = values.next_double(); + const double val5 = values.next_double(); + + for (int p = 0; p < ntypes; ++p) { + for (int o = 0; o < ntypes; ++o) { + reax->fbp[p][k][l][o].cnt = 1; + reax->fbp[o][l][k][p].cnt = 1; + + if (tor_flag[p][k][l][o] == 0) { + reax->fbp[p][k][l][o].prm[0].V1 = val1; + reax->fbp[p][k][l][o].prm[0].V2 = val2; + reax->fbp[p][k][l][o].prm[0].V3 = val3; + reax->fbp[p][k][l][o].prm[0].p_tor1 = val4; + reax->fbp[p][k][l][o].prm[0].p_cot1 = val5; + } + + if (tor_flag[o][l][k][p] == 0) { + reax->fbp[o][l][k][p].prm[0].V1 = val1; + reax->fbp[o][l][k][p].prm[0].V2 = val2; + reax->fbp[o][l][k][p].prm[0].V3 = val3; + reax->fbp[o][l][k][p].prm[0].p_tor1 = val4; + reax->fbp[o][l][k][p].prm[0].p_cot1 = val5; + } + } + } + } + } + } + + // next line is number of hydrogen bond parameters + + values = reader.next_values(0); + n = values.next_int(); + ++lineno; + + for (i = 0; i < ntypes; ++i) + for (j = 0; j < ntypes; ++j) + for (k = 0; k < ntypes; ++k) + reax->hbp[i][j][k].r0_hb = -1.0; + + for (i = 0; i < n; ++i) { + values = reader.next_values(0); + ++lineno; + if (values.count() < 7) + THROW_ERROR("Invalid force field file format"); + + j = values.next_int() - 1; + k = values.next_int() - 1; + l = values.next_int() - 1; + + if ((j < 0) || (k < 0) || (l < 0)) + THROW_ERROR("Inconsistent force field file"); + + if ((j < ntypes) && (k < ntypes) && (l < ntypes)) { + reax->hbp[j][k][m].r0_hb = values.next_double(); + reax->hbp[j][k][m].p_hb1 = values.next_double(); + reax->hbp[j][k][m].p_hb2 = values.next_double(); + reax->hbp[j][k][m].p_hb3 = values.next_double(); + } + } + + memory->destroy(tor_flag); + } catch (std::exception &e) { + error->one(FLERR,e.what()); + } } - reax->gp.n_global = n; - reax->gp.l = (double*) malloc(sizeof(double)*n); + // broadcast global parameters and allocate list on ranks != 0 + MPI_Bcast(&reax->gp,sizeof(global_parameters),MPI_CHAR,0,world); + if (control->me != 0) memory->create(reax->gp.l,reax->gp.n_global,"reaxff:gp.l"); + MPI_Bcast(reax->gp.l,reax->gp.n_global,MPI_DOUBLE,0,world); - /* see reax_types.h for mapping between l[i] and the lambdas used in ff */ - for (i=0; i < n; i++) { - fgets(s,MAX_LINE,fp); - c = Tokenize(s,&tmp); - - val = (double) atof(tmp[0]); - reax->gp.l[i] = val; + // allocate storage for atom type based data + MPI_Bcast(&reax->num_atom_types,1,MPI_INT,0,world); + if (control->me != 0) { + const int n = reax->num_atom_types; + memory->create(reax->sbp,n,"reaxff:sbp"); + memory->create(reax->tbp,n,n,"reaxff:tbp"); + memory->create(reax->thbp,n,n,n,"reaxff:thbp"); + memory->create(reax->hbp,n,n,n,"reaxff:hbp"); + memory->create(reax->fbp,n,n,n,n,"reaxff:fbp"); } + // broadcast type specific force field data + const int n = reax->num_atom_types; + MPI_Bcast(&(reax->sbp[0]),sizeof(single_body_parameters)*n,MPI_CHAR,0,world); + MPI_Bcast(&(reax->tbp[0][0]),sizeof(two_body_parameters)*n*n,MPI_CHAR,0,world); + MPI_Bcast(&(reax->thbp[0][0][0]),sizeof(three_body_header)*n*n*n,MPI_CHAR,0,world); + MPI_Bcast(&(reax->hbp[0][0][0]),sizeof(hbond_parameters)*n*n*n,MPI_CHAR,0,world); + MPI_Bcast(&(reax->fbp[0][0][0][0]),sizeof(four_body_header)*n*n*n*n,MPI_CHAR,0,world); + + // apply parameters to various settings + control->bo_cut = 0.01 * reax->gp.l[29]; control->nonb_low = reax->gp.l[11]; control->nonb_cut = reax->gp.l[12]; - - /* next line is number of atom types and some comments */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - reax->num_atom_types = atoi(tmp[0]); - - /* 3 lines of comments */ - fgets(s,MAX_LINE,fp); - fgets(s,MAX_LINE,fp); - fgets(s,MAX_LINE,fp); - - /* Allocating structures in reax_interaction */ - reax->sbp = (single_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp"); - reax->tbp = (two_body_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp"); - reax->thbp= (three_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp"); - reax->hbp = (hbond_parameters***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp"); - reax->fbp = (four_body_header****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp"); - tor_flag = (char****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag"); - - for (i = 0; i < reax->num_atom_types; i++) { - reax->tbp[i] = (two_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]"); - reax->thbp[i]= (three_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]"); - reax->hbp[i] = (hbond_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]"); - reax->fbp[i] = (four_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]"); - tor_flag[i] = (char***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]"); - - for (j = 0; j < reax->num_atom_types; j++) { - reax->thbp[i][j]= (three_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]"); - reax->hbp[i][j] = (hbond_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]"); - reax->fbp[i][j] = (four_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]"); - tor_flag[i][j] = (char**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]"); - - for (k=0; k < reax->num_atom_types; k++) { - reax->fbp[i][j][k] = (four_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]"); - tor_flag[i][j][k] = (char*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]"); - } - } - } - - reax->gp.vdw_type = 0; - - char errmsg[1024]; - - for (i = 0; i < reax->num_atom_types; i++) { - /* line one */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - /* Sanity checks */ - if (c == 2 && !lgflag) - control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); - - if (c < 9) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - for (j = 0; j < (int)(strlen(tmp[0])); ++j) - reax->sbp[i].name[j] = toupper(tmp[0][j]); - - val = atof(tmp[1]); reax->sbp[i].r_s = val; - val = atof(tmp[2]); reax->sbp[i].valency = val; - val = atof(tmp[3]); reax->sbp[i].mass = val; - val = atof(tmp[4]); reax->sbp[i].r_vdw = val; - val = atof(tmp[5]); reax->sbp[i].epsilon = val; - val = atof(tmp[6]); reax->sbp[i].gamma = val; - val = atof(tmp[7]); reax->sbp[i].r_pi = val; - val = atof(tmp[8]); reax->sbp[i].valency_e = val; - reax->sbp[i].nlp_opt = 0.5 * (reax->sbp[i].valency_e-reax->sbp[i].valency); - - /* line two */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].alpha = val; - val = atof(tmp[1]); reax->sbp[i].gamma_w = val; - val = atof(tmp[2]); reax->sbp[i].valency_boc= val; - val = atof(tmp[3]); reax->sbp[i].p_ovun5 = val; - val = atof(tmp[4]); - val = atof(tmp[5]); reax->sbp[i].chi = val; - val = atof(tmp[6]); reax->sbp[i].eta = 2.0 * val; - val = atof(tmp[7]); reax->sbp[i].p_hbond = (int) val; - - /* line 3 */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; - val = atof(tmp[1]); reax->sbp[i].p_lp2 = val; - val = atof(tmp[2]); - val = atof(tmp[3]); reax->sbp[i].b_o_131 = val; - val = atof(tmp[4]); reax->sbp[i].b_o_132 = val; - val = atof(tmp[5]); reax->sbp[i].b_o_133 = val; - val = atof(tmp[6]); - val = atof(tmp[7]); - - /* line 4 */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - /* Sanity check */ - if (c < 8) { - snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); - control->error_ptr->all(FLERR, errmsg); - } - - val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; - val = atof(tmp[1]); reax->sbp[i].p_val3 = val; - val = atof(tmp[2]); - val = atof(tmp[3]); reax->sbp[i].valency_val= val; - val = atof(tmp[4]); reax->sbp[i].p_val5 = val; - val = atof(tmp[5]); reax->sbp[i].rcore2 = val; - val = atof(tmp[6]); reax->sbp[i].ecore2 = val; - val = atof(tmp[7]); reax->sbp[i].acore2 = val; - - /* line 5, only if lgvdw is yes */ - if (lgflag) { - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - /* Sanity check */ - if (c > 2) { - control->error_ptr->all(FLERR,"Force field file incompatible with 'lgvdw yes'"); - } - - val = atof(tmp[0]); reax->sbp[i].lgcij = val; - val = atof(tmp[1]); reax->sbp[i].lgre = val; - } - - if (reax->sbp[i].rcore2>0.01 && reax->sbp[i].acore2>0.01) { // Inner-wall - if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { - if (errorflag && (me == 0)) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals-parameters for element %s " - "indicate inner wall+shielding, but earlier " - "atoms indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - errorflag = 0; - } else { - reax->gp.vdw_type = 3; - } - } else { // No shielding vdWaals parameters present - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 2) { - if (me == 0) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals-parameters for element %s " - "indicate inner wall without shielding, but earlier " - "atoms indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - } else { - reax->gp.vdw_type = 2; - } - } - } else { // No Inner wall parameters present - if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 1) { - if (me == 0) { - char errmsg[512]; - snprintf(errmsg, 512, "VdWaals parameters for element %s " - "indicate shielding without inner wall, but earlier " - "elements indicate different vdWaals-method. " - "This may cause division-by-zero errors. " - "Keeping vdWaals-setting for earlier atoms.", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - } else { - reax->gp.vdw_type = 1; - } - } else { - char errmsg[256]; - snprintf(errmsg, 256, "Inconsistent vdWaals-parameters: " - "No shielding or inner-wall set for element %s", - reax->sbp[i].name); - control->error_ptr->all(FLERR, errmsg); - } - } - } - - /* Equate vval3 to valf for first-row elements (25/10/2004) */ - for (i = 0; i < reax->num_atom_types; i++) - if (reax->sbp[i].mass < 21 && - reax->sbp[i].valency_val != reax->sbp[i].valency_boc) { - if (me == 0) { - char errmsg[256]; - snprintf(errmsg, 256, "Changed valency_val to valency_boc for %s", - reax->sbp[i].name); - control->error_ptr->warning(FLERR,errmsg); - } - reax->sbp[i].valency_val = reax->sbp[i].valency_boc; - } - - /* next line is number of two body combination and some comments */ - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - if (c == 2 && !lgflag) { - control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); - } - - l = atoi(tmp[0]); - - /* a line of comments */ - fgets(s,MAX_LINE,fp); - - for (i=0; i < l; i++) { - /* line 1 */ - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - if ((c < 10) || (j < 0) || (k < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types) { - - val = atof(tmp[2]); reax->tbp[j][k].De_s = val; - reax->tbp[k][j].De_s = val; - val = atof(tmp[3]); reax->tbp[j][k].De_p = val; - reax->tbp[k][j].De_p = val; - val = atof(tmp[4]); reax->tbp[j][k].De_pp = val; - reax->tbp[k][j].De_pp = val; - val = atof(tmp[5]); reax->tbp[j][k].p_be1 = val; - reax->tbp[k][j].p_be1 = val; - val = atof(tmp[6]); reax->tbp[j][k].p_bo5 = val; - reax->tbp[k][j].p_bo5 = val; - val = atof(tmp[7]); reax->tbp[j][k].v13cor = val; - reax->tbp[k][j].v13cor = val; - - val = atof(tmp[8]); reax->tbp[j][k].p_bo6 = val; - reax->tbp[k][j].p_bo6 = val; - val = atof(tmp[9]); reax->tbp[j][k].p_ovun1 = val; - reax->tbp[k][j].p_ovun1 = val; - - /* line 2 */ - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - if (c < 8) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - val = atof(tmp[0]); reax->tbp[j][k].p_be2 = val; - reax->tbp[k][j].p_be2 = val; - val = atof(tmp[1]); reax->tbp[j][k].p_bo3 = val; - reax->tbp[k][j].p_bo3 = val; - val = atof(tmp[2]); reax->tbp[j][k].p_bo4 = val; - reax->tbp[k][j].p_bo4 = val; - val = atof(tmp[3]); - - val = atof(tmp[4]); reax->tbp[j][k].p_bo1 = val; - reax->tbp[k][j].p_bo1 = val; - val = atof(tmp[5]); reax->tbp[j][k].p_bo2 = val; - reax->tbp[k][j].p_bo2 = val; - val = atof(tmp[6]); reax->tbp[j][k].ovc = val; - reax->tbp[k][j].ovc = val; - - val = atof(tmp[7]); - } - } - - for (i=0; i < reax->num_atom_types; i++) - for (j=i; j < reax->num_atom_types; j++) { - reax->tbp[i][j].r_s = 0.5 * - (reax->sbp[i].r_s + reax->sbp[j].r_s); - reax->tbp[j][i].r_s = 0.5 * - (reax->sbp[j].r_s + reax->sbp[i].r_s); - - reax->tbp[i][j].r_p = 0.5 * - (reax->sbp[i].r_pi + reax->sbp[j].r_pi); - reax->tbp[j][i].r_p = 0.5 * - (reax->sbp[j].r_pi + reax->sbp[i].r_pi); - - reax->tbp[i][j].r_pp = 0.5 * - (reax->sbp[i].r_pi_pi + reax->sbp[j].r_pi_pi); - reax->tbp[j][i].r_pp = 0.5 * - (reax->sbp[j].r_pi_pi + reax->sbp[i].r_pi_pi); - - - reax->tbp[i][j].p_boc3 = - sqrt(reax->sbp[i].b_o_132 * - reax->sbp[j].b_o_132); - reax->tbp[j][i].p_boc3 = - sqrt(reax->sbp[j].b_o_132 * - reax->sbp[i].b_o_132); - - reax->tbp[i][j].p_boc4 = - sqrt(reax->sbp[i].b_o_131 * - reax->sbp[j].b_o_131); - reax->tbp[j][i].p_boc4 = - sqrt(reax->sbp[j].b_o_131 * - reax->sbp[i].b_o_131); - - reax->tbp[i][j].p_boc5 = - sqrt(reax->sbp[i].b_o_133 * - reax->sbp[j].b_o_133); - reax->tbp[j][i].p_boc5 = - sqrt(reax->sbp[j].b_o_133 * - reax->sbp[i].b_o_133); - - - reax->tbp[i][j].D = - sqrt(reax->sbp[i].epsilon * - reax->sbp[j].epsilon); - - reax->tbp[j][i].D = - sqrt(reax->sbp[j].epsilon * - reax->sbp[i].epsilon); - - reax->tbp[i][j].alpha = - sqrt(reax->sbp[i].alpha * - reax->sbp[j].alpha); - - reax->tbp[j][i].alpha = - sqrt(reax->sbp[j].alpha * - reax->sbp[i].alpha); - - reax->tbp[i][j].r_vdW = - 2.0 * sqrt(reax->sbp[i].r_vdw * reax->sbp[j].r_vdw); - - reax->tbp[j][i].r_vdW = - 2.0 * sqrt(reax->sbp[j].r_vdw * reax->sbp[i].r_vdw); - - reax->tbp[i][j].gamma_w = - sqrt(reax->sbp[i].gamma_w * - reax->sbp[j].gamma_w); - - reax->tbp[j][i].gamma_w = - sqrt(reax->sbp[j].gamma_w * - reax->sbp[i].gamma_w); - - reax->tbp[i][j].gamma = - pow(reax->sbp[i].gamma * - reax->sbp[j].gamma,-1.5); - - reax->tbp[j][i].gamma = - pow(reax->sbp[j].gamma * - reax->sbp[i].gamma,-1.5); - - // additions for additional vdWaals interaction types - inner core - - reax->tbp[i][j].rcore = reax->tbp[j][i].rcore = - sqrt(reax->sbp[i].rcore2 * reax->sbp[j].rcore2); - - reax->tbp[i][j].ecore = reax->tbp[j][i].ecore = - sqrt(reax->sbp[i].ecore2 * reax->sbp[j].ecore2); - - reax->tbp[i][j].acore = reax->tbp[j][i].acore = - sqrt(reax->sbp[i].acore2 * reax->sbp[j].acore2); - - // additions for additional vdWalls interaction types lg correction - - reax->tbp[i][j].lgcij = reax->tbp[j][i].lgcij = - sqrt(reax->sbp[i].lgcij * reax->sbp[j].lgcij); - - reax->tbp[i][j].lgre = reax->tbp[j][i].lgre = 2.0 * reax->gp.l[35] * - sqrt(reax->sbp[i].lgre*reax->sbp[j].lgre); - - } - - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - l = atoi(tmp[0]); - - for (i=0; i < l; i++) { - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - - if ((c < (lgflag ? 9 : 8)) || (j < 0) || (k < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types) { - val = atof(tmp[2]); - if (val > 0.0) { - reax->tbp[j][k].D = val; - reax->tbp[k][j].D = val; - } - - val = atof(tmp[3]); - if (val > 0.0) { - reax->tbp[j][k].r_vdW = 2 * val; - reax->tbp[k][j].r_vdW = 2 * val; - } - - val = atof(tmp[4]); - if (val > 0.0) { - reax->tbp[j][k].alpha = val; - reax->tbp[k][j].alpha = val; - } - - val = atof(tmp[5]); - if (val > 0.0) { - reax->tbp[j][k].r_s = val; - reax->tbp[k][j].r_s = val; - } - - val = atof(tmp[6]); - if (val > 0.0) { - reax->tbp[j][k].r_p = val; - reax->tbp[k][j].r_p = val; - } - - val = atof(tmp[7]); - if (val > 0.0) { - reax->tbp[j][k].r_pp = val; - reax->tbp[k][j].r_pp = val; - } - - if (lgflag) { - val = atof(tmp[8]); - if (val >= 0.0) { - reax->tbp[j][k].lgcij = val; - reax->tbp[k][j].lgcij = val; - } - } - } - } - - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - reax->thbp[i][j][k].cnt = 0; - - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - l = atoi(tmp[0]); - - for (i = 0; i < l; i++) { - fgets(s,MAX_LINE,fp); - c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - if ((c < 10) || (j < 0) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && k < reax->num_atom_types && - m < reax->num_atom_types) { - cnt = reax->thbp[j][k][m].cnt; - reax->thbp[j][k][m].cnt++; - reax->thbp[m][k][j].cnt++; - - val = atof(tmp[3]); - reax->thbp[j][k][m].prm[cnt].theta_00 = val; - reax->thbp[m][k][j].prm[cnt].theta_00 = val; - - val = atof(tmp[4]); - reax->thbp[j][k][m].prm[cnt].p_val1 = val; - reax->thbp[m][k][j].prm[cnt].p_val1 = val; - - val = atof(tmp[5]); - reax->thbp[j][k][m].prm[cnt].p_val2 = val; - reax->thbp[m][k][j].prm[cnt].p_val2 = val; - - val = atof(tmp[6]); - reax->thbp[j][k][m].prm[cnt].p_coa1 = val; - reax->thbp[m][k][j].prm[cnt].p_coa1 = val; - - val = atof(tmp[7]); - reax->thbp[j][k][m].prm[cnt].p_val7 = val; - reax->thbp[m][k][j].prm[cnt].p_val7 = val; - - val = atof(tmp[8]); - reax->thbp[j][k][m].prm[cnt].p_pen1 = val; - reax->thbp[m][k][j].prm[cnt].p_pen1 = val; - - val = atof(tmp[9]); - reax->thbp[j][k][m].prm[cnt].p_val4 = val; - reax->thbp[m][k][j].prm[cnt].p_val4 = val; - } - } - - /* clear all entries first */ - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - for (m = 0; m < reax->num_atom_types; ++m) { - reax->fbp[i][j][k][m].cnt = 0; - tor_flag[i][j][k][m] = 0; - } - - /* next line is number of 4-body params and some comments */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - l = atoi(tmp[0]); - - for (i = 0; i < l; i++) { - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - n = atoi(tmp[3]) - 1; - if ((c < 9) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j >= 0 && n >= 0) { // this means the entry is not in compact form - if (j < reax->num_atom_types && k < reax->num_atom_types && - m < reax->num_atom_types && n < reax->num_atom_types) { - tor_flag[j][k][m][n] = 1; - tor_flag[n][m][k][j] = 1; - - reax->fbp[j][k][m][n].cnt = 1; - reax->fbp[n][m][k][j].cnt = 1; - - val = atof(tmp[4]); - reax->fbp[j][k][m][n].prm[0].V1 = val; - reax->fbp[n][m][k][j].prm[0].V1 = val; - - val = atof(tmp[5]); - reax->fbp[j][k][m][n].prm[0].V2 = val; - reax->fbp[n][m][k][j].prm[0].V2 = val; - - val = atof(tmp[6]); - reax->fbp[j][k][m][n].prm[0].V3 = val; - reax->fbp[n][m][k][j].prm[0].V3 = val; - - val = atof(tmp[7]); - reax->fbp[j][k][m][n].prm[0].p_tor1 = val; - reax->fbp[n][m][k][j].prm[0].p_tor1 = val; - - val = atof(tmp[8]); - reax->fbp[j][k][m][n].prm[0].p_cot1 = val; - reax->fbp[n][m][k][j].prm[0].p_cot1 = val; - } - } else { /* This means the entry is of the form 0-X-Y-0 */ - if (k < reax->num_atom_types && m < reax->num_atom_types) - for (p = 0; p < reax->num_atom_types; p++) - for (o = 0; o < reax->num_atom_types; o++) { - reax->fbp[p][k][m][o].cnt = 1; - reax->fbp[o][m][k][p].cnt = 1; - - if (tor_flag[p][k][m][o] == 0) { - reax->fbp[p][k][m][o].prm[0].V1 = atof(tmp[4]); - reax->fbp[p][k][m][o].prm[0].V2 = atof(tmp[5]); - reax->fbp[p][k][m][o].prm[0].V3 = atof(tmp[6]); - reax->fbp[p][k][m][o].prm[0].p_tor1 = atof(tmp[7]); - reax->fbp[p][k][m][o].prm[0].p_cot1 = atof(tmp[8]); - } - - if (tor_flag[o][m][k][p] == 0) { - reax->fbp[o][m][k][p].prm[0].V1 = atof(tmp[4]); - reax->fbp[o][m][k][p].prm[0].V2 = atof(tmp[5]); - reax->fbp[o][m][k][p].prm[0].V3 = atof(tmp[6]); - reax->fbp[o][m][k][p].prm[0].p_tor1 = atof(tmp[7]); - reax->fbp[o][m][k][p].prm[0].p_cot1 = atof(tmp[8]); - } - } - } - } - - /* next line is number of hydrogen bond params and some comments */ - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - l = atoi(tmp[0]); - - for (i = 0; i < reax->num_atom_types; ++i) - for (j = 0; j < reax->num_atom_types; ++j) - for (k = 0; k < reax->num_atom_types; ++k) - reax->hbp[i][j][k].r0_hb = -1.0; - - for (i = 0; i < l; i++) { - fgets(s, MAX_LINE, fp); - c = Tokenize(s, &tmp); - - j = atoi(tmp[0]) - 1; - k = atoi(tmp[1]) - 1; - m = atoi(tmp[2]) - 1; - if ((c < 7) || (j < 0) || (k < 0) || (m < 0)) - control->error_ptr->all(FLERR, "Inconsistent force field file"); - - if (j < reax->num_atom_types && m < reax->num_atom_types) { - val = atof(tmp[3]); - reax->hbp[j][k][m].r0_hb = val; - - val = atof(tmp[4]); - reax->hbp[j][k][m].p_hb1 = val; - - val = atof(tmp[5]); - reax->hbp[j][k][m].p_hb2 = val; - - val = atof(tmp[6]); - reax->hbp[j][k][m].p_hb3 = val; - } - } - - /* deallocate helper storage */ - for (i = 0; i < MAX_TOKENS; i++) - free(tmp[i]); - free(tmp); - free(s); - - - /* deallocate tor_flag */ - for (i = 0; i < reax->num_atom_types; i++) { - for (j = 0; j < reax->num_atom_types; j++) { - for (k = 0; k < reax->num_atom_types; k++) { - free(tor_flag[i][j][k]); - } - free(tor_flag[i][j]); - } - free(tor_flag[i]); - } - free(tor_flag); - - // close file - - fclose(fp); } +#undef THROW_ERROR } diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index dda2161c86..cafc3516fd 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -68,7 +68,8 @@ namespace ReaxFF // ffield - extern void Read_Force_Field(const char *, reax_interaction *, control_params *); + extern void Read_Force_Field(const char *, reax_interaction *, + control_params *, MPI_Comm); // forces diff --git a/src/text_file_reader.h b/src/text_file_reader.h index 1b978fabfa..4467bca269 100644 --- a/src/text_file_reader.h +++ b/src/text_file_reader.h @@ -39,9 +39,9 @@ namespace LAMMPS_NS ~TextFileReader(); void skip_line(); - char * next_line(int nparams = 0); + char *next_line(int nparams = 0); - void next_dvector(double * list, int n); + void next_dvector(double *list, int n); ValueTokenizer next_values(int nparams, const std::string &separators = TOKENIZER_DEFAULT_SEPARATORS); }; From eaa064e01d26f576e673e2c2026e5a2958e9a0f9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 02:35:08 -0400 Subject: [PATCH 045/352] remove unused tokenizer function --- src/USER-REAXC/reaxc_ffield.cpp | 2 -- src/USER-REAXC/reaxc_tool_box.cpp | 22 ++-------------------- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 3cbb4a6f82..db7b27c235 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -47,8 +47,6 @@ namespace ReaxFF { const char *what() const noexcept { return message.c_str(); } }; - extern int Tokenize(char* s, char*** tok); - void Read_Force_Field(const char *filename, reax_interaction *reax, control_params *control, MPI_Comm world) { diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index bfaa6b94aa..318e2d5813 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -34,24 +34,7 @@ namespace ReaxFF { - int Tokenize(char* s, char*** tok) - { - char test[MAX_LINE]; - const char *sep = (const char *)"\t \n\r\f!="; - char *word; - int count=0; - - strncpy(test, s, MAX_LINE-1); - - for (word = strtok(test, sep); word; word = strtok(nullptr, sep)) { - strncpy((*tok)[count], word, MAX_LINE); - count++; - } - - return count; - } - -/* safe malloc */ + /* safe malloc */ void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name) { void *ptr; @@ -76,7 +59,7 @@ namespace ReaxFF { return ptr; } -/* safe calloc */ + /* safe calloc */ void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name) { void *ptr; @@ -108,7 +91,6 @@ namespace ReaxFF { return ptr; } - /* safe free */ void sfree(LAMMPS_NS::Error* error_ptr, void *ptr, const char *name) { From ab3303ed7ba5f1ed457ce8c947f12c6e8d20670a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 02:45:23 -0400 Subject: [PATCH 046/352] fix indexing bug for hydrogen bond parameters --- src/USER-REAXC/reaxc_ffield.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index db7b27c235..8f857ea343 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -601,10 +601,10 @@ namespace ReaxFF { THROW_ERROR("Inconsistent force field file"); if ((j < ntypes) && (k < ntypes) && (l < ntypes)) { - reax->hbp[j][k][m].r0_hb = values.next_double(); - reax->hbp[j][k][m].p_hb1 = values.next_double(); - reax->hbp[j][k][m].p_hb2 = values.next_double(); - reax->hbp[j][k][m].p_hb3 = values.next_double(); + reax->hbp[j][k][l].r0_hb = values.next_double(); + reax->hbp[j][k][l].p_hb1 = values.next_double(); + reax->hbp[j][k][l].p_hb2 = values.next_double(); + reax->hbp[j][k][l].p_hb3 = values.next_double(); } } From 6f343aaeed608b44fcefef417bbaf8c1c0709a79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:02:18 -0400 Subject: [PATCH 047/352] add UNITS keyword comments to fix qeq parameter files --- examples/qeq/param.qeq1 | 1 + examples/qeq/param.qeq2 | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/qeq/param.qeq1 b/examples/qeq/param.qeq1 index 9c8514b021..b49705194c 100644 --- a/examples/qeq/param.qeq1 +++ b/examples/qeq/param.qeq1 @@ -1,3 +1,4 @@ +# UNITS: real 1 5.3200 14.8732 1.0206 0.0 0.0 2 5.8678 14.0000 0.9000 0.0 0.0 3 8.5000 17.9978 1.0503 0.0 0.0 diff --git a/examples/qeq/param.qeq2 b/examples/qeq/param.qeq2 index 7e2fdeb8f2..1d77b7d3a6 100644 --- a/examples/qeq/param.qeq2 +++ b/examples/qeq/param.qeq2 @@ -1,2 +1,3 @@ +# UNITS: metal 1 0.00000 7.25028 0.01 0.772871 0.000000 2 11.26882 15.37920 0.01 0.243072 0.000000 From 6bc6da765792648f1f88fd373ba3334cf01c9b8c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:04:40 -0400 Subject: [PATCH 048/352] throw EOF exception in TextFileReader::next_values() if next_line() doesn't do it --- src/text_file_reader.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp index 57aaaf6bb5..c1dbfb3db8 100644 --- a/src/text_file_reader.cpp +++ b/src/text_file_reader.cpp @@ -175,5 +175,8 @@ void TextFileReader::next_dvector(double * list, int n) { * \return ValueTokenizer object for read in text */ ValueTokenizer TextFileReader::next_values(int nparams, const std::string &separators) { - return ValueTokenizer(next_line(nparams), separators); + char *ptr = next_line(nparams); + if (ptr == nullptr) + throw EOFException(fmt::format("Missing line in {} file!", filetype)); + return ValueTokenizer(line, separators); } From 09d7fe2fcf4da52ed52a83995b37363ac0245f8b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:05:01 -0400 Subject: [PATCH 049/352] don't ignore comments in ReaxFF force field files --- src/USER-REAXC/reaxc_ffield.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 8f857ea343..67b11bee05 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -66,6 +66,7 @@ namespace ReaxFF { error->one(FLERR,fmt::format("The ReaxFF parameter file {} cannot be opened: {}", filename, getsyserror())); LAMMPS_NS::TextFileReader reader(fp, "ReaxFF parameter"); + reader.ignore_comments = false; try { int i,j,k,l,m,n,lineno = 0; From 242fc2d212d5026a34b914174d80d539ae55ee24 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:06:46 -0400 Subject: [PATCH 050/352] modernize parameter file parser in QEQ package --- src/QEQ/fix_qeq.cpp | 145 ++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 73 deletions(-) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index e592ed2af4..4504865303 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -24,16 +24,25 @@ #include "force.h" #include "memory.h" #include "neigh_list.h" +#include "text_file_reader.h" #include "update.h" #include #include +#include using namespace LAMMPS_NS; using namespace FixConst; #define MAXLINE 1024 +class parser_error : public std::exception { + std::string message; +public: + parser_error(const std::string &mesg) { message = mesg; } + const char *what() const noexcept { return message.c_str(); } +}; + /* ---------------------------------------------------------------------- */ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : @@ -184,21 +193,21 @@ void FixQEq::deallocate_storage() memory->destroy(s); memory->destroy(t); - memory->destroy( Hdia_inv ); - memory->destroy( b_s ); - memory->destroy( b_t ); + memory->destroy(Hdia_inv); + memory->destroy(b_s); + memory->destroy(b_t); - memory->destroy( p ); - memory->destroy( q ); - memory->destroy( r ); - memory->destroy( d ); + memory->destroy(p); + memory->destroy(q); + memory->destroy(r); + memory->destroy(d); - memory->destroy( chizj ); - memory->destroy( qf ); - memory->destroy( q1 ); - memory->destroy( q2 ); + memory->destroy(chizj); + memory->destroy(qf); + memory->destroy(q1); + memory->destroy(q2); - memory->destroy( qv ); + memory->destroy(qv); } /* ---------------------------------------------------------------------- */ @@ -224,7 +233,7 @@ void FixQEq::allocate_matrix() safezone = SAFE_ZONE; nlocal = atom->nlocal; - n_cap = MAX( (int)(nlocal * safezone), mincap ); + n_cap = MAX((int)(nlocal * safezone), mincap); nall = atom->nlocal + atom->nghost; // determine the total space for the H matrix @@ -687,13 +696,7 @@ void FixQEq::vector_add( double* dest, double c, double* v, int k ) void FixQEq::read_file(char *file) { - int i; - int params_per_line = 6; - char **words = new char*[params_per_line+1]; - - int ntypes = atom->ntypes; - int *setflag = new int[ntypes+1]; - for (i=0; i <= ntypes; ++i) setflag[i] = 0; + const int ntypes = atom->ntypes; memory->create(chi,ntypes+1,"qeq:chi"); memory->create(eta,ntypes+1,"qeq:eta"); @@ -701,70 +704,66 @@ void FixQEq::read_file(char *file) memory->create(zeta,ntypes+1,"qeq:zeta"); memory->create(zcore,ntypes+1,"qeq:zcore"); - // open file on proc 0 - - FILE *fp; - if (comm->me == 0) { - fp = utils::open_potential(file,lmp,nullptr); - if (fp == nullptr) - error->one(FLERR,fmt::format("Cannot open fix qeq parameter file {}: {}", - file,utils::getsyserror())); - } - // read each line out of file, skipping blank lines or leading '#' // store line of params if all 3 element tags are in element list - int n,nwords,eof,nlo,nhi; - char line[MAXLINE],*ptr; - - eof = 0; - - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + if (comm->me == 0) { + int *setflag = new int[ntypes+1]; + for (int n=0; n <= ntypes; ++n) { + setflag[n] = 0; + chi[n] = eta[n] = gamma[n] = zeta[n] = zcore[n] = 0.0; } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - // strip comment, skip line if blank + try { + int nlo,nhi; + double val; - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + FILE *fp = utils::open_potential(file,lmp,nullptr); + if (fp == nullptr) + throw parser_error(fmt::format("Cannot open fix qeq parameter file {}:" + " {}", file,utils::getsyserror())); + TextFileReader reader(fp, "qeq parameter"); - // must have 6 parameters per line. + while (1) { + auto values = reader.next_values(0); - if (nwords < 6) - error->all(FLERR,"Invalid fix qeq parameter file"); + if (values.count() == 0) continue; + if (values.count() < 6) + throw parser_error("Invalid qeq parameter file"); - // words = ptrs to first 6 words in line + auto word = values.next_string(); + utils::bounds(FLERR,word,1,ntypes,nlo,nhi,nullptr); + if ((nlo < 0) || (nhi < 0)) + throw parser_error("Invalid atom type range"); - for (n=0, words[n] = strtok(line," \t\n\r\f"); - n < 6; - words[++n] = strtok(nullptr," \t\n\r\f")); - - utils::bounds(FLERR,words[0],1,ntypes,nlo,nhi,error); - for (n=nlo; n <=nhi; ++n) { - chi[n] = utils::numeric(FLERR,words[1],false,lmp); - eta[n] = utils::numeric(FLERR,words[2],false,lmp); - gamma[n] = utils::numeric(FLERR,words[3],false,lmp); - zeta[n] = utils::numeric(FLERR,words[4],false,lmp); - zcore[n] = utils::numeric(FLERR,words[5],false,lmp); - setflag[n] = 1; + val = values.next_double(); + for (int n=nlo; n <= nhi; ++n) chi[n] = val; + val = values.next_double(); + for (int n=nlo; n <= nhi; ++n) eta[n] = val; + val = values.next_double(); + for (int n=nlo; n <= nhi; ++n) gamma[n] = val; + val = values.next_double(); + for (int n=nlo; n <= nhi; ++n) zeta[n] = val; + val = values.next_double(); + for (int n=nlo; n <= nhi; ++n) zcore[n] = val; + for (int n=nlo; n <= nhi; ++n) setflag[n] = 1; + } + } catch (EOFException &e) { + ; // catch and ignore to exit loop + } catch (std::exception &e) { + error->one(FLERR,e.what()); } + + for (int n=1; n <= ntypes; ++n) + if (setflag[n] == 0) + error->one(FLERR,fmt::format("Parameters for atom type {} missing in " + "qeq parameter file", n)); + delete[] setflag; } - // check if all types are set - for (n=1; n <= ntypes; ++n) - if (setflag[n] == 0) - error->all(FLERR,"Invalid fix qeq parameter file"); - - delete [] words; - delete [] setflag; + MPI_Bcast(chi,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(eta,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(gamma,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(zeta,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(zcore,ntypes+1,MPI_DOUBLE,0,world); } From 162e4e16a548667a2c2b5fbc62ae67fef8844688 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:15:58 -0400 Subject: [PATCH 051/352] fix incorrect indentation --- doc/src/Speed_kokkos.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst index 708678e537..8f9009aaca 100644 --- a/doc/src/Speed_kokkos.rst +++ b/doc/src/Speed_kokkos.rst @@ -27,7 +27,7 @@ GPUs) and HIP (for AMD GPUs). You choose the mode at build time to produce an executable compatible with a specific hardware. .. admonition:: C++14 support - :class: note + :class: note Kokkos requires using a compiler that supports the c++14 standard. For some compilers, it may be necessary to add a flag to enable c++14 support. From 238ed55313afb2b9d5c08fdabdde768b4b07567a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:33:06 -0400 Subject: [PATCH 052/352] small code tweaks and whitespace update --- src/USER-REAXC/fix_qeq_reax.cpp | 116 ++++++++++++++++---------------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index f37fa4ba4a..9c5b3b2958 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -222,8 +222,10 @@ void FixQEqReax::pertype_parameters(char *arg) memory->create(gamma,ntypes+1,"qeq/reax:gamma"); if (comm->me == 0) { + chi[0] = eta[0] = gamma[0] = 0.0; try { TextFileReader reader(arg,"qeq/reax parameter"); + reader.ignore_comments = false; for (int i = 1; i <= ntypes; i++) { const char *line = reader.next_line(); if (!line) @@ -246,9 +248,9 @@ void FixQEqReax::pertype_parameters(char *arg) } } - MPI_Bcast(&chi[1],ntypes,MPI_DOUBLE,0,world); - MPI_Bcast(&eta[1],ntypes,MPI_DOUBLE,0,world); - MPI_Bcast(&gamma[1],ntypes,MPI_DOUBLE,0,world); + MPI_Bcast(chi,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(eta,ntypes+1,MPI_DOUBLE,0,world); + MPI_Bcast(gamma,ntypes+1,MPI_DOUBLE,0,world); } /* ---------------------------------------------------------------------- */ @@ -283,16 +285,16 @@ void FixQEqReax::deallocate_storage() memory->destroy(s); memory->destroy(t); - memory->destroy( Hdia_inv ); - memory->destroy( b_s ); - memory->destroy( b_t ); - memory->destroy( b_prc ); - memory->destroy( b_prm ); + memory->destroy(Hdia_inv); + memory->destroy(b_s); + memory->destroy(b_t); + memory->destroy(b_prc); + memory->destroy(b_prm); - memory->destroy( p ); - memory->destroy( q ); - memory->destroy( r ); - memory->destroy( d ); + memory->destroy(p); + memory->destroy(q); + memory->destroy(r); + memory->destroy(d); } /* ---------------------------------------------------------------------- */ @@ -322,7 +324,7 @@ void FixQEqReax::allocate_matrix() } n = atom->nlocal; - n_cap = MAX( (int)(n * safezone), mincap); + n_cap = MAX((int)(n * safezone), mincap); // determine the total space for the H matrix @@ -331,7 +333,7 @@ void FixQEqReax::allocate_matrix() i = ilist[ii]; m += numneigh[i]; } - m_cap = MAX( (int)(m * safezone), mincap * REAX_MIN_NBRS); + m_cap = MAX((int)(m * safezone), mincap * REAX_MIN_NBRS); H.n = n_cap; H.m = m_cap; @@ -345,10 +347,10 @@ void FixQEqReax::allocate_matrix() void FixQEqReax::deallocate_matrix() { - memory->destroy( H.firstnbr ); - memory->destroy( H.numnbrs ); - memory->destroy( H.jlist ); - memory->destroy( H.val ); + memory->destroy(H.firstnbr); + memory->destroy(H.numnbrs); + memory->destroy(H.jlist); + memory->destroy(H.val); } /* ---------------------------------------------------------------------- */ @@ -405,7 +407,7 @@ void FixQEqReax::init_shielding() for (i = 1; i <= ntypes; ++i) for (j = 1; j <= ntypes; ++j) - shld[i][j] = pow( gamma[i] * gamma[j], -1.5); + shld[i][j] = pow(gamma[i] * gamma[j], -1.5); } /* ---------------------------------------------------------------------- */ @@ -421,11 +423,11 @@ void FixQEqReax::init_taper() else if (swb < 5 && comm->me == 0) error->warning(FLERR,"Fix qeq/reax has very low Taper radius cutoff"); - d7 = pow( swb - swa, 7); - swa2 = SQR( swa); - swa3 = CUBE( swa); - swb2 = SQR( swb); - swb3 = CUBE( swb); + d7 = pow(swb - swa, 7); + swa2 = SQR(swa); + swa3 = CUBE(swa); + swb2 = SQR(swb); + swb3 = CUBE(swb); Tap[7] = 20.0 / d7; Tap[6] = -70.0 * (swa + swb) / d7; @@ -581,7 +583,7 @@ void FixQEqReax::init_matvec() b_t[i] = -1.0; /* quadratic extrapolation for s & t from previous solutions */ - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1]); + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); /* cubic extrapolation for s & t from previous solutions */ s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); @@ -589,9 +591,9 @@ void FixQEqReax::init_matvec() } pack_flag = 2; - comm->forward_comm_fix(this); //Dist_vector( s ); + comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 3; - comm->forward_comm_fix(this); //Dist_vector( t ); + comm->forward_comm_fix(this); //Dist_vector(t); } /* ---------------------------------------------------------------------- */ @@ -643,7 +645,7 @@ void FixQEqReax::compute_H() if (flag) { H.jlist[m_fill] = j; - H.val[m_fill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]]); + H.val[m_fill] = calculate_H(sqrt(r_sqr), shld[type[i]][type[j]]); m_fill++; } } @@ -658,7 +660,7 @@ void FixQEqReax::compute_H() /* ---------------------------------------------------------------------- */ -double FixQEqReax::calculate_H( double r, double gamma) +double FixQEqReax::calculate_H(double r, double gamma) { double Taper, denom; @@ -678,7 +680,7 @@ double FixQEqReax::calculate_H( double r, double gamma) /* ---------------------------------------------------------------------- */ -int FixQEqReax::CG( double *b, double *x) +int FixQEqReax::CG(double *b, double *x) { int i, j; double tmp, alpha, beta, b_norm; @@ -687,10 +689,10 @@ int FixQEqReax::CG( double *b, double *x) int jj; pack_flag = 1; - sparse_matvec( &H, x, q); - comm->reverse_comm_fix(this); //Coll_Vector( q ); + sparse_matvec(&H, x, q); + comm->reverse_comm_fix(this); //Coll_Vector(q); - vector_sum( r , 1., b, -1., q, nn); + vector_sum(r , 1., b, -1., q, nn); for (jj = 0; jj < nn; ++jj) { j = ilist[jj]; @@ -698,19 +700,19 @@ int FixQEqReax::CG( double *b, double *x) d[j] = r[j] * Hdia_inv[j]; //pre-condition } - b_norm = parallel_norm( b, nn); - sig_new = parallel_dot( r, d, nn); + b_norm = parallel_norm(b, nn); + sig_new = parallel_dot(r, d, nn); for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i) { - comm->forward_comm_fix(this); //Dist_vector( d ); - sparse_matvec( &H, d, q ); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->forward_comm_fix(this); //Dist_vector(d); + sparse_matvec(&H, d, q); + comm->reverse_comm_fix(this); //Coll_vector(q); - tmp = parallel_dot( d, q, nn); + tmp = parallel_dot(d, q, nn); alpha = sig_new / tmp; - vector_add( x, alpha, d, nn ); - vector_add( r, -alpha, q, nn ); + vector_add(x, alpha, d, nn); + vector_add(r, -alpha, q, nn); // pre-conditioning for (jj = 0; jj < nn; ++jj) { @@ -720,10 +722,10 @@ int FixQEqReax::CG( double *b, double *x) } sig_old = sig_new; - sig_new = parallel_dot( r, p, nn); + sig_new = parallel_dot(r, p, nn); beta = sig_new / sig_old; - vector_sum( d, 1., p, beta, d, nn ); + vector_sum(d, 1., p, beta, d, nn); } if (i >= imax && comm->me == 0) @@ -736,7 +738,7 @@ int FixQEqReax::CG( double *b, double *x) /* ---------------------------------------------------------------------- */ -void FixQEqReax::sparse_matvec( sparse_matrix *A, double *x, double *b) +void FixQEqReax::sparse_matvec(sparse_matrix *A, double *x, double *b) { int i, j, itr_j; int ii; @@ -776,8 +778,8 @@ void FixQEqReax::calculate_Q() int ii; - s_sum = parallel_vector_acc( s, nn); - t_sum = parallel_vector_acc( t, nn); + s_sum = parallel_vector_acc(s, nn); + t_sum = parallel_vector_acc(t, nn); u = s_sum / t_sum; for (ii = 0; ii < nn; ++ii) { @@ -796,7 +798,7 @@ void FixQEqReax::calculate_Q() } pack_flag = 4; - comm->forward_comm_fix(this); //Dist_vector( atom->q ); + comm->forward_comm_fix(this); //Dist_vector(atom->q); } /* ---------------------------------------------------------------------- */ @@ -953,7 +955,7 @@ int FixQEqReax::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_norm( double *v, int n) +double FixQEqReax::parallel_norm(double *v, int n) { int i; double my_sum, norm_sqr; @@ -965,17 +967,17 @@ double FixQEqReax::parallel_norm( double *v, int n) for (ii = 0; ii < n; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) - my_sum += SQR( v[i]); + my_sum += SQR(v[i]); } - MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); - return sqrt( norm_sqr); + return sqrt(norm_sqr); } /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_dot( double *v1, double *v2, int n) +double FixQEqReax::parallel_dot(double *v1, double *v2, int n) { int i; double my_dot, res; @@ -990,14 +992,14 @@ double FixQEqReax::parallel_dot( double *v1, double *v2, int n) my_dot += v1[i] * v2[i]; } - MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_vector_acc( double *v, int n) +double FixQEqReax::parallel_vector_acc(double *v, int n) { int i; double my_acc, res; @@ -1012,14 +1014,14 @@ double FixQEqReax::parallel_vector_acc( double *v, int n) my_acc += v[i]; } - MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } /* ---------------------------------------------------------------------- */ -void FixQEqReax::vector_sum( double* dest, double c, double* v, +void FixQEqReax::vector_sum(double* dest, double c, double* v, double d, double* y, int k) { int kk; @@ -1033,7 +1035,7 @@ void FixQEqReax::vector_sum( double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEqReax::vector_add( double* dest, double c, double* v, int k) +void FixQEqReax::vector_add(double* dest, double c, double* v, int k) { int kk; From ab8d78c8f49250464843cf20a3078dbaa3e9ce58 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 04:33:52 -0400 Subject: [PATCH 053/352] convert control file reader code to use text file reader class --- src/USER-REAXC/reaxc_control.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index aacb043600..f33cf9ca48 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -28,7 +28,7 @@ #include "error.h" #include "utils.h" -#include "tokenizer.h" +#include "text_file_reader.h" #include #include @@ -60,19 +60,14 @@ namespace ReaxFF { const char *what() const noexcept { return message.c_str(); } }; + // NOTE: this function is run on MPI rank 0 only + void Read_Control_File(const char *control_file, control_params *control, output_controls *out_control) { - FILE *fp; - char line[MAX_LINE]; auto error = control->error_ptr; auto lmp = control->lmp_ptr; - /* open control file */ - fp = fopen(control_file, "r"); - if (!fp) - error->one(FLERR,fmt::format("The control file {} cannot be opened: {}", - control_file, getsyserror())); /* assign default values */ strcpy(control->sim_name, "simulate"); control->nthreads = 1; @@ -92,13 +87,16 @@ namespace ReaxFF { out_control->angle_info = 0; /* read control parameters file */ - while (fgets(line, MAX_LINE, fp)) { - ValueTokenizer values(line); + try { + LAMMPS_NS::TextFileReader reader(control_file, "ReaxFF control"); + reader.ignore_comments = false; - // empty line - if (values.count() == 0) continue; + while (1) { + auto values = reader.next_values(0); + + // empty line + if (values.count() == 0) continue; - try { auto keyword = values.next_string(); if (!values.has_next()) @@ -139,10 +137,11 @@ namespace ReaxFF { } else { throw parser_error(fmt::format("Unknown parameter {} in control file", keyword)); } - } catch (std::exception &e) { - error->one(FLERR, e.what()); } + } catch (LAMMPS_NS::EOFException &) { + ; // catch and ignore + } catch (std::exception &e) { + error->one(FLERR, e.what()); } - fclose(fp); } } From 6c88baceb7ddef8053fe4adfa0fd728607b973b1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 05:16:41 -0400 Subject: [PATCH 054/352] remove support for writing "native" trajectory files from USER-REAXC --- src/.gitignore | 4 +- src/Purge.list | 2 + src/USER-OMP/pair_reaxc_omp.cpp | 8 +- src/USER-OMP/reaxc_bond_orders_omp.cpp | 3 +- src/USER-OMP/reaxc_forces_omp.cpp | 9 +- src/USER-OMP/reaxc_init_md_omp.cpp | 5 +- src/USER-OMP/reaxff_omp.h | 11 +- src/USER-REAXC/pair_reaxc.cpp | 25 +- src/USER-REAXC/reaxc_bond_orders.cpp | 5 +- src/USER-REAXC/reaxc_control.cpp | 47 +- src/USER-REAXC/reaxc_forces.cpp | 27 +- src/USER-REAXC/reaxc_init_md.cpp | 4 +- src/USER-REAXC/reaxc_io_tools.cpp | 99 ----- src/USER-REAXC/reaxc_reset_tools.cpp | 25 +- src/USER-REAXC/reaxc_traj.cpp | 569 ------------------------- src/USER-REAXC/reaxff_api.h | 39 +- src/USER-REAXC/reaxff_types.h | 24 -- 17 files changed, 61 insertions(+), 845 deletions(-) delete mode 100644 src/USER-REAXC/reaxc_io_tools.cpp delete mode 100644 src/USER-REAXC/reaxc_traj.cpp diff --git a/src/.gitignore b/src/.gitignore index 818b9bfcae..cb0b811521 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1199,11 +1199,9 @@ /reaxc_bonds.cpp /reaxc_control.cpp /reaxc_ffield.cpp -/reaxc_ffield.h /reaxc_forces.cpp /reaxc_hydrogen_bonds.cpp /reaxc_init_md.cpp -/reaxc_io_tools.cpp /reaxc_list.cpp /reaxc_lookup.cpp /reaxc_multi_body.cpp @@ -1211,11 +1209,11 @@ /reaxc_reset_tools.cpp /reaxc_tool_box.cpp /reaxc_torsion_angles.cpp -/reaxc_traj.cpp /reaxc_valence_angles.cpp /reaxff_api.h /reaxff_defs.h /reaxff_inline.h +/reaxff_omp.h /reaxff_types.h /remap.cpp /remap.h diff --git a/src/Purge.list b/src/Purge.list index 17f7291a38..39e43414cf 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -62,6 +62,7 @@ reaxc_forces.h reaxc_hydrogen_bonds.h reaxc_init_md.h reaxc_io_tools.h +reaxc_io_tools.cpp reaxc_list.h reaxc_lookup.h reaxc_multi_body.h @@ -72,6 +73,7 @@ reaxc_system_props.cpp reaxc_tool_box.h reaxc_torsion_angles.h reaxc_traj.h +reaxc_traj.cpp reaxc_types.h reaxc_valence_angles.h reaxc_vector.h diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 0f8ae18009..9bfd1a3722 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -211,7 +211,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) startTimeBase = MPI_Wtime(); #endif - Compute_ForcesOMP(api->system,api->control,api->data,api->workspace,&api->lists,api->out_control); + Compute_ForcesOMP(api->system,api->control,api->data,api->workspace,&api->lists); read_reax_forces(vflag); #ifdef OMP_TIMING @@ -270,8 +270,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) api->data->step = update->ntimestep; - Output_Results(api->system, api->control, api->data, &api->lists, api->out_control, world); - // populate tmpid and tmpbo arrays for fix reax/c/species if (fixspecies_flag) { @@ -393,8 +391,8 @@ void PairReaxCOMP::setup() write_reax_lists(); - InitializeOMP(api->system, api->control, api->data, api->workspace, - &api->lists, api->out_control, world); + InitializeOMP(api->system, api->control, api->data, + api->workspace, &api->lists, world); for (int k = 0; k < api->system->N; ++k) { num_bonds[k] = api->system->my_atoms[k].num_bonds; diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index 745290fa37..c3c1fb37df 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -366,8 +366,7 @@ namespace ReaxFF { /* ---------------------------------------------------------------------- */ - void BOOMP( reax_system *system, control_params * /* control */, simulation_data * /* data */, - storage *workspace, reax_list **lists, output_controls * /* out_control */) + void BOOMP( reax_system *system, storage *workspace, reax_list **lists) { double p_lp1 = system->reax_param.gp.l[15]; double p_boc1 = system->reax_param.gp.l[0]; diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 29b70c10a4..70bae4a761 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -43,10 +43,10 @@ namespace ReaxFF { static void Compute_Bonded_ForcesOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + reax_list **lists) { - BOOMP(system, control, data, workspace, lists, out_control); + BOOMP(system, workspace, lists); BondsOMP(system, data, workspace, lists); Atom_EnergyOMP(system, data, workspace, lists); Valence_AnglesOMP(system, control, data, workspace, lists); @@ -476,14 +476,13 @@ namespace ReaxFF { void Compute_ForcesOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + reax_list **lists) { // Init Forces Init_Forces_noQEq_OMP(system, control, data, workspace, lists); // Bonded Interactions - Compute_Bonded_ForcesOMP(system, control, data, workspace, - lists, out_control); + Compute_Bonded_ForcesOMP(system, control, data, workspace, lists); // Nonbonded Interactions Compute_NonBonded_ForcesOMP(system, control, data, workspace, lists); diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index eb81fe8280..cccee3afe8 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -94,16 +94,13 @@ namespace ReaxFF { // The only difference with the MPI-only function is calls to Init_ListsOMP and Init_Force_FunctionsOMP(). void InitializeOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm world) + reax_list **lists, MPI_Comm world) { Init_System(system,control); Init_Simulation_Data(data); Init_Workspace(system,control,workspace); Init_ListsOMP(system,control,lists); - Init_Output_Files(system,control,out_control,world); - if (control->tabulate) Init_Lookup_Tables(system,control,workspace,world); } diff --git a/src/USER-OMP/reaxff_omp.h b/src/USER-OMP/reaxff_omp.h index 952b1a292e..4188ac9bf7 100644 --- a/src/USER-OMP/reaxff_omp.h +++ b/src/USER-OMP/reaxff_omp.h @@ -40,8 +40,7 @@ namespace ReaxFF two_body_parameters *, int, double, double, double, double, double, double, double); - extern void BOOMP(reax_system *, control_params *, simulation_data *, - storage *, reax_list **, output_controls *); + extern void BOOMP(reax_system *, storage *, reax_list **); // bonds OpenMP @@ -51,8 +50,7 @@ namespace ReaxFF // forces OpenMP extern void Compute_ForcesOMP(reax_system *, control_params *, - simulation_data *, storage *, - reax_list **, output_controls *); + simulation_data *, storage *, reax_list **); // hydrogen bonds @@ -61,9 +59,8 @@ namespace ReaxFF // init md OpenMP - extern void InitializeOMP(reax_system *, control_params *, - simulation_data *, storage *, reax_list **, - output_controls *, MPI_Comm); + extern void InitializeOMP(reax_system *, control_params *, simulation_data *, + storage *, reax_list **,MPI_Comm); // multi body diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 3525b40b1d..565dc89eb0 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -77,8 +77,6 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) memset(api->system,0,sizeof(reax_system)); api->control = new control_params; memset(api->control,0,sizeof(control_params)); - api->out_control = new output_controls; - memset(api->out_control,0,sizeof(output_controls)); api->data = new simulation_data; api->workspace = new storage; memory->create(api->lists, LIST_N,"reaxff:lists"); @@ -124,7 +122,6 @@ PairReaxC::~PairReaxC() delete[] fix_id; if (setup_flag) { - Close_Output_Files(api->system,api->out_control); // deallocate reax data-structures @@ -141,7 +138,6 @@ PairReaxC::~PairReaxC() delete api->system; delete api->control; - delete api->out_control; delete api->data; delete api->workspace; memory->destroy(api->lists); @@ -192,8 +188,6 @@ void PairReaxC::settings(int narg, char **arg) // read name of control file or use default controls if (strcmp(arg[0],"NULL") == 0) { - strcpy(api->control->sim_name, "simulate"); - api->out_control->energy_update_freq = 0; api->control->tabulate = 0; api->control->bond_cut = 5.; @@ -204,15 +198,9 @@ void PairReaxC::settings(int narg, char **arg) api->control->nthreads = 1; - api->out_control->write_steps = 0; - strcpy(api->out_control->traj_title, "default_title"); - api->out_control->atom_info = 0; - api->out_control->bond_info = 0; - api->out_control->angle_info = 0; - } else Read_Control_File(arg[0], api->control, api->out_control); + } else Read_Control_File(arg[0], api->control); } MPI_Bcast(api->control,sizeof(control_params),MPI_CHAR,0,world); - MPI_Bcast(api->out_control,sizeof(output_controls),MPI_CHAR,0,world); // must reset these to local values after broadcast api->control->me = comm->me; @@ -431,8 +419,8 @@ void PairReaxC::setup() write_reax_lists(); api->system->wsize = comm->nprocs; - Initialize(api->system, api->control, api->data, api->workspace, - &api->lists, api->out_control, world); + Initialize(api->system, api->control, api->data, + api->workspace, &api->lists, world); for (int k = 0; k < api->system->N; ++k) { num_bonds[k] = api->system->my_atoms[k].num_bonds; num_hbonds[k] = api->system->my_atoms[k].num_hbonds; @@ -500,7 +488,7 @@ void PairReaxC::compute(int eflag, int vflag) // forces - Compute_Forces(api->system,api->control,api->data,api->workspace,&api->lists,api->out_control); + Compute_Forces(api->system,api->control,api->data,api->workspace,&api->lists); read_reax_forces(vflag); for (int k = 0; k < api->system->N; ++k) { @@ -526,9 +514,6 @@ void PairReaxC::compute(int eflag, int vflag) ecoul += api->data->my_en.e_ele; ecoul += api->data->my_en.e_pol; - // eng_vdwl += evdwl; - // eng_coul += ecoul; - // Store the different parts of the energy // in a list for output by compute pair command @@ -554,8 +539,6 @@ void PairReaxC::compute(int eflag, int vflag) api->data->step = update->ntimestep; - Output_Results(api->system, api->control, api->data, &api->lists, api->out_control, world); - // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index ae6fc3b823..f6e923406d 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -333,13 +333,10 @@ namespace ReaxFF { return 1; } - return 0; } - - void BO(reax_system *system, control_params * /*control*/, simulation_data * /*data*/, - storage *workspace, reax_list **lists, output_controls * /*out_control*/ ) + void BO(reax_system *system, storage *workspace, reax_list **lists) { int i, j, pj, type_i, type_j; int start_i, end_i, sym_index; diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index f33cf9ca48..05f6813d92 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -41,7 +41,7 @@ using LAMMPS_NS::utils::logmesg; using LAMMPS_NS::ValueTokenizer; namespace ReaxFF { - static std::unordered_set ignored_keywords = { + static std::unordered_set inactive_keywords = { "ensemble_type", "nsteps", "dt", "proc_by_dim", "random_vel", "restart_format", "restart_freq", "reposition_atoms", "restrict_bonds", "remove_CoM_vel", "debug_level", "reneighbor", @@ -50,8 +50,9 @@ namespace ReaxFF { "t_freq", "pressure", "p_mass", "pt_mass", "compress", "press_mode", "geo_format", "traj_compress", "traj_method", "molecular_analysis", "ignore", "dipole_anal", "freq_dipole_anal", "diffusion_coef", - "freq_diffusion_coef", "restrict_type" - }; + "freq_diffusion_coef", "restrict_type", "traj_title", "simulation_name", + "energy_update_freq", "atom_info", "atom_velocities", "atom_forces", + "bond_info", "angle_info" }; class parser_error : public std::exception { std::string message; @@ -62,14 +63,11 @@ namespace ReaxFF { // NOTE: this function is run on MPI rank 0 only - void Read_Control_File(const char *control_file, control_params *control, - output_controls *out_control) + void Read_Control_File(const char *control_file, control_params *control) { auto error = control->error_ptr; - auto lmp = control->lmp_ptr; /* assign default values */ - strcpy(control->sim_name, "simulate"); control->nthreads = 1; control->tabulate = 0; control->virial = 0; @@ -79,13 +77,6 @@ namespace ReaxFF { control->thb_cutsq = 0.00001; control->hbond_cut = 7.5; - out_control->write_steps = 0; - out_control->energy_update_freq = 0; - strcpy(out_control->traj_title, "default_title"); - out_control->atom_info = 0; - out_control->bond_info = 0; - out_control->angle_info = 0; - /* read control parameters file */ try { LAMMPS_NS::TextFileReader reader(control_file, "ReaxFF control"); @@ -102,12 +93,9 @@ namespace ReaxFF { if (!values.has_next()) throw parser_error(fmt::format("No value(s) for control parameter: {}\n",keyword)); - if (ignored_keywords.find(keyword) != ignored_keywords.end()) { - logmesg(lmp,fmt::format("Ignoring inactive control parameter: {}\n",keyword)); - } else if (keyword == "simulation_name") { - strcpy(control->sim_name, values.next_string().c_str()); - } else if (keyword == "energy_update_freq") { - out_control->energy_update_freq = values.next_int(); + if (inactive_keywords.find(keyword) != inactive_keywords.end()) { + error->warning(FLERR,fmt::format("Ignoring inactive control " + "parameter: {}",keyword)); } else if (keyword == "nbrhood_cutoff") { control->bond_cut = values.next_double(); } else if (keyword == "bond_graph_cutoff") { @@ -121,21 +109,12 @@ namespace ReaxFF { } else if (keyword == "tabulate_long_range") { control->tabulate = values.next_int(); } else if (keyword == "write_freq") { - out_control->write_steps = values.next_int(); - } else if (keyword == "traj_title") { - strcpy(out_control->traj_title, values.next_string().c_str()); - } else if (keyword == "atom_info") { - out_control->atom_info += values.next_int() * 4; - } else if (keyword == "atom_velocities") { - out_control->atom_info += values.next_int() * 2; - } else if (keyword == "atom_forces") { - out_control->atom_info += values.next_int() * 1; - } else if (keyword == "bond_info") { - out_control->bond_info = values.next_int(); - } else if (keyword == "angle_info") { - out_control->angle_info = values.next_int(); + if (values.next_int() > 0) + error->warning(FLERR,"Support for writing native trajectories has " + "been removed after LAMMPS version 8 April 2021"); } else { - throw parser_error(fmt::format("Unknown parameter {} in control file", keyword)); + throw parser_error(fmt::format("Unknown parameter {} in " + "control file", keyword)); } } } catch (LAMMPS_NS::EOFException &) { diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index a2e01db478..22b81633aa 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -34,11 +34,13 @@ namespace ReaxFF { - static void Compute_Bonded_Forces(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + static void Compute_Bonded_Forces(reax_system *system, + control_params *control, + simulation_data *data, + storage *workspace, + reax_list **lists) { - BO(system, control, data, workspace, lists, out_control); + BO(system, workspace, lists); Bonds(system, data, workspace, lists); Atom_Energy(system, control, data, workspace, lists); Valence_Angles(system, control, data, workspace, lists); @@ -47,8 +49,10 @@ namespace ReaxFF { Hydrogen_Bonds(system, control, data, workspace, lists); } - static void Compute_NonBonded_Forces(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, + static void Compute_NonBonded_Forces(reax_system *system, + control_params *control, + simulation_data *data, + storage *workspace, reax_list **lists) { @@ -60,7 +64,7 @@ namespace ReaxFF { } static void Compute_Total_Force(reax_system *system, control_params *control, - storage *workspace, reax_list **lists) + storage *workspace, reax_list **lists) { int i, pj; reax_list *bonds = (*lists) + BONDS; @@ -113,10 +117,6 @@ namespace ReaxFF { system->my_atoms[i].num_hbonds = (int)(MAX(Num_Entries(Hindex, hbonds)*saferzone, system->minhbonds)); - //if(Num_Entries(i, hbonds) >= - //(Start_Index(i+1,hbonds)-Start_Index(i,hbonds))*0.90/*DANGER_ZONE*/) { - // workspace->realloc.hbonds = 1; - if (Hindex < numH-1) comp = Start_Index(Hindex+1, hbonds); else comp = hbonds->num_intrs; @@ -374,14 +374,13 @@ namespace ReaxFF { void Compute_Forces(reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control) + reax_list **lists) { Init_Forces_noQEq(system, control, data, workspace, lists); /********* bonded interactions ************/ - Compute_Bonded_Forces(system, control, data, workspace, - lists, out_control); + Compute_Bonded_Forces(system, control, data, workspace, lists); /********* nonbonded interactions ************/ Compute_NonBonded_Forces(system, control, data, workspace, lists); diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index adc9bc137d..86a8677a02 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -163,14 +163,12 @@ namespace ReaxFF { void Initialize(reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - MPI_Comm world) + reax_list **lists, MPI_Comm world) { Init_System(system, control); Init_Simulation_Data(data); Init_Workspace(system, control, workspace); Init_Lists(system, control, lists); - Init_Output_Files(system, control, out_control, world); if (control->tabulate) Init_Lookup_Tables(system, control, workspace, world); } diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp deleted file mode 100644 index d6fd4b3aa4..0000000000 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#include "reaxff_api.h" - -namespace ReaxFF { - void Collect_System_Energy(reax_system *system, simulation_data *data, - MPI_Comm comm) - { - double my_en[13], sys_en[13]; - - my_en[0] = data->my_en.e_bond; - my_en[1] = data->my_en.e_ov; - my_en[2] = data->my_en.e_un; - my_en[3] = data->my_en.e_lp; - my_en[4] = data->my_en.e_ang; - my_en[5] = data->my_en.e_pen; - my_en[6] = data->my_en.e_coa; - my_en[7] = data->my_en.e_hb; - my_en[8] = data->my_en.e_tor; - my_en[9] = data->my_en.e_con; - my_en[10] = data->my_en.e_vdW; - my_en[11] = data->my_en.e_ele; - my_en[12] = data->my_en.e_pol; - MPI_Reduce( my_en, sys_en, 13, MPI_DOUBLE, MPI_SUM, MASTER_NODE, comm ); - - if (system->my_rank == MASTER_NODE) { - data->sys_en.e_bond = sys_en[0]; - data->sys_en.e_ov = sys_en[1]; - data->sys_en.e_un = sys_en[2]; - data->sys_en.e_lp = sys_en[3]; - data->sys_en.e_ang = sys_en[4]; - data->sys_en.e_pen = sys_en[5]; - data->sys_en.e_coa = sys_en[6]; - data->sys_en.e_hb = sys_en[7]; - data->sys_en.e_tor = sys_en[8]; - data->sys_en.e_con = sys_en[9]; - data->sys_en.e_vdW = sys_en[10]; - data->sys_en.e_ele = sys_en[11]; - data->sys_en.e_pol = sys_en[12]; - } - } - - void Init_Output_Files(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world) - { - if (out_control->write_steps > 0) - Init_Traj(system, control, out_control, world); - } - - /************************ close output files ************************/ - void Close_Output_Files(reax_system *system, output_controls *out_control) - { - if (out_control->write_steps > 0) - End_Traj(system->my_rank, out_control); - } - - void Output_Results(reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, MPI_Comm world) - { - - if ((out_control->energy_update_freq > 0 && - data->step%out_control->energy_update_freq == 0) || - (out_control->write_steps > 0 && - data->step%out_control->write_steps == 0)) { - /* update system-wide energies */ - Collect_System_Energy(system, data, world); - - /* write current frame */ - if (out_control->write_steps > 0 && data->step % out_control->write_steps == 0) { - Append_Frame(system, control, data, lists, out_control, world); - } - } - } -} diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index bb0fc1eb5a..e7d8d4d024 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -49,28 +49,9 @@ namespace ReaxFF { } } - - static void Reset_Energies(energy_data *en) - { - en->e_bond = 0; - en->e_ov = 0; - en->e_un = 0; - en->e_lp = 0; - en->e_ang = 0; - en->e_pen = 0; - en->e_coa = 0; - en->e_hb = 0; - en->e_tor = 0; - en->e_con = 0; - en->e_vdW = 0; - en->e_ele = 0; - en->e_pol = 0; - } - void Reset_Simulation_Data(simulation_data* data) { - Reset_Energies(&data->my_en); - Reset_Energies(&data->sys_en); + memset(&data->my_en,0,sizeof(energy_data)); } void Reset_Workspace(reax_system *system, storage *workspace) @@ -136,8 +117,8 @@ namespace ReaxFF { } - void Reset(reax_system *system, control_params *control, simulation_data *data, - storage *workspace, reax_list **lists) + void Reset(reax_system *system, control_params *control, + simulation_data *data, storage *workspace, reax_list **lists) { Reset_Atoms(system, control); Reset_Simulation_Data(data); diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp deleted file mode 100644 index 91afc9e8d1..0000000000 --- a/src/USER-REAXC/reaxc_traj.cpp +++ /dev/null @@ -1,569 +0,0 @@ -/*---------------------------------------------------------------------- - PuReMD - Purdue ReaxFF Molecular Dynamics Program - - Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu - - Please cite the related publication: - H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, - "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU General Public License for more details: - . - ----------------------------------------------------------------------*/ - -#include "reaxff_api.h" - -#include -#include - -#include "error.h" - -#define MAX_TRJ_LINE_LEN 120 -#define MAX_TRJ_BUFFER_SIZE (MAX_TRJ_LINE_LEN * 100) - -#define NUM_HEADER_LINES 37 -#define HEADER_LINE_LEN 62 -#define INIT_DESC_LEN 32 - -#define ATOM_BASIC_LEN 50 -#define ATOM_wV_LEN 80 -#define ATOM_wF_LEN 80 -#define ATOM_FULL_LEN 110 - -#define BOND_BASIC_LEN 39 -#define BOND_FULL_LEN 69 -#define ANGLE_BASIC_LEN 38 - -namespace ReaxFF { - - enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; - enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; - enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; - - - std::string fmtline(const char *key, double val) - { - return fmt::format("{:<37}{:<24.3f}\n",key,val); - } - - std::string fmtline(const char *key, double val1, double val2, double val3) - { - return fmt::format("{:<32}{:>9.3f},{:>9.3f},{:>9.3f}\n",key,val1,val2,val3); - } - - template - std::string fmtline(const char *key, T val) - { - return fmt::format("{:<37}{:<24}\n",key,val); - } - - template - std::string fmtline(const char *key, T val1, T val2) - { - return fmt::format("{:<36}{:<12},{:<12}\n",key,val1,val2); - } - - static void Reallocate_Output_Buffer(LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space) - { - if (out_control->buffer_len > 0) - free(out_control->buffer); - - out_control->buffer_len = (int)(req_space*REAX_SAFE_ZONE); - out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); - if (!out_control->buffer) - error_ptr->one(FLERR,fmt::format("Insufficient memory for required buffer " - "size {}", (req_space*REAX_SAFE_ZONE))); - } - - static void Write_Skip_Line(output_controls *out_control, int my_rank, int skip, int num_section) - { - if (my_rank == MASTER_NODE) - fmt::print(out_control->strj,fmtline("chars_to_skip_section:",skip,num_section)); - } - - static void Write_Header(reax_system *system, control_params *control, output_controls *out_control) - { - char atom_formats[8][40] = { "none", "invalid", "invalid", "invalid", - "xyz_q", - "xyz_q_fxfyfz", - "xyz_q_vxvyvz", - "detailed_atom_info" }; - char bond_formats[3][30] = { "none", - "basic_bond_info", - "detailed_bond_info" }; - char angle_formats[2][30] = { "none", "basic_angle_info" }; - - /* only the master node writes into trajectory header */ - if (system->my_rank == MASTER_NODE) { - std::string buffer(""); - - /* to skip the header */ - buffer += fmtline("chars_to_skip_header:",(NUM_HEADER_LINES-1) * HEADER_LINE_LEN); - - /* general simulation info */ - buffer += fmtline("simulation_name:", out_control->traj_title); - buffer += fmtline("number_of_atoms:", system->bigN); - buffer += fmtline("ensemble_type:", "(unknown)"); - buffer += fmtline("number_of_steps:", 0); - buffer += fmtline("timestep_length_(in_fs):", 0.0); - - /* restart info */ - buffer += fmtline("is_this_a_restart?:", "no"); - buffer += fmtline("write_restart_files?:", "no"); - buffer += fmtline("frequency_to_write_restarts:", 0); - - /* preferences */ - buffer += fmtline("tabulate_long_range_intrs?:",(control->tabulate ? "yes" : "no")); - buffer += fmtline("table_size:", control->tabulate); - buffer += fmtline("restrict_bonds?:", "no"); - buffer += fmtline("bond_restriction_length:", 0); - buffer += fmtline("reposition_atoms?:", "fit to periodic box"); - buffer += fmtline("remove_CoM_velocity?:", 0); - buffer += fmtline("bonded_intr_dist_cutoff:",control->bond_cut); - buffer += fmtline("nonbonded_intr_dist_cutoff:",control->nonb_cut); - buffer += fmtline("hbond_dist_cutoff:",control->hbond_cut); - buffer += fmtline("reax_bond_threshold:",control->bo_cut); - buffer += fmtline("physical_bond_threshold:", control->bg_cut); - buffer += fmtline("valence_angle_threshold:",control->thb_cut); - buffer += fmtline("QEq_tolerance:", 0.0); - - /* temperature controls */ - buffer += fmtline("initial_temperature:", 0.0); - buffer += fmtline("target_temperature:", 0.0); - buffer += fmtline("thermal_inertia:", 0.0); - buffer += fmtline("temperature_regime:", "(unknown)"); - buffer += fmtline("temperature_change_rate_(K/ps):", 0.0); - - /* pressure controls */ - buffer += fmtline("target_pressure_(GPa):", 0.0, 0.0, 0.0); - buffer += fmtline("virial_inertia:", 0.0, 0.0, 0.0); - - /* trajectory */ - buffer += fmtline("energy_dumping_freq:", out_control->energy_update_freq); - buffer += fmtline("trajectory_dumping_freq:",out_control->write_steps); - buffer += fmtline("compress_trajectory_output?:", "no"); - buffer += fmtline("trajectory_format:", "regular"); - buffer += fmtline("atom_info:", atom_formats[out_control->atom_info]); - buffer += fmtline("bond_info:", bond_formats[out_control->bond_info]); - buffer += fmtline("angle_info:", angle_formats[out_control->angle_info]); - - /* analysis */ - buffer += fmtline("molecular_analysis:", "no"); - buffer += fmtline("molecular_analysis_frequency:", 0); - - /* dump out the buffer */ - - fputs(buffer.c_str(),out_control->strj); - } - } - - static void Write_Init_Desc(reax_system *system, output_controls *out_control, MPI_Comm world) - { - int i, me, np, cnt, buffer_len, buffer_req; - reax_atom *p_atom; - MPI_Status status; - - me = system->my_rank; - np = system->wsize; - - /* skip info */ - Write_Skip_Line(out_control, me, system->bigN*INIT_DESC_LEN, system->bigN); - - if (me == MASTER_NODE) - buffer_req = system->bigN * INIT_DESC_LEN + 1; - else buffer_req = system->n * INIT_DESC_LEN + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - out_control->buffer[0] = 0; - for (i = 0; i < system->n; ++i) { - p_atom = &(system->my_atoms[i]); - auto buffer = fmt::format("{:9}{:3}{:9}{:10.3f}\n", - p_atom->orig_id, p_atom->type, p_atom->name, - system->reax_param.sbp[p_atom->type].mass); - strncpy(out_control->buffer + i*INIT_DESC_LEN, buffer.c_str(), INIT_DESC_LEN+1); - } - - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np * INIT_DESCS + me, world); - } else { - buffer_len = system->n * INIT_DESC_LEN; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*INIT_DESCS+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); - } - } - - void Init_Traj(reax_system *system, control_params *control, - output_controls *out_control, MPI_Comm world) - { - int atom_line_len[NR_OPT_ATOM] = { 0, 0, 0, 0, ATOM_BASIC_LEN, ATOM_wV_LEN, ATOM_wF_LEN, ATOM_FULL_LEN}; - int bond_line_len[NR_OPT_BOND] = { 0, BOND_BASIC_LEN, BOND_FULL_LEN }; - int angle_line_len[NR_OPT_ANGLE] = { 0, ANGLE_BASIC_LEN }; - - /* generate trajectory name */ - auto fname = std::string(control->sim_name) + ".trj"; - - /* how should I write atoms? */ - out_control->atom_line_len = atom_line_len[out_control->atom_info]; - out_control->write_atoms = (out_control->atom_line_len ? 1 : 0); - /* bonds? */ - out_control->bond_line_len = bond_line_len[out_control->bond_info]; - out_control->write_bonds = (out_control->bond_line_len ? 1 : 0); - /* angles? */ - out_control->angle_line_len = angle_line_len[out_control->angle_info]; - out_control->write_angles = (out_control->angle_line_len ? 1 : 0); - - /* allocate line & buffer space */ - out_control->buffer_len = 0; - out_control->buffer = nullptr; - - /* write trajectory header and atom info, if applicable */ - if (system->my_rank == MASTER_NODE) - out_control->strj = fopen(fname.c_str(), "w"); - - Write_Header(system, control, out_control); - Write_Init_Desc(system, out_control, world); - } - - static void Write_Frame_Header(reax_system *system, simulation_data *data, output_controls *out_control) - { - const int me = system->my_rank; - /* frame header lengths */ - constexpr int num_frm_hdr_lines = 22; - - /* only the master node writes into trajectory header */ - if (me == MASTER_NODE) { - std::string buffer(""); - - /* skip info */ - buffer += fmtline("chars_to_skip_frame_header:", (num_frm_hdr_lines-1)*HEADER_LINE_LEN); - - /* step & time */ - buffer += fmtline("step:", data->step); - buffer += fmtline("time_in_ps:", 0.0); - - /* box info */ - buffer += fmtline("volume:", 0.0); - buffer += fmtline("box_dimensions:", 0.0, 0.0, 0.0); - buffer += fmtline("coordinate_angles:", 90.0, 90.0, 90.0); - - /* system T and P */ - buffer += fmtline("temperature:", 0.0); - buffer += fmtline("pressure:", 0.0); - - /* energies */ - double epot = data->sys_en.e_bond + data->sys_en.e_ov + data->sys_en.e_un - + data->sys_en.e_lp + data->sys_en.e_ang + data->sys_en.e_pen - + data->sys_en.e_coa + data->sys_en.e_hb + data->sys_en.e_tor - + data->sys_en.e_con + data->sys_en.e_vdW - + data->sys_en.e_ele + data->my_en.e_pol; - - buffer += fmtline("total_energy:", epot); - buffer += fmtline("total_kinetic:", 0.0); - buffer += fmtline("total_potential:", epot); - buffer += fmtline("bond_energy:", data->sys_en.e_bond); - buffer += fmtline("atom_energy:", data->sys_en.e_ov + data->sys_en.e_un); - buffer += fmtline("lone_pair_energy:", data->sys_en.e_lp); - buffer += fmtline("valence_angle_energy:", data->sys_en.e_ang + data->sys_en.e_pen); - buffer += fmtline("3-body_conjugation:", data->sys_en.e_coa); - buffer += fmtline("hydrogen_bond_energy:", data->sys_en.e_hb); - buffer += fmtline("torsion_angle_energy:", data->sys_en.e_tor); - buffer += fmtline("4-body_conjugation:", data->sys_en.e_con); - buffer += fmtline("vdWaals_energy:", data->sys_en.e_vdW); - buffer += fmtline("electrostatics_energy:", data->sys_en.e_ele); - buffer += fmtline("polarization_energy:", data->sys_en.e_pol); - - /* dump out the buffer */ - fputs(buffer.c_str(),out_control->strj); - } - } - - static void Write_Atoms(reax_system *system, output_controls *out_control, - MPI_Comm world) - { - int i, me, np, line_len, buffer_len, buffer_req, cnt; - MPI_Status status; - reax_atom *p_atom; - - me = system->my_rank; - np = system->wsize; - line_len = out_control->atom_line_len; - - Write_Skip_Line(out_control, me, system->bigN*line_len, system->bigN); - - if (me == MASTER_NODE) - buffer_req = system->bigN * line_len + 1; - else buffer_req = system->n * line_len + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - /* fill in buffer */ - out_control->buffer[0] = 0; - - for (i = 0; i < system->n; ++i) { - std::string buffer(""); - p_atom = &(system->my_atoms[i]); - buffer += fmt::format("{:9}{:10.3f}{:10.3f}{:10.3f}",p_atom->orig_id, - p_atom->x[0], p_atom->x[1],p_atom->x[2]); - - switch (out_control->atom_info) { - case OPT_ATOM_BASIC: - buffer += fmt::format("{:10.3f}\n",p_atom->q); - break; - case OPT_ATOM_wF: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); - break; - case OPT_ATOM_wV: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->v[0], p_atom->v[1], p_atom->v[2], p_atom->q); - break; - case OPT_ATOM_FULL: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}{:10.3f}\n", - p_atom->v[0], p_atom->v[1], p_atom->v[2], - p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q); - break; - default: - system->error_ptr->one(FLERR,"Write_traj_atoms: unknown atom trajectory format"); - } - - strncpy(out_control->buffer + i*line_len, buffer.c_str(), line_len+1); - } - - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ATOM_LINES+me, world); - } else { - buffer_len = system->n * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ATOM_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer, out_control->strj); - } - } - - static void Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, - output_controls *out_control, MPI_Comm world) - { - int i, j, pj, me, np; - int my_bonds, num_bonds; - int line_len, buffer_len, buffer_req, cnt; - MPI_Status status; - bond_data *bo_ij; - - me = system->my_rank; - np = system->wsize; - line_len = out_control->bond_line_len; - - /* count the number of bonds I will write */ - my_bonds = 0; - for (i=0; i < system->n; ++i) - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - j = bonds->select.bond_list[pj].nbr; - if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && - bonds->select.bond_list[pj].bo_data.BO >= control->bg_cut) - ++my_bonds; - } - - /* allreduce - total number of bonds */ - MPI_Allreduce(&my_bonds, &num_bonds, 1, MPI_INT, MPI_SUM, world); - - Write_Skip_Line(out_control, me, num_bonds*line_len, num_bonds); - - if (me == MASTER_NODE) - buffer_req = num_bonds * line_len + 1; - else buffer_req = my_bonds * line_len + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - /* fill in the buffer */ - out_control->buffer[0] = 0; - - my_bonds = 0; - for (i=0; i < system->n; ++i) { - for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) { - bo_ij = &(bonds->select.bond_list[pj]); - j = bo_ij->nbr; - - if (system->my_atoms[i].orig_id <= system->my_atoms[j].orig_id && - bo_ij->bo_data.BO >= control->bg_cut) { - auto buffer = fmt::format("{:9}{:9}{:10.3f}{:10.3f}", system->my_atoms[i].orig_id, - system->my_atoms[j].orig_id,bo_ij->d,bo_ij->bo_data.BO); - - switch (out_control->bond_info) { - case OPT_BOND_BASIC: - buffer += "\n"; - break; - case OPT_BOND_FULL: - buffer += fmt::format("{:10.3f}{:10.3f}{:10.3f}\n", bo_ij->bo_data.BO_s, - bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2); - break; - default: - system->error_ptr->one(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); - } - strncpy(out_control->buffer + my_bonds*line_len, buffer.c_str(), line_len+1); - ++my_bonds; - } - } - } - - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, np*BOND_LINES+me, world); - } else { - buffer_len = my_bonds * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*BOND_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); - } - } - - static void Write_Angles(reax_system *system, control_params *control, - reax_list *bonds, reax_list *thb_intrs, - output_controls *out_control, MPI_Comm world) - { - int i, j, k, pi, pk, me, np; - int my_angles, num_angles; - int line_len, buffer_len, buffer_req, cnt; - bond_data *bo_ij, *bo_jk; - three_body_interaction_data *angle_ijk; - MPI_Status status; - - me = system->my_rank; - np = system->wsize; - line_len = out_control->angle_line_len; - - /* count the number of valence angles I will output */ - my_angles = 0; - for (j = 0; j < system->n; ++j) - for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { - bo_ij = &(bonds->select.bond_list[pi]); - i = bo_ij->nbr; - - if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index(pi, thb_intrs); - pk < End_Index(pi, thb_intrs); ++pk) { - angle_ijk = &(thb_intrs->select.three_body_list[pk]); - k = angle_ijk->thb; - bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); - - if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && - bo_jk->bo_data.BO >= control->bg_cut) // physical j&k bond - ++my_angles; - } - } - /* total number of valences */ - MPI_Allreduce(&my_angles, &num_angles, 1, MPI_INT, MPI_SUM, world); - - Write_Skip_Line(out_control, me, num_angles*line_len, num_angles); - - if (me == MASTER_NODE) - buffer_req = num_angles * line_len + 1; - else buffer_req = my_angles * line_len + 1; - - if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer(system->error_ptr, out_control, buffer_req); - - /* fill in the buffer */ - my_angles = 0; - out_control->buffer[0] = 0; - for (j = 0; j < system->n; ++j) - for (pi = Start_Index(j, bonds); pi < End_Index(j, bonds); ++pi) { - bo_ij = &(bonds->select.bond_list[pi]); - i = bo_ij->nbr; - - if (bo_ij->bo_data.BO >= control->bg_cut) // physical j&i bond - for (pk = Start_Index(pi, thb_intrs); - pk < End_Index(pi, thb_intrs); ++pk) { - angle_ijk = &(thb_intrs->select.three_body_list[pk]); - k = angle_ijk->thb; - bo_jk = &(bonds->select.bond_list[ angle_ijk->pthb ]); - - if (system->my_atoms[i].orig_id < system->my_atoms[k].orig_id && - bo_jk->bo_data.BO >= control->bg_cut) { // physical j&k bond - auto buffer = fmt::format("{:9}{:9}{:9}{:10.3f}\n", - system->my_atoms[i].orig_id, system->my_atoms[j].orig_id, - system->my_atoms[k].orig_id, RAD2DEG(angle_ijk->theta)); - - strncpy(out_control->buffer + my_angles*line_len, buffer.c_str(), line_len+1); - ++my_angles; - } - } - } - - if (me != MASTER_NODE) { - MPI_Send(out_control->buffer, buffer_req-1, MPI_CHAR, MASTER_NODE, - np*ANGLE_LINES+me, world); - } else { - buffer_len = my_angles * line_len; - for (i = 0; i < np; ++i) - if (i != MASTER_NODE) { - MPI_Recv(out_control->buffer + buffer_len, buffer_req - buffer_len, - MPI_CHAR, i, np*ANGLE_LINES+i, world, &status); - MPI_Get_count(&status, MPI_CHAR, &cnt); - buffer_len += cnt; - } - out_control->buffer[buffer_len] = 0; - fputs(out_control->buffer,out_control->strj); - } - } - - void Append_Frame(reax_system *system, control_params *control, - simulation_data *data, reax_list **lists, - output_controls *out_control, MPI_Comm world) - { - Write_Frame_Header(system, data, out_control); - - if (out_control->write_atoms) - Write_Atoms(system, out_control, world); - - if (out_control->write_bonds) - Write_Bonds(system, control, (*lists + BONDS), out_control, world); - - if (out_control->write_angles) - Write_Angles(system, control, (*lists + BONDS), (*lists + THREE_BODIES), - out_control, world); - } - - void End_Traj(int my_rank, output_controls *out_control) - { - if (my_rank == MASTER_NODE) - fclose(out_control->strj); - - free(out_control->buffer); - } -} diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index cafc3516fd..819d7c0d3b 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -31,7 +31,6 @@ namespace ReaxFF struct API { control_params *control; reax_system *system; - output_controls *out_control; simulation_data *data; storage *workspace; reax_list *lists; @@ -39,7 +38,7 @@ namespace ReaxFF // exported Functions - // allocate X + // allocate extern void Allocate_Workspace(control_params *, storage *, int); extern void DeAllocate_System(reax_system *); @@ -50,8 +49,7 @@ namespace ReaxFF // bond orders - extern void BO(reax_system *, control_params *, simulation_data *, - storage *, reax_list **, output_controls *); + extern void BO(reax_system *, storage *, reax_list **); extern int BOp(storage *, reax_list *, double, int, int, far_neighbor_data *, single_body_parameters *, single_body_parameters *, two_body_parameters *); @@ -64,7 +62,7 @@ namespace ReaxFF // control - extern void Read_Control_File(const char *, control_params *, output_controls *); + extern void Read_Control_File(const char *, control_params *); // ffield @@ -73,8 +71,8 @@ namespace ReaxFF // forces - extern void Compute_Forces(reax_system *, control_params *, simulation_data *, - storage *, reax_list **, output_controls *); + extern void Compute_Forces(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); extern void Estimate_Storages(reax_system *, control_params *, reax_list **, int *, int *, int *, int *); @@ -88,16 +86,7 @@ namespace ReaxFF extern void Init_Simulation_Data(simulation_data *); extern void Init_Workspace(reax_system *, control_params *, storage *); extern void Initialize(reax_system *, control_params *, simulation_data *, - storage *, reax_list **, output_controls *, MPI_Comm); - - // io tools - - extern void Init_Output_Files(reax_system *, control_params *, - output_controls *, MPI_Comm); - extern void Close_Output_Files(reax_system *, output_controls *); - extern void Output_Results(reax_system *, control_params *, simulation_data *, - reax_list **, output_controls *, MPI_Comm); - extern void Collect_System_Energy(reax_system *, simulation_data *, MPI_Comm); + storage *, reax_list **, MPI_Comm); // lists @@ -163,24 +152,16 @@ namespace ReaxFF rvec, double, three_body_interaction_data *, three_body_interaction_data *, rvec, rvec, rvec, rvec); - extern void Torsion_Angles(reax_system *, control_params *, simulation_data *, - storage *, reax_list **); - - // traj - - extern void Init_Traj(reax_system *, control_params *, - output_controls *, MPI_Comm); - extern void End_Traj(int, output_controls *); - extern void Append_Frame(reax_system *, control_params *, simulation_data *, - reax_list **, output_controls *, MPI_Comm); + extern void Torsion_Angles(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); // valence angles extern void Calculate_Theta(rvec, double, rvec, double, double *, double *); extern void Calculate_dCos_Theta(rvec, double, rvec, double, rvec *, rvec *, rvec *); - extern void Valence_Angles(reax_system *, control_params *, simulation_data *, - storage *, reax_list **); + extern void Valence_Angles(reax_system *, control_params *, + simulation_data *, storage *, reax_list **); // vector diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index fc88e43dca..1a68116391 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -228,7 +228,6 @@ namespace ReaxFF /* system control parameters */ struct control_params { - char sim_name[REAX_MAX_STR]; int nthreads; double bond_cut; @@ -270,9 +269,7 @@ namespace ReaxFF struct simulation_data { rc_bigint step; - energy_data my_en; // per MPI rank energies - energy_data sys_en; // global energies }; struct three_body_interaction_data @@ -399,27 +396,6 @@ namespace ReaxFF class LAMMPS_NS::Error *error_ptr; }; - struct output_controls - { - FILE *strj; - int atom_line_len; - int bond_line_len; - int angle_line_len; - int write_atoms; - int write_bonds; - int write_angles; - int buffer_len; - char *buffer; - - int write_steps; - char traj_title[81]; - int atom_info; - int bond_info; - int angle_info; - - int energy_update_freq; - }; - struct LR_lookup_table { double xmin, xmax; From 0c88e571732622902de0fbc8cd278d69051f22d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 15:46:27 -0400 Subject: [PATCH 055/352] remove last remnants of OMP_TIMING code hack --- src/USER-OMP/fix_qeq_reax_omp.cpp | 84 +--------------------------- src/USER-OMP/pair_reaxc_omp.cpp | 92 ------------------------------- 2 files changed, 1 insertion(+), 175 deletions(-) diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 3f09fa7353..59a3c093e2 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -248,12 +248,6 @@ void FixQEqReaxOMP::init_storage() void FixQEqReaxOMP::pre_force(int /* vflag */) { - -#ifdef OMP_TIMING - double endTimeBase, startTimeBase, funcstartTimeBase; - funcstartTimeBase = MPI_Wtime(); -#endif - if (update->ntimestep % nevery) return; int n = atom->nlocal; @@ -279,69 +273,22 @@ void FixQEqReaxOMP::pre_force(int /* vflag */) if (n > n_cap*DANGER_ZONE || m_fill > m_cap*DANGER_ZONE) reallocate_matrix(); -#ifdef OMP_TIMING - startTimeBase = MPI_Wtime(); -#endif - init_matvec(); -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEINITMVINDEX] += (endTimeBase-startTimeBase); - startTimeBase = endTimeBase; -#endif - if (dual_enabled) { - matvecs = dual_CG(b_s, b_t, s, t); // OMP_TIMING inside dual_CG + matvecs = dual_CG(b_s, b_t, s, t); } else { matvecs_s = CG(b_s, s); // CG on s - parallel - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECG1INDEX] += (endTimeBase-startTimeBase); - ompTimingCount[COMPUTECG1INDEX]++; - ompTimingCGCount[COMPUTECG1INDEX]+= matvecs_s; - startTimeBase = endTimeBase; -#endif - matvecs_t = CG(b_t, t); // CG on t - parallel - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); - ompTimingCount[COMPUTECG2INDEX]++; - ompTimingCGCount[COMPUTECG2INDEX]+= matvecs_t; - startTimeBase = endTimeBase; -#endif - } // if (dual_enabled) -#ifdef OMP_TIMING - startTimeBase = MPI_Wtime(); -#endif - calculate_Q(); - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECALCQINDEX] += (endTimeBase-startTimeBase); -#endif - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEQEQINDEX] += (endTimeBase-funcstartTimeBase); -#endif } /* ---------------------------------------------------------------------- */ void FixQEqReaxOMP::init_matvec() { -#ifdef OMP_TIMING - long endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif - /* fill-in H matrix */ compute_H(); @@ -410,11 +357,6 @@ void FixQEqReaxOMP::init_matvec() comm->forward_comm_fix(this); //Dist_vector( s ); pack_flag = 3; comm->forward_comm_fix(this); //Dist_vector( t ); - -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEMVCOMPINDEX] += (long) (endTimeBase-startTimeBase); -#endif } /* ---------------------------------------------------------------------- */ @@ -685,12 +627,6 @@ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k) int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) { - -#ifdef OMP_TIMING - double endTimeBase, startTimeBase; - startTimeBase = MPI_Wtime(); -#endif - int i; double alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; double sig_old_s, sig_old_t, sig_new_s, sig_new_t; @@ -836,15 +772,6 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) matvecs_s = matvecs_t = i; // The plus one makes consistent with count from CG() matvecs = i; - // Timing info for iterating s&t together -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECG1INDEX] += (endTimeBase-startTimeBase); - ompTimingCount[COMPUTECG1INDEX]++; - ompTimingCGCount[COMPUTECG1INDEX]+= i; - startTimeBase = endTimeBase; -#endif - // If necessary, converge other system if (sqrt(sig_new_s)/b_norm_s > tolerance) { pack_flag = 2; @@ -861,15 +788,6 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) matvecs_t = i; } - // Timing info for remainder of s or t -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTECG2INDEX] += (endTimeBase-startTimeBase); - ompTimingCount[COMPUTECG2INDEX]++; - ompTimingCGCount[COMPUTECG2INDEX]+= i - matvecs; - startTimeBase = endTimeBase; -#endif - if ( i >= imax && comm->me == 0) error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " "after {} iterations at step {}", diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 9bfd1a3722..178c65a1b1 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -60,12 +60,6 @@ using namespace LAMMPS_NS; using namespace ReaxFF; -#ifdef OMP_TIMING -double ompTimingData[LASTTIMINGINDEX]; -int ompTimingCount[LASTTIMINGINDEX]; -int ompTimingCGCount[LASTTIMINGINDEX]; -#endif - static const char cite_pair_reax_c_omp[] = "pair reax/c/omp and fix qeq/reax/omp command:\n\n" "@Article{Aktulga17,\n" @@ -86,14 +80,6 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) api->system->omp_active = 1; num_nbrs_offset = nullptr; - -#ifdef OMP_TIMING - for (int i=0;iselect.bond_list[i].bo_data.CdboReduction, "CdboReduction"); } memory->destroy(num_nbrs_offset); - -#ifdef OMP_TIMING - int myrank; - - MPI_Comm_rank(world,&myrank); - - // Write screen output - if (timer->has_full() && myrank == 0 && screen) { - fprintf(screen,"\n\nWrite_Lists took %11.3lf seconds", ompTimingData[COMPUTEWLINDEX]); - - fprintf(screen,"\n\nCompute_Forces took %11.3lf seconds:", ompTimingData[COMPUTEINDEX]); - fprintf(screen,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); - fprintf(screen,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); - fprintf(screen,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); - fprintf(screen,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); - fprintf(screen,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); - fprintf(screen,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); - fprintf(screen,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); - fprintf(screen,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); - fprintf(screen,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); - - fprintf(screen,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); - fprintf(screen,"\n ->QEQ init: %11.3lf seconds", ompTimingData[COMPUTEINITMVINDEX]); - - double avg = double(ompTimingCGCount[COMPUTECG1INDEX]) / double(ompTimingCount[COMPUTECG1INDEX]); - fprintf(screen,"\n ->QEQ CG1: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG1INDEX], avg); - - avg = double(ompTimingCGCount[COMPUTECG2INDEX]) / double(ompTimingCount[COMPUTECG2INDEX]); - fprintf(screen,"\n ->QEQ CG2: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG2INDEX], avg); - fprintf(screen,"\n ->QEQ CalcQ: %11.3lf seconds\n", ompTimingData[COMPUTECALCQINDEX]); - } - - // Write logfile output - if (timer->has_full() && myrank == 0 && logfile) { - fprintf(logfile,"\n\nWrite_Lists took %11.3lf seconds", ompTimingData[COMPUTEWLINDEX]); - - fprintf(logfile,"\n\nCompute_Forces took %11.3lf seconds:", ompTimingData[COMPUTEINDEX]); - fprintf(logfile,"\n ->Initial Forces: %11.3lf seconds", ompTimingData[COMPUTEIFINDEX]); - fprintf(logfile,"\n ->Bond Order: %11.3lf seconds", ompTimingData[COMPUTEBOINDEX]); - fprintf(logfile,"\n ->Atom Energy: %11.3lf seconds", ompTimingData[COMPUTEATOMENERGYINDEX]); - fprintf(logfile,"\n ->Bond: %11.3lf seconds", ompTimingData[COMPUTEBONDSINDEX]); - fprintf(logfile,"\n ->Hydrogen bonds: %11.3lf seconds", ompTimingData[COMPUTEHBONDSINDEX]); - fprintf(logfile,"\n ->Torsion Angles: %11.3lf seconds", ompTimingData[COMPUTETORSIONANGLESBOINDEX]); - fprintf(logfile,"\n ->Valence Angles: %11.3lf seconds", ompTimingData[COMPUTEVALENCEANGLESBOINDEX]); - fprintf(logfile,"\n ->Non-Bonded For: %11.3lf seconds", ompTimingData[COMPUTENBFINDEX]); - fprintf(logfile,"\n ->Total Forces: %11.3lf seconds", ompTimingData[COMPUTETFINDEX]); - - fprintf(logfile,"\n\nfixQEQ: %11.3lf seconds", ompTimingData[COMPUTEQEQINDEX]); - fprintf(logfile,"\n ->QEQ init: %11.3lf seconds", ompTimingData[COMPUTEINITMVINDEX]); - - double avg = double(ompTimingCGCount[COMPUTECG1INDEX]) / double(ompTimingCount[COMPUTECG1INDEX]); - fprintf(logfile,"\n ->QEQ CG1: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG1INDEX], avg); - - avg = double(ompTimingCGCount[COMPUTECG2INDEX]) / double(ompTimingCount[COMPUTECG2INDEX]); - fprintf(logfile,"\n ->QEQ CG2: %11.3lf seconds with %4.1lf iterations on average.", ompTimingData[COMPUTECG2INDEX], avg); - fprintf(logfile,"\n ->QEQ CalcQ: %11.3lf seconds\n", ompTimingData[COMPUTECALCQINDEX]); - } -#endif } /* ---------------------------------------------------------------------- */ @@ -206,19 +134,9 @@ void PairReaxCOMP::compute(int eflag, int vflag) // forces -#ifdef OMP_TIMING - double startTimeBase,endTimeBase; - startTimeBase = MPI_Wtime(); -#endif - Compute_ForcesOMP(api->system,api->control,api->data,api->workspace,&api->lists); read_reax_forces(vflag); -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEINDEX] += (endTimeBase-startTimeBase); -#endif - #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif @@ -478,11 +396,6 @@ int PairReaxCOMP::estimate_reax_lists() int PairReaxCOMP::write_reax_lists() { -#ifdef OMP_TIMING - double startTimeBase, endTimeBase; - startTimeBase = MPI_Wtime(); -#endif - int itr_i, itr_j, i, j, num_mynbrs; int *jlist; double d_sqr, dist, cutoff_sqr; @@ -542,11 +455,6 @@ int PairReaxCOMP::write_reax_lists() Set_End_Index(i, num_nbrs_offset[i] + num_mynbrs, far_nbrs); } -#ifdef OMP_TIMING - endTimeBase = MPI_Wtime(); - ompTimingData[COMPUTEWLINDEX] += (endTimeBase-startTimeBase); -#endif - return num_nbrs; } From 937bfe7dd83baefc71d38a9c89ea0f10fe2abc8e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 21:15:45 -0400 Subject: [PATCH 056/352] add some convenience variables to improve readability --- src/USER-REAXC/reaxc_ffield.cpp | 356 ++++++++++++++------------------ 1 file changed, 158 insertions(+), 198 deletions(-) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 67b11bee05..1a47b46f56 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -77,27 +77,28 @@ namespace ReaxFF { ++lineno; // set some defaults + auto gp = reax->gp; - reax->gp.vdw_type = 0; + gp.vdw_type = 0; // get number of global parameters auto values = reader.next_values(0); n = values.next_int(); - reax->gp.n_global = n; + gp.n_global = n; ++lineno; if (n < 1) THROW_ERROR("Invalid number of global parameters"); - memory->create(reax->gp.l,n,"reaxff:gp.l"); + memory->create(gp.l,n,"reaxff:gp.l"); // see reaxff_types.h for mapping between l[i] and the lambdas used in ff for (i = 0; i < n; ++i) { values = reader.next_values(0); ++lineno; - reax->gp.l[i] = values.next_double(); + gp.l[i] = values.next_double(); } // next line is number of atom types followed by 3 lines of comments @@ -111,18 +112,23 @@ namespace ReaxFF { lineno += 4; // allocate and clear storage for ffield data + auto sbp = reax->sbp; + auto tbp = reax->tbp; + auto thbp = reax->thbp; + auto hbp = reax->hbp; + auto fbp = reax->fbp; - memory->create(reax->sbp,n,"reaxff:sbp"); - memory->create(reax->tbp,n,n,"reaxff:tbp"); - memory->create(reax->thbp,n,n,n,"reaxff:thbp"); - memory->create(reax->hbp,n,n,n,"reaxff:hbp"); - memory->create(reax->fbp,n,n,n,n,"reaxff:fbp"); + memory->create(sbp,n,"reaxff:sbp"); + memory->create(tbp,n,n,"reaxff:tbp"); + memory->create(thbp,n,n,n,"reaxff:thbp"); + memory->create(hbp,n,n,n,"reaxff:hbp"); + memory->create(fbp,n,n,n,n,"reaxff:fbp"); memory->create(tor_flag,n,n,n,n,"reaxff:tor_flag"); - memset(&(reax->sbp[0]),0,sizeof(single_body_parameters)*n); - memset(&(reax->tbp[0][0]),0,sizeof(two_body_parameters)*n*n); - memset(&(reax->thbp[0][0][0]),0,sizeof(three_body_header)*n*n*n); - memset(&(reax->hbp[0][0][0]),0,sizeof(hbond_parameters)*n*n*n); - memset(&(reax->fbp[0][0][0][0]),0,sizeof(four_body_header)*n*n*n*n); + memset(&(sbp[0]),0,sizeof(single_body_parameters)*n); + memset(&(tbp[0][0]),0,sizeof(two_body_parameters)*n*n); + memset(&(thbp[0][0][0]),0,sizeof(three_body_header)*n*n*n); + memset(&(hbp[0][0][0]),0,sizeof(hbond_parameters)*n*n*n); + memset(&(fbp[0][0][0][0]),0,sizeof(four_body_header)*n*n*n*n); memset(&tor_flag[0][0][0][0],0,sizeof(char)*n*n*n*n); // atomic parameters @@ -133,6 +139,7 @@ namespace ReaxFF { const int lgflag = control->lgflag; const int ntypes = n; + for (i = 0; i < ntypes; ++i) { // line one @@ -146,20 +153,20 @@ namespace ReaxFF { THROW_ERROR("Invalid force field file format"); auto element = values.next_string(); - int len = MIN(element.size(),3); + int len = MIN(element.size(),3); // truncate stored element symbol if necessary for (j = 0; j < len; ++j) - reax->sbp[i].name[j] = toupper(element[j]); - reax->sbp[i].name[j] = '\0'; + sbp[i].name[j] = toupper(element[j]); + sbp[i].name[len] = '\0'; - reax->sbp[i].r_s = values.next_double(); - reax->sbp[i].valency = values.next_double(); - reax->sbp[i].mass = values.next_double(); - reax->sbp[i].r_vdw = values.next_double(); - reax->sbp[i].epsilon = values.next_double(); - reax->sbp[i].gamma = values.next_double(); - reax->sbp[i].r_pi = values.next_double(); - reax->sbp[i].valency_e = values.next_double(); - reax->sbp[i].nlp_opt = 0.5 * (reax->sbp[i].valency_e-reax->sbp[i].valency); + sbp[i].r_s = values.next_double(); + sbp[i].valency = values.next_double(); + sbp[i].mass = values.next_double(); + sbp[i].r_vdw = values.next_double(); + sbp[i].epsilon = values.next_double(); + sbp[i].gamma = values.next_double(); + sbp[i].r_pi = values.next_double(); + sbp[i].valency_e = values.next_double(); + sbp[i].nlp_opt = 0.5 * (sbp[i].valency_e-sbp[i].valency); // line two @@ -168,14 +175,14 @@ namespace ReaxFF { if (values.count() < 8) THROW_ERROR("Invalid force field file format"); - reax->sbp[i].alpha = values.next_double(); - reax->sbp[i].gamma_w = values.next_double(); - reax->sbp[i].valency_boc= values.next_double(); - reax->sbp[i].p_ovun5 = values.next_double(); + sbp[i].alpha = values.next_double(); + sbp[i].gamma_w = values.next_double(); + sbp[i].valency_boc= values.next_double(); + sbp[i].p_ovun5 = values.next_double(); values.skip(); - reax->sbp[i].chi = values.next_double(); - reax->sbp[i].eta = 2.0*values.next_double(); - reax->sbp[i].p_hbond = (int) values.next_double(); + sbp[i].chi = values.next_double(); + sbp[i].eta = 2.0*values.next_double(); + sbp[i].p_hbond = (int) values.next_double(); // line three @@ -184,12 +191,12 @@ namespace ReaxFF { if (values.count() < 8) THROW_ERROR("Invalid force field file format"); - reax->sbp[i].r_pi_pi = values.next_double(); - reax->sbp[i].p_lp2 = values.next_double(); + sbp[i].r_pi_pi = values.next_double(); + sbp[i].p_lp2 = values.next_double(); values.skip(); - reax->sbp[i].b_o_131 = values.next_double(); - reax->sbp[i].b_o_132 = values.next_double(); - reax->sbp[i].b_o_133 = values.next_double(); + sbp[i].b_o_131 = values.next_double(); + sbp[i].b_o_132 = values.next_double(); + sbp[i].b_o_133 = values.next_double(); // line four @@ -198,14 +205,14 @@ namespace ReaxFF { if (values.count() < 8) THROW_ERROR("Invalid force field file format"); - reax->sbp[i].p_ovun2 = values.next_double(); - reax->sbp[i].p_val3 = values.next_double(); + sbp[i].p_ovun2 = values.next_double(); + sbp[i].p_val3 = values.next_double(); values.skip(); - reax->sbp[i].valency_val= values.next_double(); - reax->sbp[i].p_val5 = values.next_double(); - reax->sbp[i].rcore2 = values.next_double(); - reax->sbp[i].ecore2 = values.next_double(); - reax->sbp[i].acore2 = values.next_double(); + sbp[i].valency_val= values.next_double(); + sbp[i].p_val5 = values.next_double(); + sbp[i].rcore2 = values.next_double(); + sbp[i].ecore2 = values.next_double(); + sbp[i].acore2 = values.next_double(); // read line five only when lgflag != 0 @@ -214,72 +221,72 @@ namespace ReaxFF { ++lineno; if (values.count() < 2) THROW_ERROR("Invalid force field file format"); - reax->sbp[i].lgcij = values.next_double(); - reax->sbp[i].lgre = values.next_double(); - } else reax->sbp[i].lgcij = reax->sbp[i].lgre = 0.0; + sbp[i].lgcij = values.next_double(); + sbp[i].lgre = values.next_double(); + } else sbp[i].lgcij = sbp[i].lgre = 0.0; // van der Waals settings check: // Inner-wall? - if ((reax->sbp[i].rcore2 > 0.01) && (reax->sbp[i].acore2 > 0.01)) { + if ((sbp[i].rcore2 > 0.01) && (sbp[i].acore2 > 0.01)) { // Shielding van der Waals? - if (reax->sbp[i].gamma_w > 0.5) { - if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { + if (sbp[i].gamma_w > 0.5) { + if (gp.vdw_type != 0 && gp.vdw_type != 3) { const auto errmsg = fmt::format("Van der Waals parameters for element {} " "indicate inner wall+shielding, but earlier " "atoms indicate a different van der Waals " "method. This may cause division-by-zero " "errors. Keeping van der Waals setting for " - "earlier atoms.",reax->sbp[i].name); + "earlier atoms.",sbp[i].name); error->warning(FLERR,errmsg); } else { - reax->gp.vdw_type = 3; + gp.vdw_type = 3; } } else { // No shielding van der Waals parameters present - if ((reax->gp.vdw_type != 0) && (reax->gp.vdw_type != 2)) { + if ((gp.vdw_type != 0) && (gp.vdw_type != 2)) { const auto errmsg = fmt::format("Van der Waals parameters for element {} " "indicate inner wall withou shielding, but " "earlier atoms indicate a different van der " "Waals-method. This may cause division-by-" "zero errors. Keeping van der Waals setting " - "for earlier atoms.", reax->sbp[i].name); + "for earlier atoms.", sbp[i].name); error->warning(FLERR,errmsg); } else { - reax->gp.vdw_type = 2; + gp.vdw_type = 2; } } } else { // No Inner wall parameters present - if (reax->sbp[i].gamma_w > 0.5) { // Shielding vdWaals - if ((reax->gp.vdw_type != 0) && (reax->gp.vdw_type != 1)) { + if (sbp[i].gamma_w > 0.5) { // Shielding vdWaals + if ((gp.vdw_type != 0) && (gp.vdw_type != 1)) { const auto errmsg = fmt::format("Van der Waals parameters for element {} " "indicate shielding without inner wall, but " "earlier elements indicate a different van der " "Waals method. This may cause division-by-zero " "errors. Keeping van der Waals setting for " - "earlier atoms.", reax->sbp[i].name); + "earlier atoms.", sbp[i].name); error->warning(FLERR,errmsg); } else { - reax->gp.vdw_type = 1; + gp.vdw_type = 1; } } else { error->one(FLERR,fmt::format("Inconsistent van der Waals " "parameters: No shielding or inner " "wall set for element {}", - reax->sbp[i].name)); + sbp[i].name)); } } } /* Equate vval3 to valf for first-row elements (25/10/2004) */ for (i = 0; i < ntypes; i++) { - if ((reax->sbp[i].mass < 21) && - (reax->sbp[i].valency_val != reax->sbp[i].valency_boc)) { + if ((sbp[i].mass < 21) && + (sbp[i].valency_val != sbp[i].valency_boc)) { error->warning(FLERR,fmt::format("Changed valency_val to valency" - "_boc for {}", reax->sbp[i].name)); - reax->sbp[i].valency_val = reax->sbp[i].valency_boc; + "_boc for {}", sbp[i].name)); + sbp[i].valency_val = sbp[i].valency_boc; } } @@ -306,14 +313,14 @@ namespace ReaxFF { THROW_ERROR("Inconsistent force field file"); if ((j < ntypes) && (k < ntypes)) { - reax->tbp[j][k].De_s = reax->tbp[k][j].De_s = values.next_double(); - reax->tbp[j][k].De_p = reax->tbp[k][j].De_p = values.next_double(); - reax->tbp[j][k].De_pp = reax->tbp[k][j].De_pp = values.next_double(); - reax->tbp[j][k].p_be1 = reax->tbp[k][j].p_be1 = values.next_double(); - reax->tbp[j][k].p_bo5 = reax->tbp[k][j].p_bo5 = values.next_double(); - reax->tbp[j][k].v13cor = reax->tbp[k][j].v13cor = values.next_double(); - reax->tbp[j][k].p_bo6 = reax->tbp[k][j].p_bo6 = values.next_double(); - reax->tbp[j][k].p_ovun1 = reax->tbp[k][j].p_ovun1 = values.next_double(); + tbp[j][k].De_s = tbp[k][j].De_s = values.next_double(); + tbp[j][k].De_p = tbp[k][j].De_p = values.next_double(); + tbp[j][k].De_pp = tbp[k][j].De_pp = values.next_double(); + tbp[j][k].p_be1 = tbp[k][j].p_be1 = values.next_double(); + tbp[j][k].p_bo5 = tbp[k][j].p_bo5 = values.next_double(); + tbp[j][k].v13cor = tbp[k][j].v13cor = values.next_double(); + tbp[j][k].p_bo6 = tbp[k][j].p_bo6 = values.next_double(); + tbp[j][k].p_ovun1 = tbp[k][j].p_ovun1 = values.next_double(); } // second line @@ -324,69 +331,40 @@ namespace ReaxFF { THROW_ERROR("Invalid force field file format"); if ((j < ntypes) && (k < ntypes)) { - reax->tbp[j][k].p_be2 = reax->tbp[k][j].p_be2 = values.next_double(); - reax->tbp[j][k].p_bo3 = reax->tbp[k][j].p_bo3 = values.next_double(); - reax->tbp[j][k].p_bo4 = reax->tbp[k][j].p_bo4 = values.next_double(); + tbp[j][k].p_be2 = tbp[k][j].p_be2 = values.next_double(); + tbp[j][k].p_bo3 = tbp[k][j].p_bo3 = values.next_double(); + tbp[j][k].p_bo4 = tbp[k][j].p_bo4 = values.next_double(); values.skip(); - reax->tbp[j][k].p_bo1 = reax->tbp[k][j].p_bo1 = values.next_double(); - reax->tbp[j][k].p_bo2 = reax->tbp[k][j].p_bo2 = values.next_double(); - reax->tbp[j][k].ovc = reax->tbp[k][j].ovc = values.next_double(); + tbp[j][k].p_bo1 = tbp[k][j].p_bo1 = values.next_double(); + tbp[j][k].p_bo2 = tbp[k][j].p_bo2 = values.next_double(); + tbp[j][k].ovc = tbp[k][j].ovc = values.next_double(); } } for (i=0; i < ntypes; ++i) { for (j=i; j < ntypes; ++j) { - reax->tbp[i][j].r_s = reax->tbp[j][i].r_s = - 0.5*(reax->sbp[j].r_s + reax->sbp[i].r_s); - - reax->tbp[i][j].r_p = reax->tbp[j][i].r_p = - 0.5*(reax->sbp[j].r_pi + reax->sbp[i].r_pi); - - reax->tbp[i][j].r_pp = reax->tbp[j][i].r_pp = - 0.5*(reax->sbp[j].r_pi_pi + reax->sbp[i].r_pi_pi); - - reax->tbp[i][j].p_boc3 = reax->tbp[j][i].p_boc3 = - sqrt(reax->sbp[j].b_o_132 * reax->sbp[i].b_o_132); - - reax->tbp[i][j].p_boc4 = reax->tbp[j][i].p_boc4 = - sqrt(reax->sbp[j].b_o_131 * reax->sbp[i].b_o_131); - - reax->tbp[i][j].p_boc5 = reax->tbp[j][i].p_boc5 = - sqrt(reax->sbp[j].b_o_133 * reax->sbp[i].b_o_133); - - reax->tbp[i][j].D = reax->tbp[j][i].D = - sqrt(reax->sbp[j].epsilon * reax->sbp[i].epsilon); - - reax->tbp[i][j].alpha = reax->tbp[j][i].alpha = - sqrt(reax->sbp[j].alpha * reax->sbp[i].alpha); - - reax->tbp[i][j].r_vdW = reax->tbp[j][i].r_vdW = - 2.0*sqrt(reax->sbp[j].r_vdw * reax->sbp[i].r_vdw); - - reax->tbp[i][j].gamma_w = reax->tbp[j][i].gamma_w = - sqrt(reax->sbp[j].gamma_w * reax->sbp[i].gamma_w); - - reax->tbp[i][j].gamma = reax->tbp[j][i].gamma = - pow(reax->sbp[j].gamma * reax->sbp[i].gamma,-1.5); + tbp[i][j].r_s = tbp[j][i].r_s = 0.5*(sbp[j].r_s + sbp[i].r_s); + tbp[i][j].r_p = tbp[j][i].r_p = 0.5*(sbp[j].r_pi + sbp[i].r_pi); + tbp[i][j].r_pp = tbp[j][i].r_pp = 0.5*(sbp[j].r_pi_pi + sbp[i].r_pi_pi); + tbp[i][j].p_boc3 = tbp[j][i].p_boc3 = sqrt(sbp[j].b_o_132 * sbp[i].b_o_132); + tbp[i][j].p_boc4 = tbp[j][i].p_boc4 = sqrt(sbp[j].b_o_131 * sbp[i].b_o_131); + tbp[i][j].p_boc5 = tbp[j][i].p_boc5 = sqrt(sbp[j].b_o_133 * sbp[i].b_o_133); + tbp[i][j].D = tbp[j][i].D = sqrt(sbp[j].epsilon * sbp[i].epsilon); + tbp[i][j].alpha = tbp[j][i].alpha = sqrt(sbp[j].alpha * sbp[i].alpha); + tbp[i][j].r_vdW = tbp[j][i].r_vdW = 2.0*sqrt(sbp[j].r_vdw * sbp[i].r_vdw); + tbp[i][j].gamma_w = tbp[j][i].gamma_w = sqrt(sbp[j].gamma_w * sbp[i].gamma_w); + tbp[i][j].gamma = tbp[j][i].gamma = pow(sbp[j].gamma * sbp[i].gamma,-1.5); // additions for additional vdWaals interaction types - inner core - reax->tbp[i][j].rcore = reax->tbp[j][i].rcore = - sqrt(reax->sbp[i].rcore2 * reax->sbp[j].rcore2); - - reax->tbp[i][j].ecore = reax->tbp[j][i].ecore = - sqrt(reax->sbp[i].ecore2 * reax->sbp[j].ecore2); - - reax->tbp[i][j].acore = reax->tbp[j][i].acore = - sqrt(reax->sbp[i].acore2 * reax->sbp[j].acore2); + tbp[i][j].rcore = tbp[j][i].rcore = sqrt(sbp[i].rcore2 * sbp[j].rcore2); + tbp[i][j].ecore = tbp[j][i].ecore = sqrt(sbp[i].ecore2 * sbp[j].ecore2); + tbp[i][j].acore = tbp[j][i].acore = sqrt(sbp[i].acore2 * sbp[j].acore2); // additions for additional vdWalls interaction types lg correction - reax->tbp[i][j].lgcij = reax->tbp[j][i].lgcij = - sqrt(reax->sbp[i].lgcij * reax->sbp[j].lgcij); - - reax->tbp[i][j].lgre = reax->tbp[j][i].lgre - = 2.0 * reax->gp.l[35] * sqrt(reax->sbp[i].lgre*reax->sbp[j].lgre); + tbp[i][j].lgcij = tbp[j][i].lgcij = sqrt(sbp[i].lgcij * sbp[j].lgcij); + tbp[i][j].lgre = tbp[j][i].lgre = 2.0*gp.l[35]*sqrt(sbp[i].lgre*sbp[j].lgre); } } @@ -411,26 +389,26 @@ namespace ReaxFF { if ((j < ntypes) && (k < ntypes)) { val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].D = reax->tbp[k][j].D = val; + if (val > 0.0) tbp[j][k].D = tbp[k][j].D = val; val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].r_vdW = reax->tbp[k][j].r_vdW = 2*val; + if (val > 0.0) tbp[j][k].r_vdW = tbp[k][j].r_vdW = 2*val; val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].alpha = reax->tbp[k][j].alpha = val; + if (val > 0.0) tbp[j][k].alpha = tbp[k][j].alpha = val; val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].r_s = reax->tbp[k][j].r_s = val; + if (val > 0.0) tbp[j][k].r_s = tbp[k][j].r_s = val; val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].r_p = reax->tbp[k][j].r_p = val; + if (val > 0.0) tbp[j][k].r_p = tbp[k][j].r_p = val; val = values.next_double(); - if (val > 0.0) reax->tbp[j][k].r_pp = reax->tbp[k][j].r_pp = val; + if (val > 0.0) tbp[j][k].r_pp = tbp[k][j].r_pp = val; if (lgflag) { val = values.next_double(); - if (val >= 0.0) reax->tbp[j][k].lgcij = reax->tbp[k][j].lgcij = val; + if (val >= 0.0) tbp[j][k].lgcij = tbp[k][j].lgcij = val; } } } @@ -457,37 +435,37 @@ namespace ReaxFF { if ((j < ntypes) && (k < ntypes) && (l < ntypes)) { - cnt = reax->thbp[j][k][l].cnt; - reax->thbp[j][k][l].cnt++; - reax->thbp[l][k][j].cnt++; + cnt = thbp[j][k][l].cnt; + thbp[j][k][l].cnt++; + thbp[l][k][j].cnt++; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].theta_00 = val; - reax->thbp[l][k][j].prm[cnt].theta_00 = val; + thbp[j][k][l].prm[cnt].theta_00 = val; + thbp[l][k][j].prm[cnt].theta_00 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_val1 = val; - reax->thbp[l][k][j].prm[cnt].p_val1 = val; + thbp[j][k][l].prm[cnt].p_val1 = val; + thbp[l][k][j].prm[cnt].p_val1 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_val2 = val; - reax->thbp[l][k][j].prm[cnt].p_val2 = val; + thbp[j][k][l].prm[cnt].p_val2 = val; + thbp[l][k][j].prm[cnt].p_val2 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_coa1 = val; - reax->thbp[l][k][j].prm[cnt].p_coa1 = val; + thbp[j][k][l].prm[cnt].p_coa1 = val; + thbp[l][k][j].prm[cnt].p_coa1 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_val7 = val; - reax->thbp[l][k][j].prm[cnt].p_val7 = val; + thbp[j][k][l].prm[cnt].p_val7 = val; + thbp[l][k][j].prm[cnt].p_val7 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_pen1 = val; - reax->thbp[l][k][j].prm[cnt].p_pen1 = val; + thbp[j][k][l].prm[cnt].p_pen1 = val; + thbp[l][k][j].prm[cnt].p_pen1 = val; val = values.next_double(); - reax->thbp[j][k][l].prm[cnt].p_val4 = val; - reax->thbp[l][k][j].prm[cnt].p_val4 = val; + thbp[j][k][l].prm[cnt].p_val4 = val; + thbp[l][k][j].prm[cnt].p_val4 = val; } } @@ -511,65 +489,48 @@ namespace ReaxFF { if ((j < -1) || (k < 0) || (l < 0) || (m < -1)) THROW_ERROR("Inconsistent force field file"); + const double val1 = values.next_double(); + const double val2 = values.next_double(); + const double val3 = values.next_double(); + const double val4 = values.next_double(); + const double val5 = values.next_double(); + if ((j >= 0) && (m >= 0)) { // this means the entry is not in compact form if ((j < ntypes) && (k < ntypes) && (l < ntypes) && (m < ntypes)) { - tor_flag[j][k][l][m] = 1; - tor_flag[m][l][k][j] = 1; + tor_flag[j][k][l][m] = tor_flag[m][l][k][j] = 1; + fbp[j][k][l][m].cnt = fbp[m][l][k][j].cnt = 1; - reax->fbp[j][k][l][m].cnt = 1; - reax->fbp[m][l][k][j].cnt = 1; - - val = values.next_double(); - reax->fbp[j][k][l][m].prm[0].V1 = val; - reax->fbp[m][l][k][j].prm[0].V1 = val; - - val = values.next_double(); - reax->fbp[j][k][l][m].prm[0].V2 = val; - reax->fbp[m][l][k][j].prm[0].V2 = val; - - val = values.next_double(); - reax->fbp[j][k][l][m].prm[0].V3 = val; - reax->fbp[m][l][k][j].prm[0].V3 = val; - - val = values.next_double(); - reax->fbp[j][k][l][m].prm[0].p_tor1 = val; - reax->fbp[m][l][k][j].prm[0].p_tor1 = val; - - val = values.next_double(); - reax->fbp[j][k][l][m].prm[0].p_cot1 = val; - reax->fbp[m][l][k][j].prm[0].p_cot1 = val; + fbp[j][k][l][m].prm[0].V1 = fbp[m][l][k][j].prm[0].V1 = val1; + fbp[j][k][l][m].prm[0].V2 = fbp[m][l][k][j].prm[0].V2 = val2; + fbp[j][k][l][m].prm[0].V3 = fbp[m][l][k][j].prm[0].V3 = val3; + fbp[j][k][l][m].prm[0].p_tor1 = fbp[m][l][k][j].prm[0].p_tor1 = val4; + fbp[j][k][l][m].prm[0].p_cot1 = fbp[m][l][k][j].prm[0].p_cot1 = val5; } } else { /* This means the entry is of the form 0-X-Y-0 */ if ((k < ntypes) && (l < ntypes)) { - const double val1 = values.next_double(); - const double val2 = values.next_double(); - const double val3 = values.next_double(); - const double val4 = values.next_double(); - const double val5 = values.next_double(); - for (int p = 0; p < ntypes; ++p) { for (int o = 0; o < ntypes; ++o) { - reax->fbp[p][k][l][o].cnt = 1; - reax->fbp[o][l][k][p].cnt = 1; if (tor_flag[p][k][l][o] == 0) { - reax->fbp[p][k][l][o].prm[0].V1 = val1; - reax->fbp[p][k][l][o].prm[0].V2 = val2; - reax->fbp[p][k][l][o].prm[0].V3 = val3; - reax->fbp[p][k][l][o].prm[0].p_tor1 = val4; - reax->fbp[p][k][l][o].prm[0].p_cot1 = val5; + fbp[p][k][l][o].cnt = 1; + fbp[p][k][l][o].prm[0].V1 = val1; + fbp[p][k][l][o].prm[0].V2 = val2; + fbp[p][k][l][o].prm[0].V3 = val3; + fbp[p][k][l][o].prm[0].p_tor1 = val4; + fbp[p][k][l][o].prm[0].p_cot1 = val5; } if (tor_flag[o][l][k][p] == 0) { - reax->fbp[o][l][k][p].prm[0].V1 = val1; - reax->fbp[o][l][k][p].prm[0].V2 = val2; - reax->fbp[o][l][k][p].prm[0].V3 = val3; - reax->fbp[o][l][k][p].prm[0].p_tor1 = val4; - reax->fbp[o][l][k][p].prm[0].p_cot1 = val5; + fbp[o][l][k][p].cnt = 1; + fbp[o][l][k][p].prm[0].V1 = val1; + fbp[o][l][k][p].prm[0].V2 = val2; + fbp[o][l][k][p].prm[0].V3 = val3; + fbp[o][l][k][p].prm[0].p_tor1 = val4; + fbp[o][l][k][p].prm[0].p_cot1 = val5; } } } @@ -586,7 +547,7 @@ namespace ReaxFF { for (i = 0; i < ntypes; ++i) for (j = 0; j < ntypes; ++j) for (k = 0; k < ntypes; ++k) - reax->hbp[i][j][k].r0_hb = -1.0; + hbp[i][j][k].r0_hb = -1.0; for (i = 0; i < n; ++i) { values = reader.next_values(0); @@ -602,10 +563,10 @@ namespace ReaxFF { THROW_ERROR("Inconsistent force field file"); if ((j < ntypes) && (k < ntypes) && (l < ntypes)) { - reax->hbp[j][k][l].r0_hb = values.next_double(); - reax->hbp[j][k][l].p_hb1 = values.next_double(); - reax->hbp[j][k][l].p_hb2 = values.next_double(); - reax->hbp[j][k][l].p_hb3 = values.next_double(); + hbp[j][k][l].r0_hb = values.next_double(); + hbp[j][k][l].p_hb1 = values.next_double(); + hbp[j][k][l].p_hb2 = values.next_double(); + hbp[j][k][l].p_hb3 = values.next_double(); } } @@ -622,8 +583,8 @@ namespace ReaxFF { // allocate storage for atom type based data MPI_Bcast(&reax->num_atom_types,1,MPI_INT,0,world); + const int n = reax->num_atom_types; if (control->me != 0) { - const int n = reax->num_atom_types; memory->create(reax->sbp,n,"reaxff:sbp"); memory->create(reax->tbp,n,n,"reaxff:tbp"); memory->create(reax->thbp,n,n,n,"reaxff:thbp"); @@ -632,14 +593,13 @@ namespace ReaxFF { } // broadcast type specific force field data - const int n = reax->num_atom_types; MPI_Bcast(&(reax->sbp[0]),sizeof(single_body_parameters)*n,MPI_CHAR,0,world); MPI_Bcast(&(reax->tbp[0][0]),sizeof(two_body_parameters)*n*n,MPI_CHAR,0,world); MPI_Bcast(&(reax->thbp[0][0][0]),sizeof(three_body_header)*n*n*n,MPI_CHAR,0,world); MPI_Bcast(&(reax->hbp[0][0][0]),sizeof(hbond_parameters)*n*n*n,MPI_CHAR,0,world); MPI_Bcast(&(reax->fbp[0][0][0][0]),sizeof(four_body_header)*n*n*n*n,MPI_CHAR,0,world); - // apply parameters to various settings + // apply global parameters to global control settings control->bo_cut = 0.01 * reax->gp.l[29]; control->nonb_low = reax->gp.l[11]; From e901fff8b61ef3034824f3f51898db57cf4dcc62 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 21:18:42 -0400 Subject: [PATCH 057/352] remove unused variable --- src/KOKKOS/pair_reaxc_kokkos.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index deb1dc74fd..04c70342ed 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -3063,7 +3063,6 @@ KOKKOS_INLINE_FUNCTION void PairReaxCKokkos::operator()(PairReaxComputeBond1, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); - auto a_f = v_f.template access::value>(); auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access::value>(); From f9d133dcbaeaa35e566b88b18e3ec1a7ee178ee4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 22:07:38 -0400 Subject: [PATCH 058/352] must use a reference for the shortcut to work --- src/USER-REAXC/reaxc_ffield.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 1a47b46f56..7e60682102 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -77,7 +77,7 @@ namespace ReaxFF { ++lineno; // set some defaults - auto gp = reax->gp; + auto &gp = reax->gp; gp.vdw_type = 0; @@ -112,11 +112,11 @@ namespace ReaxFF { lineno += 4; // allocate and clear storage for ffield data - auto sbp = reax->sbp; - auto tbp = reax->tbp; - auto thbp = reax->thbp; - auto hbp = reax->hbp; - auto fbp = reax->fbp; + auto &sbp = reax->sbp; + auto &tbp = reax->tbp; + auto &thbp = reax->thbp; + auto &hbp = reax->hbp; + auto &fbp = reax->fbp; memory->create(sbp,n,"reaxff:sbp"); memory->create(tbp,n,n,"reaxff:tbp"); From 43491b4220ad29370af72883854d834ecb8219d7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 22:31:35 -0400 Subject: [PATCH 059/352] lift compile time limit to 25 atom types --- src/USER-REAXC/reaxc_lookup.cpp | 15 ++++++++------- src/USER-REAXC/reaxff_defs.h | 1 - 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index 58eab80d17..c2013c0500 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -148,8 +148,6 @@ namespace ReaxFF { storage *workspace, MPI_Comm world) { int i, j, r; - int num_atom_types; - int existing_types[REAX_MAX_ATOM_TYPES], aggregated[REAX_MAX_ATOM_TYPES]; double dr; double *h, *fh, *fvdw, *fele, *fCEvd, *fCEclmb; double v0_vdw, v0_ele, vlast_vdw, vlast_ele; @@ -161,7 +159,9 @@ namespace ReaxFF { vlast_vdw = 0; vlast_ele = 0; - num_atom_types = system->reax_param.num_atom_types; + const int num_atom_types = system->reax_param.num_atom_types; + int *existing_types = new int[num_atom_types]; + int *aggregated = new int[num_atom_types]; dr = control->nonb_cut / control->tabulate; h = (double*) smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); @@ -182,13 +182,12 @@ namespace ReaxFF { LR[i] = (LR_lookup_table*) scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]"); - for (i = 0; i < REAX_MAX_ATOM_TYPES; ++i) + for (i = 0; i < num_atom_types; ++i) existing_types[i] = 0; for (i = 0; i < system->n; ++i) - existing_types[ system->my_atoms[i].type ] = 1; + existing_types[system->my_atoms[i].type] = 1; - MPI_Allreduce(existing_types, aggregated, REAX_MAX_ATOM_TYPES, - MPI_INT, MPI_SUM, world); + MPI_Allreduce(existing_types, aggregated, num_atom_types, MPI_INT, MPI_SUM, world); for (i = 0; i < num_atom_types; ++i) { if (aggregated[i]) { @@ -261,6 +260,8 @@ namespace ReaxFF { free(fCEvd); free(fele); free(fCEclmb); + delete[] existing_types; + delete[] aggregated; } void Deallocate_Lookup_Tables(reax_system *system) diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index 917255c5f0..6b3e021707 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -81,7 +81,6 @@ #define REAX_MAX_STR 1024 #define REAX_MAX_3BODY_PARAM 5 #define REAX_MAX_4BODY_PARAM 5 -#define REAX_MAX_ATOM_TYPES 25 namespace ReaxFF { From c11e9cc84925f4b8889d093aeb328f77395295ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 18 Apr 2021 22:59:55 -0400 Subject: [PATCH 060/352] remove unused defines and enumerators --- src/USER-REAXC/reaxff_defs.h | 33 +-------------------------------- 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index 6b3e021707..854871e5a7 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -33,28 +33,9 @@ #define constPI 3.14159265 #define C_ele 332.06371 -//#define K_B 503.398008 // kcal/mol/K -#define K_B 0.831687 // amu A^2 / ps^2 / K -#define F_CONV 1e6 / 48.88821291 / 48.88821291 // --> amu A / ps^2 -#define E_CONV 0.002391 // amu A^2 / ps^2 --> kcal/mol #define EV_to_KCALpMOL 14.400000 // ElectronVolt --> KCAL per MOLe #define KCALpMOL_to_EV 23.02 // 23.060549 //KCAL per MOLe --> ElectronVolt -#define ECxA_to_DEBYE 4.803204 // elem. charge * Ang -> debye -#define CAL_to_JOULES 4.184000 // CALories --> JOULES -#define JOULES_to_CAL 1/4.184000 // JOULES --> CALories -#define AMU_to_GRAM 1.6605e-24 -#define ANG_to_CM 1e-8 -#define AVOGNR 6.0221367e23 -#define P_CONV 1e-24 * AVOGNR * JOULES_to_CAL -#define MAX_STR 1024 -#define MAX_LINE 1024 -#define MAX_TOKENS 1024 -#define MAX_TOKEN_LEN 1024 - -#define ALMOST_ZERO 1e-10 -#define NEG_INF -1e10 -#define NO_BOND 1e-3 // 0.001 #define HB_THRESHOLD 1e-2 // 0.01 #define REAX_MIN_CAP 50 @@ -68,29 +49,17 @@ #define REAX_SAFER_ZONE 1.4 #define DANGER_ZONE 0.90 #define LOOSE_ZONE 0.75 -#define MAX_3BODY_PARAM 5 -#define MAX_4BODY_PARAM 5 - -#define MASTER_NODE 0 #define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ #define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ -/************* crucial for reaxff_types.h *********/ - -#define REAX_MAX_STR 1024 #define REAX_MAX_3BODY_PARAM 5 #define REAX_MAX_4BODY_PARAM 5 namespace ReaxFF { /******************* ENUMERATORS *************************/ - - enum lists { BONDS, OLD_BONDS, THREE_BODIES, - HBONDS, FAR_NBRS, DBOS, DDELTAS, LIST_N }; - - enum message_tags {NONE, INIT_DESCS, ATOM_LINES, BOND_LINES, ANGLE_LINES}; - + enum lists { BONDS, THREE_BODIES, HBONDS, FAR_NBRS, LIST_N }; enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; } From 6c4ad8ad35951268a9a5bcc99dd069c2450224a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Apr 2021 07:38:50 -0400 Subject: [PATCH 061/352] implement nowarn flag for qeq/reax fixes and add scalar compute function for number of qeq iterations make behavior handling the maximum number of iterations consistent across USER-REAXC, USER-OMP and KOKKOS package variants so that they all give the same results for the same number of iterations in serial and parallel --- doc/src/fix_qeq_reax.rst | 46 +++++++++++++++++++----------- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 14 +++++---- src/KOKKOS/fix_qeq_reax_kokkos.h | 4 +-- src/USER-OMP/fix_qeq_reax_omp.cpp | 31 ++++++++++---------- src/USER-REAXC/fix_qeq_reax.cpp | 27 ++++++++++++++---- src/USER-REAXC/fix_qeq_reax.h | 12 ++------ 6 files changed, 79 insertions(+), 55 deletions(-) diff --git a/doc/src/fix_qeq_reax.rst b/doc/src/fix_qeq_reax.rst index 8752888c4c..430a037d8d 100644 --- a/doc/src/fix_qeq_reax.rst +++ b/doc/src/fix_qeq_reax.rst @@ -24,10 +24,10 @@ Syntax .. parsed-literal:: - keyword = *dual* or *maxiter* + keyword = *dual* or *maxiter* or *nowarn* *dual* = process S and T matrix in parallel (only for qeq/reax/omp) *maxiter* N = limit the number of iterations to *N* - + *nowarn* = do not print a warning message if the maximum number of iterations was reached Examples """""""" @@ -40,13 +40,15 @@ Examples Description """"""""""" -Perform the charge equilibration (QEq) method as described in :ref:`(Rappe and Goddard) ` and formulated in :ref:`(Nakano) `. It is -typically used in conjunction with the ReaxFF force field model as -implemented in the :doc:`pair_style reax/c ` command, but -it can be used with any potential in LAMMPS, so long as it defines and -uses charges on each atom. The :doc:`fix qeq/comb ` -command should be used to perform charge equilibration with the :doc:`COMB potential `. For more technical details about the -charge equilibration performed by fix qeq/reax, see the +Perform the charge equilibration (QEq) method as described in +:ref:`(Rappe and Goddard) ` and formulated in :ref:`(Nakano) +`. It is typically used in conjunction with the ReaxFF force +field model as implemented in the :doc:`pair_style reax/c ` +command, but it can be used with any potential in LAMMPS, so long as it +defines and uses charges on each atom. The :doc:`fix qeq/comb +` command should be used to perform charge equilibration +with the :doc:`COMB potential `. For more technical details +about the charge equilibration performed by fix qeq/reax, see the :ref:`(Aktulga) ` paper. The QEq method minimizes the electrostatic energy of the system by @@ -79,12 +81,21 @@ the *qeq/reax/omp* style. Otherwise they are processed separately. The optional *maxiter* keyword allows changing the max number of iterations in the linear solver. The default value is 200. +The optional *nowarn* keyword silences the warning message printed +when the maximum number of iterations was reached. This can be +useful for comparing serial and parallel results where having the +same fixed number of QEq iterations is desired, which can be achieved +by using a very small tolerance and setting *maxiter* to the desired +number of iterations. + Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -No information about this fix is written to :doc:`binary restart files `. No global scalar or vector or per-atom -quantities are stored by this fix for access by various :doc:`output commands `. No parameter of this fix can be used -with the *start/stop* keywords of the :doc:`run ` command. +No information about this fix is written to :doc:`binary restart files +`. This fix computes a global scalar (the number of +iterations) for access by various :doc:`output commands `. +No parameter of this fix can be used with the *start/stop* keywords of +the :doc:`run ` command. This fix is invoked during :doc:`energy minimization `. @@ -97,12 +108,13 @@ This fix is invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the USER-REAXC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +Fix *qeq/reax* is part of the USER-REAXC package. It is only enabled if +LAMMPS was built with this package. See the :doc:`Build package +` doc page for more info. -This fix does not correctly handle interactions -involving multiple periodic images of the same atom. Hence, it should not -be used for periodic cell dimensions less than 10 angstroms. +This fix does not correctly handle interactions involving multiple +periodic images of the same atom. Hence, it should not be used for +periodic cell dimensions less than 10 angstroms. Related commands """""""""""""""" diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index fe1969c54f..1094d953b7 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -281,11 +281,11 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) // 1st cg solve over b_s, s - cg_solve1(); + matvecs = cg_solve1(); // 2nd cg solve over b_t, t - cg_solve2(); + matvecs += cg_solve2(); // calculate_Q(); @@ -721,7 +721,7 @@ void FixQEqReaxKokkos::matvec_item(int ii) const /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::cg_solve1() +int FixQEqReaxKokkos::cg_solve1() // b = b_s, x = s; { const int inum = list->inum; @@ -838,17 +838,18 @@ void FixQEqReaxKokkos::cg_solve1() Kokkos::parallel_for(inum,vecsum2_functor); } - if (loop >= imax && comm->me == 0) + if ((loop >= imax) && maxwarn && (comm->me == 0)) error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve1 convergence " "failed after {} iterations at step {}: " "{}", loop, update->ntimestep, sqrt(sig_new)/b_norm)); + return loop; } /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::cg_solve2() +int FixQEqReaxKokkos::cg_solve2() // b = b_t, x = t; { const int inum = list->inum; @@ -967,11 +968,12 @@ void FixQEqReaxKokkos::cg_solve2() Kokkos::parallel_for(inum,vecsum2_functor); } - if (loop >= imax && comm->me == 0) + if ((loop >= imax) && maxwarn && (comm->me == 0)) error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve2 convergence " "failed after {} iterations at step {}: " "{}", loop, update->ntimestep, sqrt(sig_new)/b_norm)); + return loop; } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.h b/src/KOKKOS/fix_qeq_reax_kokkos.h index bbfeb00266..929a37748c 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.h +++ b/src/KOKKOS/fix_qeq_reax_kokkos.h @@ -224,8 +224,8 @@ class FixQEqReaxKokkos : public FixQEqReax, public KokkosBase { void init_hist(); void allocate_matrix(); void allocate_array(); - void cg_solve1(); - void cg_solve2(); + int cg_solve1(); + int cg_solve2(); void calculate_q(); int neighflag, pack_flag; diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 59a3c093e2..52e9565a46 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -280,6 +280,7 @@ void FixQEqReaxOMP::pre_force(int /* vflag */) } else { matvecs_s = CG(b_s, s); // CG on s - parallel matvecs_t = CG(b_t, t); // CG on t - parallel + matvecs = matvecs_s + matvecs_t; } // if (dual_enabled) calculate_Q(); @@ -461,7 +462,7 @@ int FixQEqReaxOMP::CG( double *b, double *x) } } - if (i >= imax && comm->me == 0) + if ((i >= imax) && maxwarn && (comm->me == 0)) error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); @@ -768,31 +769,31 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) } } - i++; - matvecs_s = matvecs_t = i; // The plus one makes consistent with count from CG() - matvecs = i; + matvecs_s = matvecs_t = i; - // If necessary, converge other system - if (sqrt(sig_new_s)/b_norm_s > tolerance) { + // If only one was converged and there are still iterations left, converge other system + if ((matvecs_s < imax) && (sqrt(sig_new_s)/b_norm_s > tolerance)) { pack_flag = 2; comm->forward_comm_fix(this); // x1 => s - i+= CG(b1, x1); - matvecs_s = i; - } - else if (sqrt(sig_new_t)/b_norm_t > tolerance) { + int saved_imax = imax; + imax -= matvecs_s; + matvecs_s += CG(b1, x1); + imax = saved_imax; + } else if ((matvecs_t < imax) && (sqrt(sig_new_t)/b_norm_t > tolerance)) { pack_flag = 3; comm->forward_comm_fix(this); // x2 => t - - i+= CG(b2, x2); - matvecs_t = i; + int saved_imax = imax; + imax -= matvecs_t; + matvecs_t += CG(b2, x2); + imax = saved_imax; } - if ( i >= imax && comm->me == 0) + if ((i >= imax) && maxwarn && (comm->me == 0)) error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); - return i; + return matvecs_s + matvecs_t; } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 9c5b3b2958..493d9cd508 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -70,9 +70,14 @@ static const char cite_fix_qeq_reax[] = /* ---------------------------------------------------------------------- */ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), pertype_option(nullptr) + Fix(lmp, narg, arg), matvecs(0), pertype_option(nullptr) { - if (narg<8 || narg>11) error->all(FLERR,"Illegal fix qeq/reax command"); + scalar_flag = 1; + extscalar = 0; + imax = 200; + maxwarn = 1; + + if ((narg < 8) || (narg > 12)) error->all(FLERR,"Illegal fix qeq/reax command"); nevery = utils::inumeric(FLERR,arg[3],false,lmp); if (nevery <= 0) error->all(FLERR,"Illegal fix qeq/reax command"); @@ -82,14 +87,15 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : tolerance = utils::numeric(FLERR,arg[6],false,lmp); pertype_option = utils::strdup(arg[7]); - // dual CG support only available for USER-OMP variant + // dual CG support is only available for USER-OMP variant // check for compatibility is in Fix::post_constructor() + dual_enabled = 0; - imax = 200; int iarg = 8; while (iarg < narg) { if (strcmp(arg[iarg],"dual") == 0) dual_enabled = 1; + else if (strcmp(arg[iarg],"nowarn") == 0) maxwarn = 0; else if (strcmp(arg[iarg],"maxiter") == 0) { if (iarg+1 > narg-1) error->all(FLERR,"Illegal fix qeq/reax command"); @@ -115,12 +121,14 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : b_prm = nullptr; // CG + p = nullptr; q = nullptr; r = nullptr; d = nullptr; // H matrix + H.firstnbr = nullptr; H.numnbrs = nullptr; H.jlist = nullptr; @@ -128,13 +136,13 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : // dual CG support // Update comm sizes for this fix + if (dual_enabled) comm_forward = comm_reverse = 2; else comm_forward = comm_reverse = 1; // perform initial allocation of atom-based arrays // register with Atom class - reaxc = nullptr; reaxc = (PairReaxC *) force->pair_match("^reax/c",0); s_hist = t_hist = nullptr; @@ -389,6 +397,13 @@ void FixQEqReax::init() /* ---------------------------------------------------------------------- */ +double FixQEqReax::compute_scalar() +{ + return matvecs/2.0; +} + +/* ---------------------------------------------------------------------- */ + void FixQEqReax::init_list(int /*id*/, NeighList *ptr) { list = ptr; @@ -728,7 +743,7 @@ int FixQEqReax::CG(double *b, double *x) vector_sum(d, 1., p, beta, d, nn); } - if (i >= imax && comm->me == 0) + if ((i >= imax) && maxwarn && (comm->me == 0)) error->warning(FLERR,fmt::format("Fix qeq/reax CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 932f2e3679..9237e3e7ff 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -52,10 +52,11 @@ class FixQEqReax : public Fix { void min_setup_pre_force(int); void min_pre_force(int); - int matvecs; + virtual double compute_scalar(); protected: int nevery,reaxflag; + int matvecs; int nn, NN, m_fill; int n_cap, nmax, m_cap; int pack_flag; @@ -94,13 +95,7 @@ class FixQEqReax : public Fix { //CG storage double *p, *q, *r, *d; - int imax; - - //GMRES storage - //double *g,*y; - //double **v; - //double **h; - //double *hc, *hs; + int imax, maxwarn; char *pertype_option; // argument to determine how per-type info is obtained virtual void pertype_parameters(char*); @@ -120,7 +115,6 @@ class FixQEqReax : public Fix { virtual void calculate_Q(); virtual int CG(double*,double*); - //int GMRES(double*,double*); virtual void sparse_matvec(sparse_matrix*,double*,double*); virtual int pack_forward_comm(int, int *, double *, int, int *); From 799fb284c8c6d255f1c1c5ab56b8e7db4fe9b842 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:00:51 -0400 Subject: [PATCH 062/352] small updates to the QEQ package for better testing - add a "warn no/yes" keyword/value pair to allow turning of the convergence warning - add a scalar compute to retrieve the number of QEq itration from the fix - update the buck example input to run all QEq methods from a common restart - document changes --- doc/src/fix_qeq.rst | 19 +- examples/qeq/buck.inc | 22 + examples/qeq/in.qeq.buck | 75 ++- examples/qeq/log.20Apr21.qeq.buck.g++.1 | 650 ++++++++++++++++++++++++ examples/qeq/log.20Apr21.qeq.buck.g++.4 | 650 ++++++++++++++++++++++++ examples/qeq/log.27Nov18.qeq.buck.g++.1 | 118 ----- examples/qeq/log.27Nov18.qeq.buck.g++.4 | 118 ----- src/QEQ/fix_qeq.cpp | 15 +- src/QEQ/fix_qeq.h | 5 +- src/QEQ/fix_qeq_dynamic.cpp | 11 +- src/QEQ/fix_qeq_fire.cpp | 9 +- src/QEQ/fix_qeq_point.cpp | 11 +- src/QEQ/fix_qeq_shielded.cpp | 8 + src/QEQ/fix_qeq_slater.cpp | 7 + 14 files changed, 1446 insertions(+), 272 deletions(-) create mode 100644 examples/qeq/buck.inc create mode 100644 examples/qeq/log.20Apr21.qeq.buck.g++.1 create mode 100644 examples/qeq/log.20Apr21.qeq.buck.g++.4 delete mode 100644 examples/qeq/log.27Nov18.qeq.buck.g++.1 delete mode 100644 examples/qeq/log.27Nov18.qeq.buck.g++.4 diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index c655076ce8..7ea79a89ce 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -34,13 +34,14 @@ Syntax * maxiter = maximum iterations to perform charge equilibration * qfile = a filename with QEq parameters or *coul/streitz* or *reax/c* * zero or more keyword/value pairs may be appended -* keyword = *alpha* or *qdamp* or *qstep* +* keyword = *alpha* or *qdamp* or *qstep* or *warn* .. parsed-literal:: *alpha* value = Slater type orbital exponent (qeq/slater only) *qdamp* value = damping factor for damped dynamics charge solver (qeq/dynamic and qeq/fire only) *qstep* value = time step size for damped dynamics charge solver (qeq/dynamic and qeq/fire only) + *warn* value = do (=yes) or do not (=no) print a warning when the maximum number of iterations is reached Examples """""""" @@ -101,8 +102,8 @@ The QEq method minimizes the electrostatic energy of the system (or equalizes the derivative of energy with respect to charge of all the atoms) by adjusting the partial charge on individual atoms based on interactions with their neighbors within *cutoff*\ . It requires a few -parameters, in *metal* units, for each atom type which provided in a -file specified by *qfile*\ . The file has the following format +parameters in the appropriate units for each atom type which are read +from a file specified by *qfile*\ . The file has the following format .. parsed-literal:: @@ -112,7 +113,7 @@ file specified by *qfile*\ . The file has the following format Ntype chi eta gamma zeta qcore There have to be parameters given for every atom type. Wildcard entries -are possible using the same syntax as elsewhere in LAMMPS +are possible using the same type range syntax as for "coeff" commands (i.e., n\*m, n\*, \*m, \*). Later entries will overwrite previous ones. Empty lines or any text following the pound sign (#) are ignored. Each line starts with the atom type followed by five parameters. @@ -126,6 +127,14 @@ entries per line are required. * *zeta* = Slater type orbital exponent defined by the :ref:`Streitz-Mintmire ` potential in reverse distance units * *qcore* = charge of the nucleus defined by the :ref:`Streitz-Mintmire potential ` potential in charge units +The fix qeq styles will print a warning if the charges are not +equilibrated within *tolerance* by *maxiter* steps, unless the +*warn* keyword is used with "no" as argument. This latter option +may be useful for testing and benchmarking purposes, as it allows +to use a fixed number of QEq iterations when *tolerance* is set +to a small enough value to alway reach the *maxiter* limit. Turning +off warnings will avoid the excessive output in that case. + The *qeq/point* style describes partial charges on atoms as point charges. Interaction between a pair of charged particles is 1/r, which is the simplest description of the interaction between charges. @@ -229,7 +238,7 @@ Related commands Default """"""" -none +warn yes ---------- diff --git a/examples/qeq/buck.inc b/examples/qeq/buck.inc new file mode 100644 index 0000000000..af3fe3dfb6 --- /dev/null +++ b/examples/qeq/buck.inc @@ -0,0 +1,22 @@ + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve diff --git a/examples/qeq/in.qeq.buck b/examples/qeq/in.qeq.buck index 2258a9e2ae..4b74b44186 100644 --- a/examples/qeq/in.qeq.buck +++ b/examples/qeq/in.qeq.buck @@ -1,41 +1,68 @@ # This example demonstrates the use of various fix qeq variants with -# that defines and uses charges, in this case pair_style buck/coul/long +# a pair style using charges, in this case pair_style buck/coul/long units metal atom_style charge read_data data.aC -replicate 2 2 2 +#replicate 2 2 2 pair_style buck/coul/long 12.0 pair_coeff 2 2 1388.77 .3623188 175.0 pair_coeff 1 2 18003 .2052124 133.5381 pair_coeff 1 1 0 .1 0 -kspace_style ewald 1e-6 -neighbor 1.0 bin -neigh_modify delay 0 every 1 check yes +fix 2 all qeq/shielded 1 10 1.0e-20 10 param.qeq2 -group type1 type 1 -compute charge1 type1 property/atom q -compute q1 type1 reduce ave c_charge1 -group type2 type 2 -compute charge2 type2 property/atom q -compute q2 type2 reduce ave c_charge2 -variable qtot equal count(type1)*c_q1+count(type2)*c_q2 - -thermo_style custom step pe c_q1 c_q2 v_qtot -thermo 10 - -timestep 0.0001 +include buck.inc velocity all create 300.0 1281937 -fix 1 all nve +run 0 post no -#fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/slater 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/dynamic 1 10 1.0e-4 100 param.qeq2 -fix 2 all qeq/fire 1 10 1.0e-4 100 param.qeq2 +write_restart qeq.restart -run 100 +clear + +print "Using fix qeq/point" +read_restart qeq.restart +fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +run 100 + +clear + +print "Using fix qeq/shielded" +read_restart qeq.restart +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +run 100 + + +clear + +print "Using fix qeq/slater" +read_restart qeq.restart +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +run 100 + +clear + +print "Using fix qeq/dynamic" +read_restart qeq.restart +fix 2 all qeq/dynamic 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +run 100 + +clear + +print "Using fix qeq/fire" +read_restart qeq.restart +fix 2 all qeq/fire 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +run 100 diff --git a/examples/qeq/log.20Apr21.qeq.buck.g++.1 b/examples/qeq/log.20Apr21.qeq.buck.g++.1 new file mode 100644 index 0000000000..d5b41867b1 --- /dev/null +++ b/examples/qeq/log.20Apr21.qeq.buck.g++.1 @@ -0,0 +1,650 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# This example demonstrates the use of various fix qeq variants with +# a pair style using charges, in this case pair_style buck/coul/long + +units metal +atom_style charge + +read_data data.aC +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 1200 atoms + read_data CPU = 0.009 seconds +#replicate 2 2 2 + +pair_style buck/coul/long 12.0 +pair_coeff 2 2 1388.77 .3623188 175.0 +pair_coeff 1 2 18003 .2052124 133.5381 +pair_coeff 1 1 0 .1 0 + +fix 2 all qeq/shielded 1 10 1.0e-20 10 param.qeq2 + +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +velocity all create 300.0 1281937 +run 0 post no +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.30705229 + grid = 48 48 54 + stencil order = 5 + estimated absolute RMS force accuracy = 1.8909403e-05 + estimated relative force accuracy = 1.3131854e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 184525 124416 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +WARNING: Fix qeq CG convergence failed (4.357840257025601e-19) after 10 iterations at step 0 (src/QEQ/fix_qeq.cpp:410) +WARNING: Fix qeq CG convergence failed (5.274094378414531e-18) after 10 iterations at step 0 (src/QEQ/fix_qeq.cpp:410) +Per MPI rank memory allocation (min/avg/max) = 38.75 | 38.75 | 38.75 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00327 0.76536977 -0.38268489 0.000000000000 10 +Loop time of 1.66893e-06 on 1 procs for 0 steps with 1200 atoms + + +write_restart qeq.restart +System init for write_restart ... +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/point" +Using fix qeq/point +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/point, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 24.69 | 24.69 | 24.69 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.17988 0.85228288 -0.42614144 -0.000000000000 3 + 10 -3452.03328 0.85475605 -0.42737803 -0.000000000000 8 + 20 -3497.57515 0.85994936 -0.42997468 0.000000000000 8 + 30 -3568.22095 0.86767937 -0.43383969 0.000000000001 8 + 40 -3633.24956 0.87335551 -0.43667775 0.000000000000 8 + 50 -3700.10219 0.87805056 -0.43902528 0.000000000000 8 + 60 -3784.36769 0.88402303 -0.44201151 -0.000000000000 8 + 70 -3877.51378 0.89008950 -0.44504475 0.000000000000 8 + 80 -3965.29722 0.89431515 -0.44715757 -0.000000000001 8 + 90 -4048.36764 0.89698588 -0.44849294 0.000000000000 8 + 100 -4118.65809 0.89719102 -0.44859551 0.000000000000 8 +Loop time of 11.5935 on 1 procs for 100 steps with 1200 atoms + +Performance: 0.075 ns/day, 322.041 hours/ns, 8.626 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.8257 | 2.8257 | 2.8257 | 0.0 | 24.37 +Kspace | 1.2136 | 1.2136 | 1.2136 | 0.0 | 10.47 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015541 | 0.015541 | 0.015541 | 0.0 | 0.13 +Output | 0.0014489 | 0.0014489 | 0.0014489 | 0.0 | 0.01 +Modify | 7.5351 | 7.5351 | 7.5351 | 0.0 | 64.99 +Other | | 0.00206 | | | 0.02 + +Nlocal: 1200.00 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8100.00 ave 8100 max 8100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 367600.0 ave 367600 max 367600 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 735200.0 ave 735200 max 735200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/shielded" +Using fix qeq/shielded +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 24.69 | 24.69 | 24.69 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00309 0.76536977 -0.38268489 -0.000000000000 3 + 10 -2882.50998 0.76536972 -0.38268486 0.000000000000 2 + 20 -2893.89472 0.76536950 -0.38268475 0.000000000000 2 + 30 -2913.6181 0.76536875 -0.38268438 0.000000000001 1 + 40 -2942.24129 0.76536939 -0.38268470 -0.000000000001 1 + 50 -2980.18817 0.76536780 -0.38268390 0.000000000000 2 + 60 -3027.60957 0.76536804 -0.38268402 0.000000000000 2 + 70 -3084.12552 0.76536573 -0.38268287 0.000000000000 2 + 80 -3148.8697 0.76536550 -0.38268275 0.000000000001 1 + 90 -3220.43086 0.76536380 -0.38268190 0.000000000000 2 + 100 -3297.0618 0.76536251 -0.38268126 0.000000000000 2 +Loop time of 7.93936 on 1 procs for 100 steps with 1200 atoms + +Performance: 0.109 ns/day, 220.538 hours/ns, 12.595 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.8061 | 2.8061 | 2.8061 | 0.0 | 35.34 +Kspace | 1.2176 | 1.2176 | 1.2176 | 0.0 | 15.34 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015528 | 0.015528 | 0.015528 | 0.0 | 0.20 +Output | 0.0014365 | 0.0014365 | 0.0014365 | 0.0 | 0.02 +Modify | 3.8966 | 3.8966 | 3.8966 | 0.0 | 49.08 +Other | | 0.002076 | | | 0.03 + +Nlocal: 1200.00 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8100.00 ave 8100 max 8100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 367600.0 ave 367600 max 367600 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 735200.0 ave 735200 max 735200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/slater" +Using fix qeq/slater +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 24.69 | 24.69 | 24.69 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00309 0.76536977 -0.38268489 -0.000000000000 3 + 10 -2882.50998 0.76536972 -0.38268486 0.000000000000 2 + 20 -2893.89472 0.76536950 -0.38268475 0.000000000000 2 + 30 -2913.6181 0.76536875 -0.38268438 0.000000000001 1 + 40 -2942.24129 0.76536939 -0.38268470 -0.000000000001 1 + 50 -2980.18817 0.76536780 -0.38268390 0.000000000000 2 + 60 -3027.60957 0.76536804 -0.38268402 0.000000000000 2 + 70 -3084.12552 0.76536573 -0.38268287 0.000000000000 2 + 80 -3148.8697 0.76536550 -0.38268275 0.000000000001 1 + 90 -3220.43086 0.76536380 -0.38268190 0.000000000000 2 + 100 -3297.0618 0.76536251 -0.38268126 0.000000000000 2 +Loop time of 7.9652 on 1 procs for 100 steps with 1200 atoms + +Performance: 0.108 ns/day, 221.256 hours/ns, 12.555 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.809 | 2.809 | 2.809 | 0.0 | 35.27 +Kspace | 1.2214 | 1.2214 | 1.2214 | 0.0 | 15.33 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015635 | 0.015635 | 0.015635 | 0.0 | 0.20 +Output | 0.0014393 | 0.0014393 | 0.0014393 | 0.0 | 0.02 +Modify | 3.9157 | 3.9157 | 3.9157 | 0.0 | 49.16 +Other | | 0.002091 | | | 0.03 + +Nlocal: 1200.00 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8100.00 ave 8100 max 8100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 367600.0 ave 367600 max 367600 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 735200.0 ave 735200 max 735200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/dynamic" +Using fix qeq/dynamic +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/dynamic 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix qeq/dynamic, perpetual, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 17.87 | 17.87 | 17.87 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.38094 0.85231286 -0.42615643 0.000000000001 43 + 10 -3452.05217 0.85475894 -0.42737947 -0.000000000001 17 + 20 -3497.8643 0.85999180 -0.42999590 -0.000000000007 22 + 30 -3568.53169 0.86772479 -0.43386239 -0.000000000006 22 + 40 -3633.43753 0.87338291 -0.43669146 -0.000000000006 22 + 50 -3700.27953 0.87807632 -0.43903816 -0.000000000005 22 + 60 -3784.4004 0.88402822 -0.44201411 0.000000000002 17 + 70 -3877.73706 0.89012201 -0.44506100 0.000000000002 22 + 80 -3965.36111 0.89432486 -0.44716243 0.000000000008 17 + 90 -4048.57901 0.89701688 -0.44850844 -0.000000000004 22 + 100 -4118.62736 0.89718691 -0.44859346 -0.000000000026 17 +Loop time of 18.5333 on 1 procs for 100 steps with 1200 atoms + +Performance: 0.047 ns/day, 514.815 hours/ns, 5.396 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.8268 | 2.8268 | 2.8268 | 0.0 | 15.25 +Kspace | 1.2138 | 1.2138 | 1.2138 | 0.0 | 6.55 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015407 | 0.015407 | 0.015407 | 0.0 | 0.08 +Output | 0.0014303 | 0.0014303 | 0.0014303 | 0.0 | 0.01 +Modify | 14.474 | 14.474 | 14.474 | 0.0 | 78.10 +Other | | 0.001973 | | | 0.01 + +Nlocal: 1200.00 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8100.00 ave 8100 max 8100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 367600.0 ave 367600 max 367600 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 367600 +Ave neighs/atom = 306.33333 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/fire" +Using fix qeq/fire +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 1 by 1 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/fire 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 42772 21870 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix qeq/fire, perpetual, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 17.87 | 17.87 | 17.87 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.06113 0.85226679 -0.42613339 0.000000000004 37 + 10 -3452.0494 0.85475813 -0.42737906 0.000000000001 10 + 20 -3497.83503 0.85998739 -0.42999370 0.000000000003 13 + 30 -3568.47507 0.86771599 -0.43385799 0.000000000004 13 + 40 -3633.35368 0.87337029 -0.43668514 0.000000000004 13 + 50 -3700.15601 0.87805847 -0.43902924 0.000000000005 13 + 60 -3784.32042 0.88401635 -0.44200818 0.000000000000 11 + 70 -3877.59818 0.89010162 -0.44505081 0.000000000000 13 + 80 -3965.28426 0.89431356 -0.44715678 0.000000000000 11 + 90 -4048.3338 0.89698069 -0.44849034 0.000000000001 13 + 100 -4118.63638 0.89718818 -0.44859409 0.000000000003 12 +Loop time of 13.0492 on 1 procs for 100 steps with 1200 atoms + +Performance: 0.066 ns/day, 362.479 hours/ns, 7.663 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.7996 | 2.7996 | 2.7996 | 0.0 | 21.45 +Kspace | 1.2141 | 1.2141 | 1.2141 | 0.0 | 9.30 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.015527 | 0.015527 | 0.015527 | 0.0 | 0.12 +Output | 0.0014405 | 0.0014405 | 0.0014405 | 0.0 | 0.01 +Modify | 9.0166 | 9.0166 | 9.0166 | 0.0 | 69.10 +Other | | 0.001981 | | | 0.02 + +Nlocal: 1200.00 ave 1200 max 1200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 8100.00 ave 8100 max 8100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 367600.0 ave 367600 max 367600 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 367600 +Ave neighs/atom = 306.33333 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:01:00 diff --git a/examples/qeq/log.20Apr21.qeq.buck.g++.4 b/examples/qeq/log.20Apr21.qeq.buck.g++.4 new file mode 100644 index 0000000000..cafa94bae9 --- /dev/null +++ b/examples/qeq/log.20Apr21.qeq.buck.g++.4 @@ -0,0 +1,650 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# This example demonstrates the use of various fix qeq variants with +# a pair style using charges, in this case pair_style buck/coul/long + +units metal +atom_style charge + +read_data data.aC +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 1200 atoms + read_data CPU = 0.009 seconds +#replicate 2 2 2 + +pair_style buck/coul/long 12.0 +pair_coeff 2 2 1388.77 .3623188 175.0 +pair_coeff 1 2 18003 .2052124 133.5381 +pair_coeff 1 1 0 .1 0 + +fix 2 all qeq/shielded 1 10 1.0e-20 10 param.qeq2 + +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +velocity all create 300.0 1281937 +run 0 post no +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.30705229 + grid = 48 48 54 + stencil order = 5 + estimated absolute RMS force accuracy = 1.8909403e-05 + estimated relative force accuracy = 1.3131854e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 57970 32256 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +WARNING: Fix qeq CG convergence failed (4.299911728887494e-19) after 10 iterations at step 0 (src/QEQ/fix_qeq.cpp:410) +WARNING: Fix qeq CG convergence failed (5.273380778822746e-18) after 10 iterations at step 0 (src/QEQ/fix_qeq.cpp:410) +Per MPI rank memory allocation (min/avg/max) = 14.97 | 15.02 | 15.08 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00327 0.76536977 -0.38268489 0.000000000000 10 +Loop time of 3.33786e-06 on 4 procs for 0 steps with 1200 atoms + + +write_restart qeq.restart +System init for write_restart ... +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/point" +Using fix qeq/point +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/point, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.10 | 11.14 | 11.16 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.17988 0.85228288 -0.42614144 -0.000000000000 3 + 10 -3452.03328 0.85475605 -0.42737803 -0.000000000000 8 + 20 -3497.57515 0.85994936 -0.42997468 0.000000000000 8 + 30 -3568.22095 0.86767937 -0.43383969 0.000000000000 8 + 40 -3633.24956 0.87335551 -0.43667775 -0.000000000000 8 + 50 -3700.10219 0.87805056 -0.43902528 0.000000000000 8 + 60 -3784.36769 0.88402303 -0.44201151 0.000000000000 8 + 70 -3877.51378 0.89008950 -0.44504475 0.000000000000 8 + 80 -3965.29722 0.89431515 -0.44715757 0.000000000000 8 + 90 -4048.36764 0.89698588 -0.44849294 -0.000000000000 8 + 100 -4118.65809 0.89719102 -0.44859551 0.000000000000 8 +Loop time of 3.30911 on 4 procs for 100 steps with 1200 atoms + +Performance: 0.261 ns/day, 91.920 hours/ns, 30.220 timesteps/s +99.0% 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.67613 | 0.68904 | 0.71562 | 1.9 | 20.82 +Kspace | 0.36056 | 0.3881 | 0.39892 | 2.6 | 11.73 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.013339 | 0.017982 | 0.019974 | 2.0 | 0.54 +Output | 0.0006721 | 0.00099713 | 0.0019572 | 0.0 | 0.03 +Modify | 2.2109 | 2.211 | 2.211 | 0.0 | 66.81 +Other | | 0.002041 | | | 0.06 + +Nlocal: 300.000 ave 300 max 300 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 4875.00 ave 4880 max 4870 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 91900.0 ave 91900 max 91900 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 183800.0 ave 183800 max 183800 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/shielded" +Using fix qeq/shielded +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.006 seconds +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.10 | 11.14 | 11.16 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00309 0.76536977 -0.38268489 0.000000000000 3 + 10 -2882.50998 0.76536972 -0.38268486 0.000000000000 2 + 20 -2893.89472 0.76536950 -0.38268475 -0.000000000000 2 + 30 -2913.6181 0.76536875 -0.38268438 -0.000000000000 1 + 40 -2942.24129 0.76536939 -0.38268470 0.000000000000 1 + 50 -2980.18817 0.76536780 -0.38268390 0.000000000000 2 + 60 -3027.60957 0.76536804 -0.38268402 -0.000000000000 2 + 70 -3084.12552 0.76536573 -0.38268287 0.000000000000 2 + 80 -3148.8697 0.76536550 -0.38268275 0.000000000000 1 + 90 -3220.43086 0.76536380 -0.38268190 0.000000000000 2 + 100 -3297.0618 0.76536251 -0.38268126 0.000000000000 2 +Loop time of 2.25559 on 4 procs for 100 steps with 1200 atoms + +Performance: 0.383 ns/day, 62.655 hours/ns, 44.334 timesteps/s +97.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.67442 | 0.69181 | 0.70907 | 2.0 | 30.67 +Kspace | 0.39381 | 0.41151 | 0.43023 | 2.6 | 18.24 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.012851 | 0.01426 | 0.015146 | 0.7 | 0.63 +Output | 0.00066686 | 0.00098681 | 0.0019395 | 0.0 | 0.04 +Modify | 1.1349 | 1.135 | 1.135 | 0.0 | 50.32 +Other | | 0.002035 | | | 0.09 + +Nlocal: 300.000 ave 300 max 300 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 4875.00 ave 4880 max 4870 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 91900.0 ave 91900 max 91900 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 183800.0 ave 183800 max 183800 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/slater" +Using fix qeq/slater +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.012 seconds +fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual, half/full from (2) + attributes: half, newton on + pair build: halffull/newton + stencil: none + bin: none + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.10 | 11.14 | 11.16 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -2879.00309 0.76536977 -0.38268489 0.000000000000 3 + 10 -2882.50998 0.76536972 -0.38268486 0.000000000000 2 + 20 -2893.89472 0.76536950 -0.38268475 -0.000000000000 2 + 30 -2913.6181 0.76536875 -0.38268438 -0.000000000000 1 + 40 -2942.24129 0.76536939 -0.38268470 0.000000000000 1 + 50 -2980.18817 0.76536780 -0.38268390 0.000000000000 2 + 60 -3027.60957 0.76536804 -0.38268402 -0.000000000000 2 + 70 -3084.12552 0.76536573 -0.38268287 0.000000000000 2 + 80 -3148.8697 0.76536550 -0.38268275 0.000000000000 1 + 90 -3220.43086 0.76536380 -0.38268190 0.000000000000 2 + 100 -3297.0618 0.76536251 -0.38268126 0.000000000000 2 +Loop time of 2.39249 on 4 procs for 100 steps with 1200 atoms + +Performance: 0.361 ns/day, 66.458 hours/ns, 41.797 timesteps/s +96.0% 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.6751 | 0.70301 | 0.71919 | 2.1 | 29.38 +Kspace | 0.45569 | 0.47315 | 0.49885 | 2.6 | 19.78 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.012967 | 0.018681 | 0.020909 | 2.4 | 0.78 +Output | 0.00066733 | 0.00099397 | 0.0019579 | 0.0 | 0.04 +Modify | 1.1945 | 1.1946 | 1.1947 | 0.0 | 49.93 +Other | | 0.002046 | | | 0.09 + +Nlocal: 300.000 ave 300 max 300 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 4875.00 ave 4880 max 4870 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 91900.0 ave 91900 max 91900 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 183800.0 ave 183800 max 183800 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 735200 +Ave neighs/atom = 612.66667 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/dynamic" +Using fix qeq/dynamic +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.002 seconds +fix 2 all qeq/dynamic 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix qeq/dynamic, perpetual, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 9.195 | 9.246 | 9.278 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.38094 0.85231286 -0.42615643 -0.000000000001 43 + 10 -3452.05217 0.85475894 -0.42737947 -0.000000000003 17 + 20 -3497.8643 0.85999180 -0.42999590 0.000000000000 22 + 30 -3568.53169 0.86772479 -0.43386239 -0.000000000000 22 + 40 -3633.43753 0.87338291 -0.43669146 0.000000000006 22 + 50 -3700.27953 0.87807632 -0.43903816 0.000000000003 22 + 60 -3784.4004 0.88402822 -0.44201411 0.000000000009 17 + 70 -3877.73706 0.89012201 -0.44506100 0.000000000010 22 + 80 -3965.36111 0.89432486 -0.44716243 0.000000000011 17 + 90 -4048.57901 0.89701688 -0.44850844 0.000000000012 22 + 100 -4118.62736 0.89718691 -0.44859346 0.000000000013 17 +Loop time of 5.27704 on 4 procs for 100 steps with 1200 atoms + +Performance: 0.164 ns/day, 146.584 hours/ns, 18.950 timesteps/s +98.5% 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.68437 | 0.69096 | 0.69826 | 0.7 | 13.09 +Kspace | 0.38484 | 0.38941 | 0.39524 | 0.7 | 7.38 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.012609 | 0.01529 | 0.016842 | 1.3 | 0.29 +Output | 0.00067735 | 0.0010006 | 0.0019588 | 1.7 | 0.02 +Modify | 4.1783 | 4.1783 | 4.1784 | 0.0 | 79.18 +Other | | 0.002027 | | | 0.04 + +Nlocal: 300.000 ave 300 max 300 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 4875.00 ave 4880 max 4870 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 91900.0 ave 93081 max 90719 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 367600 +Ave neighs/atom = 306.33333 +Neighbor list builds = 0 +Dangerous builds = 0 + +clear + using 1 OpenMP thread(s) per MPI task + +print "Using fix qeq/fire" +Using fix qeq/fire +read_restart qeq.restart +Reading restart file ... + restart file = 8 Apr 2021, LAMMPS = 8 Apr 2021 + restoring atom style charge from restart + orthogonal box = (0.0000000 0.0000000 0.0000000) to (25.158320 25.158320 28.020256) + 1 by 2 by 2 MPI processor grid + restoring pair style buck/coul/long from restart + 1200 atoms + read_restart CPU = 0.001 seconds +fix 2 all qeq/fire 1 10 1.0e-3 100 param.qeq2 +include buck.inc + +kspace_style pppm 1e-6 + +neighbor 1.0 bin +neigh_modify delay 0 every 1 check yes + +group type1 type 1 +400 atoms in group type1 +compute charge1 type1 property/atom q +compute q1 type1 reduce ave c_charge1 +group type2 type 2 +800 atoms in group type2 +compute charge2 type2 property/atom q +compute q2 type2 reduce ave c_charge2 +variable qtot equal count(type1)*c_q1+count(type2)*c_q2 +variable nqeq equal f_2 + +thermo_style custom step pe c_q1 c_q2 v_qtot v_nqeq +thermo 10 +thermo_modify format line "%4d %12.9g %12.8f %12.8f %16.12f %6.0f" + +timestep 0.0001 + +fix 1 all nve + +run 100 +PPPM initialization ... + using 12-bit tables for long-range coulomb (src/kspace.cpp:339) + G vector (1/distance) = 0.27644401 + grid = 27 27 30 + stencil order = 5 + estimated absolute RMS force accuracy = 1.4502702e-05 + estimated relative force accuracy = 1.0071569e-06 + using double precision FFTW3 + 3d grid and FFT values/proc = 14960 5832 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 13 + ghost atom cutoff = 13 + binsize = 6.5, bins = 4 4 5 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair buck/coul/long, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix qeq/fire, perpetual, copy from (1) + attributes: half, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 9.195 | 9.246 | 9.278 Mbytes +Step PotEng c_q1 c_q2 v_qtot v_nqeq + 0 -3432.05316 0.85226679 -0.42613339 0.000000000001 37 + 10 -3452.04937 0.85475813 -0.42737906 0.000000000001 10 + 20 -3497.83659 0.85998739 -0.42999370 0.000000000002 13 + 30 -3568.47793 0.86771599 -0.43385799 0.000000000002 13 + 40 -3633.35326 0.87337029 -0.43668514 0.000000000002 13 + 50 -3700.16079 0.87805847 -0.43902924 0.000000000000 13 + 60 -3784.31906 0.88401635 -0.44200818 -0.000000000001 11 + 70 -3877.60163 0.89010162 -0.44505081 -0.000000000000 13 + 80 -3965.28179 0.89431356 -0.44715678 0.000000000001 11 + 90 -4048.33861 0.89698069 -0.44849034 0.000000000001 13 + 100 -4118.63861 0.89718818 -0.44859409 0.000000000002 12 +Loop time of 3.88026 on 4 procs for 100 steps with 1200 atoms + +Performance: 0.223 ns/day, 107.785 hours/ns, 25.771 timesteps/s +98.0% 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.68424 | 0.69912 | 0.73572 | 2.5 | 18.02 +Kspace | 0.38093 | 0.41715 | 0.43168 | 3.2 | 10.75 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.012711 | 0.013318 | 0.014003 | 0.4 | 0.34 +Output | 0.00066566 | 0.00098735 | 0.0019317 | 0.0 | 0.03 +Modify | 2.7477 | 2.7477 | 2.7477 | 0.0 | 70.81 +Other | | 0.002004 | | | 0.05 + +Nlocal: 300.000 ave 300 max 300 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 4875.00 ave 4880 max 4870 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Neighs: 91900.0 ave 93081 max 90719 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 367600 +Ave neighs/atom = 306.33333 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:17 diff --git a/examples/qeq/log.27Nov18.qeq.buck.g++.1 b/examples/qeq/log.27Nov18.qeq.buck.g++.1 deleted file mode 100644 index 4d5225ccc3..0000000000 --- a/examples/qeq/log.27Nov18.qeq.buck.g++.1 +++ /dev/null @@ -1,118 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# This example demonstrates the use of various fix qeq variants with -# that defines and uses charges, in this case pair_style buck/coul/long - -units metal -atom_style charge - -read_data data.aC - orthogonal box = (0 0 0) to (25.1583 25.1583 28.0203) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 1200 atoms -replicate 2 2 2 - orthogonal box = (0 0 0) to (50.3166 50.3166 56.0405) - 1 by 1 by 1 MPI processor grid - 9600 atoms - Time spent = 0.00114894 secs - -pair_style buck/coul/long 12.0 -pair_coeff 2 2 1388.77 .3623188 175.0 -pair_coeff 1 2 18003 .2052124 133.5381 -pair_coeff 1 1 0 .1 0 -kspace_style ewald 1e-6 - -neighbor 1.0 bin -neigh_modify delay 0 every 1 check yes - -group type1 type 1 -3200 atoms in group type1 -compute charge1 type1 property/atom q -compute q1 type1 reduce ave c_charge1 -group type2 type 2 -6400 atoms in group type2 -compute charge2 type2 property/atom q -compute q2 type2 reduce ave c_charge2 -variable qtot equal count(type1)*c_q1+count(type2)*c_q2 - -thermo_style custom step pe c_q1 c_q2 v_qtot spcpu -thermo 10 - -timestep 0.0001 - -velocity all create 300.0 1281937 -fix 1 all nve - -#fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/slater 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/dynamic 1 10 1.0e-4 100 param.qeq2 -fix 2 all qeq/fire 1 10 1.0e-4 100 param.qeq2 - -run 100 -Ewald initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:321) - G vector (1/distance) = 0.305064 - estimated absolute RMS force accuracy = 2.07629e-05 - estimated relative force accuracy = 1.44191e-06 - KSpace vectors: actual max1d max3d = 13556 20 34460 - kxmax kymax kzmax = 18 18 20 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 13 - ghost atom cutoff = 13 - binsize = 6.5, bins = 8 8 9 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair buck/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix qeq/fire, perpetual, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 134 | 134 | 134 Mbytes -Step PotEng c_q1 c_q2 v_qtot S/CPU - 0 -27457.219 0.85227886 -0.42613943 -2.1827873e-10 0 - 10 -27626.057 0.85486228 -0.42743114 -2.0372681e-10 0.64313877 - 20 -27975.085 0.85968531 -0.42984266 -1.036824e-10 0.55119179 - 30 -28552.628 0.86755661 -0.4337783 1.3051249e-10 0.53160643 - 40 -29133.643 0.87426387 -0.43713193 1.1368684e-10 0.53075341 - 50 -29697.011 0.8794039 -0.43970195 1.200533e-10 0.52358127 - 60 -30342.001 0.88478594 -0.44239297 6.002665e-11 0.5366762 - 70 -31081.138 0.8906973 -0.44534865 -4.7293724e-11 0.55904546 - 80 -31792.732 0.89506635 -0.44753317 -4.3200998e-11 0.59606079 - 90 -32424.749 0.89714841 -0.44857421 -1.1596057e-10 0.58047419 - 100 -32998.353 0.89755721 -0.44877861 -1.0231815e-10 0.59444001 -Loop time of 177.79 on 1 procs for 100 steps with 9600 atoms - -Performance: 0.005 ns/day, 4938.612 hours/ns, 0.562 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 11.518 | 11.518 | 11.518 | 0.0 | 6.48 -Kspace | 107.37 | 107.37 | 107.37 | 0.0 | 60.39 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.019721 | 0.019721 | 0.019721 | 0.0 | 0.01 -Output | 0.002218 | 0.002218 | 0.002218 | 0.0 | 0.00 -Modify | 58.869 | 58.869 | 58.869 | 0.0 | 33.11 -Other | | 0.007197 | | | 0.00 - -Nlocal: 9600 ave 9600 max 9600 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 22125 ave 22125 max 22125 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2.9408e+06 ave 2.9408e+06 max 2.9408e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 2940800 -Ave neighs/atom = 306.333 -Neighbor list builds = 0 -Dangerous builds = 0 -Total wall time: 0:03:01 diff --git a/examples/qeq/log.27Nov18.qeq.buck.g++.4 b/examples/qeq/log.27Nov18.qeq.buck.g++.4 deleted file mode 100644 index 947c3caeaf..0000000000 --- a/examples/qeq/log.27Nov18.qeq.buck.g++.4 +++ /dev/null @@ -1,118 +0,0 @@ -LAMMPS (27 Nov 2018) - using 1 OpenMP thread(s) per MPI task -# This example demonstrates the use of various fix qeq variants with -# that defines and uses charges, in this case pair_style buck/coul/long - -units metal -atom_style charge - -read_data data.aC - orthogonal box = (0 0 0) to (25.1583 25.1583 28.0203) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 1200 atoms -replicate 2 2 2 - orthogonal box = (0 0 0) to (50.3166 50.3166 56.0405) - 1 by 2 by 2 MPI processor grid - 9600 atoms - Time spent = 0.000675201 secs - -pair_style buck/coul/long 12.0 -pair_coeff 2 2 1388.77 .3623188 175.0 -pair_coeff 1 2 18003 .2052124 133.5381 -pair_coeff 1 1 0 .1 0 -kspace_style ewald 1e-6 - -neighbor 1.0 bin -neigh_modify delay 0 every 1 check yes - -group type1 type 1 -3200 atoms in group type1 -compute charge1 type1 property/atom q -compute q1 type1 reduce ave c_charge1 -group type2 type 2 -6400 atoms in group type2 -compute charge2 type2 property/atom q -compute q2 type2 reduce ave c_charge2 -variable qtot equal count(type1)*c_q1+count(type2)*c_q2 - -thermo_style custom step pe c_q1 c_q2 v_qtot spcpu -thermo 10 - -timestep 0.0001 - -velocity all create 300.0 1281937 -fix 1 all nve - -#fix 2 all qeq/point 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/shielded 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/slater 1 10 1.0e-6 100 param.qeq2 -#fix 2 all qeq/dynamic 1 10 1.0e-4 100 param.qeq2 -fix 2 all qeq/fire 1 10 1.0e-4 100 param.qeq2 - -run 100 -Ewald initialization ... - using 12-bit tables for long-range coulomb (src/kspace.cpp:321) - G vector (1/distance) = 0.305064 - estimated absolute RMS force accuracy = 2.07629e-05 - estimated relative force accuracy = 1.44191e-06 - KSpace vectors: actual max1d max3d = 13556 20 34460 - kxmax kymax kzmax = 18 18 20 -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 13 - ghost atom cutoff = 13 - binsize = 6.5, bins = 8 8 9 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair buck/coul/long, perpetual - attributes: half, newton on - pair build: half/bin/atomonly/newton - stencil: half/bin/3d/newton - bin: standard - (2) fix qeq/fire, perpetual, copy from (1) - attributes: half, newton on - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 53.06 | 53.13 | 53.21 Mbytes -Step PotEng c_q1 c_q2 v_qtot S/CPU - 0 -27457.215 0.85227886 -0.42613943 2.1373125e-11 0 - 10 -27626.057 0.85486228 -0.42743114 3.0468073e-11 2.4245312 - 20 -27975.085 0.85968531 -0.42984266 1.0095391e-10 2.0185316 - 30 -28552.627 0.86755661 -0.4337783 1.3096724e-10 1.9605335 - 40 -29133.643 0.87426387 -0.43713193 1.5279511e-10 1.9624139 - 50 -29697.01 0.8794039 -0.43970195 1.6461854e-10 1.8113263 - 60 -30342 0.88478594 -0.44239297 1.7826096e-10 1.9537722 - 70 -31081.139 0.89069733 -0.44534866 1.4733814e-10 2.058406 - 80 -31792.732 0.89506635 -0.44753317 1.3824319e-10 2.2160813 - 90 -32424.752 0.89714841 -0.44857421 1.2914825e-10 2.0952145 - 100 -32998.353 0.89755721 -0.44877861 1.4824764e-10 2.1292486 -Loop time of 48.7541 on 4 procs for 100 steps with 9600 atoms - -Performance: 0.018 ns/day, 1354.281 hours/ns, 2.051 timesteps/s -97.4% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.9747 | 3.0315 | 3.0758 | 2.1 | 6.22 -Kspace | 27.873 | 28.264 | 28.63 | 5.3 | 57.97 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.53835 | 0.8523 | 1.2286 | 28.2 | 1.75 -Output | 0.0012984 | 0.001591 | 0.0024178 | 1.2 | 0.00 -Modify | 16.58 | 16.59 | 16.601 | 0.3 | 34.03 -Other | | 0.01409 | | | 0.03 - -Nlocal: 2400 ave 2400 max 2400 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 11550 ave 11550 max 11550 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Neighs: 735200 ave 740758 max 729642 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 2940800 -Ave neighs/atom = 306.333 -Neighbor list builds = 0 -Dangerous builds = 0 -Total wall time: 0:00:49 diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 4504865303..56491228fd 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -54,10 +54,15 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : { if (narg < 8) error->all(FLERR,"Illegal fix qeq command"); + scalar_flag = 1; + extscalar = 0; + nevery = utils::inumeric(FLERR,arg[3],false,lmp); cutoff = utils::numeric(FLERR,arg[4],false,lmp); tolerance = utils::numeric(FLERR,arg[5],false,lmp); maxiter = utils::inumeric(FLERR,arg[6],false,lmp); + maxwarn = 1; + matvecs = 0; // check for sane arguments if ((nevery <= 0) || (cutoff <= 0.0) || (tolerance <= 0.0) || (maxiter <= 0)) @@ -123,7 +128,6 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : } else { read_file(arg[7]); } - } /* ---------------------------------------------------------------------- */ @@ -277,6 +281,13 @@ void FixQEq::reallocate_matrix() /* ---------------------------------------------------------------------- */ +double FixQEq::compute_scalar() +{ + return matvecs; +} + +/* ---------------------------------------------------------------------- */ + void FixQEq::init_list(int /*id*/, NeighList *ptr) { list = ptr; @@ -395,7 +406,7 @@ int FixQEq::CG( double *b, double *x ) vector_sum( d, 1., p, beta, d, inum ); } - if ((comm->me == 0) && (loop >= maxiter)) + if ((comm->me == 0) && maxwarn && (loop >= maxiter)) error->warning(FLERR,fmt::format("Fix qeq CG convergence failed ({}) " "after {} iterations at step {}", sqrt(sig_new)/b_norm,loop, diff --git a/src/QEQ/fix_qeq.h b/src/QEQ/fix_qeq.h index 9a3087840b..a11a41841e 100644 --- a/src/QEQ/fix_qeq.h +++ b/src/QEQ/fix_qeq.h @@ -35,6 +35,8 @@ class FixQEq : public Fix { void pre_force_respa(int, int, int); void min_pre_force(int); + virtual double compute_scalar(); + // derived child classes must provide these functions virtual void init() = 0; @@ -64,7 +66,8 @@ class FixQEq : public Fix { double swa, swb; // lower/upper Taper cutoff radius double Tap[8]; // Taper function double tolerance; // tolerance for the norm of the rel residual in CG - int maxiter; // maximum number of QEq iterations + int maxiter; // maximum number of QEq iterations + int maxwarn; // print warning when max iterations was reached double cutoff, cutoff_sq; // neighbor cutoff double *chi,*eta,*gamma,*zeta,*zcore; // qeq parameters diff --git a/src/QEQ/fix_qeq_dynamic.cpp b/src/QEQ/fix_qeq_dynamic.cpp index 397393b786..5af7a4c9a0 100644 --- a/src/QEQ/fix_qeq_dynamic.cpp +++ b/src/QEQ/fix_qeq_dynamic.cpp @@ -53,6 +53,12 @@ FixQEqDynamic::FixQEqDynamic(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/dynamic command"); qstep = atof(arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"warn") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/dynamic command"); + if (strcmp(arg[iarg+1],"no") == 0) maxwarn = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) maxwarn = 1; + else error->all(FLERR,"Illegal fix qeq/dynamic command"); + iarg += 2; } else error->all(FLERR,"Illegal fix qeq/dynamic command"); } } @@ -145,7 +151,7 @@ void FixQEqDynamic::pre_force(int /*vflag*/) MPI_Allreduce(&enegmax,&enegmaxall,1,MPI_DOUBLE,MPI_MAX,world); enegmax = enegmaxall; - if (enegchk <= tolerance && enegmax <= 100.0*tolerance) break; + if ((enegchk <= tolerance) && (enegmax <= 100.0*tolerance)) break; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; @@ -153,8 +159,9 @@ void FixQEqDynamic::pre_force(int /*vflag*/) q1[i] += qf[i]*dtq2 - qdamp*q1[i]; } } + matvecs = iloop; - if ((comm->me == 0) && (iloop >= maxiter)) + if ((comm->me == 0) && maxwarn && (iloop >= maxiter)) error->warning(FLERR,fmt::format("Charges did not converge at step " "{}: {}",update->ntimestep,enegchk)); diff --git a/src/QEQ/fix_qeq_fire.cpp b/src/QEQ/fix_qeq_fire.cpp index 0bdf65dc18..0e89ee3d17 100644 --- a/src/QEQ/fix_qeq_fire.cpp +++ b/src/QEQ/fix_qeq_fire.cpp @@ -63,6 +63,12 @@ FixQEqFire::FixQEqFire(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/fire command"); qstep = atof(arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"warn") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/fire command"); + if (strcmp(arg[iarg+1],"no") == 0) maxwarn = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) maxwarn = 1; + else error->all(FLERR,"Illegal fix qeq/fire command"); + iarg += 2; } else error->all(FLERR,"Illegal fix qeq/fire command"); } } @@ -213,8 +219,9 @@ void FixQEqFire::pre_force(int /*vflag*/) if (enegchk < tolerance) break; } + matvecs = iloop; - if ((comm->me == 0) && (iloop >= maxiter)) + if ((comm->me == 0) && maxwarn && (iloop >= maxiter)) error->warning(FLERR,fmt::format("Charges did not converge at step " "{}: {}",update->ntimestep,enegchk)); diff --git a/src/QEQ/fix_qeq_point.cpp b/src/QEQ/fix_qeq_point.cpp index ac31f906e0..8d60585773 100644 --- a/src/QEQ/fix_qeq_point.cpp +++ b/src/QEQ/fix_qeq_point.cpp @@ -38,7 +38,15 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ FixQEqPoint::FixQEqPoint(LAMMPS *lmp, int narg, char **arg) : - FixQEq(lmp, narg, arg) {} + FixQEq(lmp, narg, arg) { + if (narg == 10) { + if (strcmp(arg[8],"warn") == 0) { + if (strcmp(arg[9],"no") == 0) maxwarn = 0; + else if (strcmp(arg[9],"yes") == 0) maxwarn = 1; + else error->all(FLERR,"Illegal fix qeq/point command"); + } else error->all(FLERR,"Illegal fix qeq/point command"); + } else if (narg > 8) error->all(FLERR,"Illegal fix qeq/point command"); +} /* ---------------------------------------------------------------------- */ @@ -80,6 +88,7 @@ void FixQEqPoint::pre_force(int /*vflag*/) init_matvec(); matvecs = CG(b_s, s); // CG on s - parallel matvecs += CG(b_t, t); // CG on t - parallel + matvecs /= 2; calculate_Q(); if (force->kspace) force->kspace->qsum_qsq(); diff --git a/src/QEQ/fix_qeq_shielded.cpp b/src/QEQ/fix_qeq_shielded.cpp index ad6202abd8..351700057b 100644 --- a/src/QEQ/fix_qeq_shielded.cpp +++ b/src/QEQ/fix_qeq_shielded.cpp @@ -40,6 +40,13 @@ using namespace LAMMPS_NS; FixQEqShielded::FixQEqShielded(LAMMPS *lmp, int narg, char **arg) : FixQEq(lmp, narg, arg) { + if (narg == 10) { + if (strcmp(arg[8],"warn") == 0) { + if (strcmp(arg[9],"no") == 0) maxwarn = 0; + else if (strcmp(arg[9],"yes") == 0) maxwarn = 1; + else error->all(FLERR,"Illegal fix qeq/shielded command"); + } else error->all(FLERR,"Illegal fix qeq/shielded command"); + } else if (narg > 8) error->all(FLERR,"Illegal fix qeq/shielded command"); if (reax_flag) extract_reax(); } @@ -143,6 +150,7 @@ void FixQEqShielded::pre_force(int /*vflag*/) init_matvec(); matvecs = CG(b_s, s); // CG on s - parallel matvecs += CG(b_t, t); // CG on t - parallel + matvecs /= 2; calculate_Q(); if (force->kspace) force->kspace->qsum_qsq(); diff --git a/src/QEQ/fix_qeq_slater.cpp b/src/QEQ/fix_qeq_slater.cpp index 326d71c93b..da0d2090cf 100644 --- a/src/QEQ/fix_qeq_slater.cpp +++ b/src/QEQ/fix_qeq_slater.cpp @@ -52,6 +52,12 @@ FixQEqSlater::FixQEqSlater(LAMMPS *lmp, int narg, char **arg) : if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/slater command"); alpha = atof(arg[iarg+1]); iarg += 2; + } else if (strcmp(arg[iarg],"warn") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix qeq/slater command"); + if (strcmp(arg[iarg+1],"no") == 0) maxwarn = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) maxwarn = 1; + else error->all(FLERR,"Illegal fix qeq/slater command"); + iarg += 2; } else error->all(FLERR,"Illegal fix qeq/slater command"); } @@ -120,6 +126,7 @@ void FixQEqSlater::pre_force(int /*vflag*/) init_matvec(); matvecs = CG(b_s, s); // CG on s - parallel matvecs += CG(b_t, t); // CG on t - parallel + matvecs /= 2; calculate_Q(); if (force->kspace) force->kspace->qsum_qsq(); From fe2efa4cb3159e7f634e87c64f15ea685fb4eff8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:51:05 -0400 Subject: [PATCH 063/352] disallow usage of qeq fixes with incompatible GPU and USER-INTEL packages --- src/QEQ/fix_qeq.cpp | 8 ++++++++ src/pair.h | 2 ++ src/pair_hybrid.cpp | 4 +--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 56491228fd..542670f1f3 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -24,6 +24,8 @@ #include "force.h" #include "memory.h" #include "neigh_list.h" +#include "pair.h" +#include "suffix.h" #include "text_file_reader.h" #include "update.h" @@ -300,6 +302,12 @@ void FixQEq::setup_pre_force(int vflag) if (force->newton_pair == 0) error->all(FLERR,"QEQ with 'newton pair off' not supported"); + if (force->pair) { + if (force->pair->suffix_flag & (Suffix::INTEL|Suffix::GPU)) + error->all(FLERR,"QEQ is not compatiple with suffix version " + "of pair style"); + } + deallocate_storage(); allocate_storage(); diff --git a/src/pair.h b/src/pair.h index b25ad448eb..5b35d029ab 100644 --- a/src/pair.h +++ b/src/pair.h @@ -28,6 +28,8 @@ class Pair : protected Pointers { friend class FixGPU; friend class FixIntel; friend class FixOMP; + friend class FixQEq; + friend class PairHybrid; friend class ThrOMP; friend class Info; diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 48ba1ccff7..485257858d 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -948,9 +948,7 @@ void PairHybrid::modify_special(int m, int /*narg*/, char **arg) special[2] = utils::numeric(FLERR,arg[2],false,lmp); special[3] = utils::numeric(FLERR,arg[3],false,lmp); - // have to cast to PairHybrid to work around C++ access restriction - - if (((PairHybrid *)styles[m])->suffix_flag & (Suffix::INTEL|Suffix::GPU)) + if (styles[m]->suffix_flag & (Suffix::INTEL|Suffix::GPU)) error->all(FLERR,"Pair_modify special is not compatible with " "suffix version of hybrid substyle"); From fec12020ac8fb2e5b1facfed4e17fe3c61c82749 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:52:29 -0400 Subject: [PATCH 064/352] add unit tests for fix qeq/point and fix qeq/shielded --- .../atomic-pair-buck_coul_cut_qeq_point.yaml | 175 ++++++++++++++++++ ...tomic-pair-buck_coul_cut_qeq_shielded.yaml | 175 ++++++++++++++++++ 2 files changed, 350 insertions(+) create mode 100644 unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml create mode 100644 unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml diff --git a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml new file mode 100644 index 0000000000..d3e6b38980 --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml @@ -0,0 +1,175 @@ +--- +lammps_version: 8 Apr 2021 +date_generated: Tue Apr 20 14:47:51 2021 +epsilon: 7.5e-13 +skip_tests: intel single +prerequisites: ! | + pair buck/coul/cut + fix qeq/point +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all qeq/point 1 6.0 1.0e-20 20 ${input_dir}/param.qeq2 warn no +input_file: in.empty +pair_style: buck/coul/cut 6.0 +pair_coeff: ! | + 1 1 0.0 0.1 00 + 1 2 18003.0 0.2052124 133.5381 + 2 2 1388.77 0.3623188 175.0 +extract: ! "" +natoms: 64 +init_vdwl: 106.41860675757 +init_coul: -129.9140700924124 +init_stress: ! |- + -2.8069812877025680e+02 -4.4806768911794171e+02 -5.0378472147221044e+02 3.9357896002405380e+02 -4.6782123097483543e+02 1.9690042286173212e+02 +init_forces: ! |2 + 1 7.9125122896296922e+00 -2.1014839690852849e+00 1.0994080971957654e+01 + 2 -8.6188789139298905e+00 -1.8333074427098923e+00 6.9043233196778493e+00 + 3 7.8498612200411868e+00 -2.1754399089581845e+01 -2.8862198492435933e+00 + 4 6.0059474900265855e+00 2.0200604615492711e+01 -3.6502720655785064e+00 + 5 -1.0414088486908696e+01 -1.2032673161543727e+01 -8.1683250459138641e+00 + 6 2.4526971509997360e+00 1.6151940503875748e+00 3.9699353225387135e+00 + 7 1.1484521325651471e+01 2.6251346011917382e+00 -5.0509149729671243e-01 + 8 -8.6634039445313658e+00 -8.3084485039834881e+00 3.9070922142448175e+00 + 9 7.9495750681929742e+00 -9.0507972374486361e+00 -4.4437699190231843e+00 + 10 -1.1184211738488107e+01 -2.0985043628368132e+00 8.0230797778549956e+00 + 11 2.8166289803609963e+01 -2.6396601038400636e+01 -7.0398077372607645e+01 + 12 1.8384817166363799e+01 4.9304421068745743e+00 -1.8773815008331542e+01 + 13 -8.5901832560112172e+00 -1.1830174021232128e+01 1.0687567118271307e+01 + 14 -2.7556923264654802e+00 1.7745847764979608e+00 -9.2066420206368988e+00 + 15 4.6735302548764643e+00 -3.2709618690940427e+00 -2.0693142194244816e+00 + 16 -6.0547965516444906e+00 -2.2600378957272116e+00 3.2677368381468008e-01 + 17 -9.1378380656225406e+00 1.1908878845184031e+01 -1.7535407559841292e+00 + 18 -1.2710024935571287e+00 -1.8390249623807247e+00 -5.0661022351703764e+00 + 19 4.7508234682845059e+00 -4.7660218202653398e-01 1.9578845982916517e+00 + 20 -2.4044494501312546e+00 1.3188349248766018e+01 -4.2723195450669484e+00 + 21 2.5545939677742822e+00 -7.6599926401155196e+00 -1.9913355105865760e+00 + 22 -1.2721065348405212e+01 2.2605336717084196e+01 -4.7468563523008402e+00 + 23 2.4611421112071081e+00 -1.4649327715865049e-01 3.5863258472083799e+00 + 24 -4.3893602786163104e+00 2.1969519282498890e+01 4.4720052177174487e+00 + 25 2.0238917888202160e+01 -1.5707849435118018e+01 5.7119813878581205e+00 + 26 -1.2244546012542273e+01 8.7637388770168165e+00 1.1554289778536326e+01 + 27 2.6315583772500917e+00 5.2366381109035203e+00 5.6567854473912291e+00 + 28 1.6069342319200945e+01 2.2379145739762505e+00 1.2146106338402367e+01 + 29 1.6156898389873891e+01 -1.3554238523505591e+01 -9.1896135574796052e+00 + 30 -8.4056006337974853e+00 7.0469844075145707e+00 6.3110771274676658e+00 + 31 -1.3273848195602289e-01 -6.8307139969335129e+00 7.6340671688916251e-01 + 32 -3.5499992242635152e+01 1.6857356356036899e+01 5.1954595281751772e+01 + 33 -1.5976858206617210e+01 -2.1986638912202295e+01 1.5916728791281200e+01 + 34 9.9892552480335084e+00 2.4910832782965171e+00 -3.5317186985424054e+00 + 35 7.0710369156676450e+01 -3.5579041343629925e+01 -5.3907803084513858e+01 + 36 -5.7367330604749455e+01 -7.0169041999492791e+01 7.3977418913261829e+01 + 37 5.5359814356241074e+01 7.2104773934571938e+01 -6.4062698737301162e+01 + 38 7.3137814516005992e+00 -6.9993845661823428e+00 -4.9786686785484031e+00 + 39 2.1766057858052013e+00 2.6649010324053237e+00 -5.5648981412947700e+00 + 40 -8.6278470191715790e+00 -6.1938287573923239e+00 -5.3007116622920181e-01 + 41 -2.1876614204878253e+00 -4.9711482834141876e+00 2.1023653625053651e+00 + 42 6.7356638591944380e+00 2.3811284335916083e+00 -2.6936658473425106e+00 + 43 -4.8166095077507318e+00 9.0096363628437235e+00 -3.5021097239659325e+00 + 44 4.5856314854049890e-01 -6.4502158514658676e+00 -2.2547412879230078e+00 + 45 -1.4050653828419732e+00 -2.7741840518241623e-01 5.9455907460299153e+00 + 46 1.7068092414266975e+00 3.0134108012937979e+00 -7.3633262984858643e+00 + 47 -8.5993680232001868e+00 3.9482405710461826e-02 -7.4020141073315715e-01 + 48 -1.4797111864775530e+02 9.0978008317055270e+01 8.8422607641864516e+01 + 49 1.2110838856400735e+01 1.0210083421020201e+01 -1.7064250014241885e+01 + 50 1.5673894480674800e+01 4.2472425008217618e+00 2.3874134866435037e-01 + 51 -1.0755978881146193e+03 9.4584826950708475e+02 -1.2161507490133176e+03 + 52 1.5238648316158450e+01 -1.4713914840395454e+01 1.0700180235730782e+01 + 53 1.0832818442423763e+03 -9.4512225095469830e+02 1.2182464933546009e+03 + 54 -1.2715521453452059e+00 1.0003156043833941e+00 -4.7435368103541586e+00 + 55 -1.2828505786775382e+01 2.4021051786462557e+01 -1.1214232355595612e+01 + 56 -7.6186543306062049e+01 2.6038364737554620e+01 4.6298155917897482e+01 + 57 1.0443716577117205e+02 3.6009056789261075e+02 2.1380802968687473e+02 + 58 -9.1275826241798370e+00 -1.3245000554098924e+01 -8.7148296348715926e-01 + 59 1.2840492718836813e+02 -1.0559491971264805e+02 -6.6237876488606588e+01 + 60 -2.1677737255323635e+00 -1.1892793887650410e+00 -8.1033360541735249e+00 + 61 -1.2148578617098147e+02 -3.5657463872647236e+02 -2.0401151842776562e+02 + 62 -2.7445863145191973e+00 1.2181869352734287e+01 6.0139221094528885e+00 + 63 -7.8700771372090834e+00 -3.1538926482273300e+00 1.0493868436023858e+01 + 64 2.5378792969187284e+01 3.2092052615283109e+01 -1.6443232536994536e+01 +run_vdwl: -1745.867185907274 +run_coul: -134.07506093090166 +run_stress: ! |- + -4.5872997550021264e+03 -3.9988755027842894e+03 -6.1188498400678936e+03 4.1760773642646591e+03 -5.3312812896810128e+03 4.4665905499115461e+03 +run_forces: ! |2 + 1 7.9285352946497758e+00 -2.1027294435031489e+00 1.1086825816163195e+01 + 2 -8.5419611035054892e+00 -1.8545741670495524e+00 7.0079173935199286e+00 + 3 8.4201002043041484e+00 -2.3236585201563706e+01 -3.5619050765611897e+00 + 4 5.8244272716577141e+00 2.0336700262604413e+01 -3.7991301665341801e+00 + 5 -1.0597147068623588e+01 -1.2052626644608324e+01 -8.3616620515931093e+00 + 6 2.3454925059969298e+00 1.9423650844033959e+00 4.1282352821875090e+00 + 7 1.1498130683730052e+01 2.7037305516932548e+00 -4.3590618591979624e-01 + 8 -8.7055079862119680e+00 -8.2080543611619063e+00 3.8502610802694401e+00 + 9 7.8905280043672006e+00 -9.1748249725951716e+00 -4.3595650830599473e+00 + 10 -1.1214544607539489e+01 -2.0450291190922241e+00 8.0819592940862215e+00 + 11 3.1110360595812111e+01 -3.0379448305557091e+01 -8.0086245459647699e+01 + 12 1.8159177163415904e+01 4.8329111811515117e+00 -1.8760362770452407e+01 + 13 -8.3967367015110703e+00 -1.1826424656028374e+01 1.0490586963619998e+01 + 14 -2.7403143901237863e+00 1.5146525228727186e+00 -9.5102191320553011e+00 + 15 4.6084095676492058e+00 -3.2455057110391716e+00 -2.0076394841639451e+00 + 16 -5.9971213141367166e+00 -2.1400797487747161e+00 3.8635660450105780e-01 + 17 -9.2777494354866672e+00 1.1929670372837402e+01 -1.5781112010078653e+00 + 18 -1.2640996234737609e+00 -1.8706861715670353e+00 -5.0907920358459542e+00 + 19 4.7710267464485367e+00 -4.0988795718884213e-01 1.9972858346581028e+00 + 20 -2.2378279249288067e+00 1.3107343895216937e+01 -4.2428037955197233e+00 + 21 2.5289893324335391e+00 -7.6558240340245325e+00 -1.9069419539704020e+00 + 22 -1.2728255711560161e+01 2.2449803210470662e+01 -4.4375794812338860e+00 + 23 2.2126988647283259e+00 -1.9107846463909647e-01 3.6978572940177510e+00 + 24 -4.9407746531577494e+00 2.3427146491434673e+01 5.0673415871481255e+00 + 25 2.0382651093146954e+01 -1.5777195827352591e+01 5.8844240401473211e+00 + 26 -1.2179841258863439e+01 8.7610073871936400e+00 1.1530406923973768e+01 + 27 2.6588676610969855e+00 5.1896378052166741e+00 5.6387483053555902e+00 + 28 1.5666189299730341e+01 1.6249815489114361e+00 1.1769883127324578e+01 + 29 1.6154781213323030e+01 -1.3566033536379088e+01 -9.1472138878710076e+00 + 30 -8.3472695417921603e+00 7.0562388858473168e+00 6.3337664999339882e+00 + 31 4.5583726078147091e-02 -6.8079173592470026e+00 8.8191267004599450e-01 + 32 -3.7970235777293169e+01 2.1379327045743118e+01 6.2117682066075531e+01 + 33 -1.6353741251628691e+01 -2.2709420959741056e+01 1.6304846015441370e+01 + 34 9.9972886088735162e+00 2.2643391331974536e+00 -3.4550103310401896e+00 + 35 7.6455556546064358e+01 -3.7809722812169873e+01 -5.8409719550108399e+01 + 36 -6.9348410375051216e+01 -8.5084762326803883e+01 8.7066878049116482e+01 + 37 6.7398486015543440e+01 8.6977799607188729e+01 -7.7261561475806531e+01 + 38 7.3284526937033183e+00 -7.6017536517090827e+00 -4.4692146119773133e+00 + 39 2.2039881666125036e+00 2.6712481163988575e+00 -5.4998118879989439e+00 + 40 -8.1920739102716507e+00 -5.6013665505583772e+00 -6.3906324471289055e-01 + 41 -9.6914424345020511e-01 -3.6895968531383003e+00 1.1100392846951848e+00 + 42 6.4344379128480211e+00 2.8919317863081786e+00 -2.0533867506787638e+00 + 43 -4.8969216688076900e+00 8.9173540382237473e+00 -3.4262725785712571e+00 + 44 3.9812820211199523e-01 -6.4925904498103826e+00 -2.2914632965466297e+00 + 45 -1.1701379586492111e+00 -6.8534375447769547e-01 5.2141786324779167e+00 + 46 1.7082488047076678e+00 2.9689192858013040e+00 -7.3986980836820644e+00 + 47 -8.4162004926885050e+00 -1.1549845996840341e-01 -6.9949420861709011e-01 + 48 -1.7140102399704551e+02 1.0954749031941631e+02 1.0215589866028962e+02 + 49 1.2958089986488774e+01 1.0763913519899868e+01 -1.6248816454541608e+01 + 50 1.4518431826929746e+01 5.0424709064095214e+00 5.3597634284364259e-02 + 51 -1.4015254817893208e+04 1.2504756770641432e+04 -1.5967183598544239e+04 + 52 1.5420056645525479e+01 -1.4998517432233239e+01 1.0961481290482833e+01 + 53 1.4023035080488416e+04 -1.2504964789519170e+04 1.5967622019398565e+04 + 54 -1.2443556258779074e+00 1.1935781697358863e+00 -4.7574145417182354e+00 + 55 -1.3066707495598941e+01 2.3943248755492228e+01 -1.1562546476831322e+01 + 56 -8.3304235816705628e+01 2.6818208086831827e+01 5.1686194842892000e+01 + 57 1.5120792842525938e+02 5.1705018806557780e+02 3.0849363663112024e+02 + 58 -9.2125676676377548e+00 -1.1733522325859413e+01 1.8639253510409390e-02 + 59 1.5201721677305994e+02 -1.2328671257917705e+02 -8.0267873143196880e+01 + 60 -2.1359354701455682e+00 -1.0122954230610202e+00 -7.9908260633230173e+00 + 61 -1.6847550389189405e+02 -5.1524925258885060e+02 -2.9923087564684147e+02 + 62 -2.7864227120115106e+00 1.2259886975143148e+01 5.9379812236948695e+00 + 63 -7.9097586153187249e+00 -3.2603634511507762e+00 1.0417329010466950e+01 + 64 2.5990005859488274e+01 3.2517151166598666e+01 -1.6862446054183820e+01 +... diff --git a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml new file mode 100644 index 0000000000..2a80c30144 --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml @@ -0,0 +1,175 @@ +--- +lammps_version: 8 Apr 2021 +date_generated: Tue Apr 20 14:48:00 2021 +epsilon: 7.5e-13 +skip_tests: intel single +prerequisites: ! | + pair buck/coul/cut + fix qeq/shielded +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all qeq/shielded 1 6.0 1.0e-20 20 ${input_dir}/param.qeq2 warn no +input_file: in.empty +pair_style: buck/coul/cut 6.0 +pair_coeff: ! | + 1 1 0.0 0.1 00 + 1 2 18003.0 0.2052124 133.5381 + 2 2 1388.77 0.3623188 175.0 +extract: ! "" +natoms: 64 +init_vdwl: 106.41860675757 +init_coul: -92.45424973362312 +init_stress: ! |- + -2.6904173108770976e+02 -4.3428982773044442e+02 -4.9175916018347112e+02 3.9566088371930806e+02 -4.7262515517192719e+02 1.9591432292647838e+02 +init_forces: ! |2 + 1 7.9141417235740947e+00 -1.6575050231777215e+00 1.1247124417953305e+01 + 2 -8.1950643733925208e+00 -1.6928876509873696e+00 6.6818350912540652e+00 + 3 7.5215990692204731e+00 -2.1745595057982086e+01 -3.1301184475253381e+00 + 4 5.3917119324179188e+00 1.9732178742296160e+01 -3.7725042521095493e+00 + 5 -1.0136647320370246e+01 -1.2048794925281427e+01 -8.4425399256150335e+00 + 6 2.4664525420347161e+00 1.5156953299620182e+00 3.7546365998324012e+00 + 7 1.1539561031557810e+01 2.5652090902711979e+00 -4.3086648609162537e-01 + 8 -8.0662635175834705e+00 -8.3166158318636221e+00 4.2929691537457746e+00 + 9 7.8771720152697613e+00 -9.0024422542616396e+00 -4.5409532537229280e+00 + 10 -1.0964825127320315e+01 -1.7834328756310320e+00 7.8305203967741654e+00 + 11 2.8042061526336870e+01 -2.4878965644063260e+01 -6.9143265780487837e+01 + 12 1.8495615121211895e+01 4.3133827818564443e+00 -1.7691034897981336e+01 + 13 -8.4399728839306629e+00 -1.1518157999367906e+01 1.0295637396842004e+01 + 14 -2.7480646564437472e+00 1.8734968257465416e+00 -9.0973470213750058e+00 + 15 4.0225295371995529e+00 -4.0872787545152063e+00 -2.9384778611873470e+00 + 16 -5.9650138797306003e+00 -2.3087379423335772e+00 6.8308131661998561e-02 + 17 -9.1908442946528215e+00 1.1751276661643065e+01 -1.8408085151683529e+00 + 18 -1.3137718308179736e+00 -1.9012430640012012e+00 -5.1139666908059747e+00 + 19 4.4549255890758639e+00 -4.3939817417280941e-01 2.1886643387097751e+00 + 20 -2.0319203048741077e+00 1.2653408558732941e+01 -4.9917805891989406e+00 + 21 2.4950515142199343e+00 -7.8536749191430131e+00 -1.8304140855930795e+00 + 22 -1.2859663801965809e+01 2.2730915732234180e+01 -4.9479217011461092e+00 + 23 2.5459383618018023e+00 -2.9828026430000509e-01 3.4194490946030140e+00 + 24 -4.3638180485752436e+00 2.2376710173772068e+01 4.7532741402407801e+00 + 25 2.0836667788518888e+01 -1.6344888313048909e+01 5.6211876341385709e+00 + 26 -1.2607606955151248e+01 9.1008974375965153e+00 1.2019343399635865e+01 + 27 2.1952885206072059e+00 5.0665486907574895e+00 5.5237917166507362e+00 + 28 1.6488561582105199e+01 2.4906410951101425e+00 1.2426653974121137e+01 + 29 1.6251639920278514e+01 -1.4165524718233035e+01 -9.5519013725891924e+00 + 30 -8.5665322777305750e+00 6.5330097528312958e+00 6.7385937277364834e+00 + 31 -1.6266027468958288e-01 -6.6886609738962113e+00 8.8566519040115255e-01 + 32 -3.5245474890368847e+01 1.6495014756334484e+01 5.1078937232184522e+01 + 33 -1.5987226674008781e+01 -2.1890093847568011e+01 1.6032979914514094e+01 + 34 9.8711439787861472e+00 2.5536945969673872e+00 -3.3348635269507474e+00 + 35 7.0807263895311777e+01 -3.5539168497154421e+01 -5.3725574081330656e+01 + 36 -5.6877142152340149e+01 -6.9366823927578849e+01 7.2994971999025935e+01 + 37 5.4660108324736413e+01 7.1291615544338143e+01 -6.3759392720711894e+01 + 38 7.0743366174130307e+00 -7.6487647563486689e+00 -4.6878237559766189e+00 + 39 2.0381847012670646e+00 2.6755672967675741e+00 -5.2811442194348039e+00 + 40 -9.0185944759842691e+00 -5.7604357452722770e+00 -3.4337610522422546e-01 + 41 -2.7088447313443842e+00 -5.2782133055992473e+00 1.7885966807060194e+00 + 42 6.7732857687967325e+00 2.3205919970957725e+00 -2.4010131075334322e+00 + 43 -4.5927233661860249e+00 9.0529486933975445e+00 -3.6577320776925335e+00 + 44 2.8749921571080672e-01 -6.1319691267726260e+00 -1.7739459946345322e+00 + 45 -1.1845421822047435e+00 -1.2989558081946262e-01 5.4900076955978339e+00 + 46 1.3601159060680870e+00 3.5799207177313330e+00 -7.6189436341957544e+00 + 47 -8.1337841515165614e+00 -1.2629496960863673e-01 -8.8562060415993760e-01 + 48 -1.4860155650493951e+02 9.0963206813737870e+01 8.8856904799540899e+01 + 49 1.2639152627450446e+01 1.0359532596352693e+01 -1.7242867911828036e+01 + 50 1.5521880865901194e+01 4.2868543946915896e+00 3.1711848237800400e-01 + 51 -1.0735634351608480e+03 9.4537025515826099e+02 -1.2147493979398862e+03 + 52 1.5466658019682828e+01 -1.4895417892202326e+01 1.1112480680825493e+01 + 53 1.0819480450682750e+03 -9.4418452213503031e+02 1.2169212362594612e+03 + 54 -1.0894773002862821e+00 6.6706752208107978e-01 -4.8790516443905974e+00 + 55 -1.3844732593145427e+01 2.4648863250620490e+01 -1.1348546815898326e+01 + 56 -7.5962830973889339e+01 2.6101351295707214e+01 4.6341687389775707e+01 + 57 1.0485701291302608e+02 3.6058930749586290e+02 2.1396553624858470e+02 + 58 -8.9779882186764475e+00 -1.3244731779675908e+01 -1.3278080384995206e+00 + 59 1.2850554211073154e+02 -1.0591990510462425e+02 -6.6793350663870882e+01 + 60 -2.1508838217754374e+00 -9.5900020614540604e-01 -7.7855526817679328e+00 + 61 -1.2102976382849171e+02 -3.5660400748210526e+02 -2.0445983478947505e+02 + 62 -3.2250906445468925e+00 1.1774314121365196e+01 6.3355915377420322e+00 + 63 -7.6074695879604359e+00 -2.9040201639454253e+00 1.0880944642028627e+01 + 64 2.5065083017154684e+01 3.1881871782588231e+01 -1.6344906772607633e+01 +run_vdwl: -1738.504828461019 +run_coul: -94.95581768227976 +run_stress: ! |- + -4.5595453405449562e+03 -3.9713162676196043e+03 -6.0848825790480287e+03 4.1634964821175072e+03 -5.3172121985750009e+03 4.4482840126121810e+03 +run_forces: ! |2 + 1 7.9430648174104608e+00 -1.6505623585983651e+00 1.1353040695469964e+01 + 2 -8.0909470592272665e+00 -1.6949319849892177e+00 6.7767677870716474e+00 + 3 8.1078778180838125e+00 -2.3235717929919247e+01 -3.8090540398880952e+00 + 4 5.2184189853247993e+00 1.9883083402118530e+01 -3.9293647164607202e+00 + 5 -1.0315532797751688e+01 -1.2066521654437734e+01 -8.6235072008116074e+00 + 6 2.3527033402736865e+00 1.8434233133221647e+00 3.9200698665620468e+00 + 7 1.1558853330915097e+01 2.6482270737969671e+00 -3.5653539616982843e-01 + 8 -8.0944578895520376e+00 -8.2317015861577598e+00 4.2492167566992798e+00 + 9 7.7973204991242282e+00 -9.1232078942352679e+00 -4.4476458756957902e+00 + 10 -1.0992761089447495e+01 -1.7271203633765912e+00 7.8732627610722128e+00 + 11 3.0931722247747444e+01 -2.8786477048677739e+01 -7.8665114289916033e+01 + 12 1.8274394539545813e+01 4.2080021850140445e+00 -1.7702358881800027e+01 + 13 -8.2599586789888200e+00 -1.1515741006968879e+01 1.0107104927112278e+01 + 14 -2.7279898223061001e+00 1.6130541061743697e+00 -9.3952153337124464e+00 + 15 3.9515263062313335e+00 -4.0844589202051376e+00 -2.8866117721996689e+00 + 16 -5.8981678832905171e+00 -2.1804152314776850e+00 1.4275910534889458e-01 + 17 -9.3307269581232593e+00 1.1774312330333576e+01 -1.6692683576013803e+00 + 18 -1.3134558888695769e+00 -1.9382763777674961e+00 -5.1386794705347452e+00 + 19 4.4778449905197109e+00 -3.7332160506766110e-01 2.2265534122637054e+00 + 20 -1.9216161276856039e+00 1.2623039169837961e+01 -4.9985363809975647e+00 + 21 2.4738768947622880e+00 -7.8544243197235870e+00 -1.7482503763962445e+00 + 22 -1.2883029726566168e+01 2.2588117645764534e+01 -4.6467323617000371e+00 + 23 2.3091594744980535e+00 -3.5151849114507772e-01 3.5274744438543237e+00 + 24 -4.9018564244447180e+00 2.3838352476498073e+01 5.3460036982254815e+00 + 25 2.0948048851721442e+01 -1.6373698326971489e+01 5.7720446049694036e+00 + 26 -1.2578008211337877e+01 9.1211609042314503e+00 1.2008844944222867e+01 + 27 2.2045394963986160e+00 5.0247152904089880e+00 5.4827119887611868e+00 + 28 1.6104286139406646e+01 1.9002405388339891e+00 1.2069099381708440e+01 + 29 1.6263381250006539e+01 -1.4213704415061143e+01 -9.5280965445643737e+00 + 30 -8.5106296596336417e+00 6.5389339966331104e+00 6.7625294275517316e+00 + 31 1.4273319546851848e-02 -6.6747306136807882e+00 1.0093006407241376e+00 + 32 -3.7680672886741476e+01 2.0930462633195887e+01 6.1078153188510051e+01 + 33 -1.6365245005849875e+01 -2.2602871724758668e+01 1.6416398262575715e+01 + 34 9.8850471358845962e+00 2.3562304461945787e+00 -3.2796925462623761e+00 + 35 7.6552797346940821e+01 -3.7762973127437611e+01 -5.8230414917441593e+01 + 36 -6.8717983540165619e+01 -8.4097670136565384e+01 8.5940075687947427e+01 + 37 6.6554563114837478e+01 8.5966291567755746e+01 -7.6794896761790099e+01 + 38 7.1088003592849205e+00 -8.2230746263721581e+00 -4.2021171895312630e+00 + 39 2.0757879393792544e+00 2.6895810149309449e+00 -5.2209951864941644e+00 + 40 -8.5670330622826629e+00 -5.1877611476592262e+00 -4.7690438257845008e-01 + 41 -1.5274749236361123e+00 -4.0411587071835031e+00 7.8872850139034600e-01 + 42 6.4844518585745128e+00 2.8177957843382857e+00 -1.7924873100831999e+00 + 43 -4.6905478422001954e+00 8.9556578890169813e+00 -3.5942238071494108e+00 + 44 2.2519703741980698e-01 -6.1753412426980390e+00 -1.8022354020798390e+00 + 45 -9.1501325926584676e-01 -5.2347101045402322e-01 4.8068911677143360e+00 + 46 1.3779977952935716e+00 3.4995478428931444e+00 -7.6316648685752480e+00 + 47 -8.0609749909669581e+00 -2.1741420953096791e-01 -8.4151730986634521e-01 + 48 -1.7213184634714088e+02 1.0957659916624621e+02 1.0267576521252535e+02 + 49 1.3502214899750406e+01 1.0917576182238818e+01 -1.6482937758762418e+01 + 50 1.4379813283875713e+01 5.0553400873044820e+00 1.0683342950103625e-01 + 51 -1.3957521762635950e+04 1.2452654544174226e+04 -1.5900991752693422e+04 + 52 1.5633296407076536e+01 -1.5168118286747163e+01 1.1375722352219624e+01 + 53 1.3966019441343162e+04 -1.2452432702569762e+04 1.5901485612155189e+04 + 54 -1.0302010742237790e+00 8.0882593586606122e-01 -4.8342043026033270e+00 + 55 -1.4050317568063919e+01 2.4571746720771483e+01 -1.1619744995231775e+01 + 56 -8.3051825195541284e+01 2.6893430568070734e+01 5.1720488371951646e+01 + 57 1.5167680987925942e+02 5.1771459761745700e+02 3.0876046319206444e+02 + 58 -9.0684224428918387e+00 -1.1737173531443593e+01 -4.2815053798067343e-01 + 59 1.5222786378196815e+02 -1.2370024170265403e+02 -8.0875432712487481e+01 + 60 -2.1233147761897007e+00 -7.9017832727701498e-01 -7.6738212145982452e+00 + 61 -1.6808948242299991e+02 -5.1546658556632860e+02 -2.9975983407554941e+02 + 62 -3.2501332686207283e+00 1.1879860248088384e+01 6.2378391727747093e+00 + 63 -7.6393918044176985e+00 -2.9843682141469259e+00 1.0819122718511684e+01 + 64 2.5665406780155877e+01 3.2294883947912929e+01 -1.6760878883557520e+01 +... From a959d655601d9d78d668baea9988df6dbeb901ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:52:42 -0400 Subject: [PATCH 065/352] whitespace fixes --- src/QEQ/fix_qeq.cpp | 72 ++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 542670f1f3..d6fe12abf8 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -120,7 +120,7 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : atom->add_callback(Atom::GROW); for (int i = 0; i < atom->nmax; i++) - for (int j = 0; j < nprev; ++j ) + for (int j = 0; j < nprev; ++j) s_hist[i][j] = t_hist[i][j] = atom->q[i]; if (strcmp(arg[7],"coul/streitz") == 0) { @@ -253,7 +253,7 @@ void FixQEq::allocate_matrix() i = ilist[ii]; m += numneigh[i]; } - m_cap = MAX( (int)(m * safezone), mincap * MIN_NBRS ); + m_cap = MAX((int)(m * safezone), mincap * MIN_NBRS); H.n = n_cap; H.m = m_cap; @@ -267,10 +267,10 @@ void FixQEq::allocate_matrix() void FixQEq::deallocate_matrix() { - memory->destroy( H.firstnbr ); - memory->destroy( H.numnbrs ); - memory->destroy( H.jlist ); - memory->destroy( H.val ); + memory->destroy(H.firstnbr); + memory->destroy(H.numnbrs); + memory->destroy(H.jlist); + memory->destroy(H.val); } /* ---------------------------------------------------------------------- */ @@ -365,7 +365,7 @@ void FixQEq::min_pre_force(int vflag) /* ---------------------------------------------------------------------- */ -int FixQEq::CG( double *b, double *x ) +int FixQEq::CG(double *b, double *x) { int loop, i, ii, inum, *ilist; double tmp, alfa, beta, b_norm; @@ -375,10 +375,10 @@ int FixQEq::CG( double *b, double *x ) ilist = list->ilist; pack_flag = 1; - sparse_matvec( &H, x, q ); - comm->reverse_comm_fix( this ); + sparse_matvec(&H, x, q); + comm->reverse_comm_fix(this); - vector_sum( r , 1., b, -1., q, inum ); + vector_sum(r , 1., b, -1., q, inum); for (ii = 0; ii < inum; ++ii) { i = ilist[ii]; @@ -387,19 +387,19 @@ int FixQEq::CG( double *b, double *x ) else d[i] = 0.0; } - b_norm = parallel_norm( b, inum ); - sig_new = parallel_dot( r, d, inum); + b_norm = parallel_norm(b, inum); + sig_new = parallel_dot(r, d, inum); for (loop = 1; loop < maxiter && sqrt(sig_new)/b_norm > tolerance; ++loop) { comm->forward_comm_fix(this); - sparse_matvec( &H, d, q ); + sparse_matvec(&H, d, q); comm->reverse_comm_fix(this); - tmp = parallel_dot( d, q, inum); + tmp = parallel_dot(d, q, inum); alfa = sig_new / tmp; - vector_add( x, alfa, d, inum ); - vector_add( r, -alfa, q, inum ); + vector_add(x, alfa, d, inum); + vector_add(r, -alfa, q, inum); for (ii = 0; ii < inum; ++ii) { i = ilist[ii]; @@ -408,10 +408,10 @@ int FixQEq::CG( double *b, double *x ) } sig_old = sig_new; - sig_new = parallel_dot( r, p, inum); + sig_new = parallel_dot(r, p, inum); beta = sig_new / sig_old; - vector_sum( d, 1., p, beta, d, inum ); + vector_sum(d, 1., p, beta, d, inum); } if ((comm->me == 0) && maxwarn && (loop >= maxiter)) @@ -425,7 +425,7 @@ int FixQEq::CG( double *b, double *x ) /* ---------------------------------------------------------------------- */ -void FixQEq::sparse_matvec( sparse_matrix *A, double *x, double *b ) +void FixQEq::sparse_matvec(sparse_matrix *A, double *x, double *b) { int i, j, itr_j; @@ -444,7 +444,7 @@ void FixQEq::sparse_matvec( sparse_matrix *A, double *x, double *b ) for (i = 0; i < nlocal; ++i) { if (atom->mask[i] & groupbit) { - for ( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + for (itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; b[i] += A->val[itr_j] * x[j]; b[j] += A->val[itr_j] * x[i]; @@ -466,8 +466,8 @@ void FixQEq::calculate_Q() inum = list->inum; ilist = list->ilist; - s_sum = parallel_vector_acc( s, inum ); - t_sum = parallel_vector_acc( t, inum); + s_sum = parallel_vector_acc(s, inum); + t_sum = parallel_vector_acc(t, inum); u = s_sum / t_sum; for (ii = 0; ii < inum; ++ii) { @@ -485,7 +485,7 @@ void FixQEq::calculate_Q() } pack_flag = 4; - comm->forward_comm_fix( this ); //Dist_vector( atom->q ); + comm->forward_comm_fix(this); //Dist_vector(atom->q); } /* ---------------------------------------------------------------------- */ @@ -516,11 +516,11 @@ void FixQEq::unpack_forward_comm(int n, int first, double *buf) if (pack_flag == 1) for (m = 0, i = first; m < n; m++, i++) d[i] = buf[m]; - else if ( pack_flag == 2) + else if (pack_flag == 2) for (m = 0, i = first; m < n; m++, i++) s[i] = buf[m]; - else if ( pack_flag == 3) + else if (pack_flag == 3) for (m = 0, i = first; m < n; m++, i++) t[i] = buf[m]; - else if ( pack_flag == 4) + else if (pack_flag == 4) for (m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; } @@ -605,7 +605,7 @@ int FixQEq::unpack_exchange(int n, double *buf) /* ---------------------------------------------------------------------- */ -double FixQEq::parallel_norm( double *v, int n ) +double FixQEq::parallel_norm(double *v, int n) { int i; double my_sum, norm_sqr; @@ -623,14 +623,14 @@ double FixQEq::parallel_norm( double *v, int n ) my_sum += v[i]*v[i]; } - MPI_Allreduce( &my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_sum, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); - return sqrt( norm_sqr ); + return sqrt(norm_sqr); } /* ---------------------------------------------------------------------- */ -double FixQEq::parallel_dot( double *v1, double *v2, int n) +double FixQEq::parallel_dot(double *v1, double *v2, int n) { int i; double my_dot, res; @@ -648,14 +648,14 @@ double FixQEq::parallel_dot( double *v1, double *v2, int n) my_dot += v1[i] * v2[i]; } - MPI_Allreduce( &my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } /* ---------------------------------------------------------------------- */ -double FixQEq::parallel_vector_acc( double *v, int n ) +double FixQEq::parallel_vector_acc(double *v, int n) { int i; double my_acc, res; @@ -673,15 +673,15 @@ double FixQEq::parallel_vector_acc( double *v, int n ) my_acc += v[i]; } - MPI_Allreduce( &my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_acc, &res, 1, MPI_DOUBLE, MPI_SUM, world); return res; } /* ---------------------------------------------------------------------- */ -void FixQEq::vector_sum( double* dest, double c, double* v, - double d, double* y, int k ) +void FixQEq::vector_sum(double* dest, double c, double* v, + double d, double* y, int k) { int kk; int *ilist; @@ -697,7 +697,7 @@ void FixQEq::vector_sum( double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEq::vector_add( double* dest, double c, double* v, int k ) +void FixQEq::vector_add(double* dest, double c, double* v, int k) { int kk; int *ilist; From ae570c05d836f683d80215e7068e786d7c914340 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:53:44 -0400 Subject: [PATCH 066/352] we don't need to hardcode pair styles to skip specific tests, but use YAML file for it --- unittest/force-styles/test_pair_style.cpp | 15 --------------- .../force-styles/tests/atomic-pair-colloid.yaml | 1 + .../tests/atomic-pair-colloid_multi.yaml | 1 + .../tests/atomic-pair-colloid_multi_tri.yaml | 1 + .../tests/atomic-pair-colloid_tiled.yaml | 1 + .../tests/atomic-pair-colloid_tiled_tri.yaml | 1 + unittest/force-styles/tests/atomic-pair-eam.yaml | 1 + .../force-styles/tests/atomic-pair-eam_alloy.yaml | 1 + .../tests/atomic-pair-eam_alloy_real.yaml | 1 + .../force-styles/tests/atomic-pair-eam_cd.yaml | 1 + .../tests/atomic-pair-eam_cd_old.yaml | 1 + .../tests/atomic-pair-eam_cd_real.yaml | 1 + .../force-styles/tests/atomic-pair-eam_fs.yaml | 1 + .../tests/atomic-pair-eam_fs_real.yaml | 1 + .../force-styles/tests/atomic-pair-eam_he.yaml | 1 + .../tests/atomic-pair-eam_he_real.yaml | 1 + .../force-styles/tests/atomic-pair-eam_real.yaml | 1 + .../tests/atomic-pair-hybrid-eam.yaml | 1 + .../tests/atomic-pair-hybrid-eam_fs.yaml | 1 + .../tests/atomic-pair-yukawa_colloid.yaml | 1 + unittest/force-styles/tests/mol-pair-dpd.yaml | 2 +- .../force-styles/tests/mol-pair-dpd_tstat.yaml | 2 +- 22 files changed, 21 insertions(+), 17 deletions(-) diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index 057f2b5352..999ac54e7b 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -1188,21 +1188,6 @@ TEST(PairStyle, single) GTEST_SKIP(); } - // The single function in EAM is different from what we assume - // here, therefore we have to skip testing those pair styles. - // Pair styles colloid and yukawa/colloid are also not compatible with this single tester - if ((test_config.pair_style.substr(0, 7) == "colloid") || - (test_config.pair_style.substr(0, 14) == "yukawa/colloid") || - (test_config.pair_style.substr(0, 3) == "dpd") || - (test_config.pair_style.substr(0, 3) == "eam") || - ((test_config.pair_style.substr(0, 6) == "hybrid") && - (test_config.pair_style.find("eam") != std::string::npos))) { - if (!verbose) ::testing::internal::CaptureStdout(); - cleanup_lammps(lmp, test_config); - if (!verbose) ::testing::internal::GetCapturedStdout(); - GTEST_SKIP(); - } - // now start over if (!verbose) ::testing::internal::CaptureStdout(); diff --git a/unittest/force-styles/tests/atomic-pair-colloid.yaml b/unittest/force-styles/tests/atomic-pair-colloid.yaml index 537ac447b5..b666021c91 100644 --- a/unittest/force-styles/tests/atomic-pair-colloid.yaml +++ b/unittest/force-styles/tests/atomic-pair-colloid.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:59 2021 epsilon: 5e-14 +skip_tests: single prerequisites: ! | pair colloid pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-colloid_multi.yaml b/unittest/force-styles/tests/atomic-pair-colloid_multi.yaml index 025a7faa05..d224977a3e 100644 --- a/unittest/force-styles/tests/atomic-pair-colloid_multi.yaml +++ b/unittest/force-styles/tests/atomic-pair-colloid_multi.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:59 2021 epsilon: 5e-14 +skip_tests: single prerequisites: ! | pair colloid pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-colloid_multi_tri.yaml b/unittest/force-styles/tests/atomic-pair-colloid_multi_tri.yaml index 9ead662a06..fa52a37ce7 100644 --- a/unittest/force-styles/tests/atomic-pair-colloid_multi_tri.yaml +++ b/unittest/force-styles/tests/atomic-pair-colloid_multi_tri.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:59 2021 epsilon: 5e-13 +skip_tests: single prerequisites: ! | pair colloid pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-colloid_tiled.yaml b/unittest/force-styles/tests/atomic-pair-colloid_tiled.yaml index be3ba744d0..62e85584e7 100644 --- a/unittest/force-styles/tests/atomic-pair-colloid_tiled.yaml +++ b/unittest/force-styles/tests/atomic-pair-colloid_tiled.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:59 2021 epsilon: 5e-14 +skip_tests: single prerequisites: ! | pair colloid pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-colloid_tiled_tri.yaml b/unittest/force-styles/tests/atomic-pair-colloid_tiled_tri.yaml index cd6c7595e8..b3f0b7a06d 100644 --- a/unittest/force-styles/tests/atomic-pair-colloid_tiled_tri.yaml +++ b/unittest/force-styles/tests/atomic-pair-colloid_tiled_tri.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:59 2021 epsilon: 5e-13 +skip_tests: single prerequisites: ! | pair colloid pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam.yaml b/unittest/force-styles/tests/atomic-pair-eam.yaml index c606813d56..9c8c3ba8cd 100644 --- a/unittest/force-styles/tests/atomic-pair-eam.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 6e-12 +skip_tests: single prerequisites: ! | pair eam pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam_alloy.yaml b/unittest/force-styles/tests/atomic-pair-eam_alloy.yaml index 072a0a97c0..5ec5bef372 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_alloy.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_alloy.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/alloy pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-eam_alloy_real.yaml b/unittest/force-styles/tests/atomic-pair-eam_alloy_real.yaml index 033c341f08..bff08e048b 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_alloy_real.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_alloy_real.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 7.5e-12 +skip_tests: single prerequisites: ! | pair eam/alloy pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam_cd.yaml b/unittest/force-styles/tests/atomic-pair-eam_cd.yaml index bda14a9e5a..915253dce7 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_cd.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_cd.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/cd pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-eam_cd_old.yaml b/unittest/force-styles/tests/atomic-pair-eam_cd_old.yaml index 4f6891bae6..a7fa727b7f 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_cd_old.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_cd_old.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/cd/old pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-eam_cd_real.yaml b/unittest/force-styles/tests/atomic-pair-eam_cd_real.yaml index e2ac5f0cae..abe25cff95 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_cd_real.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_cd_real.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:00 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/cd pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam_fs.yaml b/unittest/force-styles/tests/atomic-pair-eam_fs.yaml index 89ad740424..58c533d7ec 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_fs.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_fs.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:01 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/fs pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-eam_fs_real.yaml b/unittest/force-styles/tests/atomic-pair-eam_fs_real.yaml index bf7f4f338b..f7739ee824 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_fs_real.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_fs_real.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:01 2021 epsilon: 7.5e-12 +skip_tests: single prerequisites: ! | pair eam/fs pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam_he.yaml b/unittest/force-styles/tests/atomic-pair-eam_he.yaml index 001301fe1a..f2bf098b2f 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_he.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_he.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:01 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/he pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-eam_he_real.yaml b/unittest/force-styles/tests/atomic-pair-eam_he_real.yaml index 236b9538a7..b2b198486e 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_he_real.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_he_real.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 epsilon: 7.5e-12 +skip_tests: single prerequisites: ! | pair eam/he pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-eam_real.yaml b/unittest/force-styles/tests/atomic-pair-eam_real.yaml index 89e7c1ce0b..4d95f04edc 100644 --- a/unittest/force-styles/tests/atomic-pair-eam_real.yaml +++ b/unittest/force-styles/tests/atomic-pair-eam_real.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-hybrid-eam.yaml b/unittest/force-styles/tests/atomic-pair-hybrid-eam.yaml index a681657b65..11f226d493 100644 --- a/unittest/force-styles/tests/atomic-pair-hybrid-eam.yaml +++ b/unittest/force-styles/tests/atomic-pair-hybrid-eam.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:02 2021 epsilon: 1e-11 +skip_tests: single prerequisites: ! | pair eam/fs pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-hybrid-eam_fs.yaml b/unittest/force-styles/tests/atomic-pair-hybrid-eam_fs.yaml index d2f511b3ea..ee63f01e63 100644 --- a/unittest/force-styles/tests/atomic-pair-hybrid-eam_fs.yaml +++ b/unittest/force-styles/tests/atomic-pair-hybrid-eam_fs.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:03 2021 epsilon: 5e-12 +skip_tests: single prerequisites: ! | pair eam/fs pre_commands: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml b/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml index 1529cf51b9..008c4be01c 100644 --- a/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml +++ b/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:10 2021 epsilon: 5e-14 +skip_tests: single prerequisites: ! | atom sphere pair yukawa/colloid diff --git a/unittest/force-styles/tests/mol-pair-dpd.yaml b/unittest/force-styles/tests/mol-pair-dpd.yaml index 4964a74e2a..c3900a3bc6 100644 --- a/unittest/force-styles/tests/mol-pair-dpd.yaml +++ b/unittest/force-styles/tests/mol-pair-dpd.yaml @@ -2,7 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:44 2021 epsilon: 5e-14 -skip_tests: gpu intel +skip_tests: gpu intel single prerequisites: ! | atom full pair dpd diff --git a/unittest/force-styles/tests/mol-pair-dpd_tstat.yaml b/unittest/force-styles/tests/mol-pair-dpd_tstat.yaml index 0348c0d601..09d52366ba 100644 --- a/unittest/force-styles/tests/mol-pair-dpd_tstat.yaml +++ b/unittest/force-styles/tests/mol-pair-dpd_tstat.yaml @@ -2,7 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:08:44 2021 epsilon: 5e-14 -skip_tests: gpu intel +skip_tests: gpu intel single prerequisites: ! | atom full pair dpd/tstat From 678e243430a61d964757661b3dd0f34423daa3a9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:54:14 -0400 Subject: [PATCH 067/352] small update of unit test inputs --- .../tests/atomic-pair-reax_c.yaml | 277 +++++++++--------- .../tests/atomic-pair-reax_c_lgvdw.yaml | 275 ++++++++--------- .../tests/atomic-pair-reax_c_noqeq.yaml | 51 ++-- 3 files changed, 303 insertions(+), 300 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index a0dabff323..261812d56c 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,7 +1,8 @@ --- -lammps_version: 24 Aug 2020 -date_generated: Tue Sep 15 09:44:24 202 -epsilon: 5e-11 +lammps_version: 8 Apr 2021 +date_generated: Mon Apr 19 09:21:15 2021 +epsilon: 1e-10 +skip_tests: prerequisites: ! | pair reax/c fix qeq/reax @@ -24,149 +25,149 @@ pre_commands: ! | set type 2 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-12 reax/c + fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c maxiter 20 nowarn input_file: in.empty pair_style: reax/c NULL checkqeq yes pair_coeff: ! | * * ffield.reax.mattsson C O extract: ! "" natoms: 64 -init_vdwl: -4208.20379453327 -init_coul: -268.025868109969 +init_vdwl: -4208.203794533267 +init_coul: -268.02765877429266 init_stress: ! |2- - 2.3677048490920824e+03 3.0802122558803894e+03 1.2727815110256352e+03 -1.5387991688244833e+03 -1.0906364142624241e+03 1.1229877249520346e+03 + 2.3677138597920134e+03 3.0801994317052795e+03 1.2727836669117719e+03 -1.5387982333122163e+03 -1.0906434577120353e+03 1.1229697394381967e+03 init_forces: ! |2 - 1 2.9634051452159092e+01 -5.6267761875030658e+02 -1.6668253255975264e+02 - 2 -1.5938437728854763e+02 -2.2076601831952277e+02 -1.7161994484506349e+02 - 3 -3.1194106231120934e+01 -3.0591930644164984e+02 4.4652570958886855e+01 - 4 4.4646653320086006e+02 1.7080811286682768e+02 1.7439026170464757e+02 - 5 -1.1512606621586120e+02 7.9716954463543715e+01 1.7959700550169842e+01 - 6 -7.1695199301551634e+02 4.0749156821010061e+01 2.1512037025864390e+02 - 7 2.3022543693157868e+02 -9.0170756873660693e+01 8.2190170006827103e+01 - 8 -2.1141251466323027e+01 -1.5635879347049067e+02 1.6101907187949953e+02 - 9 -1.2130842270575529e+02 -2.7960689135673749e+02 -1.9629114850260629e+02 - 10 -3.7631710890081683e+02 3.4103240548842098e+02 -1.8166279141141010e+02 - 11 -1.6154553323830120e+02 1.5743068117734555e+02 3.5832389058238908e+02 - 12 6.1602989065533677e+02 -1.4821564423137232e+02 1.0871005319359449e+02 - 13 -2.1366561068611992e+02 -3.0163595494862591e+02 5.2420406156009221e+02 - 14 2.5933950255870195e+02 -1.7967300062480934e+01 -2.7733367021033393e+02 - 15 1.7570537661851756e+02 1.7550639099552842e+02 -9.5789475936401502e+01 - 16 3.0588529285446674e+02 -4.7675556549182751e+01 -3.4330544488853229e+02 - 17 -1.5018545342641502e+02 1.3259542010622835e+02 2.3200545258695152e+02 - 18 1.6469564396901859e+02 -1.0816413254504512e+02 2.1207485840072781e+02 - 19 2.4759285902953567e+02 -4.8758383780475292e+01 -2.2494100786652814e+02 - 20 1.2418785577595527e+02 2.5137242577522335e+02 -1.5341186115707405e+01 - 21 -1.9556210564940739e+02 2.3152590535605817e+01 -1.2529729601983919e+02 - 22 2.4829386068621537e+02 -2.9828789153725000e+02 -4.0455445433034242e+01 - 23 8.2076007650246268e+01 1.3042103437660427e+02 1.5221389911908562e+02 - 24 -7.6912973583004117e+01 2.3539925428997182e+02 -1.7129603802759658e+02 - 25 -2.9782413878288601e+01 -1.8931910469290884e+02 6.7989202537834629e+01 - 26 -3.9488494691858733e+01 2.1025614474841166e+00 -2.0748963060927093e+02 - 27 -2.7704110443954568e+02 5.3736974078111837e+02 4.2318884882982655e+02 - 28 -2.9303219943086964e+02 -5.1154115419315801e+01 -2.3633993403319352e+02 - 29 1.2970484011863229e+02 -4.2266229540891523e+01 1.6350076615001245e+02 - 30 5.6925606430450244e+01 3.7880191852738363e+01 6.8636397133393515e+01 - 31 -1.9325596697344542e+02 -1.1645368911552394e+02 -2.0671692761029085e+01 - 32 1.2360965200003356e+02 -3.3253411369799544e+01 -1.0516118459008628e+02 - 33 6.5241847803264264e+01 3.7105112939426823e+02 6.0972558235487462e+01 - 34 -2.3124259597670152e+02 -1.1681740329837199e+02 -2.5838262648349195e+02 - 35 -4.1912226107435538e+02 7.9942920270919515e+01 3.1021023518178822e+02 - 36 -1.8561789047275289e+02 -1.1563628711158724e+02 -4.2360172436739234e+01 - 37 8.8271496723997984e+00 -3.5266450940740185e+02 -6.0505384072464253e+01 - 38 -1.9249505149150679e+01 1.1716319600328805e+02 -2.3477222840192979e+02 - 39 -1.0433878247256505e+01 -7.0902801856124668e+01 1.4264113912371403e+02 - 40 3.3265570779159901e+02 -8.8675933035708010e+02 1.6250845779831312e+01 - 41 -6.4537349815542413e+01 1.5189506353207591e+02 -1.8225353662815957e+02 - 42 2.3368723487133941e+01 1.1821526859991214e+02 4.1207323013177859e+02 - 43 -3.5145546474481449e+01 -3.6511647370571314e+00 2.4936793079195368e+02 - 44 -1.2881828259629406e+00 -2.4877240180809443e+02 7.9235766494652268e+01 - 45 2.0871504532583336e+02 -1.0817588901332421e+02 -4.1291808327418767e+02 - 46 -1.3837716960724282e+02 4.6114279241771982e+02 -2.4013801845132105e+02 - 47 1.3255320792807126e+02 2.8747276038957534e+02 -3.2896384987639095e+01 - 48 7.8145138718960652e+02 6.5215432481087248e+01 -6.2304789958695994e+02 - 49 2.4486314507349098e+02 1.9101300126648027e+01 3.7417037047533785e+02 - 50 2.9821275118609668e+02 3.0684252095011033e+02 5.6994896759607411e+02 - 51 -8.0052405736428466e+02 5.1024940640343124e+02 7.5829315450302556e+02 - 52 -9.2130898885920971e+01 1.1909837120722435e+02 -2.4118832391136704e+02 - 53 -3.6386926333492499e+02 -2.0729203700042348e+02 -3.4910517647674493e+02 - 54 -8.3399710534859324e+01 1.8942260327527066e+02 -1.2868598438441273e+02 - 55 -2.5305956575882524e+02 -1.1005916187119085e+02 -3.0893514828401271e+02 - 56 1.7364614503186098e+02 -2.5754370913466397e+02 -4.3744509948530059e+01 - 57 4.2667925201490533e+02 1.5529221173801471e+02 -3.9988499000695890e+02 - 58 -3.9656744140931579e+01 7.8953243693622596e+01 2.6135299122214326e+02 - 59 -2.7594240444747766e+02 1.9891763338576968e+02 2.4122500794444767e+02 - 60 -2.5675904361267118e+02 -1.1527171320999500e+02 9.9923550442604068e+01 - 61 3.0884427580032076e+02 4.9986415802554944e+02 -1.3369122169845875e+02 - 62 2.8530106503430972e+01 5.9540697567549117e-01 -2.7403025931165831e+02 - 63 2.5297054006405324e+02 -2.7640485799390927e+02 -1.9200503841891754e+02 - 64 -8.4680445259235810e+01 -1.5737027404334836e+02 1.5637808719891763e+02 -run_vdwl: -4208.20960310156 -run_coul: -268.025834774416 + 1 2.9633286152714895e+01 -5.6268158870662865e+02 -1.6667929778658686e+02 + 2 -1.5938461587386283e+02 -2.2076632409584278e+02 -1.7162405040710766e+02 + 3 -3.1194767737908826e+01 -3.0592472349600524e+02 4.4651629891466243e+01 + 4 4.4646596256626185e+02 1.7080830170172359e+02 1.7439025633170678e+02 + 5 -1.1512522479897345e+02 7.9717596119857888e+01 1.7958911311542607e+01 + 6 -7.1695066631618761e+02 4.0748756065642638e+01 2.1511809762804484e+02 + 7 2.3022206076223796e+02 -9.0168647609670387e+01 8.2189129278766103e+01 + 8 -2.1137097290905352e+01 -1.5635843951502784e+02 1.6101855425514745e+02 + 9 -1.2130643966073812e+02 -2.7960290186509405e+02 -1.9629224425201704e+02 + 10 -3.7631894872912522e+02 3.4103357651251537e+02 -1.8166645213907478e+02 + 11 -1.6153902964754667e+02 1.5743241425267431e+02 3.5832306945377178e+02 + 12 6.1603732792700282e+02 -1.4821040465468917e+02 1.0870676706201488e+02 + 13 -2.1366851202213653e+02 -3.0163954126350092e+02 5.2420915627618558e+02 + 14 2.5933780612532126e+02 -1.7968461610614241e+01 -2.7733218830598901e+02 + 15 1.7570487907901011e+02 1.7550789799326304e+02 -9.5786451085155491e+01 + 16 3.0589204520776934e+02 -4.7676020729815768e+01 -3.4330483431656791e+02 + 17 -1.5018690887845338e+02 1.3259473313627657e+02 2.3200552664411475e+02 + 18 1.6469519167779183e+02 -1.0816250655621064e+02 2.1207543727392661e+02 + 19 2.4759344887399081e+02 -4.8758511247092088e+01 -2.2494130722447932e+02 + 20 1.2418791307460424e+02 2.5137179718270556e+02 -1.5340308025983461e+01 + 21 -1.9556242958992678e+02 2.3151160715888874e+01 -1.2529867634994399e+02 + 22 2.4829292770827422e+02 -2.9828612004289113e+02 -4.0454677881884024e+01 + 23 8.2077976837017900e+01 1.3041866298293627e+02 1.5221209316034532e+02 + 24 -7.6913783243387826e+01 2.3540203354364189e+02 -1.7129245933770727e+02 + 25 -2.9781744550605662e+01 -1.8931888070263267e+02 6.7990019857554202e+01 + 26 -3.9488424247767014e+01 2.0999360632613091e+00 -2.0748830164832864e+02 + 27 -2.7704383990910344e+02 5.3737323080507701e+02 4.2318830552299499e+02 + 28 -2.9302153625490882e+02 -5.1150243581343020e+01 -2.3633573764669612e+02 + 29 1.2970603958450926e+02 -4.2262332230398229e+01 1.6349790455526482e+02 + 30 5.6924470622841902e+01 3.7878571490062619e+01 6.8637961971110911e+01 + 31 -1.9325586894804644e+02 -1.1645468493273863e+02 -2.0673145110109189e+01 + 32 1.2359537270071175e+02 -3.3261682729471509e+01 -1.0517081413370242e+02 + 33 6.5244494839342053e+01 3.7105575675452133e+02 6.0972008518320628e+01 + 34 -2.3124412393972406e+02 -1.1681894708374426e+02 -2.5838515661900914e+02 + 35 -4.1912097866037749e+02 7.9940298322579153e+01 3.1020906752098472e+02 + 36 -1.8561756690805518e+02 -1.1563749469376307e+02 -4.2356131544286932e+01 + 37 8.8268459557867800e+00 -3.5266202517998272e+02 -6.0508589419221380e+01 + 38 -1.9251065954670622e+01 1.1716443799821707e+02 -2.3476787650314483e+02 + 39 -1.0434207876793304e+01 -7.0902825597879200e+01 1.4264102290267166e+02 + 40 3.3265415672808695e+02 -8.8676314506220365e+02 1.6250323289221797e+01 + 41 -6.4525340969477625e+01 1.5190482993381195e+02 -1.8226363836162227e+02 + 42 2.3374265976474046e+01 1.1820849928255014e+02 4.1205919897871769e+02 + 43 -3.5145427442179937e+01 -3.6494054739761985e+00 2.4936139875273903e+02 + 44 -1.2909580317707088e+00 -2.4878033872407525e+02 7.9235212511230884e+01 + 45 2.0871432412721612e+02 -1.0816380085646371e+02 -4.1290534066227440e+02 + 46 -1.3837993836409981e+02 4.6113983127416537e+02 -2.4014147975943226e+02 + 47 1.3255343208840517e+02 2.8747648851097466e+02 -3.2895641248751062e+01 + 48 7.8145151343613895e+02 6.5212246673697649e+01 -6.2304415905848475e+02 + 49 2.4486207561858652e+02 1.9098760054137188e+01 3.7416718126982084e+02 + 50 2.9821250019803648e+02 3.0684285856103526e+02 5.6995325423529778e+02 + 51 -8.0052512629134719e+02 5.1024666433916468e+02 7.5828839863942687e+02 + 52 -9.2132795322260193e+01 1.1909938868988401e+02 -2.4119177446813089e+02 + 53 -3.6386508146804226e+02 -2.0728774423637225e+02 -3.4909372895932455e+02 + 54 -8.3400478462696412e+01 1.8942847373883873e+02 -1.2868846530013360e+02 + 55 -2.5306030895087017e+02 -1.1005903030773361e+02 -3.0893490115268742e+02 + 56 1.7363066404655606e+02 -2.5755159082633384e+02 -4.3732393367297526e+01 + 57 4.2667868235664599e+02 1.5529168633998034e+02 -3.9988358463751354e+02 + 58 -3.9654228870269598e+01 7.8950867015507271e+01 2.6135841350205141e+02 + 59 -2.7594567334153987e+02 1.9892282891821415e+02 2.4123100379637927e+02 + 60 -2.5675971154579702e+02 -1.1527142348407712e+02 9.9923841074681320e+01 + 61 3.0884909844566982e+02 4.9986511818576071e+02 -1.3369330200973721e+02 + 62 2.8529506416321446e+01 5.9000054110319344e-01 -2.7402724976042202e+02 + 63 2.5296716267913251e+02 -2.7640609445310349e+02 -1.9200849927940413e+02 + 64 -8.4682581712903087e+01 -1.5737182215029318e+02 1.5637971229670848e+02 +run_vdwl: -4208.209603101568 +run_coul: -268.02581602182215 run_stress: ! |2- - 2.3675903993358406e+03 3.0802227297812642e+03 1.2727311522665882e+03 -1.5388669378280856e+03 -1.0907269208274088e+03 1.1229243202747448e+03 + 2.3675915915115038e+03 3.0802240114846613e+03 1.2727324747502155e+03 -1.5388667254325053e+03 -1.0907269430167464e+03 1.1229240366702902e+03 run_forces: ! |2 - 1 2.9635294281436092e+01 -5.6267712552700186e+02 -1.6667999923843206e+02 - 2 -1.5938673400140527e+02 -2.2076536449677653e+02 -1.7162354129440891e+02 - 3 -3.1189858281210785e+01 -3.0593580065887033e+02 4.4645958607345577e+01 - 4 4.4646581891377559e+02 1.7080959763779822e+02 1.7439093938229493e+02 - 5 -1.1512839796352765e+02 7.9717058687958001e+01 1.7957487669481100e+01 - 6 -7.1695602565953550e+02 4.0752829698478386e+01 2.1512533839223761e+02 - 7 2.3022644486507866e+02 -9.0168915600464501e+01 8.2194655874286369e+01 - 8 -2.1149264848910175e+01 -1.5637111051646082e+02 1.6102981315503155e+02 - 9 -1.2130987756625950e+02 -2.7961363383960696e+02 -1.9628960069621482e+02 - 10 -3.7631817089739258e+02 3.4103259385919483e+02 -1.8166532788364435e+02 - 11 -1.6154687915100456e+02 1.5742797820605873e+02 3.5832199951133140e+02 - 12 6.1603841944552107e+02 -1.4820397700260011e+02 1.0871524086045234e+02 - 13 -2.1367529106982624e+02 -3.0167446795645282e+02 5.2424091634214585e+02 - 14 2.5933827511245227e+02 -1.7968203382107991e+01 -2.7733114072560983e+02 - 15 1.7570793004227912e+02 1.7551005525189765e+02 -9.5784231788957229e+01 - 16 3.0586985592964720e+02 -4.7679566106090903e+01 -3.4332192731516005e+02 - 17 -1.5018636472319054e+02 1.3259146324636768e+02 2.3200578297682745e+02 - 18 1.6469881174797919e+02 -1.0816836176970681e+02 2.1207670716671672e+02 - 19 2.4759420520521982e+02 -4.8758383157848726e+01 -2.2494116682891169e+02 - 20 1.2419960666459312e+02 2.5137933265677643e+02 -1.5328241144786812e+01 - 21 -1.9556094492813440e+02 2.3151723981859487e+01 -1.2529581330695682e+02 - 22 2.4829941584472434e+02 -2.9829345245026002e+02 -4.0446702084680311e+01 - 23 8.2074458696897636e+01 1.3042100306278206e+02 1.5221371881645402e+02 - 24 -7.6917668833393961e+01 2.3540360228741474e+02 -1.7130192995348895e+02 - 25 -2.9742104523748988e+01 -1.8935699467866542e+02 6.7995874219778344e+01 - 26 -3.9494943772414118e+01 2.1074054700131106e+00 -2.0748981609909322e+02 - 27 -2.7704003655188802e+02 5.3736954143358219e+02 4.2318574013795291e+02 - 28 -2.9302855291141344e+02 -5.1149666119061756e+01 -2.3633679976969094e+02 - 29 1.2970505460316522e+02 -4.2266433901186595e+01 1.6349685185829642e+02 - 30 5.6925896868100061e+01 3.7880918758124416e+01 6.8637128510118643e+01 - 31 -1.9325534294267334e+02 -1.1645328076630720e+02 -2.0671892621504433e+01 - 32 1.2360198063047470e+02 -3.3253019999994883e+01 -1.0516936549572080e+02 - 33 6.5239383936127538e+01 3.7104662858441014e+02 6.0974455303813109e+01 - 34 -2.3124084085048867e+02 -1.1681523003062699e+02 -2.5837805461659735e+02 - 35 -4.1912113383003572e+02 7.9943750613190943e+01 3.1020725803699969e+02 - 36 -1.8561422052416717e+02 -1.1563434085907485e+02 -4.2360108129760114e+01 - 37 8.8275421439853545e+00 -3.5266971563414063e+02 -6.0507541452884695e+01 - 38 -1.9245036832008864e+01 1.1717726898956253e+02 -2.3478417248390394e+02 - 39 -1.0434224692455489e+01 -7.0902644440221152e+01 1.4263978421851866e+02 - 40 3.3271177801104579e+02 -8.8679293552758975e+02 1.6219742097522396e+01 - 41 -6.4538764985979284e+01 1.5189397693612446e+02 -1.8225441696827028e+02 - 42 2.3368235855950271e+01 1.1822246665265955e+02 4.1207745038608465e+02 - 43 -3.5145643416957128e+01 -3.6517162539675607e+00 2.4936784353003958e+02 - 44 -1.2879745401173426e+00 -2.4877345145177651e+02 7.9236449970532846e+01 - 45 2.0871643412343590e+02 -1.0817571271652029e+02 -4.1291831345583290e+02 - 46 -1.3836372705500636e+02 4.6117938292216792e+02 -2.4016736526257426e+02 - 47 1.3255125611053478e+02 2.8747591615862939e+02 -3.2895660248580036e+01 - 48 7.8145417759941688e+02 6.5214930060474302e+01 -6.2304930828901490e+02 - 49 2.4488281403350587e+02 1.9105496615734893e+01 3.7418605144315814e+02 - 50 2.9822129513623162e+02 3.0683153982649424e+02 5.6994490418787450e+02 - 51 -8.0058572063723739e+02 5.1028617285810617e+02 7.5832431569053767e+02 - 52 -9.2137024513584748e+01 1.1910687193191870e+02 -2.4119120858089093e+02 - 53 -3.6387082584370717e+02 -2.0729771077034724e+02 -3.4910499737703145e+02 - 54 -8.3401322475858819e+01 1.8942466656608883e+02 -1.2869045777950635e+02 - 55 -2.5309678413623661e+02 -1.1001947899860551e+02 -3.0896372370111590e+02 - 56 1.7364604573970860e+02 -2.5754429115057047e+02 -4.3743962049926409e+01 - 57 4.2666362581830975e+02 1.5528157995548534e+02 -3.9988032807883297e+02 - 58 -3.9656744873436978e+01 7.8953170998895359e+01 2.6135222052438655e+02 - 59 -2.7594581611220792e+02 1.9891770704106938e+02 2.4122933700028292e+02 - 60 -2.5675992319674720e+02 -1.1527235824442458e+02 9.9923831048598458e+01 - 61 3.0884428120727830e+02 4.9986711220603212e+02 -1.3369013376809971e+02 - 62 2.8530678742782751e+01 5.9283151666778267e-01 -2.7403002505086550e+02 - 63 2.5296775626792288e+02 -2.7640525289650611e+02 -1.9200401038421046e+02 - 64 -8.4674586435418931e+01 -1.5736397776818120e+02 1.5637348700606000e+02 + 1 2.9635340083051346e+01 -5.6267710249795869e+02 -1.6667998370665143e+02 + 2 -1.5938666826920343e+02 -2.2076534189863366e+02 -1.7162354109212984e+02 + 3 -3.1189870810301095e+01 -3.0593571985047180e+02 4.4645956923836664e+01 + 4 4.4646581130069950e+02 1.7080959759402148e+02 1.7439093558473147e+02 + 5 -1.1512840430317976e+02 7.9717053594844629e+01 1.7957493384932661e+01 + 6 -7.1695600898242708e+02 4.0752809200821034e+01 2.1512530796739239e+02 + 7 2.3022648522685608e+02 -9.0168938352327743e+01 8.2194670669568964e+01 + 8 -2.1149215429861702e+01 -1.5637110513857075e+02 1.6102981761092099e+02 + 9 -1.2130987184908217e+02 -2.7961359052794438e+02 -1.9628960657192528e+02 + 10 -3.7631820453396847e+02 3.4103263667614613e+02 -1.8166531833456517e+02 + 11 -1.6154688755051467e+02 1.5742797323066301e+02 3.5832199781281412e+02 + 12 6.1603846554302856e+02 -1.4820394873283382e+02 1.0871523277525925e+02 + 13 -2.1367534498311514e+02 -3.0167456097439617e+02 5.2424088341628442e+02 + 14 2.5933832701218608e+02 -1.7968192701718916e+01 -2.7733108167843062e+02 + 15 1.7570795092251277e+02 1.7551000310384359e+02 -9.5784222372814824e+01 + 16 3.0586981469801617e+02 -4.7679565967035259e+01 -3.4332195262424483e+02 + 17 -1.5018632687377072e+02 1.3259144780414934e+02 2.3200578527117301e+02 + 18 1.6469880313326215e+02 -1.0816831870102239e+02 2.1207667736516382e+02 + 19 2.4759420024003853e+02 -4.8758379338079727e+01 -2.2494116275048481e+02 + 20 1.2419960129665635e+02 2.5137932270320678e+02 -1.5328240053348356e+01 + 21 -1.9556094383241299e+02 2.3151696381601958e+01 -1.2529580363737537e+02 + 22 2.4829940463520313e+02 -2.9829343297891006e+02 -4.0446694405761576e+01 + 23 8.2074486469597687e+01 1.3042095796913281e+02 1.5221366791874641e+02 + 24 -7.6917692833702446e+01 2.3540351711765027e+02 -1.7130196247252570e+02 + 25 -2.9742100996765380e+01 -1.8935699491160051e+02 6.7995875362048835e+01 + 26 -3.9494945036515908e+01 2.1074087479630634e+00 -2.0748976668424677e+02 + 27 -2.7704005979662662e+02 5.3736953816242783e+02 4.2318569074160462e+02 + 28 -2.9302860300138957e+02 -5.1149672303866737e+01 -2.3633681317128332e+02 + 29 1.2970506005124116e+02 -4.2266505241952196e+01 1.6349682642247129e+02 + 30 5.6925895652797955e+01 3.7880903611520054e+01 6.8637138210808786e+01 + 31 -1.9325535402701956e+02 -1.1645328207806656e+02 -2.0671892295502396e+01 + 32 1.2360206049549920e+02 -3.3252985301196659e+01 -1.0516931870918121e+02 + 33 6.5239430456833531e+01 3.7104671672305966e+02 6.0974424435615809e+01 + 34 -2.3124086955801889e+02 -1.1681533354856286e+02 -2.5837807428177962e+02 + 35 -4.1912107298361212e+02 7.9943751193797880e+01 3.1020726776656619e+02 + 36 -1.8561413355995509e+02 -1.1563427104741439e+02 -4.2360264054660597e+01 + 37 8.8273599678770864e+00 -3.5266981598144150e+02 -6.0507477320620680e+01 + 38 -1.9245038012709841e+01 1.1717725521030376e+02 -2.3478404802363110e+02 + 39 -1.0434215698836438e+01 -7.0902647384814358e+01 1.4263978849003041e+02 + 40 3.3271178359289979e+02 -8.8679283858336646e+02 1.6219768658650871e+01 + 41 -6.4538810609188275e+01 1.5189398379892381e+02 -1.8225442798722727e+02 + 42 2.3368203862303545e+01 1.1822249156204117e+02 4.1207761014771074e+02 + 43 -3.5145614670828280e+01 -3.6517750326814120e+00 2.4936780076604907e+02 + 44 -1.2879422574017376e+00 -2.4877334082189225e+02 7.9236450933542571e+01 + 45 2.0871640299070592e+02 -1.0817582150128533e+02 -4.1291845938329635e+02 + 46 -1.3836372708562709e+02 4.6117937798867194e+02 -2.4016736146584793e+02 + 47 1.3255127160214204e+02 2.8747595545221196e+02 -3.2895652028052091e+01 + 48 7.8145389054767179e+02 6.5214945379088277e+01 -6.2304920777042912e+02 + 49 2.4488291106236500e+02 1.9105409364926288e+01 3.7418589758696908e+02 + 50 2.9822130989912665e+02 3.0683153011979800e+02 5.6994487035095165e+02 + 51 -8.0058521183025380e+02 5.1028581602653651e+02 7.5832461768047244e+02 + 52 -9.2137019037691147e+01 1.1910697318842861e+02 -2.4119128768698766e+02 + 53 -3.6387123110982282e+02 -2.0729720964342076e+02 -3.4910519380830556e+02 + 54 -8.3401332800193543e+01 1.8942464275359734e+02 -1.2869043354758486e+02 + 55 -2.5309678157873975e+02 -1.1001947468656527e+02 -3.0896372177857239e+02 + 56 1.7364608133921760e+02 -2.5754423801373565e+02 -4.3743927978158730e+01 + 57 4.2666357128098645e+02 1.5528157162856127e+02 -3.9988029715399989e+02 + 58 -3.9656756118817448e+01 7.8953165237690285e+01 2.6135222125861111e+02 + 59 -2.7594578242635424e+02 1.9891765773401318e+02 2.4122928728349606e+02 + 60 -2.5675991915252069e+02 -1.1527235180653685e+02 9.9923833769027368e+01 + 61 3.0884427542809721e+02 4.9986710924069786e+02 -1.3369013404232507e+02 + 62 2.8530654477154116e+01 5.9282210053495610e-01 -2.7403003802560033e+02 + 63 2.5296776535482985e+02 -2.7640523185325759e+02 -1.9200396674401188e+02 + 64 -8.4674657022429557e+01 -1.5736405319931387e+02 1.5637353707611086e+02 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index 567bddf5ce..b24f60dc62 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -1,7 +1,8 @@ --- -lammps_version: 10 Feb 2021 -date_generated: Fri Feb 26 23:09:06 2021 +lammps_version: 8 Apr 2021 +date_generated: Mon Apr 19 09:21:17 2021 epsilon: 2e-10 +skip_tests: prerequisites: ! | pair reax/c fix qeq/reax @@ -24,149 +25,149 @@ pre_commands: ! | set type 2 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-12 reax/c + fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c maxiter 20 nowarn input_file: in.empty pair_style: reax/c NULL checkqeq yes lgvdw yes safezone 1.6 pair_coeff: ! | * * ffield.reax.lg C O extract: ! "" natoms: 64 -init_vdwl: -3780.05455778888 -init_coul: -279.915673357255 +init_vdwl: -3780.0545577888824 +init_coul: -279.9157988760615 init_stress: ! |2- - 3.6448951295886809e+03 3.7339747706707872e+03 3.9381618834038791e+03 -8.8619786783545931e+02 2.5350870087071300e+02 -5.2815321737906061e+02 + 3.6448931383720665e+03 3.7339659142876435e+03 3.9381659849081570e+03 -8.8620105504582875e+02 2.5350490498306664e+02 -5.2816569317142807e+02 init_forces: ! |2 - 1 -1.4572029645683264e+02 -2.2140279106291507e+02 -1.4808209307797372e+02 - 2 -1.7648559093934148e+02 -1.0146253457806542e+02 -1.7990394625657274e+01 - 3 -2.0615681734642330e+01 -4.0343795757803508e+02 -3.8603528931018054e+01 - 4 2.6614805335034998e+02 4.0003808276416684e+01 1.4690013778960667e+02 - 5 9.7835379063416177e+00 4.3883349405662791e+01 4.9796878717762787e+01 - 6 -2.6938292077229727e+02 3.3510334278335421e+00 2.2965715764113384e+02 - 7 3.2574907048037380e+02 -1.7976941537341810e+02 2.2179461677416583e+02 - 8 9.9964451146865471e+01 -2.8685082304987185e+02 1.4158552983794476e+02 - 9 1.6434754325282601e+01 -1.9355787416131696e+02 -9.4334270045756043e+01 - 10 -2.0854046881408067e+02 1.0026332198593936e+02 -1.5021108992594620e+02 - 11 -2.0573869228583661e+02 2.7604115414799344e+02 5.5777178022191936e+02 - 12 5.0287983468578147e+02 -6.0967301596834591e+02 3.9376960681073700e+02 - 13 -9.1248851272055674e+01 3.5482322889104140e+01 7.9771590707710800e+01 - 14 1.1722782444599024e+02 7.0786340536242163e+00 -1.1012937857655862e+02 - 15 2.0459798791677210e+02 1.1350278391711655e+01 -6.9643830810411416e+01 - 16 6.4801734481789666e+01 2.7717249468796996e+02 9.6968479199374073e+01 - 17 -1.1757359629210440e+02 7.5596700050451688e+01 8.2370289516995197e+00 - 18 1.4980090631536169e+02 4.6438235985629220e+01 1.9074239639237979e+02 - 19 9.9231823331994249e+01 -3.4161546701845765e+01 -9.3483634123621087e+01 - 20 3.4394881232874110e+02 1.8755825664166662e+02 1.8392127409682581e+02 - 21 -1.7639610172391272e+02 5.9887963695524753e+01 2.3192666899298981e+01 - 22 3.5943370198457734e+02 -4.9707358210204012e+02 2.0606470760846634e+02 - 23 1.7581454592506283e+01 2.1298589011272401e+02 1.9485076353331874e+02 - 24 -1.8644255768132263e+02 2.0152190140053236e+02 -1.5033309490489984e+02 - 25 6.6423577752363499e+01 -2.6628307450649118e+02 6.5041785228006987e+01 - 26 -2.9537785779457244e+02 1.8889631581804576e+02 8.6386764001190215e+01 - 27 1.0405918844455742e+02 -2.5941844595001200e+00 -6.3479328226780297e+01 - 28 -1.7940076477784703e+02 -1.9073773001560042e+02 -1.6921173789426470e+02 - 29 2.8517719341938289e+02 -9.8606325860704928e+01 -1.5865623093424992e+02 - 30 3.3012242903480393e-01 9.9396498728799443e+01 3.2850839694515677e+00 - 31 -1.8086381055199379e+00 -5.1096382098849077e+01 6.0017778789149006e+00 - 32 3.1529080422017097e+02 -1.2793618573898891e+02 -2.4176655958597905e+02 - 33 -5.4059845316529982e+00 1.7567793716993873e+02 -1.1807703472018468e+02 - 34 -1.9400422792080016e+02 -1.0951834015498645e+02 -1.5439493063315896e+02 - 35 -1.9195028872533084e+02 -1.2771069506738369e+01 1.3164511899864968e+02 - 36 2.1450496684040476e+02 4.8524211958783019e+02 -2.2938069671779124e+02 - 37 -3.3553470604466861e+02 -4.9645835564195778e+02 2.1990191695195585e+02 - 38 -3.2544634716452649e+01 2.4953051954442103e+01 -1.5693055302887637e+02 - 39 -1.5399380031833186e+01 2.3903552655945369e+01 9.6153869485537527e+01 - 40 -6.4358524883048119e+01 1.7841114478565163e+02 1.6199309566416363e+02 - 41 -2.4659875162869224e+02 2.3085714222291421e+02 -2.9640003056844074e+02 - 42 -2.9451816756430145e+02 4.3373137951523881e+02 4.3706447002809585e+02 - 43 1.3265813359025546e+02 -2.9267792386382844e+01 2.3063687596593061e+02 - 44 1.0054916914535585e+02 -2.0011423542533092e+02 1.1673423852526635e+02 - 45 1.5191419311763582e+02 -3.3909681846522182e+02 -6.8137727102148324e+02 - 46 -3.6974683734054048e+02 6.5878375129662163e+02 -1.2846618277461354e+02 - 47 7.0999436005486899e+01 2.6787204282530024e+02 -2.6037631699380153e+01 - 48 4.8459114652542161e+02 -1.6692984322713417e+02 -3.2654222496284581e+02 - 49 1.0015069521843192e+02 1.7138648274496632e+01 1.2769578723947120e+02 - 50 -2.5642349862470508e+02 4.8550182268850142e+02 1.7833824453195746e+02 - 51 1.5929454215699664e+03 -1.5099874513231559e+03 1.3757379604584460e+03 - 52 -3.9361841716365302e+02 2.9260629050190221e+02 -2.7081695001177656e+02 - 53 -1.2156822810124922e+03 1.0481194207223216e+03 -1.7260439380729260e+03 - 54 5.4550048561223889e+01 1.0309107570306772e+02 -6.1755737140629734e+01 - 55 -2.0237966584139775e+02 1.8109638545320627e+02 -4.9049185930881845e+02 - 56 2.0035852288703015e+02 -1.8905601495144680e+02 -1.3674988378339864e+02 - 57 -1.7850181832398803e+02 -3.3738128559238868e+02 -1.4864548151794997e+02 - 58 -2.5672973403862750e+02 -1.3337752501158548e+02 8.4361840521538781e+01 - 59 -1.7898419258529674e+02 1.8142061294130923e+02 2.7914590931082478e+02 - 60 -7.4397281468755821e+01 -6.8191313100547362e+01 5.7945873657168903e+01 - 61 9.6097455977519928e+01 4.4560160451051973e+02 5.3539867605744419e+01 - 62 3.3100209418397625e+01 1.3292271559420541e+02 -3.6118667405609742e+01 - 63 -2.5659895412732226e+01 -3.1619326785330378e+02 5.0013180663156710e+01 - 64 2.5886074093968855e+01 -6.0852122206871925e+01 7.5059691631914314e+00 -run_vdwl: -3780.05347390992 -run_coul: -279.915602843914 + 1 -1.4572091886023205e+02 -2.2140554853210335e+02 -1.4808089621820409e+02 + 2 -1.7648676367493852e+02 -1.0146318760917033e+02 -1.7992199180511228e+01 + 3 -2.0615863857279255e+01 -4.0344141093113177e+02 -3.8603948937580682e+01 + 4 2.6614837240037974e+02 4.0003929778899199e+01 1.4690018353209234e+02 + 5 9.7844364238111634e+00 4.3884264292874640e+01 4.9796276452188778e+01 + 6 -2.6938167754794108e+02 3.3502567046531411e+00 2.2965489848185831e+02 + 7 3.2574749906033628e+02 -1.7976901688562575e+02 2.2179384812686754e+02 + 8 9.9963664597069211e+01 -2.8685055064461562e+02 1.4158554323500957e+02 + 9 1.6434737377652411e+01 -1.9355784885649135e+02 -9.4333988453824674e+01 + 10 -2.0854160335689650e+02 1.0026489817881713e+02 -1.5021072248976765e+02 + 11 -2.0573434026899415e+02 2.7604212909913434e+02 5.5777133973549599e+02 + 12 5.0288346447168902e+02 -6.0966999599334633e+02 3.9376794144396729e+02 + 13 -9.1250837980014055e+01 3.5479126438212312e+01 7.9772485712987830e+01 + 14 1.1722657768580721e+02 7.0781215767454047e+00 -1.1012920740892103e+02 + 15 2.0459752525877119e+02 1.1351310328466946e+01 -6.9642718405081723e+01 + 16 6.4806165788586554e+01 2.7717257212730721e+02 9.6969385115315887e+01 + 17 -1.1757474559792530e+02 7.5596314208592773e+01 8.2371686135118694e+00 + 18 1.4980035999104621e+02 4.6438099206051213e+01 1.9074297138984858e+02 + 19 9.9234004591160854e+01 -3.4162209353811022e+01 -9.3484579137358054e+01 + 20 3.4394959503379101e+02 1.8755989482421211e+02 1.8392094734100132e+02 + 21 -1.7639663517067046e+02 5.9886792943355104e+01 2.3192630518286926e+01 + 22 3.5943350303372904e+02 -4.9707299042671059e+02 2.0606498955302629e+02 + 23 1.7582092751419758e+01 2.1298501938255976e+02 1.9485029772476997e+02 + 24 -1.8644089886656593e+02 2.0152439860030270e+02 -1.5033144599992980e+02 + 25 6.6423833906552588e+01 -2.6628287125895685e+02 6.5042482646519929e+01 + 26 -2.9537910718596163e+02 1.8889491141232935e+02 8.6384752113539022e+01 + 27 1.0405788965828641e+02 -2.5925449178566540e+00 -6.3480098517547759e+01 + 28 -1.7939608695369640e+02 -1.9073765779235862e+02 -1.6920914616960835e+02 + 29 2.8517744376210021e+02 -9.8603006038058396e+01 -1.5865567773918144e+02 + 30 3.2949780945743384e-01 9.9395901723688951e+01 3.2867025811830066e+00 + 31 -1.8081982094889877e+00 -5.1095979886608603e+01 6.0017226789971536e+00 + 32 3.1528485795048732e+02 -1.2793879136489154e+02 -2.4176923563635890e+02 + 33 -5.4047496313993761e+00 1.7567978501697323e+02 -1.1807749995154678e+02 + 34 -1.9400365443632006e+02 -1.0951910631961994e+02 -1.5439514659643123e+02 + 35 -1.9195164058841638e+02 -1.2771663795724534e+01 1.3164519528710119e+02 + 36 2.1450335760238607e+02 4.8524149100278362e+02 -2.2937661241075210e+02 + 37 -3.3553202602756068e+02 -4.9645660169968471e+02 2.1989946614447041e+02 + 38 -3.2545637693167187e+01 2.4953724757619213e+01 -1.5692994894863165e+02 + 39 -1.5399133308638410e+01 2.3903543199312750e+01 9.6153912587959454e+01 + 40 -6.4359455436231784e+01 1.7840898418733599e+02 1.6199268811537300e+02 + 41 -2.4659695132042634e+02 2.3085908053073328e+02 -2.9640112753929327e+02 + 42 -2.9451821900140999e+02 4.3373059300879572e+02 4.3706356205288336e+02 + 43 1.3266010178695632e+02 -2.9267135032181088e+01 2.3063316835486089e+02 + 44 1.0054895163178887e+02 -2.0011754287270674e+02 1.1673372624795425e+02 + 45 1.5191525332856557e+02 -3.3909441520578207e+02 -6.8137683597574699e+02 + 46 -3.6974751746664356e+02 6.5878294118257850e+02 -1.2846738301725193e+02 + 47 7.0999626065694201e+01 2.6787348460906964e+02 -2.6037187103136354e+01 + 48 4.8458888753820582e+02 -1.6692979718938696e+02 -3.2654041125642522e+02 + 49 1.0015039714682548e+02 1.7137645197720190e+01 1.2769396347000726e+02 + 50 -2.5642342676546355e+02 4.8550218436953134e+02 1.7834042598268297e+02 + 51 1.5929472695008881e+03 -1.5099908240612401e+03 1.3757388145073317e+03 + 52 -3.9361969825076892e+02 2.9260735969130604e+02 -2.7081798065168311e+02 + 53 -1.2156829912640842e+03 1.0481229021396230e+03 -1.7260431178358995e+03 + 54 5.4550088623147516e+01 1.0309452579709432e+02 -6.1757701222598442e+01 + 55 -2.0238006702340041e+02 1.8109613688188938e+02 -4.9049119362596980e+02 + 56 2.0035548328443991e+02 -1.8905716639832801e+02 -1.3674890405161500e+02 + 57 -1.7850234090472205e+02 -3.3738119605793531e+02 -1.4864438401289951e+02 + 58 -2.5672838772121492e+02 -1.3337878903216912e+02 8.4365052514154812e+01 + 59 -1.7898423879701210e+02 1.8142157612585032e+02 2.7914729458451137e+02 + 60 -7.4397164149646969e+01 -6.8190924044876084e+01 5.7945904025898891e+01 + 61 9.6099033708008989e+01 4.4560187645463765e+02 5.3539291937468079e+01 + 62 3.3097868057397406e+01 1.3291944752881338e+02 -3.6118812725322506e+01 + 63 -2.5661745572767739e+01 -3.1619354530304156e+02 5.0012317415788416e+01 + 64 2.5884883063459124e+01 -6.0852905003457536e+01 7.5067609941699116e+00 +run_vdwl: -3780.0534739099153 +run_coul: -279.9156023968299 run_stress: ! |2- - 3.6449190860682643e+03 3.7339547135739058e+03 3.9381731084171565e+03 -8.8617648240339543e+02 2.5350122212091981e+02 -5.2818520710537973e+02 + 3.6449193028377299e+03 3.7339549167173282e+03 3.9381733557741995e+03 -8.8617642091921402e+02 2.5350119722836649e+02 -5.2818522888411621e+02 run_forces: ! |2 - 1 -1.4571798162167252e+02 -2.2140580848061688e+02 -1.4808148933254313e+02 - 2 -1.7648308397779235e+02 -1.0146477741996672e+02 -1.7988558948131221e+01 - 3 -2.0614227228633823e+01 -4.0344097417855238e+02 -3.8604729133131215e+01 - 4 2.6614888483484418e+02 4.0003234613562718e+01 1.4690057491500562e+02 - 5 9.7845353993210757e+00 4.3882567909729040e+01 4.9797207642045677e+01 - 6 -2.6938082734775594e+02 3.3524823444182630e+00 2.2965816523899235e+02 - 7 3.2575187542507791e+02 -1.7977227944937169e+02 2.2179960580675152e+02 - 8 9.9964011515726739e+01 -2.8685358089601482e+02 1.4158731106157231e+02 - 9 1.6438524923736644e+01 -1.9355302991489253e+02 -9.4334960672514242e+01 - 10 -2.0853805940018381e+02 1.0026019274304203e+02 -1.5021521543813694e+02 - 11 -2.0574133907407125e+02 2.7604371539616938e+02 5.5777225388303532e+02 - 12 5.0285711778760270e+02 -6.0968357929450372e+02 3.9377681166481295e+02 - 13 -9.1246236584998883e+01 3.5490065792296186e+01 7.9756754045764964e+01 - 14 1.1722762015217488e+02 7.0777587800518864e+00 -1.1012808747152181e+02 - 15 2.0459886374792103e+02 1.1352434902632419e+01 -6.9641008537041586e+01 - 16 6.4819488894277626e+01 2.7717767285477504e+02 9.6971206512117831e+01 - 17 -1.1757145373858191e+02 7.5598283763031333e+01 8.2344537953401620e+00 - 18 1.4979763484000514e+02 4.6437981230754680e+01 1.9074030927267040e+02 - 19 9.9232177039551743e+01 -3.4161491191063057e+01 -9.3482743694123911e+01 - 20 3.4394272911489560e+02 1.8755951153575882e+02 1.8391751542140381e+02 - 21 -1.7639675023083032e+02 5.9884188602876513e+01 2.3197830826168012e+01 - 22 3.5944608335498276e+02 -4.9708524898876021e+02 2.0607149093293810e+02 - 23 1.7579271068638736e+01 2.1298728097754687e+02 1.9485168054795750e+02 - 24 -1.8644003680983860e+02 2.0152727772546126e+02 -1.5032646302314092e+02 - 25 6.6427890225862839e+01 -2.6628950112809588e+02 6.5040867172812568e+01 - 26 -2.9538210986747896e+02 1.8889963664467763e+02 8.6392520853920516e+01 - 27 1.0405463527343457e+02 -2.5883797810836899e+00 -6.3473815684801785e+01 - 28 -1.7939102939145226e+02 -1.9072998240489997e+02 -1.6920314161246782e+02 - 29 2.8518125846098656e+02 -9.8610707014135585e+01 -1.5865904861816750e+02 - 30 3.2948855593638848e-01 9.9396107066086955e+01 3.2866521919189089e+00 - 31 -1.8093342589558659e+00 -5.1090324665848712e+01 5.9965783206663161e+00 - 32 3.1528757881180007e+02 -1.2794634397194349e+02 -2.4177668881260021e+02 - 33 -5.4083133243805372e+00 1.7567908978406618e+02 -1.1807415000724265e+02 - 34 -1.9400316636479977e+02 -1.0951814437454595e+02 -1.5439329543504013e+02 - 35 -1.9195026719711194e+02 -1.2774392196243292e+01 1.3164394415174289e+02 - 36 2.1450819558036866e+02 4.8524393939315888e+02 -2.2938259760791684e+02 - 37 -3.3553755452540895e+02 -4.9646067746196536e+02 2.1990265059231979e+02 - 38 -3.2545680671007766e+01 2.4954714465771517e+01 -1.5693304654702996e+02 - 39 -1.5400979972013733e+01 2.3902925031181187e+01 9.6154974338013474e+01 - 40 -6.4361324286781183e+01 1.7841294566727018e+02 1.6199313424706546e+02 - 41 -2.4660579832547052e+02 2.3084997378288404e+02 -2.9640187773211630e+02 - 42 -2.9452038269198692e+02 4.3373690323403952e+02 4.3706797334309402e+02 - 43 1.3265462163819998e+02 -2.9274830054471895e+01 2.3064015623266641e+02 - 44 1.0054965815688162e+02 -2.0011417092775127e+02 1.1673395109270328e+02 - 45 1.5191488778751707e+02 -3.3909986813212635e+02 -6.8138447286529720e+02 - 46 -3.6974585651662977e+02 6.5877949821504194e+02 -1.2846140462208882e+02 - 47 7.0999522650120099e+01 2.6787232844301741e+02 -2.6037434470741427e+01 - 48 4.8457875917949451e+02 -1.6693867974736796e+02 -3.2653088508349691e+02 - 49 1.0016330847216284e+02 1.7144939472474533e+01 1.2769410377207676e+02 - 50 -2.5643045293874383e+02 4.8550578070475757e+02 1.7833571905770887e+02 - 51 1.5929685733709441e+03 -1.5100179731534890e+03 1.3757557210338409e+03 - 52 -3.9363155553927618e+02 2.9261413115276798e+02 -2.7081680938457316e+02 - 53 -1.2156938822751686e+03 1.0481428026908065e+03 -1.7260661331518384e+03 - 54 5.4545508362448210e+01 1.0309421723440155e+02 -6.1761185913629610e+01 - 55 -2.0239005919386466e+02 1.8108787078448725e+02 -4.9048334046900078e+02 - 56 2.0036614412052225e+02 -1.8905881350356012e+02 -1.3675071587645911e+02 - 57 -1.7850227402751372e+02 -3.3738314148552627e+02 -1.4864701622354673e+02 - 58 -2.5670676029812597e+02 -1.3336092440092364e+02 8.4345104538588089e+01 - 59 -1.7898804840101980e+02 1.8142384187504891e+02 2.7914484812152023e+02 - 60 -7.4398955008919714e+01 -6.8191485113974892e+01 5.7946912127557717e+01 - 61 9.6097667682189197e+01 4.4562130970058109e+02 5.3555842003747642e+01 - 62 3.3087710298162186e+01 1.3291451685900134e+02 -3.6140086918051345e+01 - 63 -2.5660817878335301e+01 -3.1619388904758910e+02 5.0012563149825205e+01 - 64 2.5890372243019073e+01 -6.0849122994338025e+01 7.5030153780264586e+00 + 1 -1.4571796976977475e+02 -2.2140579635792884e+02 -1.4808149010447769e+02 + 2 -1.7648305954284041e+02 -1.0146476417236073e+02 -1.7988566053603591e+01 + 3 -2.0614225365740097e+01 -4.0344097227230094e+02 -3.8604731470054062e+01 + 4 2.6614888269720814e+02 4.0003233795014168e+01 1.4690057516187863e+02 + 5 9.7845378052670569e+00 4.3882570307523316e+01 4.9797206010047589e+01 + 6 -2.6938082908045919e+02 3.3524802199605972e+00 2.2965815951985147e+02 + 7 3.2575186725741395e+02 -1.7977227930984148e+02 2.2179960228952396e+02 + 8 9.9964020081557138e+01 -2.8685357554222099e+02 1.4158731522817112e+02 + 9 1.6438523377332476e+01 -1.9355303092496897e+02 -9.4334957020327948e+01 + 10 -2.0853806475972263e+02 1.0026021875703947e+02 -1.5021521105990161e+02 + 11 -2.0574136330802202e+02 2.7604370854540770e+02 5.5777225668964445e+02 + 12 5.0285717304860879e+02 -6.0968353881851192e+02 3.9377680529647569e+02 + 13 -9.1246272612282368e+01 3.5490016998948100e+01 7.9756749986805872e+01 + 14 1.1722763390616720e+02 7.0777572837063545e+00 -1.1012806750165767e+02 + 15 2.0459887112033201e+02 1.1352405359138412e+01 -6.9641010980711187e+01 + 16 6.4819489591627985e+01 2.7717767094468888e+02 9.6971198880055780e+01 + 17 -1.1757145471738642e+02 7.5598280349563737e+01 8.2344590524461072e+00 + 18 1.4979763975305985e+02 4.6437996441246753e+01 1.9074030452047762e+02 + 19 9.9232182958160649e+01 -3.4161493200256849e+01 -9.3482747032954819e+01 + 20 3.4394273190544487e+02 1.8755952354050976e+02 1.8391751060923613e+02 + 21 -1.7639675308717227e+02 5.9884172559678539e+01 2.3197838699496501e+01 + 22 3.5944608490729252e+02 -4.9708525361009697e+02 2.0607148872705903e+02 + 23 1.7579274952856146e+01 2.1298728055372681e+02 1.9485167236722779e+02 + 24 -1.8644004784533396e+02 2.0152728030974987e+02 -1.5032647044559059e+02 + 25 6.6427893699487285e+01 -2.6628950089076670e+02 6.5040872719333763e+01 + 26 -2.9538211829350598e+02 1.8889965241529200e+02 8.6392539131687670e+01 + 27 1.0405461403221605e+02 -2.5883825588235845e+00 -6.3473842387095296e+01 + 28 -1.7939104123925333e+02 -1.9072999063995681e+02 -1.6920313224146631e+02 + 29 2.8518126138643589e+02 -9.8610753428175371e+01 -1.5865905973294608e+02 + 30 3.2949044114559667e-01 9.9396106279740152e+01 3.2866487023715845e+00 + 31 -1.8093337117467343e+00 -5.1090328691324387e+01 5.9965849772505502e+00 + 32 3.1528763104400332e+02 -1.2794632256692650e+02 -2.4177666052802613e+02 + 33 -5.4083129170642179e+00 1.7567908715551988e+02 -1.1807415450387619e+02 + 34 -1.9400317396625167e+02 -1.0951816546456534e+02 -1.5439330137890337e+02 + 35 -1.9195026193065127e+02 -1.2774392319491161e+01 1.3164394629475399e+02 + 36 2.1450819729293397e+02 4.8524393495667874e+02 -2.2938261082652426e+02 + 37 -3.3553756825286939e+02 -4.9646067369623501e+02 2.1990265295677537e+02 + 38 -3.2545669240461962e+01 2.4954715957821520e+01 -1.5693302625922774e+02 + 39 -1.5400978707519485e+01 2.3902924956982389e+01 9.6154975229739549e+01 + 40 -6.4361322091921963e+01 1.7841296679824200e+02 1.6199313367381012e+02 + 41 -2.4660579311181596e+02 2.3084998025482201e+02 -2.9640187317945146e+02 + 42 -2.9452037865586266e+02 4.3373691264280740e+02 4.3706800713302425e+02 + 43 1.3265463914285502e+02 -2.9274831727547486e+01 2.3064014394569924e+02 + 44 1.0054966120054988e+02 -2.0011413451728055e+02 1.1673396063607694e+02 + 45 1.5191487332744026e+02 -3.3909989475298806e+02 -6.8138450042787269e+02 + 46 -3.6974586930852371e+02 6.5877947911188835e+02 -1.2846142437073112e+02 + 47 7.0999519258744826e+01 2.6787233536251233e+02 -2.6037425588932479e+01 + 48 4.8457871743082603e+02 -1.6693866918660342e+02 -3.2653088595197522e+02 + 49 1.0016334450403171e+02 1.7144926659081193e+01 1.2769410739667713e+02 + 50 -2.5643044716127639e+02 4.8550578281218662e+02 1.7833569703185714e+02 + 51 1.5929685800547243e+03 -1.5100179816024361e+03 1.3757557055371278e+03 + 52 -3.9363157215408233e+02 2.9261415024331393e+02 -2.7081681598776061e+02 + 53 -1.2156938934830002e+03 1.0481428177286084e+03 -1.7260661177369154e+03 + 54 5.4545512167986800e+01 1.0309421079214434e+02 -6.1761171483942455e+01 + 55 -2.0239006109115883e+02 1.8108786983188449e+02 -4.9048333730029168e+02 + 56 2.0036614371542044e+02 -1.8905881182672297e+02 -1.3675071296668057e+02 + 57 -1.7850229397871476e+02 -3.3738313920990021e+02 -1.4864700460708005e+02 + 58 -2.5670676044045717e+02 -1.3336092216373774e+02 8.4345105241459464e+01 + 59 -1.7898804526082839e+02 1.8142383013226376e+02 2.7914483449637197e+02 + 60 -7.4398952097636979e+01 -6.8191483730035287e+01 5.7946910740208871e+01 + 61 9.6097660916192893e+01 4.4562130692576051e+02 5.3555843428685527e+01 + 62 3.3087683040848127e+01 1.3291451189592027e+02 -3.6140107370205008e+01 + 63 -2.5660819680707732e+01 -3.1619389079817131e+02 5.0012586602224751e+01 + 64 2.5890370845876866e+01 -6.0849124899192077e+01 7.5030175856502677e+00 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index efdf3ff5de..54b66c5b71 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -1,7 +1,8 @@ --- -lammps_version: 10 Feb 2021 -date_generated: Fri Feb 26 23:09:08 2021 +lammps_version: 8 Apr 2021 +date_generated: Mon Apr 19 09:21:19 2021 epsilon: 5e-13 +skip_tests: prerequisites: ! | pair reax/c pre_commands: ! | @@ -29,18 +30,18 @@ pair_coeff: ! | * * ffield.reax.mattsson C C extract: ! "" natoms: 64 -init_vdwl: -8975.38106346063 -init_coul: 0.592852986871656 +init_vdwl: -8975.381063460629 +init_coul: 0.5928529868716559 init_stress: ! |- - -1.1526162173764681e+03 -4.6218014500723507e+02 3.1954383274884901e+02 -2.2197591028227616e+03 3.4480244373669785e+02 -1.2644452447488200e+03 + -1.1526162173764683e+03 -4.6218014500723461e+02 3.1954383274884901e+02 -2.2197591028227621e+03 3.4480244373669785e+02 -1.2644452447488200e+03 init_forces: ! |2 1 -2.0916057489019278e+02 -1.8819573882656792e+02 -2.2843342560290171e+02 2 -5.9711660034805291e+01 -1.3795294129596448e+02 -6.1450415050409106e+01 3 1.0924699545317881e+02 5.4683388561496884e+01 8.7122903226954129e+00 4 2.2394129214932286e+02 -1.2607110719575815e+02 5.6116628706921283e+01 5 2.1339173392425103e+01 2.3982132147793212e+02 -1.1311227256425612e+02 - 6 -2.3465218593173694e+02 8.7997863600775148e+01 7.1405034243397978e+01 - 7 1.7783507933620086e+02 3.8498185748852222e+01 -2.7669272643606155e+02 + 6 -2.3465218593173694e+02 8.7997863600775204e+01 7.1405034243397978e+01 + 7 1.7783507933620086e+02 3.8498185748852194e+01 -2.7669272643606155e+02 8 -2.1014288646597468e+01 -4.0711968506334620e+02 1.5140757706928005e+02 9 -5.9307137188585735e+01 2.6264734812019469e+02 1.7442573676385443e+01 10 -8.4525778086876372e+01 1.5450140994331881e+02 6.0015146335720981e+00 @@ -59,7 +60,7 @@ init_forces: ! |2 23 -1.0142123148353758e+02 2.3316671624708323e+02 2.3905950409694179e+02 24 4.1563056415358169e+01 -1.2911164666848796e+01 -3.1668646816892700e+01 25 2.1166667371090460e+02 -2.0418293867725825e+02 -3.1232107629433731e+01 - 26 -2.6320989589682608e+02 1.2065128452552987e+02 2.6277305997802796e+02 + 26 -2.6320989589682614e+02 1.2065128452552987e+02 2.6277305997802796e+02 27 -7.4498892273813865e+01 1.0778676260209129e+02 1.6095170163345196e+02 28 -2.4911277843488330e+02 -9.8499434443852323e+01 2.2239731087969662e+02 29 4.5655943120047868e+02 -5.6181584973687457e+01 -2.7582701917178326e+02 @@ -71,10 +72,10 @@ init_forces: ! |2 35 -4.3920895665271935e+01 1.3832065189158040e+00 3.2302673529697479e+01 36 6.0407395927653840e+02 6.3222430241983602e+02 -1.5530384927410198e+01 37 -1.7704334275340958e+02 -3.4711199127962510e+02 2.0757920588578631e+02 - 38 -1.5990280705026578e+02 3.4383476554695548e+01 -1.1348860416567172e+02 + 38 -1.5990280705026578e+02 3.4383476554695534e+01 -1.1348860416567172e+02 39 1.2481780186485386e+02 3.1854282379699551e+01 2.4141006149778542e+02 40 -3.3952439214884555e+02 -5.2081203805390805e+02 -3.2749145453037904e+01 - 41 1.5953768898032129e+01 -2.5259433402085026e+01 -6.0977489335468213e+01 + 41 1.5953768898032132e+01 -2.5259433402085026e+01 -6.0977489335468242e+01 42 -3.5152692860571921e+02 1.0103192674618649e+02 1.0057493004151380e+02 43 1.8325251692529525e+02 -1.7843397924740284e+01 3.5813821983655600e+01 44 -1.7148730839833942e+02 6.5823249480752622e+01 -3.9043544554425509e+01 @@ -88,20 +89,20 @@ init_forces: ! |2 52 2.6770006025654067e+02 -1.3486195976744685e+02 -1.0999251813934440e+02 53 -3.0038447974652507e+02 1.7427208891886863e+02 -2.8369940533043155e+02 54 -1.8044322949045332e+02 3.2006167622599366e+02 -2.1986764638272368e+02 - 55 -6.7026995338193800e+01 2.8420556560193825e+02 -1.8256943632991815e+02 + 55 -6.7026995338193785e+01 2.8420556560193825e+02 -1.8256943632991815e+02 56 -9.3944897793228427e+02 7.6593871052490795e+02 -4.5872941120666036e+02 57 -2.7671724574062154e+01 -1.7257977562305285e+02 -1.6210118849324644e+02 58 7.1032070297632515e+02 -8.0881938208311499e+02 4.6676948457734852e+02 59 1.5682857500225748e+02 5.9891527233627251e+01 1.2646558890105979e+02 - 60 9.4076874705709940e+01 -1.1749874299724539e+02 -2.9919368333582653e+01 + 60 9.4076874705709940e+01 -1.1749874299724536e+02 -2.9919368333582653e+01 61 -4.8945763699767674e+01 1.6634783727405593e+02 6.7645978441449785e+01 - 62 1.6618577867039602e+02 7.3503605317082460e+01 2.2193892218236812e+02 + 62 1.6618577867039602e+02 7.3503605317082432e+01 2.2193892218236812e+02 63 4.6491757293229652e+00 -3.5581179274724047e+02 -3.8944419279304846e+01 - 64 -2.0021113303887086e+02 -1.1223202348830976e+02 3.0276216112541510e+02 -run_vdwl: -8975.38042076783 -run_coul: 0.592853076313598 + 64 -2.0021113303887086e+02 -1.1223202348830974e+02 3.0276216112541510e+02 +run_vdwl: -8975.380420767826 +run_coul: 0.5928530763135977 run_stress: ! |- - -1.1524045146329236e+03 -4.6202672628887268e+02 3.1947257175242049e+02 -2.2198788293036200e+03 3.4537925625758328e+02 -1.2645006400276918e+03 + -1.1524045146329231e+03 -4.6202672628887268e+02 3.1947257175242231e+02 -2.2198788293036200e+03 3.4537925625758328e+02 -1.2645006400276918e+03 run_forces: ! |2 1 -2.0916271375742122e+02 -1.8819704628010820e+02 -2.2843189669574852e+02 2 -5.9713089401385787e+01 -1.3795344000202866e+02 -6.1452818077516426e+01 @@ -113,9 +114,9 @@ run_forces: ! |2 8 -2.1021838063645568e+01 -4.0712804090199722e+02 1.5141447171445833e+02 9 -5.9306114388327742e+01 2.6264890826456997e+02 1.7441651570743588e+01 10 -8.4526898873820201e+01 1.5450366474645668e+02 6.0033453272929940e+00 - 11 -1.1159943563282732e+02 1.8656190683525134e+02 3.4449923076959345e+02 + 11 -1.1159943563282735e+02 1.8656190683525134e+02 3.4449923076959345e+02 12 3.3352091011374790e+02 -3.8250187755922349e+02 5.1084711927225143e+01 - 13 -3.9348220819701362e+02 -9.9340584671855098e+01 2.4784344215807911e+02 + 13 -3.9348220819701362e+02 -9.9340584671855126e+01 2.4784344215807911e+02 14 1.7611207455981244e+02 -2.8017472349270184e+02 -2.7998178961052838e+02 15 2.5245571069035290e+02 -5.4734821409382626e+01 -1.3455249096986566e+02 16 1.6596243938777351e+02 1.6278821061030078e+02 4.2193739172058962e+01 @@ -124,28 +125,28 @@ run_forces: ! |2 19 -5.9065305354749185e+01 1.7641117222083235e+01 -1.0450807266106713e+02 20 1.3106409577706648e+02 2.5186488486411651e+01 1.3539864929844231e+02 21 -3.2006405209533727e+02 -1.1510774059461794e+02 -2.5815972761838644e+01 - 22 -1.2758648770740034e+01 -1.3030598897381913e+02 -1.4401125298080763e+02 + 22 -1.2758648770740034e+01 -1.3030598897381913e+02 -1.4401125298080760e+02 23 -1.0142069915754510e+02 2.3316707339244664e+02 2.3905997646640651e+02 24 4.1563103349612355e+01 -1.2912528416939978e+01 -3.1670350622584593e+01 25 2.1168614583214108e+02 -2.0420927517565983e+02 -3.1221859837734250e+01 - 26 -2.6321230702712649e+02 1.2065335797472036e+02 2.6277789068532360e+02 + 26 -2.6321230702712649e+02 1.2065335797472038e+02 2.6277789068532360e+02 27 -7.4500805679154823e+01 1.0778230652943388e+02 1.6094824153641918e+02 28 -2.4910955893577807e+02 -9.8496280842320616e+01 2.2240251270644734e+02 29 4.5656377692784969e+02 -5.6186906107102686e+01 -2.7582984196898542e+02 30 -1.1442511837997856e+02 5.2288586072111144e+01 -1.7194888884507304e+02 - 31 -1.8372666861898105e+02 -1.0040300216200654e+02 -9.6974937189118549e+01 + 31 -1.8372666861898108e+02 -1.0040300216200654e+02 -9.6974937189118549e+01 32 1.5285848611243131e+02 -1.2910298326427261e+02 -1.8526958855531907e+02 33 2.0676324457133298e+01 3.7958042970093453e+02 -3.0330268376879861e+01 34 -1.8482802426276322e+02 -8.4860106696650362e+01 -1.0335087798868081e+02 - 35 -4.3757312673305961e+01 1.3332543035332109e+00 3.2176626618113424e+01 + 35 -4.3757312673305961e+01 1.3332543035332394e+00 3.2176626618113424e+01 36 6.0396434382165080e+02 6.3211513244050911e+02 -1.5608509994293938e+01 37 -1.7702865323607540e+02 -3.4710307878941217e+02 2.0756937792988572e+02 38 -1.5990155316495603e+02 3.4380405811165133e+01 -1.1348496857139023e+02 39 1.2481655186335834e+02 3.1838210934905270e+01 2.4138399128801109e+02 40 -3.3940174784427825e+02 -5.2071078889465889e+02 -3.2710078405858489e+01 - 41 1.5894692394219231e+01 -2.5287374067694170e+01 -6.0953115361932838e+01 + 41 1.5894692394219231e+01 -2.5287374067694170e+01 -6.0953115361932809e+01 42 -3.5153052244718293e+02 1.0102830549812477e+02 1.0056790310062641e+02 - 43 1.8327499597791055e+02 -1.7817142708111650e+01 3.5817319257754178e+01 + 43 1.8327499597791055e+02 -1.7817142708111650e+01 3.5817319257754193e+01 44 -1.7148210647983669e+02 6.5813679084638309e+01 -3.9042611994879181e+01 45 6.8003425377666687e+01 -5.2977048819501960e+01 -1.1277968937633442e+02 46 -1.9814362259114762e+02 3.1898369061349177e+02 -1.7124898143652061e+02 From 204566790239f4882314dc1447ebcdc0bbd00537 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:55:09 -0400 Subject: [PATCH 068/352] document QEQ package incompatibilities --- doc/src/fix_qeq.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index 7ea79a89ce..ffc85dcf3b 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -230,6 +230,8 @@ These fixes are part of the QEQ package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +The qeq fixes are not compatible with the GPU and USER-INTEL packages. + Related commands """""""""""""""" From daaebd55a6e8b952b49618939db9f58b0a4e2695 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 14:56:27 -0400 Subject: [PATCH 069/352] add QEQ parameter file --- unittest/force-styles/tests/param.qeq2 | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 unittest/force-styles/tests/param.qeq2 diff --git a/unittest/force-styles/tests/param.qeq2 b/unittest/force-styles/tests/param.qeq2 new file mode 100644 index 0000000000..1d77b7d3a6 --- /dev/null +++ b/unittest/force-styles/tests/param.qeq2 @@ -0,0 +1,3 @@ +# UNITS: metal +1 0.00000 7.25028 0.01 0.772871 0.000000 +2 11.26882 15.37920 0.01 0.243072 0.000000 From c5438156925121713e613bbbc5d57c512507a343 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 15:28:42 -0400 Subject: [PATCH 070/352] small tweaks --- unittest/commands/test_groups.cpp | 2 +- unittest/force-styles/tests/fix-timestep-adapt_pair.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/commands/test_groups.cpp b/unittest/commands/test_groups.cpp index 181f000a7c..1b65d6dfa4 100644 --- a/unittest/commands/test_groups.cpp +++ b/unittest/commands/test_groups.cpp @@ -245,7 +245,7 @@ TEST_F(GroupTest, Molecular) ASSERT_EQ(group->count(group->find("three")), 15); ASSERT_DOUBLE_EQ(group->mass(group->find("half")), 40); ASSERT_DOUBLE_EQ(group->mass(group->find("half"), domain->find_region("top")), 10); - ASSERT_DOUBLE_EQ(group->charge(group->find("top")), 0); + ASSERT_NEAR(group->charge(group->find("top")), 0,1.0e-14); ASSERT_DOUBLE_EQ(group->charge(group->find("right"), domain->find_region("top")), 0); TEST_FAILURE(".*ERROR: Illegal group command.*", command("group three include xxx");); diff --git a/unittest/force-styles/tests/fix-timestep-adapt_pair.yaml b/unittest/force-styles/tests/fix-timestep-adapt_pair.yaml index 167f531b8e..58b25f6012 100644 --- a/unittest/force-styles/tests/fix-timestep-adapt_pair.yaml +++ b/unittest/force-styles/tests/fix-timestep-adapt_pair.yaml @@ -1,7 +1,7 @@ --- lammps_version: 10 Mar 2021 date_generated: Thu Mar 25 14:01:17 202 -epsilon: 1e-14 +epsilon: 2e-14 prerequisites: ! | atom full fix adapt From 83c1187e47da2dc61e9b99635f3d9a0f991c097c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 16:53:39 -0400 Subject: [PATCH 071/352] clear allocated data structure so that all included pointers are initialized to null --- src/USER-REAXC/pair_reaxc.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 565dc89eb0..5cd1556943 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -78,7 +78,9 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) api->control = new control_params; memset(api->control,0,sizeof(control_params)); api->data = new simulation_data; + memset(api->data,0,sizeof(simulation_data)); api->workspace = new storage; + memset(api->workspace,0,sizeof(storage)); memory->create(api->lists, LIST_N,"reaxff:lists"); memset(api->lists,0,LIST_N * sizeof(reax_list)); From 66eea0b63a66fca9c5d10f22d6baf47f5f5c8f98 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 16:54:17 -0400 Subject: [PATCH 072/352] call destroy() before create() for multi-dimensional arrays to avoid leakage --- src/USER-REAXC/reaxc_ffield.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 7e60682102..530a5913a6 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -91,6 +91,7 @@ namespace ReaxFF { if (n < 1) THROW_ERROR("Invalid number of global parameters"); + memory->destroy(gp.l); memory->create(gp.l,n,"reaxff:gp.l"); // see reaxff_types.h for mapping between l[i] and the lambdas used in ff @@ -118,6 +119,11 @@ namespace ReaxFF { auto &hbp = reax->hbp; auto &fbp = reax->fbp; + memory->destroy(sbp); + memory->destroy(tbp); + memory->destroy(thbp); + memory->destroy(hbp); + memory->destroy(fbp); memory->create(sbp,n,"reaxff:sbp"); memory->create(tbp,n,n,"reaxff:tbp"); memory->create(thbp,n,n,n,"reaxff:thbp"); From b014e8b94fb9e13155e002c69f3ca01ffae0391f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 17:15:52 -0400 Subject: [PATCH 073/352] revert standard reax/c test --- .../tests/atomic-pair-reax_c.yaml | 270 +++++++++--------- 1 file changed, 135 insertions(+), 135 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index 261812d56c..857326b10d 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,6 +1,6 @@ --- lammps_version: 8 Apr 2021 -date_generated: Mon Apr 19 09:21:15 2021 +date_generated: Tue Apr 20 16:11:55 2021 epsilon: 1e-10 skip_tests: prerequisites: ! | @@ -25,7 +25,7 @@ pre_commands: ! | set type 2 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c maxiter 20 nowarn + fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c input_file: in.empty pair_style: reax/c NULL checkqeq yes pair_coeff: ! | @@ -33,141 +33,141 @@ pair_coeff: ! | extract: ! "" natoms: 64 init_vdwl: -4208.203794533267 -init_coul: -268.02765877429266 +init_coul: -268.0258681099893 init_stress: ! |2- - 2.3677138597920134e+03 3.0801994317052795e+03 1.2727836669117719e+03 -1.5387982333122163e+03 -1.0906434577120353e+03 1.1229697394381967e+03 + 2.3677048490925813e+03 3.0802122558807969e+03 1.2727815110263937e+03 -1.5387991688242109e+03 -1.0906364142628713e+03 1.1229877249527449e+03 init_forces: ! |2 - 1 2.9633286152714895e+01 -5.6268158870662865e+02 -1.6667929778658686e+02 - 2 -1.5938461587386283e+02 -2.2076632409584278e+02 -1.7162405040710766e+02 - 3 -3.1194767737908826e+01 -3.0592472349600524e+02 4.4651629891466243e+01 - 4 4.4646596256626185e+02 1.7080830170172359e+02 1.7439025633170678e+02 - 5 -1.1512522479897345e+02 7.9717596119857888e+01 1.7958911311542607e+01 - 6 -7.1695066631618761e+02 4.0748756065642638e+01 2.1511809762804484e+02 - 7 2.3022206076223796e+02 -9.0168647609670387e+01 8.2189129278766103e+01 - 8 -2.1137097290905352e+01 -1.5635843951502784e+02 1.6101855425514745e+02 - 9 -1.2130643966073812e+02 -2.7960290186509405e+02 -1.9629224425201704e+02 - 10 -3.7631894872912522e+02 3.4103357651251537e+02 -1.8166645213907478e+02 - 11 -1.6153902964754667e+02 1.5743241425267431e+02 3.5832306945377178e+02 - 12 6.1603732792700282e+02 -1.4821040465468917e+02 1.0870676706201488e+02 - 13 -2.1366851202213653e+02 -3.0163954126350092e+02 5.2420915627618558e+02 - 14 2.5933780612532126e+02 -1.7968461610614241e+01 -2.7733218830598901e+02 - 15 1.7570487907901011e+02 1.7550789799326304e+02 -9.5786451085155491e+01 - 16 3.0589204520776934e+02 -4.7676020729815768e+01 -3.4330483431656791e+02 - 17 -1.5018690887845338e+02 1.3259473313627657e+02 2.3200552664411475e+02 - 18 1.6469519167779183e+02 -1.0816250655621064e+02 2.1207543727392661e+02 - 19 2.4759344887399081e+02 -4.8758511247092088e+01 -2.2494130722447932e+02 - 20 1.2418791307460424e+02 2.5137179718270556e+02 -1.5340308025983461e+01 - 21 -1.9556242958992678e+02 2.3151160715888874e+01 -1.2529867634994399e+02 - 22 2.4829292770827422e+02 -2.9828612004289113e+02 -4.0454677881884024e+01 - 23 8.2077976837017900e+01 1.3041866298293627e+02 1.5221209316034532e+02 - 24 -7.6913783243387826e+01 2.3540203354364189e+02 -1.7129245933770727e+02 - 25 -2.9781744550605662e+01 -1.8931888070263267e+02 6.7990019857554202e+01 - 26 -3.9488424247767014e+01 2.0999360632613091e+00 -2.0748830164832864e+02 - 27 -2.7704383990910344e+02 5.3737323080507701e+02 4.2318830552299499e+02 - 28 -2.9302153625490882e+02 -5.1150243581343020e+01 -2.3633573764669612e+02 - 29 1.2970603958450926e+02 -4.2262332230398229e+01 1.6349790455526482e+02 - 30 5.6924470622841902e+01 3.7878571490062619e+01 6.8637961971110911e+01 - 31 -1.9325586894804644e+02 -1.1645468493273863e+02 -2.0673145110109189e+01 - 32 1.2359537270071175e+02 -3.3261682729471509e+01 -1.0517081413370242e+02 - 33 6.5244494839342053e+01 3.7105575675452133e+02 6.0972008518320628e+01 - 34 -2.3124412393972406e+02 -1.1681894708374426e+02 -2.5838515661900914e+02 - 35 -4.1912097866037749e+02 7.9940298322579153e+01 3.1020906752098472e+02 - 36 -1.8561756690805518e+02 -1.1563749469376307e+02 -4.2356131544286932e+01 - 37 8.8268459557867800e+00 -3.5266202517998272e+02 -6.0508589419221380e+01 - 38 -1.9251065954670622e+01 1.1716443799821707e+02 -2.3476787650314483e+02 - 39 -1.0434207876793304e+01 -7.0902825597879200e+01 1.4264102290267166e+02 - 40 3.3265415672808695e+02 -8.8676314506220365e+02 1.6250323289221797e+01 - 41 -6.4525340969477625e+01 1.5190482993381195e+02 -1.8226363836162227e+02 - 42 2.3374265976474046e+01 1.1820849928255014e+02 4.1205919897871769e+02 - 43 -3.5145427442179937e+01 -3.6494054739761985e+00 2.4936139875273903e+02 - 44 -1.2909580317707088e+00 -2.4878033872407525e+02 7.9235212511230884e+01 - 45 2.0871432412721612e+02 -1.0816380085646371e+02 -4.1290534066227440e+02 - 46 -1.3837993836409981e+02 4.6113983127416537e+02 -2.4014147975943226e+02 - 47 1.3255343208840517e+02 2.8747648851097466e+02 -3.2895641248751062e+01 - 48 7.8145151343613895e+02 6.5212246673697649e+01 -6.2304415905848475e+02 - 49 2.4486207561858652e+02 1.9098760054137188e+01 3.7416718126982084e+02 - 50 2.9821250019803648e+02 3.0684285856103526e+02 5.6995325423529778e+02 - 51 -8.0052512629134719e+02 5.1024666433916468e+02 7.5828839863942687e+02 - 52 -9.2132795322260193e+01 1.1909938868988401e+02 -2.4119177446813089e+02 - 53 -3.6386508146804226e+02 -2.0728774423637225e+02 -3.4909372895932455e+02 - 54 -8.3400478462696412e+01 1.8942847373883873e+02 -1.2868846530013360e+02 - 55 -2.5306030895087017e+02 -1.1005903030773361e+02 -3.0893490115268742e+02 - 56 1.7363066404655606e+02 -2.5755159082633384e+02 -4.3732393367297526e+01 - 57 4.2667868235664599e+02 1.5529168633998034e+02 -3.9988358463751354e+02 - 58 -3.9654228870269598e+01 7.8950867015507271e+01 2.6135841350205141e+02 - 59 -2.7594567334153987e+02 1.9892282891821415e+02 2.4123100379637927e+02 - 60 -2.5675971154579702e+02 -1.1527142348407712e+02 9.9923841074681320e+01 - 61 3.0884909844566982e+02 4.9986511818576071e+02 -1.3369330200973721e+02 - 62 2.8529506416321446e+01 5.9000054110319344e-01 -2.7402724976042202e+02 - 63 2.5296716267913251e+02 -2.7640609445310349e+02 -1.9200849927940413e+02 - 64 -8.4682581712903087e+01 -1.5737182215029318e+02 1.5637971229670848e+02 -run_vdwl: -4208.209603101568 -run_coul: -268.02581602182215 + 1 2.9634051452064185e+01 -5.6267761875030578e+02 -1.6668253255995427e+02 + 2 -1.5938437728855834e+02 -2.2076601831947630e+02 -1.7161994484503376e+02 + 3 -3.1194106231028943e+01 -3.0591930644159874e+02 4.4652570958842091e+01 + 4 4.4646653320084567e+02 1.7080811286684130e+02 1.7439026170464035e+02 + 5 -1.1512606621591536e+02 7.9716954463499022e+01 1.7959700550221577e+01 + 6 -7.1695199301548041e+02 4.0749156820926302e+01 2.1512037025856239e+02 + 7 2.3022543693175217e+02 -9.0170756873726333e+01 8.2190170006889645e+01 + 8 -2.1141251466334634e+01 -1.5635879347045886e+02 1.6101907187957218e+02 + 9 -1.2130842270563915e+02 -2.7960689135651120e+02 -1.9629114850256667e+02 + 10 -3.7631710890095133e+02 3.4103240548851863e+02 -1.8166279141134066e+02 + 11 -1.6154553323853384e+02 1.5743068117724297e+02 3.5832389058241489e+02 + 12 6.1602989065569886e+02 -1.4821564423105795e+02 1.0871005319350247e+02 + 13 -2.1366561068643219e+02 -3.0163595494900011e+02 5.2420406156019726e+02 + 14 2.5933950255875533e+02 -1.7967300062459064e+01 -2.7733367021016983e+02 + 15 1.7570537661854226e+02 1.7550639099554951e+02 -9.5789475936342853e+01 + 16 3.0588529285450090e+02 -4.7675556549230315e+01 -3.4330544488854196e+02 + 17 -1.5018545342619470e+02 1.3259542010621982e+02 2.3200545258699555e+02 + 18 1.6469564396901654e+02 -1.0816413254489510e+02 2.1207485840068148e+02 + 19 2.4759285902963026e+02 -4.8758383780523836e+01 -2.2494100786658765e+02 + 20 1.2418785577587857e+02 2.5137242577506828e+02 -1.5341186115637054e+01 + 21 -1.9556210564941867e+02 2.3152590535678623e+01 -1.2529729601999072e+02 + 22 2.4829386068622458e+02 -2.9828789153726473e+02 -4.0455445433038705e+01 + 23 8.2076007650237955e+01 1.3042103437664485e+02 1.5221389911915190e+02 + 24 -7.6912973583045328e+01 2.3539925428983466e+02 -1.7129603802744774e+02 + 25 -2.9782413878295884e+01 -1.8931910469291046e+02 6.7989202537813426e+01 + 26 -3.9488494691930782e+01 2.1025614476190424e+00 -2.0748963060916628e+02 + 27 -2.7704110443958297e+02 5.3736974078118158e+02 4.2318884882973293e+02 + 28 -2.9303219943093302e+02 -5.1154115419355229e+01 -2.3633993403335379e+02 + 29 1.2970484011865997e+02 -4.2266229541184131e+01 1.6350076614993492e+02 + 30 5.6925606430580402e+01 3.7880191852747046e+01 6.8636397133447261e+01 + 31 -1.9325596697353834e+02 -1.1645368911553673e+02 -2.0671692760916812e+01 + 32 1.2360965200043042e+02 -3.3253411369754360e+01 -1.0516118458992996e+02 + 33 6.5241847803263653e+01 3.7105112939425635e+02 6.0972558235451928e+01 + 34 -2.3124259597682851e+02 -1.1681740329855472e+02 -2.5838262648358858e+02 + 35 -4.1912226107430826e+02 7.9942920270906228e+01 3.1021023518174763e+02 + 36 -1.8561789047309296e+02 -1.1563628711183125e+02 -4.2360172436503717e+01 + 37 8.8271496727767698e+00 -3.5266450940716857e+02 -6.0505384072663695e+01 + 38 -1.9249505149115080e+01 1.1716319600342219e+02 -2.3477222840170350e+02 + 39 -1.0433878247334579e+01 -7.0902801856116241e+01 1.4264113912369183e+02 + 40 3.3265570779157940e+02 -8.8675933035692253e+02 1.6250845779884724e+01 + 41 -6.4537349815891190e+01 1.5189506353185567e+02 -1.8225353662797988e+02 + 42 2.3368723487140532e+01 1.1821526860010481e+02 4.1207323013207559e+02 + 43 -3.5145546474533603e+01 -3.6511647370358964e+00 2.4936793079206421e+02 + 44 -1.2881828259467285e+00 -2.4877240180803770e+02 7.9235766494558362e+01 + 45 2.0871504532588767e+02 -1.0817588901356530e+02 -4.1291808327438582e+02 + 46 -1.3837716960728255e+02 4.6114279241763722e+02 -2.4013801845141728e+02 + 47 1.3255320792802377e+02 2.8747276038939981e+02 -3.2896384987644886e+01 + 48 7.8145138718954991e+02 6.5215432481105154e+01 -6.2304789958706840e+02 + 49 2.4486314507345327e+02 1.9101300126651807e+01 3.7417037047544727e+02 + 50 2.9821275118603683e+02 3.0684252095008105e+02 5.6994896759617143e+02 + 51 -8.0052405736417188e+02 5.1024940640330806e+02 7.5829315450290915e+02 + 52 -9.2130898885915201e+01 1.1909837120722082e+02 -2.4118832391136655e+02 + 53 -3.6386926333489237e+02 -2.0729203700030763e+02 -3.4910517647679171e+02 + 54 -8.3399710534966360e+01 1.8942260327526213e+02 -1.2868598438440796e+02 + 55 -2.5305956575883852e+02 -1.1005916187118478e+02 -3.0893514828399947e+02 + 56 1.7364614503216589e+02 -2.5754370913449043e+02 -4.3744509948719575e+01 + 57 4.2667925201499298e+02 1.5529221173799095e+02 -3.9988499000700682e+02 + 58 -3.9656744140978226e+01 7.8953243693724033e+01 2.6135299122199172e+02 + 59 -2.7594240444753677e+02 1.9891763338587063e+02 2.4122500794453137e+02 + 60 -2.5675904361258932e+02 -1.1527171320987564e+02 9.9923550442534349e+01 + 61 3.0884427580009310e+02 4.9986415802549146e+02 -1.3369122169832409e+02 + 62 2.8530106503456519e+01 5.9540697570827006e-01 -2.7403025931181190e+02 + 63 2.5297054006404551e+02 -2.7640485799385101e+02 -1.9200503841907977e+02 + 64 -8.4680445259248458e+01 -1.5737027404337621e+02 1.5637808719882156e+02 +run_vdwl: -4208.209603101557 +run_coul: -268.02583477440254 run_stress: ! |2- - 2.3675915915115038e+03 3.0802240114846613e+03 1.2727324747502155e+03 -1.5388667254325053e+03 -1.0907269430167464e+03 1.1229240366702902e+03 + 2.3675903993352799e+03 3.0802227297815411e+03 1.2727311522674922e+03 -1.5388669378285692e+03 -1.0907269208284702e+03 1.1229243202763012e+03 run_forces: ! |2 - 1 2.9635340083051346e+01 -5.6267710249795869e+02 -1.6667998370665143e+02 - 2 -1.5938666826920343e+02 -2.2076534189863366e+02 -1.7162354109212984e+02 - 3 -3.1189870810301095e+01 -3.0593571985047180e+02 4.4645956923836664e+01 - 4 4.4646581130069950e+02 1.7080959759402148e+02 1.7439093558473147e+02 - 5 -1.1512840430317976e+02 7.9717053594844629e+01 1.7957493384932661e+01 - 6 -7.1695600898242708e+02 4.0752809200821034e+01 2.1512530796739239e+02 - 7 2.3022648522685608e+02 -9.0168938352327743e+01 8.2194670669568964e+01 - 8 -2.1149215429861702e+01 -1.5637110513857075e+02 1.6102981761092099e+02 - 9 -1.2130987184908217e+02 -2.7961359052794438e+02 -1.9628960657192528e+02 - 10 -3.7631820453396847e+02 3.4103263667614613e+02 -1.8166531833456517e+02 - 11 -1.6154688755051467e+02 1.5742797323066301e+02 3.5832199781281412e+02 - 12 6.1603846554302856e+02 -1.4820394873283382e+02 1.0871523277525925e+02 - 13 -2.1367534498311514e+02 -3.0167456097439617e+02 5.2424088341628442e+02 - 14 2.5933832701218608e+02 -1.7968192701718916e+01 -2.7733108167843062e+02 - 15 1.7570795092251277e+02 1.7551000310384359e+02 -9.5784222372814824e+01 - 16 3.0586981469801617e+02 -4.7679565967035259e+01 -3.4332195262424483e+02 - 17 -1.5018632687377072e+02 1.3259144780414934e+02 2.3200578527117301e+02 - 18 1.6469880313326215e+02 -1.0816831870102239e+02 2.1207667736516382e+02 - 19 2.4759420024003853e+02 -4.8758379338079727e+01 -2.2494116275048481e+02 - 20 1.2419960129665635e+02 2.5137932270320678e+02 -1.5328240053348356e+01 - 21 -1.9556094383241299e+02 2.3151696381601958e+01 -1.2529580363737537e+02 - 22 2.4829940463520313e+02 -2.9829343297891006e+02 -4.0446694405761576e+01 - 23 8.2074486469597687e+01 1.3042095796913281e+02 1.5221366791874641e+02 - 24 -7.6917692833702446e+01 2.3540351711765027e+02 -1.7130196247252570e+02 - 25 -2.9742100996765380e+01 -1.8935699491160051e+02 6.7995875362048835e+01 - 26 -3.9494945036515908e+01 2.1074087479630634e+00 -2.0748976668424677e+02 - 27 -2.7704005979662662e+02 5.3736953816242783e+02 4.2318569074160462e+02 - 28 -2.9302860300138957e+02 -5.1149672303866737e+01 -2.3633681317128332e+02 - 29 1.2970506005124116e+02 -4.2266505241952196e+01 1.6349682642247129e+02 - 30 5.6925895652797955e+01 3.7880903611520054e+01 6.8637138210808786e+01 - 31 -1.9325535402701956e+02 -1.1645328207806656e+02 -2.0671892295502396e+01 - 32 1.2360206049549920e+02 -3.3252985301196659e+01 -1.0516931870918121e+02 - 33 6.5239430456833531e+01 3.7104671672305966e+02 6.0974424435615809e+01 - 34 -2.3124086955801889e+02 -1.1681533354856286e+02 -2.5837807428177962e+02 - 35 -4.1912107298361212e+02 7.9943751193797880e+01 3.1020726776656619e+02 - 36 -1.8561413355995509e+02 -1.1563427104741439e+02 -4.2360264054660597e+01 - 37 8.8273599678770864e+00 -3.5266981598144150e+02 -6.0507477320620680e+01 - 38 -1.9245038012709841e+01 1.1717725521030376e+02 -2.3478404802363110e+02 - 39 -1.0434215698836438e+01 -7.0902647384814358e+01 1.4263978849003041e+02 - 40 3.3271178359289979e+02 -8.8679283858336646e+02 1.6219768658650871e+01 - 41 -6.4538810609188275e+01 1.5189398379892381e+02 -1.8225442798722727e+02 - 42 2.3368203862303545e+01 1.1822249156204117e+02 4.1207761014771074e+02 - 43 -3.5145614670828280e+01 -3.6517750326814120e+00 2.4936780076604907e+02 - 44 -1.2879422574017376e+00 -2.4877334082189225e+02 7.9236450933542571e+01 - 45 2.0871640299070592e+02 -1.0817582150128533e+02 -4.1291845938329635e+02 - 46 -1.3836372708562709e+02 4.6117937798867194e+02 -2.4016736146584793e+02 - 47 1.3255127160214204e+02 2.8747595545221196e+02 -3.2895652028052091e+01 - 48 7.8145389054767179e+02 6.5214945379088277e+01 -6.2304920777042912e+02 - 49 2.4488291106236500e+02 1.9105409364926288e+01 3.7418589758696908e+02 - 50 2.9822130989912665e+02 3.0683153011979800e+02 5.6994487035095165e+02 - 51 -8.0058521183025380e+02 5.1028581602653651e+02 7.5832461768047244e+02 - 52 -9.2137019037691147e+01 1.1910697318842861e+02 -2.4119128768698766e+02 - 53 -3.6387123110982282e+02 -2.0729720964342076e+02 -3.4910519380830556e+02 - 54 -8.3401332800193543e+01 1.8942464275359734e+02 -1.2869043354758486e+02 - 55 -2.5309678157873975e+02 -1.1001947468656527e+02 -3.0896372177857239e+02 - 56 1.7364608133921760e+02 -2.5754423801373565e+02 -4.3743927978158730e+01 - 57 4.2666357128098645e+02 1.5528157162856127e+02 -3.9988029715399989e+02 - 58 -3.9656756118817448e+01 7.8953165237690285e+01 2.6135222125861111e+02 - 59 -2.7594578242635424e+02 1.9891765773401318e+02 2.4122928728349606e+02 - 60 -2.5675991915252069e+02 -1.1527235180653685e+02 9.9923833769027368e+01 - 61 3.0884427542809721e+02 4.9986710924069786e+02 -1.3369013404232507e+02 - 62 2.8530654477154116e+01 5.9282210053495610e-01 -2.7403003802560033e+02 - 63 2.5296776535482985e+02 -2.7640523185325759e+02 -1.9200396674401188e+02 - 64 -8.4674657022429557e+01 -1.5736405319931387e+02 1.5637353707611086e+02 + 1 2.9635294281594891e+01 -5.6267712552696150e+02 -1.6667999923844903e+02 + 2 -1.5938673400152015e+02 -2.2076536449681436e+02 -1.7162354129442059e+02 + 3 -3.1189858281105185e+01 -3.0593580065880258e+02 4.4645958607293259e+01 + 4 4.4646581891374524e+02 1.7080959763777909e+02 1.7439093938228865e+02 + 5 -1.1512839796355780e+02 7.9717058687934127e+01 1.7957487669510552e+01 + 6 -7.1695602565953936e+02 4.0752829698557036e+01 2.1512533839228914e+02 + 7 2.3022644486519332e+02 -9.0168915600534049e+01 8.2194655874280542e+01 + 8 -2.1149264848803984e+01 -1.5637111051643518e+02 1.6102981315498010e+02 + 9 -1.2130987756626322e+02 -2.7961363383950686e+02 -1.9628960069615047e+02 + 10 -3.7631817089745317e+02 3.4103259385937486e+02 -1.8166532788357921e+02 + 11 -1.6154687915131711e+02 1.5742797820595132e+02 3.5832199951140109e+02 + 12 6.1603841944463943e+02 -1.4820397700321357e+02 1.0871524086056972e+02 + 13 -2.1367529106934364e+02 -3.0167446795627899e+02 5.2424091634188028e+02 + 14 2.5933827511240753e+02 -1.7968203382119590e+01 -2.7733114072539661e+02 + 15 1.7570793004244069e+02 1.7551005525188296e+02 -9.5784231788977749e+01 + 16 3.0586985592967915e+02 -4.7679566105948382e+01 -3.4332192731505285e+02 + 17 -1.5018636472333995e+02 1.3259146324636694e+02 2.3200578297675395e+02 + 18 1.6469881174805161e+02 -1.0816836176978013e+02 2.1207670716678888e+02 + 19 2.4759420520504079e+02 -4.8758383157767163e+01 -2.2494116682880116e+02 + 20 1.2419960666452823e+02 2.5137933265660718e+02 -1.5328241144729745e+01 + 21 -1.9556094492800702e+02 2.3151723982064777e+01 -1.2529581330697818e+02 + 22 2.4829941584476597e+02 -2.9829345245033829e+02 -4.0446702084715653e+01 + 23 8.2074458696916352e+01 1.3042100306284391e+02 1.5221371881648275e+02 + 24 -7.6917668833500898e+01 2.3540360228733630e+02 -1.7130192995354321e+02 + 25 -2.9742104523786168e+01 -1.8935699467868037e+02 6.7995874219729117e+01 + 26 -3.9494943772628240e+01 2.1074054704555034e+00 -2.0748981609854840e+02 + 27 -2.7704003655185977e+02 5.3736954143365233e+02 4.2318574013793761e+02 + 28 -2.9302855291123007e+02 -5.1149666118960234e+01 -2.3633679976948793e+02 + 29 1.2970505460342494e+02 -4.2266433901986183e+01 1.6349685185792413e+02 + 30 5.6925896868052199e+01 3.7880918758244668e+01 6.8637128510003294e+01 + 31 -1.9325534294265759e+02 -1.1645328076628637e+02 -2.0671892621502057e+01 + 32 1.2360198063082690e+02 -3.3253019999942374e+01 -1.0516936549567490e+02 + 33 6.5239383936196262e+01 3.7104662858439900e+02 6.0974455303733073e+01 + 34 -2.3124084085037498e+02 -1.1681523003031349e+02 -2.5837805461650902e+02 + 35 -4.1912113383005675e+02 7.9943750613186452e+01 3.1020725803706983e+02 + 36 -1.8561422052418746e+02 -1.1563434085911459e+02 -4.2360108129603255e+01 + 37 8.8275421440856547e+00 -3.5266971563412392e+02 -6.0507541453071482e+01 + 38 -1.9245036832038224e+01 1.1717726898939364e+02 -2.3478417248419430e+02 + 39 -1.0434224692470824e+01 -7.0902644440221394e+01 1.4263978421852897e+02 + 40 3.3271177801097122e+02 -8.8679293552761555e+02 1.6219742097556569e+01 + 41 -6.4538764986359638e+01 1.5189397693612858e+02 -1.8225441696797373e+02 + 42 2.3368235855713472e+01 1.1822246665296132e+02 4.1207745038653673e+02 + 43 -3.5145643416904370e+01 -3.6517162542190285e+00 2.4936784352978586e+02 + 44 -1.2879745400758535e+00 -2.4877345145140910e+02 7.9236449970514400e+01 + 45 2.0871643412339361e+02 -1.0817571271704279e+02 -4.1291831345629367e+02 + 46 -1.3836372705477595e+02 4.6117938292253513e+02 -2.4016736526221720e+02 + 47 1.3255125611057784e+02 2.8747591615865849e+02 -3.2895660248675412e+01 + 48 7.8145417759956388e+02 6.5214930060371188e+01 -6.2304930828897488e+02 + 49 2.4488281403352434e+02 1.9105496615711587e+01 3.7418605144303842e+02 + 50 2.9822129513622804e+02 3.0683153982657637e+02 5.6994490418774092e+02 + 51 -8.0058572063770589e+02 5.1028617285827835e+02 7.5832431569040102e+02 + 52 -9.2137024513793961e+01 1.1910687193195571e+02 -2.4119120858088723e+02 + 53 -3.6387082584333763e+02 -2.0729771077051413e+02 -3.4910499737675855e+02 + 54 -8.3401322475888492e+01 1.8942466656602346e+02 -1.2869045777950828e+02 + 55 -2.5309678413622956e+02 -1.1001947899857218e+02 -3.0896372370121657e+02 + 56 1.7364604574033362e+02 -2.5754429115061833e+02 -4.3743962050161187e+01 + 57 4.2666362581864087e+02 1.5528157995541829e+02 -3.9988032807910298e+02 + 58 -3.9656744873557194e+01 7.8953170999147844e+01 2.6135222052406243e+02 + 59 -2.7594581611215335e+02 1.9891770704103524e+02 2.4122933700019283e+02 + 60 -2.5675992319678829e+02 -1.1527235824444743e+02 9.9923831048647713e+01 + 61 3.0884428120706025e+02 4.9986711220596823e+02 -1.3369013376796840e+02 + 62 2.8530678742627682e+01 5.9283151669757950e-01 -2.7403002505093650e+02 + 63 2.5296775626791694e+02 -2.7640525289662742e+02 -1.9200401038407171e+02 + 64 -8.4674586435530216e+01 -1.5736397776830248e+02 1.5637348700621067e+02 ... From daf984835ca3fe8a19348d945b265f7174081fb9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 17:31:43 -0400 Subject: [PATCH 074/352] whitespace --- doc/src/fix_qeq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index ffc85dcf3b..6992db6bca 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -134,7 +134,7 @@ may be useful for testing and benchmarking purposes, as it allows to use a fixed number of QEq iterations when *tolerance* is set to a small enough value to alway reach the *maxiter* limit. Turning off warnings will avoid the excessive output in that case. - + The *qeq/point* style describes partial charges on atoms as point charges. Interaction between a pair of charged particles is 1/r, which is the simplest description of the interaction between charges. From 2a7e662d7185d9a41be122e8c7011177fc25c49c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Apr 2021 20:14:30 -0400 Subject: [PATCH 075/352] more whitespace --- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 90 ++++----- src/KOKKOS/pair_reaxc_kokkos.cpp | 2 +- src/KOKKOS/pair_reaxc_kokkos.h | 2 +- src/QEQ/fix_qeq.cpp | 2 +- src/QEQ/fix_qeq_dynamic.cpp | 2 +- src/QEQ/fix_qeq_fire.cpp | 2 +- src/QEQ/fix_qeq_point.cpp | 10 +- src/QEQ/fix_qeq_shielded.cpp | 24 +-- src/QEQ/fix_qeq_slater.cpp | 14 +- src/USER-OMP/fix_qeq_reax_omp.cpp | 98 +++++----- src/USER-OMP/reaxc_bond_orders_omp.cpp | 184 ++++++++--------- src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp | 72 +++---- src/USER-OMP/reaxc_multi_body_omp.cpp | 8 +- src/USER-OMP/reaxc_nonbonded_omp.cpp | 4 +- src/USER-OMP/reaxc_valence_angles_omp.cpp | 8 +- src/USER-REAXC/fix_qeq_reax.cpp | 14 +- src/USER-REAXC/fix_qeq_reax.h | 6 +- src/USER-REAXC/fix_reaxc_bonds.cpp | 6 +- src/USER-REAXC/reaxc_bond_orders.cpp | 228 +++++++++++----------- src/USER-REAXC/reaxc_bonds.cpp | 20 +- src/USER-REAXC/reaxc_hydrogen_bonds.cpp | 70 +++---- src/USER-REAXC/reaxc_init_md.cpp | 2 +- src/USER-REAXC/reaxc_multi_body.cpp | 26 +-- src/USER-REAXC/reaxc_nonbonded.cpp | 4 +- src/USER-REAXC/reaxc_reset_tools.cpp | 2 +- src/USER-REAXC/reaxc_valence_angles.cpp | 158 +++++++-------- src/USER-REAXC/reaxff_api.h | 4 +- src/USER-REAXC/reaxff_defs.h | 2 +- 28 files changed, 532 insertions(+), 532 deletions(-) diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 1094d953b7..94ebd155e3 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -140,7 +140,7 @@ void FixQEqReaxKokkos::init_shielding_k() for (i = 1; i <= ntypes; ++i) for (j = 1; j <= ntypes; ++j) - k_shield.h_view(i,j) = pow( gamma[i] * gamma[j], -1.5 ); + k_shield.h_view(i,j) = pow(gamma[i] * gamma[j], -1.5); k_shield.template modify(); k_shield.template sync(); @@ -260,13 +260,13 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) FixQEqReaxKokkosMatVecFunctor matvec_functor(this); Kokkos::parallel_for(inum,matvec_functor); - // comm->forward_comm_fix(this); //Dist_vector( s ); + // comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 2; k_s.template modify(); comm->forward_comm_fix(this); k_s.template sync(); - // comm->forward_comm_fix(this); //Dist_vector( t ); + // comm->forward_comm_fix(this); //Dist_vector(t); pack_flag = 3; k_t.template modify(); comm->forward_comm_fix(this); @@ -731,7 +731,7 @@ int FixQEqReaxKokkos::cg_solve1() if (execution_space == Host) teamsize = 1; else teamsize = 128; - // sparse_matvec( &H, x, q ); + // sparse_matvec(&H, x, q); FixQEqReaxKokkosSparse12Functor sparse12_functor(this); Kokkos::parallel_for(inum,sparse12_functor); if (neighflag != FULL) { @@ -751,38 +751,38 @@ int FixQEqReaxKokkos::cg_solve1() if (neighflag != FULL) { k_o.template modify(); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->reverse_comm_fix(this); //Coll_vector(q); k_o.template sync(); } - // vector_sum( r , 1., b, -1., q, nn ); + // vector_sum(r , 1., b, -1., q, nn); // preconditioning: d[j] = r[j] * Hdia_inv[j]; - // b_norm = parallel_norm( b, nn ); + // b_norm = parallel_norm(b, nn); F_FLOAT my_norm = 0.0; FixQEqReaxKokkosNorm1Functor norm1_functor(this); Kokkos::parallel_reduce(inum,norm1_functor,my_norm); F_FLOAT norm_sqr = 0.0; - MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); b_norm = sqrt(norm_sqr); - // sig_new = parallel_dot( r, d, nn); + // sig_new = parallel_dot(r, d, nn); F_FLOAT my_dot = 0.0; FixQEqReaxKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); F_FLOAT dot_sqr = 0.0; - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); F_FLOAT sig_new = dot_sqr; int loop; for (loop = 1; (loop < imax) && (sqrt(sig_new)/b_norm > tolerance); loop++) { - // comm->forward_comm_fix(this); //Dist_vector( d ); + // comm->forward_comm_fix(this); //Dist_vector(d); pack_flag = 1; k_d.template modify(); comm->forward_comm_fix(this); k_d.template sync(); - // sparse_matvec( &H, d, q ); + // sparse_matvec(&H, d, q); FixQEqReaxKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); if (neighflag != FULL) { @@ -804,36 +804,36 @@ int FixQEqReaxKokkos::cg_solve1() if (neighflag != FULL) { k_o.template modify(); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->reverse_comm_fix(this); //Coll_vector(q); k_o.template sync(); } - // tmp = parallel_dot( d, q, nn); + // tmp = parallel_dot(d, q, nn); my_dot = dot_sqr = 0.0; FixQEqReaxKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); tmp = dot_sqr; alpha = sig_new / tmp; sig_old = sig_new; - // vector_add( s, alpha, d, nn ); - // vector_add( r, -alpha, q, nn ); + // vector_add(s, alpha, d, nn); + // vector_add(r, -alpha, q, nn); my_dot = dot_sqr = 0.0; FixQEqReaxKokkosPrecon1Functor precon1_functor(this); Kokkos::parallel_for(inum,precon1_functor); // preconditioning: p[j] = r[j] * Hdia_inv[j]; - // sig_new = parallel_dot( r, p, nn); + // sig_new = parallel_dot(r, p, nn); FixQEqReaxKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); sig_new = dot_sqr; beta = sig_new / sig_old; - // vector_sum( d, 1., p, beta, d, nn ); + // vector_sum(d, 1., p, beta, d, nn); FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); } @@ -859,7 +859,7 @@ int FixQEqReaxKokkos::cg_solve2() if (execution_space == Host) teamsize = 1; else teamsize = 128; - // sparse_matvec( &H, x, q ); + // sparse_matvec(&H, x, q); FixQEqReaxKokkosSparse32Functor sparse32_functor(this); Kokkos::parallel_for(inum,sparse32_functor); if (neighflag != FULL) { @@ -881,38 +881,38 @@ int FixQEqReaxKokkos::cg_solve2() if (neighflag != FULL) { k_o.template modify(); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->reverse_comm_fix(this); //Coll_vector(q); k_o.template sync(); } - // vector_sum( r , 1., b, -1., q, nn ); + // vector_sum(r , 1., b, -1., q, nn); // preconditioning: d[j] = r[j] * Hdia_inv[j]; - // b_norm = parallel_norm( b, nn ); + // b_norm = parallel_norm(b, nn); F_FLOAT my_norm = 0.0; FixQEqReaxKokkosNorm2Functor norm2_functor(this); Kokkos::parallel_reduce(inum,norm2_functor,my_norm); F_FLOAT norm_sqr = 0.0; - MPI_Allreduce( &my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); b_norm = sqrt(norm_sqr); - // sig_new = parallel_dot( r, d, nn); + // sig_new = parallel_dot(r, d, nn); F_FLOAT my_dot = 0.0; FixQEqReaxKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); F_FLOAT dot_sqr = 0.0; - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); F_FLOAT sig_new = dot_sqr; int loop; for (loop = 1; (loop < imax) && (sqrt(sig_new)/b_norm > tolerance); loop++) { - // comm->forward_comm_fix(this); //Dist_vector( d ); + // comm->forward_comm_fix(this); //Dist_vector(d); pack_flag = 1; k_d.template modify(); comm->forward_comm_fix(this); k_d.template sync(); - // sparse_matvec( &H, d, q ); + // sparse_matvec(&H, d, q); FixQEqReaxKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); if (neighflag != FULL) { @@ -934,36 +934,36 @@ int FixQEqReaxKokkos::cg_solve2() if (neighflag != FULL) { k_o.template modify(); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->reverse_comm_fix(this); //Coll_vector(q); k_o.template sync(); } - // tmp = parallel_dot( d, q, nn); + // tmp = parallel_dot(d, q, nn); my_dot = dot_sqr = 0.0; FixQEqReaxKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); tmp = dot_sqr; alpha = sig_new / tmp; sig_old = sig_new; - // vector_add( t, alpha, d, nn ); - // vector_add( r, -alpha, q, nn ); + // vector_add(t, alpha, d, nn); + // vector_add(r, -alpha, q, nn); my_dot = dot_sqr = 0.0; FixQEqReaxKokkosPrecon2Functor precon2_functor(this); Kokkos::parallel_for(inum,precon2_functor); // preconditioning: p[j] = r[j] * Hdia_inv[j]; - // sig_new = parallel_dot( r, p, nn); + // sig_new = parallel_dot(r, p, nn); FixQEqReaxKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); - MPI_Allreduce( &my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); sig_new = dot_sqr; beta = sig_new / sig_old; - // vector_sum( d, 1., p, beta, d, nn ); + // vector_sum(d, 1., p, beta, d, nn); FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); } @@ -984,18 +984,18 @@ void FixQEqReaxKokkos::calculate_q() F_FLOAT sum, sum_all; const int inum = list->inum; - // s_sum = parallel_vector_acc( s, nn ); + // s_sum = parallel_vector_acc(s, nn); sum = sum_all = 0.0; FixQEqReaxKokkosVecAcc1Functor vecacc1_functor(this); Kokkos::parallel_reduce(inum,vecacc1_functor,sum); - MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world); const F_FLOAT s_sum = sum_all; - // t_sum = parallel_vector_acc( t, nn); + // t_sum = parallel_vector_acc(t, nn); sum = sum_all = 0.0; FixQEqReaxKokkosVecAcc2Functor vecacc2_functor(this); Kokkos::parallel_reduce(inum,vecacc2_functor,sum); - MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world ); + MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world); const F_FLOAT t_sum = sum_all; // u = s_sum / t_sum; @@ -1007,7 +1007,7 @@ void FixQEqReaxKokkos::calculate_q() atomKK->modified(execution_space,Q_MASK); pack_flag = 4; - //comm->forward_comm_fix( this ); //Dist_vector( atom->q ); + //comm->forward_comm_fix(this); //Dist_vector(atom->q); comm->forward_comm_fix(this); } @@ -1382,11 +1382,11 @@ KOKKOS_INLINE_FUNCTION void FixQEqReaxKokkos::operator()(TagFixQEqReaxUnpackForwardComm, const int &i) const { if (pack_flag == 1) d_d[i + first] = d_buf[i]; - else if ( pack_flag == 2) + else if (pack_flag == 2) d_s[i + first] = d_buf[i]; - else if ( pack_flag == 3) + else if (pack_flag == 3) d_t[i + first] = d_buf[i]; - else if ( pack_flag == 4) + else if (pack_flag == 4) q[i + first] = d_buf[i]; } diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 04c70342ed..a5caad9fd2 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -2389,7 +2389,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular tdual_int_1d; Kokkos::DualView k_params_sing; diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index d6fe12abf8..d7e449492e 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -434,7 +434,7 @@ void FixQEq::sparse_matvec(sparse_matrix *A, double *x, double *b) for (i = 0; i < nlocal; ++i) { if (atom->mask[i] & groupbit) - b[i] = eta[ atom->type[i] ] * x[i]; + b[i] = eta[atom->type[i]] * x[i]; } for (i = nlocal; i < nall; ++i) { diff --git a/src/QEQ/fix_qeq_dynamic.cpp b/src/QEQ/fix_qeq_dynamic.cpp index 5af7a4c9a0..4580b506b8 100644 --- a/src/QEQ/fix_qeq_dynamic.cpp +++ b/src/QEQ/fix_qeq_dynamic.cpp @@ -266,7 +266,7 @@ void FixQEqDynamic::unpack_forward_comm(int n, int first, double *buf) if (pack_flag == 1) for (m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; - else if ( pack_flag == 2) + else if (pack_flag == 2) for (m = 0, i = first; m < n; m++, i++) qf[i] = buf[m]; } diff --git a/src/QEQ/fix_qeq_fire.cpp b/src/QEQ/fix_qeq_fire.cpp index 0e89ee3d17..7cd3c6ce71 100644 --- a/src/QEQ/fix_qeq_fire.cpp +++ b/src/QEQ/fix_qeq_fire.cpp @@ -326,7 +326,7 @@ void FixQEqFire::unpack_forward_comm(int n, int first, double *buf) if (pack_flag == 1) for (m = 0, i = first; m < n; m++, i++) atom->q[i] = buf[m]; - else if ( pack_flag == 2) + else if (pack_flag == 2) for (m = 0, i = first; m < n; m++, i++) qf[i] = buf[m]; } diff --git a/src/QEQ/fix_qeq_point.cpp b/src/QEQ/fix_qeq_point.cpp index 8d60585773..faca995a69 100644 --- a/src/QEQ/fix_qeq_point.cpp +++ b/src/QEQ/fix_qeq_point.cpp @@ -109,18 +109,18 @@ void FixQEqPoint::init_matvec() for (ii = 0; ii < inum; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -( chi[atom->type[i]] + chizj[i] ); + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -(chi[atom->type[i]] + chizj[i]); b_t[i] = -1.0; - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); } } pack_flag = 2; - comm->forward_comm_fix(this); //Dist_vector( s ); + comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 3; - comm->forward_comm_fix(this); //Dist_vector( t ); + comm->forward_comm_fix(this); //Dist_vector(t); } /* ---------------------------------------------------------------------- */ diff --git a/src/QEQ/fix_qeq_shielded.cpp b/src/QEQ/fix_qeq_shielded.cpp index 351700057b..8b218f4028 100644 --- a/src/QEQ/fix_qeq_shielded.cpp +++ b/src/QEQ/fix_qeq_shielded.cpp @@ -108,7 +108,7 @@ void FixQEqShielded::init_shielding() int ntypes = atom->ntypes; for (i = 1; i <= ntypes; ++i) for (j = 1; j <= ntypes; ++j) - shld[i][j] = pow( gamma[i] * gamma[j], -1.5 ); + shld[i][j] = pow(gamma[i] * gamma[j], -1.5); if (fabs(swa) > 0.01 && comm->me == 0) error->warning(FLERR,"Fix qeq has non-zero lower Taper radius cutoff"); @@ -117,7 +117,7 @@ void FixQEqShielded::init_shielding() else if (swb < 5 && comm->me == 0) error->warning(FLERR,"Fix qeq has very low Taper radius cutoff"); - d7 = pow( swb - swa, 7 ); + d7 = pow(swb - swa, 7); swa2 = swa*swa; swa3 = swa2*swa; swb2 = swb*swb; @@ -126,12 +126,12 @@ void FixQEqShielded::init_shielding() Tap[7] = 20.0 / d7; Tap[6] = -70.0 * (swa + swb) / d7; Tap[5] = 84.0 * (swa2 + 3.0*swa*swb + swb2) / d7; - Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3 ) / d7; - Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3 ) / d7; + Tap[4] = -35.0 * (swa3 + 9.0*swa2*swb + 9.0*swa*swb2 + swb3) / d7; + Tap[3] = 140.0 * (swa3*swb + 3.0*swa2*swb2 + swa*swb3) / d7; Tap[2] =-210.0 * (swa3*swb2 + swa2*swb3) / d7; Tap[1] = 140.0 * swa3 * swb3 / d7; Tap[0] = (-35.0*swa3*swb2*swb2 + 21.0*swa2*swb3*swb2 - - 7.0*swa*swb3*swb3 + swb3*swb3*swb ) / d7; + 7.0*swa*swb3*swb3 + swb3*swb3*swb) / d7; } /* ---------------------------------------------------------------------- */ @@ -171,18 +171,18 @@ void FixQEqShielded::init_matvec() for (ii = 0; ii < inum; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -( chi[atom->type[i]] + chizj[i] ); + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -(chi[atom->type[i]] + chizj[i]); b_t[i] = -1.0; - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); } } pack_flag = 2; - comm->forward_comm_fix(this); //Dist_vector( s ); + comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 3; - comm->forward_comm_fix(this); //Dist_vector( t ); + comm->forward_comm_fix(this); //Dist_vector(t); } /* ---------------------------------------------------------------------- */ @@ -225,7 +225,7 @@ void FixQEqShielded::compute_H() if (r_sqr <= cutoff_sq) { H.jlist[m_fill] = j; r = sqrt(r_sqr); - H.val[m_fill] = 0.5 * calculate_H( r, shld[type[i]][type[j]] ); + H.val[m_fill] = 0.5 * calculate_H(r, shld[type[i]][type[j]]); m_fill++; } } @@ -240,7 +240,7 @@ void FixQEqShielded::compute_H() /* ---------------------------------------------------------------------- */ -double FixQEqShielded::calculate_H( double r, double gamma ) +double FixQEqShielded::calculate_H(double r, double gamma) { double Taper, denom; diff --git a/src/QEQ/fix_qeq_slater.cpp b/src/QEQ/fix_qeq_slater.cpp index da0d2090cf..975caf5c81 100644 --- a/src/QEQ/fix_qeq_slater.cpp +++ b/src/QEQ/fix_qeq_slater.cpp @@ -147,18 +147,18 @@ void FixQEqSlater::init_matvec() for (ii = 0; ii < inum; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) { - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -( chi[atom->type[i]] + chizj[i] ); + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -(chi[atom->type[i]] + chizj[i]); b_t[i] = -1.0; - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); } } pack_flag = 2; - comm->forward_comm_fix(this); //Dist_vector( s ); + comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 3; - comm->forward_comm_fix(this); //Dist_vector( t ); + comm->forward_comm_fix(this); //Dist_vector(t); } /* ---------------------------------------------------------------------- */ @@ -346,7 +346,7 @@ double FixQEqSlater::calculate_H_wolf(double zei, double zej, double zj, /* ---------------------------------------------------------------------- */ -void FixQEqSlater::sparse_matvec( sparse_matrix *A, double *x, double *b ) +void FixQEqSlater::sparse_matvec(sparse_matrix *A, double *x, double *b) { int i, j, itr_j; @@ -368,7 +368,7 @@ void FixQEqSlater::sparse_matvec( sparse_matrix *A, double *x, double *b ) for (i = 0; i < nlocal; ++i) { if (atom->mask[i] & groupbit) { - for( itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { + for(itr_j=A->firstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; b[i] += A->val[itr_j] * x[j]; b[j] += A->val[itr_j] * x[i]; diff --git a/src/USER-OMP/fix_qeq_reax_omp.cpp b/src/USER-OMP/fix_qeq_reax_omp.cpp index 52e9565a46..b4a878f126 100644 --- a/src/USER-OMP/fix_qeq_reax_omp.cpp +++ b/src/USER-OMP/fix_qeq_reax_omp.cpp @@ -212,7 +212,7 @@ void FixQEqReaxOMP::compute_H() if (flag) { H.jlist[mfill] = j; - H.val[mfill] = calculate_H( sqrt(r_sqr), shld[type[i]][type[j]] ); + H.val[mfill] = calculate_H(sqrt(r_sqr), shld[type[i]][type[j]]); mfill++; } } @@ -307,8 +307,8 @@ void FixQEqReaxOMP::init_matvec() if (atom->mask[i] & groupbit) { /* init pre-conditioner for H and init solution vectors */ - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -chi[ atom->type[i] ]; + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi[atom->type[i]]; b_t[i] = -1.0; // Predictor Step @@ -335,8 +335,8 @@ void FixQEqReaxOMP::init_matvec() if (atom->mask[i] & groupbit) { /* init pre-conditioner for H and init solution vectors */ - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -chi[ atom->type[i] ]; + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi[atom->type[i]]; b_t[i] = -1.0; /* linear extrapolation for s & t from previous solutions */ @@ -344,8 +344,8 @@ void FixQEqReaxOMP::init_matvec() //t[i] = 2 * t_hist[i][0] - t_hist[i][1]; /* quadratic extrapolation for s & t from previous solutions */ - //s[i] = s_hist[i][2] + 3 * ( s_hist[i][0] - s_hist[i][1] ); - t[i] = t_hist[i][2] + 3 * ( t_hist[i][0] - t_hist[i][1] ); + //s[i] = s_hist[i][2] + 3 * (s_hist[i][0] - s_hist[i][1]); + t[i] = t_hist[i][2] + 3 * (t_hist[i][0] - t_hist[i][1]); /* cubic extrapolation for s & t from previous solutions */ s[i] = 4*(s_hist[i][0]+s_hist[i][2])-(6*s_hist[i][1]+s_hist[i][3]); @@ -355,14 +355,14 @@ void FixQEqReaxOMP::init_matvec() } pack_flag = 2; - comm->forward_comm_fix(this); //Dist_vector( s ); + comm->forward_comm_fix(this); //Dist_vector(s); pack_flag = 3; - comm->forward_comm_fix(this); //Dist_vector( t ); + comm->forward_comm_fix(this); //Dist_vector(t); } /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::CG( double *b, double *x) +int FixQEqReaxOMP::CG(double *b, double *x) { int i; double alpha, beta, b_norm; @@ -371,8 +371,8 @@ int FixQEqReaxOMP::CG( double *b, double *x) double my_buf[2], buf[2]; pack_flag = 1; - sparse_matvec( &H, x, q ); - comm->reverse_comm_fix( this); //Coll_Vector( q ); + sparse_matvec(&H, x, q); + comm->reverse_comm_fix(this); //Coll_Vector(q); double tmp1, tmp2; tmp1 = tmp2 = 0.0; @@ -400,9 +400,9 @@ int FixQEqReaxOMP::CG( double *b, double *x) sig_new = buf[1]; for (i = 1; i < imax && sqrt(sig_new) / b_norm > tolerance; ++i) { - comm->forward_comm_fix(this); //Dist_vector( d ); - sparse_matvec( &H, d, q ); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->forward_comm_fix(this); //Dist_vector(d); + sparse_matvec(&H, d, q); + comm->reverse_comm_fix(this); //Coll_vector(q); tmp1 = 0.0; #if defined(_OPENMP) @@ -471,7 +471,7 @@ int FixQEqReaxOMP::CG( double *b, double *x) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b) +void FixQEqReaxOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -491,7 +491,7 @@ void FixQEqReaxOMP::sparse_matvec( sparse_matrix *A, double *x, double *b) #endif for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; - if (atom->mask[i] & groupbit) b[i] = eta[ atom->type[i] ] * x[i]; + if (atom->mask[i] & groupbit) b[i] = eta[atom->type[i]] * x[i]; } #if defined(_OPENMP) @@ -586,12 +586,12 @@ void FixQEqReaxOMP::calculate_Q() } pack_flag = 4; - comm->forward_comm_fix( this); //Dist_vector( atom->q ); + comm->forward_comm_fix(this); //Dist_vector(atom->q); } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, +void FixQEqReaxOMP::vector_sum(double* dest, double c, double* v, double d, double* y, int k) { int i; @@ -607,7 +607,7 @@ void FixQEqReaxOMP::vector_sum( double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k) +void FixQEqReaxOMP::vector_add(double* dest, double c, double* v, int k) { int i; @@ -626,7 +626,7 @@ void FixQEqReaxOMP::vector_add( double* dest, double c, double* v, int k) /* dual CG support */ /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) +int FixQEqReaxOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) { int i; double alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; @@ -635,8 +635,8 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) double my_buf[4], buf[4]; pack_flag = 5; // forward 2x d and reverse 2x q - dual_sparse_matvec( &H, x1, x2, q ); - comm->reverse_comm_fix(this); //Coll_Vector( q ); + dual_sparse_matvec(&H, x1, x2, q); + comm->reverse_comm_fix(this); //Coll_Vector(q); double tmp1, tmp2, tmp3, tmp4; tmp1 = tmp2 = tmp3 = tmp4 = 0.0; @@ -648,16 +648,16 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) int ii = ilist[jj]; if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; - r[indxI ] = b1[ii] - q[indxI ]; + r[indxI] = b1[ii] - q[indxI]; r[indxI+1] = b2[ii] - q[indxI+1]; - d[indxI ] = r[indxI ] * Hdia_inv[ii]; //pre-condition + d[indxI] = r[indxI] * Hdia_inv[ii]; //pre-condition d[indxI+1] = r[indxI+1] * Hdia_inv[ii]; tmp1 += b1[ii] * b1[ii]; tmp2 += b2[ii] * b2[ii]; - tmp3 += r[indxI ] * d[indxI ]; + tmp3 += r[indxI] * d[indxI]; tmp4 += r[indxI+1] * d[indxI+1]; } } @@ -676,9 +676,9 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) sig_new_t = buf[3]; for (i = 1; i < imax; ++i) { - comm->forward_comm_fix(this); //Dist_vector( d ); - dual_sparse_matvec( &H, d, q ); - comm->reverse_comm_fix(this); //Coll_vector( q ); + comm->forward_comm_fix(this); //Dist_vector(d); + dual_sparse_matvec(&H, d, q); + comm->reverse_comm_fix(this); //Coll_vector(q); tmp1 = tmp2 = 0.0; #if defined(_OPENMP) @@ -693,7 +693,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) int ii = ilist[jj]; if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; - tmp1 += d[indxI ] * q[indxI ]; + tmp1 += d[indxI] * q[indxI]; tmp2 += d[indxI+1] * q[indxI+1]; } } @@ -722,17 +722,17 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) int ii = ilist[jj]; if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; - x1[ii] += alpha_s * d[indxI ]; + x1[ii] += alpha_s * d[indxI]; x2[ii] += alpha_t * d[indxI+1]; - r[indxI ] -= alpha_s * q[indxI ]; + r[indxI] -= alpha_s * q[indxI]; r[indxI+1] -= alpha_t * q[indxI+1]; // pre-conditioning - p[indxI ] = r[indxI ] * Hdia_inv[ii]; + p[indxI] = r[indxI] * Hdia_inv[ii]; p[indxI+1] = r[indxI+1] * Hdia_inv[ii]; - tmp1 += r[indxI ] * p[indxI ]; + tmp1 += r[indxI] * p[indxI]; tmp2 += r[indxI+1] * p[indxI+1]; } } @@ -763,7 +763,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) if (atom->mask[ii] & groupbit) { int indxI = 2 * ii; - d[indxI ] = p[indxI ] + beta_s * d[indxI ]; + d[indxI] = p[indxI] + beta_s * d[indxI]; d[indxI+1] = p[indxI+1] + beta_t * d[indxI+1]; } } @@ -798,7 +798,7 @@ int FixQEqReaxOMP::dual_CG( double *b1, double *b2, double *x1, double *x2) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2, double *b) +void FixQEqReaxOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x2, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -822,8 +822,8 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; - b[indxI ] = eta[ atom->type[i] ] * x1[i]; - b[indxI+1] = eta[ atom->type[i] ] * x2[i]; + b[indxI] = eta[atom->type[i]] * x1[i]; + b[indxI+1] = eta[atom->type[i]] * x2[i]; } } @@ -845,7 +845,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t=0; tfirstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; indxJ = 2 * j; - b[indxI ] += A->val[itr_j] * x1[j]; + b[indxI] += A->val[itr_j] * x1[j]; b[indxI+1] += A->val[itr_j] * x2[j]; - b_temp[tid][indxJ ] += A->val[itr_j] * x1[i]; + b_temp[tid][indxJ] += A->val[itr_j] * x1[i]; b_temp[tid][indxJ+1] += A->val[itr_j] * x2[i]; } } @@ -879,7 +879,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { - b[indxI ] += b_temp[t][indxI ]; + b[indxI] += b_temp[t][indxI]; b[indxI+1] += b_temp[t][indxI+1]; } } @@ -889,7 +889,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x1, double *x2 /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) +void FixQEqReaxOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -913,8 +913,8 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) i = ilist[ii]; if (atom->mask[i] & groupbit) { indxI = 2 * i; - b[indxI ] = eta[ atom->type[i] ] * x[indxI ]; - b[indxI+1] = eta[ atom->type[i] ] * x[indxI+1]; + b[indxI] = eta[atom->type[i]] * x[indxI]; + b[indxI+1] = eta[atom->type[i]] * x[indxI+1]; } } @@ -936,7 +936,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t=0; tfirstnbr[i]; itr_jfirstnbr[i]+A->numnbrs[i]; itr_j++) { j = A->jlist[itr_j]; indxJ = 2 * j; - b[indxI ] += A->val[itr_j] * x[indxJ ]; + b[indxI] += A->val[itr_j] * x[indxJ]; b[indxI+1] += A->val[itr_j] * x[indxJ+1]; - b_temp[tid][indxJ ] += A->val[itr_j] * x[indxI ]; + b_temp[tid][indxJ] += A->val[itr_j] * x[indxI]; b_temp[tid][indxJ+1] += A->val[itr_j] * x[indxI+1]; } } @@ -970,7 +970,7 @@ void FixQEqReaxOMP::dual_sparse_matvec( sparse_matrix *A, double *x, double *b ) for (i = 0; i < NN; ++i) { indxI = 2 * i; for (int t = 0; t < nthreads; ++t) { - b[indxI ] += b_temp[t][indxI ]; + b[indxI] += b_temp[t][indxI]; b[indxI+1] += b_temp[t][indxI+1]; } } diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index c3c1fb37df..6434c3d03a 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -58,7 +58,7 @@ namespace ReaxFF { nbr_j = &(bonds->select.bond_list[pj]); j = nbr_j->nbr; bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); double c = bo_ij->Cdbo + bo_ji->Cdbo; coef.C1dbo = bo_ij->C1dbo * c; @@ -83,19 +83,19 @@ namespace ReaxFF { coef.C3dDelta = bo_ij->C3dbo * c; c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp ); + rvec_Scale( temp, c, bo_ij->dBOp); c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); - rvec_ScaledAdd( temp, c, workspace->dDeltap_self[i] ); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[i]); - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); - rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+i],temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fi_tmp, -1.0, temp); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, fi_tmp[0],fi_tmp[1],fi_tmp[2], @@ -103,20 +103,20 @@ namespace ReaxFF { } c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp ); + rvec_Scale( temp, c, bo_ij->dBOp); c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); - rvec_ScaledAdd( temp, c, workspace->dDeltap_self[j] ); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[j]); - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); - rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+j],temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fj_tmp, -1.0, temp); - rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); + rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, fj_tmp[0],fj_tmp[1],fj_tmp[2], @@ -128,15 +128,15 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); rvec_Scale(temp, c, nbr_k->bo_data.dBOp); - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fk_tmp, -1.0, temp); @@ -158,15 +158,15 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); - // rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); + // rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); rvec_Scale(temp, c, nbr_k->bo_data.dBOp); - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fk_tmp, -1.0, temp); @@ -203,7 +203,7 @@ namespace ReaxFF { nbr_j = &(bonds->select.bond_list[pj]); j = nbr_j->nbr; bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); @@ -238,59 +238,59 @@ namespace ReaxFF { rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); } /* then atom i itself */ - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + rvec_Scale(temp, coef.C1dbo, bo_ij->dBOp); /*1st,dBO*/ + rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); /*2nd,dBO*/ + rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); /*1st,dBO*/ + rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]);/*2nd,dBO*/ + rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ + rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ + rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ + rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBO_pi2*/ + rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBO_pi2*/ + rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]);/*3rd*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+i],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+i],temp); for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ + rvec_Scale(temp, -coef.C3dbo, nbr_k->bo_data.dBOp); /*3rd,dBO*/ + rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); } /* then atom j itself */ - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ + rvec_Scale(temp, -coef.C1dbo, bo_ij->dBOp); /*1st, dBO*/ + rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); /*2nd, dBO*/ + rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); /*1st, dBO*/ + rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ + rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ - rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ + rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBOpi2*/ + rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBOpi2*/ + rvec_ScaledAdd(temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+j],temp ); + rvec_Add(workspace->forceReduction[reductionOffset+j],temp); } /* ---------------------------------------------------------------------- */ - int BOp_OMP( storage * /* workspace */, reax_list *bonds, double bo_cut, + int BOp_OMP(storage * /* workspace */, reax_list *bonds, double bo_cut, int i, int btop_i, far_neighbor_data *nbr_pj, single_body_parameters * /* sbp_i */, single_body_parameters * /* sbp_j */, two_body_parameters *twbp, @@ -309,24 +309,24 @@ namespace ReaxFF { /* Initially BO values are the uncorrected ones, page 1 */ /****** bonds i-j and j-i ******/ - ibond = &( bonds->select.bond_list[btop_i] ); - jbond = &( bonds->select.bond_list[btop_j] ); + ibond = &(bonds->select.bond_list[btop_i]); + jbond = &(bonds->select.bond_list[btop_j]); ibond->nbr = j; jbond->nbr = i; ibond->d = nbr_pj->d; jbond->d = nbr_pj->d; - rvec_Copy( ibond->dvec, nbr_pj->dvec ); - rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); - ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); - ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); + rvec_Copy(ibond->dvec, nbr_pj->dvec); + rvec_Scale(jbond->dvec, -1, nbr_pj->dvec); + ivec_Copy(ibond->rel_box, nbr_pj->rel_box); + ivec_Scale(jbond->rel_box, -1, nbr_pj->rel_box); ibond->dbond_index = btop_i; jbond->dbond_index = btop_i; ibond->sym_index = btop_j; jbond->sym_index = btop_i; - bo_ij = &( ibond->bo_data ); - bo_ji = &( jbond->bo_data ); + bo_ij = &(ibond->bo_data); + bo_ji = &(jbond->bo_data); bo_ji->BO = bo_ij->BO = BO; bo_ji->BO_s = bo_ij->BO_s = BO_s; bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; @@ -344,14 +344,14 @@ namespace ReaxFF { rvec_Scale(bo_ij->dln_BOp_pi2, -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); - rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); - rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi); + rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2); - rvec_Scale( bo_ij->dBOp, + rvec_Scale(bo_ij->dBOp, -(bo_ij->BO_s * Cln_BOp_s + bo_ij->BO_pi * Cln_BOp_pi + - bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); - rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec); + rvec_Scale(bo_ji->dBOp, -1., bo_ij->dBOp); bo_ij->BO_s -= bo_cut; bo_ij->BO -= bo_cut; @@ -366,7 +366,7 @@ namespace ReaxFF { /* ---------------------------------------------------------------------- */ - void BOOMP( reax_system *system, storage *workspace, reax_list **lists) + void BOOMP(reax_system *system, storage *workspace, reax_list **lists) { double p_lp1 = system->reax_param.gp.l[15]; double p_boc1 = system->reax_param.gp.l[0]; @@ -428,10 +428,10 @@ namespace ReaxFF { j = bonds->select.bond_list[pj].nbr; type_j = system->my_atoms[j].type; if (type_j < 0) continue; - bo_ij = &( bonds->select.bond_list[pj].bo_data ); + bo_ij = &(bonds->select.bond_list[pj].bo_data); if (i < j || workspace->bond_mark[j] > 3) { - twbp = &( system->reax_param.tbp[type_i][type_j] ); + twbp = &(system->reax_param.tbp[type_i][type_j]); if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { bo_ij->C1dbo = 1.000000; @@ -456,38 +456,38 @@ namespace ReaxFF { /* on page 1 */ if (twbp->ovc >= 0.001) { /* Correction for overcoordination */ - exp_p1i = exp( -p_boc1 * Deltap_i ); - exp_p2i = exp( -p_boc2 * Deltap_i ); - exp_p1j = exp( -p_boc1 * Deltap_j ); - exp_p2j = exp( -p_boc2 * Deltap_j ); + exp_p1i = exp(-p_boc1 * Deltap_i); + exp_p2i = exp(-p_boc2 * Deltap_i); + exp_p1j = exp(-p_boc1 * Deltap_j); + exp_p2j = exp(-p_boc2 * Deltap_j); f2 = exp_p1i + exp_p1j; - f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); - f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + - ( val_j + f2 )/( val_j + f2 + f3 ) ); + f3 = -1.0 / p_boc2 * log(0.5 * (exp_p2i + exp_p2j)); + f1 = 0.5 * ((val_i + f2)/(val_i + f2 + f3) + + (val_j + f2)/(val_j + f2 + f3)); /* Now come the derivates */ /* Bond Order pages 5-7, derivative of f1 */ temp = f2 + f3; u1_ij = val_i + temp; u1_ji = val_j + temp; - Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + - 1.0 / SQR( u1_ji )); - Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + - ( u1_ji - f3 ) / SQR( u1_ji )); + Cf1A_ij = 0.5 * f3 * (1.0 / SQR(u1_ij) + + 1.0 / SQR(u1_ji)); + Cf1B_ij = -0.5 * ((u1_ij - f3) / SQR(u1_ij) + + (u1_ji - f3) / SQR(u1_ji)); - Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - + Cf1_ij = 0.50 * (-p_boc1 * exp_p1i / u1_ij - ((val_i+f2) / SQR(u1_ij)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) ) + + (-p_boc1 * exp_p1i + + exp_p2i / (exp_p2i + exp_p2j)) + -p_boc1 * exp_p1i / u1_ji - ((val_j+f2) / SQR(u1_ji)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) )); + (-p_boc1 * exp_p1i + + exp_p2i / (exp_p2i + exp_p2j))); Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + - Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); + Cf1B_ij * exp_p2j / (exp_p2i + exp_p2j); } else { /* No overcoordination correction! */ f1 = 1.0; @@ -496,9 +496,9 @@ namespace ReaxFF { if (twbp->v13cor >= 0.001) { /* Correction for 1-3 bond orders */ - exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + exp_f4 =exp(-(twbp->p_boc4 * SQR(bo_ij->BO) - Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); - exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + exp_f5 =exp(-(twbp->p_boc4 * SQR(bo_ij->BO) - Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); f4 = 1. / (1. + exp_f4); @@ -526,7 +526,7 @@ namespace ReaxFF { bo_ij->BO = bo_ij->BO * A0_ij; bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; - bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + bo_ij->BO_s = bo_ij->BO - (bo_ij->BO_pi + bo_ij->BO_pi2); bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; bo_ij->C2dbo = bo_ij->BO * A2_ij; @@ -585,8 +585,8 @@ namespace ReaxFF { everything else is set in uncorrected_bo calculations */ sym_index = bonds->select.bond_list[pj].sym_index; - bo_ij = &( bonds->select.bond_list[pj].bo_data ); - bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + bo_ij = &(bonds->select.bond_list[pj].bo_data); + bo_ji = &(bonds->select.bond_list[sym_index].bo_data); bo_ij->BO = bo_ji->BO; bo_ij->BO_s = bo_ji->BO_s; bo_ij->BO_pi = bo_ji->BO_pi; @@ -612,7 +612,7 @@ namespace ReaxFF { for (j = 0; j < system->N; ++j) { type_j = system->my_atoms[j].type; if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[ type_j ]); + sbp_j = &(system->reax_param.sbp[type_j]); workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; diff --git a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp index 8c9ffe577e..5ce70b74fb 100644 --- a/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/USER-OMP/reaxc_hydrogen_bonds_omp.cpp @@ -41,7 +41,7 @@ namespace ReaxFF { /* ---------------------------------------------------------------------- */ - void Hydrogen_BondsOMP( reax_system *system, control_params *control, + void Hydrogen_BondsOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists) { @@ -105,20 +105,20 @@ namespace ReaxFF { type_j = system->my_atoms[j].type; start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); - hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); + hb_start_j = Start_Index(system->my_atoms[j].Hindex, hbonds); + hb_end_j = End_Index(system->my_atoms[j].Hindex, hbonds); if (type_j < 0) continue; top = 0; for (pi = start_j; pi < end_j; ++pi) { - pbond_ij = &( bond_list[pi] ); + pbond_ij = &(bond_list[pi]); i = pbond_ij->nbr; type_i = system->my_atoms[i].type; if (type_i < 0) continue; bo_ij = &(pbond_ij->bo_data); - if ( system->reax_param.sbp[type_i].p_hbond == 2 && - bo_ij->BO >= HB_THRESHOLD ) + if (system->reax_param.sbp[type_i].p_hbond == 2 && + bo_ij->BO >= HB_THRESHOLD) hblist[top++] = pi; } @@ -129,35 +129,35 @@ namespace ReaxFF { if (type_k < 0) continue; nbr_jk = hbond_list[pk].ptr; r_jk = nbr_jk->d; - rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); + rvec_Scale(dvec_jk, hbond_list[pk].scl, nbr_jk->dvec); for (itr = 0; itr < top; ++itr) { pi = hblist[itr]; - pbond_ij = &( bonds->select.bond_list[pi] ); + pbond_ij = &(bonds->select.bond_list[pi]); i = pbond_ij->nbr; if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { bo_ij = &(pbond_ij->bo_data); type_i = system->my_atoms[i].type; if (type_i < 0) continue; - hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); + hbp = &(system->reax_param.hbp[type_i][type_j][type_k]); ++num_hb_intrs; - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &theta, &cos_theta ); + Calculate_Theta(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &theta, &cos_theta); /* the derivative of cos(theta) */ - Calculate_dCos_ThetaOMP( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + Calculate_dCos_ThetaOMP(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, &dcos_theta_di, &dcos_theta_dj, - &dcos_theta_dk ); + &dcos_theta_dk); /* hydrogen bond energy*/ - sin_theta2 = sin( theta/2.0 ); + sin_theta2 = sin(theta/2.0); sin_xhz4 = SQR(sin_theta2); sin_xhz4 *= sin_xhz4; - cos_xhz1 = ( 1.0 - cos_theta ); - exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); - exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + - r_jk / hbp->r0_hb - 2.0 ) ); + cos_xhz1 = (1.0 - cos_theta); + exp_hb2 = exp(-hbp->p_hb2 * bo_ij->BO); + exp_hb3 = exp(-hbp->p_hb3 * (hbp->r0_hb / r_jk + + r_jk / hbp->r0_hb - 2.0)); e_hb_thr += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; @@ -171,38 +171,38 @@ namespace ReaxFF { if (control->virial == 0) { // dcos terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk); // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk ); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk); } else { /* for pressure coupling, terms that are not related to bond order derivatives are added directly into pressure vector/tensor */ - rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms - rvec_Add(workspace->forceReduction[reductionOffset+i], force ); + rvec_Scale(force, +CEhb2, dcos_theta_di); // dcos terms + rvec_Add(workspace->forceReduction[reductionOffset+i], force); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj); - ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); - rvec_Scale( force, +CEhb2, dcos_theta_dk ); - rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + ivec_Scale(rel_jk, hbond_list[pk].scl, nbr_jk->rel_box); + rvec_Scale(force, +CEhb2, dcos_theta_dk); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk); - rvec_Scale( force, CEhb3/r_jk, dvec_jk ); - rvec_Add(workspace->forceReduction[reductionOffset+k], force ); + rvec_Scale(force, CEhb3/r_jk, dvec_jk); + rvec_Add(workspace->forceReduction[reductionOffset+k], force); } /* tally into per-atom virials */ if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - rvec_ScaledSum( delij, 1., system->my_atoms[j].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, - -1., system->my_atoms[k].x ); + rvec_ScaledSum(delij, 1., system->my_atoms[j].x, + -1., system->my_atoms[i].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[j].x, + -1., system->my_atoms[k].x); rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); diff --git a/src/USER-OMP/reaxc_multi_body_omp.cpp b/src/USER-OMP/reaxc_multi_body_omp.cpp index 2ec73e738b..7a24ac5fce 100644 --- a/src/USER-OMP/reaxc_multi_body_omp.cpp +++ b/src/USER-OMP/reaxc_multi_body_omp.cpp @@ -93,7 +93,7 @@ namespace ReaxFF { for (i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + sbp_i = &(system->reax_param.sbp[type_i]); /* lone-pair Energy */ p_lp2 = sbp_i->p_lp2; @@ -158,7 +158,7 @@ namespace ReaxFF { for (i = 0; i < system->n; ++i) { type_i = system->my_atoms[i].type; if (type_i < 0) continue; - sbp_i = &(system->reax_param.sbp[ type_i ]); + sbp_i = &(system->reax_param.sbp[type_i]); /* over-coordination energy */ if (sbp_i->mass > 21.0) @@ -172,7 +172,7 @@ namespace ReaxFF { type_j = system->my_atoms[j].type; if (type_j < 0) continue; bo_ij = &(bonds->select.bond_list[pj].bo_data); - twbp = &(system->reax_param.tbp[ type_i ][ type_j ]); + twbp = &(system->reax_param.tbp[type_i][type_j]); sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* @@ -243,7 +243,7 @@ namespace ReaxFF { pbond = &(bonds->select.bond_list[pj]); j = pbond->nbr; bo_ij = &(pbond->bo_data); - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] + twbp = &(system->reax_param.tbp[system->my_atoms[i].type] [system->my_atoms[pbond->nbr].type]); bo_ij->Cdbo += CEover1 * twbp->p_ovun1 * twbp->De_s; // OvCoor-1st diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 496e5476b0..9ca7ba41a9 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -112,8 +112,8 @@ namespace ReaxFF { if (flag) { r_ij = nbr_pj->d; - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] - [ system->my_atoms[j].type ]); + twbp = &(system->reax_param.tbp[system->my_atoms[i].type] + [system->my_atoms[j].type]); /* Calculate Taper and its derivative */ // Tap = nbr_pj->Tap; -- precomputed during compte_H diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 4719fcfbab..690fea14af 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -276,8 +276,8 @@ namespace ReaxFF { my_offset = _my_offset[j]; - p_val3 = system->reax_param.sbp[ type_j ].p_val3; - p_val5 = system->reax_param.sbp[ type_j ].p_val5; + p_val3 = system->reax_param.sbp[type_j].p_val3; + p_val5 = system->reax_param.sbp[type_j].p_val5; SBOp = 0, prod_SBO = 1; for (t = start_j; t < end_j; ++t) { @@ -390,7 +390,7 @@ namespace ReaxFF { (bo_ij->BO > control->thb_cut) && (bo_jk->BO > control->thb_cut) && (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { - thbh = &(system->reax_param.thbp[ type_i ][ type_j ][ type_k ]); + thbh = &(system->reax_param.thbp[type_i][type_j][type_k]); for (cnt = 0; cnt < thbh->cnt; ++cnt) { @@ -457,7 +457,7 @@ namespace ReaxFF { exp_pen2ij = exp(-p_pen2 * SQR(BOA_ij - 2.0)); exp_pen2jk = exp(-p_pen2 * SQR(BOA_jk - 2.0)); exp_pen3 = exp(-p_pen3 * workspace->Delta[j]); - exp_pen4 = exp( p_pen4 * workspace->Delta[j]); + exp_pen4 = exp(p_pen4 * workspace->Delta[j]); trm_pen34 = 1.0 + exp_pen3 + exp_pen4; f9_Dj = (2.0 + exp_pen3) / trm_pen34; Cf9j = (-p_pen3 * exp_pen3 * trm_pen34 - diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 493d9cd508..eef7df53fd 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -593,8 +593,8 @@ void FixQEqReax::init_matvec() if (atom->mask[i] & groupbit) { /* init pre-conditioner for H and init solution vectors */ - Hdia_inv[i] = 1. / eta[ atom->type[i] ]; - b_s[i] = -chi[ atom->type[i] ]; + Hdia_inv[i] = 1. / eta[atom->type[i]]; + b_s[i] = -chi[atom->type[i]]; b_t[i] = -1.0; /* quadratic extrapolation for s & t from previous solutions */ @@ -761,7 +761,7 @@ void FixQEqReax::sparse_matvec(sparse_matrix *A, double *x, double *b) for (ii = 0; ii < nn; ++ii) { i = ilist[ii]; if (atom->mask[i] & groupbit) - b[i] = eta[ atom->type[i] ] * x[i]; + b[i] = eta[atom->type[i]] * x[i]; } for (ii = nn; ii < NN; ++ii) { @@ -835,7 +835,7 @@ int FixQEqReax::pack_forward_comm(int n, int *list, double *buf, m = 0; for (int i = 0; i < n; i++) { int j = 2 * list[i]; - buf[m++] = d[j ]; + buf[m++] = d[j]; buf[m++] = d[j+1]; } return m; @@ -862,7 +862,7 @@ void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) m = 0; for (i = first; i < last; i++) { int j = 2 * i; - d[j ] = buf[m++]; + d[j] = buf[m++]; d[j+1] = buf[m++]; } } @@ -878,7 +878,7 @@ int FixQEqReax::pack_reverse_comm(int n, int first, double *buf) int last = first + n; for (i = first; i < last; i++) { int indxI = 2 * i; - buf[m++] = q[indxI ]; + buf[m++] = q[indxI]; buf[m++] = q[indxI+1]; } return m; @@ -896,7 +896,7 @@ void FixQEqReax::unpack_reverse_comm(int n, int *list, double *buf) int m = 0; for (int i = 0; i < n; i++) { int indxI = 2 * list[i]; - q[indxI ] += buf[m++]; + q[indxI] += buf[m++]; q[indxI+1] += buf[m++]; } } else { diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 9237e3e7ff..9fc20f35d0 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -127,9 +127,9 @@ class FixQEqReax : public Fix { virtual int pack_exchange(int, double *); virtual int unpack_exchange(int, double *); - virtual double parallel_norm( double*, int ); - virtual double parallel_dot( double*, double*, int ); - virtual double parallel_vector_acc( double*, int ); + virtual double parallel_norm(double*, int); + virtual double parallel_dot(double*, double*, int); + virtual double parallel_vector_acc(double*, int); virtual void vector_sum(double*,double,double*,double,double*,int); virtual void vector_add(double*, double, double*,int); diff --git a/src/USER-REAXC/fix_reaxc_bonds.cpp b/src/USER-REAXC/fix_reaxc_bonds.cpp index c741259810..58065e3276 100644 --- a/src/USER-REAXC/fix_reaxc_bonds.cpp +++ b/src/USER-REAXC/fix_reaxc_bonds.cpp @@ -47,7 +47,7 @@ FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0 ) + if (nevery <= 0) error->all(FLERR,"Illegal fix reax/c/bonds command"); if (me == 0) { @@ -194,7 +194,7 @@ void FixReaxCBonds::FindBond(struct _reax_list * /*lists*/, int &numbonds) nj = 0; for (pj = Start_Index(i, reaxc->api->lists); pj < End_Index(i, reaxc->api->lists); ++pj) { - bo_ij = &( reaxc->api->lists->select.bond_list[pj] ); + bo_ij = &(reaxc->api->lists->select.bond_list[pj]); j = bo_ij->nbr; jtag = tag[j]; bo_tmp = bo_ij->bo_data.BO; @@ -233,7 +233,7 @@ void FixReaxCBonds::PassBuffer(double *buf, int &nbuf_local) } j += (5+numbonds); - if (atom->molecule == nullptr ) buf[j] = 0.0; + if (atom->molecule == nullptr) buf[j] = 0.0; else buf[j] = atom->molecule[i]; j ++; diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index f6e923406d..c3fda58173 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -31,7 +31,7 @@ #include namespace ReaxFF { - void Add_dBond_to_Forces_NPT( int i, int pj, storage *workspace, reax_list **lists ) + void Add_dBond_to_Forces_NPT(int i, int pj, storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; @@ -44,7 +44,7 @@ namespace ReaxFF { nbr_j = &(bonds->select.bond_list[pj]); j = nbr_j->nbr; bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); @@ -74,58 +74,58 @@ namespace ReaxFF { rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ /* force */ - rvec_Add( workspace->f[k], temp ); + rvec_Add(workspace->f[k], temp); } /* then atom i itself */ - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); /*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); /*1st,dBO*/ - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] );/*2nd,dBO*/ - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ + rvec_Scale(temp, coef.C1dbo, bo_ij->dBOp); /*1st,dBO*/ + rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); /*2nd,dBO*/ + rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); /*1st,dBO*/ + rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]);/*2nd,dBO*/ + rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ + rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ + rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBO_pi2*/ - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] );/*3rd*/ + rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBO_pi2*/ + rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBO_pi2*/ + rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]);/*3rd*/ /* force */ - rvec_Add( workspace->f[i], temp ); + rvec_Add(workspace->f[i], temp); for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); /*3rd,dBO*/ - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ + rvec_Scale(temp, -coef.C3dbo, nbr_k->bo_data.dBOp); /*3rd,dBO*/ + rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ + rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ /* force */ - rvec_Add( workspace->f[k], temp ); + rvec_Add(workspace->f[k], temp); } /* then atom j itself */ - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); /*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); /*1st, dBO*/ - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ + rvec_Scale(temp, -coef.C1dbo, bo_ij->dBOp); /*1st, dBO*/ + rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); /*2nd, dBO*/ + rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); /*1st, dBO*/ + rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); /*1st,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); /*2nd,dBOpi*/ - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ + rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ + rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); /*1st,dBOpi2*/ - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); /*2nd,dBOpi2*/ - rvec_ScaledAdd( temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ + rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBOpi2*/ + rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBOpi2*/ + rvec_ScaledAdd(temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ /* force */ - rvec_Add( workspace->f[j], temp ); + rvec_Add(workspace->f[j], temp); } - void Add_dBond_to_Forces( reax_system *system, int i, int pj, - storage *workspace, reax_list **lists ) + void Add_dBond_to_Forces(reax_system *system, int i, int pj, + storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; @@ -140,7 +140,7 @@ namespace ReaxFF { nbr_j = &(bonds->select.bond_list[pj]); j = nbr_j->nbr; bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[ nbr_j->sym_index ].bo_data); + bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); @@ -161,40 +161,40 @@ namespace ReaxFF { coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); // forces on i - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C2dbo, workspace->dDeltap_self[i] ); - rvec_ScaledAdd( temp, coef.C1dDelta, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C2dDelta, workspace->dDeltap_self[i] ); - rvec_ScaledAdd( temp, coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, coef.C2dbopi, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbopi, workspace->dDeltap_self[i]); - rvec_ScaledAdd( temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - rvec_ScaledAdd( temp, coef.C2dbopi2, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbopi2, workspace->dDeltap_self[i] ); - rvec_Add( workspace->f[i], temp ); + rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); + rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]); + rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]); + rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); + rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]); + rvec_Add(workspace->f[i], temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fi_tmp, -1.0, temp); - rvec_ScaledSum( delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x ); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); system->pair_ptr->v_tally(i,fi_tmp,delij); } // forces on j - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dbo, workspace->dDeltap_self[j] ); - rvec_ScaledAdd( temp, -coef.C1dDelta, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C3dDelta, workspace->dDeltap_self[j]); - rvec_ScaledAdd( temp, -coef.C1dbopi, bo_ij->dln_BOp_pi ); - rvec_ScaledAdd( temp, -coef.C2dbopi, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C4dbopi, workspace->dDeltap_self[j]); - rvec_ScaledAdd( temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2 ); - rvec_ScaledAdd( temp, -coef.C2dbopi2, bo_ij->dBOp ); - rvec_ScaledAdd( temp, coef.C4dbopi2, workspace->dDeltap_self[j]); - rvec_Add( workspace->f[j], temp ); + rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); + rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]); + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]); + rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); + rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); + rvec_ScaledAdd(temp, coef.C4dbopi2, workspace->dDeltap_self[j]); + rvec_Add(workspace->f[j], temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fj_tmp, -1.0, temp); - rvec_ScaledSum( delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x ); + rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); system->pair_ptr->v_tally(j,fj_tmp,delji); } @@ -203,11 +203,11 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); - rvec_Add( workspace->f[k], temp ); + rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + rvec_Add(workspace->f[k], temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fk_tmp, -1.0, temp); @@ -223,11 +223,11 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp ); - rvec_ScaledAdd( temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd( temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); - rvec_Add( workspace->f[k], temp ); + rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); + rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + rvec_Add(workspace->f[k], temp); if (system->pair_ptr->vflag_atom) { rvec_Scale(fk_tmp, -1.0, temp); @@ -254,18 +254,18 @@ namespace ReaxFF { r2 = SQR(nbr_pj->d); if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { - C12 = twbp->p_bo1 * pow( nbr_pj->d / twbp->r_s, twbp->p_bo2 ); - BO_s = (1.0 + bo_cut) * exp( C12 ); + C12 = twbp->p_bo1 * pow(nbr_pj->d / twbp->r_s, twbp->p_bo2); + BO_s = (1.0 + bo_cut) * exp(C12); } else BO_s = C12 = 0.0; if (sbp_i->r_pi > 0.0 && sbp_j->r_pi > 0.0) { - C34 = twbp->p_bo3 * pow( nbr_pj->d / twbp->r_p, twbp->p_bo4 ); - BO_pi = exp( C34 ); + C34 = twbp->p_bo3 * pow(nbr_pj->d / twbp->r_p, twbp->p_bo4); + BO_pi = exp(C34); } else BO_pi = C34 = 0.0; if (sbp_i->r_pi_pi > 0.0 && sbp_j->r_pi_pi > 0.0) { - C56 = twbp->p_bo5 * pow( nbr_pj->d / twbp->r_pp, twbp->p_bo6 ); - BO_pi2= exp( C56 ); + C56 = twbp->p_bo5 * pow(nbr_pj->d / twbp->r_pp, twbp->p_bo6); + BO_pi2= exp(C56); } else BO_pi2 = C56 = 0.0; /* Initially BO values are the uncorrected ones, page 1 */ @@ -273,26 +273,26 @@ namespace ReaxFF { if (BO >= bo_cut) { /****** bonds i-j and j-i ******/ - ibond = &( bonds->select.bond_list[btop_i] ); - btop_j = End_Index( j, bonds ); + ibond = &(bonds->select.bond_list[btop_i]); + btop_j = End_Index(j, bonds); jbond = &(bonds->select.bond_list[btop_j]); ibond->nbr = j; jbond->nbr = i; ibond->d = nbr_pj->d; jbond->d = nbr_pj->d; - rvec_Copy( ibond->dvec, nbr_pj->dvec ); - rvec_Scale( jbond->dvec, -1, nbr_pj->dvec ); - ivec_Copy( ibond->rel_box, nbr_pj->rel_box ); - ivec_Scale( jbond->rel_box, -1, nbr_pj->rel_box ); + rvec_Copy(ibond->dvec, nbr_pj->dvec); + rvec_Scale(jbond->dvec, -1, nbr_pj->dvec); + ivec_Copy(ibond->rel_box, nbr_pj->rel_box); + ivec_Scale(jbond->rel_box, -1, nbr_pj->rel_box); ibond->dbond_index = btop_i; jbond->dbond_index = btop_i; ibond->sym_index = btop_j; jbond->sym_index = btop_i; - Set_End_Index( j, btop_j+1, bonds ); + Set_End_Index(j, btop_j+1, bonds); - bo_ij = &( ibond->bo_data ); - bo_ji = &( jbond->bo_data ); + bo_ij = &(ibond->bo_data); + bo_ji = &(jbond->bo_data); bo_ji->BO = bo_ij->BO = BO; bo_ji->BO_s = bo_ij->BO_s = BO_s; bo_ji->BO_pi = bo_ij->BO_pi = BO_pi; @@ -310,17 +310,17 @@ namespace ReaxFF { rvec_Scale(bo_ij->dln_BOp_pi2, -bo_ij->BO_pi2*Cln_BOp_pi2,ibond->dvec); rvec_Scale(bo_ji->dln_BOp_s, -1., bo_ij->dln_BOp_s); - rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi ); - rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2 ); + rvec_Scale(bo_ji->dln_BOp_pi, -1., bo_ij->dln_BOp_pi); + rvec_Scale(bo_ji->dln_BOp_pi2, -1., bo_ij->dln_BOp_pi2); - rvec_Scale( bo_ij->dBOp, + rvec_Scale(bo_ij->dBOp, -(bo_ij->BO_s * Cln_BOp_s + bo_ij->BO_pi * Cln_BOp_pi + - bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec ); - rvec_Scale( bo_ji->dBOp, -1., bo_ij->dBOp ); + bo_ij->BO_pi2 * Cln_BOp_pi2), ibond->dvec); + rvec_Scale(bo_ji->dBOp, -1., bo_ij->dBOp); - rvec_Add( workspace->dDeltap_self[i], bo_ij->dBOp ); - rvec_Add( workspace->dDeltap_self[j], bo_ji->dBOp ); + rvec_Add(workspace->dDeltap_self[i], bo_ij->dBOp); + rvec_Add(workspace->dDeltap_self[j], bo_ji->dBOp); bo_ij->BO_s -= bo_cut; bo_ij->BO -= bo_cut; @@ -383,11 +383,11 @@ namespace ReaxFF { j = bonds->select.bond_list[pj].nbr; type_j = system->my_atoms[j].type; if (type_j < 0) continue; - bo_ij = &( bonds->select.bond_list[pj].bo_data ); - // fprintf( stderr, "\tj:%d - ubo: %8.3f\n", j+1, bo_ij->BO ); + bo_ij = &(bonds->select.bond_list[pj].bo_data); + // fprintf(stderr, "\tj:%d - ubo: %8.3f\n", j+1, bo_ij->BO); if (i < j || workspace->bond_mark[j] > 3) { - twbp = &( system->reax_param.tbp[type_i][type_j] ); + twbp = &(system->reax_param.tbp[type_i][type_j]); if (twbp->ovc < 0.001 && twbp->v13cor < 0.001) { bo_ij->C1dbo = 1.000000; @@ -412,36 +412,36 @@ namespace ReaxFF { /* on page 1 */ if (twbp->ovc >= 0.001) { /* Correction for overcoordination */ - exp_p1i = exp( -p_boc1 * Deltap_i ); - exp_p2i = exp( -p_boc2 * Deltap_i ); - exp_p1j = exp( -p_boc1 * Deltap_j ); - exp_p2j = exp( -p_boc2 * Deltap_j ); + exp_p1i = exp(-p_boc1 * Deltap_i); + exp_p2i = exp(-p_boc2 * Deltap_i); + exp_p1j = exp(-p_boc1 * Deltap_j); + exp_p2j = exp(-p_boc2 * Deltap_j); f2 = exp_p1i + exp_p1j; - f3 = -1.0 / p_boc2 * log( 0.5 * ( exp_p2i + exp_p2j ) ); - f1 = 0.5 * ( ( val_i + f2 )/( val_i + f2 + f3 ) + - ( val_j + f2 )/( val_j + f2 + f3 ) ); + f3 = -1.0 / p_boc2 * log(0.5 * (exp_p2i + exp_p2j)); + f1 = 0.5 * ((val_i + f2)/(val_i + f2 + f3) + + (val_j + f2)/(val_j + f2 + f3)); temp = f2 + f3; u1_ij = val_i + temp; u1_ji = val_j + temp; - Cf1A_ij = 0.5 * f3 * (1.0 / SQR( u1_ij ) + - 1.0 / SQR( u1_ji )); - Cf1B_ij = -0.5 * (( u1_ij - f3 ) / SQR( u1_ij ) + - ( u1_ji - f3 ) / SQR( u1_ji )); + Cf1A_ij = 0.5 * f3 * (1.0 / SQR(u1_ij) + + 1.0 / SQR(u1_ji)); + Cf1B_ij = -0.5 * ((u1_ij - f3) / SQR(u1_ij) + + (u1_ji - f3) / SQR(u1_ji)); - Cf1_ij = 0.50 * ( -p_boc1 * exp_p1i / u1_ij - + Cf1_ij = 0.50 * (-p_boc1 * exp_p1i / u1_ij - ((val_i+f2) / SQR(u1_ij)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) ) + + (-p_boc1 * exp_p1i + + exp_p2i / (exp_p2i + exp_p2j)) + -p_boc1 * exp_p1i / u1_ji - ((val_j+f2) / SQR(u1_ji)) * - ( -p_boc1 * exp_p1i + - exp_p2i / ( exp_p2i + exp_p2j ) )); + (-p_boc1 * exp_p1i + + exp_p2i / (exp_p2i + exp_p2j))); Cf1_ji = -Cf1A_ij * p_boc1 * exp_p1j + - Cf1B_ij * exp_p2j / ( exp_p2i + exp_p2j ); + Cf1B_ij * exp_p2j / (exp_p2i + exp_p2j); } else { /* No overcoordination correction! */ @@ -451,9 +451,9 @@ namespace ReaxFF { if (twbp->v13cor >= 0.001) { /* Correction for 1-3 bond orders */ - exp_f4 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + exp_f4 =exp(-(twbp->p_boc4 * SQR(bo_ij->BO) - Deltap_boc_i) * twbp->p_boc3 + twbp->p_boc5); - exp_f5 =exp(-(twbp->p_boc4 * SQR( bo_ij->BO ) - + exp_f5 =exp(-(twbp->p_boc4 * SQR(bo_ij->BO) - Deltap_boc_j) * twbp->p_boc3 + twbp->p_boc5); f4 = 1. / (1. + exp_f4); @@ -481,7 +481,7 @@ namespace ReaxFF { bo_ij->BO = bo_ij->BO * A0_ij; bo_ij->BO_pi = bo_ij->BO_pi * A0_ij *f1; bo_ij->BO_pi2= bo_ij->BO_pi2* A0_ij *f1; - bo_ij->BO_s = bo_ij->BO - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + bo_ij->BO_s = bo_ij->BO - (bo_ij->BO_pi + bo_ij->BO_pi2); bo_ij->C1dbo = A0_ij + bo_ij->BO * A1_ij; bo_ij->C2dbo = bo_ij->BO * A2_ij; @@ -515,7 +515,7 @@ namespace ReaxFF { /* We only need to update bond orders from bo_ji everything else is set in uncorrected_bo calculations */ sym_index = bonds->select.bond_list[pj].sym_index; - bo_ji = &(bonds->select.bond_list[ sym_index ].bo_data); + bo_ji = &(bonds->select.bond_list[sym_index].bo_data); bo_ij->BO = bo_ji->BO; bo_ij->BO_s = bo_ji->BO_s; bo_ij->BO_pi = bo_ji->BO_pi; @@ -531,7 +531,7 @@ namespace ReaxFF { for (j = 0; j < system->N; ++j) { type_j = system->my_atoms[j].type; if (type_j < 0) continue; - sbp_j = &(system->reax_param.sbp[ type_j ]); + sbp_j = &(system->reax_param.sbp[type_j]); workspace->Delta[j] = workspace->total_bond_order[j] - sbp_j->valency; workspace->Delta_e[j] = workspace->total_bond_order[j] - sbp_j->valency_e; diff --git a/src/USER-REAXC/reaxc_bonds.cpp b/src/USER-REAXC/reaxc_bonds.cpp index a06700bb3b..a21059f19d 100644 --- a/src/USER-REAXC/reaxc_bonds.cpp +++ b/src/USER-REAXC/reaxc_bonds.cpp @@ -75,17 +75,17 @@ namespace ReaxFF { /* set the pointers */ type_i = system->my_atoms[i].type; type_j = system->my_atoms[j].type; - sbp_i = &( system->reax_param.sbp[type_i] ); - sbp_j = &( system->reax_param.sbp[type_j] ); - twbp = &( system->reax_param.tbp[type_i][type_j] ); - bo_ij = &( bonds->select.bond_list[pj].bo_data ); + sbp_i = &(system->reax_param.sbp[type_i]); + sbp_j = &(system->reax_param.sbp[type_j]); + twbp = &(system->reax_param.tbp[type_i][type_j]); + bo_ij = &(bonds->select.bond_list[pj].bo_data); /* calculate the constants */ if (bo_ij->BO_s == 0.0) pow_BOs_be2 = 0.0; - else pow_BOs_be2 = pow( bo_ij->BO_s, twbp->p_be2 ); - exp_be12 = exp( twbp->p_be1 * ( 1.0 - pow_BOs_be2 ) ); + else pow_BOs_be2 = pow(bo_ij->BO_s, twbp->p_be2); + exp_be12 = exp(twbp->p_be1 * (1.0 - pow_BOs_be2)); CEbo = -twbp->De_s * exp_be12 * - ( 1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2 ); + (1.0 - twbp->p_be1 * twbp->p_be2 * pow_BOs_be2); /* calculate the Bond Energy */ data->my_en.e_bond += ebond = @@ -104,10 +104,10 @@ namespace ReaxFF { /* Stabilisation terminal triple bond */ if (bo_ij->BO >= 1.00) { - if ( gp37 == 2 || + if (gp37 == 2 || (sbp_i->mass == 12.0000 && sbp_j->mass == 15.9990) || (sbp_j->mass == 12.0000 && sbp_i->mass == 15.9990)) { - exphu = exp( -gp7 * SQR(bo_ij->BO - 2.50) ); + exphu = exp(-gp7 * SQR(bo_ij->BO - 2.50)); exphua1 = exp(-gp3 * (workspace->total_bond_order[i]-bo_ij->BO)); exphub1 = exp(-gp3 * (workspace->total_bond_order[j]-bo_ij->BO)); exphuov = exp(gp4 * (workspace->Delta[i] + workspace->Delta[j])); @@ -117,7 +117,7 @@ namespace ReaxFF { data->my_en.e_bond += estriph; decobdbo = gp10 * exphu * hulpov * (exphua1 + exphub1) * - ( gp3 - 2.0 * gp7 * (bo_ij->BO-2.50) ); + (gp3 - 2.0 * gp7 * (bo_ij->BO-2.50)); decobdboua = -gp10 * exphu * hulpov * (gp3*exphua1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); decobdboub = -gp10 * exphu * hulpov * diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp index 43362ac878..463208425e 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp @@ -67,20 +67,20 @@ namespace ReaxFF { type_j = system->my_atoms[j].type; start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - hb_start_j = Start_Index( system->my_atoms[j].Hindex, hbonds ); - hb_end_j = End_Index( system->my_atoms[j].Hindex, hbonds ); + hb_start_j = Start_Index(system->my_atoms[j].Hindex, hbonds); + hb_end_j = End_Index(system->my_atoms[j].Hindex, hbonds); if (type_j < 0) continue; top = 0; for (pi = start_j; pi < end_j; ++pi) { - pbond_ij = &( bond_list[pi] ); + pbond_ij = &(bond_list[pi]); i = pbond_ij->nbr; type_i = system->my_atoms[i].type; if (type_i < 0) continue; bo_ij = &(pbond_ij->bo_data); - if ( system->reax_param.sbp[type_i].p_hbond == 2 && - bo_ij->BO >= HB_THRESHOLD ) + if (system->reax_param.sbp[type_i].p_hbond == 2 && + bo_ij->BO >= HB_THRESHOLD) hblist[top++] = pi; } @@ -91,36 +91,36 @@ namespace ReaxFF { if (type_k < 0) continue; nbr_jk = hbond_list[pk].ptr; r_jk = nbr_jk->d; - rvec_Scale( dvec_jk, hbond_list[pk].scl, nbr_jk->dvec ); + rvec_Scale(dvec_jk, hbond_list[pk].scl, nbr_jk->dvec); for (itr = 0; itr < top; ++itr) { pi = hblist[itr]; - pbond_ij = &( bonds->select.bond_list[pi] ); + pbond_ij = &(bonds->select.bond_list[pi]); i = pbond_ij->nbr; if (system->my_atoms[i].orig_id != system->my_atoms[k].orig_id) { bo_ij = &(pbond_ij->bo_data); type_i = system->my_atoms[i].type; if (type_i < 0) continue; - hbp = &(system->reax_param.hbp[ type_i ][ type_j ][ type_k ]); + hbp = &(system->reax_param.hbp[type_i][type_j][type_k]); if (hbp->r0_hb <= 0.0) continue; ++num_hb_intrs; - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &theta, &cos_theta ); + Calculate_Theta(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + &theta, &cos_theta); /* the derivative of cos(theta) */ - Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, + Calculate_dCos_Theta(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, &dcos_theta_di, &dcos_theta_dj, - &dcos_theta_dk ); + &dcos_theta_dk); /* hyrogen bond energy*/ - sin_theta2 = sin( theta/2.0 ); + sin_theta2 = sin(theta/2.0); sin_xhz4 = SQR(sin_theta2); sin_xhz4 *= sin_xhz4; - cos_xhz1 = ( 1.0 - cos_theta ); - exp_hb2 = exp( -hbp->p_hb2 * bo_ij->BO ); - exp_hb3 = exp( -hbp->p_hb3 * ( hbp->r0_hb / r_jk + - r_jk / hbp->r0_hb - 2.0 ) ); + cos_xhz1 = (1.0 - cos_theta); + exp_hb2 = exp(-hbp->p_hb2 * bo_ij->BO); + exp_hb3 = exp(-hbp->p_hb3 * (hbp->r0_hb / r_jk + + r_jk / hbp->r0_hb - 2.0)); data->my_en.e_hb += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; @@ -135,36 +135,36 @@ namespace ReaxFF { if (control->virial == 0) { // dcos terms - rvec_ScaledAdd( workspace->f[i], +CEhb2, dcos_theta_di ); - rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); - rvec_ScaledAdd( workspace->f[k], +CEhb2, dcos_theta_dk ); + rvec_ScaledAdd(workspace->f[i], +CEhb2, dcos_theta_di); + rvec_ScaledAdd(workspace->f[j], +CEhb2, dcos_theta_dj); + rvec_ScaledAdd(workspace->f[k], +CEhb2, dcos_theta_dk); // dr terms - rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); - rvec_ScaledAdd( workspace->f[k], +CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->f[j], -CEhb3/r_jk, dvec_jk); + rvec_ScaledAdd(workspace->f[k], +CEhb3/r_jk, dvec_jk); } else { - rvec_Scale( force, +CEhb2, dcos_theta_di ); // dcos terms - rvec_Add( workspace->f[i], force ); + rvec_Scale(force, +CEhb2, dcos_theta_di); // dcos terms + rvec_Add(workspace->f[i], force); - rvec_ScaledAdd( workspace->f[j], +CEhb2, dcos_theta_dj ); + rvec_ScaledAdd(workspace->f[j], +CEhb2, dcos_theta_dj); - ivec_Scale( rel_jk, hbond_list[pk].scl, nbr_jk->rel_box ); - rvec_Scale( force, +CEhb2, dcos_theta_dk ); - rvec_Add( workspace->f[k], force ); + ivec_Scale(rel_jk, hbond_list[pk].scl, nbr_jk->rel_box); + rvec_Scale(force, +CEhb2, dcos_theta_dk); + rvec_Add(workspace->f[k], force); // dr terms - rvec_ScaledAdd( workspace->f[j], -CEhb3/r_jk, dvec_jk ); + rvec_ScaledAdd(workspace->f[j], -CEhb3/r_jk, dvec_jk); - rvec_Scale( force, CEhb3/r_jk, dvec_jk ); - rvec_Add( workspace->f[k], force ); + rvec_Scale(force, CEhb3/r_jk, dvec_jk); + rvec_Add(workspace->f[k], force); } /* tally into per-atom virials */ if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - rvec_ScaledSum( delij, 1., system->my_atoms[j].x, - -1., system->my_atoms[i].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[j].x, - -1., system->my_atoms[k].x ); + rvec_ScaledSum(delij, 1., system->my_atoms[j].x, + -1., system->my_atoms[i].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[j].x, + -1., system->my_atoms[k].x); rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 86a8677a02..d2b014947e 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -54,7 +54,7 @@ namespace ReaxFF { if (control->hbond_cut > 0) for (i = 0; i < system->n; ++i) { atom = &(system->my_atoms[i]); - if (system->reax_param.sbp[ atom->type ].p_hbond == 1 && atom->type >= 0) + if (system->reax_param.sbp[atom->type].p_hbond == 1 && atom->type >= 0) atom->Hindex = system->numH++; else atom->Hindex = -1; } diff --git a/src/USER-REAXC/reaxc_multi_body.cpp b/src/USER-REAXC/reaxc_multi_body.cpp index 09fb848a08..4f3ab95395 100644 --- a/src/USER-REAXC/reaxc_multi_body.cpp +++ b/src/USER-REAXC/reaxc_multi_body.cpp @@ -72,8 +72,8 @@ namespace ReaxFF { /* lone-pair Energy */ p_lp2 = sbp_i->p_lp2; - expvd2 = exp( -75 * workspace->Delta_lp[i] ); - inv_expvd2 = 1. / (1. + expvd2 ); + expvd2 = exp(-75 * workspace->Delta_lp[i]); + inv_expvd2 = 1. / (1. + expvd2); numbonds = 0; e_lp = 0.0; @@ -103,9 +103,9 @@ namespace ReaxFF { type_j = system->my_atoms[j].type; if (type_j < 0) continue; - if (!strcmp( system->reax_param.sbp[type_j].name, "C" )) { - twbp = &( system->reax_param.tbp[type_i][type_j]); - bo_ij = &( bonds->select.bond_list[pj].bo_data ); + if (!strcmp(system->reax_param.sbp[type_j].name, "C")) { + twbp = &(system->reax_param.tbp[type_i][type_j]); + bo_ij = &(bonds->select.bond_list[pj].bo_data); Di = workspace->Delta[i]; vov3 = bo_ij->BO - Di - 0.040*pow(Di, 4.); @@ -148,16 +148,16 @@ namespace ReaxFF { sum_ovun1 += twbp->p_ovun1 * twbp->De_s * bo_ij->BO; sum_ovun2 += (workspace->Delta[j] - dfvl*workspace->Delta_lp_temp[j])* - ( bo_ij->BO_pi + bo_ij->BO_pi2 ); + (bo_ij->BO_pi + bo_ij->BO_pi2); } - exp_ovun1 = p_ovun3 * exp( p_ovun4 * sum_ovun2 ); + exp_ovun1 = p_ovun3 * exp(p_ovun4 * sum_ovun2); inv_exp_ovun1 = 1.0 / (1 + exp_ovun1); Delta_lpcorr = workspace->Delta[i] - (dfvl * workspace->Delta_lp_temp[i]) * inv_exp_ovun1; - exp_ovun2 = exp( p_ovun2 * Delta_lpcorr ); + exp_ovun2 = exp(p_ovun2 * Delta_lpcorr); inv_exp_ovun2 = 1.0 / (1.0 + exp_ovun2); DlpVi = 1.0 / (Delta_lpcorr + sbp_i->valency + 1e-8); @@ -166,9 +166,9 @@ namespace ReaxFF { data->my_en.e_ov += e_ov = sum_ovun1 * CEover1; CEover2 = sum_ovun1 * DlpVi * inv_exp_ovun2 * - (1.0 - Delta_lpcorr * ( DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2 )); + (1.0 - Delta_lpcorr * (DlpVi + p_ovun2 * exp_ovun2 * inv_exp_ovun2)); - CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1 ); + CEover3 = CEover2 * (1.0 - dfvl * workspace->dDelta_lp[i] * inv_exp_ovun1); CEover4 = CEover2 * (dfvl * workspace->Delta_lp_temp[i]) * p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1); @@ -179,7 +179,7 @@ namespace ReaxFF { p_ovun5 = sbp_i->p_ovun5; exp_ovun2n = 1.0 / exp_ovun2; - exp_ovun6 = exp( p_ovun6 * Delta_lpcorr ); + exp_ovun6 = exp(p_ovun6 * Delta_lpcorr); exp_ovun8 = p_ovun7 * exp(p_ovun8 * sum_ovun2); inv_exp_ovun2n = 1.0 / (1.0 + exp_ovun2n); inv_exp_ovun8 = 1.0 / (1.0 + exp_ovun8); @@ -194,8 +194,8 @@ namespace ReaxFF { -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; CEunder1 = inv_exp_ovun2n * - ( p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + - p_ovun2 * e_un * exp_ovun2n ); + (p_ovun5 * p_ovun6 * exp_ovun6 * inv_exp_ovun8 + + p_ovun2 * e_un * exp_ovun2n); CEunder2 = -e_un * p_ovun8 * exp_ovun8 * inv_exp_ovun8; CEunder3 = CEunder1 * (1.0 - dfvl*workspace->dDelta_lp[i]*inv_exp_ovun1); CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * diff --git a/src/USER-REAXC/reaxc_nonbonded.cpp b/src/USER-REAXC/reaxc_nonbonded.cpp index e4adf6c7b1..a7f9aee807 100644 --- a/src/USER-REAXC/reaxc_nonbonded.cpp +++ b/src/USER-REAXC/reaxc_nonbonded.cpp @@ -111,8 +111,8 @@ namespace ReaxFF { if (flag) { r_ij = nbr_pj->d; - twbp = &(system->reax_param.tbp[ system->my_atoms[i].type ] - [ system->my_atoms[j].type ]); + twbp = &(system->reax_param.tbp[system->my_atoms[i].type] + [system->my_atoms[j].type]); Tap = workspace->Tap[7] * r_ij + workspace->Tap[6]; Tap = Tap * r_ij + workspace->Tap[5]; diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index e7d8d4d024..3208d935cc 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -43,7 +43,7 @@ namespace ReaxFF { for (i = 0; i < system->n; ++i) { atom = &(system->my_atoms[i]); if (atom->type < 0) continue; - if (system->reax_param.sbp[ atom->type ].p_hbond == 1) + if (system->reax_param.sbp[atom->type].p_hbond == 1) atom->Hindex = system->numH++; else atom->Hindex = -1; } diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index e1a535e193..839b92c614 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -32,20 +32,20 @@ #include "error.h" namespace ReaxFF { - void Calculate_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, - double *theta, double *cos_theta ) + void Calculate_Theta(rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, + double *theta, double *cos_theta) { - (*cos_theta) = rvec_Dot(dvec_ji,dvec_jk) / ( d_ji * d_jk ); + (*cos_theta) = rvec_Dot(dvec_ji,dvec_jk) / (d_ji * d_jk); if (*cos_theta > 1.) *cos_theta = 1.0; if (*cos_theta < -1.) *cos_theta = -1.0; - (*theta) = acos( *cos_theta ); + (*theta) = acos(*cos_theta); } - void Calculate_dCos_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, + void Calculate_dCos_Theta(rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, rvec* dcos_theta_di, rvec* dcos_theta_dj, - rvec* dcos_theta_dk ) + rvec* dcos_theta_dk) { int t; double sqr_d_ji = SQR(d_ji); @@ -59,14 +59,14 @@ namespace ReaxFF { (*dcos_theta_di)[t] = dvec_jk[t] * inv_dists - Cdot_inv3 * sqr_d_jk * dvec_ji[t]; (*dcos_theta_dj)[t] = -(dvec_jk[t] + dvec_ji[t]) * inv_dists + - Cdot_inv3 * ( sqr_d_jk * dvec_ji[t] + sqr_d_ji * dvec_jk[t] ); + Cdot_inv3 * (sqr_d_jk * dvec_ji[t] + sqr_d_ji * dvec_jk[t]); (*dcos_theta_dk)[t] = dvec_ji[t] * inv_dists - Cdot_inv3 * sqr_d_ji * dvec_jk[t]; } } - void Valence_Angles( reax_system *system, control_params *control, + void Valence_Angles(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists) { @@ -119,17 +119,17 @@ namespace ReaxFF { start_j = Start_Index(j, bonds); end_j = End_Index(j, bonds); - p_val3 = system->reax_param.sbp[ type_j ].p_val3; - p_val5 = system->reax_param.sbp[ type_j ].p_val5; + p_val3 = system->reax_param.sbp[type_j].p_val3; + p_val5 = system->reax_param.sbp[type_j].p_val5; SBOp = 0, prod_SBO = 1; for (t = start_j; t < end_j; ++t) { bo_jt = &(bonds->select.bond_list[t].bo_data); SBOp += (bo_jt->BO_pi + bo_jt->BO_pi2); - temp = SQR( bo_jt->BO ); + temp = SQR(bo_jt->BO); temp *= temp; temp *= temp; - prod_SBO *= exp( -temp ); + prod_SBO *= exp(-temp); } if (workspace->vlpex[j] >= 0) { @@ -141,50 +141,50 @@ namespace ReaxFF { } SBO = SBOp + (1 - prod_SBO) * (-workspace->Delta_boc[j] - p_val8 * vlpadj); - dSBO1 = -8 * prod_SBO * ( workspace->Delta_boc[j] + p_val8 * vlpadj ); + dSBO1 = -8 * prod_SBO * (workspace->Delta_boc[j] + p_val8 * vlpadj); if (SBO <= 0) SBO2 = 0, CSBO2 = 0; else if (SBO > 0 && SBO <= 1) { - SBO2 = pow( SBO, p_val9 ); - CSBO2 = p_val9 * pow( SBO, p_val9 - 1 ); + SBO2 = pow(SBO, p_val9); + CSBO2 = p_val9 * pow(SBO, p_val9 - 1); } else if (SBO > 1 && SBO < 2) { - SBO2 = 2 - pow( 2-SBO, p_val9 ); - CSBO2 = p_val9 * pow( 2 - SBO, p_val9 - 1 ); + SBO2 = 2 - pow(2-SBO, p_val9); + CSBO2 = p_val9 * pow(2 - SBO, p_val9 - 1); } else SBO2 = 2, CSBO2 = 0; - expval6 = exp( p_val6 * workspace->Delta_boc[j] ); + expval6 = exp(p_val6 * workspace->Delta_boc[j]); for (pi = start_j; pi < end_j; ++pi) { - Set_Start_Index( pi, num_thb_intrs, thb_intrs ); + Set_Start_Index(pi, num_thb_intrs, thb_intrs); pbond_ij = &(bonds->select.bond_list[pi]); bo_ij = &(pbond_ij->bo_data); BOA_ij = bo_ij->BO - control->thb_cut; - if ( BOA_ij/*bo_ij->BO*/ > 0.0 && - ( j < system->n || pbond_ij->nbr < system->n )) { + if (BOA_ij/*bo_ij->BO*/ > 0.0 && + (j < system->n || pbond_ij->nbr < system->n)) { i = pbond_ij->nbr; type_i = system->my_atoms[i].type; for (pk = start_j; pk < pi; ++pk) { - start_pk = Start_Index( pk, thb_intrs ); - end_pk = End_Index( pk, thb_intrs ); + start_pk = Start_Index(pk, thb_intrs); + end_pk = End_Index(pk, thb_intrs); for (t = start_pk; t < end_pk; ++t) if (thb_intrs->select.three_body_list[t].thb == i) { - p_ijk = &(thb_intrs->select.three_body_list[num_thb_intrs] ); + p_ijk = &(thb_intrs->select.three_body_list[num_thb_intrs]); p_kji = &(thb_intrs->select.three_body_list[t]); p_ijk->thb = bonds->select.bond_list[pk].nbr; p_ijk->pthb = pk; p_ijk->theta = p_kji->theta; - rvec_Copy( p_ijk->dcos_di, p_kji->dcos_dk ); - rvec_Copy( p_ijk->dcos_dj, p_kji->dcos_dj ); - rvec_Copy( p_ijk->dcos_dk, p_kji->dcos_di ); + rvec_Copy(p_ijk->dcos_di, p_kji->dcos_dk); + rvec_Copy(p_ijk->dcos_dj, p_kji->dcos_dj); + rvec_Copy(p_ijk->dcos_dk, p_kji->dcos_di); ++num_thb_intrs; break; @@ -197,21 +197,21 @@ namespace ReaxFF { BOA_jk = bo_jk->BO - control->thb_cut; k = pbond_jk->nbr; type_k = system->my_atoms[k].type; - p_ijk = &( thb_intrs->select.three_body_list[num_thb_intrs] ); + p_ijk = &(thb_intrs->select.three_body_list[num_thb_intrs]); - Calculate_Theta( pbond_ij->dvec, pbond_ij->d, + Calculate_Theta(pbond_ij->dvec, pbond_ij->d, pbond_jk->dvec, pbond_jk->d, - &theta, &cos_theta ); + &theta, &cos_theta); - Calculate_dCos_Theta( pbond_ij->dvec, pbond_ij->d, + Calculate_dCos_Theta(pbond_ij->dvec, pbond_ij->d, pbond_jk->dvec, pbond_jk->d, &(p_ijk->dcos_di), &(p_ijk->dcos_dj), - &(p_ijk->dcos_dk) ); + &(p_ijk->dcos_dk)); p_ijk->thb = k; p_ijk->pthb = pk; p_ijk->theta = theta; - sin_theta = sin( theta ); + sin_theta = sin(theta); if (sin_theta < 1.0e-5) sin_theta = 1.0e-5; @@ -222,11 +222,11 @@ namespace ReaxFF { (bo_ij->BO > control->thb_cut) && (bo_jk->BO > control->thb_cut) && (bo_ij->BO * bo_jk->BO > control->thb_cutsq)) { - thbh = &( system->reax_param.thbp[ type_i ][ type_j ][ type_k ] ); + thbh = &(system->reax_param.thbp[type_i][type_j][type_k]); for (cnt = 0; cnt < thbh->cnt; ++cnt) { if (fabs(thbh->prm[cnt].p_val1) > 0.001) { - thbp = &( thbh->prm[cnt] ); + thbp = &(thbh->prm[cnt]); /* ANGLE ENERGY */ p_val1 = thbp->p_val1; @@ -235,26 +235,26 @@ namespace ReaxFF { p_val7 = thbp->p_val7; theta_00 = thbp->theta_00; - exp3ij = exp( -p_val3 * pow( BOA_ij, p_val4 ) ); + exp3ij = exp(-p_val3 * pow(BOA_ij, p_val4)); f7_ij = 1.0 - exp3ij; - Cf7ij = p_val3 * p_val4 * pow( BOA_ij, p_val4 - 1.0 ) * exp3ij; + Cf7ij = p_val3 * p_val4 * pow(BOA_ij, p_val4 - 1.0) * exp3ij; - exp3jk = exp( -p_val3 * pow( BOA_jk, p_val4 ) ); + exp3jk = exp(-p_val3 * pow(BOA_jk, p_val4)); f7_jk = 1.0 - exp3jk; - Cf7jk = p_val3 * p_val4 * pow( BOA_jk, p_val4 - 1.0 ) * exp3jk; + Cf7jk = p_val3 * p_val4 * pow(BOA_jk, p_val4 - 1.0) * exp3jk; - expval7 = exp( -p_val7 * workspace->Delta_boc[j] ); + expval7 = exp(-p_val7 * workspace->Delta_boc[j]); trm8 = 1.0 + expval6 + expval7; - f8_Dj = p_val5 - ( (p_val5 - 1.0) * (2.0 + expval6) / trm8 ); - Cf8j = ( (1.0 - p_val5) / SQR(trm8) ) * - ( p_val6 * expval6 * trm8 - - (2.0 + expval6) * ( p_val6*expval6 - p_val7*expval7 ) ); + f8_Dj = p_val5 - ((p_val5 - 1.0) * (2.0 + expval6) / trm8); + Cf8j = ((1.0 - p_val5) / SQR(trm8)) * + (p_val6 * expval6 * trm8 - + (2.0 + expval6) * (p_val6*expval6 - p_val7*expval7)); theta_0 = 180.0 - theta_00 * (1.0 - exp(-p_val10 * (2.0 - SBO2))); - theta_0 = DEG2RAD( theta_0 ); + theta_0 = DEG2RAD(theta_0); - expval2theta = exp( -p_val2 * SQR(theta_0 - theta) ); + expval2theta = exp(-p_val2 * SQR(theta_0 - theta)); if (p_val1 >= 0) expval12theta = p_val1 * (1.0 - expval2theta); else // To avoid linear Me-H-Me angles (6/6/06) @@ -267,7 +267,7 @@ namespace ReaxFF { expval2theta * (theta_0 - theta); Ctheta_0 = p_val10 * DEG2RAD(theta_00) * - exp( -p_val10 * (2.0 - SBO2) ); + exp(-p_val10 * (2.0 - SBO2)); CEval5 = -CEval4 * Ctheta_0 * CSBO2; CEval6 = CEval5 * dSBO1; @@ -284,16 +284,16 @@ namespace ReaxFF { p_pen3 = system->reax_param.gp.l[20]; p_pen4 = system->reax_param.gp.l[21]; - exp_pen2ij = exp( -p_pen2 * SQR( BOA_ij - 2.0 ) ); - exp_pen2jk = exp( -p_pen2 * SQR( BOA_jk - 2.0 ) ); - exp_pen3 = exp( -p_pen3 * workspace->Delta[j] ); - exp_pen4 = exp( p_pen4 * workspace->Delta[j] ); + exp_pen2ij = exp(-p_pen2 * SQR(BOA_ij - 2.0)); + exp_pen2jk = exp(-p_pen2 * SQR(BOA_jk - 2.0)); + exp_pen3 = exp(-p_pen3 * workspace->Delta[j]); + exp_pen4 = exp( p_pen4 * workspace->Delta[j]); trm_pen34 = 1.0 + exp_pen3 + exp_pen4; - f9_Dj = ( 2.0 + exp_pen3 ) / trm_pen34; - Cf9j = ( -p_pen3 * exp_pen3 * trm_pen34 - - (2.0 + exp_pen3) * ( -p_pen3 * exp_pen3 + - p_pen4 * exp_pen4 ) ) / - SQR( trm_pen34 ); + f9_Dj = (2.0 + exp_pen3) / trm_pen34; + Cf9j = (-p_pen3 * exp_pen3 * trm_pen34 - + (2.0 + exp_pen3) * (-p_pen3 * exp_pen3 + + p_pen4 * exp_pen4)) / + SQR(trm_pen34); data->my_en.e_pen += e_pen = p_pen1 * f9_Dj * exp_pen2ij * exp_pen2jk; @@ -310,13 +310,13 @@ namespace ReaxFF { p_coa3 = system->reax_param.gp.l[38]; p_coa4 = system->reax_param.gp.l[30]; - exp_coa2 = exp( p_coa2 * workspace->Delta_val[j] ); + exp_coa2 = exp(p_coa2 * workspace->Delta_val[j]); data->my_en.e_coa += e_coa = p_coa1 / (1. + exp_coa2) * - exp( -p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij) ) * - exp( -p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk) ) * - exp( -p_coa4 * SQR(BOA_ij - 1.5) ) * - exp( -p_coa4 * SQR(BOA_jk - 1.5) ); + exp(-p_coa3 * SQR(workspace->total_bond_order[i]-BOA_ij)) * + exp(-p_coa3 * SQR(workspace->total_bond_order[k]-BOA_jk)) * + exp(-p_coa4 * SQR(BOA_ij - 1.5)) * + exp(-p_coa4 * SQR(BOA_jk - 1.5)); CEcoa1 = -2 * p_coa4 * (BOA_ij - 1.5) * e_coa; CEcoa2 = -2 * p_coa4 * (BOA_jk - 1.5) * e_coa; @@ -335,10 +335,10 @@ namespace ReaxFF { workspace->CdDelta[k] += CEcoa5; for (t = start_j; t < end_j; ++t) { - pbond_jt = &( bonds->select.bond_list[t] ); + pbond_jt = &(bonds->select.bond_list[t]); bo_jt = &(pbond_jt->bo_data); temp_bo_jt = bo_jt->BO; - temp = CUBE( temp_bo_jt ); + temp = CUBE(temp_bo_jt); pBOjt7 = temp * temp * temp_bo_jt; bo_jt->Cdbo += (CEval6 * pBOjt7); @@ -347,31 +347,31 @@ namespace ReaxFF { } if (control->virial == 0) { - rvec_ScaledAdd( workspace->f[i], CEval8, p_ijk->dcos_di ); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); - rvec_ScaledAdd( workspace->f[k], CEval8, p_ijk->dcos_dk ); + rvec_ScaledAdd(workspace->f[i], CEval8, p_ijk->dcos_di); + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->f[k], CEval8, p_ijk->dcos_dk); } else { - rvec_Scale( force, CEval8, p_ijk->dcos_di ); - rvec_Add( workspace->f[i], force ); + rvec_Scale(force, CEval8, p_ijk->dcos_di); + rvec_Add(workspace->f[i], force); - rvec_ScaledAdd( workspace->f[j], CEval8, p_ijk->dcos_dj ); + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - rvec_Scale( force, CEval8, p_ijk->dcos_dk ); - rvec_Add( workspace->f[k], force ); + rvec_Scale(force, CEval8, p_ijk->dcos_dk); + rvec_Add(workspace->f[k], force); } /* tally into per-atom virials */ if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { /* Acquire vectors */ - rvec_ScaledSum( delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x ); - rvec_ScaledSum( delkj, 1., system->my_atoms[k].x, - -1., system->my_atoms[j].x ); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, + -1., system->my_atoms[j].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[k].x, + -1., system->my_atoms[j].x); - rvec_Scale( fi_tmp, -CEval8, p_ijk->dcos_di ); - rvec_Scale( fj_tmp, -CEval8, p_ijk->dcos_dj ); - rvec_Scale( fk_tmp, -CEval8, p_ijk->dcos_dk ); + rvec_Scale(fi_tmp, -CEval8, p_ijk->dcos_di); + rvec_Scale(fj_tmp, -CEval8, p_ijk->dcos_dj); + rvec_Scale(fk_tmp, -CEval8, p_ijk->dcos_dk); eng_tmp = e_ang + e_pen + e_coa; @@ -386,7 +386,7 @@ namespace ReaxFF { } } - Set_End_Index(pi, num_thb_intrs, thb_intrs ); + Set_End_Index(pi, num_thb_intrs, thb_intrs); } } diff --git a/src/USER-REAXC/reaxff_api.h b/src/USER-REAXC/reaxff_api.h index 819d7c0d3b..96febe70f9 100644 --- a/src/USER-REAXC/reaxff_api.h +++ b/src/USER-REAXC/reaxff_api.h @@ -184,8 +184,8 @@ namespace ReaxFF return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; } - inline double rvec_Norm( rvec v ) { - return sqrt( SQR(v[0]) + SQR(v[1]) + SQR(v[2]) ); + inline double rvec_Norm(rvec v) { + return sqrt(SQR(v[0]) + SQR(v[1]) + SQR(v[2])); } inline void rvec_Scale(rvec ret, double c, rvec v) { diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index 854871e5a7..2727fb897e 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -29,7 +29,7 @@ #define CUBE(x) ((x)*(x)*(x)) #define DEG2RAD(a) ((a)*constPI/180.0) #define RAD2DEG(a) ((a)*180.0/constPI) -#define MAX3(x,y,z) MAX( MAX(x,y), z) +#define MAX3(x,y,z) MAX(MAX(x,y), z) #define constPI 3.14159265 #define C_ele 332.06371 From dbced62a65e895052bf0e4245298d39ba5df08f5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 00:44:09 -0400 Subject: [PATCH 076/352] reorder code for better plain vs. omp code comparison. remove unused stuff --- src/USER-OMP/pair_reaxc_omp.cpp | 266 ++++++++++++++--------------- src/USER-OMP/reaxc_init_md_omp.cpp | 14 +- src/USER-REAXC/fix_qeq_reax.cpp | 4 +- src/USER-REAXC/fix_qeq_reax.h | 2 - src/USER-REAXC/pair_reaxc.cpp | 31 ++-- src/USER-REAXC/pair_reaxc.h | 2 - src/USER-REAXC/reaxc_allocate.cpp | 14 ++ src/USER-REAXC/reaxc_init_md.cpp | 19 ++- 8 files changed, 172 insertions(+), 180 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 178c65a1b1..af4a61360f 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -35,19 +35,20 @@ #include "pair_reaxc_omp.h" -#include #include "atom.h" -#include "update.h" -#include "force.h" +#include "citeme.h" #include "comm.h" -#include "neighbor.h" +#include "error.h" +#include "fix_reaxc.h" +#include "force.h" +#include "memory.h" +#include "modify.h" #include "neigh_list.h" #include "neigh_request.h" -#include "modify.h" -#include "fix_reaxc.h" -#include "citeme.h" -#include "memory.h" -#include "error.h" +#include "neighbor.h" +#include "update.h" + +#include #include "reaxff_api.h" #include "reaxff_omp.h" @@ -96,6 +97,127 @@ PairReaxCOMP::~PairReaxCOMP() /* ---------------------------------------------------------------------- */ +void PairReaxCOMP::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style reax/c/omp requires atom attribute q"); + + bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) + || (modify->find_fix_by_style("^qeq/shielded") != -1)); + if (!have_qeq && qeqflag == 1) + error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); + + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + api->system->bigN = static_cast (atom->natoms); // all atoms in the system + api->system->wsize = comm->nprocs; + + if (atom->tag_enable == 0) + error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); + if (force->newton_pair == 0) + error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); + + // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT + + if (atom->natoms > MAXSMALLINT) + error->all(FLERR,"Too many atoms for pair style reax/c/omp"); + + // need a half neighbor list w/ Newton off and ghost neighbors + // built whenever re-neighboring occurs + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->newton = 2; + neighbor->requests[irequest]->ghost = 1; + + cutmax = MAX3(api->control->nonb_cut, api->control->hbond_cut, api->control->bond_cut); + if ((cutmax < 2.0*api->control->bond_cut) && (comm->me == 0)) + error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " + "increased neighbor list skin."); + + if (fix_reax == nullptr) { + modify->add_fix(fmt::format("{} all REAXC",fix_id)); + fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; + } + + api->control->nthreads = comm->nthreads; +} + +/* ---------------------------------------------------------------------- */ + +void PairReaxCOMP::setup() +{ + int oldN; + int mincap = api->system->mincap; + double safezone = api->system->safezone; + + api->system->n = atom->nlocal; // my atoms + api->system->N = atom->nlocal + atom->nghost; // mine + ghosts + oldN = api->system->N; + api->system->bigN = static_cast (atom->natoms); // all atoms in the system + + if (api->system->N > nmax) { + memory->destroy(num_nbrs_offset); + // Don't update nmax here. It is updated at end of compute(). + memory->create(num_nbrs_offset, api->system->N, "pair:num_nbrs_offset"); + } + + if (setup_flag == 0) { + + setup_flag = 1; + + int *num_bonds = fix_reax->num_bonds; + int *num_hbonds = fix_reax->num_hbonds; + + // determine the local and total capacity + + api->system->local_cap = MAX((int)(api->system->n * safezone), mincap); + api->system->total_cap = MAX((int)(api->system->N * safezone), mincap); + + // initialize my data structures + + PreAllocate_Space(api->system, api->workspace); + write_reax_atoms(); + + api->system->wsize = comm->nprocs; + + int num_nbrs = estimate_reax_lists(); + if (num_nbrs < 0) + error->all(FLERR,"Too many neighbors for pair style reax/c"); + + Make_List(api->system->total_cap,num_nbrs,TYP_FAR_NEIGHBOR,api->lists+FAR_NBRS); + (api->lists+FAR_NBRS)->error_ptr=error; + + write_reax_lists(); + + InitializeOMP(api->system,api->control,api->data,api->workspace,&api->lists,world); + for (int k = 0; k < api->system->N; ++k) { + num_bonds[k] = api->system->my_atoms[k].num_bonds; + num_hbonds[k] = api->system->my_atoms[k].num_hbonds; + } + + } else { + + // fill in reax datastructures + + write_reax_atoms(); + + // reset the bond list info for new atoms + + for (int k = oldN; k < api->system->N; ++k) + Set_End_Index(k, Start_Index(k, api->lists+BONDS), api->lists+BONDS); + + // estimate far neighbor list size + // Not present in MPI-only version + api->workspace->realloc.num_far = estimate_reax_lists(); + + // check if I need to shrink/extend my data-structs + + ReAllocate(api->system, api->control, api->data, api->workspace, &api->lists); + } +} + +/* ---------------------------------------------------------------------- */ + void PairReaxCOMP::compute(int eflag, int vflag) { double evdwl,ecoul; @@ -214,132 +336,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::init_style() -{ - if (!atom->q_flag) - error->all(FLERR,"Pair reax/c/omp requires atom attribute q"); - - // firstwarn = 1; - - bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) - || (modify->find_fix_by_style("^qeq/shielded") != -1)); - if (!have_qeq && qeqflag == 1) - error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); - - api->system->n = atom->nlocal; // my atoms - api->system->N = atom->nlocal + atom->nghost; // mine + ghosts - api->system->bigN = static_cast (atom->natoms); // all atoms in the system - api->system->wsize = comm->nprocs; - - if (atom->tag_enable == 0) - error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); - if (force->newton_pair == 0) - error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); - - if ((atom->map_tag_max > 99999999) && (comm->me == 0)) - error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c/omp " - "native output files may get misformatted or corrupted"); - - // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT - - if (atom->natoms > MAXSMALLINT) - error->all(FLERR,"Too many atoms for pair style reax/c/omp"); - - // need a half neighbor list w/ Newton off and ghost neighbors - // built whenever re-neighboring occurs - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->newton = 2; - neighbor->requests[irequest]->ghost = 1; - - cutmax = MAX3(api->control->nonb_cut, api->control->hbond_cut, api->control->bond_cut); - if ((cutmax < 2.0*api->control->bond_cut) && (comm->me == 0)) - error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " - "increased neighbor list skin."); - - for (int i = 0; i < LIST_N; ++i) - api->lists[i].allocated = 0; - - if (fix_reax == nullptr) { - modify->add_fix(fmt::format("{} all REAXC",fix_id)); - fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; - } - - api->control->nthreads = comm->nthreads; -} - -/* ---------------------------------------------------------------------- */ - -void PairReaxCOMP::setup() -{ - int oldN; - int mincap = api->system->mincap; - double safezone = api->system->safezone; - - api->system->n = atom->nlocal; // my atoms - api->system->N = atom->nlocal + atom->nghost; // mine + ghosts - oldN = api->system->N; - api->system->bigN = static_cast (atom->natoms); // all atoms in the system - - if (api->system->N > nmax) { - memory->destroy(num_nbrs_offset); - // Don't update nmax here. It is updated at end of compute(). - memory->create(num_nbrs_offset, api->system->N, "pair:num_nbrs_offset"); - } - - if (setup_flag == 0) { - - setup_flag = 1; - - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; - - // determine the local and total capacity - - api->system->local_cap = MAX((int)(api->system->n * safezone), mincap); - api->system->total_cap = MAX((int)(api->system->N * safezone), mincap); - - // initialize my data structures - - PreAllocate_Space(api->system, api->workspace); - write_reax_atoms(); - - int num_nbrs = estimate_reax_lists(); - Make_List(api->system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, api->lists+FAR_NBRS); - - write_reax_lists(); - - InitializeOMP(api->system, api->control, api->data, - api->workspace, &api->lists, world); - - for (int k = 0; k < api->system->N; ++k) { - num_bonds[k] = api->system->my_atoms[k].num_bonds; - num_hbonds[k] = api->system->my_atoms[k].num_hbonds; - } - - } else { - - // fill in reax datastructures - - write_reax_atoms(); - - // reset the bond list info for new atoms - - for (int k = oldN; k < api->system->N; ++k) - Set_End_Index(k, Start_Index(k, api->lists+BONDS), api->lists+BONDS); - - // estimate far neighbor list size - // Not present in MPI-only version - api->workspace->realloc.num_far = estimate_reax_lists(); - - // check if I need to shrink/extend my data-structs - - ReAllocate(api->system, api->control, api->data, api->workspace, &api->lists); - } -} - -/* ---------------------------------------------------------------------- */ - void PairReaxCOMP::write_reax_atoms() { int *num_bonds = fix_reax->num_bonds; diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index cccee3afe8..bfaa871b61 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -1,6 +1,5 @@ /*---------------------------------------------------------------------- PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd Copyright (2010) Purdue University @@ -27,15 +26,13 @@ ----------------------------------------------------------------------*/ #include "reaxff_omp.h" +#include "reaxff_api.h" #include "error.h" -#include "reaxff_api.h" - +#include #include -/* ---------------------------------------------------------------------- */ - namespace ReaxFF { static void Init_ListsOMP(reax_system *system, control_params *control, reax_list **lists) @@ -63,6 +60,7 @@ namespace ReaxFF { total_hbonds = (int)(MAX(total_hbonds*saferzone,mincap*system->minhbonds)); Make_List(system->Hcap, total_hbonds, TYP_HBOND,*lists+HBONDS); + (*lists+HBONDS)->error_ptr = system->error_ptr; } total_bonds = 0; @@ -73,6 +71,7 @@ namespace ReaxFF { bond_cap = (int)(MAX(total_bonds*safezone, mincap*MIN_BONDS)); Make_List(system->total_cap, bond_cap, TYP_BOND,*lists+BONDS); + (*lists+BONDS)->error_ptr = system->error_ptr; int nthreads = control->nthreads; reax_list *bonds = (*lists)+BONDS; @@ -84,14 +83,12 @@ namespace ReaxFF { /* 3bodies list */ cap_3body = (int)(MAX(num_3body*safezone, MIN_3BODIES)); Make_List(bond_cap, cap_3body, TYP_THREE_BODY,*lists+THREE_BODIES); + (*lists+THREE_BODIES)->error_ptr = system->error_ptr; free(hb_top); free(bond_top); } -/* ---------------------------------------------------------------------- */ - -// The only difference with the MPI-only function is calls to Init_ListsOMP and Init_Force_FunctionsOMP(). void InitializeOMP(reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, MPI_Comm world) @@ -100,7 +97,6 @@ namespace ReaxFF { Init_Simulation_Data(data); Init_Workspace(system,control,workspace); Init_ListsOMP(system,control,lists); - if (control->tabulate) Init_Lookup_Tables(system,control,workspace,world); } diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index eef7df53fd..4a1e92552d 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -376,8 +376,8 @@ void FixQEqReax::init() if (!atom->q_flag) error->all(FLERR,"Fix qeq/reax requires atom attribute q"); - ngroup = group->count(igroup); - if (ngroup == 0) error->all(FLERR,"Fix qeq/reax group has no atoms"); + if (group->count(igroup) == 0) + error->all(FLERR,"Fix qeq/reax group has no atoms"); // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index 9fc20f35d0..acd60f67b6 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -72,8 +72,6 @@ class FixQEqReax : public Fix { double *chi,*eta,*gamma; // qeq parameters double **shld; - bigint ngroup; - // fictitious charges double *s, *t; diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 5cd1556943..3c7980382e 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -12,8 +12,9 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Hasan Metin Aktulga, Purdue University - (now at Lawrence Berkeley National Laboratory, hmaktulga@lbl.gov) + Contributing author: + Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu + Per-atom energy/virial added by Ray Shan (Sandia) Fix reax/c/bonds and fix reax/c/species for pair_style reax/c added by Ray Shan (Sandia) @@ -26,7 +27,6 @@ #include "citeme.h" #include "comm.h" #include "error.h" -#include "fix.h" #include "fix_reaxc.h" #include "force.h" #include "memory.h" @@ -129,7 +129,7 @@ PairReaxC::~PairReaxC() if (api->control->tabulate) Deallocate_Lookup_Tables(api->system); - if (api->control->hbond_cut > 0) Delete_List(api->lists+HBONDS); + if (api->control->hbond_cut > 0) Delete_List(api->lists+HBONDS); Delete_List(api->lists+BONDS); Delete_List(api->lists+THREE_BODIES); Delete_List(api->lists+FAR_NBRS); @@ -335,8 +335,6 @@ void PairReaxC::init_style() if (!atom->q_flag) error->all(FLERR,"Pair style reax/c requires atom attribute q"); - // firstwarn = 1; - bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) || (modify->find_fix_by_style("^qeq/shielded") != -1)); if (!have_qeq && qeqflag == 1) @@ -351,9 +349,6 @@ void PairReaxC::init_style() error->all(FLERR,"Pair style reax/c requires atom IDs"); if (force->newton_pair == 0) error->all(FLERR,"Pair style reax/c requires newton pair on"); - if ((atom->map_tag_max > 99999999) && (comm->me == 0)) - error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c " - "native output files may get misformatted or corrupted"); // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT @@ -372,10 +367,6 @@ void PairReaxC::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - for (int i = 0; i < LIST_N; ++i) - if (api->lists[i].allocated != 1) - api->lists[i].allocated = 0; - if (fix_reax == nullptr) { modify->add_fix(fmt::format("{} all REAXC",fix_id)); fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; @@ -412,17 +403,18 @@ void PairReaxC::setup() PreAllocate_Space(api->system, api->workspace); write_reax_atoms(); + api->system->wsize = comm->nprocs; + int num_nbrs = estimate_reax_lists(); if (num_nbrs < 0) error->all(FLERR,"Too many neighbors for pair style reax/c"); - Make_List(api->system->total_cap, num_nbrs, - TYP_FAR_NEIGHBOR, api->lists+FAR_NBRS); + + Make_List(api->system->total_cap,num_nbrs,TYP_FAR_NEIGHBOR,api->lists+FAR_NBRS); (api->lists+FAR_NBRS)->error_ptr=error; write_reax_lists(); - api->system->wsize = comm->nprocs; - Initialize(api->system, api->control, api->data, - api->workspace, &api->lists, world); + + Initialize(api->system,api->control,api->data,api->workspace,&api->lists,world); for (int k = 0; k < api->system->N; ++k) { num_bonds[k] = api->system->my_atoms[k].num_bonds; num_hbonds[k] = api->system->my_atoms[k].num_hbonds; @@ -443,9 +435,6 @@ void PairReaxC::setup() ReAllocate(api->system, api->control, api->data, api->workspace, &api->lists); } - - bigint local_ngroup = list->inum; - MPI_Allreduce(&local_ngroup, &ngroup, 1, MPI_LMP_BIGINT, MPI_SUM, world); } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/pair_reaxc.h b/src/USER-REAXC/pair_reaxc.h index 9372f23ff4..ea5fe54481 100644 --- a/src/USER-REAXC/pair_reaxc.h +++ b/src/USER-REAXC/pair_reaxc.h @@ -54,8 +54,6 @@ class PairReaxC : public Pair { double **tmpbo,**tmpr; ReaxFF::API *api; - - bigint ngroup; typedef double rvec[3]; protected: diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index b79c5fe57c..fb5df616b3 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -288,6 +288,20 @@ namespace ReaxFF { Reallocate_Bonds_List(control, system, (*lists)+BONDS, &num_bonds, &est_3body); wsr->bonds = 0; wsr->num_3body = MAX(wsr->num_3body, est_3body) * 2; + + + if (system->omp_active) { + int nthreads = control->nthreads; + reax_list *bonds = (*lists)+BONDS; + + for (int i = 0; i < bonds->num_intrs; ++i) { + sfree(error, bonds->select.bond_list[i].bo_data.CdboReduction, + "CdboReduction"); + + bonds->select.bond_list[i].bo_data.CdboReduction = + (double*) smalloc(error, sizeof(double)*nthreads, "CdboReduction"); + } + } } /* 3-body list */ diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index d2b014947e..7e165d51e1 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -2,15 +2,16 @@ PuReMD - Purdue ReaxFF Molecular Dynamics Program Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu + + Contributing authors: + H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama + Corresponding author: + Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu Please cite the related publication: H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. + Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -165,11 +166,11 @@ namespace ReaxFF { simulation_data *data, storage *workspace, reax_list **lists, MPI_Comm world) { - Init_System(system, control); + Init_System(system,control); Init_Simulation_Data(data); - Init_Workspace(system, control, workspace); - Init_Lists(system, control, lists); + Init_Workspace(system,control,workspace); + Init_Lists(system,control,lists); if (control->tabulate) - Init_Lookup_Tables(system, control, workspace, world); + Init_Lookup_Tables(system,control,workspace,world); } } From d2008aa3623653c1897f63968393efc4730ed753 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 01:19:45 -0400 Subject: [PATCH 077/352] add test for reaxff using coulomb tabulation --- src/USER-REAXC/reaxc_init_md.cpp | 4 +- .../tests/atomic-pair-reax_c_tabulate.yaml | 174 ++++++++++++++++++ unittest/force-styles/tests/reaxff.control | 7 + 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml create mode 100644 unittest/force-styles/tests/reaxff.control diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 7e165d51e1..3c98e1f15d 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -27,13 +27,13 @@ #include "reaxff_api.h" +#include "error.h" + #include #include #include #include -#include "error.h" - namespace ReaxFF { void Init_System(reax_system *system, control_params *control) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml new file mode 100644 index 0000000000..ed599c837f --- /dev/null +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -0,0 +1,174 @@ +--- +lammps_version: 8 Apr 2021 +date_generated: Wed Apr 21 00:57:10 2021 +epsilon: 1e-12 +skip_tests: +prerequisites: ! | + pair reax/c + fix qeq/reax +pre_commands: ! | + echo screen + shell cp ${input_dir}/reaxff.control reaxff-1.control + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units real + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 12.0 + mass 2 13.0 + set type 1 type/fraction 2 0.5 998877 + set type 1 charge 0.01 + set type 2 charge -0.01 + velocity all create 100 4534624 loop geom +post_commands: ! | + fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c +input_file: in.empty +pair_style: reax/c reaxff-1.control checkqeq yes +pair_coeff: ! | + * * ffield.reax.mattsson C O +extract: ! "" +natoms: 64 +init_vdwl: -4208.203794533516 +init_coul: -268.0258681099902 +init_stress: ! |2- + 2.3677048490913976e+03 3.0802122558796082e+03 1.2727815110251254e+03 -1.5387991688241113e+03 -1.0906364142627658e+03 1.1229877249527667e+03 +init_forces: ! |2 + 1 2.9634051452065776e+01 -5.6267761875029782e+02 -1.6668253255994802e+02 + 2 -1.5938437728856897e+02 -2.2076601831947826e+02 -1.7161994484504669e+02 + 3 -3.1194106231031462e+01 -3.0591930644160692e+02 4.4652570958825507e+01 + 4 4.4646653320082436e+02 1.7080811286685625e+02 1.7439026170462094e+02 + 5 -1.1512606621588829e+02 7.9716954463493224e+01 1.7959700550214329e+01 + 6 -7.1695199301547871e+02 4.0749156820934594e+01 2.1512037025856768e+02 + 7 2.3022543693175331e+02 -9.0170756873740558e+01 8.2190170006875675e+01 + 8 -2.1141251466328132e+01 -1.5635879347045079e+02 1.6101907187955612e+02 + 9 -1.2130842270564283e+02 -2.7960689135651160e+02 -1.9629114850255749e+02 + 10 -3.7631710890094666e+02 3.4103240548851926e+02 -1.8166279141134461e+02 + 11 -1.6154553323850425e+02 1.5743068117721410e+02 3.5832389058234611e+02 + 12 6.1602989065568624e+02 -1.4821564423107765e+02 1.0871005319351426e+02 + 13 -2.1366561068642801e+02 -3.0163595494898948e+02 5.2420406156017953e+02 + 14 2.5933950255876238e+02 -1.7967300062473768e+01 -2.7733367021016375e+02 + 15 1.7570537661853186e+02 1.7550639099555497e+02 -9.5789475936343749e+01 + 16 3.0588529285449920e+02 -4.7675556549224140e+01 -3.4330544488852303e+02 + 17 -1.5018545342618870e+02 1.3259542010622351e+02 2.3200545258700299e+02 + 18 1.6469564396901546e+02 -1.0816413254489154e+02 2.1207485840068557e+02 + 19 2.4759285902963390e+02 -4.8758383780485623e+01 -2.2494100786656901e+02 + 20 1.2418785577586725e+02 2.5137242577508303e+02 -1.5341186115659308e+01 + 21 -1.9556210564941841e+02 2.3152590535658355e+01 -1.2529729601998551e+02 + 22 2.4829386068623685e+02 -2.9828789153728195e+02 -4.0455445433014944e+01 + 23 8.2076007650220902e+01 1.3042103437662357e+02 1.5221389911913158e+02 + 24 -7.6912973583042813e+01 2.3539925428986885e+02 -1.7129603802743895e+02 + 25 -2.9782413878301764e+01 -1.8931910469292632e+02 6.7989202537824610e+01 + 26 -3.9488494691904407e+01 2.1025614475916794e+00 -2.0748963060920084e+02 + 27 -2.7704110443956750e+02 5.3736974078117703e+02 4.2318884882972577e+02 + 28 -2.9303219943094604e+02 -5.1154115419361588e+01 -2.3633993403334915e+02 + 29 1.2970484011863061e+02 -4.2266229541142110e+01 1.6350076614995828e+02 + 30 5.6925606430591166e+01 3.7880191852724600e+01 6.8636397133459397e+01 + 31 -1.9325596697353996e+02 -1.1645368911554472e+02 -2.0671692760919722e+01 + 32 1.2360965200040813e+02 -3.3253411369721618e+01 -1.0516118458985304e+02 + 33 6.5241847803273885e+01 3.7105112939424635e+02 6.0972558235447849e+01 + 34 -2.3124259597682195e+02 -1.1681740329854802e+02 -2.5838262648358682e+02 + 35 -4.1912226107425607e+02 7.9942920270887299e+01 3.1021023518170796e+02 + 36 -1.8561789047315065e+02 -1.1563628711189787e+02 -4.2360172436435668e+01 + 37 8.8271496728328600e+00 -3.5266450940709689e+02 -6.0505384072732632e+01 + 38 -1.9249505149101950e+01 1.1716319600338795e+02 -2.3477222840168844e+02 + 39 -1.0433878247327728e+01 -7.0902801856110116e+01 1.4264113912369351e+02 + 40 3.3265570779158168e+02 -8.8675933035692435e+02 1.6250845779881573e+01 + 41 -6.4537349815946172e+01 1.5189506353180369e+02 -1.8225353662793415e+02 + 42 2.3368723487157848e+01 1.1821526860005753e+02 4.1207323013202608e+02 + 43 -3.5145546474526668e+01 -3.6511647370512939e+00 2.4936793079205805e+02 + 44 -1.2881828259541797e+00 -2.4877240180804270e+02 7.9235766494551896e+01 + 45 2.0871504532586613e+02 -1.0817588901351927e+02 -4.1291808327433904e+02 + 46 -1.3837716960728835e+02 4.6114279241763722e+02 -2.4013801845141236e+02 + 47 1.3255320792802306e+02 2.8747276038940731e+02 -3.2896384987636942e+01 + 48 7.8145138718949806e+02 6.5215432481146109e+01 -6.2304789958703225e+02 + 49 2.4486314507346734e+02 1.9101300126656582e+01 3.7417037047544437e+02 + 50 2.9821275118602205e+02 3.0684252095007048e+02 5.6994896759618052e+02 + 51 -8.0052405736429807e+02 5.1024940640341299e+02 7.5829315450277397e+02 + 52 -9.2130898885938862e+01 1.1909837120724032e+02 -2.4118832391138585e+02 + 53 -3.6386926333478533e+02 -2.0729203700042135e+02 -3.4910517647665347e+02 + 54 -8.3399710534951524e+01 1.8942260327525179e+02 -1.2868598438438329e+02 + 55 -2.5305956575884065e+02 -1.1005916187118694e+02 -3.0893514828399697e+02 + 56 1.7364614503217334e+02 -2.5754370913441153e+02 -4.3744509948721834e+01 + 57 4.2667925201499622e+02 1.5529221173799826e+02 -3.9988499000699767e+02 + 58 -3.9656744140970858e+01 7.8953243693724005e+01 2.6135299122198956e+02 + 59 -2.7594240444747430e+02 1.9891763338583493e+02 2.4122500794450380e+02 + 60 -2.5675904361260217e+02 -1.1527171320985197e+02 9.9923550442518007e+01 + 61 3.0884427580008497e+02 4.9986415802549533e+02 -1.3369122169831985e+02 + 62 2.8530106503455144e+01 5.9540697570421841e-01 -2.7403025931182458e+02 + 63 2.5297054006405503e+02 -2.7640485799384788e+02 -1.9200503841910373e+02 + 64 -8.4680445259253446e+01 -1.5737027404336791e+02 1.5637808719883620e+02 +run_vdwl: -4208.209603101806 +run_coul: -268.02583477440504 +run_stress: ! |2- + 2.3675903993340926e+03 3.0802227297803529e+03 1.2727311522662451e+03 -1.5388669378284644e+03 -1.0907269208283653e+03 1.1229243202763250e+03 +run_forces: ! |2 + 1 2.9635294281596629e+01 -5.6267712552695355e+02 -1.6667999923844260e+02 + 2 -1.5938673400153084e+02 -2.2076536449681615e+02 -1.7162354129443358e+02 + 3 -3.1189858281107686e+01 -3.0593580065881065e+02 4.4645958607276903e+01 + 4 4.4646581891372387e+02 1.7080959763779416e+02 1.7439093938226924e+02 + 5 -1.1512839796353090e+02 7.9717058687928301e+01 1.7957487669503269e+01 + 6 -7.1695602565953754e+02 4.0752829698565129e+01 2.1512533839229457e+02 + 7 2.3022644486519411e+02 -9.0168915600548360e+01 8.2194655874266601e+01 + 8 -2.1149264848797216e+01 -1.5637111051642705e+02 1.6102981315496413e+02 + 9 -1.2130987756626666e+02 -2.7961363383950726e+02 -1.9628960069614115e+02 + 10 -3.7631817089744851e+02 3.4103259385937554e+02 -1.8166532788358310e+02 + 11 -1.6154687915128738e+02 1.5742797820592227e+02 3.5832199951133208e+02 + 12 6.1603841944462704e+02 -1.4820397700323306e+02 1.0871524086058155e+02 + 13 -2.1367529106933924e+02 -3.0167446795626824e+02 5.2424091634186300e+02 + 14 2.5933827511241435e+02 -1.7968203382134384e+01 -2.7733114072539058e+02 + 15 1.7570793004243023e+02 1.7551005525188847e+02 -9.5784231788978602e+01 + 16 3.0586985592967716e+02 -4.7679566105942172e+01 -3.4332192731503403e+02 + 17 -1.5018636472333401e+02 1.3259146324637055e+02 2.3200578297676140e+02 + 18 1.6469881174805093e+02 -1.0816836176977682e+02 2.1207670716679300e+02 + 19 2.4759420520504440e+02 -4.8758383157728915e+01 -2.2494116682878234e+02 + 20 1.2419960666451705e+02 2.5137933265662170e+02 -1.5328241144751686e+01 + 21 -1.9556094492800662e+02 2.3151723982044651e+01 -1.2529581330697289e+02 + 22 2.4829941584477842e+02 -2.9829345245035574e+02 -4.0446702084691779e+01 + 23 8.2074458696899129e+01 1.3042100306282259e+02 1.5221371881646226e+02 + 24 -7.6917668833498695e+01 2.3540360228737018e+02 -1.7130192995353460e+02 + 25 -2.9742104523791699e+01 -1.8935699467869648e+02 6.7995874219740458e+01 + 26 -3.9494943772601978e+01 2.1074054704282794e+00 -2.0748981609858308e+02 + 27 -2.7704003655184448e+02 5.3736954143364790e+02 4.2318574013793062e+02 + 28 -2.9302855291124280e+02 -5.1149666118966557e+01 -2.3633679976948292e+02 + 29 1.2970505460339569e+02 -4.2266433901944204e+01 1.6349685185794760e+02 + 30 5.6925896868063084e+01 3.7880918758222101e+01 6.8637128510015330e+01 + 31 -1.9325534294265930e+02 -1.1645328076629426e+02 -2.0671892621504877e+01 + 32 1.2360198063080443e+02 -3.3253019999909611e+01 -1.0516936549559779e+02 + 33 6.5239383936206508e+01 3.7104662858438877e+02 6.0974455303728860e+01 + 34 -2.3124084085036844e+02 -1.1681523003030674e+02 -2.5837805461650709e+02 + 35 -4.1912113383000468e+02 7.9943750613167680e+01 3.1020725803703027e+02 + 36 -1.8561422052424510e+02 -1.1563434085918074e+02 -4.2360108129535796e+01 + 37 8.8275421441412476e+00 -3.5266971563405309e+02 -6.0507541453139780e+01 + 38 -1.9245036832024766e+01 1.1717726898935943e+02 -2.3478417248417912e+02 + 39 -1.0434224692463781e+01 -7.0902644440215226e+01 1.4263978421853071e+02 + 40 3.3271177801097338e+02 -8.8679293552761737e+02 1.6219742097553457e+01 + 41 -6.4538764986414577e+01 1.5189397693607691e+02 -1.8225441696792819e+02 + 42 2.3368235855730731e+01 1.1822246665291377e+02 4.1207745038648687e+02 + 43 -3.5145643416897457e+01 -3.6517162542343855e+00 2.4936784352977961e+02 + 44 -1.2879745400833591e+00 -2.4877345145141396e+02 7.9236449970507763e+01 + 45 2.0871643412337198e+02 -1.0817571271699651e+02 -4.1291831345624706e+02 + 46 -1.3836372705478144e+02 4.6117938292253501e+02 -2.4016736526221220e+02 + 47 1.3255125611057710e+02 2.8747591615866617e+02 -3.2895660248667433e+01 + 48 7.8145417759951215e+02 6.5214930060411348e+01 -6.2304930828893896e+02 + 49 2.4488281403353915e+02 1.9105496615716447e+01 3.7418605144303535e+02 + 50 2.9822129513621309e+02 3.0683153982656597e+02 5.6994490418774978e+02 + 51 -8.0058572063783151e+02 5.1028617285838249e+02 7.5832431569026710e+02 + 52 -9.2137024513817948e+01 1.1910687193197515e+02 -2.4119120858090670e+02 + 53 -3.6387082584323133e+02 -2.0729771077062716e+02 -3.4910499737662099e+02 + 54 -8.3401322475873869e+01 1.8942466656601317e+02 -1.2869045777948361e+02 + 55 -2.5309678413623200e+02 -1.1001947899857403e+02 -3.0896372370121441e+02 + 56 1.7364604574034126e+02 -2.5754429115053944e+02 -4.3743962050163233e+01 + 57 4.2666362581864416e+02 1.5528157995542574e+02 -3.9988032807909389e+02 + 58 -3.9656744873549869e+01 7.8953170999147900e+01 2.6135222052406010e+02 + 59 -2.7594581611209134e+02 1.9891770704099989e+02 2.4122933700016557e+02 + 60 -2.5675992319680108e+02 -1.1527235824442386e+02 9.9923831048631499e+01 + 61 3.0884428120705229e+02 4.9986711220597209e+02 -1.3369013376796403e+02 + 62 2.8530678742626058e+01 5.9283151669356982e-01 -2.7403002505094940e+02 + 63 2.5296775626792657e+02 -2.7640525289662452e+02 -1.9200401038409547e+02 + 64 -8.4674586435535105e+01 -1.5736397776829435e+02 1.5637348700622513e+02 +... diff --git a/unittest/force-styles/tests/reaxff.control b/unittest/force-styles/tests/reaxff.control new file mode 100644 index 0000000000..ecf22940b7 --- /dev/null +++ b/unittest/force-styles/tests/reaxff.control @@ -0,0 +1,7 @@ +tabulate_long_range 10000 ! denotes the granularity of long range tabulation, 0 means no tabulation + +nbrhood_cutoff 4.5 ! near neighbors cutoff for bond calculations in A +hbond_cutoff 6.0 ! cutoff distance for hydrogen bond interactions +bond_graph_cutoff 0.3 ! bond strength cutoff for bond graphs +thb_cutoff 0.001 ! cutoff value for three body interactions + From 82ecfabe2267c8d5f4b60a95e4cfecf8a781d89f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 01:29:48 -0400 Subject: [PATCH 078/352] remove more unused code and structs --- src/USER-REAXC/pair_reaxc.cpp | 2 -- src/USER-REAXC/reaxc_list.cpp | 29 ----------------------------- src/USER-REAXC/reaxff_defs.h | 5 ++--- src/USER-REAXC/reaxff_types.h | 13 ------------- 4 files changed, 2 insertions(+), 47 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 3c7980382e..ea4e2509ce 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -758,8 +758,6 @@ double PairReaxC::memory_usage() bytes += (double)2.0 * api->lists->n * sizeof(int); bytes += (double)api->lists->num_intrs * sizeof(three_body_interaction_data); bytes += (double)api->lists->num_intrs * sizeof(bond_data); - bytes += (double)api->lists->num_intrs * sizeof(dbond_data); - bytes += (double)api->lists->num_intrs * sizeof(dDelta_data); bytes += (double)api->lists->num_intrs * sizeof(far_neighbor_data); bytes += (double)api->lists->num_intrs * sizeof(hbond_data); diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index 1063328f8e..a31d300103 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -46,11 +46,6 @@ namespace ReaxFF { l->type = type; switch(l->type) { - case TYP_VOID: - if (l->select.v) sfree(l->error_ptr, l->select.v, "list:v"); - l->select.v = (void*) smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(void*), "list:v"); - break; - case TYP_THREE_BODY: if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); l->select.three_body_list = (three_body_interaction_data*) @@ -64,18 +59,6 @@ namespace ReaxFF { smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(bond_data), "list:bonds"); break; - case TYP_DBO: - if (l->select.dbo_list) sfree(l->error_ptr, l->select.dbo_list,"list:dbonds"); - l->select.dbo_list = (dbond_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dbond_data), "list:dbonds"); - break; - - case TYP_DDELTA: - if (l->select.dDelta_list) sfree(l->error_ptr, l->select.dDelta_list,"list:dDeltas"); - l->select.dDelta_list = (dDelta_data*) - smalloc(l->error_ptr, (rc_bigint) num_intrs * sizeof(dDelta_data), "list:dDeltas"); - break; - case TYP_FAR_NEIGHBOR: if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); l->select.far_nbr_list = (far_neighbor_data*) @@ -105,10 +88,6 @@ namespace ReaxFF { l->end_index = nullptr; switch(l->type) { - case TYP_VOID: - sfree(l->error_ptr, l->select.v, "list:v"); - l->select.v = nullptr; - break; case TYP_HBOND: sfree(l->error_ptr, l->select.hbond_list, "list:hbonds"); l->select.hbond_list = nullptr; @@ -121,14 +100,6 @@ namespace ReaxFF { sfree(l->error_ptr, l->select.bond_list, "list:bonds"); l->select.bond_list = nullptr; break; - case TYP_DBO: - sfree(l->error_ptr, l->select.dbo_list, "list:dbos"); - l->select.dbo_list = nullptr; - break; - case TYP_DDELTA: - sfree(l->error_ptr, l->select.dDelta_list, "list:dDeltas"); - l->select.dDelta_list = nullptr; - break; case TYP_THREE_BODY: sfree(l->error_ptr, l->select.three_body_list, "list:three_bodies"); l->select.three_body_list = nullptr; diff --git a/src/USER-REAXC/reaxff_defs.h b/src/USER-REAXC/reaxff_defs.h index 2727fb897e..df31d41d4c 100644 --- a/src/USER-REAXC/reaxff_defs.h +++ b/src/USER-REAXC/reaxff_defs.h @@ -59,9 +59,8 @@ namespace ReaxFF { /******************* ENUMERATORS *************************/ - enum lists { BONDS, THREE_BODIES, HBONDS, FAR_NBRS, LIST_N }; - enum interactions {TYP_VOID, TYP_BOND, TYP_THREE_BODY, - TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_DBO, TYP_DDELTA, TYP_N}; + enum {BONDS, THREE_BODIES, HBONDS, FAR_NBRS, LIST_N}; + enum {TYP_BOND, TYP_THREE_BODY, TYP_HBOND, TYP_FAR_NEIGHBOR, TYP_N}; } #endif diff --git a/src/USER-REAXC/reaxff_types.h b/src/USER-REAXC/reaxff_types.h index 1a68116391..c88e0f5a6a 100644 --- a/src/USER-REAXC/reaxff_types.h +++ b/src/USER-REAXC/reaxff_types.h @@ -293,16 +293,6 @@ namespace ReaxFF far_neighbor_data *ptr; }; - struct dDelta_data { - int wrt; - rvec dVal; - }; - - struct dbond_data { - int wrt; - rvec dBO, dBOpi, dBOpi2; - }; - struct bond_order_data { double BO, BO_s, BO_pi, BO_pi2; double Cdbo, Cdbopi, Cdbopi2; @@ -372,11 +362,8 @@ namespace ReaxFF union list_type { - void *v; three_body_interaction_data *three_body_list; bond_data *bond_list; - dbond_data *dbo_list; - dDelta_data *dDelta_list; far_neighbor_data *far_nbr_list; hbond_data *hbond_list; }; From 9b59e901bc454e6981d44dbd62122d98ad9f28dc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 09:54:59 -0400 Subject: [PATCH 079/352] update reax/c tests. disable OpenMP tests as that code is broken. --- .../tests/atomic-pair-reax_c.yaml | 290 ++++++++--------- .../tests/atomic-pair-reax_c_lgvdw.yaml | 291 +++++++++--------- .../tests/atomic-pair-reax_c_noqeq.yaml | 4 +- .../tests/atomic-pair-reax_c_tabulate.yaml | 291 +++++++++--------- 4 files changed, 443 insertions(+), 433 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index 857326b10d..570233f4bd 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,8 +1,8 @@ --- lammps_version: 8 Apr 2021 -date_generated: Tue Apr 20 16:11:55 2021 -epsilon: 1e-10 -skip_tests: +date_generated: Wed Apr 21 09:14:10 2021 +epsilon: 1e-11 +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -15,159 +15,163 @@ pre_commands: ! | atom_style charge lattice diamond 3.77 region box block 0 2 0 2 0 2 - create_box 2 box + create_box 3 box create_atoms 1 box displace_atoms all random 0.1 0.1 0.1 623426 - mass 1 12.0 - mass 2 13.0 + mass 1 1.0 + mass 2 12.0 + mass 3 16.0 set type 1 type/fraction 2 0.5 998877 - set type 1 charge 0.01 - set type 2 charge -0.01 + set type 2 type/fraction 3 0.5 887766 + set type 1 charge 0.00 + set type 2 charge 0.01 + set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c + pair_modify nofdotr input_file: in.empty pair_style: reax/c NULL checkqeq yes pair_coeff: ! | - * * ffield.reax.mattsson C O + * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -4208.203794533267 -init_coul: -268.0258681099893 +init_vdwl: -3296.3503506624793 +init_coul: -327.06551252279587 init_stress: ! |2- - 2.3677048490925813e+03 3.0802122558807969e+03 1.2727815110263937e+03 -1.5387991688242109e+03 -1.0906364142628713e+03 1.1229877249527449e+03 + 3.0523786192092821e+03 3.0876898599834703e+03 3.2008340933315003e+03 -9.2310133390813661e+01 -2.9719470139173262e+02 -8.6006991065711546e+01 init_forces: ! |2 - 1 2.9634051452064185e+01 -5.6267761875030578e+02 -1.6668253255995427e+02 - 2 -1.5938437728855834e+02 -2.2076601831947630e+02 -1.7161994484503376e+02 - 3 -3.1194106231028943e+01 -3.0591930644159874e+02 4.4652570958842091e+01 - 4 4.4646653320084567e+02 1.7080811286684130e+02 1.7439026170464035e+02 - 5 -1.1512606621591536e+02 7.9716954463499022e+01 1.7959700550221577e+01 - 6 -7.1695199301548041e+02 4.0749156820926302e+01 2.1512037025856239e+02 - 7 2.3022543693175217e+02 -9.0170756873726333e+01 8.2190170006889645e+01 - 8 -2.1141251466334634e+01 -1.5635879347045886e+02 1.6101907187957218e+02 - 9 -1.2130842270563915e+02 -2.7960689135651120e+02 -1.9629114850256667e+02 - 10 -3.7631710890095133e+02 3.4103240548851863e+02 -1.8166279141134066e+02 - 11 -1.6154553323853384e+02 1.5743068117724297e+02 3.5832389058241489e+02 - 12 6.1602989065569886e+02 -1.4821564423105795e+02 1.0871005319350247e+02 - 13 -2.1366561068643219e+02 -3.0163595494900011e+02 5.2420406156019726e+02 - 14 2.5933950255875533e+02 -1.7967300062459064e+01 -2.7733367021016983e+02 - 15 1.7570537661854226e+02 1.7550639099554951e+02 -9.5789475936342853e+01 - 16 3.0588529285450090e+02 -4.7675556549230315e+01 -3.4330544488854196e+02 - 17 -1.5018545342619470e+02 1.3259542010621982e+02 2.3200545258699555e+02 - 18 1.6469564396901654e+02 -1.0816413254489510e+02 2.1207485840068148e+02 - 19 2.4759285902963026e+02 -4.8758383780523836e+01 -2.2494100786658765e+02 - 20 1.2418785577587857e+02 2.5137242577506828e+02 -1.5341186115637054e+01 - 21 -1.9556210564941867e+02 2.3152590535678623e+01 -1.2529729601999072e+02 - 22 2.4829386068622458e+02 -2.9828789153726473e+02 -4.0455445433038705e+01 - 23 8.2076007650237955e+01 1.3042103437664485e+02 1.5221389911915190e+02 - 24 -7.6912973583045328e+01 2.3539925428983466e+02 -1.7129603802744774e+02 - 25 -2.9782413878295884e+01 -1.8931910469291046e+02 6.7989202537813426e+01 - 26 -3.9488494691930782e+01 2.1025614476190424e+00 -2.0748963060916628e+02 - 27 -2.7704110443958297e+02 5.3736974078118158e+02 4.2318884882973293e+02 - 28 -2.9303219943093302e+02 -5.1154115419355229e+01 -2.3633993403335379e+02 - 29 1.2970484011865997e+02 -4.2266229541184131e+01 1.6350076614993492e+02 - 30 5.6925606430580402e+01 3.7880191852747046e+01 6.8636397133447261e+01 - 31 -1.9325596697353834e+02 -1.1645368911553673e+02 -2.0671692760916812e+01 - 32 1.2360965200043042e+02 -3.3253411369754360e+01 -1.0516118458992996e+02 - 33 6.5241847803263653e+01 3.7105112939425635e+02 6.0972558235451928e+01 - 34 -2.3124259597682851e+02 -1.1681740329855472e+02 -2.5838262648358858e+02 - 35 -4.1912226107430826e+02 7.9942920270906228e+01 3.1021023518174763e+02 - 36 -1.8561789047309296e+02 -1.1563628711183125e+02 -4.2360172436503717e+01 - 37 8.8271496727767698e+00 -3.5266450940716857e+02 -6.0505384072663695e+01 - 38 -1.9249505149115080e+01 1.1716319600342219e+02 -2.3477222840170350e+02 - 39 -1.0433878247334579e+01 -7.0902801856116241e+01 1.4264113912369183e+02 - 40 3.3265570779157940e+02 -8.8675933035692253e+02 1.6250845779884724e+01 - 41 -6.4537349815891190e+01 1.5189506353185567e+02 -1.8225353662797988e+02 - 42 2.3368723487140532e+01 1.1821526860010481e+02 4.1207323013207559e+02 - 43 -3.5145546474533603e+01 -3.6511647370358964e+00 2.4936793079206421e+02 - 44 -1.2881828259467285e+00 -2.4877240180803770e+02 7.9235766494558362e+01 - 45 2.0871504532588767e+02 -1.0817588901356530e+02 -4.1291808327438582e+02 - 46 -1.3837716960728255e+02 4.6114279241763722e+02 -2.4013801845141728e+02 - 47 1.3255320792802377e+02 2.8747276038939981e+02 -3.2896384987644886e+01 - 48 7.8145138718954991e+02 6.5215432481105154e+01 -6.2304789958706840e+02 - 49 2.4486314507345327e+02 1.9101300126651807e+01 3.7417037047544727e+02 - 50 2.9821275118603683e+02 3.0684252095008105e+02 5.6994896759617143e+02 - 51 -8.0052405736417188e+02 5.1024940640330806e+02 7.5829315450290915e+02 - 52 -9.2130898885915201e+01 1.1909837120722082e+02 -2.4118832391136655e+02 - 53 -3.6386926333489237e+02 -2.0729203700030763e+02 -3.4910517647679171e+02 - 54 -8.3399710534966360e+01 1.8942260327526213e+02 -1.2868598438440796e+02 - 55 -2.5305956575883852e+02 -1.1005916187118478e+02 -3.0893514828399947e+02 - 56 1.7364614503216589e+02 -2.5754370913449043e+02 -4.3744509948719575e+01 - 57 4.2667925201499298e+02 1.5529221173799095e+02 -3.9988499000700682e+02 - 58 -3.9656744140978226e+01 7.8953243693724033e+01 2.6135299122199172e+02 - 59 -2.7594240444753677e+02 1.9891763338587063e+02 2.4122500794453137e+02 - 60 -2.5675904361258932e+02 -1.1527171320987564e+02 9.9923550442534349e+01 - 61 3.0884427580009310e+02 4.9986415802549146e+02 -1.3369122169832409e+02 - 62 2.8530106503456519e+01 5.9540697570827006e-01 -2.7403025931181190e+02 - 63 2.5297054006404551e+02 -2.7640485799385101e+02 -1.9200503841907977e+02 - 64 -8.4680445259248458e+01 -1.5737027404337621e+02 1.5637808719882156e+02 -run_vdwl: -4208.209603101557 -run_coul: -268.02583477440254 + 1 -8.8484559491557889e+01 -2.5824737864578637e+01 1.0916228789487674e+02 + 2 -1.1227736122976223e+02 -1.8092349731667611e+02 -2.2420586526896261e+02 + 3 -1.7210817575849026e+02 1.8292439782308702e+02 1.3552618819720569e+01 + 4 3.2997500231085198e+01 -5.1076027616185407e+01 9.0475628837095513e+01 + 5 1.8144778146274791e+02 1.6797701000587452e+01 -8.1725507301127038e+01 + 6 1.3634094180728110e+02 -3.0056789474000180e+02 2.9661495129805971e+01 + 7 -5.3287158661291762e+01 -1.2872927610192625e+02 -1.6347871108897493e+02 + 8 -1.5334883257588757e+02 4.0171483324130726e+01 1.5317461163040997e+02 + 9 1.8364155867634079e+01 8.1986572088186804e+01 2.8272397798081524e+01 + 10 8.4246730110712534e+01 1.4177487113456962e+02 1.2330079878579957e+02 + 11 -4.3218423112520902e+01 6.5551082199289709e+01 1.3464882148706636e+02 + 12 -9.7317470492933836e+01 -2.6234999414154014e+01 7.2277941881646539e+00 + 13 -6.3183329836753863e+01 -4.7368101002971272e+01 -3.7592654029315028e+01 + 14 7.8642975316486172e+01 -6.7997612991897427e+01 -9.9044775614596048e+01 + 15 -6.6373732796038979e+01 2.1787558547532143e+02 8.0103149369093387e+01 + 16 1.9216166082224373e+02 5.3228015320734826e+01 6.6260214054210593e+01 + 17 1.4496007689503062e+02 -3.9700923044583718e+01 -9.7503851828130053e+01 + 18 -4.4989550233790240e+01 -1.9360605894359739e+02 1.1274792197022482e+02 + 19 2.6657528138945770e+02 3.7189510796650950e+02 -3.3847307488287697e+02 + 20 -7.6341040242469418e+01 -8.8478925962203348e+01 1.3557778212060649e+00 + 21 -7.1188591900926752e+01 -5.1591439985136624e+01 -1.2279442803769274e+02 + 22 1.5504836733039957e+02 -1.3094504458746073e+02 8.1474408030760628e+01 + 23 7.8015302036861655e+01 -1.3272310040521637e+01 -2.2771427736544169e+01 + 24 -2.0546718065741098e+02 2.1611071031053456e+02 -1.2423208053538966e+02 + 25 -1.1402686646199034e+02 1.9100238121128132e+02 -8.3504908417580012e+01 + 26 2.8663576552098777e+02 -2.1773884754170604e+02 2.3144300100087472e+02 + 27 -6.3247409025611177e+01 6.9122196748087063e+01 1.8606936744368775e+02 + 28 -3.5426011055935223e+00 3.8764809029451868e+01 3.2874001946768942e+01 + 29 -7.1069178571876577e+01 3.5485903180427719e+01 2.7311648896320207e+01 + 30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123538e+02 + 31 -1.3970409889743334e+02 1.6660943915628047e+02 -1.2913930522474701e+02 + 32 2.7179130444112268e+01 -6.0169059447629913e+01 -1.7669495182022038e+02 + 33 -6.2659679124099597e+01 -6.4422131921795355e+01 6.4150928205326579e+01 + 34 -2.2119065265693539e+01 1.0450386886830508e+02 -7.3998379587547845e+01 + 35 2.6982987783286296e+02 -2.1519317040003412e+02 1.3051628460669610e+02 + 36 1.0368628874516664e+02 1.8817377639779619e+02 -1.9748944223870336e+02 + 37 -1.8009522406836993e+02 1.2993653092243849e+02 -6.3523043394051776e+01 + 38 -2.9571205878459978e+02 1.0441609933482223e+02 1.5582204859042619e+02 + 39 8.7398805727029284e+01 -6.0025559644669258e+01 2.2209742009837157e+01 + 40 2.0540672579010824e+01 -1.0735874009092363e+02 5.8655918369892206e+01 + 41 -5.8895846271372314e+01 1.1852345624639781e+01 -6.6147257724570267e+01 + 42 -9.6895512314642531e+01 3.8928741136688728e+01 -7.5791929957116224e+01 + 43 2.2476051812062417e+02 9.5505204283237461e+01 1.2309042240718740e+02 + 44 8.9817373579488645e+01 -1.0616333580628948e+02 -8.6321519086255435e+01 + 45 1.7202629662584396e+01 1.2890307246697839e+02 5.2916171301068474e+01 + 46 1.3547783972601877e+01 -2.9276223331260056e+01 2.2187412696867373e+01 + 47 3.3389762514712238e+01 -1.9217585014965047e+02 -6.9956213241088250e+01 + 48 7.3631720332112678e+01 -2.0953007324688525e+02 -2.3183566221404714e+01 + 49 -3.7589944473227274e+02 -2.4083165714763936e+01 1.0770339502610540e+02 + 50 3.8603083564823841e+01 -7.3616481568799330e+01 9.0414065019644596e+01 + 51 1.3736420686706188e+02 -1.0204157331506994e+02 1.5813725581150808e+02 + 52 -1.0797257051087823e+02 1.1876975735151167e+02 -1.3295758126486243e+02 + 53 -5.3807540206295343e+01 3.3259462625854701e+02 -3.8426833263045523e-03 + 54 -1.0690184616186750e+01 6.2820270853646399e+01 1.8343158343321130e+02 + 55 1.1231900459987581e+02 -1.7906654831317169e+02 7.6533681064340868e+01 + 56 -4.1027190034916586e+01 -1.4085413191133767e+02 3.7483064289953241e+01 + 57 9.9904315214040494e+01 7.0938939080461637e+01 -6.8654961257661526e+01 + 58 -2.7563642882026745e+01 -6.7445498717142405e+00 -1.8442640542823220e+01 + 59 -6.6628933617875404e+01 1.0613066354110040e+02 8.7736153919831665e+01 + 60 -1.7748415247439002e+01 6.3757605316872542e+01 -1.5086907478326543e+02 + 61 -3.3560907195791366e+01 -1.0076987083174089e+02 -7.4536106106935804e+01 + 62 1.5883428926665005e+01 -5.8433760297908881e+00 2.8392494016034949e+01 + 63 1.3294494001298790e+02 -1.2724568063770238e+02 -6.4886848316806251e+01 + 64 1.0738157273930990e+02 1.2062173788161539e+02 7.4541400611710785e+01 +run_vdwl: -3296.346882377749 +run_coul: -327.0653995073912 run_stress: ! |2- - 2.3675903993352799e+03 3.0802227297815411e+03 1.2727311522674922e+03 -1.5388669378285692e+03 -1.0907269208284702e+03 1.1229243202763012e+03 + 3.0523824138350801e+03 3.0876910136734191e+03 3.2008348843495064e+03 -9.2310681174629309e+01 -2.9719286551009412e+02 -8.6004906282204530e+01 run_forces: ! |2 - 1 2.9635294281594891e+01 -5.6267712552696150e+02 -1.6667999923844903e+02 - 2 -1.5938673400152015e+02 -2.2076536449681436e+02 -1.7162354129442059e+02 - 3 -3.1189858281105185e+01 -3.0593580065880258e+02 4.4645958607293259e+01 - 4 4.4646581891374524e+02 1.7080959763777909e+02 1.7439093938228865e+02 - 5 -1.1512839796355780e+02 7.9717058687934127e+01 1.7957487669510552e+01 - 6 -7.1695602565953936e+02 4.0752829698557036e+01 2.1512533839228914e+02 - 7 2.3022644486519332e+02 -9.0168915600534049e+01 8.2194655874280542e+01 - 8 -2.1149264848803984e+01 -1.5637111051643518e+02 1.6102981315498010e+02 - 9 -1.2130987756626322e+02 -2.7961363383950686e+02 -1.9628960069615047e+02 - 10 -3.7631817089745317e+02 3.4103259385937486e+02 -1.8166532788357921e+02 - 11 -1.6154687915131711e+02 1.5742797820595132e+02 3.5832199951140109e+02 - 12 6.1603841944463943e+02 -1.4820397700321357e+02 1.0871524086056972e+02 - 13 -2.1367529106934364e+02 -3.0167446795627899e+02 5.2424091634188028e+02 - 14 2.5933827511240753e+02 -1.7968203382119590e+01 -2.7733114072539661e+02 - 15 1.7570793004244069e+02 1.7551005525188296e+02 -9.5784231788977749e+01 - 16 3.0586985592967915e+02 -4.7679566105948382e+01 -3.4332192731505285e+02 - 17 -1.5018636472333995e+02 1.3259146324636694e+02 2.3200578297675395e+02 - 18 1.6469881174805161e+02 -1.0816836176978013e+02 2.1207670716678888e+02 - 19 2.4759420520504079e+02 -4.8758383157767163e+01 -2.2494116682880116e+02 - 20 1.2419960666452823e+02 2.5137933265660718e+02 -1.5328241144729745e+01 - 21 -1.9556094492800702e+02 2.3151723982064777e+01 -1.2529581330697818e+02 - 22 2.4829941584476597e+02 -2.9829345245033829e+02 -4.0446702084715653e+01 - 23 8.2074458696916352e+01 1.3042100306284391e+02 1.5221371881648275e+02 - 24 -7.6917668833500898e+01 2.3540360228733630e+02 -1.7130192995354321e+02 - 25 -2.9742104523786168e+01 -1.8935699467868037e+02 6.7995874219729117e+01 - 26 -3.9494943772628240e+01 2.1074054704555034e+00 -2.0748981609854840e+02 - 27 -2.7704003655185977e+02 5.3736954143365233e+02 4.2318574013793761e+02 - 28 -2.9302855291123007e+02 -5.1149666118960234e+01 -2.3633679976948793e+02 - 29 1.2970505460342494e+02 -4.2266433901986183e+01 1.6349685185792413e+02 - 30 5.6925896868052199e+01 3.7880918758244668e+01 6.8637128510003294e+01 - 31 -1.9325534294265759e+02 -1.1645328076628637e+02 -2.0671892621502057e+01 - 32 1.2360198063082690e+02 -3.3253019999942374e+01 -1.0516936549567490e+02 - 33 6.5239383936196262e+01 3.7104662858439900e+02 6.0974455303733073e+01 - 34 -2.3124084085037498e+02 -1.1681523003031349e+02 -2.5837805461650902e+02 - 35 -4.1912113383005675e+02 7.9943750613186452e+01 3.1020725803706983e+02 - 36 -1.8561422052418746e+02 -1.1563434085911459e+02 -4.2360108129603255e+01 - 37 8.8275421440856547e+00 -3.5266971563412392e+02 -6.0507541453071482e+01 - 38 -1.9245036832038224e+01 1.1717726898939364e+02 -2.3478417248419430e+02 - 39 -1.0434224692470824e+01 -7.0902644440221394e+01 1.4263978421852897e+02 - 40 3.3271177801097122e+02 -8.8679293552761555e+02 1.6219742097556569e+01 - 41 -6.4538764986359638e+01 1.5189397693612858e+02 -1.8225441696797373e+02 - 42 2.3368235855713472e+01 1.1822246665296132e+02 4.1207745038653673e+02 - 43 -3.5145643416904370e+01 -3.6517162542190285e+00 2.4936784352978586e+02 - 44 -1.2879745400758535e+00 -2.4877345145140910e+02 7.9236449970514400e+01 - 45 2.0871643412339361e+02 -1.0817571271704279e+02 -4.1291831345629367e+02 - 46 -1.3836372705477595e+02 4.6117938292253513e+02 -2.4016736526221720e+02 - 47 1.3255125611057784e+02 2.8747591615865849e+02 -3.2895660248675412e+01 - 48 7.8145417759956388e+02 6.5214930060371188e+01 -6.2304930828897488e+02 - 49 2.4488281403352434e+02 1.9105496615711587e+01 3.7418605144303842e+02 - 50 2.9822129513622804e+02 3.0683153982657637e+02 5.6994490418774092e+02 - 51 -8.0058572063770589e+02 5.1028617285827835e+02 7.5832431569040102e+02 - 52 -9.2137024513793961e+01 1.1910687193195571e+02 -2.4119120858088723e+02 - 53 -3.6387082584333763e+02 -2.0729771077051413e+02 -3.4910499737675855e+02 - 54 -8.3401322475888492e+01 1.8942466656602346e+02 -1.2869045777950828e+02 - 55 -2.5309678413622956e+02 -1.1001947899857218e+02 -3.0896372370121657e+02 - 56 1.7364604574033362e+02 -2.5754429115061833e+02 -4.3743962050161187e+01 - 57 4.2666362581864087e+02 1.5528157995541829e+02 -3.9988032807910298e+02 - 58 -3.9656744873557194e+01 7.8953170999147844e+01 2.6135222052406243e+02 - 59 -2.7594581611215335e+02 1.9891770704103524e+02 2.4122933700019283e+02 - 60 -2.5675992319678829e+02 -1.1527235824444743e+02 9.9923831048647713e+01 - 61 3.0884428120706025e+02 4.9986711220596823e+02 -1.3369013376796840e+02 - 62 2.8530678742627682e+01 5.9283151669757950e-01 -2.7403002505093650e+02 - 63 2.5296775626791694e+02 -2.7640525289662742e+02 -1.9200401038407171e+02 - 64 -8.4674586435530216e+01 -1.5736397776830248e+02 1.5637348700621067e+02 + 1 -8.8486129396001530e+01 -2.5824483374473200e+01 1.0916517213634106e+02 + 2 -1.1227648453173390e+02 -1.8093214754186130e+02 -2.2420118533940351e+02 + 3 -1.7210894875994978e+02 1.8292263268451674e+02 1.3551979435686128e+01 + 4 3.2999405001009400e+01 -5.1077312719545837e+01 9.0478579144069556e+01 + 5 1.8144963583123214e+02 1.6798391906831810e+01 -8.1723378082075570e+01 + 6 1.3640835897739447e+02 -3.0059507544862095e+02 2.9594750460783345e+01 + 7 -5.3287619129789434e+01 -1.2872953167026759e+02 -1.6348317368624129e+02 + 8 -1.5334990952322434e+02 4.0171746946780843e+01 1.5317542403106131e+02 + 9 1.8362961213927143e+01 8.1984428717784240e+01 2.8273598253027259e+01 + 10 8.4245458094789043e+01 1.4177227430519346e+02 1.2329899933660965e+02 + 11 -4.3217035356344425e+01 6.5547850976510759e+01 1.3463983671946417e+02 + 12 -9.7319343004573113e+01 -2.6236499899232278e+01 7.2232061905742402e+00 + 13 -6.3184735475530402e+01 -4.7368090836538087e+01 -3.7590268076036111e+01 + 14 7.8642680121803949e+01 -6.7994653297646451e+01 -9.9042134233434069e+01 + 15 -6.6371195967082812e+01 2.1787700653339664e+02 8.0102624694807375e+01 + 16 1.9215832443892597e+02 5.3231888618093969e+01 6.6253846562695060e+01 + 17 1.4496126989603110e+02 -3.9700366098757236e+01 -9.7506725874209394e+01 + 18 -4.4989211400008614e+01 -1.9360716191976445e+02 1.1274798810455862e+02 + 19 2.6657546213782740e+02 3.7189369483257695e+02 -3.3847202166068041e+02 + 20 -7.6352829159880940e+01 -8.8469178952301604e+01 1.3384778817072185e+00 + 21 -7.1188597560667418e+01 -5.1592404200740091e+01 -1.2279357314243519e+02 + 22 1.5504965184741241e+02 -1.3094582932680530e+02 8.1473922626938005e+01 + 23 7.8017376001392932e+01 -1.3263023728607561e+01 -2.2771654676273968e+01 + 24 -2.0547634460482246e+02 2.1612342044348730e+02 -1.2423651650061706e+02 + 25 -1.1402944116091903e+02 1.9100648219391277e+02 -8.3505645569845370e+01 + 26 2.8664542299410533e+02 -2.1774609219880716e+02 2.3144720166994406e+02 + 27 -6.3243843868043058e+01 6.9123801262965287e+01 1.8607035157681673e+02 + 28 -3.5444604841998397e+00 3.8760531647714473e+01 3.2869123667281691e+01 + 29 -7.1069494158179211e+01 3.5486459158760582e+01 2.7311657876181052e+01 + 30 -1.7037059987992399e+02 -1.9851840131669357e+02 -1.1511410156295636e+02 + 31 -1.3970663440086005e+02 1.6660841802305004e+02 -1.2914070628112796e+02 + 32 2.7179939937138421e+01 -6.0162678551485520e+01 -1.7668459764117443e+02 + 33 -6.2659124615698168e+01 -6.4421915847941506e+01 6.4151176691093482e+01 + 34 -2.2118740875419455e+01 1.0450303589341144e+02 -7.3997370482692972e+01 + 35 2.6987081482968875e+02 -2.1523754104000355e+02 1.3052736086179604e+02 + 36 1.0368798521815546e+02 1.8816694370725344e+02 -1.9748485159172904e+02 + 37 -1.8012152564003850e+02 1.2997662140302853e+02 -6.3547259053587844e+01 + 38 -2.9571525697590829e+02 1.0441941743734590e+02 1.5582112543442358e+02 + 39 8.7399620724575271e+01 -6.0025787992411296e+01 2.2209357601282150e+01 + 40 2.0541458171950978e+01 -1.0735817059033016e+02 5.8656280350524312e+01 + 41 -5.8893965304899972e+01 1.1850504754314887e+01 -6.6138932259022468e+01 + 42 -9.6894702780992375e+01 3.8926449644174816e+01 -7.5794133002764795e+01 + 43 2.2475651760389383e+02 9.5503072846836503e+01 1.2308683766845400e+02 + 44 8.9821846939843113e+01 -1.0615882525757857e+02 -8.6326896770189890e+01 + 45 1.7193681344342288e+01 1.2889564928820627e+02 5.2922372841252404e+01 + 46 1.3549091739280335e+01 -2.9276447091757490e+01 2.2187152043656496e+01 + 47 3.3389460345593179e+01 -1.9217121673024420e+02 -6.9954603582952544e+01 + 48 7.3644268618852777e+01 -2.0953201921822830e+02 -2.3192562071413263e+01 + 49 -3.7593958318941031e+02 -2.4028439106859878e+01 1.0779151134441000e+02 + 50 3.8603926624328551e+01 -7.3615255297989435e+01 9.0412505212292402e+01 + 51 1.3736689552214156e+02 -1.0204490780187869e+02 1.5814099219652564e+02 + 52 -1.0797151154267746e+02 1.1876989597626186e+02 -1.3296150756377074e+02 + 53 -5.3843453069456601e+01 3.3257024143956789e+02 -2.3416395383762278e-02 + 54 -1.0678049522667429e+01 6.2807424617056625e+01 1.8344969045860523e+02 + 55 1.1232135576105661e+02 -1.7906994470561881e+02 7.6534265234548187e+01 + 56 -4.1035945990527679e+01 -1.4084577238065071e+02 3.7489705598247994e+01 + 57 9.9903872061946174e+01 7.0936213558024505e+01 -6.8656338416452527e+01 + 58 -2.7563844572724122e+01 -6.7426705471926862e+00 -1.8442803060445037e+01 + 59 -6.6637290503389451e+01 1.0613630918459926e+02 8.7741455199772943e+01 + 60 -1.7749706497437369e+01 6.3756413885635943e+01 -1.5086911682892705e+02 + 61 -3.3559889608749941e+01 -1.0076809277084803e+02 -7.4536003122046253e+01 + 62 1.5883833834736409e+01 -5.8439916924703503e+00 2.8393403991146936e+01 + 63 1.3294237052896716e+02 -1.2724619636183070e+02 -6.4882384014219085e+01 + 64 1.0738250214938944e+02 1.2062290362868877e+02 7.4541927445529211e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index b24f60dc62..3e12ad726d 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -1,8 +1,8 @@ --- lammps_version: 8 Apr 2021 -date_generated: Mon Apr 19 09:21:17 2021 -epsilon: 2e-10 -skip_tests: +date_generated: Wed Apr 21 08:52:02 2021 +epsilon: 1e-12 +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -15,159 +15,162 @@ pre_commands: ! | atom_style charge lattice diamond 3.77 region box block 0 2 0 2 0 2 - create_box 2 box + create_box 3 box create_atoms 1 box displace_atoms all random 0.1 0.1 0.1 623426 - mass 1 12.0 - mass 2 13.0 + mass 1 1.0 + mass 2 12.0 + mass 3 16.0 set type 1 type/fraction 2 0.5 998877 - set type 1 charge 0.01 - set type 2 charge -0.01 + set type 2 type/fraction 3 0.5 887766 + set type 1 charge 0.00 + set type 2 charge 0.01 + set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c maxiter 20 nowarn + fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c input_file: in.empty pair_style: reax/c NULL checkqeq yes lgvdw yes safezone 1.6 pair_coeff: ! | - * * ffield.reax.lg C O + * * ffield.reax.lg H C O extract: ! "" natoms: 64 -init_vdwl: -3780.0545577888824 -init_coul: -279.9157988760615 +init_vdwl: -2454.3149508399256 +init_coul: -344.1380904917976 init_stress: ! |2- - 3.6448931383720665e+03 3.7339659142876435e+03 3.9381659849081570e+03 -8.8620105504582875e+02 2.5350490498306664e+02 -5.2816569317142807e+02 + 4.8195587070292022e+03 4.4865954368949351e+03 3.2679588293062784e+03 -1.8469678134590688e+03 7.6556385424846496e+02 -4.9517278307742413e+02 init_forces: ! |2 - 1 -1.4572091886023205e+02 -2.2140554853210335e+02 -1.4808089621820409e+02 - 2 -1.7648676367493852e+02 -1.0146318760917033e+02 -1.7992199180511228e+01 - 3 -2.0615863857279255e+01 -4.0344141093113177e+02 -3.8603948937580682e+01 - 4 2.6614837240037974e+02 4.0003929778899199e+01 1.4690018353209234e+02 - 5 9.7844364238111634e+00 4.3884264292874640e+01 4.9796276452188778e+01 - 6 -2.6938167754794108e+02 3.3502567046531411e+00 2.2965489848185831e+02 - 7 3.2574749906033628e+02 -1.7976901688562575e+02 2.2179384812686754e+02 - 8 9.9963664597069211e+01 -2.8685055064461562e+02 1.4158554323500957e+02 - 9 1.6434737377652411e+01 -1.9355784885649135e+02 -9.4333988453824674e+01 - 10 -2.0854160335689650e+02 1.0026489817881713e+02 -1.5021072248976765e+02 - 11 -2.0573434026899415e+02 2.7604212909913434e+02 5.5777133973549599e+02 - 12 5.0288346447168902e+02 -6.0966999599334633e+02 3.9376794144396729e+02 - 13 -9.1250837980014055e+01 3.5479126438212312e+01 7.9772485712987830e+01 - 14 1.1722657768580721e+02 7.0781215767454047e+00 -1.1012920740892103e+02 - 15 2.0459752525877119e+02 1.1351310328466946e+01 -6.9642718405081723e+01 - 16 6.4806165788586554e+01 2.7717257212730721e+02 9.6969385115315887e+01 - 17 -1.1757474559792530e+02 7.5596314208592773e+01 8.2371686135118694e+00 - 18 1.4980035999104621e+02 4.6438099206051213e+01 1.9074297138984858e+02 - 19 9.9234004591160854e+01 -3.4162209353811022e+01 -9.3484579137358054e+01 - 20 3.4394959503379101e+02 1.8755989482421211e+02 1.8392094734100132e+02 - 21 -1.7639663517067046e+02 5.9886792943355104e+01 2.3192630518286926e+01 - 22 3.5943350303372904e+02 -4.9707299042671059e+02 2.0606498955302629e+02 - 23 1.7582092751419758e+01 2.1298501938255976e+02 1.9485029772476997e+02 - 24 -1.8644089886656593e+02 2.0152439860030270e+02 -1.5033144599992980e+02 - 25 6.6423833906552588e+01 -2.6628287125895685e+02 6.5042482646519929e+01 - 26 -2.9537910718596163e+02 1.8889491141232935e+02 8.6384752113539022e+01 - 27 1.0405788965828641e+02 -2.5925449178566540e+00 -6.3480098517547759e+01 - 28 -1.7939608695369640e+02 -1.9073765779235862e+02 -1.6920914616960835e+02 - 29 2.8517744376210021e+02 -9.8603006038058396e+01 -1.5865567773918144e+02 - 30 3.2949780945743384e-01 9.9395901723688951e+01 3.2867025811830066e+00 - 31 -1.8081982094889877e+00 -5.1095979886608603e+01 6.0017226789971536e+00 - 32 3.1528485795048732e+02 -1.2793879136489154e+02 -2.4176923563635890e+02 - 33 -5.4047496313993761e+00 1.7567978501697323e+02 -1.1807749995154678e+02 - 34 -1.9400365443632006e+02 -1.0951910631961994e+02 -1.5439514659643123e+02 - 35 -1.9195164058841638e+02 -1.2771663795724534e+01 1.3164519528710119e+02 - 36 2.1450335760238607e+02 4.8524149100278362e+02 -2.2937661241075210e+02 - 37 -3.3553202602756068e+02 -4.9645660169968471e+02 2.1989946614447041e+02 - 38 -3.2545637693167187e+01 2.4953724757619213e+01 -1.5692994894863165e+02 - 39 -1.5399133308638410e+01 2.3903543199312750e+01 9.6153912587959454e+01 - 40 -6.4359455436231784e+01 1.7840898418733599e+02 1.6199268811537300e+02 - 41 -2.4659695132042634e+02 2.3085908053073328e+02 -2.9640112753929327e+02 - 42 -2.9451821900140999e+02 4.3373059300879572e+02 4.3706356205288336e+02 - 43 1.3266010178695632e+02 -2.9267135032181088e+01 2.3063316835486089e+02 - 44 1.0054895163178887e+02 -2.0011754287270674e+02 1.1673372624795425e+02 - 45 1.5191525332856557e+02 -3.3909441520578207e+02 -6.8137683597574699e+02 - 46 -3.6974751746664356e+02 6.5878294118257850e+02 -1.2846738301725193e+02 - 47 7.0999626065694201e+01 2.6787348460906964e+02 -2.6037187103136354e+01 - 48 4.8458888753820582e+02 -1.6692979718938696e+02 -3.2654041125642522e+02 - 49 1.0015039714682548e+02 1.7137645197720190e+01 1.2769396347000726e+02 - 50 -2.5642342676546355e+02 4.8550218436953134e+02 1.7834042598268297e+02 - 51 1.5929472695008881e+03 -1.5099908240612401e+03 1.3757388145073317e+03 - 52 -3.9361969825076892e+02 2.9260735969130604e+02 -2.7081798065168311e+02 - 53 -1.2156829912640842e+03 1.0481229021396230e+03 -1.7260431178358995e+03 - 54 5.4550088623147516e+01 1.0309452579709432e+02 -6.1757701222598442e+01 - 55 -2.0238006702340041e+02 1.8109613688188938e+02 -4.9049119362596980e+02 - 56 2.0035548328443991e+02 -1.8905716639832801e+02 -1.3674890405161500e+02 - 57 -1.7850234090472205e+02 -3.3738119605793531e+02 -1.4864438401289951e+02 - 58 -2.5672838772121492e+02 -1.3337878903216912e+02 8.4365052514154812e+01 - 59 -1.7898423879701210e+02 1.8142157612585032e+02 2.7914729458451137e+02 - 60 -7.4397164149646969e+01 -6.8190924044876084e+01 5.7945904025898891e+01 - 61 9.6099033708008989e+01 4.4560187645463765e+02 5.3539291937468079e+01 - 62 3.3097868057397406e+01 1.3291944752881338e+02 -3.6118812725322506e+01 - 63 -2.5661745572767739e+01 -3.1619354530304156e+02 5.0012317415788416e+01 - 64 2.5884883063459124e+01 -6.0852905003457536e+01 7.5067609941699116e+00 -run_vdwl: -3780.0534739099153 -run_coul: -279.9156023968299 + 1 -1.9811664067580182e+02 -1.5618748554879582e+02 -1.0716617094919907e+02 + 2 -4.1075966889759563e+01 -6.7708246449675840e+01 -4.2506724189242647e+01 + 3 3.1596544789529471e+01 8.8571277602644201e+01 1.4850846557451504e+02 + 4 1.7447178183928099e+02 3.2866954415453613e+01 -3.1178861314762706e+01 + 5 1.1873199005659009e+02 5.9095115842131946e+01 2.3739439807686179e+02 + 6 1.3052453610124778e+03 -4.4208109447713031e+02 -1.4245452171137988e+03 + 7 -8.7153363585941023e+01 -1.0895261162467337e+02 -3.5604687372058106e+02 + 8 -9.1047579854191540e+01 4.4450937169776367e+01 1.1879559986803962e+02 + 9 4.7456602925193245e+01 1.7227642506022178e+02 -1.4638226748446916e+01 + 10 6.3508986324759796e+01 4.8590610415561784e+01 1.1075535682642920e+01 + 11 -5.1919052217198669e+01 7.3820742396411859e+01 5.1375340691983297e+01 + 12 -1.0171933720752882e+02 -1.9845958414353028e+01 -1.7437665462751706e+01 + 13 -7.3048376131504796e+01 -4.5586627360377669e+01 2.8533062846208733e+01 + 14 8.6287140258369817e+01 -4.1664353236768321e+01 1.7094340432182378e+01 + 15 -3.5690271737605428e+01 1.2671711108383720e+02 4.5865072089126144e+01 + 16 1.0608232372370766e+02 3.5980003156299802e+01 1.8676593635940499e+01 + 17 2.3577630118103411e+02 -9.8579505236746968e+01 4.1005658232556200e+01 + 18 -2.0815299273687735e+01 -1.1578579968450298e+02 6.5566787154472507e+01 + 19 4.3265264076046996e+01 1.0913234729250232e+02 3.0900987497773690e+02 + 20 -1.0086773950039240e+02 7.4841212143883325e+01 -1.6547856280073117e+02 + 21 -8.5974538718179744e+01 -4.5982868874732929e+00 -7.3066508052444064e+01 + 22 1.3343492132570225e+02 -1.2211943449611955e+02 9.0328124087551757e+01 + 23 5.2985077374887140e+01 2.0040750326966958e+01 -9.0416982004666480e+00 + 24 -1.8957025969382849e+02 8.1671696884795921e+01 -1.2920621849543499e+01 + 25 -1.0067836293726950e+02 1.3220054680372047e+02 -4.8975895235994550e+01 + 26 2.1849478729429609e+02 -1.9386903120078875e+02 1.7116657218419908e+02 + 27 -3.7478069218092728e+01 3.0044804022729718e+01 9.3872627169948615e+01 + 28 9.9359193467603504e+01 -5.5156189036814503e+01 -3.1541196450035848e+01 + 29 -3.9530012231991570e+01 5.6689953230829921e+01 2.5358584427671751e+01 + 30 -9.7652246814367359e+01 -2.2271920242502716e+02 -1.4460601547049507e+02 + 31 -4.6192346966779532e+01 7.2790084189834928e+01 3.1159158603346764e+01 + 32 1.2013060628467292e+01 -3.4474347848945314e+01 -1.0622600014669138e+02 + 33 5.2551051115345523e+01 4.2704675585248630e+01 -3.0154896799401914e+01 + 34 1.6822864099952500e+02 -1.6889974455036809e-02 1.1832622696299902e+02 + 35 5.1185090023661428e+02 -1.3214021604987859e+03 1.1319907541000694e+03 + 36 -1.4331382529302426e+01 9.9702896436312997e+01 -1.3159358421899245e+02 + 37 -8.9317756897655033e+02 1.3544128453102780e+03 -7.5922493710251501e+02 + 38 -3.8384748878233427e+02 1.2143676601363953e+02 1.7580047976723324e+02 + 39 1.6381134310552264e+02 -1.2998574463953725e+01 -7.8542909545441546e+01 + 40 6.1412235617277197e+01 -2.0153615037331058e+01 4.3186957794586576e+01 + 41 1.3114484088383918e+01 1.7854214885793702e+00 3.3683765652624928e+01 + 42 -6.4838533708029459e+01 5.2662237041257001e+01 -6.8645855319469462e+01 + 43 2.0925885626252014e+02 8.2942516657430232e+01 1.1786724503954686e+02 + 44 -3.8463410277622422e+01 -7.5319916775508801e+01 -1.3445887472637639e+02 + 45 -3.4797907366084118e+01 7.6266761873332939e+01 4.3023416525122556e+01 + 46 2.3463432665038621e+01 -1.5313857576705704e+01 -3.8707451594223810e+00 + 47 -3.7271493199629646e+01 -5.4876511333920163e+01 -1.9275411927395847e+01 + 48 2.8275275023555395e+02 -1.7973942289882834e+02 -6.0167953907639014e+02 + 49 -2.0529905689923421e+03 -6.7838314309842531e+01 7.6230272883402529e+02 + 50 1.3292222637274614e+02 -9.8795036249084134e+01 9.9132259532945980e+01 + 51 2.6168921895029303e+02 -1.9761595427509062e+02 2.4062513751852873e+02 + 52 -1.2257063176561176e+02 1.3353869954874421e+02 -1.1598337420807962e+02 + 53 3.8021621191835891e+02 8.1199705966172507e+02 2.7057346247419940e+02 + 54 6.9440336670547097e+01 -1.1592524541887400e+02 2.2072297942372262e+02 + 55 8.7300666059627744e+01 -1.3907353173150560e+02 5.9541107879138558e+01 + 56 3.4771676857170326e+02 -2.4546959502036665e+02 -3.5077189358394349e+02 + 57 6.1706174952483430e+01 7.9893925286373715e+01 3.4373445887630085e+00 + 58 3.7240798760941452e+01 -1.2919400623491822e+02 3.9695110774075808e+01 + 59 -5.2076445103995331e+02 2.1046582886974142e+02 1.7083299176148790e+02 + 60 -7.8657547105875338e+01 -2.3005356890255392e+01 -1.2454833328198771e+02 + 61 -3.9633103573229910e+01 -5.5165443660352402e+01 -4.0780192434587690e+01 + 62 -1.8742346202622763e+01 -1.3844690899539831e+01 2.2586546200036643e+00 + 63 6.5150947885422269e+01 7.1009493033300544e+01 -8.4093092375006023e+01 + 64 4.0079516427458081e+01 9.6476598333945958e+01 9.1213458480138442e+01 +run_vdwl: -2454.3233099608155 +run_coul: -344.1379608070739 run_stress: ! |2- - 3.6449193028377299e+03 3.7339549167173282e+03 3.9381733557741995e+03 -8.8617642091921402e+02 2.5350119722836649e+02 -5.2818522888411621e+02 + 4.8194587329953674e+03 4.4865895224706956e+03 3.2679446938086498e+03 -1.8471163065259325e+03 7.6545324620049087e+02 -4.9527853267788902e+02 run_forces: ! |2 - 1 -1.4571796976977475e+02 -2.2140579635792884e+02 -1.4808149010447769e+02 - 2 -1.7648305954284041e+02 -1.0146476417236073e+02 -1.7988566053603591e+01 - 3 -2.0614225365740097e+01 -4.0344097227230094e+02 -3.8604731470054062e+01 - 4 2.6614888269720814e+02 4.0003233795014168e+01 1.4690057516187863e+02 - 5 9.7845378052670569e+00 4.3882570307523316e+01 4.9797206010047589e+01 - 6 -2.6938082908045919e+02 3.3524802199605972e+00 2.2965815951985147e+02 - 7 3.2575186725741395e+02 -1.7977227930984148e+02 2.2179960228952396e+02 - 8 9.9964020081557138e+01 -2.8685357554222099e+02 1.4158731522817112e+02 - 9 1.6438523377332476e+01 -1.9355303092496897e+02 -9.4334957020327948e+01 - 10 -2.0853806475972263e+02 1.0026021875703947e+02 -1.5021521105990161e+02 - 11 -2.0574136330802202e+02 2.7604370854540770e+02 5.5777225668964445e+02 - 12 5.0285717304860879e+02 -6.0968353881851192e+02 3.9377680529647569e+02 - 13 -9.1246272612282368e+01 3.5490016998948100e+01 7.9756749986805872e+01 - 14 1.1722763390616720e+02 7.0777572837063545e+00 -1.1012806750165767e+02 - 15 2.0459887112033201e+02 1.1352405359138412e+01 -6.9641010980711187e+01 - 16 6.4819489591627985e+01 2.7717767094468888e+02 9.6971198880055780e+01 - 17 -1.1757145471738642e+02 7.5598280349563737e+01 8.2344590524461072e+00 - 18 1.4979763975305985e+02 4.6437996441246753e+01 1.9074030452047762e+02 - 19 9.9232182958160649e+01 -3.4161493200256849e+01 -9.3482747032954819e+01 - 20 3.4394273190544487e+02 1.8755952354050976e+02 1.8391751060923613e+02 - 21 -1.7639675308717227e+02 5.9884172559678539e+01 2.3197838699496501e+01 - 22 3.5944608490729252e+02 -4.9708525361009697e+02 2.0607148872705903e+02 - 23 1.7579274952856146e+01 2.1298728055372681e+02 1.9485167236722779e+02 - 24 -1.8644004784533396e+02 2.0152728030974987e+02 -1.5032647044559059e+02 - 25 6.6427893699487285e+01 -2.6628950089076670e+02 6.5040872719333763e+01 - 26 -2.9538211829350598e+02 1.8889965241529200e+02 8.6392539131687670e+01 - 27 1.0405461403221605e+02 -2.5883825588235845e+00 -6.3473842387095296e+01 - 28 -1.7939104123925333e+02 -1.9072999063995681e+02 -1.6920313224146631e+02 - 29 2.8518126138643589e+02 -9.8610753428175371e+01 -1.5865905973294608e+02 - 30 3.2949044114559667e-01 9.9396106279740152e+01 3.2866487023715845e+00 - 31 -1.8093337117467343e+00 -5.1090328691324387e+01 5.9965849772505502e+00 - 32 3.1528763104400332e+02 -1.2794632256692650e+02 -2.4177666052802613e+02 - 33 -5.4083129170642179e+00 1.7567908715551988e+02 -1.1807415450387619e+02 - 34 -1.9400317396625167e+02 -1.0951816546456534e+02 -1.5439330137890337e+02 - 35 -1.9195026193065127e+02 -1.2774392319491161e+01 1.3164394629475399e+02 - 36 2.1450819729293397e+02 4.8524393495667874e+02 -2.2938261082652426e+02 - 37 -3.3553756825286939e+02 -4.9646067369623501e+02 2.1990265295677537e+02 - 38 -3.2545669240461962e+01 2.4954715957821520e+01 -1.5693302625922774e+02 - 39 -1.5400978707519485e+01 2.3902924956982389e+01 9.6154975229739549e+01 - 40 -6.4361322091921963e+01 1.7841296679824200e+02 1.6199313367381012e+02 - 41 -2.4660579311181596e+02 2.3084998025482201e+02 -2.9640187317945146e+02 - 42 -2.9452037865586266e+02 4.3373691264280740e+02 4.3706800713302425e+02 - 43 1.3265463914285502e+02 -2.9274831727547486e+01 2.3064014394569924e+02 - 44 1.0054966120054988e+02 -2.0011413451728055e+02 1.1673396063607694e+02 - 45 1.5191487332744026e+02 -3.3909989475298806e+02 -6.8138450042787269e+02 - 46 -3.6974586930852371e+02 6.5877947911188835e+02 -1.2846142437073112e+02 - 47 7.0999519258744826e+01 2.6787233536251233e+02 -2.6037425588932479e+01 - 48 4.8457871743082603e+02 -1.6693866918660342e+02 -3.2653088595197522e+02 - 49 1.0016334450403171e+02 1.7144926659081193e+01 1.2769410739667713e+02 - 50 -2.5643044716127639e+02 4.8550578281218662e+02 1.7833569703185714e+02 - 51 1.5929685800547243e+03 -1.5100179816024361e+03 1.3757557055371278e+03 - 52 -3.9363157215408233e+02 2.9261415024331393e+02 -2.7081681598776061e+02 - 53 -1.2156938934830002e+03 1.0481428177286084e+03 -1.7260661177369154e+03 - 54 5.4545512167986800e+01 1.0309421079214434e+02 -6.1761171483942455e+01 - 55 -2.0239006109115883e+02 1.8108786983188449e+02 -4.9048333730029168e+02 - 56 2.0036614371542044e+02 -1.8905881182672297e+02 -1.3675071296668057e+02 - 57 -1.7850229397871476e+02 -3.3738313920990021e+02 -1.4864700460708005e+02 - 58 -2.5670676044045717e+02 -1.3336092216373774e+02 8.4345105241459464e+01 - 59 -1.7898804526082839e+02 1.8142383013226376e+02 2.7914483449637197e+02 - 60 -7.4398952097636979e+01 -6.8191483730035287e+01 5.7946910740208871e+01 - 61 9.6097660916192893e+01 4.4562130692576051e+02 5.3555843428685527e+01 - 62 3.3087683040848127e+01 1.3291451189592027e+02 -3.6140107370205008e+01 - 63 -2.5660819680707732e+01 -3.1619389079817131e+02 5.0012586602224751e+01 - 64 2.5890370845876866e+01 -6.0849124899192077e+01 7.5030175856502677e+00 + 1 -1.9811556407056105e+02 -1.5618143620847076e+02 -1.0716119874908736e+02 + 2 -4.1073968384374822e+01 -6.7710647015369261e+01 -4.2502864658157357e+01 + 3 3.1592798331689554e+01 8.8575236369726497e+01 1.4850890801985440e+02 + 4 1.7447282006187956e+02 3.2862369867970486e+01 -3.1175721266394820e+01 + 5 1.1873112974792335e+02 5.9090963929048286e+01 2.3738916225937453e+02 + 6 1.3053008444613590e+03 -4.4210323642713990e+02 -1.4246081409032693e+03 + 7 -8.7152343512651925e+01 -1.0895314566818783e+02 -3.5604721285130660e+02 + 8 -9.1046846091347717e+01 4.4451665481009478e+01 1.1879618751723048e+02 + 9 4.7463133585713976e+01 1.7228438483982211e+02 -1.4645071927693378e+01 + 10 6.3506921990797963e+01 4.8587688349158157e+01 1.1073324095443047e+01 + 11 -5.1917951887543467e+01 7.3818630188510326e+01 5.1369234828489169e+01 + 12 -1.0172154753205886e+02 -1.9847809999838844e+01 -1.7441731987232995e+01 + 13 -7.3048126072731904e+01 -4.5586545373889699e+01 2.8534758158919548e+01 + 14 8.6288077929554390e+01 -4.1660634795038867e+01 1.7096747148188005e+01 + 15 -3.5688114877422009e+01 1.2671728980619932e+02 4.5864235397118819e+01 + 16 1.0608395201173668e+02 3.5983845233526992e+01 1.8672925070386189e+01 + 17 2.3576828121395241e+02 -9.8577850318505511e+01 4.1004495565128586e+01 + 18 -2.0815095995902741e+01 -1.1578710179047430e+02 6.5566934287391263e+01 + 19 4.3264252619509847e+01 1.0912982970441868e+02 3.0901253523346554e+02 + 20 -1.0088948935029296e+02 7.4849484282711913e+01 -1.6550538409007385e+02 + 21 -8.5974038585183081e+01 -4.5987854992617834e+00 -7.3065890363335626e+01 + 22 1.3343130763213867e+02 -1.2211553430043760e+02 9.0325064574872243e+01 + 23 5.2984912690315269e+01 2.0042805349785095e+01 -9.0417924141684995e+00 + 24 -1.8954830238390488e+02 8.1645824240164018e+01 -1.2893974448861035e+01 + 25 -1.0068116183998592e+02 1.3220505876703567e+02 -4.8977129584747800e+01 + 26 2.1847179335289820e+02 -1.9385136258527231e+02 1.7114800244815061e+02 + 27 -3.7476307441658193e+01 3.0046433191315710e+01 9.3873685757283738e+01 + 28 9.9355970623229197e+01 -5.5158350569168128e+01 -3.1544144508393853e+01 + 29 -3.9530224377035040e+01 5.6690552166969916e+01 2.5358784555346130e+01 + 30 -9.7652510697052605e+01 -2.2271892169387453e+02 -1.4460597467192864e+02 + 31 -4.6194950503295722e+01 7.2792554749932378e+01 3.1151667586195479e+01 + 32 1.2014466624027639e+01 -3.4469133688337756e+01 -1.0621837802800977e+02 + 33 5.2553699854339712e+01 4.2706400148046903e+01 -3.0154323622364608e+01 + 34 1.6822906612351349e+02 -1.7651825961895091e-02 1.1832699040444524e+02 + 35 5.1193507571856594e+02 -1.3215008853106001e+03 1.1320319719742358e+03 + 36 -1.4340338085502863e+01 9.9690347849156822e+01 -1.3158127406978679e+02 + 37 -8.9323390159980181e+02 1.3545163222654817e+03 -7.5929442355796721e+02 + 38 -3.8384755818822509e+02 1.2143789174035305e+02 1.7579570815453911e+02 + 39 1.6381197094628513e+02 -1.2998258674043836e+01 -7.8543109639931160e+01 + 40 6.1411228642100049e+01 -2.0154566391139259e+01 4.3186834298875652e+01 + 41 1.3119781105415569e+01 1.7920555043075754e+00 3.3686007139293849e+01 + 42 -6.4838490750749202e+01 5.2660553302313652e+01 -6.8647362072367542e+01 + 43 2.0926308211689772e+02 8.2945847275902722e+01 1.1786850503407649e+02 + 44 -3.8461829626420936e+01 -7.5317323697263234e+01 -1.3445959877777378e+02 + 45 -3.4805239678702840e+01 7.6262295586966061e+01 4.3024220690600892e+01 + 46 2.3465031078234954e+01 -1.5312554894709733e+01 -3.8725170500358517e+00 + 47 -3.7271036720207945e+01 -5.4879638482209749e+01 -1.9275876359755905e+01 + 48 2.8270391245290489e+02 -1.7971102191169697e+02 -6.0165064633346822e+02 + 49 -2.0529526126133592e+03 -6.7744467074995413e+01 7.6241869031244312e+02 + 50 1.3291615685330385e+02 -9.8801239572742261e+01 9.9131933784099587e+01 + 51 2.6169570171244874e+02 -1.9762541199560968e+02 2.4063463246277209e+02 + 52 -1.2256816067286560e+02 1.3353356136884040e+02 -1.1597765595389474e+02 + 53 3.8012282364003778e+02 8.1194045374755683e+02 2.7050484440708368e+02 + 54 6.9456553969440762e+01 -1.1593864337324271e+02 2.2074869335520950e+02 + 55 8.7303368709848343e+01 -1.3907755259033479e+02 5.9542185087028599e+01 + 56 3.4769731101937157e+02 -2.4546533348164235e+02 -3.5075782168770780e+02 + 57 6.1706155820465277e+01 7.9892471516403987e+01 3.4375912204692596e+00 + 58 3.7237511516193948e+01 -1.2919240641738722e+02 3.9695822512620317e+01 + 59 -5.2071132643271164e+02 2.1045883047165901e+02 1.7082619476821390e+02 + 60 -7.8658294909200478e+01 -2.3007149625533529e+01 -1.2454738729229325e+02 + 61 -3.9624794908666530e+01 -5.5169201638846069e+01 -4.0777145486525050e+01 + 62 -1.8741606623350261e+01 -1.3845552517299271e+01 2.2601936169388708e+00 + 63 6.5142845574860658e+01 7.0992677773634583e+01 -8.4109461087571162e+01 + 64 4.0079794681812899e+01 9.6475030340595495e+01 9.1215541718322243e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index 54b66c5b71..d0f59749fd 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -1,8 +1,8 @@ --- lammps_version: 8 Apr 2021 -date_generated: Mon Apr 19 09:21:19 2021 +date_generated: Wed Apr 21 08:52:00 2021 epsilon: 5e-13 -skip_tests: +skip_tests: omp prerequisites: ! | pair reax/c pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml index ed599c837f..12136d7a27 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -1,8 +1,8 @@ --- lammps_version: 8 Apr 2021 -date_generated: Wed Apr 21 00:57:10 2021 +date_generated: Wed Apr 21 08:52:02 2021 epsilon: 1e-12 -skip_tests: +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -16,159 +16,162 @@ pre_commands: ! | atom_style charge lattice diamond 3.77 region box block 0 2 0 2 0 2 - create_box 2 box + create_box 3 box create_atoms 1 box displace_atoms all random 0.1 0.1 0.1 623426 - mass 1 12.0 - mass 2 13.0 + mass 1 1.0 + mass 2 12.0 + mass 3 16.0 set type 1 type/fraction 2 0.5 998877 - set type 1 charge 0.01 - set type 2 charge -0.01 + set type 2 type/fraction 3 0.5 887766 + set type 1 charge 0.00 + set type 2 charge 0.01 + set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c input_file: in.empty pair_style: reax/c reaxff-1.control checkqeq yes pair_coeff: ! | - * * ffield.reax.mattsson C O + * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -4208.203794533516 -init_coul: -268.0258681099902 -init_stress: ! |2- - 2.3677048490913976e+03 3.0802122558796082e+03 1.2727815110251254e+03 -1.5387991688241113e+03 -1.0906364142627658e+03 1.1229877249527667e+03 +init_vdwl: -3248.7357862540734 +init_coul: -327.0655125227952 +init_stress: ! |- + -9.1835020319343903e+02 -1.1070721188680500e+03 -7.1558466813462928e+02 -2.3040889388184371e+02 1.9640581541966435e+02 -6.6002885423290161e+02 init_forces: ! |2 - 1 2.9634051452065776e+01 -5.6267761875029782e+02 -1.6668253255994802e+02 - 2 -1.5938437728856897e+02 -2.2076601831947826e+02 -1.7161994484504669e+02 - 3 -3.1194106231031462e+01 -3.0591930644160692e+02 4.4652570958825507e+01 - 4 4.4646653320082436e+02 1.7080811286685625e+02 1.7439026170462094e+02 - 5 -1.1512606621588829e+02 7.9716954463493224e+01 1.7959700550214329e+01 - 6 -7.1695199301547871e+02 4.0749156820934594e+01 2.1512037025856768e+02 - 7 2.3022543693175331e+02 -9.0170756873740558e+01 8.2190170006875675e+01 - 8 -2.1141251466328132e+01 -1.5635879347045079e+02 1.6101907187955612e+02 - 9 -1.2130842270564283e+02 -2.7960689135651160e+02 -1.9629114850255749e+02 - 10 -3.7631710890094666e+02 3.4103240548851926e+02 -1.8166279141134461e+02 - 11 -1.6154553323850425e+02 1.5743068117721410e+02 3.5832389058234611e+02 - 12 6.1602989065568624e+02 -1.4821564423107765e+02 1.0871005319351426e+02 - 13 -2.1366561068642801e+02 -3.0163595494898948e+02 5.2420406156017953e+02 - 14 2.5933950255876238e+02 -1.7967300062473768e+01 -2.7733367021016375e+02 - 15 1.7570537661853186e+02 1.7550639099555497e+02 -9.5789475936343749e+01 - 16 3.0588529285449920e+02 -4.7675556549224140e+01 -3.4330544488852303e+02 - 17 -1.5018545342618870e+02 1.3259542010622351e+02 2.3200545258700299e+02 - 18 1.6469564396901546e+02 -1.0816413254489154e+02 2.1207485840068557e+02 - 19 2.4759285902963390e+02 -4.8758383780485623e+01 -2.2494100786656901e+02 - 20 1.2418785577586725e+02 2.5137242577508303e+02 -1.5341186115659308e+01 - 21 -1.9556210564941841e+02 2.3152590535658355e+01 -1.2529729601998551e+02 - 22 2.4829386068623685e+02 -2.9828789153728195e+02 -4.0455445433014944e+01 - 23 8.2076007650220902e+01 1.3042103437662357e+02 1.5221389911913158e+02 - 24 -7.6912973583042813e+01 2.3539925428986885e+02 -1.7129603802743895e+02 - 25 -2.9782413878301764e+01 -1.8931910469292632e+02 6.7989202537824610e+01 - 26 -3.9488494691904407e+01 2.1025614475916794e+00 -2.0748963060920084e+02 - 27 -2.7704110443956750e+02 5.3736974078117703e+02 4.2318884882972577e+02 - 28 -2.9303219943094604e+02 -5.1154115419361588e+01 -2.3633993403334915e+02 - 29 1.2970484011863061e+02 -4.2266229541142110e+01 1.6350076614995828e+02 - 30 5.6925606430591166e+01 3.7880191852724600e+01 6.8636397133459397e+01 - 31 -1.9325596697353996e+02 -1.1645368911554472e+02 -2.0671692760919722e+01 - 32 1.2360965200040813e+02 -3.3253411369721618e+01 -1.0516118458985304e+02 - 33 6.5241847803273885e+01 3.7105112939424635e+02 6.0972558235447849e+01 - 34 -2.3124259597682195e+02 -1.1681740329854802e+02 -2.5838262648358682e+02 - 35 -4.1912226107425607e+02 7.9942920270887299e+01 3.1021023518170796e+02 - 36 -1.8561789047315065e+02 -1.1563628711189787e+02 -4.2360172436435668e+01 - 37 8.8271496728328600e+00 -3.5266450940709689e+02 -6.0505384072732632e+01 - 38 -1.9249505149101950e+01 1.1716319600338795e+02 -2.3477222840168844e+02 - 39 -1.0433878247327728e+01 -7.0902801856110116e+01 1.4264113912369351e+02 - 40 3.3265570779158168e+02 -8.8675933035692435e+02 1.6250845779881573e+01 - 41 -6.4537349815946172e+01 1.5189506353180369e+02 -1.8225353662793415e+02 - 42 2.3368723487157848e+01 1.1821526860005753e+02 4.1207323013202608e+02 - 43 -3.5145546474526668e+01 -3.6511647370512939e+00 2.4936793079205805e+02 - 44 -1.2881828259541797e+00 -2.4877240180804270e+02 7.9235766494551896e+01 - 45 2.0871504532586613e+02 -1.0817588901351927e+02 -4.1291808327433904e+02 - 46 -1.3837716960728835e+02 4.6114279241763722e+02 -2.4013801845141236e+02 - 47 1.3255320792802306e+02 2.8747276038940731e+02 -3.2896384987636942e+01 - 48 7.8145138718949806e+02 6.5215432481146109e+01 -6.2304789958703225e+02 - 49 2.4486314507346734e+02 1.9101300126656582e+01 3.7417037047544437e+02 - 50 2.9821275118602205e+02 3.0684252095007048e+02 5.6994896759618052e+02 - 51 -8.0052405736429807e+02 5.1024940640341299e+02 7.5829315450277397e+02 - 52 -9.2130898885938862e+01 1.1909837120724032e+02 -2.4118832391138585e+02 - 53 -3.6386926333478533e+02 -2.0729203700042135e+02 -3.4910517647665347e+02 - 54 -8.3399710534951524e+01 1.8942260327525179e+02 -1.2868598438438329e+02 - 55 -2.5305956575884065e+02 -1.1005916187118694e+02 -3.0893514828399697e+02 - 56 1.7364614503217334e+02 -2.5754370913441153e+02 -4.3744509948721834e+01 - 57 4.2667925201499622e+02 1.5529221173799826e+02 -3.9988499000699767e+02 - 58 -3.9656744140970858e+01 7.8953243693724005e+01 2.6135299122198956e+02 - 59 -2.7594240444747430e+02 1.9891763338583493e+02 2.4122500794450380e+02 - 60 -2.5675904361260217e+02 -1.1527171320985197e+02 9.9923550442518007e+01 - 61 3.0884427580008497e+02 4.9986415802549533e+02 -1.3369122169831985e+02 - 62 2.8530106503455144e+01 5.9540697570421841e-01 -2.7403025931182458e+02 - 63 2.5297054006405503e+02 -2.7640485799384788e+02 -1.9200503841910373e+02 - 64 -8.4680445259253446e+01 -1.5737027404336791e+02 1.5637808719883620e+02 -run_vdwl: -4208.209603101806 -run_coul: -268.02583477440504 -run_stress: ! |2- - 2.3675903993340926e+03 3.0802227297803529e+03 1.2727311522662451e+03 -1.5388669378284644e+03 -1.0907269208283653e+03 1.1229243202763250e+03 + 1 -8.8484243142053771e+01 -2.5824351291806131e+01 1.0916231386685253e+02 + 2 -1.0451347832614758e+02 -1.8136974287862063e+02 -2.1792749625845642e+02 + 3 -1.7141330932870608e+02 1.8106971255162955e+02 1.2675253960497301e+01 + 4 3.2218812838204848e+01 -5.1411756251266169e+01 9.0007306757969332e+01 + 5 1.8144819687099243e+02 1.6798395592380494e+01 -8.1726053808337795e+01 + 6 1.3634126802325468e+02 -3.0056831863560092e+02 2.9662272655036674e+01 + 7 -5.2968391883957075e+01 -1.2850613949952665e+02 -1.6373506942005375e+02 + 8 -1.5240314403220790e+02 4.1133257093807195e+01 1.5386487473711944e+02 + 9 3.2812532468307630e+01 1.0176367686189140e+02 1.4294427965088833e+01 + 10 7.9509811085534508e+01 1.3053732532659748e+02 1.1246398073074913e+02 + 11 -4.3144361329385013e+01 6.5763458097239607e+01 1.3482625633510347e+02 + 12 -9.6706456479566398e+01 -2.5878068074726730e+01 7.8323180467847466e+00 + 13 -6.3851121453490357e+01 -4.6607020158192647e+01 -3.6458352736129619e+01 + 14 7.8283848679559682e+01 -6.3646790831912000e+01 -8.9030561188058030e+01 + 15 -6.4212540181982106e+01 2.1093128152294153e+02 7.9060299592798899e+01 + 16 1.8608410345576598e+02 5.8084942932974315e+01 5.8538920003760346e+01 + 17 1.4285494615811757e+02 -3.9754521764346137e+01 -9.7686742464543357e+01 + 18 -4.1881548239260340e+01 -1.8476992042512617e+02 1.0708048360801492e+02 + 19 2.6677589878662855e+02 3.7179534199157007e+02 -3.3866575926816608e+02 + 20 -7.3520359401756991e+01 -8.3905077072099573e+01 -2.3854316876052961e-01 + 21 -7.2528668519170566e+01 -5.5898051886914395e+01 -1.1976059789267009e+02 + 22 1.5613953224968657e+02 -1.3200393155013322e+02 8.2112641076919701e+01 + 23 8.1833165091702909e+01 -1.7531644917125782e+01 -2.5648343293479577e+01 + 24 -2.1833127742352656e+02 1.9453922798678227e+02 -1.0817823414171312e+02 + 25 -1.1414613109864892e+02 1.9088917707975912e+02 -8.3362585828151552e+01 + 26 2.8281696751420088e+02 -2.1478267582733659e+02 2.2873793580282316e+02 + 27 -5.9769124622217909e+01 6.5221508924768330e+01 1.7553584075622149e+02 + 28 -2.9606162623424783e+00 3.8183918395203605e+01 3.2190129571074365e+01 + 29 -7.1069178571897922e+01 3.5485903180456219e+01 2.7311648896337669e+01 + 30 -1.7036975157904502e+02 -1.9851849204561248e+02 -1.1511387046436195e+02 + 31 -1.3744101014029059e+02 1.6223817575815931e+02 -1.1915340963940670e+02 + 32 2.7247730686207166e+01 -6.0237587331413039e+01 -1.7664910575209962e+02 + 33 -6.1822971861324099e+01 -6.2648749988189138e+01 6.4194672454603221e+01 + 34 -1.7144145154614481e+01 9.9612835226783460e+01 -6.7437146990430080e+01 + 35 2.7024145652918196e+02 -2.1533864682645708e+02 1.3021380112890139e+02 + 36 1.0192185945862100e+02 1.8671686332443795e+02 -1.9864174410201804e+02 + 37 -1.7944122400067195e+02 1.2994089095714943e+02 -6.4321354857450871e+01 + 38 -2.9675055634802862e+02 1.0371104129720518e+02 1.5526989537725160e+02 + 39 8.6949523213895674e+01 -5.9975159120196956e+01 2.1780252234486241e+01 + 40 2.1612729980868430e+01 -1.0242580356371293e+02 5.7270724021457731e+01 + 41 -5.7836015722979205e+01 1.2268076597657853e+01 -6.6177893589402757e+01 + 42 -9.4774792026636987e+01 3.6872244003647978e+01 -7.5003138682741707e+01 + 43 2.2327470123469593e+02 9.5798787537490540e+01 1.2250410628715080e+02 + 44 8.7959342085865870e+01 -9.8740455124804626e+01 -8.4938709742755535e+01 + 45 1.4089093363544144e+01 1.2499300233485909e+02 5.5864237375372056e+01 + 46 1.3547776948110229e+01 -2.9276229642219512e+01 2.2187402435965939e+01 + 47 3.3448457824361199e+01 -1.9209977417392150e+02 -6.9989895706263340e+01 + 48 6.7827627502625162e+01 -2.0361789453088664e+02 -2.8571736118815554e+01 + 49 -3.7476005148434922e+02 -2.4452451195186526e+01 1.0764661193358344e+02 + 50 4.0090993029105412e+01 -7.3201402054245932e+01 8.9025922810974976e+01 + 51 1.3736420686697005e+02 -1.0204157331499377e+02 1.5813725581140889e+02 + 52 -1.1253479916199427e+02 1.2293268076535985e+02 -1.2940078007359961e+02 + 53 -5.3560738472921095e+01 3.3353082884518017e+02 -1.1314448604069298e+00 + 54 -1.0678339177259694e+01 6.2810937621378145e+01 1.8344988318246158e+02 + 55 1.1231900459987534e+02 -1.7906654831317346e+02 7.6533681064342304e+01 + 56 -4.7772143767870944e+01 -1.3536779754026816e+02 3.4054518546944344e+01 + 57 9.6541690594806298e+01 7.5093838528685538e+01 -6.0858704719314126e+01 + 58 -2.0459002696752538e+01 -1.1535051272093606e+01 -1.4282722385693347e+01 + 59 -6.9459404830701018e+01 1.0185761321965332e+02 8.3383492919159224e+01 + 60 -1.6658947285275730e+01 6.4062738321772898e+01 -1.5162708730048112e+02 + 61 -3.5221540644535267e+01 -1.0209415023871217e+02 -7.4154806308030501e+01 + 62 1.5375061601631639e+01 -6.3257038363614946e+00 2.7511178147389188e+01 + 63 1.3464841040549373e+02 -1.2416888785900632e+02 -5.8961420295344652e+01 + 64 1.0701063550375264e+02 1.1895268715876718e+02 7.4448770962530915e+01 +run_vdwl: -3248.732462206598 +run_coul: -327.0653994771387 +run_stress: ! |- + -9.1826184153105692e+02 -1.1070021528099094e+03 -7.1550580149015514e+02 -2.3049698812230801e+02 1.9635464153062043e+02 -6.6005793264639442e+02 run_forces: ! |2 - 1 2.9635294281596629e+01 -5.6267712552695355e+02 -1.6667999923844260e+02 - 2 -1.5938673400153084e+02 -2.2076536449681615e+02 -1.7162354129443358e+02 - 3 -3.1189858281107686e+01 -3.0593580065881065e+02 4.4645958607276903e+01 - 4 4.4646581891372387e+02 1.7080959763779416e+02 1.7439093938226924e+02 - 5 -1.1512839796353090e+02 7.9717058687928301e+01 1.7957487669503269e+01 - 6 -7.1695602565953754e+02 4.0752829698565129e+01 2.1512533839229457e+02 - 7 2.3022644486519411e+02 -9.0168915600548360e+01 8.2194655874266601e+01 - 8 -2.1149264848797216e+01 -1.5637111051642705e+02 1.6102981315496413e+02 - 9 -1.2130987756626666e+02 -2.7961363383950726e+02 -1.9628960069614115e+02 - 10 -3.7631817089744851e+02 3.4103259385937554e+02 -1.8166532788358310e+02 - 11 -1.6154687915128738e+02 1.5742797820592227e+02 3.5832199951133208e+02 - 12 6.1603841944462704e+02 -1.4820397700323306e+02 1.0871524086058155e+02 - 13 -2.1367529106933924e+02 -3.0167446795626824e+02 5.2424091634186300e+02 - 14 2.5933827511241435e+02 -1.7968203382134384e+01 -2.7733114072539058e+02 - 15 1.7570793004243023e+02 1.7551005525188847e+02 -9.5784231788978602e+01 - 16 3.0586985592967716e+02 -4.7679566105942172e+01 -3.4332192731503403e+02 - 17 -1.5018636472333401e+02 1.3259146324637055e+02 2.3200578297676140e+02 - 18 1.6469881174805093e+02 -1.0816836176977682e+02 2.1207670716679300e+02 - 19 2.4759420520504440e+02 -4.8758383157728915e+01 -2.2494116682878234e+02 - 20 1.2419960666451705e+02 2.5137933265662170e+02 -1.5328241144751686e+01 - 21 -1.9556094492800662e+02 2.3151723982044651e+01 -1.2529581330697289e+02 - 22 2.4829941584477842e+02 -2.9829345245035574e+02 -4.0446702084691779e+01 - 23 8.2074458696899129e+01 1.3042100306282259e+02 1.5221371881646226e+02 - 24 -7.6917668833498695e+01 2.3540360228737018e+02 -1.7130192995353460e+02 - 25 -2.9742104523791699e+01 -1.8935699467869648e+02 6.7995874219740458e+01 - 26 -3.9494943772601978e+01 2.1074054704282794e+00 -2.0748981609858308e+02 - 27 -2.7704003655184448e+02 5.3736954143364790e+02 4.2318574013793062e+02 - 28 -2.9302855291124280e+02 -5.1149666118966557e+01 -2.3633679976948292e+02 - 29 1.2970505460339569e+02 -4.2266433901944204e+01 1.6349685185794760e+02 - 30 5.6925896868063084e+01 3.7880918758222101e+01 6.8637128510015330e+01 - 31 -1.9325534294265930e+02 -1.1645328076629426e+02 -2.0671892621504877e+01 - 32 1.2360198063080443e+02 -3.3253019999909611e+01 -1.0516936549559779e+02 - 33 6.5239383936206508e+01 3.7104662858438877e+02 6.0974455303728860e+01 - 34 -2.3124084085036844e+02 -1.1681523003030674e+02 -2.5837805461650709e+02 - 35 -4.1912113383000468e+02 7.9943750613167680e+01 3.1020725803703027e+02 - 36 -1.8561422052424510e+02 -1.1563434085918074e+02 -4.2360108129535796e+01 - 37 8.8275421441412476e+00 -3.5266971563405309e+02 -6.0507541453139780e+01 - 38 -1.9245036832024766e+01 1.1717726898935943e+02 -2.3478417248417912e+02 - 39 -1.0434224692463781e+01 -7.0902644440215226e+01 1.4263978421853071e+02 - 40 3.3271177801097338e+02 -8.8679293552761737e+02 1.6219742097553457e+01 - 41 -6.4538764986414577e+01 1.5189397693607691e+02 -1.8225441696792819e+02 - 42 2.3368235855730731e+01 1.1822246665291377e+02 4.1207745038648687e+02 - 43 -3.5145643416897457e+01 -3.6517162542343855e+00 2.4936784352977961e+02 - 44 -1.2879745400833591e+00 -2.4877345145141396e+02 7.9236449970507763e+01 - 45 2.0871643412337198e+02 -1.0817571271699651e+02 -4.1291831345624706e+02 - 46 -1.3836372705478144e+02 4.6117938292253501e+02 -2.4016736526221220e+02 - 47 1.3255125611057710e+02 2.8747591615866617e+02 -3.2895660248667433e+01 - 48 7.8145417759951215e+02 6.5214930060411348e+01 -6.2304930828893896e+02 - 49 2.4488281403353915e+02 1.9105496615716447e+01 3.7418605144303535e+02 - 50 2.9822129513621309e+02 3.0683153982656597e+02 5.6994490418774978e+02 - 51 -8.0058572063783151e+02 5.1028617285838249e+02 7.5832431569026710e+02 - 52 -9.2137024513817948e+01 1.1910687193197515e+02 -2.4119120858090670e+02 - 53 -3.6387082584323133e+02 -2.0729771077062716e+02 -3.4910499737662099e+02 - 54 -8.3401322475873869e+01 1.8942466656601317e+02 -1.2869045777948361e+02 - 55 -2.5309678413623200e+02 -1.1001947899857403e+02 -3.0896372370121441e+02 - 56 1.7364604574034126e+02 -2.5754429115053944e+02 -4.3743962050163233e+01 - 57 4.2666362581864416e+02 1.5528157995542574e+02 -3.9988032807909389e+02 - 58 -3.9656744873549869e+01 7.8953170999147900e+01 2.6135222052406010e+02 - 59 -2.7594581611209134e+02 1.9891770704099989e+02 2.4122933700016557e+02 - 60 -2.5675992319680108e+02 -1.1527235824442386e+02 9.9923831048631499e+01 - 61 3.0884428120705229e+02 4.9986711220597209e+02 -1.3369013376796403e+02 - 62 2.8530678742626058e+01 5.9283151669356982e-01 -2.7403002505094940e+02 - 63 2.5296775626792657e+02 -2.7640525289662452e+02 -1.9200401038409547e+02 - 64 -8.4674586435535105e+01 -1.5736397776829435e+02 1.5637348700622513e+02 + 1 -8.8485813027206106e+01 -2.5824096764125731e+01 1.0916519811125200e+02 + 2 -1.0451269244764349e+02 -1.8137828885716391e+02 -2.1792302517211854e+02 + 3 -1.7141411648636478e+02 1.8106803267132440e+02 1.2674658958989376e+01 + 4 3.2220655253010904e+01 -5.1413086231065009e+01 9.0010227071396386e+01 + 5 1.8145005123751935e+02 1.6799086578426795e+01 -8.1723924656170567e+01 + 6 1.3640868425589994e+02 -3.0059549892327152e+02 2.9595528779455449e+01 + 7 -5.2968868171259700e+01 -1.2850640761855158e+02 -1.6373951876943795e+02 + 8 -1.5240417232930932e+02 4.1133578832982629e+01 1.5386572595284764e+02 + 9 3.2811395144161118e+01 1.0176141517530588e+02 1.4295529169373282e+01 + 10 7.9508569375402288e+01 1.3053469081285704e+02 1.1246210158699024e+02 + 11 -4.3142968406859097e+01 6.5760241919953828e+01 1.3481728343070949e+02 + 12 -9.6708250458847047e+01 -2.5879521605003774e+01 7.8278088000700450e+00 + 13 -6.3852523341823215e+01 -4.6607003335506526e+01 -3.6455965991574899e+01 + 14 7.8283534745824213e+01 -6.3643851884097081e+01 -8.9027881489336053e+01 + 15 -6.4209962316685647e+01 2.1093255387179667e+02 7.9059692211125324e+01 + 16 1.8608085162130908e+02 5.8088780803195149e+01 5.8532604899053126e+01 + 17 1.4285609630789870e+02 -3.9754014601715802e+01 -9.7689588113924358e+01 + 18 -4.1881237955183380e+01 -1.8477109777149900e+02 1.0708061287038568e+02 + 19 2.6677609377410010e+02 3.7179392086487712e+02 -3.3866472006706340e+02 + 20 -7.3532190353883053e+01 -8.3895301502997995e+01 -2.5591151698950659e-01 + 21 -7.2528695460850031e+01 -5.5899068566579935e+01 -1.1975970158720031e+02 + 22 1.5614083463623408e+02 -1.3200472837628521e+02 8.2112156159808862e+01 + 23 8.1835290134891864e+01 -1.7522433028942366e+01 -2.5648597332802922e+01 + 24 -2.1834038832017538e+02 1.9455197293610073e+02 -1.0818261235148485e+02 + 25 -1.1414871301032665e+02 1.9089327234338916e+02 -8.3363315092572321e+01 + 26 2.8282661127556162e+02 -2.1478990451658228e+02 2.2874215408671131e+02 + 27 -5.9765619577841512e+01 6.5223096224356411e+01 1.7553677772771837e+02 + 28 -2.9624987519851000e+00 3.8179667154298826e+01 3.2185280629057068e+01 + 29 -7.1069494187081830e+01 3.5486459200488397e+01 2.7311657807311487e+01 + 30 -1.7037047317028464e+02 -1.9851861739498079e+02 -1.1511395377375429e+02 + 31 -1.3744346258178371e+02 1.6223725554250467e+02 -1.1915482471876425e+02 + 32 2.7248541074999881e+01 -6.0231207974705434e+01 -1.7663875080811843e+02 + 33 -6.1822398570959187e+01 -6.2648503570177034e+01 6.4194898940197760e+01 + 34 -1.7143769208529751e+01 9.9611942509072080e+01 -6.7436075885014986e+01 + 35 2.7028238194296250e+02 -2.1538301386687789e+02 1.3022488558865325e+02 + 36 1.0192362247594352e+02 1.8671008619975407e+02 -1.9863711527085923e+02 + 37 -1.7946751638141498e+02 1.2998098195714172e+02 -6.4345576150932828e+01 + 38 -2.9675376021752191e+02 1.0371435865032235e+02 1.5526896750689889e+02 + 39 8.6950332148131110e+01 -5.9975388525042028e+01 2.1779869753193040e+01 + 40 2.1613442490343317e+01 -1.0242529062335393e+02 5.7271060256879871e+01 + 41 -5.7834219239599371e+01 1.2266148111030006e+01 -6.6169611760840567e+01 + 42 -9.4774021509187520e+01 3.6869981851995341e+01 -7.5005285702022732e+01 + 43 2.2327078175416057e+02 9.5796580610065675e+01 1.2250057895428364e+02 + 44 8.7963372590925971e+01 -9.8736166841311601e+01 -8.4943701327958067e+01 + 45 1.4080569929277514e+01 1.2498603359504317e+02 5.5870075675508225e+01 + 46 1.3549084713162141e+01 -2.9276453411015115e+01 2.2187141786216614e+01 + 47 3.3448153520154243e+01 -1.9209514330879989e+02 -6.9988284949882583e+01 + 48 6.7840148074199064e+01 -2.0361975956922109e+02 -2.8580806381848241e+01 + 49 -3.7480020999441342e+02 -2.4397739069897693e+01 1.0773474200196225e+02 + 50 4.0091767398974710e+01 -7.3200211843412532e+01 8.9024460533547710e+01 + 51 1.3736689552057061e+02 -1.0204490779999098e+02 1.5814099219631356e+02 + 52 -1.1253380764229995e+02 1.2293290174735385e+02 -1.2940467151627448e+02 + 53 -5.3596650492501155e+01 3.3350644289105048e+02 -1.1510223807932292e+00 + 54 -1.0666202581574648e+01 6.2798090272532036e+01 1.8346799239172421e+02 + 55 1.1232135575968965e+02 -1.7906994470748415e+02 7.6534265236354301e+01 + 56 -4.7780797026174795e+01 -1.3535955159718560e+02 3.4061208199866762e+01 + 57 9.6541265005138669e+01 7.5091144884198542e+01 -6.0860069746425758e+01 + 58 -2.0459328007572658e+01 -1.1533053731831272e+01 -1.4282938438265621e+01 + 59 -6.9467796604507953e+01 1.0186323697055805e+02 8.3388794196804326e+01 + 60 -1.6660217426514649e+01 6.4061566362647156e+01 -1.5162714312949214e+02 + 61 -3.5220536021452773e+01 -1.0209241739133056e+02 -7.4154706185261873e+01 + 62 1.5375483178245863e+01 -6.3263099051314251e+00 2.7512110875657907e+01 + 63 1.3464595988109866e+02 -1.2416936634154251e+02 -5.8957063242418137e+01 + 64 1.0701154605982802e+02 1.1895382951205713e+02 7.4449321163285816e+01 ... From 4eaa45337c24d786bc7cd1546bc59e82d1346a91 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 15:14:12 -0400 Subject: [PATCH 080/352] reorder functions for simpler side-by-side comparison --- src/USER-OMP/reaxc_bond_orders_omp.cpp | 291 ++++++++++++------------- 1 file changed, 140 insertions(+), 151 deletions(-) diff --git a/src/USER-OMP/reaxc_bond_orders_omp.cpp b/src/USER-OMP/reaxc_bond_orders_omp.cpp index 6434c3d03a..4e7e42fac7 100644 --- a/src/USER-OMP/reaxc_bond_orders_omp.cpp +++ b/src/USER-OMP/reaxc_bond_orders_omp.cpp @@ -1,6 +1,5 @@ /*---------------------------------------------------------------------- PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd Copyright (2010) Purdue University @@ -37,156 +36,6 @@ using namespace LAMMPS_NS; namespace ReaxFF { - void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) { - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - int pk, k, j; - - PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); - - int tid = get_tid(); - ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); - long reductionOffset = (system->N * tid); - - /* Virial Tallying variables */ - rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; - - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); - - double c = bo_ij->Cdbo + bo_ji->Cdbo; - coef.C1dbo = bo_ij->C1dbo * c; - coef.C2dbo = bo_ij->C2dbo * c; - coef.C3dbo = bo_ij->C3dbo * c; - - c = bo_ij->Cdbopi + bo_ji->Cdbopi; - coef.C1dbopi = bo_ij->C1dbopi * c; - coef.C2dbopi = bo_ij->C2dbopi * c; - coef.C3dbopi = bo_ij->C3dbopi * c; - coef.C4dbopi = bo_ij->C4dbopi * c; - - c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; - coef.C1dbopi2 = bo_ij->C1dbopi2 * c; - coef.C2dbopi2 = bo_ij->C2dbopi2 * c; - coef.C3dbopi2 = bo_ij->C3dbopi2 * c; - coef.C4dbopi2 = bo_ij->C4dbopi2 * c; - - c = workspace->CdDelta[i] + workspace->CdDelta[j]; - coef.C1dDelta = bo_ij->C1dbo * c; - coef.C2dDelta = bo_ij->C2dbo * c; - coef.C3dDelta = bo_ij->C3dbo * c; - - c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp); - - c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); - rvec_ScaledAdd(temp, c, workspace->dDeltap_self[i]); - - rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); - rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); - - rvec_Add(workspace->forceReduction[reductionOffset+i],temp); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fi_tmp, -1.0, temp); - rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, - fi_tmp[0],fi_tmp[1],fi_tmp[2], - delij[0],delij[1],delij[2],thr); - } - - c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); - rvec_Scale( temp, c, bo_ij->dBOp); - - c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); - rvec_ScaledAdd(temp, c, workspace->dDeltap_self[j]); - - rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); - rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); - - - rvec_Add(workspace->forceReduction[reductionOffset+j],temp); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fj_tmp, -1.0, temp); - rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, - fj_tmp[0],fj_tmp[1],fj_tmp[2], - delji[0],delji[1],delji[2],thr); - } - - // forces on k: i neighbor - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - // rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); - - const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); - rvec_Scale(temp, c, nbr_k->bo_data.dBOp); - - rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); - } - } - - // forces on k: j neighbor - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - // rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - // rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); - - const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); - rvec_Scale(temp, c, nbr_k->bo_data.dBOp); - - rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); - rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); - - rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); - } - } - } - -/* ---------------------------------------------------------------------- */ - void Add_dBond_to_Forces_NPTOMP(reax_system *system, int i, int pj, storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; @@ -288,6 +137,146 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+j],temp); } +/* ---------------------------------------------------------------------- */ + + void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, + storage *workspace, reax_list **lists) { + reax_list *bonds = (*lists) + BONDS; + bond_data *nbr_j, *nbr_k; + bond_order_data *bo_ij, *bo_ji; + dbond_coefficients coef; + int pk, k, j; + + PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); + + int tid = get_tid(); + ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); + long reductionOffset = (system->N * tid); + + /* Virial Tallying variables */ + rvec fi_tmp, fj_tmp, fk_tmp, delij, delji, delki, delkj, temp; + + /* Initializations */ + nbr_j = &(bonds->select.bond_list[pj]); + j = nbr_j->nbr; + bo_ij = &(nbr_j->bo_data); + bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); + + double c = bo_ij->Cdbo + bo_ji->Cdbo; + coef.C1dbo = bo_ij->C1dbo * c; + coef.C2dbo = bo_ij->C2dbo * c; + coef.C3dbo = bo_ij->C3dbo * c; + + c = bo_ij->Cdbopi + bo_ji->Cdbopi; + coef.C1dbopi = bo_ij->C1dbopi * c; + coef.C2dbopi = bo_ij->C2dbopi * c; + coef.C3dbopi = bo_ij->C3dbopi * c; + coef.C4dbopi = bo_ij->C4dbopi * c; + + c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; + coef.C1dbopi2 = bo_ij->C1dbopi2 * c; + coef.C2dbopi2 = bo_ij->C2dbopi2 * c; + coef.C3dbopi2 = bo_ij->C3dbopi2 * c; + coef.C4dbopi2 = bo_ij->C4dbopi2 * c; + + c = workspace->CdDelta[i] + workspace->CdDelta[j]; + coef.C1dDelta = bo_ij->C1dbo * c; + coef.C2dDelta = bo_ij->C2dbo * c; + coef.C3dDelta = bo_ij->C3dbo * c; + + c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp); + + c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[i]); + + rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); + + rvec_Add(workspace->forceReduction[reductionOffset+i],temp); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fi_tmp, -1.0, temp); + rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, + fi_tmp[0],fi_tmp[1],fi_tmp[2], + delij[0],delij[1],delij[2],thr); + } + + c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp); + + c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[j]); + + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); + rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); + + + rvec_Add(workspace->forceReduction[reductionOffset+j],temp); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fj_tmp, -1.0, temp); + rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, + fj_tmp[0],fj_tmp[1],fj_tmp[2], + delji[0],delji[1],delji[2],thr); + } + + // forces on k: i neighbor + for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } + } + + // forces on k: j neighbor + for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { + nbr_k = &(bonds->select.bond_list[pk]); + k = nbr_k->nbr; + + const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + + rvec_Add(workspace->forceReduction[reductionOffset+k],temp); + + if (system->pair_ptr->vflag_atom) { + rvec_Scale(fk_tmp, -1.0, temp); + rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delki[0],delki[1],delki[2],thr); + + rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); + + pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + fk_tmp[0],fk_tmp[1],fk_tmp[2], + delkj[0],delkj[1],delkj[2],thr); + } + } + } + /* ---------------------------------------------------------------------- */ int BOp_OMP(storage * /* workspace */, reax_list *bonds, double bo_cut, From 865759116e1bd9f31a054e895b90f9224f25cad0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 15:14:18 -0400 Subject: [PATCH 081/352] update some comments --- src/USER-REAXC/reaxc_bond_orders.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index c3fda58173..65189562ae 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -2,15 +2,16 @@ PuReMD - Purdue ReaxFF Molecular Dynamics Program Copyright (2010) Purdue University - Hasan Metin Aktulga, hmaktulga@lbl.gov - Joseph Fogarty, jcfogart@mail.usf.edu - Sagar Pandit, pandit@usf.edu - Ananth Y Grama, ayg@cs.purdue.edu + + Contributing authors: + H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama + Corresponding author: + Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu Please cite the related publication: H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. + Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -64,6 +65,11 @@ namespace ReaxFF { coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + + /************************************ + * forces related to atom i * + * first neighbors of atom i * + ************************************/ for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; From f856030203a1d99fff38f48c39d4fea6462e12ed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Apr 2021 15:22:00 -0400 Subject: [PATCH 082/352] update example inputs and log files for current state of affairs --- examples/reax/in.reaxc.rdx | 68 ++++---- examples/reax/in.reaxc.rdx-shielded | 67 ++++---- examples/reax/in.reaxc.tatb | 71 ++++---- examples/reax/in.reaxc.tatb-shielded | 71 ++++---- .../reax/log.21Apr21.reaxc.rdx-shielded.g++.1 | 154 ++++++++++++++++++ .../reax/log.21Apr21.reaxc.rdx-shielded.g++.4 | 154 ++++++++++++++++++ examples/reax/log.21Apr21.reaxc.rdx.g++.1 | 154 ++++++++++++++++++ examples/reax/log.21Apr21.reaxc.rdx.g++.4 | 154 ++++++++++++++++++ .../log.21Apr21.reaxc.tatb-shielded.g++.1 | 154 ++++++++++++++++++ .../log.21Apr21.reaxc.tatb-shielded.g++.4 | 154 ++++++++++++++++++ examples/reax/log.21Apr21.reaxc.tatb.g++.1 | 154 ++++++++++++++++++ examples/reax/log.21Apr21.reaxc.tatb.g++.4 | 154 ++++++++++++++++++ .../reax/log.4Jan19.reaxc.rdx-shielded.g++.1 | 116 ------------- .../reax/log.4Jan19.reaxc.rdx-shielded.g++.4 | 116 ------------- .../reax/log.4Jan19.reaxc.tatb-shielded.g++.1 | 114 ------------- .../reax/log.4Jan19.reaxc.tatb-shielded.g++.4 | 114 ------------- examples/reax/log.8March18.reaxc.rdx.g++.1 | 115 ------------- examples/reax/log.8March18.reaxc.rdx.g++.4 | 115 ------------- examples/reax/log.8March18.reaxc.tatb.g++.1 | 113 ------------- examples/reax/log.8March18.reaxc.tatb.g++.4 | 113 ------------- 20 files changed, 1373 insertions(+), 1052 deletions(-) create mode 100644 examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 create mode 100644 examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 create mode 100644 examples/reax/log.21Apr21.reaxc.rdx.g++.1 create mode 100644 examples/reax/log.21Apr21.reaxc.rdx.g++.4 create mode 100644 examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 create mode 100644 examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 create mode 100644 examples/reax/log.21Apr21.reaxc.tatb.g++.1 create mode 100644 examples/reax/log.21Apr21.reaxc.tatb.g++.4 delete mode 100644 examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.1 delete mode 100644 examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.4 delete mode 100644 examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.1 delete mode 100644 examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.4 delete mode 100644 examples/reax/log.8March18.reaxc.rdx.g++.1 delete mode 100644 examples/reax/log.8March18.reaxc.rdx.g++.4 delete mode 100644 examples/reax/log.8March18.reaxc.tatb.g++.1 delete mode 100644 examples/reax/log.8March18.reaxc.tatb.g++.4 diff --git a/examples/reax/in.reaxc.rdx b/examples/reax/in.reaxc.rdx index 4874ea2dbb..36bf2a6e8c 100644 --- a/examples/reax/in.reaxc.rdx +++ b/examples/reax/in.reaxc.rdx @@ -1,52 +1,54 @@ # ReaxFF potential for RDX system # this run is equivalent to reax/in.reax.rdx -units real +units real -atom_style charge -read_data data.rdx +atom_style charge +read_data data.rdx pair_style reax/c control.reax_c.rdx pair_coeff * * ffield.reax C H O N compute reax all pair reax/c -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no -fix 1 all nve +fix 1 all nve fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c -thermo 10 -thermo_style custom step temp epair etotal press & - v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & - v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq +variable nqeq equal f_2 -timestep 1.0 +thermo 10 +thermo_style custom step temp epair etotal press & + v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & + v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq -#dump 1 all atom 10 dump.reaxc.rdx +timestep 1.0 -#dump 2 all image 25 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 1 all atom 10 dump.reaxc.rdx -#dump 3 all movie 25 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -run 100 +#dump 3 all movie 25 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 diff --git a/examples/reax/in.reaxc.rdx-shielded b/examples/reax/in.reaxc.rdx-shielded index 3354b92eab..2151f63a5f 100644 --- a/examples/reax/in.reaxc.rdx-shielded +++ b/examples/reax/in.reaxc.rdx-shielded @@ -1,52 +1,53 @@ # ReaxFF potential for RDX system # this run is equivalent to reax/in.reax.rdx -units real +units real -atom_style charge -read_data data.rdx +atom_style charge +read_data data.rdx pair_style reax/c control.reax_c.rdx pair_coeff * * ffield.reax C H O N compute reax all pair reax/c -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no -fix 1 all nve +fix 1 all nve fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c +variable nqeq equal f_2 -thermo 10 -thermo_style custom step temp epair etotal press & - v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & - v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq +thermo 10 +thermo_style custom step temp epair etotal press & + v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & + v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq -timestep 1.0 +timestep 1.0 -#dump 1 all atom 10 dump.reaxc.rdx +#dump 1 all atom 10 dump.reaxc.rdx -#dump 2 all image 25 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 25 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 25 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 -run 100 +run 100 diff --git a/examples/reax/in.reaxc.tatb b/examples/reax/in.reaxc.tatb index a166613b85..474290340f 100644 --- a/examples/reax/in.reaxc.tatb +++ b/examples/reax/in.reaxc.tatb @@ -1,55 +1,56 @@ # ReaxFF potential for TATB system # this run is equivalent to reax/in.reax.tatb, -units real +units real -atom_style charge -read_data data.tatb +atom_style charge +read_data data.tatb pair_style reax/c control.reax_c.tatb pair_coeff * * ffield.reax C H O N compute reax all pair reax/c -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no -fix 1 all nve +fix 1 all nve fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc +fix 4 all reax/c/bonds 5 bonds.reaxc +variable nqeq equal f_2 -thermo 5 -thermo_style custom step temp epair etotal press & - v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & - v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq +thermo 5 +thermo_style custom step temp epair etotal press & + v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & + v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq -timestep 0.0625 +timestep 0.0625 -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z +#dump 1 all custom 100 dump.reaxc.tatb id type q x y z -#dump 2 all image 5 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 5 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 5 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 5 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 -fix 3 all reax/c/species 1 5 5 species.tatb +fix 3 all reax/c/species 1 5 5 species.tatb -run 25 +run 25 diff --git a/examples/reax/in.reaxc.tatb-shielded b/examples/reax/in.reaxc.tatb-shielded index 2ff4d34f7a..aeac3308a8 100644 --- a/examples/reax/in.reaxc.tatb-shielded +++ b/examples/reax/in.reaxc.tatb-shielded @@ -1,55 +1,56 @@ # ReaxFF potential for TATB system # this run is equivalent to reax/in.reax.tatb, -units real +units real -atom_style charge -read_data data.tatb +atom_style charge +read_data data.tatb pair_style reax/c control.reax_c.tatb pair_coeff * * ffield.reax C H O N compute reax all pair reax/c -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no -fix 1 all nve +fix 1 all nve fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc +fix 4 all reax/c/bonds 5 bonds.reaxc +variable nqeq equal f_2 -thermo 5 -thermo_style custom step temp epair etotal press & - v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & - v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq +thermo 5 +thermo_style custom step temp epair etotal press & + v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa & + v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq -timestep 0.0625 +timestep 0.0625 -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z +#dump 1 all custom 100 dump.reaxc.tatb id type q x y z -#dump 2 all image 5 image.*.jpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 +#dump 2 all image 5 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 -#dump 3 all movie 5 movie.mpg type type & -# axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 +#dump 3 all movie 5 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 -fix 3 all reax/c/species 1 5 5 species.tatb +fix 3 all reax/c/species 1 5 5 species.tatb -run 25 +run 25 diff --git a/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 b/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 new file mode 100644 index 0000000000..5ff8307135 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.617026 on 1 procs for 100 steps with 21 atoms + +Performance: 14.003 ns/day, 1.714 hours/ns, 162.068 timesteps/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 | 0.52176 | 0.52176 | 0.52176 | 0.0 | 84.56 +Neigh | 0.033948 | 0.033948 | 0.033948 | 0.0 | 5.50 +Comm | 0.0017188 | 0.0017188 | 0.0017188 | 0.0 | 0.28 +Output | 0.00059319 | 0.00059319 | 0.00059319 | 0.0 | 0.10 +Modify | 0.05887 | 0.05887 | 0.05887 | 0.0 | 9.54 +Other | | 0.0001347 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 b/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 new file mode 100644 index 0000000000..79fa5f77b2 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.617778 on 1 procs for 100 steps with 21 atoms + +Performance: 13.986 ns/day, 1.716 hours/ns, 161.871 timesteps/s +99.8% 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.52159 | 0.52159 | 0.52159 | 0.0 | 84.43 +Neigh | 0.03479 | 0.03479 | 0.03479 | 0.0 | 5.63 +Comm | 0.0017166 | 0.0017166 | 0.0017166 | 0.0 | 0.28 +Output | 0.00061226 | 0.00061226 | 0.00061226 | 0.0 | 0.10 +Modify | 0.058924 | 0.058924 | 0.058924 | 0.0 | 9.54 +Other | | 0.0001466 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.rdx.g++.1 b/examples/reax/log.21Apr21.reaxc.rdx.g++.1 new file mode 100644 index 0000000000..38347ffce7 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.rdx.g++.1 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.618477 on 1 procs for 100 steps with 21 atoms + +Performance: 13.970 ns/day, 1.718 hours/ns, 161.687 timesteps/s +99.9% 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.52329 | 0.52329 | 0.52329 | 0.0 | 84.61 +Neigh | 0.03397 | 0.03397 | 0.03397 | 0.0 | 5.49 +Comm | 0.0017006 | 0.0017006 | 0.0017006 | 0.0 | 0.27 +Output | 0.00060892 | 0.00060892 | 0.00060892 | 0.0 | 0.10 +Modify | 0.058764 | 0.058764 | 0.058764 | 0.0 | 9.50 +Other | | 0.0001407 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.rdx.g++.4 b/examples/reax/log.21Apr21.reaxc.rdx.g++.4 new file mode 100644 index 0000000000..a409cbe358 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.rdx.g++.4 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.618479 on 1 procs for 100 steps with 21 atoms + +Performance: 13.970 ns/day, 1.718 hours/ns, 161.687 timesteps/s +99.8% 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.52299 | 0.52299 | 0.52299 | 0.0 | 84.56 +Neigh | 0.034338 | 0.034338 | 0.034338 | 0.0 | 5.55 +Comm | 0.0017166 | 0.0017166 | 0.0017166 | 0.0 | 0.28 +Output | 0.00060272 | 0.00060272 | 0.00060272 | 0.0 | 0.10 +Modify | 0.058692 | 0.058692 | 0.058692 | 0.0 | 9.49 +Other | | 0.0001385 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 b/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 new file mode 100644 index 0000000000..dac271442b --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.618214 on 1 procs for 100 steps with 21 atoms + +Performance: 13.976 ns/day, 1.717 hours/ns, 161.756 timesteps/s +99.9% 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.52298 | 0.52298 | 0.52298 | 0.0 | 84.60 +Neigh | 0.033964 | 0.033964 | 0.033964 | 0.0 | 5.49 +Comm | 0.001708 | 0.001708 | 0.001708 | 0.0 | 0.28 +Output | 0.00060844 | 0.00060844 | 0.00060844 | 0.0 | 0.10 +Modify | 0.058812 | 0.058812 | 0.058812 | 0.0 | 9.51 +Other | | 0.0001411 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 b/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 new file mode 100644 index 0000000000..74c2a13875 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.617311 on 1 procs for 100 steps with 21 atoms + +Performance: 13.996 ns/day, 1.715 hours/ns, 161.993 timesteps/s +99.9% 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.52226 | 0.52226 | 0.52226 | 0.0 | 84.60 +Neigh | 0.033952 | 0.033952 | 0.033952 | 0.0 | 5.50 +Comm | 0.0017183 | 0.0017183 | 0.0017183 | 0.0 | 0.28 +Output | 0.00060129 | 0.00060129 | 0.00060129 | 0.0 | 0.10 +Modify | 0.058648 | 0.058648 | 0.058648 | 0.0 | 9.50 +Other | | 0.0001364 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.tatb.g++.1 b/examples/reax/log.21Apr21.reaxc.tatb.g++.1 new file mode 100644 index 0000000000..d79287b694 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.tatb.g++.1 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.617401 on 1 procs for 100 steps with 21 atoms + +Performance: 13.994 ns/day, 1.715 hours/ns, 161.969 timesteps/s +99.8% 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.52185 | 0.52185 | 0.52185 | 0.0 | 84.52 +Neigh | 0.034507 | 0.034507 | 0.034507 | 0.0 | 5.59 +Comm | 0.0017211 | 0.0017211 | 0.0017211 | 0.0 | 0.28 +Output | 0.00060844 | 0.00060844 | 0.00060844 | 0.0 | 0.10 +Modify | 0.058573 | 0.058573 | 0.058573 | 0.0 | 9.49 +Other | | 0.0001466 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.21Apr21.reaxc.tatb.g++.4 b/examples/reax/log.21Apr21.reaxc.tatb.g++.4 new file mode 100644 index 0000000000..e0cb6b6760 --- /dev/null +++ b/examples/reax/log.21Apr21.reaxc.tatb.g++.4 @@ -0,0 +1,154 @@ +LAMMPS (8 Apr 2021) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system +# this run is equivalent to reax/in.reax.rdx + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reax/c control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reax/c + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxc.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reax/c command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reax command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reax/c, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: half/ghost/bin/3d/newtoff + bin: standard + (2) fix qeq/reax, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 + 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 + 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 + 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 + 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 + 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 + 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 + 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 + 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 +Loop time of 0.617397 on 1 procs for 100 steps with 21 atoms + +Performance: 13.994 ns/day, 1.715 hours/ns, 161.970 timesteps/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 | 0.52183 | 0.52183 | 0.52183 | 0.0 | 84.52 +Neigh | 0.034217 | 0.034217 | 0.034217 | 0.0 | 5.54 +Comm | 0.0017104 | 0.0017104 | 0.0017104 | 0.0 | 0.28 +Output | 0.00059891 | 0.00059891 | 0.00059891 | 0.0 | 0.10 +Modify | 0.0589 | 0.0589 | 0.0589 | 0.0 | 9.54 +Other | | 0.0001419 | | | 0.02 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1096 +Ave neighs/atom = 52.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.1 b/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.1 deleted file mode 100644 index 9e991a5d6e..0000000000 --- a/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.1 +++ /dev/null @@ -1,116 +0,0 @@ -LAMMPS (4 Jan 2019) -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/shielded, perpetual - attributes: full, newton on - pair build: full/bin/atomonly - stencil: full/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 15.54 | 15.54 | 15.54 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79939 0 168.88404 - 10 1288.6115 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.60722 0.2017796 0 54.629557 3.1252289 -77.7067 0 14.933901 -5.8108542 843.92073 -180.43321 0 107.75934 - 20 538.95832 -1942.7037 -1910.5731 -10725.665 -2803.7395 7.9078296 0.077926657 0 81.61005 0.22951928 -57.5571 0 30.331204 -10.178049 878.99014 -159.69088 0 89.31512 - 30 463.09535 -1933.5765 -1905.9685 -33255.521 -2749.8591 -8.0154561 0.027628873 0 81.62739 0.11972409 -50.262289 0 20.820315 -9.6327029 851.88723 -149.49502 0 79.205749 - 40 885.49232 -1958.9126 -1906.1229 -4814.704 -2795.644 9.1506683 0.13747502 0 70.947988 0.2436053 -57.862679 0 19.076499 -11.141216 873.73896 -159.99392 0 92.434085 - 50 861.16622 -1954.4599 -1903.1204 -1896.7878 -2784.8448 3.8269901 0.15793272 0 79.851828 3.3492155 -78.066128 0 32.628996 -7.9565333 872.81832 -190.98567 0 114.75995 - 60 1167.7852 -1971.843 -1902.2241 -3482.6875 -2705.8632 -17.121673 0.22749075 0 44.507672 7.856086 -74.788945 0 16.256491 -4.6046463 835.83056 -188.33693 0 114.19414 - 70 1439.997 -1989.3024 -1903.4553 23845.434 -2890.7895 31.958869 0.26671726 0 85.758681 3.1803462 -71.002898 0 24.35711 -10.311314 905.86781 -175.38471 0 106.79648 - 80 502.39629 -1930.7545 -1900.8035 -20356.384 -2703.8111 -18.66263 0.11286065 0 99.804114 2.0329076 -76.171338 0 19.23692 -6.2786691 826.47429 -166.03132 0 92.539464 - 90 749.08722 -1946.9837 -1902.3259 17798.557 -2863.7579 42.068808 0.24338058 0 96.181716 0.96183793 -69.955449 0 24.615308 -11.58277 903.68837 -190.13841 0 120.6914 - 100 1109.6997 -1968.5874 -1902.4313 -4490.2776 -2755.896 -7.1232734 0.21757686 0 61.806176 7.0827207 -75.645383 0 20.114879 -6.2371839 863.56324 -198.56967 0 122.09951 -Loop time of 0.657427 on 1 procs for 100 steps with 21 atoms - -Performance: 13.142 ns/day, 1.826 hours/ns, 152.108 timesteps/s -99.3% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.59308 | 0.59308 | 0.59308 | 0.0 | 90.21 -Neigh | 0.020665 | 0.020665 | 0.020665 | 0.0 | 3.14 -Comm | 0.0015757 | 0.0015757 | 0.0015757 | 0.0 | 0.24 -Output | 0.00039387 | 0.00039387 | 0.00039387 | 0.0 | 0.06 -Modify | 0.04156 | 0.04156 | 0.04156 | 0.0 | 6.32 -Other | | 0.000154 | | | 0.02 - -Nlocal: 21 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -FullNghs: 1306 ave 1306 max 1306 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1306 -Ave neighs/atom = 62.1905 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.4 b/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.4 deleted file mode 100644 index 1492865c17..0000000000 --- a/examples/reax/log.4Jan19.reaxc.rdx-shielded.g++.4 +++ /dev/null @@ -1,116 +0,0 @@ -LAMMPS (4 Jan 2019) -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/shielded, perpetual - attributes: full, newton on - pair build: full/bin/atomonly - stencil: full/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 10.62 | 12.08 | 13.84 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.178 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79987 0 168.88452 - 10 1288.6116 -1989.6644 -1912.8422 -19456.355 -2734.6769 -15.60722 0.2017796 0 54.629559 3.1252284 -77.7067 0 14.933902 -5.8108544 843.92073 -180.43321 0 107.75934 - 20 538.95818 -1942.7037 -1910.5731 -10725.629 -2803.7394 7.9078295 0.077926694 0 81.61005 0.22951941 -57.557106 0 30.331206 -10.178049 878.9901 -159.68969 0 89.313929 - 30 463.09529 -1933.5765 -1905.9685 -33255.529 -2749.859 -8.0154758 0.027628845 0 81.627406 0.1197241 -50.26229 0 20.82031 -9.6327013 851.88715 -149.49497 0 79.205706 - 40 885.49462 -1958.9125 -1906.1227 -4814.6528 -2795.6439 9.1506212 0.13747486 0 70.94804 0.24360501 -57.862675 0 19.076509 -11.141214 873.7389 -159.99391 0 92.434076 - 50 861.16112 -1954.4601 -1903.121 -1896.6704 -2784.8452 3.8270543 0.15793292 0 79.851662 3.3492078 -78.066133 0 32.628979 -7.9565431 872.81857 -190.9857 0 114.75999 - 60 1167.7837 -1971.8434 -1902.2245 -3482.8961 -2705.8635 -17.121601 0.22749083 0 44.507696 7.8559922 -74.789025 0 16.256492 -4.6046625 835.83053 -188.33688 0 114.19412 - 70 1439.9917 -1989.3024 -1903.4555 23845.887 -2890.7894 31.958677 0.26671714 0 85.758424 3.1804092 -71.002955 0 24.357221 -10.311284 905.86805 -175.38496 0 106.7967 - 80 502.39695 -1930.7548 -1900.8039 -20356.331 -2703.8113 -18.662598 0.11286102 0 99.803743 2.0329429 -76.171299 0 19.236922 -6.2786652 826.4744 -166.03139 0 92.539525 - 90 749.08478 -1946.984 -1902.3264 17798.605 -2863.7581 42.068587 0.24338052 0 96.181622 0.96184063 -69.955519 0 24.615456 -11.582749 903.68853 -190.13827 0 120.69126 - 100 1109.6952 -1968.5879 -1902.4321 -4490.2728 -2755.8985 -7.1225966 0.21757682 0 61.805902 7.0826502 -75.64544 0 20.115369 -6.2372513 863.56451 -198.56956 0 122.09944 -Loop time of 0.634333 on 4 procs for 100 steps with 21 atoms - -Performance: 13.621 ns/day, 1.762 hours/ns, 157.646 timesteps/s -93.8% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 0.53395 | 0.5352 | 0.53805 | 0.2 | 84.37 -Neigh | 0.0088253 | 0.012023 | 0.016203 | 2.4 | 1.90 -Comm | 0.0051677 | 0.0081 | 0.0093861 | 1.9 | 1.28 -Output | 0.00049353 | 0.00054371 | 0.00058222 | 0.0 | 0.09 -Modify | 0.074155 | 0.078299 | 0.081472 | 0.9 | 12.34 -Other | | 0.0001715 | | | 0.03 - -Nlocal: 5.25 ave 15 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 -Nghost: 355.5 ave 432 max 282 min -Histogram: 1 0 0 0 1 1 0 0 0 1 -Neighs: 298.75 ave 822 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 -FullNghs: 326.5 ave 927 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 - -Total # of neighbors = 1306 -Ave neighs/atom = 62.1905 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.1 b/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.1 deleted file mode 100644 index 86dc1c323a..0000000000 --- a/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.1 +++ /dev/null @@ -1,114 +0,0 @@ -LAMMPS (4 Jan 2019) -# ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, - -units real - -atom_style charge -read_data data.tatb - triclinic box = (0 0 0) to (13.624 17.1149 15.1826) with tilt (-5.75316 -6.32547 7.42573) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 384 atoms - -pair_style reax/c control.reax_c.tatb -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no - -fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc - -thermo 5 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 0.0625 - -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z - -#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -fix 3 all reax/c/species 1 5 5 species.tatb - -run 25 -Neighbor list info ... - update every 5 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 5 4 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/shielded, perpetual - attributes: full, newton on - pair build: full/bin/atomonly - stencil: full/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 169.6 | 169.6 | 169.6 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7879 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6394 0 6391.0274 - 5 0.61603942 -44761.698 -44760.994 8934.628 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.193 0 6388.6691 - 10 2.3525549 -44763.227 -44760.541 12288.614 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50358 -1560.7569 252.85309 -655.44063 18850.391 -8730.9684 0 6381.7061 - 15 4.9013311 -44766.36 -44760.764 17716.982 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2449 0 6370.4111 - 20 7.8294673 -44769.686 -44760.747 25205.558 -61089.006 490.21313 4.719302 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.5142 0 6355.2654 - 25 10.697904 -44772.904 -44760.691 34232.821 -61069.308 490.25886 4.7163736 0 1570.7397 20.181346 -251.91378 -1582.3261 253.82253 -653.53184 18791.975 -8684.3541 0 6336.8349 -Loop time of 7.80985 on 1 procs for 25 steps with 384 atoms - -Performance: 0.017 ns/day, 1388.418 hours/ns, 3.201 timesteps/s -100.0% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 5.003 | 5.003 | 5.003 | 0.0 | 64.06 -Neigh | 1.1164 | 1.1164 | 1.1164 | 0.0 | 14.29 -Comm | 0.0065806 | 0.0065806 | 0.0065806 | 0.0 | 0.08 -Output | 0.00029969 | 0.00029969 | 0.00029969 | 0.0 | 0.00 -Modify | 1.6831 | 1.6831 | 1.6831 | 0.0 | 21.55 -Other | | 0.0004976 | | | 0.01 - -Nlocal: 384 ave 384 max 384 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 7559 ave 7559 max 7559 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 286828 ave 286828 max 286828 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -FullNghs: 336304 ave 336304 max 336304 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 336304 -Ave neighs/atom = 875.792 -Neighbor list builds = 5 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:08 diff --git a/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.4 b/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.4 deleted file mode 100644 index 7dc9867f5a..0000000000 --- a/examples/reax/log.4Jan19.reaxc.tatb-shielded.g++.4 +++ /dev/null @@ -1,114 +0,0 @@ -LAMMPS (4 Jan 2019) -# ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, - -units real - -atom_style charge -read_data data.tatb - triclinic box = (0 0 0) to (13.624 17.1149 15.1826) with tilt (-5.75316 -6.32547 7.42573) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 384 atoms - -pair_style reax/c control.reax_c.tatb -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no - -fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc - -thermo 5 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 0.0625 - -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z - -#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -fix 3 all reax/c/species 1 5 5 species.tatb - -run 25 -Neighbor list info ... - update every 5 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 5 4 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/shielded, perpetual - attributes: full, newton on - pair build: full/bin/atomonly - stencil: full/bin/3d - bin: standard -Per MPI rank memory allocation (min/avg/max) = 113 | 113 | 113 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7866 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6398 0 6391.0277 - 5 0.61603968 -44761.698 -44760.994 8934.6336 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1906 0 6388.6666 - 10 2.3525543 -44763.227 -44760.541 12288.588 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9756 0 6381.7133 - 15 4.9013233 -44766.36 -44760.764 17716.934 -61103.434 489.14722 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2627 0 6370.4289 - 20 7.8294615 -44769.686 -44760.747 25205.586 -61089.006 490.21314 4.7193021 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.4958 0 6355.2471 - 25 10.697919 -44772.904 -44760.691 34232.898 -61069.308 490.25887 4.7163736 0 1570.7397 20.181347 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3285 0 6336.8093 -Loop time of 4.34178 on 4 procs for 25 steps with 384 atoms - -Performance: 0.031 ns/day, 771.872 hours/ns, 5.758 timesteps/s -96.8% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 3.1756 | 3.1763 | 3.1771 | 0.0 | 73.16 -Neigh | 0.58917 | 0.59661 | 0.6035 | 0.9 | 13.74 -Comm | 0.0088837 | 0.010178 | 0.011116 | 0.8 | 0.23 -Output | 0.00036407 | 0.0019013 | 0.003552 | 2.7 | 0.04 -Modify | 0.54882 | 0.55637 | 0.56413 | 0.8 | 12.81 -Other | | 0.0004123 | | | 0.01 - -Nlocal: 96 ave 96 max 96 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 5118 ave 5118 max 5118 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Neighs: 79754 ave 79754 max 79754 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -FullNghs: 84076 ave 84076 max 84076 min -Histogram: 4 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 336304 -Ave neighs/atom = 875.792 -Neighbor list builds = 5 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:04 diff --git a/examples/reax/log.8March18.reaxc.rdx.g++.1 b/examples/reax/log.8March18.reaxc.rdx.g++.1 deleted file mode 100644 index 4ae10e3f52..0000000000 --- a/examples/reax/log.8March18.reaxc.rdx.g++.1 +++ /dev/null @@ -1,115 +0,0 @@ -LAMMPS (8 Mar 2018) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 15.28 | 15.28 | 15.28 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79937 0 168.88402 - 10 1288.6114 -1989.6644 -1912.8422 -19456.35 -2734.6769 -15.607219 0.20177961 0 54.629556 3.1252294 -77.7067 0 14.933901 -5.8108541 843.92074 -180.43322 0 107.75935 - 20 538.95849 -1942.7037 -1910.5731 -10725.658 -2803.7395 7.9078331 0.077926702 0 81.610043 0.22951937 -57.557104 0 30.331203 -10.178049 878.99015 -159.69092 0 89.315159 - 30 463.09542 -1933.5765 -1905.9685 -33255.507 -2749.8591 -8.0154628 0.027628767 0 81.627403 0.11972403 -50.262284 0 20.82032 -9.6327022 851.88722 -149.495 0 79.205731 - 40 885.49449 -1958.9126 -1906.1228 -4814.7123 -2795.644 9.1506221 0.1374749 0 70.948046 0.24360579 -57.8627 0 19.076515 -11.141211 873.73892 -159.9939 0 92.434059 - 50 861.1646 -1954.4599 -1903.1206 -1896.7387 -2784.8446 3.8269113 0.1579328 0 79.851775 3.3492107 -78.066127 0 32.628975 -7.9565255 872.81826 -190.98565 0 114.75994 - 60 1167.785 -1971.8432 -1902.2243 -3482.6975 -2705.8638 -17.121582 0.22749067 0 44.507705 7.856069 -74.788959 0 16.256519 -4.6046602 835.8308 -188.33691 0 114.19414 - 70 1439.9947 -1989.3024 -1903.4554 23845.067 -2890.7896 31.958874 0.26671735 0 85.758608 3.1803486 -71.002907 0 24.357106 -10.311315 905.86799 -175.38482 0 106.79659 - 80 502.40024 -1930.7547 -1900.8035 -20356.557 -2703.8096 -18.663105 0.11286226 0 99.803799 2.0329394 -76.171387 0 19.236609 -6.2786041 826.47358 -166.03157 0 92.539694 - 90 749.09267 -1946.9834 -1902.3254 17798.812 -2863.7586 42.068927 0.24338042 0 96.18195 0.96181754 -69.955528 0 24.61541 -11.58277 903.68895 -190.13838 0 120.69139 - 100 1109.7046 -1968.5875 -1902.4311 -4490.6736 -2755.8953 -7.1235173 0.21757663 0 61.806405 7.0825933 -75.645487 0 20.114745 -6.2371664 863.56285 -198.56939 0 122.09923 -Loop time of 0.395195 on 1 procs for 100 steps with 21 atoms - -Performance: 21.863 ns/day, 1.098 hours/ns, 253.039 timesteps/s -99.3% 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.3722 | 0.3722 | 0.3722 | 0.0 | 94.18 -Neigh | 0.0098455 | 0.0098455 | 0.0098455 | 0.0 | 2.49 -Comm | 0.00047445 | 0.00047445 | 0.00047445 | 0.0 | 0.12 -Output | 0.00034022 | 0.00034022 | 0.00034022 | 0.0 | 0.09 -Modify | 0.012187 | 0.012187 | 0.012187 | 0.0 | 3.08 -Other | | 0.0001521 | | | 0.04 - -Nlocal: 21 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.1905 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.8March18.reaxc.rdx.g++.4 b/examples/reax/log.8March18.reaxc.rdx.g++.4 deleted file mode 100644 index 6ea4835402..0000000000 --- a/examples/reax/log.8March18.reaxc.rdx.g++.4 +++ /dev/null @@ -1,115 +0,0 @@ -LAMMPS (8 Mar 2018) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx - orthogonal box = (35 35 35) to (48 48 48) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 21 atoms - -pair_style reax/c control.reax_c.rdx -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 10.37 | 11.76 | 13.34 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -1884.3081 -1884.3081 27186.178 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79988 0 168.88453 - 10 1288.6115 -1989.6644 -1912.8422 -19456.354 -2734.6769 -15.60722 0.2017796 0 54.629558 3.1252286 -77.7067 0 14.933902 -5.8108544 843.92073 -180.43321 0 107.75934 - 20 538.95818 -1942.7037 -1910.5731 -10725.623 -2803.7394 7.9078307 0.077926702 0 81.61005 0.22951942 -57.557107 0 30.331206 -10.178049 878.9901 -159.68951 0 89.313749 - 30 463.09514 -1933.5765 -1905.9685 -33255.525 -2749.859 -8.0154737 0.027628797 0 81.627408 0.11972402 -50.262283 0 20.82031 -9.6327021 851.88715 -149.49499 0 79.205724 - 40 885.49412 -1958.9125 -1906.1227 -4814.6606 -2795.6439 9.150622 0.13747487 0 70.948029 0.24360517 -57.862679 0 19.076509 -11.141214 873.7389 -159.99392 0 92.434078 - 50 861.16393 -1954.46 -1903.1207 -1896.7323 -2784.8449 3.8270197 0.1579328 0 79.851743 3.3492115 -78.066132 0 32.628992 -7.9565379 872.81841 -190.98568 0 114.75996 - 60 1167.7846 -1971.8432 -1902.2243 -3482.8111 -2705.8633 -17.121657 0.2274907 0 44.507681 7.8560366 -74.788989 0 16.256493 -4.6046537 835.8305 -188.33687 0 114.1941 - 70 1439.9942 -1989.3023 -1903.4554 23845.444 -2890.7894 31.958784 0.26671721 0 85.758586 3.1803655 -71.002918 0 24.357158 -10.311304 905.86792 -175.38481 0 106.79657 - 80 502.3975 -1930.7546 -1900.8036 -20356.439 -2703.8105 -18.662812 0.11286123 0 99.80391 2.0329293 -76.171334 0 19.236803 -6.2786439 826.47397 -166.03141 0 92.539551 - 90 749.09048 -1946.9837 -1902.3258 17798.718 -2863.7582 42.068719 0.24338057 0 96.181773 0.96183581 -69.955529 0 24.615414 -11.582758 903.68862 -190.1384 0 120.69139 - 100 1109.6999 -1968.5875 -1902.4314 -4490.3728 -2755.8964 -7.1231468 0.21757685 0 61.806149 7.0826648 -75.645428 0 20.115002 -6.2371958 863.56343 -198.56957 0 122.09942 -Loop time of 0.329552 on 4 procs for 100 steps with 21 atoms - -Performance: 26.217 ns/day, 0.915 hours/ns, 303.443 timesteps/s -96.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.26372 | 0.26499 | 0.26754 | 0.3 | 80.41 -Neigh | 0.0045478 | 0.0062494 | 0.0076699 | 1.5 | 1.90 -Comm | 0.0041637 | 0.0064691 | 0.0080271 | 1.8 | 1.96 -Output | 0.00054169 | 0.00056636 | 0.00060368 | 0.0 | 0.17 -Modify | 0.049433 | 0.051134 | 0.05311 | 0.6 | 15.52 -Other | | 0.000141 | | | 0.04 - -Nlocal: 5.25 ave 15 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 -Nghost: 355.5 ave 432 max 282 min -Histogram: 1 0 0 0 1 1 0 0 0 1 -Neighs: 298.75 ave 822 max 0 min -Histogram: 1 0 2 0 0 0 0 0 0 1 - -Total # of neighbors = 1195 -Ave neighs/atom = 56.9048 -Neighbor list builds = 10 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:00 diff --git a/examples/reax/log.8March18.reaxc.tatb.g++.1 b/examples/reax/log.8March18.reaxc.tatb.g++.1 deleted file mode 100644 index ac5537bba4..0000000000 --- a/examples/reax/log.8March18.reaxc.tatb.g++.1 +++ /dev/null @@ -1,113 +0,0 @@ -LAMMPS (8 Mar 2018) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, - -units real - -atom_style charge -read_data data.tatb - triclinic box = (0 0 0) to (13.624 17.1149 15.1826) with tilt (-5.75316 -6.32547 7.42573) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 384 atoms - -pair_style reax/c control.reax_c.tatb -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc - -thermo 5 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 0.0625 - -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z - -#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -fix 3 all reax/c/species 1 5 5 species.tatb - -run 25 -Neighbor list info ... - update every 5 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 5 4 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 176.7 | 176.7 | 176.7 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7874 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6395 0 6391.0275 - 5 0.61603968 -44761.698 -44760.994 8934.6347 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1911 0 6388.6671 - 10 2.3525551 -44763.227 -44760.541 12288.583 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9768 0 6381.7146 - 15 4.9013279 -44766.36 -44760.764 17717.01 -61103.434 489.14722 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2375 0 6370.4038 - 20 7.8294645 -44769.686 -44760.747 25205.624 -61089.006 490.21314 4.719302 0 1571.7022 20.420943 -260.85564 -1573.7378 253.3539 -654.31623 18816.07 -8703.4889 0 6355.2402 - 25 10.697904 -44772.904 -44760.691 34232.965 -61069.308 490.25888 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3125 0 6336.7934 -Loop time of 4.72562 on 1 procs for 25 steps with 384 atoms - -Performance: 0.029 ns/day, 840.110 hours/ns, 5.290 timesteps/s -99.4% CPU use with 1 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 3.775 | 3.775 | 3.775 | 0.0 | 79.88 -Neigh | 0.47047 | 0.47047 | 0.47047 | 0.0 | 9.96 -Comm | 0.0025151 | 0.0025151 | 0.0025151 | 0.0 | 0.05 -Output | 0.0003159 | 0.0003159 | 0.0003159 | 0.0 | 0.01 -Modify | 0.47676 | 0.47676 | 0.47676 | 0.0 | 10.09 -Other | | 0.0005293 | | | 0.01 - -Nlocal: 384 ave 384 max 384 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 7559 ave 7559 max 7559 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 286828 ave 286828 max 286828 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 286828 -Ave neighs/atom = 746.948 -Neighbor list builds = 5 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:05 diff --git a/examples/reax/log.8March18.reaxc.tatb.g++.4 b/examples/reax/log.8March18.reaxc.tatb.g++.4 deleted file mode 100644 index 12558be68a..0000000000 --- a/examples/reax/log.8March18.reaxc.tatb.g++.4 +++ /dev/null @@ -1,113 +0,0 @@ -LAMMPS (8 Mar 2018) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, - -units real - -atom_style charge -read_data data.tatb - triclinic box = (0 0 0) to (13.624 17.1149 15.1826) with tilt (-5.75316 -6.32547 7.42573) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 384 atoms - -pair_style reax/c control.reax_c.tatb -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify delay 0 every 5 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc - -thermo 5 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - -timestep 0.0625 - -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z - -#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -fix 3 all reax/c/species 1 5 5 species.tatb - -run 25 -Neighbor list info ... - update every 5 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 5 4 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 118 | 118 | 118 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq - 0 0 -44760.998 -44760.998 7827.7866 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6398 0 6391.0277 - 5 0.61603968 -44761.698 -44760.994 8934.6335 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1906 0 6388.6666 - 10 2.3525544 -44763.227 -44760.541 12288.587 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9764 0 6381.7141 - 15 4.9013311 -44766.36 -44760.764 17716.955 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2558 0 6370.4221 - 20 7.8294715 -44769.686 -44760.747 25205.613 -61089.006 490.21314 4.7193021 0 1571.7022 20.420943 -260.85564 -1573.7378 253.3539 -654.31623 18816.07 -8703.4906 0 6355.2419 - 25 10.697924 -44772.904 -44760.691 34232.794 -61069.308 490.25886 4.7163736 0 1570.7397 20.181347 -251.91376 -1582.3261 253.82253 -653.53183 18791.975 -8684.3641 0 6336.8449 -Loop time of 2.84068 on 4 procs for 25 steps with 384 atoms - -Performance: 0.048 ns/day, 505.009 hours/ns, 8.801 timesteps/s -98.4% CPU use with 4 MPI tasks x 1 OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.3253 | 2.328 | 2.3305 | 0.2 | 81.95 -Neigh | 0.2589 | 0.26458 | 0.26897 | 0.7 | 9.31 -Comm | 0.0094428 | 0.012062 | 0.014872 | 2.3 | 0.42 -Output | 0.00043392 | 0.0042209 | 0.0054941 | 3.4 | 0.15 -Modify | 0.22563 | 0.23134 | 0.23579 | 0.8 | 8.14 -Other | | 0.0005122 | | | 0.02 - -Nlocal: 96 ave 96 max 96 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 5118 ave 5118 max 5118 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Neighs: 79754 ave 79754 max 79754 min -Histogram: 4 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 319016 -Ave neighs/atom = 830.771 -Neighbor list builds = 5 -Dangerous builds not checked - -Please see the log.cite file for references relevant to this simulation - -Total wall time: 0:00:03 From 2a21c4b29f54490f5928ca36dc7eb67f9f216c73 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 2 Jul 2021 11:46:25 -0600 Subject: [PATCH 083/352] add sticker-bond support to fix bond/swap --- doc/src/fix_bond_swap.rst | 21 ++++++++++++-------- src/MC/fix_bond_swap.cpp | 40 +++++++++++++++++++++++++-------------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 248c4cc8e9..e3b756476d 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -65,14 +65,19 @@ monomers for this timestep. Choosing a small *fraction* value can reduce the likelihood of a reverse swap occurring soon after an initial swap. -For each monomer A1, its neighbors are examined to find a possible B1 -monomer. Both A1 and B1 must be in the fix group, their separation -must be less than the specified *cutoff*\ , and the molecule IDs of A1 -and B1 must be the same (see below). If a suitable partner is found, -the energy change due to swapping the 2 bonds is computed. This -includes changes in pairwise, bond, and angle energies due to the -altered connectivity of the 2 chains. Dihedral and improper -interactions are not allowed to be defined when this fix is used. +NOTE: is cutoff applied to all new bonds? + +For each monomer A1, its neighbors are looped over as B1 monomers. +All bond partners of both A1 and B1 are also looped over. For a pair +of A1-A2 and B1-B2 bonds to be eligible for swapping, these criteria +must be met. All 4 monomers must be in the fix group. The separation +between A1 and B1 must be less than the specified *cutoff*\ . And the +molecule IDs of A1 and B1 must be the same (see below). If an +eligible B1 partner is found, the energy change due to swapping the 2 +bonds is computed. This includes changes in pairwise, bond, and angle +energies due to the altered connectivity of the 2 chains. Dihedral +and improper interactions are not allowed to be defined when this fix +is used. If the energy decreases due to the swap operation, the bond swap is accepted. If the energy increases it is accepted with probability diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index babaecc2bd..d6d7f82dbd 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -148,7 +148,8 @@ void FixBondSwap::init() error->all(FLERR,"Pair style does not support fix bond/swap"); if (force->angle == nullptr && atom->nangles > 0 && comm->me == 0) - error->warning(FLERR,"Fix bond/swap will ignore defined angles"); + error->warning(FLERR,"Fix bond/swap will not preserve correct angle " + "topology because no angle_style is defined"); if (force->dihedral || force->improper) error->all(FLERR,"Fix bond/swap cannot use dihedral or improper styles"); @@ -255,12 +256,18 @@ void FixBondSwap::post_integrate() } // examine ntest of my eligible atoms for potential swaps - // atom i is randomly selected via atom list - // look at all j neighbors of atom i - // atom j must be on-processor (j < nlocal) - // atom j must be in fix group - // i and j must be same distance from chain end (mol[i] = mol[j]) - // NOTE: must use extra parens in if test on mask[j] & groupbit + // atom I is randomly selected via atom list + // look at all J neighbors of atom I + // J must be on-processor (J < nlocal) + // I,J must be in fix group + // I,J must have same molecule IDs + // use case 1: + // if user defines mol IDs appropriately for linear chains, + // this will mean they are same distance from (either) chain end + // use case 2: + // if user defines a unique mol ID for desired bond sites (on any chain) + // and defines the fix group for these sites, + // this will mean they are eligible bond sites int ntest = static_cast (fraction * neligible); int accept = 0; @@ -277,23 +284,28 @@ void FixBondSwap::post_integrate() if ((mask[j] & groupbit) == 0) continue; if (molecule[i] != molecule[j]) continue; - // look at all bond partners of atoms i and j - // use num_bond for this, not special list, so also find bondtypes - // inext,jnext = bonded atoms + // loop over all bond partners of atoms I and J + // use num_bond for this, not special list, so also have bondtypes + // inext,jnext = atoms bonded to I,J // inext,jnext must be on-processor (inext,jnext < nlocal) - // inext,jnext must be same dist from chain end (mol[inext] = mol[jnext]) - // since swaps may occur between two ends of a single chain, insure - // the 4 atoms are unique (no duplicates): inext != jnext, inext != j + // inext,jnext must be in fix group + // inext,jnext must have same molecule IDs + // for use case 1 (above): this insures chain length is preserved + // for use case 2: always satisfied b/c fix group = bond-able atoms + // 4 atoms must be unique (no duplicates): inext != jnext, inext != j + // already know i != inext, j != jnext // all 4 old and new bonds must have length < cutoff for (ibond = 0; ibond < num_bond[i]; ibond++) { inext = atom->map(bond_atom[i][ibond]); if (inext >= nlocal || inext < 0) continue; + if ((mask[inext] & groupbit) == 0) continue; ibondtype = bond_type[i][ibond]; for (jbond = 0; jbond < num_bond[j]; jbond++) { jnext = atom->map(bond_atom[j][jbond]); if (jnext >= nlocal || jnext < 0) continue; + if ((mask[jnext] & groupbit) == 0) continue; jbondtype = bond_type[j][jbond]; if (molecule[inext] != molecule[jnext]) continue; @@ -306,7 +318,7 @@ void FixBondSwap::post_integrate() // if angles are enabled: // find other atoms i,inext,j,jnext are in angles with // and angletypes: i/j angletype, i/j nextangletype - // use num_angle for this, not special list, so also find angletypes + // use num_angle for this, not special list, so also have angletypes // 4 atoms consecutively along 1st chain: iprev,i,inext,ilast // 4 atoms consecutively along 2nd chain: jprev,j,jnext,jlast // prev or last atom can be non-existent at end of chain From 46d5d9724aae6e2f3dd39e05acc5e1456f5d0a6a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 7 Jul 2021 15:52:53 -0400 Subject: [PATCH 084/352] move interlayer potentials to their own package --- cmake/presets/all_off.cmake | 1 + cmake/presets/all_on.cmake | 1 + cmake/presets/mingw-cross.cmake | 1 + cmake/presets/most.cmake | 1 + doc/src/Packages_details.rst | 19 +++++++++++++++++++ doc/src/Packages_list.rst | 5 +++++ doc/src/pair_coul_shield.rst | 5 +++-- doc/src/pair_drip.rst | 16 ++++++++-------- doc/src/pair_ilp_graphene_hbn.rst | 7 ++++--- doc/src/pair_kolmogorov_crespi_full.rst | 9 +++++---- doc/src/pair_kolmogorov_crespi_z.rst | 5 +++-- doc/src/pair_lebedeva_z.rst | 5 +++-- .../interlayer}/drip/C.drip | 0 .../interlayer}/drip/CH.rebo | 0 .../interlayer}/drip/README.txt | 0 .../interlayer}/drip/data.C | 0 .../interlayer}/drip/data.CH | 0 .../interlayer}/drip/in.CH_drip | 0 .../interlayer}/drip/in.C_drip | 0 .../drip/log.30Apr19.CH_drip.g++.1 | 0 .../drip/log.30Apr19.CH_drip.g++.4 | 0 .../interlayer}/drip/log.30Apr19.C_drip.g++.1 | 0 .../interlayer}/drip/log.30Apr19.C_drip.g++.4 | 0 .../interlayer}/ilp_graphene_hbn/BNC.tersoff | 0 .../interlayer}/ilp_graphene_hbn/BNCH-old.ILP | 0 .../Bi_gr_AB_stack_2L_noH.data | 0 .../gr_hBN_Cstack_2L_noH.data | 0 .../hBN_AA_prime_stack_2L_noH.data | 0 .../hBN_AB_stack_2L_noH_equi_300K.data | 0 .../ilp_graphene_hbn/in.bilayer-graphene | 0 .../ilp_graphene_hbn/in.bilayer-hBN | 0 .../interlayer}/ilp_graphene_hbn/in.grhBN | 0 .../ilp_graphene_hbn/in.ilp_graphene_hbn | 0 .../log.31Jul19.bilayer-graphene.g++.1 | 0 .../log.31Jul19.bilayer-graphene.g++.4 | 0 .../log.31Jul19.bilayer-hBN.g++.1 | 0 .../log.31Jul19.bilayer-hBN.g++.4 | 0 .../ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 | 0 .../ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 | 0 .../log.31Jul19.ilp_graphene_hbn.g++.1 | 0 .../log.31Jul19.ilp_graphene_hbn.g++.4 | 0 .../Bi_gr_AB_stack_2L_noH.data | 0 .../Bi_gr_AB_stack_2L_noH_300K.data | 0 .../kolmogorov_crespi_full/CC.KC-full | 0 .../interlayer}/kolmogorov_crespi_full/CH.KC | 0 .../kolmogorov_crespi_full/CH.rebo | 0 .../kolmogorov_crespi_full/CH_taper.KC | 0 .../in.bilayer-graphene | 0 .../log.5Jun19.bilayer-graphene.g++.1 | 0 .../log.5Jun19.bilayer-graphene.g++.4 | 0 .../log.5Jun19.bilayer-graphene.icc.1 | 0 .../log.5Jun19.bilayer-graphene.icc.4 | 0 .../interlayer}/kolmogorov_crespi_z/CC.KC | 0 .../interlayer}/kolmogorov_crespi_z/CH.rebo | 0 .../kolmogorov_crespi_z/data.bilayer-graphene | 0 .../data.graphene-adsorbant | 0 .../kolmogorov_crespi_z/in.atom-diffusion | 0 .../kolmogorov_crespi_z/in.bilayer-graphene | 0 .../log.16Mar18.atom-diffusion.g++.1 | 0 .../log.16Mar18.atom-diffusion.g++.4 | 0 .../log.30Apr19.bilayer-graphene.g++.1 | 0 .../log.30Apr19.bilayer-graphene.g++.4 | 0 .../interlayer}/lebedeva/2particles.dat | 0 .../interlayer}/lebedeva/2particles.in | 0 .../interlayer}/lebedeva/CC.Lebedeva | 0 .../interlayer}/lebedeva/LammpsResult.dat | 0 .../interlayer}/lebedeva/LebDer.pl | 0 .../interlayer}/lebedeva/lebedeva00.plot | 0 .../pair_coul_shield.cpp | 0 .../pair_coul_shield.h | 0 src/{USER-MISC => INTERLAYER}/pair_drip.cpp | 0 src/{USER-MISC => INTERLAYER}/pair_drip.h | 0 .../pair_ilp_graphene_hbn.cpp | 0 .../pair_ilp_graphene_hbn.h | 0 .../pair_kolmogorov_crespi_full.cpp | 0 .../pair_kolmogorov_crespi_full.h | 0 .../pair_kolmogorov_crespi_z.cpp | 0 .../pair_kolmogorov_crespi_z.h | 0 .../pair_lebedeva_z.cpp | 0 .../pair_lebedeva_z.h | 0 src/Makefile | 4 +++- 81 files changed, 57 insertions(+), 22 deletions(-) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/C.drip (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/CH.rebo (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/README.txt (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/data.C (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/data.CH (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/in.CH_drip (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/in.C_drip (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/log.30Apr19.CH_drip.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/log.30Apr19.CH_drip.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/log.30Apr19.C_drip.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/drip/log.30Apr19.C_drip.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/BNC.tersoff (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/BNCH-old.ILP (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/Bi_gr_AB_stack_2L_noH.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/gr_hBN_Cstack_2L_noH.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/hBN_AA_prime_stack_2L_noH.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/hBN_AB_stack_2L_noH_equi_300K.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/in.bilayer-graphene (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/in.bilayer-hBN (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/in.grhBN (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/in.ilp_graphene_hbn (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH_300K.data (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/CC.KC-full (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/CH.KC (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/CH.rebo (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/CH_taper.KC (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/in.bilayer-graphene (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/CC.KC (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/CH.rebo (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/data.bilayer-graphene (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/data.graphene-adsorbant (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/in.atom-diffusion (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/in.bilayer-graphene (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/2particles.dat (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/2particles.in (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/CC.Lebedeva (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/LammpsResult.dat (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/LebDer.pl (100%) rename examples/{USER-MISC => PACKAGES/interlayer}/lebedeva/lebedeva00.plot (100%) rename src/{USER-MISC => INTERLAYER}/pair_coul_shield.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_coul_shield.h (100%) rename src/{USER-MISC => INTERLAYER}/pair_drip.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_drip.h (100%) rename src/{USER-MISC => INTERLAYER}/pair_ilp_graphene_hbn.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_ilp_graphene_hbn.h (100%) rename src/{USER-MISC => INTERLAYER}/pair_kolmogorov_crespi_full.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_kolmogorov_crespi_full.h (100%) rename src/{USER-MISC => INTERLAYER}/pair_kolmogorov_crespi_z.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_kolmogorov_crespi_z.h (100%) rename src/{USER-MISC => INTERLAYER}/pair_lebedeva_z.cpp (100%) rename src/{USER-MISC => INTERLAYER}/pair_lebedeva_z.h (100%) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index c95d3e8463..b873965fe4 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -30,6 +30,7 @@ set(ALL_PACKAGES GRANULAR H5MD INTEL + INTERLAYER KIM KOKKOS KSPACE diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index bc7ae553db..b4fe8e5303 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -32,6 +32,7 @@ set(ALL_PACKAGES GRANULAR H5MD INTEL + INTERLAYER KIM KOKKOS KSPACE diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index b07d1a707b..71675ba9d7 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -25,6 +25,7 @@ set(WIN_PACKAGES GPU GRANULAR INTEL + INTERLAYER KSPACE LATTE MACHDYN diff --git a/cmake/presets/most.cmake b/cmake/presets/most.cmake index ae65cc75bb..8ad6ff31dc 100644 --- a/cmake/presets/most.cmake +++ b/cmake/presets/most.cmake @@ -25,6 +25,7 @@ set(ALL_PACKAGES EFF FEP GRANULAR + INTERLAYER KSPACE MACHDYN MANYBODY diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index cf70be0d4b..d5bc72de75 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -54,6 +54,7 @@ page gives those details. * :ref:`GRANULAR ` * :ref:`H5MD ` * :ref:`INTEL ` + * :ref:`INTERLAYER ` * :ref:`KIM ` * :ref:`KOKKOS ` * :ref:`KSPACE ` @@ -933,6 +934,24 @@ This package has :ref:`specific installation instructions ` on the :doc:` ---------- +.. _PKG-INTERLAYER: + +INTERLAYER package +------------------ + +**Contents:** + +A collection of pair styles specifically to be used for modeling layered +materials, most commonly graphene sheets (or equivalents). + +**Supporting info:** + +* src/INTERLAYER: filenames -> commands +* :doc:`Pair style ` page +* examples/PACKAGES/interlayer + +---------- + .. _PKG-KIM: KIM package diff --git a/doc/src/Packages_list.rst b/doc/src/Packages_list.rst index 44c05f8a39..0724c7ab44 100644 --- a/doc/src/Packages_list.rst +++ b/doc/src/Packages_list.rst @@ -168,6 +168,11 @@ whether an extra library is needed to build and use the package: - :doc:`Speed intel ` - `Benchmarks `_ - no + * - :ref:`INTERLAYER ` + - Inter-layer pair potentials + - :doc:`several pair styles ` + - PACKAGES/interlayer + - no * - :ref:`KIM ` - OpenKIM wrapper - :doc:`pair_style kim ` diff --git a/doc/src/pair_coul_shield.rst b/doc/src/pair_coul_shield.rst index 31e1bcc176..0ca656092e 100644 --- a/doc/src/pair_coul_shield.rst +++ b/doc/src/pair_coul_shield.rst @@ -82,8 +82,9 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -This style is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This pair style is part of the INTERLAYER package. It is only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_drip.rst b/doc/src/pair_drip.rst index e3b986615e..39a5e8bbef 100644 --- a/doc/src/pair_drip.rst +++ b/doc/src/pair_drip.rst @@ -117,18 +117,18 @@ pair_coeff commands in an input script that reads a restart file. Restrictions """""""""""" -This pair style is part of the USER-MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc -page for more info. +This pair style is part of the INTERLAYER package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. -This pair potential requires the :doc:`newton ` setting to be "on" for +This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. The *C.drip* parameter file provided with LAMMPS (see the "potentials" -directory) is parameterized for metal :doc:`units `. You can use the DRIP -potential with any LAMMPS units, but you would need to create your own custom -parameter file with coefficients listed in the appropriate units, if your -simulation does not use "metal" units. +directory) is parameterized for metal :doc:`units `. You can use +the DRIP potential with any LAMMPS units, but you would need to create +your own custom parameter file with coefficients listed in the +appropriate units, if your simulation does not use "metal" units. Related commands """""""""""""""" diff --git a/doc/src/pair_ilp_graphene_hbn.rst b/doc/src/pair_ilp_graphene_hbn.rst index bc460c58a2..63357dc926 100644 --- a/doc/src/pair_ilp_graphene_hbn.rst +++ b/doc/src/pair_ilp_graphene_hbn.rst @@ -139,10 +139,11 @@ that reads a restart file. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This pair style is part of the INTERLAYER package. It is only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. -This pair potential requires the newton setting to be *on* for pair +This pair style requires the newton setting to be *on* for pair interactions. The BNCH.ILP potential file provided with LAMMPS (see the potentials diff --git a/doc/src/pair_kolmogorov_crespi_full.rst b/doc/src/pair_kolmogorov_crespi_full.rst index 858b0eb984..265299cfdd 100644 --- a/doc/src/pair_kolmogorov_crespi_full.rst +++ b/doc/src/pair_kolmogorov_crespi_full.rst @@ -119,14 +119,15 @@ that reads a restart file. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This pair style is part of the USER-MISCt package. It is only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. -This pair potential requires the newton setting to be *on* for pair +This pair style requires the newton setting to be *on* for pair interactions. The CH.KC potential file provided with LAMMPS (see the potentials -folder) are parameterized for metal units. You can use this potential +folder) is parameterized for metal units. You can use this pair style with any LAMMPS units, but you would need to create your own custom CC.KC potential file with all coefficients converted to the appropriate units. diff --git a/doc/src/pair_kolmogorov_crespi_z.rst b/doc/src/pair_kolmogorov_crespi_z.rst index bd02221074..60c012c47c 100644 --- a/doc/src/pair_kolmogorov_crespi_z.rst +++ b/doc/src/pair_kolmogorov_crespi_z.rst @@ -58,8 +58,9 @@ Other interactions can be set to zero using pair_style *none*\ . Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the INTERLAYER package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lebedeva_z.rst b/doc/src/pair_lebedeva_z.rst index 22b3114bf6..369828784c 100644 --- a/doc/src/pair_lebedeva_z.rst +++ b/doc/src/pair_lebedeva_z.rst @@ -53,8 +53,9 @@ Other interactions can be set to zero using pair_style *none*\ . Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This pair style is part of the INTERLAYER package. It is only enabled +if LAMMPS was built with that package. See the :doc:`Build package +` doc page for more info. Related commands """""""""""""""" diff --git a/examples/USER-MISC/drip/C.drip b/examples/PACKAGES/interlayer/drip/C.drip similarity index 100% rename from examples/USER-MISC/drip/C.drip rename to examples/PACKAGES/interlayer/drip/C.drip diff --git a/examples/USER-MISC/drip/CH.rebo b/examples/PACKAGES/interlayer/drip/CH.rebo similarity index 100% rename from examples/USER-MISC/drip/CH.rebo rename to examples/PACKAGES/interlayer/drip/CH.rebo diff --git a/examples/USER-MISC/drip/README.txt b/examples/PACKAGES/interlayer/drip/README.txt similarity index 100% rename from examples/USER-MISC/drip/README.txt rename to examples/PACKAGES/interlayer/drip/README.txt diff --git a/examples/USER-MISC/drip/data.C b/examples/PACKAGES/interlayer/drip/data.C similarity index 100% rename from examples/USER-MISC/drip/data.C rename to examples/PACKAGES/interlayer/drip/data.C diff --git a/examples/USER-MISC/drip/data.CH b/examples/PACKAGES/interlayer/drip/data.CH similarity index 100% rename from examples/USER-MISC/drip/data.CH rename to examples/PACKAGES/interlayer/drip/data.CH diff --git a/examples/USER-MISC/drip/in.CH_drip b/examples/PACKAGES/interlayer/drip/in.CH_drip similarity index 100% rename from examples/USER-MISC/drip/in.CH_drip rename to examples/PACKAGES/interlayer/drip/in.CH_drip diff --git a/examples/USER-MISC/drip/in.C_drip b/examples/PACKAGES/interlayer/drip/in.C_drip similarity index 100% rename from examples/USER-MISC/drip/in.C_drip rename to examples/PACKAGES/interlayer/drip/in.C_drip diff --git a/examples/USER-MISC/drip/log.30Apr19.CH_drip.g++.1 b/examples/PACKAGES/interlayer/drip/log.30Apr19.CH_drip.g++.1 similarity index 100% rename from examples/USER-MISC/drip/log.30Apr19.CH_drip.g++.1 rename to examples/PACKAGES/interlayer/drip/log.30Apr19.CH_drip.g++.1 diff --git a/examples/USER-MISC/drip/log.30Apr19.CH_drip.g++.4 b/examples/PACKAGES/interlayer/drip/log.30Apr19.CH_drip.g++.4 similarity index 100% rename from examples/USER-MISC/drip/log.30Apr19.CH_drip.g++.4 rename to examples/PACKAGES/interlayer/drip/log.30Apr19.CH_drip.g++.4 diff --git a/examples/USER-MISC/drip/log.30Apr19.C_drip.g++.1 b/examples/PACKAGES/interlayer/drip/log.30Apr19.C_drip.g++.1 similarity index 100% rename from examples/USER-MISC/drip/log.30Apr19.C_drip.g++.1 rename to examples/PACKAGES/interlayer/drip/log.30Apr19.C_drip.g++.1 diff --git a/examples/USER-MISC/drip/log.30Apr19.C_drip.g++.4 b/examples/PACKAGES/interlayer/drip/log.30Apr19.C_drip.g++.4 similarity index 100% rename from examples/USER-MISC/drip/log.30Apr19.C_drip.g++.4 rename to examples/PACKAGES/interlayer/drip/log.30Apr19.C_drip.g++.4 diff --git a/examples/USER-MISC/ilp_graphene_hbn/BNC.tersoff b/examples/PACKAGES/interlayer/ilp_graphene_hbn/BNC.tersoff similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/BNC.tersoff rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/BNC.tersoff diff --git a/examples/USER-MISC/ilp_graphene_hbn/BNCH-old.ILP b/examples/PACKAGES/interlayer/ilp_graphene_hbn/BNCH-old.ILP similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/BNCH-old.ILP rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/BNCH-old.ILP diff --git a/examples/USER-MISC/ilp_graphene_hbn/Bi_gr_AB_stack_2L_noH.data b/examples/PACKAGES/interlayer/ilp_graphene_hbn/Bi_gr_AB_stack_2L_noH.data similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/Bi_gr_AB_stack_2L_noH.data rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/Bi_gr_AB_stack_2L_noH.data diff --git a/examples/USER-MISC/ilp_graphene_hbn/gr_hBN_Cstack_2L_noH.data b/examples/PACKAGES/interlayer/ilp_graphene_hbn/gr_hBN_Cstack_2L_noH.data similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/gr_hBN_Cstack_2L_noH.data rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/gr_hBN_Cstack_2L_noH.data diff --git a/examples/USER-MISC/ilp_graphene_hbn/hBN_AA_prime_stack_2L_noH.data b/examples/PACKAGES/interlayer/ilp_graphene_hbn/hBN_AA_prime_stack_2L_noH.data similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/hBN_AA_prime_stack_2L_noH.data rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/hBN_AA_prime_stack_2L_noH.data diff --git a/examples/USER-MISC/ilp_graphene_hbn/hBN_AB_stack_2L_noH_equi_300K.data b/examples/PACKAGES/interlayer/ilp_graphene_hbn/hBN_AB_stack_2L_noH_equi_300K.data similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/hBN_AB_stack_2L_noH_equi_300K.data rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/hBN_AB_stack_2L_noH_equi_300K.data diff --git a/examples/USER-MISC/ilp_graphene_hbn/in.bilayer-graphene b/examples/PACKAGES/interlayer/ilp_graphene_hbn/in.bilayer-graphene similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/in.bilayer-graphene rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/in.bilayer-graphene diff --git a/examples/USER-MISC/ilp_graphene_hbn/in.bilayer-hBN b/examples/PACKAGES/interlayer/ilp_graphene_hbn/in.bilayer-hBN similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/in.bilayer-hBN rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/in.bilayer-hBN diff --git a/examples/USER-MISC/ilp_graphene_hbn/in.grhBN b/examples/PACKAGES/interlayer/ilp_graphene_hbn/in.grhBN similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/in.grhBN rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/in.grhBN diff --git a/examples/USER-MISC/ilp_graphene_hbn/in.ilp_graphene_hbn b/examples/PACKAGES/interlayer/ilp_graphene_hbn/in.ilp_graphene_hbn similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/in.ilp_graphene_hbn rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/in.ilp_graphene_hbn diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.1 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.1 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.1 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.1 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.4 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.4 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.4 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-graphene.g++.4 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.1 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.1 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.1 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.1 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.4 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.4 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.4 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.bilayer-hBN.g++.4 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.grhBN.g++.1 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.grhBN.g++.4 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.1 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.1 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.1 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.1 diff --git a/examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.4 b/examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.4 similarity index 100% rename from examples/USER-MISC/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.4 rename to examples/PACKAGES/interlayer/ilp_graphene_hbn/log.31Jul19.ilp_graphene_hbn.g++.4 diff --git a/examples/USER-MISC/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH.data b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH.data similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH.data rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH.data diff --git a/examples/USER-MISC/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH_300K.data b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH_300K.data similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH_300K.data rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/Bi_gr_AB_stack_2L_noH_300K.data diff --git a/examples/USER-MISC/kolmogorov_crespi_full/CC.KC-full b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/CC.KC-full rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full diff --git a/examples/USER-MISC/kolmogorov_crespi_full/CH.KC b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/CH.KC rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC diff --git a/examples/USER-MISC/kolmogorov_crespi_full/CH.rebo b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.rebo similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/CH.rebo rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.rebo diff --git a/examples/USER-MISC/kolmogorov_crespi_full/CH_taper.KC b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH_taper.KC similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/CH_taper.KC rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH_taper.KC diff --git a/examples/USER-MISC/kolmogorov_crespi_full/in.bilayer-graphene b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/in.bilayer-graphene similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/in.bilayer-graphene rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/in.bilayer-graphene diff --git a/examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.1 diff --git a/examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.g++.4 diff --git a/examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.1 b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.1 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.1 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.1 diff --git a/examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.4 b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.4 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.4 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_full/log.5Jun19.bilayer-graphene.icc.4 diff --git a/examples/USER-MISC/kolmogorov_crespi_z/CC.KC b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/CC.KC similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/CC.KC rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/CC.KC diff --git a/examples/USER-MISC/kolmogorov_crespi_z/CH.rebo b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/CH.rebo similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/CH.rebo rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/CH.rebo diff --git a/examples/USER-MISC/kolmogorov_crespi_z/data.bilayer-graphene b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/data.bilayer-graphene similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/data.bilayer-graphene rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/data.bilayer-graphene diff --git a/examples/USER-MISC/kolmogorov_crespi_z/data.graphene-adsorbant b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/data.graphene-adsorbant similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/data.graphene-adsorbant rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/data.graphene-adsorbant diff --git a/examples/USER-MISC/kolmogorov_crespi_z/in.atom-diffusion b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/in.atom-diffusion similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/in.atom-diffusion rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/in.atom-diffusion diff --git a/examples/USER-MISC/kolmogorov_crespi_z/in.bilayer-graphene b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/in.bilayer-graphene similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/in.bilayer-graphene rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/in.bilayer-graphene diff --git a/examples/USER-MISC/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.1 b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.1 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.1 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.1 diff --git a/examples/USER-MISC/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.4 b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.4 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.4 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.16Mar18.atom-diffusion.g++.4 diff --git a/examples/USER-MISC/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.1 diff --git a/examples/USER-MISC/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 b/examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 similarity index 100% rename from examples/USER-MISC/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 rename to examples/PACKAGES/interlayer/kolmogorov_crespi_z/log.30Apr19.bilayer-graphene.g++.4 diff --git a/examples/USER-MISC/lebedeva/2particles.dat b/examples/PACKAGES/interlayer/lebedeva/2particles.dat similarity index 100% rename from examples/USER-MISC/lebedeva/2particles.dat rename to examples/PACKAGES/interlayer/lebedeva/2particles.dat diff --git a/examples/USER-MISC/lebedeva/2particles.in b/examples/PACKAGES/interlayer/lebedeva/2particles.in similarity index 100% rename from examples/USER-MISC/lebedeva/2particles.in rename to examples/PACKAGES/interlayer/lebedeva/2particles.in diff --git a/examples/USER-MISC/lebedeva/CC.Lebedeva b/examples/PACKAGES/interlayer/lebedeva/CC.Lebedeva similarity index 100% rename from examples/USER-MISC/lebedeva/CC.Lebedeva rename to examples/PACKAGES/interlayer/lebedeva/CC.Lebedeva diff --git a/examples/USER-MISC/lebedeva/LammpsResult.dat b/examples/PACKAGES/interlayer/lebedeva/LammpsResult.dat similarity index 100% rename from examples/USER-MISC/lebedeva/LammpsResult.dat rename to examples/PACKAGES/interlayer/lebedeva/LammpsResult.dat diff --git a/examples/USER-MISC/lebedeva/LebDer.pl b/examples/PACKAGES/interlayer/lebedeva/LebDer.pl similarity index 100% rename from examples/USER-MISC/lebedeva/LebDer.pl rename to examples/PACKAGES/interlayer/lebedeva/LebDer.pl diff --git a/examples/USER-MISC/lebedeva/lebedeva00.plot b/examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot similarity index 100% rename from examples/USER-MISC/lebedeva/lebedeva00.plot rename to examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot diff --git a/src/USER-MISC/pair_coul_shield.cpp b/src/INTERLAYER/pair_coul_shield.cpp similarity index 100% rename from src/USER-MISC/pair_coul_shield.cpp rename to src/INTERLAYER/pair_coul_shield.cpp diff --git a/src/USER-MISC/pair_coul_shield.h b/src/INTERLAYER/pair_coul_shield.h similarity index 100% rename from src/USER-MISC/pair_coul_shield.h rename to src/INTERLAYER/pair_coul_shield.h diff --git a/src/USER-MISC/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp similarity index 100% rename from src/USER-MISC/pair_drip.cpp rename to src/INTERLAYER/pair_drip.cpp diff --git a/src/USER-MISC/pair_drip.h b/src/INTERLAYER/pair_drip.h similarity index 100% rename from src/USER-MISC/pair_drip.h rename to src/INTERLAYER/pair_drip.h diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp similarity index 100% rename from src/USER-MISC/pair_ilp_graphene_hbn.cpp rename to src/INTERLAYER/pair_ilp_graphene_hbn.cpp diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.h b/src/INTERLAYER/pair_ilp_graphene_hbn.h similarity index 100% rename from src/USER-MISC/pair_ilp_graphene_hbn.h rename to src/INTERLAYER/pair_ilp_graphene_hbn.h diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp similarity index 100% rename from src/USER-MISC/pair_kolmogorov_crespi_full.cpp rename to src/INTERLAYER/pair_kolmogorov_crespi_full.cpp diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.h b/src/INTERLAYER/pair_kolmogorov_crespi_full.h similarity index 100% rename from src/USER-MISC/pair_kolmogorov_crespi_full.h rename to src/INTERLAYER/pair_kolmogorov_crespi_full.h diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp similarity index 100% rename from src/USER-MISC/pair_kolmogorov_crespi_z.cpp rename to src/INTERLAYER/pair_kolmogorov_crespi_z.cpp diff --git a/src/USER-MISC/pair_kolmogorov_crespi_z.h b/src/INTERLAYER/pair_kolmogorov_crespi_z.h similarity index 100% rename from src/USER-MISC/pair_kolmogorov_crespi_z.h rename to src/INTERLAYER/pair_kolmogorov_crespi_z.h diff --git a/src/USER-MISC/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp similarity index 100% rename from src/USER-MISC/pair_lebedeva_z.cpp rename to src/INTERLAYER/pair_lebedeva_z.cpp diff --git a/src/USER-MISC/pair_lebedeva_z.h b/src/INTERLAYER/pair_lebedeva_z.h similarity index 100% rename from src/USER-MISC/pair_lebedeva_z.h rename to src/INTERLAYER/pair_lebedeva_z.h diff --git a/src/Makefile b/src/Makefile index 52dff05148..5e26de47ce 100644 --- a/src/Makefile +++ b/src/Makefile @@ -74,6 +74,7 @@ PACKAGE = \ granular \ h5md \ intel \ + interlayer \ kim \ kokkos \ kspace \ @@ -157,6 +158,7 @@ PACKMOST = \ eff \ fep \ granular \ + interlayer \ kspace \ manybody \ mc \ @@ -186,7 +188,7 @@ PACKMOST = \ ml-iap \ phonon -# NOTE: the last three packages must remain at the end since +# NOTE ^^^^^: the last three packages must remain at the end since # they depend on other packages to be installed first. PACKLIB = \ From ab11482d7e5e7d0423d616ee331eafafb2edb186 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 8 Jul 2021 09:30:18 -0400 Subject: [PATCH 085/352] add INTERLAYER package to CMake list of known packages --- cmake/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a64d18a6da..c48d329998 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -164,6 +164,7 @@ set(STANDARD_PACKAGES FEP GRANULAR H5MD + INTERLAYER KIM KSPACE LATBOLTZ From 6571a84884961377c28329c827ad4e23fb080c25 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Jul 2021 16:54:00 -0400 Subject: [PATCH 086/352] move some styles around --- doc/src/Packages_details.rst | 7 ++++ doc/src/angle_cosine_shift.rst | 2 +- doc/src/angle_cosine_shift_exp.rst | 2 +- doc/src/angle_dipole.rst | 6 ++- doc/src/angle_fourier.rst | 2 +- doc/src/angle_fourier_simple.rst | 2 +- doc/src/angle_gaussian.rst | 2 +- doc/src/angle_quartic.rst | 2 +- doc/src/bond_gaussian.rst | 2 +- doc/src/bond_harmonic_shift.rst | 2 +- doc/src/bond_harmonic_shift_cut.rst | 2 +- doc/src/bond_special.rst | 2 +- doc/src/dihedral_cosine_shift_exp.rst | 2 +- doc/src/dihedral_fourier.rst | 2 +- doc/src/dihedral_nharmonic.rst | 2 +- doc/src/dihedral_quadratic.rst | 2 +- doc/src/dihedral_spherical.rst | 2 +- doc/src/dihedral_table.rst | 2 +- doc/src/fix_addtorque.rst | 2 +- doc/src/fix_grem.rst | 4 +- doc/src/fix_smd.rst | 2 +- doc/src/improper_cossq.rst | 2 +- doc/src/improper_distance.rst | 2 +- doc/src/improper_fourier.rst | 2 +- doc/src/improper_ring.rst | 2 +- doc/src/improper_sqdistharm.rst | 2 +- doc/src/pair_list.rst | 2 +- doc/src/temper_grem.rst | 2 +- doc/src/temper_npt.rst | 2 +- .../addtorque/in.addtorque | 0 .../addtorque/log.9Nov16.addtorque.g++.1 | 0 .../addtorque/log.9Nov16.addtorque.g++.4 | 0 .../gle/data.h2o-quantum | 0 .../gle/data.h2o-smart | 0 .../gle/in.h2o-quantum | 0 .../{USER-MISC => PACKAGES}/gle/in.h2o-smart | 0 .../gle/log.h2o-quantum | 0 .../{USER-MISC => PACKAGES}/gle/log.h2o-smart | 0 .../{USER-MISC => PACKAGES}/gle/qt-300k.A | 0 .../{USER-MISC => PACKAGES}/gle/qt-300k.C | 0 examples/{USER-MISC => PACKAGES}/gle/smart.A | 0 examples/{USER-MISC => PACKAGES}/grem/README | 0 .../grem/lj-6rep/400/restart.init | 0 .../grem/lj-6rep/405/restart.init | 0 .../grem/lj-6rep/410/restart.init | 0 .../grem/lj-6rep/415/restart.init | 0 .../grem/lj-6rep/420/restart.init | 0 .../grem/lj-6rep/425/restart.init | 0 .../grem/lj-6rep/clean.sh | 0 .../grem/lj-6rep/double-re-short.py | 0 .../grem/lj-6rep/in.gREM | 0 .../grem/lj-6rep/run.sh | 0 .../grem/lj-6rep/walker.bkp | 0 .../grem/lj-single/in.gREM-npt | 0 .../grem/lj-single/in.gREM-nvt | 0 .../grem/lj-single/lj.data | 0 .../grem/lj-single/log.gREM-npt.9Nov16.g++.1 | 0 .../grem/lj-single/log.gREM-npt.9Nov16.g++.4 | 0 .../grem/lj-single/log.gREM-nvt.9Nov16.g++.1 | 0 .../grem/lj-single/log.gREM-nvt.9Nov16.g++.4 | 0 .../grem/lj-temper/0/lj.data | 0 .../grem/lj-temper/0/log.lammps.0 | 0 .../grem/lj-temper/1/lj.data | 0 .../grem/lj-temper/1/log.lammps.1 | 0 .../grem/lj-temper/2/lj.data | 0 .../grem/lj-temper/2/log.lammps.2 | 0 .../grem/lj-temper/3/lj.data | 0 .../grem/lj-temper/3/log.lammps.3 | 0 .../grem/lj-temper/in.gREM-temper | 0 examples/{USER-MISC => PACKAGES}/imd/README | 0 .../imd/bucky-plus-cnt-mol.psf | 0 .../imd/bucky_cnt_imd.vmd | 0 .../imd/data.bucky-plus-cnt | 0 .../imd/data.deca-ala-solv | 0 .../imd/deca-ala-solv.psf | 0 .../imd/deca-ala-solv_imd-demo.vmd | 0 .../{USER-MISC => PACKAGES}/imd/deca-ala.psf | 0 .../imd/deca-ala_imd-demo.vmd | 0 .../{USER-MISC => PACKAGES}/imd/falcon.tcl | 0 .../imd/in.bucky-plus-cnt | 0 .../imd/in.bucky-plus-cnt-gpu | 0 .../imd/in.deca-ala-solv-filter_imd | 0 .../imd/in.deca-ala-solv_imd | 0 .../imd/in.deca-ala_imd | 0 .../imd/in.deca-ala_imd-gpu | 0 .../{USER-MISC => PACKAGES}/imd/in.melt_imd | 0 .../imd/in.melt_imd-gpu | 0 examples/{USER-MISC => PACKAGES}/imd/melt.psf | 0 .../imd/melt_imd-demo.vmd | 0 .../{USER-MISC => PACKAGES}/srp/data.chain | 0 examples/{USER-MISC => PACKAGES}/srp/in.srp | 0 src/{USER-MISC => DIPOLE}/angle_dipole.cpp | 0 src/{USER-MISC => DIPOLE}/angle_dipole.h | 0 src/{USER-MISC => MISC}/bond_special.cpp | 0 src/{USER-MISC => MISC}/bond_special.h | 0 src/{USER-MISC => MISC}/fix_addtorque.cpp | 0 src/{USER-MISC => MISC}/fix_addtorque.h | 0 src/{USER-MISC => MISC}/fix_smd.cpp | 0 src/{USER-MISC => MISC}/fix_smd.h | 0 src/{USER-MISC => MISC}/pair_list.cpp | 0 src/{USER-MISC => MISC}/pair_list.h | 0 src/{USER-MISC => MISC}/pair_srp.cpp | 0 src/{USER-MISC => MISC}/pair_srp.h | 0 .../angle_cosine_shift.cpp | 0 .../angle_cosine_shift.h | 0 .../angle_cosine_shift_exp.cpp | 0 .../angle_cosine_shift_exp.h | 0 src/{USER-MISC => MOLECULE}/angle_fourier.cpp | 0 src/{USER-MISC => MOLECULE}/angle_fourier.h | 0 .../angle_fourier_simple.cpp | 0 .../angle_fourier_simple.h | 0 .../angle_gaussian.cpp | 0 src/{USER-MISC => MOLECULE}/angle_gaussian.h | 0 src/{USER-MISC => MOLECULE}/angle_quartic.cpp | 0 src/{USER-MISC => MOLECULE}/angle_quartic.h | 0 src/{USER-MISC => MOLECULE}/bond_gaussian.cpp | 0 src/{USER-MISC => MOLECULE}/bond_gaussian.h | 0 .../bond_harmonic_shift.cpp | 0 .../bond_harmonic_shift.h | 0 .../bond_harmonic_shift_cut.cpp | 0 .../bond_harmonic_shift_cut.h | 0 .../dihedral_cosine_shift_exp.cpp | 0 .../dihedral_cosine_shift_exp.h | 0 .../dihedral_fourier.cpp | 0 .../dihedral_fourier.h | 0 .../dihedral_nharmonic.cpp | 0 .../dihedral_nharmonic.h | 0 .../dihedral_quadratic.cpp | 0 .../dihedral_quadratic.h | 0 .../dihedral_spherical.cpp | 0 .../dihedral_spherical.h | 0 .../dihedral_table.cpp | 0 src/{USER-MISC => MOLECULE}/dihedral_table.h | 0 .../dihedral_table_cut.cpp | 0 .../dihedral_table_cut.h | 0 .../improper_cossq.cpp | 0 src/{USER-MISC => MOLECULE}/improper_cossq.h | 0 .../improper_distance.cpp | 0 .../improper_distance.h | 0 .../improper_fourier.cpp | 0 .../improper_fourier.h | 0 src/{USER-MISC => MOLECULE}/improper_ring.cpp | 0 src/{USER-MISC => MOLECULE}/improper_ring.h | 0 .../compute_pressure_grem.cpp | 0 .../compute_pressure_grem.h | 0 src/{USER-MISC => REPLICA}/fix_grem.cpp | 0 src/{USER-MISC => REPLICA}/fix_grem.h | 0 src/{USER-MISC => REPLICA}/temper_grem.cpp | 0 src/{USER-MISC => REPLICA}/temper_grem.h | 0 src/{USER-MISC => REPLICA}/temper_npt.cpp | 0 src/{USER-MISC => REPLICA}/temper_npt.h | 0 src/USER-MISC/README | 37 ------------------- 152 files changed, 39 insertions(+), 67 deletions(-) rename examples/{USER-MISC => PACKAGES}/addtorque/in.addtorque (100%) rename examples/{USER-MISC => PACKAGES}/addtorque/log.9Nov16.addtorque.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/addtorque/log.9Nov16.addtorque.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/gle/data.h2o-quantum (100%) rename examples/{USER-MISC => PACKAGES}/gle/data.h2o-smart (100%) rename examples/{USER-MISC => PACKAGES}/gle/in.h2o-quantum (100%) rename examples/{USER-MISC => PACKAGES}/gle/in.h2o-smart (100%) rename examples/{USER-MISC => PACKAGES}/gle/log.h2o-quantum (100%) rename examples/{USER-MISC => PACKAGES}/gle/log.h2o-smart (100%) rename examples/{USER-MISC => PACKAGES}/gle/qt-300k.A (100%) rename examples/{USER-MISC => PACKAGES}/gle/qt-300k.C (100%) rename examples/{USER-MISC => PACKAGES}/gle/smart.A (100%) rename examples/{USER-MISC => PACKAGES}/grem/README (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/400/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/405/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/410/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/415/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/420/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/425/restart.init (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/clean.sh (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/double-re-short.py (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/in.gREM (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/run.sh (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-6rep/walker.bkp (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/in.gREM-npt (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/in.gREM-nvt (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/lj.data (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/log.gREM-npt.9Nov16.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/log.gREM-npt.9Nov16.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/log.gREM-nvt.9Nov16.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-single/log.gREM-nvt.9Nov16.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/0/lj.data (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/0/log.lammps.0 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/1/lj.data (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/1/log.lammps.1 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/2/lj.data (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/2/log.lammps.2 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/3/lj.data (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/3/log.lammps.3 (100%) rename examples/{USER-MISC => PACKAGES}/grem/lj-temper/in.gREM-temper (100%) rename examples/{USER-MISC => PACKAGES}/imd/README (100%) rename examples/{USER-MISC => PACKAGES}/imd/bucky-plus-cnt-mol.psf (100%) rename examples/{USER-MISC => PACKAGES}/imd/bucky_cnt_imd.vmd (100%) rename examples/{USER-MISC => PACKAGES}/imd/data.bucky-plus-cnt (100%) rename examples/{USER-MISC => PACKAGES}/imd/data.deca-ala-solv (100%) rename examples/{USER-MISC => PACKAGES}/imd/deca-ala-solv.psf (100%) rename examples/{USER-MISC => PACKAGES}/imd/deca-ala-solv_imd-demo.vmd (100%) rename examples/{USER-MISC => PACKAGES}/imd/deca-ala.psf (100%) rename examples/{USER-MISC => PACKAGES}/imd/deca-ala_imd-demo.vmd (100%) rename examples/{USER-MISC => PACKAGES}/imd/falcon.tcl (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.bucky-plus-cnt (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.bucky-plus-cnt-gpu (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.deca-ala-solv-filter_imd (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.deca-ala-solv_imd (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.deca-ala_imd (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.deca-ala_imd-gpu (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.melt_imd (100%) rename examples/{USER-MISC => PACKAGES}/imd/in.melt_imd-gpu (100%) rename examples/{USER-MISC => PACKAGES}/imd/melt.psf (100%) rename examples/{USER-MISC => PACKAGES}/imd/melt_imd-demo.vmd (100%) rename examples/{USER-MISC => PACKAGES}/srp/data.chain (100%) rename examples/{USER-MISC => PACKAGES}/srp/in.srp (100%) rename src/{USER-MISC => DIPOLE}/angle_dipole.cpp (100%) rename src/{USER-MISC => DIPOLE}/angle_dipole.h (100%) rename src/{USER-MISC => MISC}/bond_special.cpp (100%) rename src/{USER-MISC => MISC}/bond_special.h (100%) rename src/{USER-MISC => MISC}/fix_addtorque.cpp (100%) rename src/{USER-MISC => MISC}/fix_addtorque.h (100%) rename src/{USER-MISC => MISC}/fix_smd.cpp (100%) rename src/{USER-MISC => MISC}/fix_smd.h (100%) rename src/{USER-MISC => MISC}/pair_list.cpp (100%) rename src/{USER-MISC => MISC}/pair_list.h (100%) rename src/{USER-MISC => MISC}/pair_srp.cpp (100%) rename src/{USER-MISC => MISC}/pair_srp.h (100%) rename src/{USER-MISC => MOLECULE}/angle_cosine_shift.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_cosine_shift.h (100%) rename src/{USER-MISC => MOLECULE}/angle_cosine_shift_exp.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_cosine_shift_exp.h (100%) rename src/{USER-MISC => MOLECULE}/angle_fourier.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_fourier.h (100%) rename src/{USER-MISC => MOLECULE}/angle_fourier_simple.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_fourier_simple.h (100%) rename src/{USER-MISC => MOLECULE}/angle_gaussian.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_gaussian.h (100%) rename src/{USER-MISC => MOLECULE}/angle_quartic.cpp (100%) rename src/{USER-MISC => MOLECULE}/angle_quartic.h (100%) rename src/{USER-MISC => MOLECULE}/bond_gaussian.cpp (100%) rename src/{USER-MISC => MOLECULE}/bond_gaussian.h (100%) rename src/{USER-MISC => MOLECULE}/bond_harmonic_shift.cpp (100%) rename src/{USER-MISC => MOLECULE}/bond_harmonic_shift.h (100%) rename src/{USER-MISC => MOLECULE}/bond_harmonic_shift_cut.cpp (100%) rename src/{USER-MISC => MOLECULE}/bond_harmonic_shift_cut.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_cosine_shift_exp.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_cosine_shift_exp.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_fourier.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_fourier.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_nharmonic.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_nharmonic.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_quadratic.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_quadratic.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_spherical.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_spherical.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_table.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_table.h (100%) rename src/{USER-MISC => MOLECULE}/dihedral_table_cut.cpp (100%) rename src/{USER-MISC => MOLECULE}/dihedral_table_cut.h (100%) rename src/{USER-MISC => MOLECULE}/improper_cossq.cpp (100%) rename src/{USER-MISC => MOLECULE}/improper_cossq.h (100%) rename src/{USER-MISC => MOLECULE}/improper_distance.cpp (100%) rename src/{USER-MISC => MOLECULE}/improper_distance.h (100%) rename src/{USER-MISC => MOLECULE}/improper_fourier.cpp (100%) rename src/{USER-MISC => MOLECULE}/improper_fourier.h (100%) rename src/{USER-MISC => MOLECULE}/improper_ring.cpp (100%) rename src/{USER-MISC => MOLECULE}/improper_ring.h (100%) rename src/{USER-MISC => REPLICA}/compute_pressure_grem.cpp (100%) rename src/{USER-MISC => REPLICA}/compute_pressure_grem.h (100%) rename src/{USER-MISC => REPLICA}/fix_grem.cpp (100%) rename src/{USER-MISC => REPLICA}/fix_grem.h (100%) rename src/{USER-MISC => REPLICA}/temper_grem.cpp (100%) rename src/{USER-MISC => REPLICA}/temper_grem.h (100%) rename src/{USER-MISC => REPLICA}/temper_npt.cpp (100%) rename src/{USER-MISC => REPLICA}/temper_npt.h (100%) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index d5bc72de75..5be013da4b 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -558,6 +558,7 @@ short-range or long-range interactions. * :doc:`pair_style lj/cut/dipole/cut ` * :doc:`pair_style lj/cut/dipole/long ` * :doc:`pair_style lj/long/dipole/long ` +* :doc: `angle_style dipole ` * examples/dipole ---------- @@ -1454,7 +1455,9 @@ listing, "ls src/MISC", to see the list of commands. **Supporting info:** * src/MISC: filenames -> commands +* :doc:`bond_style special ` * :doc:`compute ti ` +* :doc:`fix deposit ` * :doc:`fix evaporate ` * :doc:`fix imd ` * :doc:`fix oneway ` @@ -1462,6 +1465,7 @@ listing, "ls src/MISC", to see the list of commands. * :doc:`fix ttm ` * :doc:`fix thermal/conductivity ` * :doc:`fix viscosity ` +* :doc:`pair_style list ` * examples/KAPPA * examples/VISCOSITY * https://www.lammps.org/pictures.html#ttm @@ -2319,10 +2323,13 @@ another set. * :doc:`prd ` * :doc:`tad ` * :doc:`temper `, +* :doc:`temper/npt `, +* :doc:`temper/grem `, * :doc:`run_style verlet/split ` * examples/neb * examples/prd * examples/tad +* examples/PACKAGES/grem ---------- diff --git a/doc/src/angle_cosine_shift.rst b/doc/src/angle_cosine_shift.rst index 71bda194c7..a22f93b1d0 100644 --- a/doc/src/angle_cosine_shift.rst +++ b/doc/src/angle_cosine_shift.rst @@ -53,7 +53,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. +MOLECULE package. Related commands """""""""""""""" diff --git a/doc/src/angle_cosine_shift_exp.rst b/doc/src/angle_cosine_shift_exp.rst index 4ae4928751..72962abc1c 100644 --- a/doc/src/angle_cosine_shift_exp.rst +++ b/doc/src/angle_cosine_shift_exp.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_dipole.rst b/doc/src/angle_dipole.rst index 4dd8aadfb8..8aaed55132 100644 --- a/doc/src/angle_dipole.rst +++ b/doc/src/angle_dipole.rst @@ -88,7 +88,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +DIPOLE package. See the :doc:`Build package ` doc page for more info. .. note:: @@ -106,7 +106,9 @@ page for more info. The :doc:`newton ` command for intramolecular interactions must be "on" (which is the default except when using some accelerator packages). -This angle style should not be used with SHAKE. +.. note:: + + This angle style should **NOT** be used with fix shake. Related commands """""""""""""""" diff --git a/doc/src/angle_fourier.rst b/doc/src/angle_fourier.rst index ff9c42b79c..780ecd510c 100644 --- a/doc/src/angle_fourier.rst +++ b/doc/src/angle_fourier.rst @@ -50,7 +50,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_fourier_simple.rst b/doc/src/angle_fourier_simple.rst index 8d367ff118..29a493a442 100644 --- a/doc/src/angle_fourier_simple.rst +++ b/doc/src/angle_fourier_simple.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_gaussian.rst b/doc/src/angle_gaussian.rst index 1caae3b20c..9f2964f5f7 100644 --- a/doc/src/angle_gaussian.rst +++ b/doc/src/angle_gaussian.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_quartic.rst b/doc/src/angle_quartic.rst index 6a163db396..e153faee73 100644 --- a/doc/src/angle_quartic.rst +++ b/doc/src/angle_quartic.rst @@ -57,7 +57,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_gaussian.rst b/doc/src/bond_gaussian.rst index dc9bea1cce..369b9eac26 100644 --- a/doc/src/bond_gaussian.rst +++ b/doc/src/bond_gaussian.rst @@ -50,7 +50,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_harmonic_shift.rst b/doc/src/bond_harmonic_shift.rst index 469c370969..24bbc98b83 100644 --- a/doc/src/bond_harmonic_shift.rst +++ b/doc/src/bond_harmonic_shift.rst @@ -56,7 +56,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_harmonic_shift_cut.rst b/doc/src/bond_harmonic_shift_cut.rst index d0f44740b3..05fb245727 100644 --- a/doc/src/bond_harmonic_shift_cut.rst +++ b/doc/src/bond_harmonic_shift_cut.rst @@ -54,7 +54,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/bond_special.rst b/doc/src/bond_special.rst index d2423c9e23..cc11c41f11 100644 --- a/doc/src/bond_special.rst +++ b/doc/src/bond_special.rst @@ -86,7 +86,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MISC package. See the :doc:`Build package ` doc page for more info. This bond style requires the use of a :doc:`pair_style ` which diff --git a/doc/src/dihedral_cosine_shift_exp.rst b/doc/src/dihedral_cosine_shift_exp.rst index 1f0195df83..0bd0a8fa2f 100644 --- a/doc/src/dihedral_cosine_shift_exp.rst +++ b/doc/src/dihedral_cosine_shift_exp.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This dihedral style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_fourier.rst b/doc/src/dihedral_fourier.rst index 31ec043ebe..7889b3c58f 100644 --- a/doc/src/dihedral_fourier.rst +++ b/doc/src/dihedral_fourier.rst @@ -55,7 +55,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_nharmonic.rst b/doc/src/dihedral_nharmonic.rst index 85762ee6f2..06ae8be8a0 100644 --- a/doc/src/dihedral_nharmonic.rst +++ b/doc/src/dihedral_nharmonic.rst @@ -51,7 +51,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_quadratic.rst b/doc/src/dihedral_quadratic.rst index 262a9c50b6..a776c953c1 100644 --- a/doc/src/dihedral_quadratic.rst +++ b/doc/src/dihedral_quadratic.rst @@ -56,7 +56,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_spherical.rst b/doc/src/dihedral_spherical.rst index bba9f20289..9704bff1a8 100644 --- a/doc/src/dihedral_spherical.rst +++ b/doc/src/dihedral_spherical.rst @@ -89,7 +89,7 @@ Restrictions """""""""""" This dihedral style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_table.rst b/doc/src/dihedral_table.rst index a456fecebd..7c08241458 100644 --- a/doc/src/dihedral_table.rst +++ b/doc/src/dihedral_table.rst @@ -245,7 +245,7 @@ Restrictions """""""""""" These dihedral styles can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/fix_addtorque.rst b/doc/src/fix_addtorque.rst index fbb957e547..e03ed2b160 100644 --- a/doc/src/fix_addtorque.rst +++ b/doc/src/fix_addtorque.rst @@ -99,7 +99,7 @@ invoked by the :doc:`minimize ` command. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_grem.rst b/doc/src/fix_grem.rst index 0dedda1e2e..8716fc8cd5 100644 --- a/doc/src/fix_grem.rst +++ b/doc/src/fix_grem.rst @@ -66,7 +66,7 @@ processors be on the order of the number of desired replicas. A 100-replica simulation would require at least 100 processors (1 per world at minimum). If many replicas are needed on a small number of processors, multi-replica runs can be run outside of LAMMPS. An -example of this can be found in examples/USER-MISC/grem and has no +example of this can be found in examples/PACKAGES/grem and has no limit on the number of replicas per processor. However, this is very inefficient and error prone and should be avoided if possible. @@ -100,7 +100,7 @@ fix is "intensive". Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the REPLICA package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/fix_smd.rst b/doc/src/fix_smd.rst index 8bf7c25478..f59a852be6 100644 --- a/doc/src/fix_smd.rst +++ b/doc/src/fix_smd.rst @@ -144,7 +144,7 @@ the :doc:`run ` command. This fix is not invoked during Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/improper_cossq.rst b/doc/src/improper_cossq.rst index a6281bc260..27cb6e5538 100644 --- a/doc/src/improper_cossq.rst +++ b/doc/src/improper_cossq.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This improper style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/improper_distance.rst b/doc/src/improper_distance.rst index 1486550c9f..545222e0a3 100644 --- a/doc/src/improper_distance.rst +++ b/doc/src/improper_distance.rst @@ -54,7 +54,7 @@ Restrictions """""""""""" This improper style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/improper_fourier.rst b/doc/src/improper_fourier.rst index 3c5b45ed69..5852a57038 100644 --- a/doc/src/improper_fourier.rst +++ b/doc/src/improper_fourier.rst @@ -60,7 +60,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/improper_ring.rst b/doc/src/improper_ring.rst index d67c999714..99eed00b90 100644 --- a/doc/src/improper_ring.rst +++ b/doc/src/improper_ring.rst @@ -72,7 +72,7 @@ Restrictions """""""""""" This improper style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/improper_sqdistharm.rst b/doc/src/improper_sqdistharm.rst index 09a661700f..43f824733e 100644 --- a/doc/src/improper_sqdistharm.rst +++ b/doc/src/improper_sqdistharm.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This improper style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index caa1506994..ea0ac282da 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -142,7 +142,7 @@ styles in LAMMPS, an atom I will not interact with multiple images of atom J (assuming the images are within the cutoff distance), but only with the nearest image. -This style is part of the USER-MISC package. It is only enabled if +This style is part of the MISC package. It is only enabled if LAMMPS is build with that package. See the :doc:`Build package ` doc page on for more info. Related commands diff --git a/doc/src/temper_grem.rst b/doc/src/temper_grem.rst index c270c1a450..f45755da50 100644 --- a/doc/src/temper_grem.rst +++ b/doc/src/temper_grem.rst @@ -101,7 +101,7 @@ identical to :doc:`temper `. Restrictions """""""""""" -This command can only be used if LAMMPS was built with the USER-MISC +This command can only be used if LAMMPS was built with the REPLICA package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/temper_npt.rst b/doc/src/temper_npt.rst index 8eaea05701..9c5ba242e9 100644 --- a/doc/src/temper_npt.rst +++ b/doc/src/temper_npt.rst @@ -51,7 +51,7 @@ on how the parallel tempering is handled in general. Restrictions """""""""""" -This command can only be used if LAMMPS was built with the USER-MISC +This command can only be used if LAMMPS was built with the REPLICA package. See the :doc:`Build package ` doc page for more info. diff --git a/examples/USER-MISC/addtorque/in.addtorque b/examples/PACKAGES/addtorque/in.addtorque similarity index 100% rename from examples/USER-MISC/addtorque/in.addtorque rename to examples/PACKAGES/addtorque/in.addtorque diff --git a/examples/USER-MISC/addtorque/log.9Nov16.addtorque.g++.1 b/examples/PACKAGES/addtorque/log.9Nov16.addtorque.g++.1 similarity index 100% rename from examples/USER-MISC/addtorque/log.9Nov16.addtorque.g++.1 rename to examples/PACKAGES/addtorque/log.9Nov16.addtorque.g++.1 diff --git a/examples/USER-MISC/addtorque/log.9Nov16.addtorque.g++.4 b/examples/PACKAGES/addtorque/log.9Nov16.addtorque.g++.4 similarity index 100% rename from examples/USER-MISC/addtorque/log.9Nov16.addtorque.g++.4 rename to examples/PACKAGES/addtorque/log.9Nov16.addtorque.g++.4 diff --git a/examples/USER-MISC/gle/data.h2o-quantum b/examples/PACKAGES/gle/data.h2o-quantum similarity index 100% rename from examples/USER-MISC/gle/data.h2o-quantum rename to examples/PACKAGES/gle/data.h2o-quantum diff --git a/examples/USER-MISC/gle/data.h2o-smart b/examples/PACKAGES/gle/data.h2o-smart similarity index 100% rename from examples/USER-MISC/gle/data.h2o-smart rename to examples/PACKAGES/gle/data.h2o-smart diff --git a/examples/USER-MISC/gle/in.h2o-quantum b/examples/PACKAGES/gle/in.h2o-quantum similarity index 100% rename from examples/USER-MISC/gle/in.h2o-quantum rename to examples/PACKAGES/gle/in.h2o-quantum diff --git a/examples/USER-MISC/gle/in.h2o-smart b/examples/PACKAGES/gle/in.h2o-smart similarity index 100% rename from examples/USER-MISC/gle/in.h2o-smart rename to examples/PACKAGES/gle/in.h2o-smart diff --git a/examples/USER-MISC/gle/log.h2o-quantum b/examples/PACKAGES/gle/log.h2o-quantum similarity index 100% rename from examples/USER-MISC/gle/log.h2o-quantum rename to examples/PACKAGES/gle/log.h2o-quantum diff --git a/examples/USER-MISC/gle/log.h2o-smart b/examples/PACKAGES/gle/log.h2o-smart similarity index 100% rename from examples/USER-MISC/gle/log.h2o-smart rename to examples/PACKAGES/gle/log.h2o-smart diff --git a/examples/USER-MISC/gle/qt-300k.A b/examples/PACKAGES/gle/qt-300k.A similarity index 100% rename from examples/USER-MISC/gle/qt-300k.A rename to examples/PACKAGES/gle/qt-300k.A diff --git a/examples/USER-MISC/gle/qt-300k.C b/examples/PACKAGES/gle/qt-300k.C similarity index 100% rename from examples/USER-MISC/gle/qt-300k.C rename to examples/PACKAGES/gle/qt-300k.C diff --git a/examples/USER-MISC/gle/smart.A b/examples/PACKAGES/gle/smart.A similarity index 100% rename from examples/USER-MISC/gle/smart.A rename to examples/PACKAGES/gle/smart.A diff --git a/examples/USER-MISC/grem/README b/examples/PACKAGES/grem/README similarity index 100% rename from examples/USER-MISC/grem/README rename to examples/PACKAGES/grem/README diff --git a/examples/USER-MISC/grem/lj-6rep/400/restart.init b/examples/PACKAGES/grem/lj-6rep/400/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/400/restart.init rename to examples/PACKAGES/grem/lj-6rep/400/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/405/restart.init b/examples/PACKAGES/grem/lj-6rep/405/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/405/restart.init rename to examples/PACKAGES/grem/lj-6rep/405/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/410/restart.init b/examples/PACKAGES/grem/lj-6rep/410/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/410/restart.init rename to examples/PACKAGES/grem/lj-6rep/410/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/415/restart.init b/examples/PACKAGES/grem/lj-6rep/415/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/415/restart.init rename to examples/PACKAGES/grem/lj-6rep/415/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/420/restart.init b/examples/PACKAGES/grem/lj-6rep/420/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/420/restart.init rename to examples/PACKAGES/grem/lj-6rep/420/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/425/restart.init b/examples/PACKAGES/grem/lj-6rep/425/restart.init similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/425/restart.init rename to examples/PACKAGES/grem/lj-6rep/425/restart.init diff --git a/examples/USER-MISC/grem/lj-6rep/clean.sh b/examples/PACKAGES/grem/lj-6rep/clean.sh similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/clean.sh rename to examples/PACKAGES/grem/lj-6rep/clean.sh diff --git a/examples/USER-MISC/grem/lj-6rep/double-re-short.py b/examples/PACKAGES/grem/lj-6rep/double-re-short.py similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/double-re-short.py rename to examples/PACKAGES/grem/lj-6rep/double-re-short.py diff --git a/examples/USER-MISC/grem/lj-6rep/in.gREM b/examples/PACKAGES/grem/lj-6rep/in.gREM similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/in.gREM rename to examples/PACKAGES/grem/lj-6rep/in.gREM diff --git a/examples/USER-MISC/grem/lj-6rep/run.sh b/examples/PACKAGES/grem/lj-6rep/run.sh similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/run.sh rename to examples/PACKAGES/grem/lj-6rep/run.sh diff --git a/examples/USER-MISC/grem/lj-6rep/walker.bkp b/examples/PACKAGES/grem/lj-6rep/walker.bkp similarity index 100% rename from examples/USER-MISC/grem/lj-6rep/walker.bkp rename to examples/PACKAGES/grem/lj-6rep/walker.bkp diff --git a/examples/USER-MISC/grem/lj-single/in.gREM-npt b/examples/PACKAGES/grem/lj-single/in.gREM-npt similarity index 100% rename from examples/USER-MISC/grem/lj-single/in.gREM-npt rename to examples/PACKAGES/grem/lj-single/in.gREM-npt diff --git a/examples/USER-MISC/grem/lj-single/in.gREM-nvt b/examples/PACKAGES/grem/lj-single/in.gREM-nvt similarity index 100% rename from examples/USER-MISC/grem/lj-single/in.gREM-nvt rename to examples/PACKAGES/grem/lj-single/in.gREM-nvt diff --git a/examples/USER-MISC/grem/lj-single/lj.data b/examples/PACKAGES/grem/lj-single/lj.data similarity index 100% rename from examples/USER-MISC/grem/lj-single/lj.data rename to examples/PACKAGES/grem/lj-single/lj.data diff --git a/examples/USER-MISC/grem/lj-single/log.gREM-npt.9Nov16.g++.1 b/examples/PACKAGES/grem/lj-single/log.gREM-npt.9Nov16.g++.1 similarity index 100% rename from examples/USER-MISC/grem/lj-single/log.gREM-npt.9Nov16.g++.1 rename to examples/PACKAGES/grem/lj-single/log.gREM-npt.9Nov16.g++.1 diff --git a/examples/USER-MISC/grem/lj-single/log.gREM-npt.9Nov16.g++.4 b/examples/PACKAGES/grem/lj-single/log.gREM-npt.9Nov16.g++.4 similarity index 100% rename from examples/USER-MISC/grem/lj-single/log.gREM-npt.9Nov16.g++.4 rename to examples/PACKAGES/grem/lj-single/log.gREM-npt.9Nov16.g++.4 diff --git a/examples/USER-MISC/grem/lj-single/log.gREM-nvt.9Nov16.g++.1 b/examples/PACKAGES/grem/lj-single/log.gREM-nvt.9Nov16.g++.1 similarity index 100% rename from examples/USER-MISC/grem/lj-single/log.gREM-nvt.9Nov16.g++.1 rename to examples/PACKAGES/grem/lj-single/log.gREM-nvt.9Nov16.g++.1 diff --git a/examples/USER-MISC/grem/lj-single/log.gREM-nvt.9Nov16.g++.4 b/examples/PACKAGES/grem/lj-single/log.gREM-nvt.9Nov16.g++.4 similarity index 100% rename from examples/USER-MISC/grem/lj-single/log.gREM-nvt.9Nov16.g++.4 rename to examples/PACKAGES/grem/lj-single/log.gREM-nvt.9Nov16.g++.4 diff --git a/examples/USER-MISC/grem/lj-temper/0/lj.data b/examples/PACKAGES/grem/lj-temper/0/lj.data similarity index 100% rename from examples/USER-MISC/grem/lj-temper/0/lj.data rename to examples/PACKAGES/grem/lj-temper/0/lj.data diff --git a/examples/USER-MISC/grem/lj-temper/0/log.lammps.0 b/examples/PACKAGES/grem/lj-temper/0/log.lammps.0 similarity index 100% rename from examples/USER-MISC/grem/lj-temper/0/log.lammps.0 rename to examples/PACKAGES/grem/lj-temper/0/log.lammps.0 diff --git a/examples/USER-MISC/grem/lj-temper/1/lj.data b/examples/PACKAGES/grem/lj-temper/1/lj.data similarity index 100% rename from examples/USER-MISC/grem/lj-temper/1/lj.data rename to examples/PACKAGES/grem/lj-temper/1/lj.data diff --git a/examples/USER-MISC/grem/lj-temper/1/log.lammps.1 b/examples/PACKAGES/grem/lj-temper/1/log.lammps.1 similarity index 100% rename from examples/USER-MISC/grem/lj-temper/1/log.lammps.1 rename to examples/PACKAGES/grem/lj-temper/1/log.lammps.1 diff --git a/examples/USER-MISC/grem/lj-temper/2/lj.data b/examples/PACKAGES/grem/lj-temper/2/lj.data similarity index 100% rename from examples/USER-MISC/grem/lj-temper/2/lj.data rename to examples/PACKAGES/grem/lj-temper/2/lj.data diff --git a/examples/USER-MISC/grem/lj-temper/2/log.lammps.2 b/examples/PACKAGES/grem/lj-temper/2/log.lammps.2 similarity index 100% rename from examples/USER-MISC/grem/lj-temper/2/log.lammps.2 rename to examples/PACKAGES/grem/lj-temper/2/log.lammps.2 diff --git a/examples/USER-MISC/grem/lj-temper/3/lj.data b/examples/PACKAGES/grem/lj-temper/3/lj.data similarity index 100% rename from examples/USER-MISC/grem/lj-temper/3/lj.data rename to examples/PACKAGES/grem/lj-temper/3/lj.data diff --git a/examples/USER-MISC/grem/lj-temper/3/log.lammps.3 b/examples/PACKAGES/grem/lj-temper/3/log.lammps.3 similarity index 100% rename from examples/USER-MISC/grem/lj-temper/3/log.lammps.3 rename to examples/PACKAGES/grem/lj-temper/3/log.lammps.3 diff --git a/examples/USER-MISC/grem/lj-temper/in.gREM-temper b/examples/PACKAGES/grem/lj-temper/in.gREM-temper similarity index 100% rename from examples/USER-MISC/grem/lj-temper/in.gREM-temper rename to examples/PACKAGES/grem/lj-temper/in.gREM-temper diff --git a/examples/USER-MISC/imd/README b/examples/PACKAGES/imd/README similarity index 100% rename from examples/USER-MISC/imd/README rename to examples/PACKAGES/imd/README diff --git a/examples/USER-MISC/imd/bucky-plus-cnt-mol.psf b/examples/PACKAGES/imd/bucky-plus-cnt-mol.psf similarity index 100% rename from examples/USER-MISC/imd/bucky-plus-cnt-mol.psf rename to examples/PACKAGES/imd/bucky-plus-cnt-mol.psf diff --git a/examples/USER-MISC/imd/bucky_cnt_imd.vmd b/examples/PACKAGES/imd/bucky_cnt_imd.vmd similarity index 100% rename from examples/USER-MISC/imd/bucky_cnt_imd.vmd rename to examples/PACKAGES/imd/bucky_cnt_imd.vmd diff --git a/examples/USER-MISC/imd/data.bucky-plus-cnt b/examples/PACKAGES/imd/data.bucky-plus-cnt similarity index 100% rename from examples/USER-MISC/imd/data.bucky-plus-cnt rename to examples/PACKAGES/imd/data.bucky-plus-cnt diff --git a/examples/USER-MISC/imd/data.deca-ala-solv b/examples/PACKAGES/imd/data.deca-ala-solv similarity index 100% rename from examples/USER-MISC/imd/data.deca-ala-solv rename to examples/PACKAGES/imd/data.deca-ala-solv diff --git a/examples/USER-MISC/imd/deca-ala-solv.psf b/examples/PACKAGES/imd/deca-ala-solv.psf similarity index 100% rename from examples/USER-MISC/imd/deca-ala-solv.psf rename to examples/PACKAGES/imd/deca-ala-solv.psf diff --git a/examples/USER-MISC/imd/deca-ala-solv_imd-demo.vmd b/examples/PACKAGES/imd/deca-ala-solv_imd-demo.vmd similarity index 100% rename from examples/USER-MISC/imd/deca-ala-solv_imd-demo.vmd rename to examples/PACKAGES/imd/deca-ala-solv_imd-demo.vmd diff --git a/examples/USER-MISC/imd/deca-ala.psf b/examples/PACKAGES/imd/deca-ala.psf similarity index 100% rename from examples/USER-MISC/imd/deca-ala.psf rename to examples/PACKAGES/imd/deca-ala.psf diff --git a/examples/USER-MISC/imd/deca-ala_imd-demo.vmd b/examples/PACKAGES/imd/deca-ala_imd-demo.vmd similarity index 100% rename from examples/USER-MISC/imd/deca-ala_imd-demo.vmd rename to examples/PACKAGES/imd/deca-ala_imd-demo.vmd diff --git a/examples/USER-MISC/imd/falcon.tcl b/examples/PACKAGES/imd/falcon.tcl similarity index 100% rename from examples/USER-MISC/imd/falcon.tcl rename to examples/PACKAGES/imd/falcon.tcl diff --git a/examples/USER-MISC/imd/in.bucky-plus-cnt b/examples/PACKAGES/imd/in.bucky-plus-cnt similarity index 100% rename from examples/USER-MISC/imd/in.bucky-plus-cnt rename to examples/PACKAGES/imd/in.bucky-plus-cnt diff --git a/examples/USER-MISC/imd/in.bucky-plus-cnt-gpu b/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu similarity index 100% rename from examples/USER-MISC/imd/in.bucky-plus-cnt-gpu rename to examples/PACKAGES/imd/in.bucky-plus-cnt-gpu diff --git a/examples/USER-MISC/imd/in.deca-ala-solv-filter_imd b/examples/PACKAGES/imd/in.deca-ala-solv-filter_imd similarity index 100% rename from examples/USER-MISC/imd/in.deca-ala-solv-filter_imd rename to examples/PACKAGES/imd/in.deca-ala-solv-filter_imd diff --git a/examples/USER-MISC/imd/in.deca-ala-solv_imd b/examples/PACKAGES/imd/in.deca-ala-solv_imd similarity index 100% rename from examples/USER-MISC/imd/in.deca-ala-solv_imd rename to examples/PACKAGES/imd/in.deca-ala-solv_imd diff --git a/examples/USER-MISC/imd/in.deca-ala_imd b/examples/PACKAGES/imd/in.deca-ala_imd similarity index 100% rename from examples/USER-MISC/imd/in.deca-ala_imd rename to examples/PACKAGES/imd/in.deca-ala_imd diff --git a/examples/USER-MISC/imd/in.deca-ala_imd-gpu b/examples/PACKAGES/imd/in.deca-ala_imd-gpu similarity index 100% rename from examples/USER-MISC/imd/in.deca-ala_imd-gpu rename to examples/PACKAGES/imd/in.deca-ala_imd-gpu diff --git a/examples/USER-MISC/imd/in.melt_imd b/examples/PACKAGES/imd/in.melt_imd similarity index 100% rename from examples/USER-MISC/imd/in.melt_imd rename to examples/PACKAGES/imd/in.melt_imd diff --git a/examples/USER-MISC/imd/in.melt_imd-gpu b/examples/PACKAGES/imd/in.melt_imd-gpu similarity index 100% rename from examples/USER-MISC/imd/in.melt_imd-gpu rename to examples/PACKAGES/imd/in.melt_imd-gpu diff --git a/examples/USER-MISC/imd/melt.psf b/examples/PACKAGES/imd/melt.psf similarity index 100% rename from examples/USER-MISC/imd/melt.psf rename to examples/PACKAGES/imd/melt.psf diff --git a/examples/USER-MISC/imd/melt_imd-demo.vmd b/examples/PACKAGES/imd/melt_imd-demo.vmd similarity index 100% rename from examples/USER-MISC/imd/melt_imd-demo.vmd rename to examples/PACKAGES/imd/melt_imd-demo.vmd diff --git a/examples/USER-MISC/srp/data.chain b/examples/PACKAGES/srp/data.chain similarity index 100% rename from examples/USER-MISC/srp/data.chain rename to examples/PACKAGES/srp/data.chain diff --git a/examples/USER-MISC/srp/in.srp b/examples/PACKAGES/srp/in.srp similarity index 100% rename from examples/USER-MISC/srp/in.srp rename to examples/PACKAGES/srp/in.srp diff --git a/src/USER-MISC/angle_dipole.cpp b/src/DIPOLE/angle_dipole.cpp similarity index 100% rename from src/USER-MISC/angle_dipole.cpp rename to src/DIPOLE/angle_dipole.cpp diff --git a/src/USER-MISC/angle_dipole.h b/src/DIPOLE/angle_dipole.h similarity index 100% rename from src/USER-MISC/angle_dipole.h rename to src/DIPOLE/angle_dipole.h diff --git a/src/USER-MISC/bond_special.cpp b/src/MISC/bond_special.cpp similarity index 100% rename from src/USER-MISC/bond_special.cpp rename to src/MISC/bond_special.cpp diff --git a/src/USER-MISC/bond_special.h b/src/MISC/bond_special.h similarity index 100% rename from src/USER-MISC/bond_special.h rename to src/MISC/bond_special.h diff --git a/src/USER-MISC/fix_addtorque.cpp b/src/MISC/fix_addtorque.cpp similarity index 100% rename from src/USER-MISC/fix_addtorque.cpp rename to src/MISC/fix_addtorque.cpp diff --git a/src/USER-MISC/fix_addtorque.h b/src/MISC/fix_addtorque.h similarity index 100% rename from src/USER-MISC/fix_addtorque.h rename to src/MISC/fix_addtorque.h diff --git a/src/USER-MISC/fix_smd.cpp b/src/MISC/fix_smd.cpp similarity index 100% rename from src/USER-MISC/fix_smd.cpp rename to src/MISC/fix_smd.cpp diff --git a/src/USER-MISC/fix_smd.h b/src/MISC/fix_smd.h similarity index 100% rename from src/USER-MISC/fix_smd.h rename to src/MISC/fix_smd.h diff --git a/src/USER-MISC/pair_list.cpp b/src/MISC/pair_list.cpp similarity index 100% rename from src/USER-MISC/pair_list.cpp rename to src/MISC/pair_list.cpp diff --git a/src/USER-MISC/pair_list.h b/src/MISC/pair_list.h similarity index 100% rename from src/USER-MISC/pair_list.h rename to src/MISC/pair_list.h diff --git a/src/USER-MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp similarity index 100% rename from src/USER-MISC/pair_srp.cpp rename to src/MISC/pair_srp.cpp diff --git a/src/USER-MISC/pair_srp.h b/src/MISC/pair_srp.h similarity index 100% rename from src/USER-MISC/pair_srp.h rename to src/MISC/pair_srp.h diff --git a/src/USER-MISC/angle_cosine_shift.cpp b/src/MOLECULE/angle_cosine_shift.cpp similarity index 100% rename from src/USER-MISC/angle_cosine_shift.cpp rename to src/MOLECULE/angle_cosine_shift.cpp diff --git a/src/USER-MISC/angle_cosine_shift.h b/src/MOLECULE/angle_cosine_shift.h similarity index 100% rename from src/USER-MISC/angle_cosine_shift.h rename to src/MOLECULE/angle_cosine_shift.h diff --git a/src/USER-MISC/angle_cosine_shift_exp.cpp b/src/MOLECULE/angle_cosine_shift_exp.cpp similarity index 100% rename from src/USER-MISC/angle_cosine_shift_exp.cpp rename to src/MOLECULE/angle_cosine_shift_exp.cpp diff --git a/src/USER-MISC/angle_cosine_shift_exp.h b/src/MOLECULE/angle_cosine_shift_exp.h similarity index 100% rename from src/USER-MISC/angle_cosine_shift_exp.h rename to src/MOLECULE/angle_cosine_shift_exp.h diff --git a/src/USER-MISC/angle_fourier.cpp b/src/MOLECULE/angle_fourier.cpp similarity index 100% rename from src/USER-MISC/angle_fourier.cpp rename to src/MOLECULE/angle_fourier.cpp diff --git a/src/USER-MISC/angle_fourier.h b/src/MOLECULE/angle_fourier.h similarity index 100% rename from src/USER-MISC/angle_fourier.h rename to src/MOLECULE/angle_fourier.h diff --git a/src/USER-MISC/angle_fourier_simple.cpp b/src/MOLECULE/angle_fourier_simple.cpp similarity index 100% rename from src/USER-MISC/angle_fourier_simple.cpp rename to src/MOLECULE/angle_fourier_simple.cpp diff --git a/src/USER-MISC/angle_fourier_simple.h b/src/MOLECULE/angle_fourier_simple.h similarity index 100% rename from src/USER-MISC/angle_fourier_simple.h rename to src/MOLECULE/angle_fourier_simple.h diff --git a/src/USER-MISC/angle_gaussian.cpp b/src/MOLECULE/angle_gaussian.cpp similarity index 100% rename from src/USER-MISC/angle_gaussian.cpp rename to src/MOLECULE/angle_gaussian.cpp diff --git a/src/USER-MISC/angle_gaussian.h b/src/MOLECULE/angle_gaussian.h similarity index 100% rename from src/USER-MISC/angle_gaussian.h rename to src/MOLECULE/angle_gaussian.h diff --git a/src/USER-MISC/angle_quartic.cpp b/src/MOLECULE/angle_quartic.cpp similarity index 100% rename from src/USER-MISC/angle_quartic.cpp rename to src/MOLECULE/angle_quartic.cpp diff --git a/src/USER-MISC/angle_quartic.h b/src/MOLECULE/angle_quartic.h similarity index 100% rename from src/USER-MISC/angle_quartic.h rename to src/MOLECULE/angle_quartic.h diff --git a/src/USER-MISC/bond_gaussian.cpp b/src/MOLECULE/bond_gaussian.cpp similarity index 100% rename from src/USER-MISC/bond_gaussian.cpp rename to src/MOLECULE/bond_gaussian.cpp diff --git a/src/USER-MISC/bond_gaussian.h b/src/MOLECULE/bond_gaussian.h similarity index 100% rename from src/USER-MISC/bond_gaussian.h rename to src/MOLECULE/bond_gaussian.h diff --git a/src/USER-MISC/bond_harmonic_shift.cpp b/src/MOLECULE/bond_harmonic_shift.cpp similarity index 100% rename from src/USER-MISC/bond_harmonic_shift.cpp rename to src/MOLECULE/bond_harmonic_shift.cpp diff --git a/src/USER-MISC/bond_harmonic_shift.h b/src/MOLECULE/bond_harmonic_shift.h similarity index 100% rename from src/USER-MISC/bond_harmonic_shift.h rename to src/MOLECULE/bond_harmonic_shift.h diff --git a/src/USER-MISC/bond_harmonic_shift_cut.cpp b/src/MOLECULE/bond_harmonic_shift_cut.cpp similarity index 100% rename from src/USER-MISC/bond_harmonic_shift_cut.cpp rename to src/MOLECULE/bond_harmonic_shift_cut.cpp diff --git a/src/USER-MISC/bond_harmonic_shift_cut.h b/src/MOLECULE/bond_harmonic_shift_cut.h similarity index 100% rename from src/USER-MISC/bond_harmonic_shift_cut.h rename to src/MOLECULE/bond_harmonic_shift_cut.h diff --git a/src/USER-MISC/dihedral_cosine_shift_exp.cpp b/src/MOLECULE/dihedral_cosine_shift_exp.cpp similarity index 100% rename from src/USER-MISC/dihedral_cosine_shift_exp.cpp rename to src/MOLECULE/dihedral_cosine_shift_exp.cpp diff --git a/src/USER-MISC/dihedral_cosine_shift_exp.h b/src/MOLECULE/dihedral_cosine_shift_exp.h similarity index 100% rename from src/USER-MISC/dihedral_cosine_shift_exp.h rename to src/MOLECULE/dihedral_cosine_shift_exp.h diff --git a/src/USER-MISC/dihedral_fourier.cpp b/src/MOLECULE/dihedral_fourier.cpp similarity index 100% rename from src/USER-MISC/dihedral_fourier.cpp rename to src/MOLECULE/dihedral_fourier.cpp diff --git a/src/USER-MISC/dihedral_fourier.h b/src/MOLECULE/dihedral_fourier.h similarity index 100% rename from src/USER-MISC/dihedral_fourier.h rename to src/MOLECULE/dihedral_fourier.h diff --git a/src/USER-MISC/dihedral_nharmonic.cpp b/src/MOLECULE/dihedral_nharmonic.cpp similarity index 100% rename from src/USER-MISC/dihedral_nharmonic.cpp rename to src/MOLECULE/dihedral_nharmonic.cpp diff --git a/src/USER-MISC/dihedral_nharmonic.h b/src/MOLECULE/dihedral_nharmonic.h similarity index 100% rename from src/USER-MISC/dihedral_nharmonic.h rename to src/MOLECULE/dihedral_nharmonic.h diff --git a/src/USER-MISC/dihedral_quadratic.cpp b/src/MOLECULE/dihedral_quadratic.cpp similarity index 100% rename from src/USER-MISC/dihedral_quadratic.cpp rename to src/MOLECULE/dihedral_quadratic.cpp diff --git a/src/USER-MISC/dihedral_quadratic.h b/src/MOLECULE/dihedral_quadratic.h similarity index 100% rename from src/USER-MISC/dihedral_quadratic.h rename to src/MOLECULE/dihedral_quadratic.h diff --git a/src/USER-MISC/dihedral_spherical.cpp b/src/MOLECULE/dihedral_spherical.cpp similarity index 100% rename from src/USER-MISC/dihedral_spherical.cpp rename to src/MOLECULE/dihedral_spherical.cpp diff --git a/src/USER-MISC/dihedral_spherical.h b/src/MOLECULE/dihedral_spherical.h similarity index 100% rename from src/USER-MISC/dihedral_spherical.h rename to src/MOLECULE/dihedral_spherical.h diff --git a/src/USER-MISC/dihedral_table.cpp b/src/MOLECULE/dihedral_table.cpp similarity index 100% rename from src/USER-MISC/dihedral_table.cpp rename to src/MOLECULE/dihedral_table.cpp diff --git a/src/USER-MISC/dihedral_table.h b/src/MOLECULE/dihedral_table.h similarity index 100% rename from src/USER-MISC/dihedral_table.h rename to src/MOLECULE/dihedral_table.h diff --git a/src/USER-MISC/dihedral_table_cut.cpp b/src/MOLECULE/dihedral_table_cut.cpp similarity index 100% rename from src/USER-MISC/dihedral_table_cut.cpp rename to src/MOLECULE/dihedral_table_cut.cpp diff --git a/src/USER-MISC/dihedral_table_cut.h b/src/MOLECULE/dihedral_table_cut.h similarity index 100% rename from src/USER-MISC/dihedral_table_cut.h rename to src/MOLECULE/dihedral_table_cut.h diff --git a/src/USER-MISC/improper_cossq.cpp b/src/MOLECULE/improper_cossq.cpp similarity index 100% rename from src/USER-MISC/improper_cossq.cpp rename to src/MOLECULE/improper_cossq.cpp diff --git a/src/USER-MISC/improper_cossq.h b/src/MOLECULE/improper_cossq.h similarity index 100% rename from src/USER-MISC/improper_cossq.h rename to src/MOLECULE/improper_cossq.h diff --git a/src/USER-MISC/improper_distance.cpp b/src/MOLECULE/improper_distance.cpp similarity index 100% rename from src/USER-MISC/improper_distance.cpp rename to src/MOLECULE/improper_distance.cpp diff --git a/src/USER-MISC/improper_distance.h b/src/MOLECULE/improper_distance.h similarity index 100% rename from src/USER-MISC/improper_distance.h rename to src/MOLECULE/improper_distance.h diff --git a/src/USER-MISC/improper_fourier.cpp b/src/MOLECULE/improper_fourier.cpp similarity index 100% rename from src/USER-MISC/improper_fourier.cpp rename to src/MOLECULE/improper_fourier.cpp diff --git a/src/USER-MISC/improper_fourier.h b/src/MOLECULE/improper_fourier.h similarity index 100% rename from src/USER-MISC/improper_fourier.h rename to src/MOLECULE/improper_fourier.h diff --git a/src/USER-MISC/improper_ring.cpp b/src/MOLECULE/improper_ring.cpp similarity index 100% rename from src/USER-MISC/improper_ring.cpp rename to src/MOLECULE/improper_ring.cpp diff --git a/src/USER-MISC/improper_ring.h b/src/MOLECULE/improper_ring.h similarity index 100% rename from src/USER-MISC/improper_ring.h rename to src/MOLECULE/improper_ring.h diff --git a/src/USER-MISC/compute_pressure_grem.cpp b/src/REPLICA/compute_pressure_grem.cpp similarity index 100% rename from src/USER-MISC/compute_pressure_grem.cpp rename to src/REPLICA/compute_pressure_grem.cpp diff --git a/src/USER-MISC/compute_pressure_grem.h b/src/REPLICA/compute_pressure_grem.h similarity index 100% rename from src/USER-MISC/compute_pressure_grem.h rename to src/REPLICA/compute_pressure_grem.h diff --git a/src/USER-MISC/fix_grem.cpp b/src/REPLICA/fix_grem.cpp similarity index 100% rename from src/USER-MISC/fix_grem.cpp rename to src/REPLICA/fix_grem.cpp diff --git a/src/USER-MISC/fix_grem.h b/src/REPLICA/fix_grem.h similarity index 100% rename from src/USER-MISC/fix_grem.h rename to src/REPLICA/fix_grem.h diff --git a/src/USER-MISC/temper_grem.cpp b/src/REPLICA/temper_grem.cpp similarity index 100% rename from src/USER-MISC/temper_grem.cpp rename to src/REPLICA/temper_grem.cpp diff --git a/src/USER-MISC/temper_grem.h b/src/REPLICA/temper_grem.h similarity index 100% rename from src/USER-MISC/temper_grem.h rename to src/REPLICA/temper_grem.h diff --git a/src/USER-MISC/temper_npt.cpp b/src/REPLICA/temper_npt.cpp similarity index 100% rename from src/USER-MISC/temper_npt.cpp rename to src/REPLICA/temper_npt.cpp diff --git a/src/USER-MISC/temper_npt.h b/src/REPLICA/temper_npt.h similarity index 100% rename from src/USER-MISC/temper_npt.h rename to src/REPLICA/temper_npt.h diff --git a/src/USER-MISC/README b/src/USER-MISC/README index ea5910203c..a5416c6804 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -18,17 +18,6 @@ about the feature or its coding. ------------------------------------------------------------ -angle_style cosine/shift, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 -angle_style cosine/shift/exp, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 -angle_style fourier, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -angle_style fourier/simple, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -angle_style gaussian, Evangelos Voyiatzis, evoyiatzis at gmail.com, 25 Nov 2020 -angle_style dipole, Mario Orsi, orsimario at gmail.com, 10 Jan 12 -angle_style quartic, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -bond_style harmonic/shift, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 -bond_style harmonic/shift/cut, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 -bond_style gaussian, Evangelos Voyiatzis, evoyiatzis at gmail.com, 25 Nov 2020 -bond_style special, David Nicholson, davidanich at gmail.com, 31 Jan 2020 compute ackland/atom, Gerolf Ziegenhain, gerolf at ziegenhain.com, 4 Oct 2007 compute basal/atom, Christopher Barrett, cdb333 at cavs.msstate.edu, 3 Mar 2013 compute cnp/atom, Paulo Branicio (USC), branicio at usc.edu, 31 May 2017 @@ -42,24 +31,13 @@ compute stress/mop, Romain Vermorel (U Pau) & Laurent Joly (U Lyon), romain.verm compute stress/mop/profile, Romain Vermorel (U Pau) & Laurent Joly (U Lyon), romain.vermorel at univ-pau.fr & ljoly.ulyon at gmail.com, 5 Sep 18 compute temp/rotate, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 compute viscosity/cos, Zheng Gong (ENS de Lyon), z.gong@outlook.com, 24 Apr 20 -compute PRESSURE/GREM, David Stelter, dstelter@bu.edu, 22 Nov 16 -dihedral_style cosine/shift/exp, Carsten Svaneborg, science at zqex.dk, 8 Aug 11 -dihedral_style fourier, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -dihedral_style nharmonic, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -dihedral_style quadratic, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -dihedral_style spherical, Andrew Jewett, jewett.aij@gmail.com, 15 Jul 16 -dihedral_style table, Andrew Jewett, jewett.aij@gmail.com, 10 Jan 12 -dihedral_style table/cut, Mike Salerno, ksalerno@pha.jhu.edu, 11 May 18 fix accelerate/cos, Zheng Gong (ENS de Lyon), z.gong@outlook.com, 24 Apr 20 -fix addtorque, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 fix ave/correlate/long, Jorge Ramirez (UPM Madrid), jorge.ramirez at upm.es, 21 Oct 2015 fix electron/stopping/fit, James Stewart (SNL), jstewa .at. sandia.gov, 23 Sep 2020 fix electron/stopping, Konstantin Avchaciov, k.avchachov at gmail.com, 26 Feb 2019 fix ffl, David Wilkins (EPFL Lausanne), david.wilkins @ epfl.ch, 28 Sep 2018 fix filter/corotate, Lukas Fath (KIT), lukas.fath at kit.edu, 15 Mar 2017 fix flow/gauss, Joel Eaves (CU Boulder), Joel.Eaves@Colorado.edu, 23 Aug 2016 -fix gle, Michele Ceriotti (EPFL Lausanne), michele.ceriotti at gmail.com, 24 Nov 2014 -fix grem, David Stelter, dstelter@bu.edu, 22 Nov 16 fix ipi, Michele Ceriotti (EPFL Lausanne), michele.ceriotti at gmail.com, 24 Nov 2014 fix momentum/chunk, Jiang Xiao (Hong Kong Polytechnic University), polyu-xiao.jiang at connect.polyu.hk, 19 Aug 2020 fix npt/cauchy, R. E. Miller (Carleton University), F. Pavia and S. Pattamatta, 12 Jan 2020 @@ -68,43 +46,28 @@ fix orient/eco Adrian A. Schratt and Volker Mohles (Ruhr-Uni Bochum), volker.moh fix pafi, Thomas Swinburne (CNRS), swinburne at cinam.univ-mrs.fr, 1st Sep 2020 fix pimd, Yuxing Peng (U Chicago), yuxing at uchicago.edu, 24 Nov 2014 fix rhok, Ulf Pedersen (Roskilde U), ulf at urp.dk, 25 Sep 2017 -fix smd, Axel Kohlmeyer, akohlmey at gmail.com, 19 May 2008 fix ti/spring, Rodrigo Freitas (Unicamp/Brazil), rodrigohb at gmail.com, 7 Nov 2013 fix ttm/mod, Sergey Starikov and Vasily Pisarev (JIHT), pisarevvv at gmail.com, 2 Feb 2015 fix wall/ees, Abdoreza Ershadinia, a.ershadinia at gmail.com, Jul 2017 fix wall/reflect/stochastic, Quy-Dong To (U Gustave Eiffel), toquydong at gmail.com, Jan 2020 fix wall/region/ees, Abdoreza Ershadinia, a.ershadinia at gmail.com, Jul 2017 -improper_style cossq, Georgios Vogiatzis, gvog at chemeng.ntua.gr, 25 May 12 -improper_style fourier, Loukas Peristeras, loukas.peristeras at scienomics.com, 27 Oct 12 -improper_style ring, Georgios Vogiatzis, gvog at chemeng.ntua.gr, 25 May 12 -improper_style distance, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style agni, Axel Kohlmeyer, akohlmey at gmail.com, 9 Nov 16 pair_style buck/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style cosine/squared, Eugen Rozic, eugen.rozic.17 at ucl.ac.uk, 9 Aug 19 pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 -pair_style coul/shield, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 pair_style coul/slater/cut, Evangelos Voyiatzis, evoyiatzis at gmail.com, 26 February 2020 pair_style coul/slater/long, Evangelos Voyiatzis, evoyiatzis at gmail.com, 26 February 2020 pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style e3b, Steven Strong (U Chicago), stevene.strong at gmail dot com, 16 Apr 19 -pair_style drip, Mingjian Wen, University of Minnesota, wenxx151 at umn.edu, 17 Apr 19 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 -pair_style ilp/graphene/hbn, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 -pair_style lebedeva/z, Zbigniew Koziol (National Center for Nuclear Research), softquake at gmail dot com, 4 Jan 19 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 -pair_style list, Axel Kohlmeyer (Temple U), akohlmey at gmail.com, 1 Jun 13 pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style local/density, Tanmoy Sanyal (tanmoy dot 7989 at gmail.com) and M. Scott Shell (UCSB), and David Rosenberger (TU Darmstadt), 9 Sept 19 -pair_style kolmogorov/crespi/full, Wengen Ouyang (Tel Aviv University), w.g.ouyang at gmail dot com, 30 Mar 18 -pair_style kolmogorov/crespi/z, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Feb 17 pair_style meam/spline, Alexander Stukowski (LLNL), alex at stukowski.com, 1 Feb 12 pair_style meam/sw/spline, Robert Rudd (LLNL), robert.rudd at llnl.gov, 1 Oct 12 pair_style morse/smooth/linear, Stefan Paquay (TU Eindhoven), stefanpaquay at gmail.com, 29 Feb 16 -pair_style srp, Tim Sirk, tim.sirk at us.army.mil, 21 Nov 14 pair_style tersoff/table, Luca Ferraro, luca.ferraro@caspur.it, 1 Dec 11 pair_style momb, Kristen Fichthorn, Tonnam Balankura, Ya Zhou, fichthorn@psu.edu, 18 Mar 17 pair_style wf_cut, Simon Ramirez-Hinestrosa, Xipeng Wang, sr802 at cam.ac.uk, 4 Nov 20 -temper/grem, David Stelter, dstelter@bu.edu, 22 Nov 16 -temper/npt, Amulya K. Pervaje, Cody K. Addington, amulyapervaje@gmail.com , 31 Aug 17 From 2e0ed643e406b5f9cd2cb7200975958faaad79db Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Jul 2021 16:54:18 -0400 Subject: [PATCH 087/352] update and reformat --- src/DIPOLE/angle_dipole.cpp | 117 +++++++++++++++++++----------------- src/DIPOLE/angle_dipole.h | 13 ++-- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/src/DIPOLE/angle_dipole.cpp b/src/DIPOLE/angle_dipole.cpp index 38f13a47bd..f7724e2b56 100644 --- a/src/DIPOLE/angle_dipole.cpp +++ b/src/DIPOLE/angle_dipole.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -18,16 +17,16 @@ #include "angle_dipole.h" -#include #include "atom.h" -#include "neighbor.h" -#include "domain.h" #include "comm.h" +#include "domain.h" +#include "error.h" #include "force.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "neighbor.h" +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -55,16 +54,16 @@ AngleDipole::~AngleDipole() void AngleDipole::compute(int eflag, int vflag) { - int iRef,iDip,iDummy,n,type; - double delx,dely,delz; - double eangle,tangle,fi[3],fj[3]; - double r,cosGamma,deltaGamma,kdg,rmu; + int iRef, iDip, iDummy, n, type; + double delx, dely, delz; + double eangle, tangle, fi[3], fj[3]; + double r, cosGamma, deltaGamma, kdg, rmu; eangle = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); - double **x = atom->x; // position vector - double **mu = atom->mu; // point-dipole components and moment magnitude + double **x = atom->x; // position vector + double **mu = atom->mu; // point-dipole components and moment magnitude double **torque = atom->torque; int **anglelist = neighbor->anglelist; int nanglelist = neighbor->nanglelist; @@ -75,45 +74,44 @@ void AngleDipole::compute(int eflag, int vflag) double delTx, delTy, delTz; double fx, fy, fz, fmod, fmod_sqrtff; - if (!newton_bond) - error->all(FLERR,"'newton' flag for bonded interactions must be 'on'"); + if (!newton_bond) error->all(FLERR, "'newton' flag for bonded interactions must be 'on'"); for (n = 0; n < nanglelist; n++) { - iDip = anglelist[n][0]; // dipole whose orientation is to be restrained - iRef = anglelist[n][1]; // reference atom toward which dipole will point - iDummy = anglelist[n][2]; // dummy atom - irrelevant to the interaction + iDip = anglelist[n][0]; // dipole whose orientation is to be restrained + iRef = anglelist[n][1]; // reference atom toward which dipole will point + iDummy = anglelist[n][2]; // dummy atom - irrelevant to the interaction type = anglelist[n][3]; delx = x[iRef][0] - x[iDip][0]; dely = x[iRef][1] - x[iDip][1]; delz = x[iRef][2] - x[iDip][2]; - r = sqrt(delx*delx + dely*dely + delz*delz); + r = sqrt(delx * delx + dely * dely + delz * delz); rmu = r * mu[iDip][3]; - cosGamma = (mu[iDip][0]*delx+mu[iDip][1]*dely+mu[iDip][2]*delz) / rmu; + cosGamma = (mu[iDip][0] * delx + mu[iDip][1] * dely + mu[iDip][2] * delz) / rmu; deltaGamma = cosGamma - cos(gamma0[type]); kdg = k[type] * deltaGamma; - if (eflag) eangle = kdg * deltaGamma; // energy + if (eflag) eangle = kdg * deltaGamma; // energy tangle = 2.0 * kdg / rmu; - delTx = tangle * (dely*mu[iDip][2] - delz*mu[iDip][1]); - delTy = tangle * (delz*mu[iDip][0] - delx*mu[iDip][2]); - delTz = tangle * (delx*mu[iDip][1] - dely*mu[iDip][0]); + delTx = tangle * (dely * mu[iDip][2] - delz * mu[iDip][1]); + delTy = tangle * (delz * mu[iDip][0] - delx * mu[iDip][2]); + delTz = tangle * (delx * mu[iDip][1] - dely * mu[iDip][0]); torque[iDip][0] += delTx; torque[iDip][1] += delTy; torque[iDip][2] += delTz; // Force couple that counterbalances dipolar torque - fx = dely*delTz - delz*delTy; // direction (fi): - r x (-T) - fy = delz*delTx - delx*delTz; - fz = delx*delTy - dely*delTx; + fx = dely * delTz - delz * delTy; // direction (fi): - r x (-T) + fy = delz * delTx - delx * delTz; + fz = delx * delTy - dely * delTx; - fmod = sqrt(delTx*delTx + delTy*delTy + delTz*delTz) / r; // magnitude - fmod_sqrtff = fmod / sqrt(fx*fx + fy*fy + fz*fz); + fmod = sqrt(delTx * delTx + delTy * delTy + delTz * delTz) / r; // magnitude + fmod_sqrtff = fmod / sqrt(fx * fx + fy * fy + fz * fz); fi[0] = fx * fmod_sqrtff; fi[1] = fy * fmod_sqrtff; @@ -131,9 +129,9 @@ void AngleDipole::compute(int eflag, int vflag) f[iRef][1] += fi[1]; f[iRef][2] += fi[2]; - if (evflag) // virial = rij.fi = 0 (fj = -fi & fk = 0) - ev_tally(iRef,iDip,iDummy,nlocal,newton_bond,eangle,fj,fi, - 0.0,0.0,0.0,0.0,0.0,0.0); + if (evflag) // virial = rij.fi = 0 (fj = -fi & fk = 0) + ev_tally(iRef, iDip, iDummy, nlocal, newton_bond, eangle, fj, fi, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0); } } @@ -144,10 +142,10 @@ void AngleDipole::allocate() allocated = 1; int n = atom->nangletypes; - memory->create(k,n+1,"angle:k"); - memory->create(gamma0,n+1,"angle:gamma0"); + memory->create(k, n + 1, "angle:k"); + memory->create(gamma0, n + 1, "angle:gamma0"); - memory->create(setflag,n+1,"angle:setflag"); + memory->create(setflag, n + 1, "angle:setflag"); for (int i = 1; i <= n; i++) setflag[i] = 0; } @@ -157,26 +155,36 @@ void AngleDipole::allocate() void AngleDipole::coeff(int narg, char **arg) { - if (narg != 3) error->all(FLERR,"Incorrect args for angle coefficients"); + if (narg != 3) error->all(FLERR, "Incorrect args for angle coefficients"); if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nangletypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->nangletypes, ilo, ihi, error); - double k_one = utils::numeric(FLERR,arg[1],false,lmp); - double gamma0_one = utils::numeric(FLERR,arg[2],false,lmp); + double k_one = utils::numeric(FLERR, arg[1], false, lmp); + double gamma0_one = utils::numeric(FLERR, arg[2], false, lmp); // convert gamma0 from degrees to radians int count = 0; for (int i = ilo; i <= ihi; i++) { k[i] = k_one; - gamma0[i] = gamma0_one/180.0 * MY_PI; + gamma0[i] = gamma0_one / 180.0 * MY_PI; setflag[i] = 1; count++; } - if (count == 0) error->all(FLERR,"Incorrect args for angle coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for angle coefficients"); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more types +------------------------------------------------------------------------- */ + +void AngleDipole::init_style() +{ + if (!atom->mu_flag || !atom->torque_flag) + error->all(FLERR,"Angle style dipole requires atom attributes mu and torque"); } /* ---------------------------------------------------------------------- @@ -194,8 +202,8 @@ double AngleDipole::equilibrium_angle(int i) void AngleDipole::write_restart(FILE *fp) { - fwrite(&k[1],sizeof(double),atom->nangletypes,fp); - fwrite(&gamma0[1],sizeof(double),atom->nangletypes,fp); + fwrite(&k[1], sizeof(double), atom->nangletypes, fp); + fwrite(&gamma0[1], sizeof(double), atom->nangletypes, fp); } /* ---------------------------------------------------------------------- @@ -207,11 +215,11 @@ void AngleDipole::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - utils::sfread(FLERR,&k[1],sizeof(double),atom->nangletypes,fp,nullptr,error); - utils::sfread(FLERR,&gamma0[1],sizeof(double),atom->nangletypes,fp,nullptr,error); + utils::sfread(FLERR, &k[1], sizeof(double), atom->nangletypes, fp, nullptr, error); + utils::sfread(FLERR, &gamma0[1], sizeof(double), atom->nangletypes, fp, nullptr, error); } - MPI_Bcast(&k[1],atom->nangletypes,MPI_DOUBLE,0,world); - MPI_Bcast(&gamma0[1],atom->nangletypes,MPI_DOUBLE,0,world); + MPI_Bcast(&k[1], atom->nangletypes, MPI_DOUBLE, 0, world); + MPI_Bcast(&gamma0[1], atom->nangletypes, MPI_DOUBLE, 0, world); for (int i = 1; i <= atom->nangletypes; i++) setflag[i] = 1; } @@ -222,8 +230,7 @@ void AngleDipole::read_restart(FILE *fp) void AngleDipole::write_data(FILE *fp) { - for (int i = 1; i <= atom->nangletypes; i++) - fprintf(fp,"%d %g %g\n",i,k[i],gamma0[i]); + for (int i = 1; i <= atom->nangletypes; i++) fprintf(fp, "%d %g %g\n", i, k[i], gamma0[i]); } /* ---------------------------------------------------------------------- @@ -232,20 +239,20 @@ void AngleDipole::write_data(FILE *fp) double AngleDipole::single(int type, int iRef, int iDip, int /*iDummy*/) { - double **x = atom->x; // position vector - double **mu = atom->mu; // point-dipole components and moment magnitude + double **x = atom->x; // position vector + double **mu = atom->mu; // point-dipole components and moment magnitude double delx = x[iRef][0] - x[iDip][0]; double dely = x[iRef][1] - x[iDip][1]; double delz = x[iRef][2] - x[iDip][2]; - domain->minimum_image(delx,dely,delz); + domain->minimum_image(delx, dely, delz); - double r = sqrt(delx*delx + dely*dely + delz*delz); + double r = sqrt(delx * delx + dely * dely + delz * delz); double rmu = r * mu[iDip][3]; - double cosGamma = (mu[iDip][0]*delx+mu[iDip][1]*dely+mu[iDip][2]*delz) / rmu; + double cosGamma = (mu[iDip][0] * delx + mu[iDip][1] * dely + mu[iDip][2] * delz) / rmu; double deltaGamma = cosGamma - cos(gamma0[type]); double kdg = k[type] * deltaGamma; - return kdg * deltaGamma; // energy + return kdg * deltaGamma; // energy } diff --git a/src/DIPOLE/angle_dipole.h b/src/DIPOLE/angle_dipole.h index e74947da9e..d94315c5aa 100644 --- a/src/DIPOLE/angle_dipole.h +++ b/src/DIPOLE/angle_dipole.h @@ -29,12 +29,13 @@ class AngleDipole : public Angle { AngleDipole(class LAMMPS *); virtual ~AngleDipole(); virtual void compute(int, int); - void coeff(int, char **); - double equilibrium_angle(int); - void write_restart(FILE *); - void read_restart(FILE *); - void write_data(FILE *); - double single(int, int, int, int); + virtual void init_style(); + virtual void coeff(int, char **); + virtual double equilibrium_angle(int); + virtual void write_restart(FILE *); + virtual void read_restart(FILE *); + virtual void write_data(FILE *); + virtual double single(int, int, int, int); protected: double *k, *gamma0; From f4239530bd886c636d8e6b960318f55a398f2317 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Jul 2021 15:58:27 -0400 Subject: [PATCH 088/352] recover virial and nofdotr related changes by @athomps and @akohlmey --- src/ML-IAP/pair_mliap.cpp | 3 +- src/OPENMP/pair_reaxc_omp.cpp | 3 - src/OPENMP/pair_reaxc_omp.h | 28 +++-- src/OPENMP/reaxc_bond_orders_omp.cpp | 123 ++-------------------- src/OPENMP/reaxc_bonds_omp.cpp | 8 +- src/OPENMP/reaxc_forces_omp.cpp | 31 ++---- src/OPENMP/reaxc_hydrogen_bonds_omp.cpp | 60 ++++------- src/OPENMP/reaxc_multi_body_omp.cpp | 12 +-- src/OPENMP/reaxc_nonbonded_omp.cpp | 38 ++----- src/OPENMP/reaxc_torsion_angles_omp.cpp | 99 ++++++------------ src/OPENMP/reaxc_valence_angles_omp.cpp | 32 ++---- src/REAXFF/pair_reaxc.cpp | 3 - src/REAXFF/reaxc_bond_orders.cpp | 129 +++--------------------- src/REAXFF/reaxc_bonds.cpp | 11 +- src/REAXFF/reaxc_control.cpp | 1 - src/REAXFF/reaxc_forces.cpp | 14 +-- src/REAXFF/reaxc_hydrogen_bonds.cpp | 41 ++------ src/REAXFF/reaxc_multi_body.cpp | 12 +-- src/REAXFF/reaxc_nonbonded.cpp | 32 ++---- src/REAXFF/reaxc_torsion_angles.cpp | 92 ++++------------- src/REAXFF/reaxc_valence_angles.cpp | 48 +++------ src/REAXFF/reaxff_api.h | 5 +- src/REAXFF/reaxff_types.h | 1 - src/USER-MISC/pair_drip.cpp | 33 ++---- src/pair.cpp | 58 ++++++----- src/pair.h | 2 +- 26 files changed, 244 insertions(+), 675 deletions(-) diff --git a/src/ML-IAP/pair_mliap.cpp b/src/ML-IAP/pair_mliap.cpp index 0d2a80635a..64c5a547be 100644 --- a/src/ML-IAP/pair_mliap.cpp +++ b/src/ML-IAP/pair_mliap.cpp @@ -264,8 +264,7 @@ void PairMLIAP::e_tally(MLIAPData* data) add virial contribution into global and per-atom accumulators ------------------------------------------------------------------------- */ -void PairMLIAP::v_tally(int i, int j, - double *fij, double *rij) +void PairMLIAP::v_tally(int i, int j, double *fij, double *rij) { double v[6]; diff --git a/src/OPENMP/pair_reaxc_omp.cpp b/src/OPENMP/pair_reaxc_omp.cpp index 87190f5285..2596f8390b 100644 --- a/src/OPENMP/pair_reaxc_omp.cpp +++ b/src/OPENMP/pair_reaxc_omp.cpp @@ -233,9 +233,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) api->control->virial = 1; - else api->control->virial = 0; - if (vflag_atom) error->all(FLERR,"Pair style reax/c/omp does not support " "computing per-atom stress"); diff --git a/src/OPENMP/pair_reaxc_omp.h b/src/OPENMP/pair_reaxc_omp.h index 895dc646af..d8152656ff 100644 --- a/src/OPENMP/pair_reaxc_omp.h +++ b/src/OPENMP/pair_reaxc_omp.h @@ -47,33 +47,49 @@ class PairReaxCOMP : public PairReaxC, public ThrOMP { reduce_thr(styleparm, eflagparm, vflagparm, thrparm); } - inline void ev_tally_thr_proxy(Pair *const pairparm, const int iparm, const int jparm, + inline void ev_tally_thr_proxy(const int iparm, const int jparm, const int nlocalparm, const int newton_pairparm, const double evdwlparm, const double ecoulparm, const double fpairparm, const double delxparm, const double delyparm, const double delzparm, ThrData *const thrparm) { - ev_tally_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, + ev_tally_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, fpairparm, delxparm, delyparm, delzparm, thrparm); } - inline void ev_tally_xyz_thr_proxy(Pair *const pairparm, const int iparm, const int jparm, + inline void ev_tally_xyz_thr_proxy(const int iparm, const int jparm, const int nlocalparm, const int newton_pairparm, const double evdwlparm, const double ecoulparm, const double fxparm, const double fyparm, const double fzparm, const double delxparm, const double delyparm, const double delzparm, ThrData *const thrparm) { - ev_tally_xyz_thr(pairparm, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, + ev_tally_xyz_thr(this, iparm, jparm, nlocalparm, newton_pairparm, evdwlparm, ecoulparm, fxparm, fyparm, fzparm, delxparm, delyparm, delzparm, thrparm); } - inline void ev_tally3_thr_proxy(Pair *const pairparm, int i, int j, int k, double evdwl, + inline void ev_tally3_thr_proxy(int i, int j, int k, double evdwl, double ecoul, double *fj, double *fk, double *drji, double *drki, ThrData *const thrparm) { - ev_tally3_thr(pairparm, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm); + ev_tally3_thr(this, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm); + } + + inline void v_tally3_thr_proxy(const int i, const int j, const int k, const double *const fi, + const double *const fk, const double *const drij, + const double *const drkj, ThrData *const thrparm) + { + v_tally3_thr(this, i, j, k, fi, fk, drij, drkj, thrparm); + } + + inline void v_tally4_thr_proxy(const int i, const int j, const int k, const int l, + const double *const fi, const double *const fj, + const double *const fk, const double *const dril, + const double *const drjl, const double *const drkl, + ThrData *const thrparm) + { + v_tally4_thr(this, i, j, k, l, fi, fj, fk, dril, drjl, drkl, thrparm); } protected: diff --git a/src/OPENMP/reaxc_bond_orders_omp.cpp b/src/OPENMP/reaxc_bond_orders_omp.cpp index 22d7fe1e6e..9c026ee95c 100644 --- a/src/OPENMP/reaxc_bond_orders_omp.cpp +++ b/src/OPENMP/reaxc_bond_orders_omp.cpp @@ -37,109 +37,6 @@ using namespace LAMMPS_NS; namespace ReaxFF { - void Add_dBond_to_Forces_NPTOMP(reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) { - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - rvec temp; - int pk, k, j; - - int tid = get_tid(); - long reductionOffset = (system->N * tid); - - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); - - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - - - /************************************ - * forces related to atom i * - * first neighbors of atom i * - ************************************/ - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ - rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ - - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - } - - /* then atom i itself */ - rvec_Scale(temp, coef.C1dbo, bo_ij->dBOp); /*1st,dBO*/ - rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); /*2nd,dBO*/ - rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); /*1st,dBO*/ - rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]);/*2nd,dBO*/ - rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ - rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ - rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ - - rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBO_pi2*/ - rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBO_pi2*/ - rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]);/*3rd*/ - - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+i],temp); - - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale(temp, -coef.C3dbo, nbr_k->bo_data.dBOp); /*3rd,dBO*/ - rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ - - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - } - - /* then atom j itself */ - rvec_Scale(temp, -coef.C1dbo, bo_ij->dBOp); /*1st, dBO*/ - rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); /*1st, dBO*/ - rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - - rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ - rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ - rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ - - rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBOpi2*/ - rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBOpi2*/ - rvec_ScaledAdd(temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ - - /* force */ - rvec_Add(workspace->forceReduction[reductionOffset+j],temp); - } - -/* ---------------------------------------------------------------------- */ - void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; @@ -196,11 +93,11 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+i],temp); - if (system->pair_ptr->vflag_atom) { + if (system->pair_ptr->vflag_either) { rvec_Scale(fi_tmp, -1.0, temp); rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,i,j,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(i,j,system->N,0,0,0, fi_tmp[0],fi_tmp[1],fi_tmp[2], delij[0],delij[1],delij[2],thr); } @@ -217,11 +114,11 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+j],temp); - if (system->pair_ptr->vflag_atom) { + if (system->pair_ptr->vflag_either) { rvec_Scale(fj_tmp, -1.0, temp); rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,j,i,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(j,i,system->N,0,0,0, fj_tmp[0],fj_tmp[1],fj_tmp[2], delji[0],delji[1],delji[2],thr); } @@ -236,16 +133,16 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - if (system->pair_ptr->vflag_atom) { + if (system->pair_ptr->vflag_either) { rvec_Scale(fk_tmp, -1.0, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(k,i,system->N,0,0,0, fk_tmp[0],fk_tmp[1],fk_tmp[2], delki[0],delki[1],delki[2],thr); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(k,j,system->N,0,0,0, fk_tmp[0],fk_tmp[1],fk_tmp[2], delkj[0],delkj[1],delkj[2],thr); } @@ -261,17 +158,17 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+k],temp); - if (system->pair_ptr->vflag_atom) { + if (system->pair_ptr->vflag_either) { rvec_Scale(fk_tmp, -1.0, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,i,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(k,i,system->N,0,0,0, fk_tmp[0],fk_tmp[1],fk_tmp[2], delki[0],delki[1],delki[2],thr); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(system->pair_ptr,k,j,system->N,0,0,0, + pair_reax_ptr->ev_tally_xyz_thr_proxy(k,j,system->N,0,0,0, fk_tmp[0],fk_tmp[1],fk_tmp[2], delkj[0],delkj[1],delkj[2],thr); } diff --git a/src/OPENMP/reaxc_bonds_omp.cpp b/src/OPENMP/reaxc_bonds_omp.cpp index 9380aad5af..2357d20690 100644 --- a/src/OPENMP/reaxc_bonds_omp.cpp +++ b/src/OPENMP/reaxc_bonds_omp.cpp @@ -121,8 +121,8 @@ namespace ReaxFF { -twbp->De_pp * bo_ij->BO_pi2; /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); /* calculate derivatives of Bond Orders */ @@ -152,8 +152,8 @@ namespace ReaxFF { (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); bo_ij->Cdbo += decobdbo; diff --git a/src/OPENMP/reaxc_forces_omp.cpp b/src/OPENMP/reaxc_forces_omp.cpp index 18c9419723..26f36f1357 100644 --- a/src/OPENMP/reaxc_forces_omp.cpp +++ b/src/OPENMP/reaxc_forces_omp.cpp @@ -119,33 +119,16 @@ namespace ReaxFF { } } - if (control->virial == 0) { - #if defined(_OPENMP) #pragma omp for schedule(dynamic,50) #endif - for (i = 0; i < system->N; ++i) { - const int startj = Start_Index(i, bonds); - const int endj = End_Index(i, bonds); - for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) - Add_dBond_to_ForcesOMP(system, i, pj, workspace, lists); - } - - } else { - -#if defined(_OPENMP) -#pragma omp for schedule(dynamic,50) -#endif - for (i = 0; i < system->N; ++i) { - const int startj = Start_Index(i, bonds); - const int endj = End_Index(i, bonds); - for (pj = startj; pj < endj; ++pj) - if (i < bonds->select.bond_list[pj].nbr) - Add_dBond_to_Forces_NPTOMP(system, i, pj, workspace, lists); - } - - } // if (virial == 0) + for (i = 0; i < system->N; ++i) { + const int startj = Start_Index(i, bonds); + const int endj = End_Index(i, bonds); + for (pj = startj; pj < endj; ++pj) + if (i < bonds->select.bond_list[pj].nbr) + Add_dBond_to_ForcesOMP(system, i, pj, workspace, lists); + } pair_reax_ptr->reduce_thr_proxy(system->pair_ptr, 0, 1, thr); diff --git a/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp b/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp index d3adedd5b1..1b174aef81 100644 --- a/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp @@ -43,7 +43,7 @@ namespace ReaxFF { /* ---------------------------------------------------------------------- */ void Hydrogen_BondsOMP(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, reax_list **lists) + simulation_data *data, storage *workspace, reax_list **lists) { const int nthreads = control->nthreads; @@ -58,11 +58,10 @@ namespace ReaxFF { int hblist[MAX_BONDS]; int itr, top; int num_hb_intrs = 0; - ivec rel_jk; double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; double e_hb, e_hb_thr = 0.0, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force; + rvec dvec_jk; hbond_parameters *hbp; bond_order_data *bo_ij; bond_data *pbond_ij; @@ -119,7 +118,7 @@ namespace ReaxFF { bo_ij = &(pbond_ij->bo_data); if (system->reax_param.sbp[type_i].p_hbond == 2 && - bo_ij->BO >= HB_THRESHOLD) + bo_ij->BO >= HB_THRESHOLD) hblist[top++] = pi; } @@ -145,11 +144,11 @@ namespace ReaxFF { ++num_hb_intrs; Calculate_Theta(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &theta, &cos_theta); + &theta, &cos_theta); /* the derivative of cos(theta) */ Calculate_dCos_ThetaOMP(pbond_ij->dvec, pbond_ij->d, dvec_jk, r_jk, - &dcos_theta_di, &dcos_theta_dj, - &dcos_theta_dk); + &dcos_theta_di, &dcos_theta_dj, + &dcos_theta_dk); /* hydrogen bond energy*/ sin_theta2 = sin(theta/2.0); @@ -158,7 +157,7 @@ namespace ReaxFF { cos_xhz1 = (1.0 - cos_theta); exp_hb2 = exp(-hbp->p_hb2 * bo_ij->BO); exp_hb3 = exp(-hbp->p_hb3 * (hbp->r0_hb / r_jk + - r_jk / hbp->r0_hb - 2.0)); + r_jk / hbp->r0_hb - 2.0)); e_hb_thr += e_hb = hbp->p_hb1 * (1.0 - exp_hb2) * exp_hb3 * sin_xhz4; @@ -170,51 +169,28 @@ namespace ReaxFF { /* hydrogen bond forces */ bo_ij->Cdbo += CEhb1; // dbo term - if (control->virial == 0) { - // dcos terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk); - // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk); - } - else { - /* for pressure coupling, terms that are not related to bond order - derivatives are added directly into pressure vector/tensor */ - rvec_Scale(force, +CEhb2, dcos_theta_di); // dcos terms - rvec_Add(workspace->forceReduction[reductionOffset+i], force); - - - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj); - - ivec_Scale(rel_jk, hbond_list[pk].scl, nbr_jk->rel_box); - rvec_Scale(force, +CEhb2, dcos_theta_dk); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - // dr terms - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j],-CEhb3/r_jk, dvec_jk); - - rvec_Scale(force, CEhb3/r_jk, dvec_jk); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - } + // dcos terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], +CEhb2, dcos_theta_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], +CEhb2, dcos_theta_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb2, dcos_theta_dk); + // dr terms + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], -CEhb3/r_jk, dvec_jk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], +CEhb3/r_jk, dvec_jk); /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - rvec_ScaledSum(delij, 1., system->my_atoms[j].x, - -1., system->my_atoms[i].x); - rvec_ScaledSum(delkj, 1., system->my_atoms[j].x, - -1., system->my_atoms[k].x); + if (system->pair_ptr->vflag_either || system->pair_ptr->eflag_either) { + rvec_ScaledSum(delij, 1., system->my_atoms[j].x, -1., system->my_atoms[i].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[j].x, -1., system->my_atoms[k].x); rvec_Scale(fi_tmp, CEhb2, dcos_theta_di); rvec_Scale(fk_tmp, CEhb2, dcos_theta_dk); rvec_ScaledAdd(fk_tmp, CEhb3/r_jk, dvec_jk); - pair_reax_ptr->ev_tally3_thr_proxy(system->pair_ptr,i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj,thr); + pair_reax_ptr->ev_tally3_thr_proxy(i,j,k,e_hb,0.0,fi_tmp,fk_tmp,delij,delkj,thr); } } } } - } } #if defined(_OPENMP) diff --git a/src/OPENMP/reaxc_multi_body_omp.cpp b/src/OPENMP/reaxc_multi_body_omp.cpp index 7d338511d6..6b7a7c76f4 100644 --- a/src/OPENMP/reaxc_multi_body_omp.cpp +++ b/src/OPENMP/reaxc_multi_body_omp.cpp @@ -118,8 +118,8 @@ namespace ReaxFF { if (numbonds > 0) workspace->CdDelta[i] += CElp; // lp - 1st term /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( i, i, system->n, 1, e_lp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); /* correction for C2 */ @@ -145,8 +145,8 @@ namespace ReaxFF { workspace->CdDelta[i] += deahu2dsbo; /* tally into per-atom energy */ - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, system->n, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( i, j, system->n, 1, e_lph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); } } @@ -229,10 +229,10 @@ namespace ReaxFF { p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; /* tally into per-atom energy */ - if (system->pair_ptr->evflag) { + if (system->pair_ptr->eflag_either) { eng_tmp = e_ov; if (numbonds > 0) eng_tmp+= e_un; - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, i, system->n, 1, + pair_reax_ptr->ev_tally_thr_proxy( i, i, system->n, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); } diff --git a/src/OPENMP/reaxc_nonbonded_omp.cpp b/src/OPENMP/reaxc_nonbonded_omp.cpp index e6feb0b497..595731b005 100644 --- a/src/OPENMP/reaxc_nonbonded_omp.cpp +++ b/src/OPENMP/reaxc_nonbonded_omp.cpp @@ -64,7 +64,6 @@ namespace ReaxFF { double e_ele, e_vdW, e_core; const double SMALL = 0.0001; double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp; two_body_parameters *twbp; far_neighbor_data *nbr_pj; @@ -203,23 +202,14 @@ namespace ReaxFF { rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, + pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, pe_vdw, e_ele, f_tmp, delij[0], delij[1], delij[2], thr); } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], - +(CEvd + CEclmb), nbr_pj->dvec); - } else { /* NPT, iNPT or sNPT */ - /* for pressure coupling, terms not related to bond order - derivatives are added directly into pressure vector/tensor */ - - rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); - rvec_ScaledAdd(workspace->f[reductionOffset+i], -1., temp); - rvec_Add(workspace->forceReduction[reductionOffset+j], temp); - } + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+j], + +(CEvd + CEclmb), nbr_pj->dvec); } } } @@ -257,7 +247,6 @@ namespace ReaxFF { double e_vdW, e_ele; double CEvd, CEclmb; double f_tmp, delij[3]; - rvec temp; far_neighbor_data *nbr_pj; LR_lookup_table *t; @@ -332,26 +321,17 @@ namespace ReaxFF { CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + if (system->pair_ptr->evflag) { rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, 1, e_vdW, e_ele, + pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, e_vdW, e_ele, f_tmp, delij[0], delij[1], delij[2], thr); } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); - rvec_ScaledAdd(workspace->forceReduction[froffset+j], - +(CEvd + CEclmb), nbr_pj->dvec); - } else { // NPT, iNPT or sNPT - /* for pressure coupling, terms not related to bond order derivatives - are added directly into pressure vector/tensor */ - rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); - - rvec_ScaledAdd(workspace->f[i], -1., temp); - rvec_Add(workspace->forceReduction[froffset+j], temp); - } + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->forceReduction[froffset+j], + +(CEvd + CEclmb), nbr_pj->dvec); } } } diff --git a/src/OPENMP/reaxc_torsion_angles_omp.cpp b/src/OPENMP/reaxc_torsion_angles_omp.cpp index f3283ef93c..83f49e96de 100644 --- a/src/OPENMP/reaxc_torsion_angles_omp.cpp +++ b/src/OPENMP/reaxc_torsion_angles_omp.cpp @@ -87,8 +87,6 @@ namespace ReaxFF { double CEconj4, CEconj5, CEconj6; double e_tor, e_con; rvec dvec_li; - rvec force; - ivec rel_box_jl; four_body_header *fbh; four_body_parameters *fbp; bond_data *pbond_ij, *pbond_jk, *pbond_kl; @@ -319,72 +317,34 @@ namespace ReaxFF { //bo_kl->Cdbo += (CEtors6 + CEconj3); bo_kl->CdboReduction[tid] += (CEtors6 + CEconj3); - if (control->virial == 0) { - /* dcos_theta_ijk */ - rvec_ScaledAdd(workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], - CEtors7 + CEconj4, p_ijk->dcos_dk); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], - CEtors7 + CEconj4, p_ijk->dcos_di); + /* dcos_theta_ijk */ + rvec_ScaledAdd(workspace->f[j], + CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], + CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors7 + CEconj4, p_ijk->dcos_di); - /* dcos_theta_jkl */ - rvec_ScaledAdd(workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], - CEtors8 + CEconj5, p_jkl->dcos_dj); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], - CEtors8 + CEconj5, p_jkl->dcos_dk); + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], + CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], + CEtors8 + CEconj5, p_jkl->dcos_dk); - /* dcos_omega */ - rvec_ScaledAdd(workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], - CEtors9 + CEconj6, dcos_omega_di); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], - CEtors9 + CEconj6, dcos_omega_dk); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], - CEtors9 + CEconj6, dcos_omega_dl); - } - else { - ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); - - /* dcos_theta_ijk */ - rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_dk); - rvec_Add(workspace->forceReduction[reductionOffset+i], force); - - rvec_ScaledAdd(workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj); - - rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_di); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - - /* dcos_theta_jkl */ - rvec_ScaledAdd(workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di); - - rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dj); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - - rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dk); - rvec_Add(workspace->forceReduction[reductionOffset+l], force); - - /* dcos_omega */ - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_di); - rvec_Add(workspace->forceReduction[reductionOffset+i], force); - - rvec_ScaledAdd(workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj); - - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dk); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dl); - rvec_Add(workspace->forceReduction[reductionOffset+i], force); - } + /* dcos_omega */ + rvec_ScaledAdd(workspace->f[j], + CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], + CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], + CEtors9 + CEconj6, dcos_omega_dk); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+l], + CEtors9 + CEconj6, dcos_omega_dl); /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + if (system->pair_ptr->evflag) { // acquire vectors rvec_ScaledSum(delil, 1., system->my_atoms[l].x, @@ -410,14 +370,13 @@ namespace ReaxFF { // tally eng_tmp = e_tor + e_con; - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, k, system->n, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( j, k, system->n, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - // NEED TO MAKE AN OMP VERSION OF THIS CALL! - if (system->pair_ptr->vflag_atom) - system->pair_ptr->v_tally4(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, - delil, deljl, delkl); + if (system->pair_ptr->vflag_either) + pair_reax_ptr->v_tally4_thr_proxy(i, j, k, l, fi_tmp, fj_tmp, fk_tmp, + delil, deljl, delkl, thr); } } // pl check ends diff --git a/src/OPENMP/reaxc_valence_angles_omp.cpp b/src/OPENMP/reaxc_valence_angles_omp.cpp index 5785e3c966..ed457c96fe 100644 --- a/src/OPENMP/reaxc_valence_angles_omp.cpp +++ b/src/OPENMP/reaxc_valence_angles_omp.cpp @@ -140,7 +140,6 @@ namespace ReaxFF { double f7_ij, f7_jk, f8_Dj, f9_Dj; double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; double BOA_ij, BOA_jk; - rvec force; // Tallying variables double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; @@ -519,26 +518,12 @@ namespace ReaxFF { bo_jt->Cdbopi2 += CEval5; } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], - CEval8, p_ijk->dcos_di); - rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], - CEval8, p_ijk->dcos_dk); - } else { - /* terms not related to bond order derivatives are - added directly into forces and pressure vector/tensor */ - rvec_Scale(force, CEval8, p_ijk->dcos_di); - rvec_Add(workspace->forceReduction[reductionOffset+i], force); - - rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - - rvec_Scale(force, CEval8, p_ijk->dcos_dk); - rvec_Add(workspace->forceReduction[reductionOffset+k], force); - } + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+i], CEval8, p_ijk->dcos_di); + rvec_ScaledAdd(workspace->forceReduction[reductionOffset+k], CEval8, p_ijk->dcos_dk); /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + if (system->pair_ptr->evflag) { /* Acquire vectors */ rvec_ScaledSum(delij, 1., system->my_atoms[i].x, @@ -552,12 +537,11 @@ namespace ReaxFF { eng_tmp = e_ang + e_pen + e_coa; - if (system->pair_ptr->evflag) - pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, j, j, system->N, 1, + if (system->pair_ptr->eflag_either) + pair_reax_ptr->ev_tally_thr_proxy( j, j, system->N, 1, eng_tmp, 0.0, 0.0, 0.0, 0.0, 0.0, thr); - if (system->pair_ptr->vflag_atom) - // NEED TO MAKE AN OMP VERSION OF THIS CALL! - system->pair_ptr->v_tally3(i, j, k, fi_tmp, fk_tmp, delij, delkj); + if (system->pair_ptr->vflag_either) + pair_reax_ptr->v_tally3_thr_proxy(i, j, k, fi_tmp, fk_tmp, delij, delkj, thr); } } // if (p_val1>0.001) diff --git a/src/REAXFF/pair_reaxc.cpp b/src/REAXFF/pair_reaxc.cpp index 3b1d09a002..389b7d9e13 100644 --- a/src/REAXFF/pair_reaxc.cpp +++ b/src/REAXFF/pair_reaxc.cpp @@ -464,9 +464,6 @@ void PairReaxC::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) api->control->virial = 1; - else api->control->virial = 0; - api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts api->system->bigN = static_cast (atom->natoms); // all atoms in the system diff --git a/src/REAXFF/reaxc_bond_orders.cpp b/src/REAXFF/reaxc_bond_orders.cpp index 3866c61110..0e4227922b 100644 --- a/src/REAXFF/reaxc_bond_orders.cpp +++ b/src/REAXFF/reaxc_bond_orders.cpp @@ -33,106 +33,7 @@ #include namespace ReaxFF { - void Add_dBond_to_Forces_NPT(int i, int pj, storage *workspace, reax_list **lists) - { - reax_list *bonds = (*lists) + BONDS; - bond_data *nbr_j, *nbr_k; - bond_order_data *bo_ij, *bo_ji; - dbond_coefficients coef; - rvec temp; - int pk, k, j; - - /* Initializations */ - nbr_j = &(bonds->select.bond_list[pj]); - j = nbr_j->nbr; - bo_ij = &(nbr_j->bo_data); - bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); - - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - - - /************************************ - * forces related to atom i * - * first neighbors of atom i * - ************************************/ - for (pk = Start_Index(i, bonds); pk < End_Index(i, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale(temp, -coef.C2dbo, nbr_k->bo_data.dBOp); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); /*3rd, dBOpi*/ - rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp);/*3rd, dBOpi2*/ - - /* force */ - rvec_Add(workspace->f[k], temp); - } - - /* then atom i itself */ - rvec_Scale(temp, coef.C1dbo, bo_ij->dBOp); /*1st,dBO*/ - rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); /*2nd,dBO*/ - rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); /*1st,dBO*/ - rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]);/*2nd,dBO*/ - rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ - rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ - rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]);/*3rd,dBOpi*/ - - rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBO_pi2*/ - rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBO_pi2*/ - rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]);/*3rd*/ - - /* force */ - rvec_Add(workspace->f[i], temp); - - for (pk = Start_Index(j, bonds); pk < End_Index(j, bonds); ++pk) { - nbr_k = &(bonds->select.bond_list[pk]); - k = nbr_k->nbr; - - rvec_Scale(temp, -coef.C3dbo, nbr_k->bo_data.dBOp); /*3rd,dBO*/ - rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp);/*dDelta*/ - rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); /*4th,dBOpi*/ - rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp);/*4th,dBOpi2*/ - - /* force */ - rvec_Add(workspace->f[k], temp); - } - - /* then atom j itself */ - rvec_Scale(temp, -coef.C1dbo, bo_ij->dBOp); /*1st, dBO*/ - rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); /*2nd, dBO*/ - rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); /*1st, dBO*/ - rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]);/*2nd, dBO*/ - - rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); /*1st,dBOpi*/ - rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); /*2nd,dBOpi*/ - rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]);/*3rd,dBOpi*/ - - rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); /*1st,dBOpi2*/ - rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); /*2nd,dBOpi2*/ - rvec_ScaledAdd(temp,coef.C4dbopi2,workspace->dDeltap_self[j]);/*3rd,dBOpi2*/ - - /* force */ - rvec_Add(workspace->f[j], temp); - } - - void Add_dBond_to_Forces(reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) + void Add_dBond_to_Forces(reax_system *system, int i, int pj, storage *workspace, reax_list **lists) { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; @@ -180,10 +81,10 @@ namespace ReaxFF { rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]); rvec_Add(workspace->f[i], temp); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fi_tmp, -1.0, temp); + if (system->pair_ptr->vflag_either) { + rvec_Scale(fi_tmp, -0.5, temp); rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); - system->pair_ptr->v_tally(i,fi_tmp,delij); + system->pair_ptr->v_tally2_newton(i,fi_tmp,delij); } // forces on j @@ -199,10 +100,10 @@ namespace ReaxFF { rvec_ScaledAdd(temp, coef.C4dbopi2, workspace->dDeltap_self[j]); rvec_Add(workspace->f[j], temp); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fj_tmp, -1.0, temp); + if (system->pair_ptr->vflag_either) { + rvec_Scale(fj_tmp, -0.5, temp); rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); - system->pair_ptr->v_tally(j,fj_tmp,delji); + system->pair_ptr->v_tally2_newton(j,fj_tmp,delji); } // forces on k: i neighbor @@ -216,12 +117,12 @@ namespace ReaxFF { rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); rvec_Add(workspace->f[k], temp); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); + if (system->pair_ptr->vflag_either) { + rvec_Scale(fk_tmp, -0.5, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - system->pair_ptr->v_tally(k,fk_tmp,delki); + system->pair_ptr->v_tally2_newton(k,fk_tmp,delki); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - system->pair_ptr->v_tally(k,fk_tmp,delkj); + system->pair_ptr->v_tally2_newton(k,fk_tmp,delkj); } } @@ -236,12 +137,12 @@ namespace ReaxFF { rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); rvec_Add(workspace->f[k], temp); - if (system->pair_ptr->vflag_atom) { - rvec_Scale(fk_tmp, -1.0, temp); + if (system->pair_ptr->vflag_either) { + rvec_Scale(fk_tmp, -0.5, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - system->pair_ptr->v_tally(k,fk_tmp,delki); + system->pair_ptr->v_tally2_newton(k,fk_tmp,delki); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - system->pair_ptr->v_tally(k,fk_tmp,delkj); + system->pair_ptr->v_tally2_newton(k,fk_tmp,delkj); } } } diff --git a/src/REAXFF/reaxc_bonds.cpp b/src/REAXFF/reaxc_bonds.cpp index 2c83ce8144..7feea043fa 100644 --- a/src/REAXFF/reaxc_bonds.cpp +++ b/src/REAXFF/reaxc_bonds.cpp @@ -32,8 +32,7 @@ #include namespace ReaxFF { - void Bonds(reax_system *system, simulation_data *data, - storage *workspace, reax_list **lists) + void Bonds(reax_system *system, simulation_data *data, storage *workspace, reax_list **lists) { int i, j, pj, natoms; int start_i, end_i; @@ -94,8 +93,8 @@ namespace ReaxFF { -twbp->De_p * bo_ij->BO_pi -twbp->De_pp * bo_ij->BO_pi2; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(i,j,natoms,1,ebond,0.0,0.0,0.0,0.0,0.0); /* calculate derivatives of Bond Orders */ @@ -124,8 +123,8 @@ namespace ReaxFF { decobdboub = -gp10 * exphu * hulpov * (gp3*exphub1 + 25.0*gp4*exphuov*hulpov*(exphua1+exphub1)); - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(i,j,natoms,1,estriph,0.0,0.0,0.0,0.0,0.0); bo_ij->Cdbo += decobdbo; diff --git a/src/REAXFF/reaxc_control.cpp b/src/REAXFF/reaxc_control.cpp index 97fd65df9d..c84c3afe9d 100644 --- a/src/REAXFF/reaxc_control.cpp +++ b/src/REAXFF/reaxc_control.cpp @@ -71,7 +71,6 @@ namespace ReaxFF { /* assign default values */ control->nthreads = 1; control->tabulate = 0; - control->virial = 0; control->bond_cut = 5.0; control->bg_cut = 0.3; control->thb_cut = 0.001; diff --git a/src/REAXFF/reaxc_forces.cpp b/src/REAXFF/reaxc_forces.cpp index 5bb0dcca88..ec783102b4 100644 --- a/src/REAXFF/reaxc_forces.cpp +++ b/src/REAXFF/reaxc_forces.cpp @@ -47,7 +47,7 @@ namespace ReaxFF { Valence_Angles(system, control, data, workspace, lists); Torsion_Angles(system, control, data, workspace, lists); if (control->hbond_cut > 0) - Hydrogen_Bonds(system, control, data, workspace, lists); + Hydrogen_Bonds(system, data, workspace, lists); } static void Compute_NonBonded_Forces(reax_system *system, @@ -64,21 +64,15 @@ namespace ReaxFF { Tabulated_vdW_Coulomb_Energy(system, control, data, workspace, lists); } - static void Compute_Total_Force(reax_system *system, control_params *control, - storage *workspace, reax_list **lists) + static void Compute_Total_Force(reax_system *system, storage *workspace, reax_list **lists) { int i, pj; reax_list *bonds = (*lists) + BONDS; for (i = 0; i < system->N; ++i) for (pj = Start_Index(i, bonds); pj < End_Index(i, bonds); ++pj) - if (i < bonds->select.bond_list[pj].nbr) { - if (control->virial == 0) + if (i < bonds->select.bond_list[pj].nbr) Add_dBond_to_Forces(system, i, pj, workspace, lists); - else - Add_dBond_to_Forces_NPT(i, pj, workspace, lists); - } - } static void Validate_Lists(reax_system *system, reax_list **lists, @@ -387,6 +381,6 @@ namespace ReaxFF { Compute_NonBonded_Forces(system, control, data, workspace, lists); /*********** total force ***************/ - Compute_Total_Force(system, control, workspace, lists); + Compute_Total_Force(system, workspace, lists); } } diff --git a/src/REAXFF/reaxc_hydrogen_bonds.cpp b/src/REAXFF/reaxc_hydrogen_bonds.cpp index 3072968d58..5c7629ffb7 100644 --- a/src/REAXFF/reaxc_hydrogen_bonds.cpp +++ b/src/REAXFF/reaxc_hydrogen_bonds.cpp @@ -32,9 +32,7 @@ #include "pair.h" namespace ReaxFF { - void Hydrogen_Bonds(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists) + void Hydrogen_Bonds(reax_system *system, simulation_data *data, storage *workspace, reax_list **lists) { int i, j, k, pi, pk; int type_i, type_j, type_k; @@ -42,11 +40,10 @@ namespace ReaxFF { int hblist[MAX_BONDS]; int itr, top; int num_hb_intrs = 0; - ivec rel_jk; double r_jk, theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2; double e_hb, exp_hb2, exp_hb3, CEhb1, CEhb2, CEhb3; rvec dcos_theta_di, dcos_theta_dj, dcos_theta_dk; - rvec dvec_jk, force; + rvec dvec_jk; hbond_parameters *hbp; bond_order_data *bo_ij; bond_data *pbond_ij; @@ -134,34 +131,16 @@ namespace ReaxFF { /* hydrogen bond forces */ bo_ij->Cdbo += CEhb1; // dbo term - if (control->virial == 0) { - // dcos terms - rvec_ScaledAdd(workspace->f[i], +CEhb2, dcos_theta_di); - rvec_ScaledAdd(workspace->f[j], +CEhb2, dcos_theta_dj); - rvec_ScaledAdd(workspace->f[k], +CEhb2, dcos_theta_dk); - // dr terms - rvec_ScaledAdd(workspace->f[j], -CEhb3/r_jk, dvec_jk); - rvec_ScaledAdd(workspace->f[k], +CEhb3/r_jk, dvec_jk); - } - else { - rvec_Scale(force, +CEhb2, dcos_theta_di); // dcos terms - rvec_Add(workspace->f[i], force); - - rvec_ScaledAdd(workspace->f[j], +CEhb2, dcos_theta_dj); - - ivec_Scale(rel_jk, hbond_list[pk].scl, nbr_jk->rel_box); - rvec_Scale(force, +CEhb2, dcos_theta_dk); - rvec_Add(workspace->f[k], force); - - // dr terms - rvec_ScaledAdd(workspace->f[j], -CEhb3/r_jk, dvec_jk); - - rvec_Scale(force, CEhb3/r_jk, dvec_jk); - rvec_Add(workspace->f[k], force); - } + // dcos terms + rvec_ScaledAdd(workspace->f[i], +CEhb2, dcos_theta_di); + rvec_ScaledAdd(workspace->f[j], +CEhb2, dcos_theta_dj); + rvec_ScaledAdd(workspace->f[k], +CEhb2, dcos_theta_dk); + // dr terms + rvec_ScaledAdd(workspace->f[j], -CEhb3/r_jk, dvec_jk); + rvec_ScaledAdd(workspace->f[k], +CEhb3/r_jk, dvec_jk); /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + if (system->pair_ptr->evflag) { rvec_ScaledSum(delij, 1., system->my_atoms[j].x, -1., system->my_atoms[i].x); rvec_ScaledSum(delkj, 1., system->my_atoms[j].x, diff --git a/src/REAXFF/reaxc_multi_body.cpp b/src/REAXFF/reaxc_multi_body.cpp index bd1a5ccaa6..2390b54474 100644 --- a/src/REAXFF/reaxc_multi_body.cpp +++ b/src/REAXFF/reaxc_multi_body.cpp @@ -93,8 +93,8 @@ namespace ReaxFF { if (numbonds > 0 || control->enobondsflag) workspace->CdDelta[i] += CElp; // lp - 1st term - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(i,i,system->n,1,e_lp,0.0,0.0,0.0,0.0,0.0); /* correction for C2 */ @@ -119,8 +119,8 @@ namespace ReaxFF { bo_ij->Cdbo += deahu2dbo; workspace->CdDelta[i] += deahu2dsbo; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(i,j,system->n,1,e_lph,0.0,0.0,0.0,0.0,0.0); } @@ -202,8 +202,8 @@ namespace ReaxFF { CEunder4 = CEunder1 * (dfvl*workspace->Delta_lp_temp[i]) * p_ovun4 * exp_ovun1 * SQR(inv_exp_ovun1) + CEunder2; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) { + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) { eng_tmp = e_ov; if (numbonds > 0 || control->enobondsflag) eng_tmp += e_un; diff --git a/src/REAXFF/reaxc_nonbonded.cpp b/src/REAXFF/reaxc_nonbonded.cpp index e86ffe3a8b..8a1e41da29 100644 --- a/src/REAXFF/reaxc_nonbonded.cpp +++ b/src/REAXFF/reaxc_nonbonded.cpp @@ -47,8 +47,8 @@ namespace ReaxFF { (system->reax_param.sbp[type_i].eta / 2.) * SQR(q)); data->my_en.e_pol += en_tmp; - /* tally into per-atom energy */ - if (system->pair_ptr->evflag) + /* tally energy into global or per-atom energy accumulators */ + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(i,i,system->n,1,0.0,en_tmp,0.0,0.0,0.0,0.0); } } @@ -67,7 +67,6 @@ namespace ReaxFF { double dr3gamij_1, dr3gamij_3; double e_ele, e_vdW, e_core, SMALL = 0.0001; double e_lg, de_lg, r_ij5, r_ij6, re6; - rvec temp; two_body_parameters *twbp; far_neighbor_data *nbr_pj; reax_list *far_nbrs; @@ -193,7 +192,7 @@ namespace ReaxFF { (dTap - Tap * r_ij / dr3gamij_1) / dr3gamij_3; /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + if (system->pair_ptr->evflag) { pe_vdw = Tap * (e_vdW + e_core + e_lg); rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); @@ -202,15 +201,8 @@ namespace ReaxFF { f_tmp,delij[0],delij[1],delij[2]); } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); - rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); - } else { /* NPT, iNPT or sNPT */ - rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); - - rvec_ScaledAdd(workspace->f[i], -1., temp); - rvec_Add(workspace->f[j], temp); - } + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); } } } @@ -231,7 +223,6 @@ namespace ReaxFF { double CEvd, CEclmb, SMALL = 0.0001; double f_tmp, delij[3]; - rvec temp; far_neighbor_data *nbr_pj; reax_list *far_nbrs; LR_lookup_table *t; @@ -301,7 +292,7 @@ namespace ReaxFF { CEclmb *= system->my_atoms[i].q * system->my_atoms[j].q; /* tally into per-atom energy */ - if (system->pair_ptr->evflag || system->pair_ptr->vflag_atom) { + if (system->pair_ptr->evflag) { rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); f_tmp = -(CEvd + CEclmb); @@ -309,15 +300,8 @@ namespace ReaxFF { f_tmp,delij[0],delij[1],delij[2]); } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); - rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); - } else { // NPT, iNPT or sNPT - rvec_Scale(temp, CEvd + CEclmb, nbr_pj->dvec); - - rvec_ScaledAdd(workspace->f[i], -1., temp); - rvec_Add(workspace->f[j], temp); - } + rvec_ScaledAdd(workspace->f[i], -(CEvd + CEclmb), nbr_pj->dvec); + rvec_ScaledAdd(workspace->f[j], +(CEvd + CEclmb), nbr_pj->dvec); } } } diff --git a/src/REAXFF/reaxc_torsion_angles.cpp b/src/REAXFF/reaxc_torsion_angles.cpp index adbb6ffc06..329f7b8a7a 100644 --- a/src/REAXFF/reaxc_torsion_angles.cpp +++ b/src/REAXFF/reaxc_torsion_angles.cpp @@ -144,8 +144,6 @@ namespace ReaxFF { double CEconj4, CEconj5, CEconj6; double e_tor, e_con; rvec dvec_li; - rvec force; - ivec rel_box_jl; four_body_header *fbh; four_body_parameters *fbp; bond_data *pbond_ij, *pbond_jk, *pbond_kl; @@ -351,81 +349,29 @@ namespace ReaxFF { bo_jk->Cdbo += (CEtors5 + CEconj2); bo_kl->Cdbo += (CEtors6 + CEconj3); - if (control->virial == 0) { - /* dcos_theta_ijk */ - rvec_ScaledAdd(workspace->f[i], - CEtors7 + CEconj4, p_ijk->dcos_dk); - rvec_ScaledAdd(workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj); - rvec_ScaledAdd(workspace->f[k], - CEtors7 + CEconj4, p_ijk->dcos_di); + /* dcos_theta_ijk */ + rvec_ScaledAdd(workspace->f[i], CEtors7 + CEconj4, p_ijk->dcos_dk); + rvec_ScaledAdd(workspace->f[j], CEtors7 + CEconj4, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->f[k], CEtors7 + CEconj4, p_ijk->dcos_di); - /* dcos_theta_jkl */ - rvec_ScaledAdd(workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di); - rvec_ScaledAdd(workspace->f[k], - CEtors8 + CEconj5, p_jkl->dcos_dj); - rvec_ScaledAdd(workspace->f[l], - CEtors8 + CEconj5, p_jkl->dcos_dk); + /* dcos_theta_jkl */ + rvec_ScaledAdd(workspace->f[j], CEtors8 + CEconj5, p_jkl->dcos_di); + rvec_ScaledAdd(workspace->f[k], CEtors8 + CEconj5, p_jkl->dcos_dj); + rvec_ScaledAdd(workspace->f[l], CEtors8 + CEconj5, p_jkl->dcos_dk); - /* dcos_omega */ - rvec_ScaledAdd(workspace->f[i], - CEtors9 + CEconj6, dcos_omega_di); - rvec_ScaledAdd(workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj); - rvec_ScaledAdd(workspace->f[k], - CEtors9 + CEconj6, dcos_omega_dk); - rvec_ScaledAdd(workspace->f[l], - CEtors9 + CEconj6, dcos_omega_dl); - } - else { - ivec_Sum(rel_box_jl, pbond_jk->rel_box, pbond_kl->rel_box); - - /* dcos_theta_ijk */ - rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_dk); - rvec_Add(workspace->f[i], force); - - rvec_ScaledAdd(workspace->f[j], - CEtors7 + CEconj4, p_ijk->dcos_dj); - - rvec_Scale(force, CEtors7 + CEconj4, p_ijk->dcos_di); - rvec_Add(workspace->f[k], force); - - /* dcos_theta_jkl */ - rvec_ScaledAdd(workspace->f[j], - CEtors8 + CEconj5, p_jkl->dcos_di); - - rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dj); - rvec_Add(workspace->f[k], force); - - rvec_Scale(force, CEtors8 + CEconj5, p_jkl->dcos_dk); - rvec_Add(workspace->f[l], force); - - - /* dcos_omega */ - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_di); - rvec_Add(workspace->f[i], force); - - rvec_ScaledAdd(workspace->f[j], - CEtors9 + CEconj6, dcos_omega_dj); - - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dk); - rvec_Add(workspace->f[k], force); - - rvec_Scale(force, CEtors9 + CEconj6, dcos_omega_dl); - rvec_Add(workspace->f[l], force); - } + /* dcos_omega */ + rvec_ScaledAdd(workspace->f[i], CEtors9 + CEconj6, dcos_omega_di); + rvec_ScaledAdd(workspace->f[j], CEtors9 + CEconj6, dcos_omega_dj); + rvec_ScaledAdd(workspace->f[k], CEtors9 + CEconj6, dcos_omega_dk); + rvec_ScaledAdd(workspace->f[l], CEtors9 + CEconj6, dcos_omega_dl); /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { + if (system->pair_ptr->evflag) { // acquire vectors - rvec_ScaledSum(delil, 1., system->my_atoms[l].x, - -1., system->my_atoms[i].x); - rvec_ScaledSum(deljl, 1., system->my_atoms[l].x, - -1., system->my_atoms[j].x); - rvec_ScaledSum(delkl, 1., system->my_atoms[l].x, - -1., system->my_atoms[k].x); + rvec_ScaledSum(delil, 1., system->my_atoms[l].x, -1., system->my_atoms[i].x); + rvec_ScaledSum(deljl, 1., system->my_atoms[l].x, -1., system->my_atoms[j].x); + rvec_ScaledSum(delkl, 1., system->my_atoms[l].x, -1., system->my_atoms[k].x); // dcos_theta_ijk rvec_Scale(fi_tmp, CEtors7 + CEconj4, p_ijk->dcos_dk); rvec_Scale(fj_tmp, CEtors7 + CEconj4, p_ijk->dcos_dj); @@ -442,9 +388,9 @@ namespace ReaxFF { // tally eng_tmp = e_tor + e_con; - if (system->pair_ptr->evflag) + if (system->pair_ptr->eflag_either) system->pair_ptr->ev_tally(j,k,natoms,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); - if (system->pair_ptr->vflag_atom) + if (system->pair_ptr->vflag_either) system->pair_ptr->v_tally4(i,j,k,l,fi_tmp,fj_tmp,fk_tmp,delil,deljl,delkl); } } // pl check ends diff --git a/src/REAXFF/reaxc_valence_angles.cpp b/src/REAXFF/reaxc_valence_angles.cpp index 6f609646e3..5f75b6637d 100644 --- a/src/REAXFF/reaxc_valence_angles.cpp +++ b/src/REAXFF/reaxc_valence_angles.cpp @@ -67,9 +67,8 @@ namespace ReaxFF { } - void Valence_Angles(reax_system *system, control_params *control, - simulation_data *data, storage *workspace, - reax_list **lists) + void Valence_Angles(reax_system *system, control_params *control, simulation_data *data, + storage *workspace, reax_list **lists) { int i, j, pi, k, pk, t; int type_i, type_j, type_k; @@ -92,7 +91,6 @@ namespace ReaxFF { double f7_ij, f7_jk, f8_Dj, f9_Dj; double Ctheta_0, theta_0, theta_00, theta, cos_theta, sin_theta; double BOA_ij, BOA_jk; - rvec force; // Tallying variables double eng_tmp, fi_tmp[3], fj_tmp[3], fk_tmp[3]; @@ -114,7 +112,7 @@ namespace ReaxFF { num_thb_intrs = 0; - for (j = 0; j < system->N; ++j) { // Ray: the first one with system->N + for (j = 0; j < system->N; ++j) { type_j = system->my_atoms[j].type; if (type_j < 0) continue; start_j = Start_Index(j, bonds); @@ -218,7 +216,6 @@ namespace ReaxFF { ++num_thb_intrs; - if ((j < system->n) && (BOA_jk > 0.0) && (bo_ij->BO > control->thb_cut) && (bo_jk->BO > control->thb_cut) && @@ -347,39 +344,26 @@ namespace ReaxFF { bo_jt->Cdbopi2 += CEval5; } - if (control->virial == 0) { - rvec_ScaledAdd(workspace->f[i], CEval8, p_ijk->dcos_di); - rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - rvec_ScaledAdd(workspace->f[k], CEval8, p_ijk->dcos_dk); - } else { - rvec_Scale(force, CEval8, p_ijk->dcos_di); - rvec_Add(workspace->f[i], force); + rvec_ScaledAdd(workspace->f[i], CEval8, p_ijk->dcos_di); + rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); + rvec_ScaledAdd(workspace->f[k], CEval8, p_ijk->dcos_dk); - rvec_ScaledAdd(workspace->f[j], CEval8, p_ijk->dcos_dj); - - rvec_Scale(force, CEval8, p_ijk->dcos_dk); - rvec_Add(workspace->f[k], force); + /* tally energy */ + if (system->pair_ptr->eflag_either) { + eng_tmp = e_ang + e_pen + e_coa; + system->pair_ptr->ev_tally(j,j,system->N,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); } - /* tally into per-atom virials */ - if (system->pair_ptr->vflag_atom || system->pair_ptr->evflag) { - + /* tally virial */ + if (system->pair_ptr->vflag_either) { + /* Acquire vectors */ - rvec_ScaledSum(delij, 1., system->my_atoms[i].x, - -1., system->my_atoms[j].x); - rvec_ScaledSum(delkj, 1., system->my_atoms[k].x, - -1., system->my_atoms[j].x); - + rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); + rvec_ScaledSum(delkj, 1., system->my_atoms[k].x, -1., system->my_atoms[j].x); rvec_Scale(fi_tmp, -CEval8, p_ijk->dcos_di); rvec_Scale(fj_tmp, -CEval8, p_ijk->dcos_dj); rvec_Scale(fk_tmp, -CEval8, p_ijk->dcos_dk); - - eng_tmp = e_ang + e_pen + e_coa; - - if (system->pair_ptr->evflag) - system->pair_ptr->ev_tally(j,j,system->N,1,eng_tmp,0.0,0.0,0.0,0.0,0.0); - if (system->pair_ptr->vflag_atom) - system->pair_ptr->v_tally3(i,j,k,fi_tmp,fk_tmp,delij,delkj); + system->pair_ptr->v_tally3(i,j,k,fi_tmp,fk_tmp,delij,delkj); } } } diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index 96febe70f9..6179da9c72 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -54,7 +54,6 @@ namespace ReaxFF single_body_parameters *, single_body_parameters *, two_body_parameters *); extern void Add_dBond_to_Forces(reax_system*, int, int, storage*, reax_list**); - extern void Add_dBond_to_Forces_NPT(int, int, storage*, reax_list**); // bonds @@ -78,8 +77,8 @@ namespace ReaxFF // hydrogen bonds - extern void Hydrogen_Bonds(reax_system *, control_params *, - simulation_data *, storage *, reax_list **); + extern void Hydrogen_Bonds(reax_system *, simulation_data *, storage *, reax_list **); + // init md extern void Init_System(reax_system *, control_params *); diff --git a/src/REAXFF/reaxff_types.h b/src/REAXFF/reaxff_types.h index c88e0f5a6a..aec48072df 100644 --- a/src/REAXFF/reaxff_types.h +++ b/src/REAXFF/reaxff_types.h @@ -240,7 +240,6 @@ namespace ReaxFF double thb_cutsq; int tabulate; - int virial; int lgflag; int enobondsflag; diff --git a/src/USER-MISC/pair_drip.cpp b/src/USER-MISC/pair_drip.cpp index 97f5ca439e..a59d74bab9 100644 --- a/src/USER-MISC/pair_drip.cpp +++ b/src/USER-MISC/pair_drip.cpp @@ -366,10 +366,7 @@ void PairDRIP::compute(int eflag, int vflag) f[j][0] += fj[0]; f[j][1] += fj[1]; f[j][2] += fj[2]; - - // multiply 2 since v_tally has a 0.5 coeff - fj[0] *= 2; fj[1] *= 2; fj[2] *= 2; - if (vflag_atom) v_tally(j, fj, x[j]); + if (vflag_either) v_tally2_newton(j, fj, x[j]); } } //loop over jj @@ -377,10 +374,7 @@ void PairDRIP::compute(int eflag, int vflag) f[i][0] += fi[0]; f[i][1] += fi[1]; f[i][2] += fi[2]; - - // multiply 2 since v_tally has a 0.5 coeff - fi[0] *= 2; fi[1] *= 2; fi[2] *= 2; - if (vflag_atom) v_tally(i, fi, x[i]); + if (vflag_either) v_tally2_newton(i, fi, x[i]); } // loop over ii @@ -529,22 +523,13 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, f[nbj3][k] += fnbj3[k]; } - if (vflag_atom) { - // multiply since v_tally has a 0.5 coeff - for (int k = 0; k < DIM; k++) { - fnbi1[k] *= 2; - fnbi2[k] *= 2; - fnbi3[k] *= 2; - fnbj1[k] *= 2; - fnbj2[k] *= 2; - fnbj3[k] *= 2; - } - v_tally(nbi1, fnbi1, x[nbi1]); - v_tally(nbi2, fnbi2, x[nbi2]); - v_tally(nbi3, fnbi3, x[nbi3]); - v_tally(nbj1, fnbj1, x[nbj1]); - v_tally(nbj2, fnbj2, x[nbj2]); - v_tally(nbj3, fnbj3, x[nbj3]); + if (vflag_either) { + v_tally2_newton(nbi1, fnbi1, x[nbi1]); + v_tally2_newton(nbi2, fnbi2, x[nbi2]); + v_tally2_newton(nbi3, fnbi3, x[nbi3]); + v_tally2_newton(nbj1, fnbj1, x[nbj1]); + v_tally2_newton(nbj2, fnbj2, x[nbj2]); + v_tally2_newton(nbj3, fnbj3, x[nbj3]); } return phi; diff --git a/src/pair.cpp b/src/pair.cpp index 5e8c666743..bc8cb2ecd1 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -991,7 +991,7 @@ void Pair::ev_unset() } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators need i < nlocal test since called by bond_quartic and dihedral_charmm ------------------------------------------------------------------------- */ @@ -1092,7 +1092,7 @@ void Pair::ev_tally(int i, int j, int nlocal, int newton_pair, } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators can use this version with full neighbor lists ------------------------------------------------------------------------- */ @@ -1138,7 +1138,7 @@ void Pair::ev_tally_full(int i, double evdwl, double ecoul, double fpair, } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators for virial, have delx,dely,delz and fx,fy,fz ------------------------------------------------------------------------- */ @@ -1232,7 +1232,7 @@ void Pair::ev_tally_xyz(int i, int j, int nlocal, int newton_pair, } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators for virial, have delx,dely,delz and fx,fy,fz called when using full neighbor lists ------------------------------------------------------------------------- */ @@ -1285,7 +1285,7 @@ void Pair::ev_tally_xyz_full(int i, double evdwl, double ecoul, } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators called by SW and hbond potentials, newton_pair is always on virial = riFi + rjFj + rkFk = (rj-ri) Fj + (rk-ri) Fk = drji*fj + drki*fk ------------------------------------------------------------------------- */ @@ -1342,7 +1342,7 @@ void Pair::ev_tally3(int i, int j, int k, double evdwl, double ecoul, } /* ---------------------------------------------------------------------- - tally eng_vdwl and virial into global and per-atom accumulators + tally eng_vdwl and virial into global or per-atom accumulators called by AIREBO potential, newton_pair is always on ------------------------------------------------------------------------- */ @@ -1487,28 +1487,40 @@ void Pair::ev_tally_tip4p(int key, int *list, double *v, } /* ---------------------------------------------------------------------- - tally virial into per-atom accumulators - called by REAX/C potential, newton_pair is always on - fi is magnitude of force on atom i + tally virial into global or per-atom accumulators + called by ReaxFF potential, newton_pair is always on + fi is magnitude of force on atom i, deli is the direction + note that the other atom (j) is not updated, due to newton on ------------------------------------------------------------------------- */ -void Pair::v_tally(int i, double *fi, double *deli) +void Pair::v_tally2_newton(int i, double *fi, double *deli) { double v[6]; - v[0] = 0.5*deli[0]*fi[0]; - v[1] = 0.5*deli[1]*fi[1]; - v[2] = 0.5*deli[2]*fi[2]; - v[3] = 0.5*deli[0]*fi[1]; - v[4] = 0.5*deli[0]*fi[2]; - v[5] = 0.5*deli[1]*fi[2]; + v[0] = deli[0]*fi[0]; + v[1] = deli[1]*fi[1]; + v[2] = deli[2]*fi[2]; + v[3] = deli[0]*fi[1]; + v[4] = deli[0]*fi[2]; + v[5] = deli[1]*fi[2]; - vatom[i][0] += v[0]; vatom[i][1] += v[1]; vatom[i][2] += v[2]; - vatom[i][3] += v[3]; vatom[i][4] += v[4]; vatom[i][5] += v[5]; + if (vflag_global) { + virial[0] += v[0]; + virial[1] += v[1]; + virial[2] += v[2]; + virial[3] += v[3]; + virial[4] += v[4]; + virial[5] += v[5]; + } + + if (vflag_atom) { + vatom[i][0] += v[0]; vatom[i][1] += v[1]; vatom[i][2] += v[2]; + vatom[i][3] += v[3]; vatom[i][4] += v[4]; vatom[i][5] += v[5]; + } } /* ---------------------------------------------------------------------- - tally virial into per-atom accumulators + tally virial into global or per-atom accumulators called by AIREBO potential, newton_pair is always on fpair is magnitude of force on atom I ------------------------------------------------------------------------- */ @@ -1549,7 +1561,7 @@ void Pair::v_tally2(int i, int j, double fpair, double *drij) /* ---------------------------------------------------------------------- tally virial into per-atom accumulators - called by AIREBO and Tersoff potential, newton_pair is always on + called by AIREBO and Tersoff potentials, newton_pair is always on ------------------------------------------------------------------------- */ void Pair::v_tally3(int i, int j, int k, double *fi, double *fj, double *drik, double *drjk) @@ -1589,8 +1601,8 @@ void Pair::v_tally3(int i, int j, int k, double *fi, double *fj, double *drik, d } /* ---------------------------------------------------------------------- - tally virial into per-atom accumulators - called by AIREBO potential, newton_pair is always on + tally virial into global or per-atom accumulators + called by AIREBO potential, Tersoff, ReaxFF potentials, newton_pair is always on ------------------------------------------------------------------------- */ void Pair::v_tally4(int i, int j, int k, int m, @@ -1634,7 +1646,7 @@ void Pair::v_tally4(int i, int j, int k, int m, } /* ---------------------------------------------------------------------- - tally virial into global and per-atom accumulators + tally virial into global or per-atom accumulators called by pair lubricate potential with 6 tensor components ------------------------------------------------------------------------- */ diff --git a/src/pair.h b/src/pair.h index ad158bba9e..c4a5d3678c 100644 --- a/src/pair.h +++ b/src/pair.h @@ -137,9 +137,9 @@ class Pair : protected Pointers { // need to be public, so can be called by pair_style reaxc - void v_tally(int, double *, double *); void ev_tally(int, int, int, int, double, double, double, double, double, double); void ev_tally3(int, int, int, double, double, double *, double *, double *, double *); + void v_tally2_newton(int, double *, double *); void v_tally3(int, int, int, double *, double *, double *, double *); void v_tally4(int, int, int, int, double *, double *, double *, double *, double *, double *); void ev_tally_xyz(int, int, int, int, double, double, double, double, double, double, double, From e0ba11fbf0e75e2a437c2d973cc1c016e9d5d66c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Jul 2021 16:19:31 -0400 Subject: [PATCH 089/352] update LAMMPS homepage URL --- src/OPENMP/reaxff_omp.h | 2 +- src/REAXFF/reaxff_api.h | 2 +- src/REAXFF/reaxff_defs.h | 2 +- src/REAXFF/reaxff_inline.h | 2 +- src/REAXFF/reaxff_types.h | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OPENMP/reaxff_omp.h b/src/OPENMP/reaxff_omp.h index 4188ac9bf7..252e5f0e9d 100644 --- a/src/OPENMP/reaxff_omp.h +++ b/src/OPENMP/reaxff_omp.h @@ -1,6 +1,6 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories + https://www.lammps.org/ Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index 6179da9c72..ae3b013541 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -1,6 +1,6 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories + https://www.lammps.org/ Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/REAXFF/reaxff_defs.h b/src/REAXFF/reaxff_defs.h index df31d41d4c..868f6e22c2 100644 --- a/src/REAXFF/reaxff_defs.h +++ b/src/REAXFF/reaxff_defs.h @@ -1,6 +1,6 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories + https://www.lammps.org/ Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/REAXFF/reaxff_inline.h b/src/REAXFF/reaxff_inline.h index ba9927e5d3..a53ab4bb05 100644 --- a/src/REAXFF/reaxff_inline.h +++ b/src/REAXFF/reaxff_inline.h @@ -1,6 +1,6 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories + https://www.lammps.org/ Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract diff --git a/src/REAXFF/reaxff_types.h b/src/REAXFF/reaxff_types.h index aec48072df..e57244c66b 100644 --- a/src/REAXFF/reaxff_types.h +++ b/src/REAXFF/reaxff_types.h @@ -1,6 +1,6 @@ /* -*- c++ -*- ---------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories + https://www.lammps.org/ Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov Copyright (2003) Sandia Corporation. Under the terms of Contract From e29577634dc7888adfe4c499d4c800c51600640c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Jul 2021 16:23:45 -0400 Subject: [PATCH 090/352] fix whitespace --- src/REAXFF/reaxc_valence_angles.cpp | 2 +- src/pair.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/REAXFF/reaxc_valence_angles.cpp b/src/REAXFF/reaxc_valence_angles.cpp index 5f75b6637d..ac3e2dbd1e 100644 --- a/src/REAXFF/reaxc_valence_angles.cpp +++ b/src/REAXFF/reaxc_valence_angles.cpp @@ -356,7 +356,7 @@ namespace ReaxFF { /* tally virial */ if (system->pair_ptr->vflag_either) { - + /* Acquire vectors */ rvec_ScaledSum(delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x); rvec_ScaledSum(delkj, 1., system->my_atoms[k].x, -1., system->my_atoms[j].x); diff --git a/src/pair.cpp b/src/pair.cpp index bc8cb2ecd1..38c7922c17 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -1490,7 +1490,7 @@ void Pair::ev_tally_tip4p(int key, int *list, double *v, tally virial into global or per-atom accumulators called by ReaxFF potential, newton_pair is always on fi is magnitude of force on atom i, deli is the direction - note that the other atom (j) is not updated, due to newton on + note that the other atom (j) is not updated, due to newton on ------------------------------------------------------------------------- */ void Pair::v_tally2_newton(int i, double *fi, double *deli) From d412a4c9335dbdc06f12e5948f793300ef77247d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 12 Jul 2021 21:03:10 -0400 Subject: [PATCH 091/352] re-enable OpenMP testing for ReaxFF --- unittest/force-styles/test_pair_style.cpp | 3 +- .../tests/atomic-pair-reax_c.yaml | 171 +++++++++--------- .../tests/atomic-pair-reax_c_lgvdw.yaml | 5 +- .../tests/atomic-pair-reax_c_noqeq.yaml | 5 +- .../tests/atomic-pair-reax_c_tabulate.yaml | 5 +- .../tests/atomic-pair-yukawa_colloid.yaml | 1 + 6 files changed, 93 insertions(+), 97 deletions(-) diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index a3f16eee17..23858f93b9 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -524,8 +524,7 @@ TEST(PairStyle, plain) if (print_stats) std::cerr << "restart_energy stats:" << stats << std::endl; // pair style rann does not support pair_modify nofdotr - // temporarily disable testing pair style reax/c until we merge the other fixes - if ((test_config.pair_style != "rann") && !(test_config.pair_style.find("reax") != std::string::npos)) { + if (test_config.pair_style != "rann") { if (!verbose) ::testing::internal::CaptureStdout(); restart_lammps(lmp, test_config, true); if (!verbose) ::testing::internal::GetCapturedStdout(); diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index c65b49e83c..630f3b1d17 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,8 +1,7 @@ --- -lammps_version: 8 Apr 2021 -date_generated: Wed Apr 21 09:14:10 2021 +lammps_version: 2 Jul 2021 +date_generated: Mon Jul 12 20:56:37 2021 epsilon: 1e-11 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -37,140 +36,140 @@ extract: ! "" natoms: 64 init_vdwl: -3296.3503506624793 init_coul: -327.06551252279587 -init_stress: ! |2- - 3.0523786192092821e+03 3.0876898599834703e+03 3.2008340933315003e+03 -9.2310133390813661e+01 -2.9719470139173262e+02 -8.6006991065711546e+01 +init_stress: ! |- + -1.0522112314759645e+03 -1.2629480788292406e+03 -8.6765541430728683e+02 -2.5149818635822589e+02 2.0624598409299679e+02 -6.4309968343216531e+02 init_forces: ! |2 1 -8.8484559491557889e+01 -2.5824737864578637e+01 1.0916228789487674e+02 - 2 -1.1227736122976223e+02 -1.8092349731667611e+02 -2.2420586526896261e+02 + 2 -1.1227736122976223e+02 -1.8092349731667616e+02 -2.2420586526896261e+02 3 -1.7210817575849026e+02 1.8292439782308702e+02 1.3552618819720569e+01 - 4 3.2997500231085198e+01 -5.1076027616185407e+01 9.0475628837095513e+01 - 5 1.8144778146274791e+02 1.6797701000587452e+01 -8.1725507301127038e+01 - 6 1.3634094180728110e+02 -3.0056789474000180e+02 2.9661495129805971e+01 + 4 3.2997500231085269e+01 -5.1076027616185407e+01 9.0475628837095513e+01 + 5 1.8144778146274791e+02 1.6797701000587466e+01 -8.1725507301127038e+01 + 6 1.3634094180728110e+02 -3.0056789474000180e+02 2.9661495129805957e+01 7 -5.3287158661291762e+01 -1.2872927610192625e+02 -1.6347871108897493e+02 8 -1.5334883257588757e+02 4.0171483324130726e+01 1.5317461163040997e+02 9 1.8364155867634079e+01 8.1986572088186804e+01 2.8272397798081524e+01 10 8.4246730110712534e+01 1.4177487113456962e+02 1.2330079878579957e+02 11 -4.3218423112520902e+01 6.5551082199289709e+01 1.3464882148706636e+02 12 -9.7317470492933836e+01 -2.6234999414154014e+01 7.2277941881646539e+00 - 13 -6.3183329836753863e+01 -4.7368101002971272e+01 -3.7592654029315028e+01 - 14 7.8642975316486172e+01 -6.7997612991897427e+01 -9.9044775614596048e+01 + 13 -6.3183329836753863e+01 -4.7368101002971272e+01 -3.7592654029315021e+01 + 14 7.8642975316486172e+01 -6.7997612991897455e+01 -9.9044775614596048e+01 15 -6.6373732796038979e+01 2.1787558547532143e+02 8.0103149369093387e+01 - 16 1.9216166082224373e+02 5.3228015320734826e+01 6.6260214054210593e+01 + 16 1.9216166082224373e+02 5.3228015320734819e+01 6.6260214054210593e+01 17 1.4496007689503062e+02 -3.9700923044583718e+01 -9.7503851828130053e+01 18 -4.4989550233790240e+01 -1.9360605894359739e+02 1.1274792197022482e+02 - 19 2.6657528138945770e+02 3.7189510796650950e+02 -3.3847307488287697e+02 + 19 2.6657528138945770e+02 3.7189510796650950e+02 -3.3847307488287703e+02 20 -7.6341040242469418e+01 -8.8478925962203348e+01 1.3557778212060649e+00 21 -7.1188591900926752e+01 -5.1591439985136624e+01 -1.2279442803769274e+02 22 1.5504836733039957e+02 -1.3094504458746073e+02 8.1474408030760628e+01 - 23 7.8015302036861655e+01 -1.3272310040521637e+01 -2.2771427736544169e+01 + 23 7.8015302036861655e+01 -1.3272310040521637e+01 -2.2771427736544183e+01 24 -2.0546718065741098e+02 2.1611071031053456e+02 -1.2423208053538966e+02 25 -1.1402686646199034e+02 1.9100238121128132e+02 -8.3504908417580012e+01 - 26 2.8663576552098777e+02 -2.1773884754170604e+02 2.3144300100087472e+02 - 27 -6.3247409025611177e+01 6.9122196748087063e+01 1.8606936744368775e+02 - 28 -3.5426011055935223e+00 3.8764809029451868e+01 3.2874001946768942e+01 - 29 -7.1069178571876577e+01 3.5485903180427719e+01 2.7311648896320207e+01 - 30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123538e+02 - 31 -1.3970409889743334e+02 1.6660943915628047e+02 -1.2913930522474701e+02 - 32 2.7179130444112268e+01 -6.0169059447629913e+01 -1.7669495182022038e+02 + 26 2.8663576552098772e+02 -2.1773884754170604e+02 2.3144300100087472e+02 + 27 -6.3247409025611177e+01 6.9122196748087077e+01 1.8606936744368778e+02 + 28 -3.5426011055935240e+00 3.8764809029451875e+01 3.2874001946768900e+01 + 29 -7.1069178571876577e+01 3.5485903180427719e+01 2.7311648896320204e+01 + 30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123537e+02 + 31 -1.3970409889743331e+02 1.6660943915628047e+02 -1.2913930522474698e+02 + 32 2.7179130444112271e+01 -6.0169059447629905e+01 -1.7669495182022038e+02 33 -6.2659679124099597e+01 -6.4422131921795355e+01 6.4150928205326579e+01 34 -2.2119065265693539e+01 1.0450386886830508e+02 -7.3998379587547845e+01 - 35 2.6982987783286296e+02 -2.1519317040003412e+02 1.3051628460669610e+02 - 36 1.0368628874516664e+02 1.8817377639779619e+02 -1.9748944223870336e+02 - 37 -1.8009522406836993e+02 1.2993653092243849e+02 -6.3523043394051776e+01 - 38 -2.9571205878459978e+02 1.0441609933482223e+02 1.5582204859042619e+02 - 39 8.7398805727029284e+01 -6.0025559644669258e+01 2.2209742009837157e+01 + 35 2.6982987783286291e+02 -2.1519317040003412e+02 1.3051628460669610e+02 + 36 1.0368628874516659e+02 1.8817377639779619e+02 -1.9748944223870336e+02 + 37 -1.8009522406836990e+02 1.2993653092243849e+02 -6.3523043394051804e+01 + 38 -2.9571205878459978e+02 1.0441609933482222e+02 1.5582204859042619e+02 + 39 8.7398805727029270e+01 -6.0025559644669258e+01 2.2209742009837157e+01 40 2.0540672579010824e+01 -1.0735874009092363e+02 5.8655918369892206e+01 41 -5.8895846271372314e+01 1.1852345624639781e+01 -6.6147257724570267e+01 - 42 -9.6895512314642531e+01 3.8928741136688728e+01 -7.5791929957116224e+01 + 42 -9.6895512314642531e+01 3.8928741136688721e+01 -7.5791929957116210e+01 43 2.2476051812062417e+02 9.5505204283237461e+01 1.2309042240718740e+02 - 44 8.9817373579488645e+01 -1.0616333580628948e+02 -8.6321519086255435e+01 - 45 1.7202629662584396e+01 1.2890307246697839e+02 5.2916171301068474e+01 - 46 1.3547783972601877e+01 -2.9276223331260056e+01 2.2187412696867373e+01 - 47 3.3389762514712238e+01 -1.9217585014965047e+02 -6.9956213241088250e+01 - 48 7.3631720332112678e+01 -2.0953007324688525e+02 -2.3183566221404714e+01 - 49 -3.7589944473227274e+02 -2.4083165714763936e+01 1.0770339502610540e+02 + 44 8.9817373579488660e+01 -1.0616333580628948e+02 -8.6321519086255435e+01 + 45 1.7202629662584396e+01 1.2890307246697841e+02 5.2916171301068466e+01 + 46 1.3547783972601877e+01 -2.9276223331260049e+01 2.2187412696867376e+01 + 47 3.3389762514712210e+01 -1.9217585014965047e+02 -6.9956213241088250e+01 + 48 7.3631720332112650e+01 -2.0953007324688525e+02 -2.3183566221404728e+01 + 49 -3.7589944473227274e+02 -2.4083165714763936e+01 1.0770339502610545e+02 50 3.8603083564823841e+01 -7.3616481568799330e+01 9.0414065019644596e+01 51 1.3736420686706188e+02 -1.0204157331506994e+02 1.5813725581150808e+02 - 52 -1.0797257051087823e+02 1.1876975735151167e+02 -1.3295758126486243e+02 - 53 -5.3807540206295343e+01 3.3259462625854701e+02 -3.8426833263045523e-03 - 54 -1.0690184616186750e+01 6.2820270853646399e+01 1.8343158343321130e+02 - 55 1.1231900459987581e+02 -1.7906654831317169e+02 7.6533681064340868e+01 - 56 -4.1027190034916586e+01 -1.4085413191133767e+02 3.7483064289953241e+01 + 52 -1.0797257051087824e+02 1.1876975735151170e+02 -1.3295758126486243e+02 + 53 -5.3807540206295350e+01 3.3259462625854701e+02 -3.8426833263187632e-03 + 54 -1.0690184616186752e+01 6.2820270853646427e+01 1.8343158343321130e+02 + 55 1.1231900459987581e+02 -1.7906654831317167e+02 7.6533681064340854e+01 + 56 -4.1027190034916586e+01 -1.4085413191133770e+02 3.7483064289953241e+01 57 9.9904315214040494e+01 7.0938939080461637e+01 -6.8654961257661526e+01 - 58 -2.7563642882026745e+01 -6.7445498717142405e+00 -1.8442640542823220e+01 - 59 -6.6628933617875404e+01 1.0613066354110040e+02 8.7736153919831665e+01 - 60 -1.7748415247439002e+01 6.3757605316872542e+01 -1.5086907478326543e+02 - 61 -3.3560907195791366e+01 -1.0076987083174089e+02 -7.4536106106935804e+01 - 62 1.5883428926665005e+01 -5.8433760297908881e+00 2.8392494016034949e+01 - 63 1.3294494001298790e+02 -1.2724568063770238e+02 -6.4886848316806251e+01 - 64 1.0738157273930990e+02 1.2062173788161539e+02 7.4541400611710785e+01 + 58 -2.7563642882026748e+01 -6.7445498717142405e+00 -1.8442640542823220e+01 + 59 -6.6628933617875418e+01 1.0613066354110040e+02 8.7736153919831665e+01 + 60 -1.7748415247438995e+01 6.3757605316872542e+01 -1.5086907478326543e+02 + 61 -3.3560907195791366e+01 -1.0076987083174090e+02 -7.4536106106935819e+01 + 62 1.5883428926665005e+01 -5.8433760297908881e+00 2.8392494016034941e+01 + 63 1.3294494001298787e+02 -1.2724568063770238e+02 -6.4886848316806251e+01 + 64 1.0738157273930993e+02 1.2062173788161539e+02 7.4541400611710785e+01 run_vdwl: -3296.346882377749 run_coul: -327.0653995073912 -run_stress: ! |2- - 3.0523824138350801e+03 3.0876910136734191e+03 3.2008348843495064e+03 -9.2310681174629309e+01 -2.9719286551009412e+02 -8.6004906282204530e+01 +run_stress: ! |- + -1.0521225462925122e+03 -1.2628780139889509e+03 -8.6757617693085899e+02 -2.5158592653603847e+02 2.0619472152426923e+02 -6.4312943979323541e+02 run_forces: ! |2 1 -8.8486129396001530e+01 -2.5824483374473200e+01 1.0916517213634106e+02 - 2 -1.1227648453173390e+02 -1.8093214754186130e+02 -2.2420118533940351e+02 - 3 -1.7210894875994978e+02 1.8292263268451674e+02 1.3551979435686128e+01 - 4 3.2999405001009400e+01 -5.1077312719545837e+01 9.0478579144069556e+01 + 2 -1.1227648453173390e+02 -1.8093214754186130e+02 -2.2420118533940354e+02 + 3 -1.7210894875994978e+02 1.8292263268451674e+02 1.3551979435686139e+01 + 4 3.2999405001009407e+01 -5.1077312719545837e+01 9.0478579144069556e+01 5 1.8144963583123214e+02 1.6798391906831810e+01 -8.1723378082075570e+01 6 1.3640835897739447e+02 -3.0059507544862095e+02 2.9594750460783345e+01 - 7 -5.3287619129789434e+01 -1.2872953167026759e+02 -1.6348317368624129e+02 + 7 -5.3287619129789434e+01 -1.2872953167026756e+02 -1.6348317368624129e+02 8 -1.5334990952322434e+02 4.0171746946780843e+01 1.5317542403106131e+02 - 9 1.8362961213927143e+01 8.1984428717784240e+01 2.8273598253027259e+01 + 9 1.8362961213927139e+01 8.1984428717784255e+01 2.8273598253027259e+01 10 8.4245458094789043e+01 1.4177227430519346e+02 1.2329899933660965e+02 11 -4.3217035356344425e+01 6.5547850976510759e+01 1.3463983671946417e+02 12 -9.7319343004573113e+01 -2.6236499899232278e+01 7.2232061905742402e+00 13 -6.3184735475530402e+01 -4.7368090836538087e+01 -3.7590268076036111e+01 - 14 7.8642680121803949e+01 -6.7994653297646451e+01 -9.9042134233434069e+01 - 15 -6.6371195967082812e+01 2.1787700653339664e+02 8.0102624694807375e+01 - 16 1.9215832443892597e+02 5.3231888618093969e+01 6.6253846562695060e+01 - 17 1.4496126989603110e+02 -3.9700366098757236e+01 -9.7506725874209394e+01 + 14 7.8642680121803977e+01 -6.7994653297646451e+01 -9.9042134233434012e+01 + 15 -6.6371195967082826e+01 2.1787700653339664e+02 8.0102624694807375e+01 + 16 1.9215832443892597e+02 5.3231888618093983e+01 6.6253846562695074e+01 + 17 1.4496126989603110e+02 -3.9700366098757222e+01 -9.7506725874209380e+01 18 -4.4989211400008614e+01 -1.9360716191976445e+02 1.1274798810455862e+02 - 19 2.6657546213782740e+02 3.7189369483257695e+02 -3.3847202166068041e+02 + 19 2.6657546213782740e+02 3.7189369483257695e+02 -3.3847202166068035e+02 20 -7.6352829159880940e+01 -8.8469178952301604e+01 1.3384778817072185e+00 - 21 -7.1188597560667418e+01 -5.1592404200740091e+01 -1.2279357314243519e+02 + 21 -7.1188597560667432e+01 -5.1592404200740106e+01 -1.2279357314243519e+02 22 1.5504965184741241e+02 -1.3094582932680530e+02 8.1473922626938005e+01 23 7.8017376001392932e+01 -1.3263023728607561e+01 -2.2771654676273968e+01 - 24 -2.0547634460482246e+02 2.1612342044348730e+02 -1.2423651650061706e+02 + 24 -2.0547634460482251e+02 2.1612342044348730e+02 -1.2423651650061706e+02 25 -1.1402944116091903e+02 1.9100648219391277e+02 -8.3505645569845370e+01 26 2.8664542299410533e+02 -2.1774609219880716e+02 2.3144720166994406e+02 - 27 -6.3243843868043058e+01 6.9123801262965287e+01 1.8607035157681673e+02 - 28 -3.5444604841998397e+00 3.8760531647714473e+01 3.2869123667281691e+01 + 27 -6.3243843868043029e+01 6.9123801262965273e+01 1.8607035157681673e+02 + 28 -3.5444604841998415e+00 3.8760531647714480e+01 3.2869123667281706e+01 29 -7.1069494158179211e+01 3.5486459158760582e+01 2.7311657876181052e+01 30 -1.7037059987992399e+02 -1.9851840131669357e+02 -1.1511410156295636e+02 - 31 -1.3970663440086005e+02 1.6660841802305004e+02 -1.2914070628112796e+02 - 32 2.7179939937138421e+01 -6.0162678551485520e+01 -1.7668459764117443e+02 - 33 -6.2659124615698168e+01 -6.4421915847941506e+01 6.4151176691093482e+01 + 31 -1.3970663440086005e+02 1.6660841802305001e+02 -1.2914070628112796e+02 + 32 2.7179939937138432e+01 -6.0162678551485513e+01 -1.7668459764117441e+02 + 33 -6.2659124615698168e+01 -6.4421915847941520e+01 6.4151176691093482e+01 34 -2.2118740875419455e+01 1.0450303589341144e+02 -7.3997370482692972e+01 35 2.6987081482968875e+02 -2.1523754104000355e+02 1.3052736086179604e+02 - 36 1.0368798521815546e+02 1.8816694370725344e+02 -1.9748485159172904e+02 - 37 -1.8012152564003850e+02 1.2997662140302853e+02 -6.3547259053587844e+01 - 38 -2.9571525697590829e+02 1.0441941743734590e+02 1.5582112543442358e+02 - 39 8.7399620724575271e+01 -6.0025787992411296e+01 2.2209357601282150e+01 - 40 2.0541458171950978e+01 -1.0735817059033016e+02 5.8656280350524312e+01 - 41 -5.8893965304899972e+01 1.1850504754314887e+01 -6.6138932259022468e+01 - 42 -9.6894702780992375e+01 3.8926449644174816e+01 -7.5794133002764795e+01 + 36 1.0368798521815543e+02 1.8816694370725344e+02 -1.9748485159172907e+02 + 37 -1.8012152564003850e+02 1.2997662140302859e+02 -6.3547259053587872e+01 + 38 -2.9571525697590829e+02 1.0441941743734588e+02 1.5582112543442358e+02 + 39 8.7399620724575271e+01 -6.0025787992411310e+01 2.2209357601282150e+01 + 40 2.0541458171950978e+01 -1.0735817059033018e+02 5.8656280350524320e+01 + 41 -5.8893965304899986e+01 1.1850504754314887e+01 -6.6138932259022468e+01 + 42 -9.6894702780992361e+01 3.8926449644174809e+01 -7.5794133002764795e+01 43 2.2475651760389383e+02 9.5503072846836503e+01 1.2308683766845400e+02 44 8.9821846939843113e+01 -1.0615882525757857e+02 -8.6326896770189890e+01 - 45 1.7193681344342288e+01 1.2889564928820627e+02 5.2922372841252404e+01 - 46 1.3549091739280335e+01 -2.9276447091757490e+01 2.2187152043656496e+01 - 47 3.3389460345593179e+01 -1.9217121673024420e+02 -6.9954603582952544e+01 - 48 7.3644268618852777e+01 -2.0953201921822830e+02 -2.3192562071413263e+01 + 45 1.7193681344342288e+01 1.2889564928820624e+02 5.2922372841252404e+01 + 46 1.3549091739280335e+01 -2.9276447091757493e+01 2.2187152043656500e+01 + 47 3.3389460345593150e+01 -1.9217121673024420e+02 -6.9954603582952544e+01 + 48 7.3644268618852763e+01 -2.0953201921822830e+02 -2.3192562071413278e+01 49 -3.7593958318941031e+02 -2.4028439106859878e+01 1.0779151134441000e+02 50 3.8603926624328551e+01 -7.3615255297989435e+01 9.0412505212292402e+01 51 1.3736689552214156e+02 -1.0204490780187869e+02 1.5814099219652564e+02 - 52 -1.0797151154267746e+02 1.1876989597626186e+02 -1.3296150756377074e+02 - 53 -5.3843453069456601e+01 3.3257024143956789e+02 -2.3416395383762278e-02 - 54 -1.0678049522667429e+01 6.2807424617056625e+01 1.8344969045860523e+02 + 52 -1.0797151154267745e+02 1.1876989597626186e+02 -1.3296150756377074e+02 + 53 -5.3843453069456601e+01 3.3257024143956778e+02 -2.3416395383797806e-02 + 54 -1.0678049522667429e+01 6.2807424617056597e+01 1.8344969045860523e+02 55 1.1232135576105661e+02 -1.7906994470561881e+02 7.6534265234548187e+01 - 56 -4.1035945990527679e+01 -1.4084577238065071e+02 3.7489705598247994e+01 - 57 9.9903872061946174e+01 7.0936213558024505e+01 -6.8656338416452527e+01 + 56 -4.1035945990527679e+01 -1.4084577238065074e+02 3.7489705598247994e+01 + 57 9.9903872061946146e+01 7.0936213558024505e+01 -6.8656338416452527e+01 58 -2.7563844572724122e+01 -6.7426705471926862e+00 -1.8442803060445037e+01 - 59 -6.6637290503389451e+01 1.0613630918459926e+02 8.7741455199772943e+01 - 60 -1.7749706497437369e+01 6.3756413885635943e+01 -1.5086911682892705e+02 - 61 -3.3559889608749941e+01 -1.0076809277084803e+02 -7.4536003122046253e+01 - 62 1.5883833834736409e+01 -5.8439916924703503e+00 2.8393403991146936e+01 - 63 1.3294237052896716e+02 -1.2724619636183070e+02 -6.4882384014219085e+01 - 64 1.0738250214938944e+02 1.2062290362868877e+02 7.4541927445529211e+01 + 59 -6.6637290503389465e+01 1.0613630918459926e+02 8.7741455199772943e+01 + 60 -1.7749706497437362e+01 6.3756413885635943e+01 -1.5086911682892702e+02 + 61 -3.3559889608749941e+01 -1.0076809277084801e+02 -7.4536003122046239e+01 + 62 1.5883833834736409e+01 -5.8439916924703503e+00 2.8393403991146943e+01 + 63 1.3294237052896716e+02 -1.2724619636183067e+02 -6.4882384014219042e+01 + 64 1.0738250214938945e+02 1.2062290362868877e+02 7.4541927445529197e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index 3e12ad726d..c67cffdbba 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -1,8 +1,7 @@ --- -lammps_version: 8 Apr 2021 -date_generated: Wed Apr 21 08:52:02 2021 +lammps_version: 2 Jul 2021 +date_generated: Mon Jul 12 20:56:38 2021 epsilon: 1e-12 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index d0f59749fd..5927f854d6 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -1,8 +1,7 @@ --- -lammps_version: 8 Apr 2021 -date_generated: Wed Apr 21 08:52:00 2021 +lammps_version: 2 Jul 2021 +date_generated: Mon Jul 12 20:56:38 2021 epsilon: 5e-13 -skip_tests: omp prerequisites: ! | pair reax/c pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml index 12136d7a27..2434dfdcbc 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -1,8 +1,7 @@ --- -lammps_version: 8 Apr 2021 -date_generated: Wed Apr 21 08:52:02 2021 +lammps_version: 2 Jul 2021 +date_generated: Mon Jul 12 20:56:39 2021 epsilon: 1e-12 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax diff --git a/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml b/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml index 1c5c24832d..d807696e63 100644 --- a/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml +++ b/unittest/force-styles/tests/atomic-pair-yukawa_colloid.yaml @@ -2,6 +2,7 @@ lammps_version: 10 Feb 2021 date_generated: Fri Feb 26 23:09:10 2021 epsilon: 2e-13 +skip_tests: single prerequisites: ! | atom sphere pair yukawa/colloid From 5f302b9035247028e2ed2105ffd016c81d26b58d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 14 Jul 2021 17:42:46 -0400 Subject: [PATCH 092/352] temporarily skip testing REAXFF with OpenMP --- unittest/force-styles/tests/atomic-pair-reax_c.yaml | 1 + unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml | 1 + unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml | 1 + unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml | 1 + 4 files changed, 4 insertions(+) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index 630f3b1d17..22cc182b30 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -2,6 +2,7 @@ lammps_version: 2 Jul 2021 date_generated: Mon Jul 12 20:56:37 2021 epsilon: 1e-11 +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index c67cffdbba..d91caa277c 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -2,6 +2,7 @@ lammps_version: 2 Jul 2021 date_generated: Mon Jul 12 20:56:38 2021 epsilon: 1e-12 +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index 5927f854d6..9cfaaf4625 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -2,6 +2,7 @@ lammps_version: 2 Jul 2021 date_generated: Mon Jul 12 20:56:38 2021 epsilon: 5e-13 +skip_tests: omp prerequisites: ! | pair reax/c pre_commands: ! | diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml index 2434dfdcbc..8afebb059b 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -2,6 +2,7 @@ lammps_version: 2 Jul 2021 date_generated: Mon Jul 12 20:56:39 2021 epsilon: 1e-12 +skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax From 88e363c0bbf4bc46c1465034dd3d900f6142b149 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 14:51:04 -0400 Subject: [PATCH 093/352] document and add unit tests for lammps_set_fix_external_callback() --- src/library.cpp | 47 +++++++++---- src/library.h | 2 +- unittest/c-library/CMakeLists.txt | 4 ++ unittest/c-library/test_library_external.cpp | 73 ++++++++++++++++++++ unittest/python/CMakeLists.txt | 5 ++ unittest/python/python-fix-external.py | 42 +++++++++++ 6 files changed, 159 insertions(+), 14 deletions(-) create mode 100644 unittest/c-library/test_library_external.cpp create mode 100644 unittest/python/python-fix-external.py diff --git a/src/library.cpp b/src/library.cpp index c0dcb4f328..f0d747f258 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4804,15 +4804,38 @@ void lammps_decode_image_flags(imageint image, int *flags) flags[2] = (image >> IMG2BITS) - IMGMAX; } -/* ---------------------------------------------------------------------- - find fix external with given ID and set the callback function - and caller pointer -------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- */ -void lammps_set_fix_external_callback(void *handle, char *id, FixExternalFnPtr callback_ptr, void * caller) +/** Set the callback function for a fix external instance with given ID. + Optionally also set the pointer to the calling object. +\verbatim embed:rst + +Fix :doc:`external ` allows programs that are running LAMMPS through +its library interface to modify certain LAMMPS properties on specific +timesteps, similar to the way other fixes do. + +This function sets the callback function which has to have C language +bindings with the prototype: + +.. code-block:: c + + void func(void *ptr, bigint timestep, int nlocal, tagint *ids, double **x, double **fexternal); + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \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, char *id, FixExternalFnPtr funcptr, void *ptr) { LAMMPS *lmp = (LAMMPS *) handle; - FixExternal::FnPtr callback = (FixExternal::FnPtr) callback_ptr; + FixExternal::FnPtr callback = (FixExternal::FnPtr) funcptr; BEGIN_CAPTURE { @@ -4823,18 +4846,16 @@ void lammps_set_fix_external_callback(void *handle, char *id, FixExternalFnPtr c Fix *fix = lmp->modify->fix[ifix]; if (strcmp("external",fix->style) != 0) - lmp->error->all(FLERR,"Fix '{}' is not of style " - "external!", id); + lmp->error->all(FLERR,"Fix '{}' is not of style 'external'", id); - FixExternal * fext = (FixExternal*) fix; - fext->set_callback(callback, caller); + FixExternal *fext = (FixExternal *) fix; + fext->set_callback(callback, ptr); } END_CAPTURE } /* set global energy contribution from fix external */ -void lammps_fix_external_set_energy_global(void *handle, char *id, - double energy) +void lammps_fix_external_set_energy_global(void *handle, char *id, double energy) { LAMMPS *lmp = (LAMMPS *) handle; @@ -4849,7 +4870,7 @@ void lammps_fix_external_set_energy_global(void *handle, char *id, if (strcmp("external",fix->style) != 0) lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); - FixExternal * fext = (FixExternal*) fix; + FixExternal *fext = (FixExternal*) fix; fext->set_energy_global(energy); } END_CAPTURE diff --git a/src/library.h b/src/library.h index a337d7b510..2732314771 100644 --- a/src/library.h +++ b/src/library.h @@ -226,7 +226,7 @@ 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 **); -void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void *); +void lammps_set_fix_external_callback(void *handle, char *id, FixExternalFnPtr funcptr, void *ptr); #elif defined(LAMMPS_SMALLBIG) typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **); void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void *); diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index 3c24cdcff4..b01cd64677 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -7,6 +7,10 @@ add_executable(test_library_commands test_library_commands.cpp test_main.cpp) target_link_libraries(test_library_commands PRIVATE lammps GTest::GTest GTest::GMock) add_test(LibraryCommands test_library_commands) +add_executable(test_library_external test_library_external.cpp test_main.cpp) +target_link_libraries(test_library_external PRIVATE lammps GTest::GTest GTest::GMock) +add_test(LibraryExternal test_library_external) + add_executable(test_library_properties test_library_properties.cpp test_main.cpp) target_link_libraries(test_library_properties PRIVATE lammps GTest::GTest GTest::GMock) target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp new file mode 100644 index 0000000000..78ed91195c --- /dev/null +++ b/unittest/c-library/test_library_external.cpp @@ -0,0 +1,73 @@ +// unit tests creating LAMMPS instances via the library interface + +#include "library.h" + +#include +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include "test_main.h" + +using ::testing::HasSubstr; +using ::testing::StartsWith; + +extern "C" { +#ifdef LAMMPS_SMALLSMALL +typedef int32_t step_t; +typedef int32_t tag_t; +#elif LAMMPS_SMALLBIG +typedef int64_t step_t; +typedef int32_t tag_t; +#else +typedef int64_t step_t; +typedef int64_t tag_t; +#endif +static void callback_one(void *lmp, step_t timestep, int nlocal, tag_t *ids, double **x, double **f) +{ + for (int i = 0; i < nlocal; ++i) + f[i][0] = f[i][1] = f[i][2] = (double)timestep; +} +} + +TEST(lammps_external_pf, null_args) +{ + const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + + ::testing::internal::CaptureStdout(); + void *handle = lammps_open_no_mpi(argc, argv, NULL); + std::string output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + + ::testing::internal::CaptureStdout(); + lammps_commands_string(handle, "lattice sc 1.0\n" + "region box block -1 1 -1 1 -1 1\n" + "create_box 1 box\n" + "create_atoms 1 box\n" + "mass 1 1.0\n" + "pair_style zero 0.1\n" + "pair_coeff 1 1\n" + "velocity all set 0.1 0.0 -0.1\n" + "thermo 5\n" + "fix 1 all nve\n" + "fix ext all external pf/callback 5 1\n"); + + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + + ::testing::internal::CaptureStdout(); + lammps_set_fix_external_callback(handle, (char *)"ext", &callback_one, handle); + lammps_command(handle, "run 10 post no"); + double temp = lammps_get_thermo(handle,"temp"); + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + EXPECT_DOUBLE_EQ(temp,1.0/30.0); + + ::testing::internal::CaptureStdout(); + lammps_close(handle); + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; +} diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index b51d6e340a..9c9b7832ad 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -85,6 +85,11 @@ if(Python_EXECUTABLE) COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-formats.py -v WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) set_tests_properties(PythonFormats PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") + + add_test(NAME PythonFixExternal + COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-fix-external.py -v + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) + set_tests_properties(PythonFixExternal PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") else() message(STATUS "Skipping Tests for the LAMMPS Python Module: no suitable Python interpreter") endif() diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py new file mode 100644 index 0000000000..badc9e5731 --- /dev/null +++ b/unittest/python/python-fix-external.py @@ -0,0 +1,42 @@ +import sys,os,unittest +from ctypes import * +from lammps import lammps + +# add timestep dependent force +def callback_one(lmp, ntimestep, nlocal, tag, x, f): + for i in range(nlocal): + f[i][0] = float(ntimestep) + f[i][1] = float(ntimestep) + f[i][2] = float(ntimestep) + +class PythonExternal(unittest.TestCase): + def testExternalCallback(self): + """Test fix external from Python with pf/callback""" + + machine=None + if 'LAMMPS_MACHINE_NAME' in os.environ: + machine=os.environ['LAMMPS_MACHINE_NAME'] + lmp=lammps(name=machine, cmdargs=['-nocite', '-log','none', '-echo', 'screen']) + + # a few commands to set up simple system + basic_system="""lattice sc 1.0 + region box block -1 1 -1 1 -1 1 + create_box 1 box + create_atoms 1 box + mass 1 1.0 + pair_style zero 0.1 + pair_coeff 1 1 + velocity all set 0.1 0.0 -0.1 + thermo 5 + fix 1 all nve + fix ext all external pf/callback 5 1 +""" + lmp.commands_string(basic_system) + lmp.set_fix_external_callback("ext",callback_one,lmp) + lmp.command("run 10 post no") + self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) + +############################## +if __name__ == "__main__": + unittest.main() + From 8b1dedf04a3c16a6d21673734c64fb1ce9e90c79 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 17:21:57 -0400 Subject: [PATCH 094/352] add extract method to fix external --- src/fix_external.cpp | 15 ++++++++++++++- src/fix_external.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 8bede4ee19..4bc1e7eebc 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -238,7 +238,7 @@ void FixExternal::set_virial_peratom(double **caller_virial) void FixExternal::set_vector_length(int n) { - delete [] caller_vector; + delete[] caller_vector; vector_flag = 1; size_vector = n; @@ -342,3 +342,16 @@ void FixExternal::set_callback(FnPtr caller_callback, void *caller_ptr) callback = caller_callback; ptr_caller = caller_ptr; } + +/* ---------------------------------------------------------------------- + get access to internal data structures +------------------------------------------------------------------------- */ + +void *FixExternal::extract(const char *str, int &dim) +{ + if (strcmp(str, "fexternal") == 0) { + dim = 2; + return (void *) fexternal; + } + return nullptr; +} diff --git a/src/fix_external.h b/src/fix_external.h index 0ace978f99..f0f46cd4c5 100644 --- a/src/fix_external.h +++ b/src/fix_external.h @@ -57,6 +57,8 @@ class FixExternal : public Fix { typedef void (*FnPtr)(void *, bigint, int, tagint *, double **, double **); void set_callback(FnPtr, void *); + void *extract(const char *, int &); + private: int mode, ncall, napply, eflag_caller; FnPtr callback; From f3dc13c9dd72960daa80b4738697de71c4fa0ef0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 17:25:47 -0400 Subject: [PATCH 095/352] expand library interface for fix external functionality --- doc/src/Library_utility.rst | 2 +- python/lammps/core.py | 59 +++++- src/library.cpp | 185 ++++++++++++++++++- src/library.h | 15 +- unittest/c-library/test_library_external.cpp | 77 +++++++- unittest/python/python-fix-external.py | 41 ++++ 6 files changed, 350 insertions(+), 29 deletions(-) diff --git a/doc/src/Library_utility.rst b/doc/src/Library_utility.rst index b2f3666f88..2748d418b6 100644 --- a/doc/src/Library_utility.rst +++ b/doc/src/Library_utility.rst @@ -33,7 +33,7 @@ where such memory buffers were allocated that require the use of ----------------------- -.. doxygenfunction:: lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*) +.. doxygenfunction:: lammps_set_fix_external_callback(void *, const char *, FixExternalFnPtr, void*) :project: progguide ----------------------- diff --git a/python/lammps/core.py b/python/lammps/core.py index 2f101f4eab..5079828ba8 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -295,9 +295,13 @@ class lammps(object): self.lib.lammps_extract_variable.argtypes = [c_void_p, c_char_p, c_char_p] - # TODO: NOT IMPLEMENTED IN PYTHON WRAPPER - self.lib.lammps_fix_external_set_energy_global = [c_void_p, c_char_p, c_double] - self.lib.lammps_fix_external_set_virial_global = [c_void_p, c_char_p, POINTER(c_double)] + self.lib.lammps_fix_external_get_force.argtypes = [c_void_p, c_char_p] + self.lib.lammps_fix_external_get_force.restype = POINTER(POINTER(c_double)) + + self.lib.lammps_fix_external_set_energy_global.argtypes = [c_void_p, c_char_p, c_double] + self.lib.lammps_fix_external_set_virial_global.argtypes = [c_void_p, c_char_p, POINTER(c_double)] + self.lib.lammps_fix_external_set_energy_peratom.argtypes = [c_void_p, c_char_p, POINTER(c_double)] + self.lib.lammps_fix_external_set_virial_peratom.argtypes = [c_void_p, c_char_p, POINTER(POINTER(c_double))] # detect if Python is using a version of mpi4py that can pass communicators # only needed if LAMMPS has been compiled with MPI support. @@ -1725,7 +1729,33 @@ class lammps(object): # ------------------------------------------------------------------------- - def set_fix_external_callback(self, fix_name, callback, caller=None): + def set_fix_external_callback(self, fix_id, callback, caller=None): + """Set the callback function for a fix external instance with a given fix ID. + + Optionally also set a reference to the calling object. + + This is a wrapper around the :cpp:func:`lammps_set_fix_external_callback` function + of the C-library interface. However this is set up to call a Python function with + the following arguments. + + .. code-block: python + + def func(object, ntimestep, nlocal, tag, x, f): + + - object is the value of the "caller" argument + - ntimestep is the current timestep + - nlocal is the number of local atoms on the current MPI process + - tag is a 1d NumPy array of integers representing the atom IDs of the local atoms + - x is a 2d NumPy array of floating point numbers of the coordinates of the local atoms + - f is a 2d NumPy array of floating point numbers of the forces on the local atoms that will be added + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param callback: Python function that will be called from fix external + :type: function + :param caller: reference to some object passed to the callback function + :type: object, optional + """ import numpy as np def callback_wrapper(caller, ntimestep, nlocal, tag_ptr, x_ptr, fext_ptr): @@ -1737,10 +1767,27 @@ class lammps(object): cFunc = self.FIX_EXTERNAL_CALLBACK_FUNC(callback_wrapper) cCaller = caller - self.callback[fix_name] = { 'function': cFunc, 'caller': caller } + self.callback[fix_id] = { 'function': cFunc, 'caller': caller } with ExceptionCheck(self): - self.lib.lammps_set_fix_external_callback(self.lmp, fix_name.encode(), cFunc, cCaller) + self.lib.lammps_set_fix_external_callback(self.lmp, fix_id.encode(), cFunc, cCaller) + # ------------------------------------------------------------------------- + + def fix_external_get_force(self, fix_id): + """Get access to that array with per-atom forces of a fix external instance with a given fix ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_get_force` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :return: requested data + :rtype: ctypes.POINTER(ctypes.POINTER(ctypes.double)) + """ + + with ExceptionCheck(self): + return self.lib.lammps_fix_external_get_force(self.lmp, fix_id.encode()) + return None # ------------------------------------------------------------------------- diff --git a/src/library.cpp b/src/library.cpp index f0d747f258..4488114579 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4806,7 +4806,7 @@ void lammps_decode_image_flags(imageint image, int *flags) /* ---------------------------------------------------------------------- */ -/** Set the callback function for a fix external instance with given ID. +/** Set the callback function for a fix external instance with the given ID. Optionally also set the pointer to the calling object. \verbatim embed:rst @@ -4814,13 +4814,15 @@ Fix :doc:`external ` allows programs that are running LAMMPS throu its library interface to modify certain LAMMPS properties on specific timesteps, similar to the way other fixes do. -This function sets the callback function which has to have C language -bindings with the prototype: +This function sets the callback function for use with the "pf/callback" +mode. The function has to have C language bindings with the prototype: .. code-block:: c void func(void *ptr, bigint timestep, int nlocal, tagint *ids, double **x, double **fexternal); +This is an alternative to the array mechanism set up by :cpp:func:`lammps_fix_external_set_force`. + Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. @@ -4832,7 +4834,7 @@ 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, char *id, FixExternalFnPtr funcptr, void *ptr) +void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr) { LAMMPS *lmp = (LAMMPS *) handle; FixExternal::FnPtr callback = (FixExternal::FnPtr) funcptr; @@ -4854,8 +4856,77 @@ void lammps_set_fix_external_callback(void *handle, char *id, FixExternalFnPtr f END_CAPTURE } -/* set global energy contribution from fix external */ -void lammps_fix_external_set_energy_global(void *handle, char *id, double energy) +/** Get pointer to the force array storage in a fix external instance with the given ID. + +\verbatim embed:rst + +Fix :doc:`external ` allows programs that are running LAMMPS through +its library interface to add or modify certain LAMMPS properties on specific +timesteps, similar to the way other fixes do. + +This function provides access to the per-atom force storage in the fix +to be added to the individual atoms when using the "pf/array" mode. The +*fexternal* array can be accessed similar to the "native" per-atom +*arrays accessible via the :cpp:func:`lammps_extract_atom` function. +Because the underlying data structures can change as atoms migrate +between MPI processes, this function should be always called immediately +before the forces are going to be set. + +This is an alternative to the callback mechanism set up by +:cpp:func:`lammps_set_fix_external_callback` with out using the callback +mechanism to call out to the external program. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \return a pointer to the per-atom force array allocated by the fix */ + +double **lammps_fix_external_get_force(void *handle, const char *id) +{ + LAMMPS *lmp = (LAMMPS *) handle; + double **fexternal = nullptr; + + BEGIN_CAPTURE + { + int ifix = lmp->modify->find_fix(id); + if (ifix < 0) + lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + + Fix *fix = lmp->modify->fix[ifix]; + + if (strcmp("external",fix->style) != 0) + lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + + fexternal = (double **)fix->extract("fexternal",ifix); + } + END_CAPTURE + return fexternal; +} + +/** Set the global energy contribution for a fix external instance with the given ID. + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_set_force` to also set the contribution +to the global energy from the external code. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param eng energy to be added to the global energy */ + +void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng) { LAMMPS *lmp = (LAMMPS *) handle; @@ -4871,14 +4942,30 @@ void lammps_fix_external_set_energy_global(void *handle, char *id, double energy lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); FixExternal *fext = (FixExternal*) fix; - fext->set_energy_global(energy); + fext->set_energy_global(eng); } END_CAPTURE } -/* set global virial contribution from fix external */ -void lammps_fix_external_set_virial_global(void *handle, char *id, - double *virial) +/** Set the global virial contribution for a fix external instance with the given ID. + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_set_force` to also set the contribution +to the global virial from the external code. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param virial the 6 global stress tensor components to be added to the global virial */ + +void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial) { LAMMPS *lmp = (LAMMPS *) handle; @@ -4899,6 +4986,84 @@ void lammps_fix_external_set_virial_global(void *handle, char *id, END_CAPTURE } +/** Set the per-atom energy contribution for a fix external instance with the given ID. + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_set_force` to also set the contribution +to the per-atom energy from the external code. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param eng energy to be added to the per-atom energy */ + +void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng) +{ + LAMMPS *lmp = (LAMMPS *) handle; + + BEGIN_CAPTURE + { + int ifix = lmp->modify->find_fix(id); + if (ifix < 0) + lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + + Fix *fix = lmp->modify->fix[ifix]; + + if (strcmp("external",fix->style) != 0) + lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + + FixExternal *fext = (FixExternal*) fix; + fext->set_energy_peratom(eng); + } + END_CAPTURE +} + +/** Set the per-atom virial contribution for a fix external instance with the given ID. + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_set_force` to also set the contribution +to the per-atom virial from the external code. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param virial the 6 per-atom stress tensor components to be added to the per-atom virial */ + +void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial) +{ + LAMMPS *lmp = (LAMMPS *) handle; + + BEGIN_CAPTURE + { + int ifix = lmp->modify->find_fix(id); + if (ifix < 0) + lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + + Fix *fix = lmp->modify->fix[ifix]; + + if (strcmp("external",fix->style) != 0) + lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + + FixExternal * fext = (FixExternal*) fix; + fext->set_virial_peratom(virial); + } + END_CAPTURE +} + /* ---------------------------------------------------------------------- */ /** Free memory buffer allocated by LAMMPS. diff --git a/src/library.h b/src/library.h index 2732314771..25b5199dc7 100644 --- a/src/library.h +++ b/src/library.h @@ -226,16 +226,21 @@ 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 **); -void lammps_set_fix_external_callback(void *handle, char *id, FixExternalFnPtr funcptr, void *ptr); +void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr); #elif defined(LAMMPS_SMALLBIG) typedef void (*FixExternalFnPtr)(void *, int64_t, int, int *, double **, double **); -void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void *); +void lammps_set_fix_external_callback(void *, const char *, FixExternalFnPtr, void *); #else typedef void (*FixExternalFnPtr)(void *, int, int, int *, double **, double **); -void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void *); +void lammps_set_fix_external_callback(void *, const char *, FixExternalFnPtr, void *); #endif -void lammps_fix_external_set_energy_global(void *, char *, double); -void lammps_fix_external_set_virial_global(void *, char *, double *); +double **lammps_fix_external_get_force(void *handle, const char *id); +void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng); +void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng); +void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial); +void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); +void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); +void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **val); void lammps_free(void *ptr); diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 78ed91195c..f6f126c2b8 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -24,14 +24,17 @@ typedef int32_t tag_t; typedef int64_t step_t; typedef int64_t tag_t; #endif -static void callback_one(void *lmp, step_t timestep, int nlocal, tag_t *ids, double **x, double **f) +static void callback_one(void *handle, step_t timestep, int nlocal, tag_t *, double **, double **f) { for (int i = 0; i < nlocal; ++i) f[i][0] = f[i][1] = f[i][2] = (double)timestep; + lammps_fix_external_set_energy_global(handle, "ext", 1.0); + double v[6] = {1.0,1.0,1.0,0.0,0.0,0.0 }; + lammps_fix_external_set_virial_global(handle, "ext", v); } } -TEST(lammps_external_pf, null_args) +TEST(lammps_external, callback) { const char *args[] = {"liblammps", "-log", "none", "-nocite"}; char **argv = (char **)args; @@ -53,18 +56,78 @@ TEST(lammps_external_pf, null_args) "velocity all set 0.1 0.0 -0.1\n" "thermo 5\n" "fix 1 all nve\n" - "fix ext all external pf/callback 5 1\n"); + "fix ext all external pf/callback 5 1\n" + "fix_modify ext energy yes virial yes\n"); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; ::testing::internal::CaptureStdout(); - lammps_set_fix_external_callback(handle, (char *)"ext", &callback_one, handle); + lammps_set_fix_external_callback(handle, "ext", &callback_one, handle); lammps_command(handle, "run 10 post no"); - double temp = lammps_get_thermo(handle,"temp"); - output = ::testing::internal::GetCapturedStdout(); + double temp = lammps_get_thermo(handle, "temp"); + double pe = lammps_get_thermo(handle, "pe"); + double press = lammps_get_thermo(handle, "press"); + output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; - EXPECT_DOUBLE_EQ(temp,1.0/30.0); + EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); + EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); + EXPECT_DOUBLE_EQ(press, 0.15416666666666667); + + ::testing::internal::CaptureStdout(); + lammps_close(handle); + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; +} + +TEST(lammps_external, array) +{ + const char *args[] = {"liblammps", "-log", "none", "-nocite"}; + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + + ::testing::internal::CaptureStdout(); + void *handle = lammps_open_no_mpi(argc, argv, NULL); + std::string output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + + ::testing::internal::CaptureStdout(); + lammps_commands_string(handle, "lattice sc 1.0\n" + "region box block -1 1 -1 1 -1 1\n" + "create_box 1 box\n" + "create_atoms 1 box\n" + "mass 1 1.0\n" + "pair_style zero 0.1\n" + "pair_coeff 1 1\n" + "velocity all set 0.1 0.0 -0.1\n" + "thermo 5\n" + "fix 1 all nve\n" + "fix ext all external pf/array 1\n"); + + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + + ::testing::internal::CaptureStdout(); + double **force = lammps_fix_external_get_force(handle, "ext"); + int nlocal = lammps_extract_setting(handle, "nlocal"); + for (int i = 0; i < nlocal; ++i) + force[i][0] = force[i][1] = force[i][2] = 0.0; + lammps_command(handle, "run 5 post no"); + double temp = lammps_get_thermo(handle, "temp"); + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + EXPECT_DOUBLE_EQ(temp, 4.0 / 525.0); + + ::testing::internal::CaptureStdout(); + nlocal = lammps_extract_setting(handle, "nlocal"); + force = lammps_fix_external_get_force(handle, "ext"); + for (int i = 0; i < nlocal; ++i) + force[i][0] = force[i][1] = force[i][2] = 6.0; + lammps_command(handle, "run 5 post no"); + temp = lammps_get_thermo(handle, "temp"); + output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); ::testing::internal::CaptureStdout(); lammps_close(handle); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index badc9e5731..4f589bb5f6 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -36,6 +36,47 @@ class PythonExternal(unittest.TestCase): lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) + def testExternalArray(self): + """Test fix external from Python with pf/array""" + + machine=None + if 'LAMMPS_MACHINE_NAME' in os.environ: + machine=os.environ['LAMMPS_MACHINE_NAME'] + lmp=lammps(name=machine, cmdargs=['-nocite', '-log','none', '-echo', 'screen']) + + # a few commands to set up simple system + basic_system="""lattice sc 1.0 + region box block -1 1 -1 1 -1 1 + create_box 1 box + create_atoms 1 box + mass 1 1.0 + pair_style zero 0.1 + pair_coeff 1 1 + velocity all set 0.1 0.0 -0.1 + thermo 5 + fix 1 all nve + fix ext all external pf/array 1 +""" + lmp.commands_string(basic_system) + force = lmp.fix_external_get_force("ext"); + nlocal = lmp.extract_setting("nlocal"); + for i in range(nlocal): + force[i][0] = 0.0 + force[i][1] = 0.0 + force[i][2] = 0.0 + + lmp.command("run 5 post no") + self.assertAlmostEqual(lmp.get_thermo("temp"),4.0/525.0,14) + + force = lmp.fix_external_get_force("ext"); + nlocal = lmp.extract_setting("nlocal"); + for i in range(nlocal): + force[i][0] = 6.0 + force[i][1] = 6.0 + force[i][2] = 6.0 + lmp.command("run 5 post no") + self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) + ############################## if __name__ == "__main__": unittest.main() From 5912d0a1c2d86333478aea3399488a3cb11051ab Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 17:43:44 -0400 Subject: [PATCH 096/352] add support for setting global energy for fix external to python module --- python/lammps/core.py | 17 +++++++++++++++++ unittest/c-library/test_library_external.cpp | 13 ++++++++----- unittest/python/python-fix-external.py | 5 +++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 5079828ba8..44cd51bb33 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1791,6 +1791,23 @@ class lammps(object): # ------------------------------------------------------------------------- + def fix_external_set_energy_global(self, fix_id, eng): + """Get access to that array with per-atom forces of a fix external instance with a given fix ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_get_force` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eng: potential energy to be added by fix external + :type: float + """ + + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_energy_global(self.lmp, fix_id.encode(), eng) + + # ------------------------------------------------------------------------- + def get_neighlist(self, idx): """Returns an instance of :class:`NeighList` which wraps access to the neighbor list with the given index diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index f6f126c2b8..7c53daaef7 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -28,8 +28,11 @@ static void callback_one(void *handle, step_t timestep, int nlocal, tag_t *, dou { for (int i = 0; i < nlocal; ++i) f[i][0] = f[i][1] = f[i][2] = (double)timestep; - lammps_fix_external_set_energy_global(handle, "ext", 1.0); - double v[6] = {1.0,1.0,1.0,0.0,0.0,0.0 }; + if (timestep < 10) + lammps_fix_external_set_energy_global(handle, "ext", 0.0); + else + lammps_fix_external_set_energy_global(handle, "ext", 1.0); + double v[6] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0}; lammps_fix_external_set_virial_global(handle, "ext", v); } } @@ -65,10 +68,10 @@ TEST(lammps_external, callback) ::testing::internal::CaptureStdout(); lammps_set_fix_external_callback(handle, "ext", &callback_one, handle); lammps_command(handle, "run 10 post no"); - double temp = lammps_get_thermo(handle, "temp"); - double pe = lammps_get_thermo(handle, "pe"); + double temp = lammps_get_thermo(handle, "temp"); + double pe = lammps_get_thermo(handle, "pe"); double press = lammps_get_thermo(handle, "press"); - output = ::testing::internal::GetCapturedStdout(); + output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index 4f589bb5f6..02fe805626 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -8,6 +8,10 @@ def callback_one(lmp, ntimestep, nlocal, tag, x, f): f[i][0] = float(ntimestep) f[i][1] = float(ntimestep) f[i][2] = float(ntimestep) + if ntimestep < 10: + lmp.fix_external_set_energy_global("ext",0.5) + else: + lmp.fix_external_set_energy_global("ext",1.0) class PythonExternal(unittest.TestCase): def testExternalCallback(self): @@ -35,6 +39,7 @@ class PythonExternal(unittest.TestCase): lmp.set_fix_external_callback("ext",callback_one,lmp) lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) + self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) def testExternalArray(self): """Test fix external from Python with pf/array""" From ba5bf0fb775c5acaa5f29f2738f95c88daff699e Mon Sep 17 00:00:00 2001 From: kipbarrett Date: Fri, 16 Jul 2021 17:37:06 -0500 Subject: [PATCH 097/352] plugged memory leaks. Resolves [2811] --- src/ML-RANN/pair_rann.cpp | 23 ++++++++++++++----- src/ML-RANN/rann_fingerprint_bond.cpp | 1 + src/ML-RANN/rann_fingerprint_bondscreened.cpp | 1 + .../rann_fingerprint_bondscreenedspin.cpp | 1 + src/ML-RANN/rann_fingerprint_bondspin.cpp | 1 + 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index f0d1dec876..7b1a5a4317 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -110,22 +110,30 @@ PairRANN::~PairRANN() for (int j=0;j0) { + for (int j=0;jdestroy(dssumy); memory->destroy(dssumz); } + memory->destroy(setflag); + memory->destroy(cutsq); } void PairRANN::allocate(const std::vector &elementwords) @@ -305,6 +315,7 @@ void PairRANN::read_file(char *filename) ptr=fgets(linetemp,longline,fp); linenum++; if (ptr == nullptr) { + fclose(fp); if (check_potential()) { error->one(FLERR,"Invalid syntax in potential file, values are inconsistent or missing"); } @@ -478,10 +489,8 @@ void PairRANN::read_network_layers(std::vector line,std::vector line,std::vector line,std::vector line1,FILE* fp,char *filename,int *linenum) { int i,j,l; - char linetemp[MAXLINE]; + char linetemp[MAXLINE],*ptr; for (l=0;lone(filename,*linenum-1,"networklayers must be defined before biases."); @@ -558,7 +567,8 @@ void PairRANN::read_bias(std::vector line,std::vector net[l].Biases[i] = new double [net[l].dimensions[i+1]]; net[l].Biases[i][0] = utils::numeric(filename,*linenum,line1[0].c_str(),1,lmp); for (j=1;jone(filename,*linenum,"unexpected end of potential file!"); (*linenum)++; Tokenizer values1 = Tokenizer(linetemp,": ,\t_\n"); line1 = values1.as_vector(); @@ -832,6 +842,7 @@ void PairRANN::compute(int eflag, int vflag) } } if (vflag_fdotr) virial_fdotr_compute(); + delete [] sims; } void PairRANN::cull_neighbor_list(int* jnum,int i,int sn) { diff --git a/src/ML-RANN/rann_fingerprint_bond.cpp b/src/ML-RANN/rann_fingerprint_bond.cpp index bf14828a7b..88291921a0 100644 --- a/src/ML-RANN/rann_fingerprint_bond.cpp +++ b/src/ML-RANN/rann_fingerprint_bond.cpp @@ -282,6 +282,7 @@ void Fingerprint_bond::generate_coefficients() { //calculates multinomial c coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } + delete [] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondscreened.cpp b/src/ML-RANN/rann_fingerprint_bondscreened.cpp index 59fed322a3..c26e9cd18e 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreened.cpp @@ -283,6 +283,7 @@ void Fingerprint_bondscreened::generate_coefficients() { //calculates multi coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } + delete [] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp index 0728b6a295..b30865a96d 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp @@ -285,6 +285,7 @@ void Fingerprint_bondscreenedspin::generate_coefficients() { //calculates m coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } + delete [] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondspin.cpp b/src/ML-RANN/rann_fingerprint_bondspin.cpp index 1005818217..990bf12d78 100644 --- a/src/ML-RANN/rann_fingerprint_bondspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondspin.cpp @@ -283,6 +283,7 @@ void Fingerprint_bondspin::generate_coefficients() { //calculates multinomi coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } + delete [] M; } From 626b93cfbb5d3fd4d7c91a2670971128717defd5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 21:44:53 -0400 Subject: [PATCH 098/352] plug memory leak for alpha/alpha_k parameter --- src/ML-RANN/rann_fingerprint_bond.cpp | 1 + src/ML-RANN/rann_fingerprint_bondscreened.cpp | 1 + src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp | 1 + src/ML-RANN/rann_fingerprint_bondspin.cpp | 1 + 4 files changed, 4 insertions(+) diff --git a/src/ML-RANN/rann_fingerprint_bond.cpp b/src/ML-RANN/rann_fingerprint_bond.cpp index 88291921a0..1adcb5da19 100644 --- a/src/ML-RANN/rann_fingerprint_bond.cpp +++ b/src/ML-RANN/rann_fingerprint_bond.cpp @@ -156,6 +156,7 @@ void Fingerprint_bond::init(int *i,int _id) { rc = 0; mlength = 0; kmax = 0; + delete[] alpha_k; alpha_k = new double [1]; alpha_k[0]=-1; empty = false; diff --git a/src/ML-RANN/rann_fingerprint_bondscreened.cpp b/src/ML-RANN/rann_fingerprint_bondscreened.cpp index c26e9cd18e..e4c50cd1d0 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreened.cpp @@ -156,6 +156,7 @@ void Fingerprint_bondscreened::init(int *i,int _id) { rc = 0; mlength = 0; kmax = 0; + delete[] alpha_k; alpha_k = new double [1]; alpha_k[0]=-1; empty = false; diff --git a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp index b30865a96d..123e91439e 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp @@ -158,6 +158,7 @@ void Fingerprint_bondscreenedspin::init(int *i,int _id) { rc = 0; mlength = 0; kmax = 0; + delete[] alpha_k; alpha_k = new double [1]; alpha_k[0]=-1; empty = false; diff --git a/src/ML-RANN/rann_fingerprint_bondspin.cpp b/src/ML-RANN/rann_fingerprint_bondspin.cpp index 990bf12d78..7dfeb2d44c 100644 --- a/src/ML-RANN/rann_fingerprint_bondspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondspin.cpp @@ -157,6 +157,7 @@ void Fingerprint_bondspin::init(int *i,int _id) { rc = 0; mlength = 0; kmax = 0; + delete[] alpha_k; alpha_k = new double [1]; alpha_k[0]=-1; empty = false; From 0ddd90fe0ff341c7763b11f515c67f91cfaa67ad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 21:50:56 -0400 Subject: [PATCH 099/352] reformat allocations and deallocations --- src/ML-RANN/pair_rann.cpp | 64 +++++++++---------- src/ML-RANN/rann_fingerprint_bond.cpp | 46 ++++++------- src/ML-RANN/rann_fingerprint_bondscreened.cpp | 46 ++++++------- .../rann_fingerprint_bondscreenedspin.cpp | 46 ++++++------- src/ML-RANN/rann_fingerprint_bondspin.cpp | 46 ++++++------- src/ML-RANN/rann_fingerprint_radial.cpp | 22 +++---- .../rann_fingerprint_radialscreened.cpp | 22 +++---- .../rann_fingerprint_radialscreenedspin.cpp | 22 +++---- src/ML-RANN/rann_fingerprint_radialspin.cpp | 22 +++---- 9 files changed, 168 insertions(+), 168 deletions(-) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 7b1a5a4317..95e4d1af58 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -100,45 +100,45 @@ PairRANN::PairRANN(LAMMPS *lmp) : Pair(lmp) PairRANN::~PairRANN() { //clear memory - delete [] mass; + delete[] mass; for (int i=0;i0) { for (int j=0;j0) { for (int j=0;jdestroy(xn); memory->destroy(yn); memory->destroy(zn); @@ -207,10 +207,10 @@ void PairRANN::allocate(const std::vector &elementwords) activation = new RANN::Activation**[nelementsp]; fingerprints = new RANN::Fingerprint**[nelementsp]; fingerprintlength = new int[nelementsp]; - fingerprintperelement = new int [nelementsp]; + fingerprintperelement = new int[nelementsp]; fingerprintcount = new int[nelementsp]; - screening_min = new double [nelements*nelements*nelements]; - screening_max = new double [nelements*nelements*nelements]; + screening_min = new double[nelements*nelements*nelements]; + screening_max = new double[nelements*nelements*nelements]; for (i=0;intypes+1]; + map = new int[atom->ntypes+1]; if (narg != 3 + atom->ntypes) error->one(FLERR,"Incorrect args for pair coefficients"); if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) error->one(FLERR,"Incorrect args for pair coefficients"); nelements = -1; @@ -483,10 +483,10 @@ void PairRANN::read_network_layers(std::vector line,std::vectorone(filename,linenum,"invalid number of network layers"); - delete [] net[i].dimensions; + delete[] net[i].dimensions; weightdefined[i] = new bool [net[i].layers]; biasdefined[i] = new bool [net[i].layers]; - net[i].dimensions = new int [net[i].layers]; + net[i].dimensions = new int[net[i].layers]; net[i].Weights = new double * [net[i].layers-1]; net[i].Biases = new double * [net[i].layers-1]; for (j=0;j line,std::vector=net[l].layers || i<0)error->one(filename,*linenum-1,"invalid weight layer"); if (net[l].dimensions[i]==0 || net[l].dimensions[i+1]==0) error->one(filename,*linenum-1,"network layer sizes must be defined before corresponding weight"); - net[l].Weights[i] = new double [net[l].dimensions[i]*net[l].dimensions[i+1]]; + net[l].Weights[i] = new double[net[l].dimensions[i]*net[l].dimensions[i+1]]; weightdefined[l][i] = true; nwords = line1.size(); if (nwords != net[l].dimensions[i])error->one(filename,*linenum,"invalid weights per line"); @@ -564,7 +564,7 @@ void PairRANN::read_bias(std::vector line,std::vector if (i>=net[l].layers || i<0)error->one(filename,*linenum-1,"invalid bias layer"); if (net[l].dimensions[i]==0) error->one(filename,*linenum-1,"network layer sizes must be defined before corresponding bias"); biasdefined[l][i] = true; - net[l].Biases[i] = new double [net[l].dimensions[i+1]]; + net[l].Biases[i] = new double[net[l].dimensions[i+1]]; net[l].Biases[i][0] = utils::numeric(filename,*linenum,line1[0].c_str(),1,lmp); for (j=1;jallscreen = false; } Fingerprint_bond::~Fingerprint_bond() { - delete [] alpha_k; - delete [] atomtypes; - delete [] expcuttable; - delete [] dfctable; + delete[] alpha_k; + delete[] atomtypes; + delete[] expcuttable; + delete[] dfctable; for (int i=0;i<(mlength*(mlength+1))>>1;i++) { - delete [] coeff[i]; - delete [] coeffx[i]; - delete [] coeffy[i]; - delete [] coeffz[i]; - delete [] Mf[i]; + delete[] coeff[i]; + delete[] coeffx[i]; + delete[] coeffy[i]; + delete[] coeffz[i]; + delete[] Mf[i]; } - delete [] coeff; - delete [] coeffx; - delete [] coeffy; - delete [] coeffz; - delete [] Mf; - delete [] rinvsqrttable; + delete[] coeff; + delete[] coeffx; + delete[] coeffy; + delete[] coeffz; + delete[] Mf; + delete[] rinvsqrttable; } bool Fingerprint_bond::parse_values(std::string constant,std::vector line1) { @@ -81,8 +81,8 @@ bool Fingerprint_bond::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - expcuttable = new double [(res+buf)*(kmax)]; - dfctable = new double [res+buf]; + expcuttable = new double[(res+buf)*(kmax)]; + dfctable = new double[res+buf]; for (m=0;m<(res+buf);m++) { r1 = cutmax*cutmax*(double)(m)/(double)(res); for (n=0;n<(kmax);n++) { @@ -283,7 +283,7 @@ void Fingerprint_bond::generate_coefficients() { //calculates multinomial c coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } - delete [] M; + delete[] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondscreened.cpp b/src/ML-RANN/rann_fingerprint_bondscreened.cpp index e4c50cd1d0..2ed63a3655 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreened.cpp @@ -39,36 +39,36 @@ Fingerprint_bondscreened::Fingerprint_bondscreened(PairRANN *_pair) : Fingerprin dr = 0; re = 0; rc = 0; - alpha_k = new double [1]; + alpha_k = new double[1]; alpha_k[0] = -1; kmax = 0; mlength = 0; id = -1; style = "bondscreened"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; _pair->doscreen = true; screen = true; } Fingerprint_bondscreened::~Fingerprint_bondscreened() { - delete [] alpha_k; - delete [] atomtypes; - delete [] expcuttable; - delete [] dfctable; + delete[] alpha_k; + delete[] atomtypes; + delete[] expcuttable; + delete[] dfctable; for (int i=0;i<(mlength*(mlength+1))>>1;i++) { - delete [] coeff[i]; - delete [] coeffx[i]; - delete [] coeffy[i]; - delete [] coeffz[i]; - delete [] Mf[i]; + delete[] coeff[i]; + delete[] coeffx[i]; + delete[] coeffy[i]; + delete[] coeffz[i]; + delete[] Mf[i]; } - delete [] coeff; - delete [] coeffx; - delete [] coeffy; - delete [] coeffz; - delete [] Mf; - delete [] rinvsqrttable; + delete[] coeff; + delete[] coeffx; + delete[] coeffy; + delete[] coeffz; + delete[] Mf; + delete[] rinvsqrttable; } bool Fingerprint_bondscreened::parse_values(std::string constant,std::vector line1) { @@ -81,8 +81,8 @@ bool Fingerprint_bondscreened::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - expcuttable = new double [(res+buf)*(kmax)]; - dfctable = new double [res+buf]; + expcuttable = new double[(res+buf)*(kmax)]; + dfctable = new double[res+buf]; for (m=0;m<(res+buf);m++) { r1 = cutmax*cutmax*(double)(m)/(double)(res); for (n=0;n<(kmax);n++) { @@ -284,7 +284,7 @@ void Fingerprint_bondscreened::generate_coefficients() { //calculates multi coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } - delete [] M; + delete[] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp index 123e91439e..49829b41a1 100644 --- a/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondscreenedspin.cpp @@ -39,13 +39,13 @@ Fingerprint_bondscreenedspin::Fingerprint_bondscreenedspin(PairRANN *_pair) : Fi dr = 0; re = 0; rc = 0; - alpha_k = new double [1]; + alpha_k = new double[1]; alpha_k[0] = -1; kmax = 0; mlength = 0; id = -1; style = "bondscreenedspin"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; _pair->doscreen = true; screen = true; @@ -54,23 +54,23 @@ Fingerprint_bondscreenedspin::Fingerprint_bondscreenedspin(PairRANN *_pair) : Fi } Fingerprint_bondscreenedspin::~Fingerprint_bondscreenedspin() { - delete [] alpha_k; - delete [] atomtypes; - delete [] expcuttable; - delete [] dfctable; + delete[] alpha_k; + delete[] atomtypes; + delete[] expcuttable; + delete[] dfctable; for (int i=0;i<(mlength*(mlength+1))>>1;i++) { - delete [] coeff[i]; - delete [] coeffx[i]; - delete [] coeffy[i]; - delete [] coeffz[i]; - delete [] Mf[i]; + delete[] coeff[i]; + delete[] coeffx[i]; + delete[] coeffy[i]; + delete[] coeffz[i]; + delete[] Mf[i]; } - delete [] coeff; - delete [] coeffx; - delete [] coeffy; - delete [] coeffz; - delete [] Mf; - delete [] rinvsqrttable; + delete[] coeff; + delete[] coeffx; + delete[] coeffy; + delete[] coeffz; + delete[] Mf; + delete[] rinvsqrttable; } bool Fingerprint_bondscreenedspin::parse_values(std::string constant,std::vector line1) { @@ -83,8 +83,8 @@ bool Fingerprint_bondscreenedspin::parse_values(std::string constant,std::vector rc = strtod(line1[0].c_str(),NULL); } else if (constant.compare("alphak")==0) { - delete [] alpha_k; - alpha_k = new double [nwords]; + delete[] alpha_k; + alpha_k = new double[nwords]; for (l=0;lres; double cutmax = pair->cutmax; - expcuttable = new double [(res+buf)*(kmax)]; - dfctable = new double [res+buf]; + expcuttable = new double[(res+buf)*(kmax)]; + dfctable = new double[res+buf]; for (m=0;m<(res+buf);m++) { r1 = cutmax*cutmax*(double)(m)/(double)(res); for (n=0;n<(kmax);n++) { @@ -286,7 +286,7 @@ void Fingerprint_bondscreenedspin::generate_coefficients() { //calculates m coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } - delete [] M; + delete[] M; } diff --git a/src/ML-RANN/rann_fingerprint_bondspin.cpp b/src/ML-RANN/rann_fingerprint_bondspin.cpp index 7dfeb2d44c..452846cfb1 100644 --- a/src/ML-RANN/rann_fingerprint_bondspin.cpp +++ b/src/ML-RANN/rann_fingerprint_bondspin.cpp @@ -39,13 +39,13 @@ Fingerprint_bondspin::Fingerprint_bondspin(PairRANN *_pair) : Fingerprint(_pair) dr = 0; re = 0; rc = 0; - alpha_k = new double [1]; + alpha_k = new double[1]; alpha_k[0] = -1; kmax = 0; mlength = 0; id = -1; style = "bondspin"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; _pair->allscreen = false; _pair->dospin = true; @@ -53,23 +53,23 @@ Fingerprint_bondspin::Fingerprint_bondspin(PairRANN *_pair) : Fingerprint(_pair) } Fingerprint_bondspin::~Fingerprint_bondspin() { - delete [] alpha_k; - delete [] atomtypes; - delete [] expcuttable; - delete [] dfctable; + delete[] alpha_k; + delete[] atomtypes; + delete[] expcuttable; + delete[] dfctable; for (int i=0;i<(mlength*(mlength+1))>>1;i++) { - delete [] coeff[i]; - delete [] coeffx[i]; - delete [] coeffy[i]; - delete [] coeffz[i]; - delete [] Mf[i]; + delete[] coeff[i]; + delete[] coeffx[i]; + delete[] coeffy[i]; + delete[] coeffz[i]; + delete[] Mf[i]; } - delete [] coeff; - delete [] coeffx; - delete [] coeffy; - delete [] coeffz; - delete [] Mf; - delete [] rinvsqrttable; + delete[] coeff; + delete[] coeffx; + delete[] coeffy; + delete[] coeffz; + delete[] Mf; + delete[] rinvsqrttable; } bool Fingerprint_bondspin::parse_values(std::string constant,std::vector line1) { @@ -82,8 +82,8 @@ bool Fingerprint_bondspin::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - expcuttable = new double [(res+buf)*(kmax)]; - dfctable = new double [res+buf]; + expcuttable = new double[(res+buf)*(kmax)]; + dfctable = new double[res+buf]; for (m=0;m<(res+buf);m++) { r1 = cutmax*cutmax*(double)(m)/(double)(res); for (n=0;n<(kmax);n++) { @@ -284,7 +284,7 @@ void Fingerprint_bondspin::generate_coefficients() { //calculates multinomi coeff[p1][p] = pair->factorial(p)/pair->factorial(coeffx[p1][p])/pair->factorial(coeffy[p1][p])/pair->factorial(coeffz[p1][p]); } } - delete [] M; + delete[] M; } diff --git a/src/ML-RANN/rann_fingerprint_radial.cpp b/src/ML-RANN/rann_fingerprint_radial.cpp index f468ee2f6c..93cab2f363 100644 --- a/src/ML-RANN/rann_fingerprint_radial.cpp +++ b/src/ML-RANN/rann_fingerprint_radial.cpp @@ -41,13 +41,13 @@ Fingerprint_radial::Fingerprint_radial(PairRANN *_pair) : Fingerprint(_pair) dr = 0; re = 0; rc = 0; - alpha = new double [1]; + alpha = new double[1]; alpha[0] = -1; nmax = 0; omin = 0; id = -1; style = "radial"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; fullydefined = false; _pair->allscreen = false; @@ -55,11 +55,11 @@ Fingerprint_radial::Fingerprint_radial(PairRANN *_pair) : Fingerprint(_pair) Fingerprint_radial::~Fingerprint_radial() { - delete [] atomtypes; - delete [] radialtable; - delete [] alpha; - delete [] dfctable; - delete [] rinvsqrttable; + delete[] atomtypes; + delete[] radialtable; + delete[] alpha; + delete[] dfctable; + delete[] rinvsqrttable; } bool Fingerprint_radial::parse_values(std::string constant,std::vector line1) { @@ -72,8 +72,8 @@ bool Fingerprint_radial::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - radialtable = new double [(res+buf)*get_length()]; - dfctable = new double [res+buf]; + radialtable = new double[(res+buf)*get_length()]; + dfctable = new double[res+buf]; for (k=0;k<(res+buf);k++) { r1 = cutmax*cutmax*(double)(k)/(double)(res); for (m=0;m<=(nmax-omin);m++) { diff --git a/src/ML-RANN/rann_fingerprint_radialscreened.cpp b/src/ML-RANN/rann_fingerprint_radialscreened.cpp index 126b83fc51..a933703db8 100644 --- a/src/ML-RANN/rann_fingerprint_radialscreened.cpp +++ b/src/ML-RANN/rann_fingerprint_radialscreened.cpp @@ -41,13 +41,13 @@ Fingerprint_radialscreened::Fingerprint_radialscreened(PairRANN *_pair) : Finger dr = 0; re = 0; rc = 0; - alpha = new double [1]; + alpha = new double[1]; alpha[0] = -1; nmax = 0; omin = 0; id = -1; style = "radialscreened"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; fullydefined = false; _pair->doscreen = true; @@ -56,11 +56,11 @@ Fingerprint_radialscreened::Fingerprint_radialscreened(PairRANN *_pair) : Finger Fingerprint_radialscreened::~Fingerprint_radialscreened() { - delete [] atomtypes; - delete [] radialtable; - delete [] alpha; - delete [] dfctable; - delete [] rinvsqrttable; + delete[] atomtypes; + delete[] radialtable; + delete[] alpha; + delete[] dfctable; + delete[] rinvsqrttable; } bool Fingerprint_radialscreened::parse_values(std::string constant,std::vector line1) { @@ -73,8 +73,8 @@ bool Fingerprint_radialscreened::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - radialtable = new double [(res+buf)*get_length()]; - dfctable = new double [res+buf]; + radialtable = new double[(res+buf)*get_length()]; + dfctable = new double[res+buf]; for (k=0;k<(res+buf);k++) { r1 = cutmax*cutmax*(double)(k)/(double)(res); for (m=0;m<=(nmax-omin);m++) { diff --git a/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp b/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp index 11674190fb..ecd0e4a2f0 100644 --- a/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp +++ b/src/ML-RANN/rann_fingerprint_radialscreenedspin.cpp @@ -40,13 +40,13 @@ Fingerprint_radialscreenedspin::Fingerprint_radialscreenedspin(PairRANN *_pair) dr = 0; re = 0; rc = 0; - alpha = new double [1]; + alpha = new double[1]; alpha[0] = -1; nmax = 0; omin = 0; id = -1; style = "radialscreenedspin"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; fullydefined = false; _pair->doscreen = true; @@ -57,11 +57,11 @@ Fingerprint_radialscreenedspin::Fingerprint_radialscreenedspin(PairRANN *_pair) Fingerprint_radialscreenedspin::~Fingerprint_radialscreenedspin() { - delete [] atomtypes; - delete [] radialtable; - delete [] alpha; - delete [] dfctable; - delete [] rinvsqrttable; + delete[] atomtypes; + delete[] radialtable; + delete[] alpha; + delete[] dfctable; + delete[] rinvsqrttable; } bool Fingerprint_radialscreenedspin::parse_values(std::string constant,std::vector line1) { @@ -74,8 +74,8 @@ bool Fingerprint_radialscreenedspin::parse_values(std::string constant,std::vect rc = strtod(line1[0].c_str(),NULL); } else if (constant.compare("alpha")==0) { - delete [] alpha; - alpha = new double [nwords]; + delete[] alpha; + alpha = new double[nwords]; for (l=0;lres; double cutmax = pair->cutmax; - radialtable = new double [(res+buf)*get_length()]; - dfctable = new double [res+buf]; + radialtable = new double[(res+buf)*get_length()]; + dfctable = new double[res+buf]; for (k=0;k<(res+buf);k++) { r1 = cutmax*cutmax*(double)(k)/(double)(res); for (m=0;m<=(nmax-omin);m++) { diff --git a/src/ML-RANN/rann_fingerprint_radialspin.cpp b/src/ML-RANN/rann_fingerprint_radialspin.cpp index 2d0a2f68f1..137f7ac162 100644 --- a/src/ML-RANN/rann_fingerprint_radialspin.cpp +++ b/src/ML-RANN/rann_fingerprint_radialspin.cpp @@ -40,13 +40,13 @@ Fingerprint_radialspin::Fingerprint_radialspin(PairRANN *_pair) : Fingerprint(_p dr = 0; re = 0; rc = 0; - alpha = new double [1]; + alpha = new double[1]; alpha[0] = -1; nmax = 0; omin = 0; id = -1; style = "radialspin"; - atomtypes = new int [n_body_type]; + atomtypes = new int[n_body_type]; empty = true; fullydefined = false; _pair->allscreen = false; @@ -56,11 +56,11 @@ Fingerprint_radialspin::Fingerprint_radialspin(PairRANN *_pair) : Fingerprint(_p Fingerprint_radialspin::~Fingerprint_radialspin() { - delete [] atomtypes; - delete [] radialtable; - delete [] alpha; - delete [] dfctable; - delete [] rinvsqrttable; + delete[] atomtypes; + delete[] radialtable; + delete[] alpha; + delete[] dfctable; + delete[] rinvsqrttable; } bool Fingerprint_radialspin::parse_values(std::string constant,std::vector line1) { @@ -73,8 +73,8 @@ bool Fingerprint_radialspin::parse_values(std::string constant,std::vectorres; double cutmax = pair->cutmax; - radialtable = new double [(res+buf)*get_length()]; - dfctable = new double [res+buf]; + radialtable = new double[(res+buf)*get_length()]; + dfctable = new double[res+buf]; for (k=0;k<(res+buf);k++) { r1 = cutmax*cutmax*(double)(k)/(double)(res); for (m=0;m<=(nmax-omin);m++) { From d462bb3131c70172ef61f3d07a86a6f4ae9dc46d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 22:44:04 -0400 Subject: [PATCH 100/352] fix off-by-one bug --- src/fix_external.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 4bc1e7eebc..26c852fbd0 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -254,7 +254,7 @@ void FixExternal::set_vector_length(int n) void FixExternal::set_vector(int index, double value) { - if (index >= size_vector) + if (index > size_vector) error->all(FLERR,"Invalid set_vector index in fix external"); caller_vector[index-1] = value; } From fa654f2270233fac4b586afa5c95d8363ce14917 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Jul 2021 23:41:25 -0400 Subject: [PATCH 101/352] add support for set_vector for fix external in c-library, python and unittest --- .gitignore | 1 + doc/src/Library_utility.rst | 24 ++++++ python/lammps/core.py | 37 ++++++++ src/library.cpp | 90 ++++++++++++++++++-- src/library.h | 2 +- unittest/c-library/test_library_external.cpp | 31 +++++-- unittest/python/python-fix-external.py | 19 ++++- 7 files changed, 188 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 14d9dbebc9..b71a750c7d 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,7 @@ Thumbs.db /build* /CMakeCache.txt /CMakeFiles/ +/Testing /Makefile /cmake_install.cmake /lmp diff --git a/doc/src/Library_utility.rst b/doc/src/Library_utility.rst index 2748d418b6..32fac6bcc8 100644 --- a/doc/src/Library_utility.rst +++ b/doc/src/Library_utility.rst @@ -8,7 +8,11 @@ functions. They do not directly call the LAMMPS library. - :cpp:func:`lammps_decode_image_flags` - :cpp:func:`lammps_set_fix_external_callback` - :cpp:func:`lammps_fix_external_set_energy_global` +- :cpp:func:`lammps_fix_external_set_energy_peratom` - :cpp:func:`lammps_fix_external_set_virial_global` +- :cpp:func:`lammps_fix_external_set_virial_peratom` +- :cpp:func:`lammps_fix_external_set_vector_length` +- :cpp:func:`lammps_fix_external_set_vector` - :cpp:func:`lammps_free` - :cpp:func:`lammps_is_running` - :cpp:func:`lammps_force_timeout` @@ -43,11 +47,31 @@ where such memory buffers were allocated that require the use of ----------------------- +.. doxygenfunction:: lammps_fix_external_set_energy_peratom + :project: progguide + +----------------------- + .. doxygenfunction:: lammps_fix_external_set_virial_global :project: progguide ----------------------- +.. doxygenfunction:: lammps_fix_external_set_virial_peratom + :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_fix_external_set_vector_length + :project: progguide + +----------------------- + +.. doxygenfunction:: lammps_fix_external_set_vector + :project: progguide + +----------------------- + .. doxygenfunction:: lammps_free :project: progguide diff --git a/python/lammps/core.py b/python/lammps/core.py index 44cd51bb33..05192b5f6e 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -303,6 +303,9 @@ class lammps(object): self.lib.lammps_fix_external_set_energy_peratom.argtypes = [c_void_p, c_char_p, POINTER(c_double)] self.lib.lammps_fix_external_set_virial_peratom.argtypes = [c_void_p, c_char_p, POINTER(POINTER(c_double))] + self.lib.lammps_fix_external_set_vector_length.argtypes = [c_void_p, c_char_p, c_int] + self.lib.lammps_fix_external_set_vector.argtypes = [c_void_p, c_char_p, c_int, c_double] + # detect if Python is using a version of mpi4py that can pass communicators # only needed if LAMMPS has been compiled with MPI support. self.has_mpi4py = False @@ -1806,6 +1809,40 @@ class lammps(object): with ExceptionCheck(self): return self.lib.lammps_fix_external_set_energy_global(self.lmp, fix_id.encode(), eng) + # ------------------------------------------------------------------------- + def fix_external_set_vector_length(self, fix_id, length): + """Set the vector length for a global vector stored with fix external for analysis + + This is a wrapper around the :cpp:func:`lammps_fix_external_set_vector_length` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param length: length of the global vector + :type: int + """ + + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_vector_length(self.lmp, fix_id.encode(), length) + + # ------------------------------------------------------------------------- + def fix_external_set_vector(self, fix_id, idx, val): + """Store a global vector value for a fix external instance with the given ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_set_vector` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param idx: 1-based index of the value in the global vector + :type: int + :param val: value to be stored in the global vector + :type: float + """ + + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_vector(self.lmp, fix_id.encode(), idx, val) + # ------------------------------------------------------------------------- def get_neighlist(self, idx): diff --git a/src/library.cpp b/src/library.cpp index 4488114579..2c75657447 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4821,7 +4821,7 @@ mode. The function has to have C language bindings with the prototype: void func(void *ptr, bigint timestep, int nlocal, tagint *ids, double **x, double **fexternal); -This is an alternative to the array mechanism set up by :cpp:func:`lammps_fix_external_set_force`. +This is an alternative to the array mechanism set up by :cpp:func:`lammps_fix_external_get_force`. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4913,7 +4913,7 @@ double **lammps_fix_external_get_force(void *handle, const char *id) \verbatim embed:rst This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_set_force` to also set the contribution +:cpp:func:`lammps_fix_external_get_force` to also set the contribution to the global energy from the external code. Please see the documentation for :doc:`fix external ` for @@ -4952,7 +4952,7 @@ void lammps_fix_external_set_energy_global(void *handle, const char *id, double \verbatim embed:rst This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_set_force` to also set the contribution +:cpp:func:`lammps_fix_external_get_force` to also set the contribution to the global virial from the external code. Please see the documentation for :doc:`fix external ` for @@ -4991,7 +4991,7 @@ void lammps_fix_external_set_virial_global(void *handle, const char *id, double \verbatim embed:rst This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_set_force` to also set the contribution +:cpp:func:`lammps_fix_external_get_force` to also set the contribution to the per-atom energy from the external code. Please see the documentation for :doc:`fix external ` for @@ -5030,7 +5030,7 @@ void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double \verbatim embed:rst This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_set_force` to also set the contribution +:cpp:func:`lammps_fix_external_get_force` to also set the contribution to the per-atom virial from the external code. Please see the documentation for :doc:`fix external ` for @@ -5064,6 +5064,86 @@ void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double END_CAPTURE } +/** Set the vector length for a global vector stored with fix external for analysis + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_get_force` to set the length of a global vector of +properties that will be stored with the fix via :cpp:func:`lammps_fix_external_set_vector`. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param len length of the global vector to be stored with the fix */ + +void lammps_fix_external_set_vector_length(void *handle, const char *id, int len) +{ + LAMMPS *lmp = (LAMMPS *) handle; + + BEGIN_CAPTURE + { + int ifix = lmp->modify->find_fix(id); + if (ifix < 0) + lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + + Fix *fix = lmp->modify->fix[ifix]; + + if (strcmp("external",fix->style) != 0) + lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + + FixExternal *fext = (FixExternal*) fix; + fext->set_vector_length(len); + } + END_CAPTURE +} + +/** Store global vector for a fix external instance with the given ID. + +\verbatim embed:rst + +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and +:cpp:func:`lammps_fix_external_get_force` to set the values of a global vector of +properties that will be stored with the fix. The length of the vector +must be set beforehand with :cpp:func:`lammps_fix_external_set_vector_length`. + +Please see the documentation for :doc:`fix external ` for +more information about how to use the fix and how to couple it with an +external code. + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. + * \param id fix ID of fix external instance + * \param idx 1 based index of in global vector + * \param val value to be stored in global vector */ + +void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val) +{ + LAMMPS *lmp = (LAMMPS *) handle; + + BEGIN_CAPTURE + { + int ifix = lmp->modify->find_fix(id); + if (ifix < 0) + lmp->error->all(FLERR,"Can not find fix with ID '{}'!", id); + + Fix *fix = lmp->modify->fix[ifix]; + + if (strcmp("external",fix->style) != 0) + lmp->error->all(FLERR,"Fix '{}' is not of style external!", id); + + FixExternal * fext = (FixExternal*) fix; + fext->set_vector(idx, val); + } + END_CAPTURE +} + /* ---------------------------------------------------------------------- */ /** Free memory buffer allocated by LAMMPS. diff --git a/src/library.h b/src/library.h index 25b5199dc7..654eda38fa 100644 --- a/src/library.h +++ b/src/library.h @@ -240,7 +240,7 @@ void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial); void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); -void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **val); +void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val); void lammps_free(void *ptr); diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 7c53daaef7..d44f3ff2ee 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -28,12 +28,20 @@ static void callback_one(void *handle, step_t timestep, int nlocal, tag_t *, dou { for (int i = 0; i < nlocal; ++i) f[i][0] = f[i][1] = f[i][2] = (double)timestep; - if (timestep < 10) - lammps_fix_external_set_energy_global(handle, "ext", 0.0); - else - lammps_fix_external_set_energy_global(handle, "ext", 1.0); + double v[6] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0}; lammps_fix_external_set_virial_global(handle, "ext", v); + if (timestep < 10) { + lammps_fix_external_set_energy_global(handle, "ext", 0.5); + lammps_fix_external_set_vector(handle, "ext", 1, timestep); + lammps_fix_external_set_vector(handle, "ext", 3, 1.0); + lammps_fix_external_set_vector(handle, "ext", 4, -0.25); + } else { + lammps_fix_external_set_energy_global(handle, "ext", 1.0); + lammps_fix_external_set_vector(handle, "ext", 2, timestep); + lammps_fix_external_set_vector(handle, "ext", 5, -1.0); + lammps_fix_external_set_vector(handle, "ext", 6, 0.25); + } } } @@ -57,11 +65,12 @@ TEST(lammps_external, callback) "pair_style zero 0.1\n" "pair_coeff 1 1\n" "velocity all set 0.1 0.0 -0.1\n" - "thermo 5\n" "fix 1 all nve\n" "fix ext all external pf/callback 5 1\n" + "thermo_style custom step temp pe ke etotal press\n" + "thermo 5\n" "fix_modify ext energy yes virial yes\n"); - + lammps_fix_external_set_vector_length(handle, "ext", 6); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -71,11 +80,19 @@ TEST(lammps_external, callback) double temp = lammps_get_thermo(handle, "temp"); double pe = lammps_get_thermo(handle, "pe"); double press = lammps_get_thermo(handle, "press"); - output = ::testing::internal::GetCapturedStdout(); + double val = 0.0; + double *valp; + for (int i = 0; i < 6; ++i) { + valp = (double *)lammps_extract_fix(handle, "ext", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR, i, 0); + val += *valp; + lammps_free(valp); + } + output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); EXPECT_DOUBLE_EQ(press, 0.15416666666666667); + EXPECT_DOUBLE_EQ(val, 15); ::testing::internal::CaptureStdout(); lammps_close(handle); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index 02fe805626..eab4687e2b 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -1,6 +1,6 @@ import sys,os,unittest from ctypes import * -from lammps import lammps +from lammps import lammps, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR # add timestep dependent force def callback_one(lmp, ntimestep, nlocal, tag, x, f): @@ -9,9 +9,15 @@ def callback_one(lmp, ntimestep, nlocal, tag, x, f): f[i][1] = float(ntimestep) f[i][2] = float(ntimestep) if ntimestep < 10: - lmp.fix_external_set_energy_global("ext",0.5) + lmp.fix_external_set_energy_global("ext", 0.5) + lmp.fix_external_set_vector("ext", 1, ntimestep) + lmp.fix_external_set_vector("ext", 3, 1.0) + lmp.fix_external_set_vector("ext", 4, -0.25) else: - lmp.fix_external_set_energy_global("ext",1.0) + lmp.fix_external_set_energy_global("ext", 1.0) + lmp.fix_external_set_vector("ext", 2, ntimestep) + lmp.fix_external_set_vector("ext", 5, -1.0) + lmp.fix_external_set_vector("ext", 6, 0.25) class PythonExternal(unittest.TestCase): def testExternalCallback(self): @@ -31,15 +37,22 @@ class PythonExternal(unittest.TestCase): pair_style zero 0.1 pair_coeff 1 1 velocity all set 0.1 0.0 -0.1 + thermo_style custom step temp pe ke etotal press thermo 5 fix 1 all nve fix ext all external pf/callback 5 1 + fix_modify ext energy yes virial yes """ lmp.commands_string(basic_system) + lmp.fix_external_set_vector_length("ext",6); lmp.set_fix_external_callback("ext",callback_one,lmp) lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) + val = 0.0 + for i in range(0,6): + val += lmp.extract_fix("ext",LMP_STYLE_GLOBAL,LMP_TYPE_VECTOR,nrow=i) + self.assertAlmostEqual(val,15.0,14) def testExternalArray(self): """Test fix external from Python with pf/array""" From f251bc544f90758a85819b9ecb6e4f4c31e58024 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 17 Jul 2021 07:38:53 -0400 Subject: [PATCH 102/352] support setting global virial for fix external from python --- python/lammps/core.py | 24 +++++++++++++++++++++--- src/library.cpp | 2 +- unittest/python/python-fix-external.py | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 05192b5f6e..9ea2530cdc 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1795,20 +1795,38 @@ class lammps(object): # ------------------------------------------------------------------------- def fix_external_set_energy_global(self, fix_id, eng): - """Get access to that array with per-atom forces of a fix external instance with a given fix ID. + """Set the global energy contribution for a fix external instance with the given ID. - This is a wrapper around the :cpp:func:`lammps_fix_external_get_force` function + This is a wrapper around the :cpp:func:`lammps_fix_external_set_energy_global` function of the C-library interface. :param fix_id: Fix-ID of a fix external instance :type: string - :param eng: potential energy to be added by fix external + :param eng: potential energy value to be added by fix external :type: float """ with ExceptionCheck(self): return self.lib.lammps_fix_external_set_energy_global(self.lmp, fix_id.encode(), eng) + # ------------------------------------------------------------------------- + + def fix_external_set_virial_global(self, fix_id, virial): + """Set the global virial contribution for a fix external instance with the given ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_set_virial_global` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eng: list of 6 floating point numbers with the virial to be added by fix external + :type: float + """ + + cvirial = (6*c_double)(*virial) + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_virial_global(self.lmp, fix_id.encode(), cvirial) + # ------------------------------------------------------------------------- def fix_external_set_vector_length(self, fix_id, length): """Set the vector length for a global vector stored with fix external for analysis diff --git a/src/library.cpp b/src/library.cpp index 2c75657447..167c0c39b5 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -5103,7 +5103,7 @@ void lammps_fix_external_set_vector_length(void *handle, const char *id, int len END_CAPTURE } -/** Store global vector for a fix external instance with the given ID. +/** Store a global vector value for a fix external instance with the given ID. \verbatim embed:rst diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index eab4687e2b..1b46943b5a 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -4,6 +4,8 @@ from lammps import lammps, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR # add timestep dependent force def callback_one(lmp, ntimestep, nlocal, tag, x, f): + virial = [1.0, 1.0, 1.0, 0.0, 0.0, 0.0] + lmp.fix_external_set_virial_global("ext",virial) for i in range(nlocal): f[i][0] = float(ntimestep) f[i][1] = float(ntimestep) @@ -49,6 +51,7 @@ class PythonExternal(unittest.TestCase): lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) + self.assertAlmostEqual(lmp.get_thermo("press"),0.15416666666666667,14) val = 0.0 for i in range(0,6): val += lmp.extract_fix("ext",LMP_STYLE_GLOBAL,LMP_TYPE_VECTOR,nrow=i) From 8460d67eb200cb26ab335a85c84e557952cf3c6c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Jul 2021 00:25:00 -0400 Subject: [PATCH 103/352] update embedded documentation to correctly describe the functionality --- src/library.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 167c0c39b5..a6e4509c56 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4914,7 +4914,9 @@ double **lammps_fix_external_get_force(void *handle, const char *id) This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and :cpp:func:`lammps_fix_external_get_force` to also set the contribution -to the global energy from the external code. +to the global energy from the external code. The value of the *eng* +argument will be stored in the fix and applied on the current and all +following timesteps until changed. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4951,9 +4953,11 @@ void lammps_fix_external_set_energy_global(void *handle, const char *id, double \verbatim embed:rst -This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_get_force` to also set the contribution -to the global virial from the external code. +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` +to set the contribution to the global virial from the external code +as part of the callback function. For this to work, the handle to the +LAMMPS object must be passed as the *ptr* argument when registering the +callback function. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4990,9 +4994,12 @@ void lammps_fix_external_set_virial_global(void *handle, const char *id, double \verbatim embed:rst -This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_get_force` to also set the contribution -to the per-atom energy from the external code. +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` +to set the per-atom energy contribution due to the fix from the external code +as part of the callback function. For this to work, the handle to the +LAMMPS object must be passed as the *ptr* argument when registering the +callback function. No check is made whether the sum of the +contributions are consistent with any global added energy. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5029,9 +5036,12 @@ void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double \verbatim embed:rst -This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and -:cpp:func:`lammps_fix_external_get_force` to also set the contribution -to the per-atom virial from the external code. +This is a companion function to :cpp:func:`lammps_set_fix_external_callback` +to set the per-atom virial contribution due to the fix from the external code +as part of the callback function. For this to work, the handle to the +LAMMPS object must be passed as the *ptr* argument when registering the +callback function. No check is made whether the sum of the +contributions are consistent with any globally added virial components. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an From 1c4e8aba122e5d792788464bf5f88988aa91f348 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Jul 2021 00:29:27 -0400 Subject: [PATCH 104/352] add tests for per-atom values, global energy with pf/array mode --- unittest/c-library/test_library_external.cpp | 45 +++++++++++++++++--- unittest/python/python-fix-external.py | 10 +++-- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index d44f3ff2ee..8acb7a43f4 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -24,7 +24,7 @@ typedef int32_t tag_t; typedef int64_t step_t; typedef int64_t tag_t; #endif -static void callback_one(void *handle, step_t timestep, int nlocal, tag_t *, double **, double **f) +static void callback(void *handle, step_t timestep, int nlocal, tag_t *, double **, double **f) { for (int i = 0; i < nlocal; ++i) f[i][0] = f[i][1] = f[i][2] = (double)timestep; @@ -42,6 +42,23 @@ static void callback_one(void *handle, step_t timestep, int nlocal, tag_t *, dou lammps_fix_external_set_vector(handle, "ext", 5, -1.0); lammps_fix_external_set_vector(handle, "ext", 6, 0.25); } + double *eatom = new double[nlocal]; + double **vatom = new double *[nlocal]; + vatom[0] = new double[nlocal * 6]; + eatom[0] = 0.0; + vatom[0][0] = vatom[0][1] = vatom[0][2] = vatom[0][3] = vatom[0][4] = vatom[0][5] = 0.0; + + for (int i = 1; i < nlocal; ++i) { + eatom[i] = 0.1 * i; + vatom[i] = vatom[0] + 6 * i; + vatom[i][0] = vatom[i][1] = vatom[i][2] = 0.1; + vatom[i][3] = vatom[i][4] = vatom[i][5] = -0.2; + } + lammps_fix_external_set_energy_peratom(handle, "ext", eatom); + lammps_fix_external_set_virial_peratom(handle, "ext", vatom); + delete[] eatom; + delete[] vatom[0]; + delete[] vatom; } } @@ -67,7 +84,10 @@ TEST(lammps_external, callback) "velocity all set 0.1 0.0 -0.1\n" "fix 1 all nve\n" "fix ext all external pf/callback 5 1\n" - "thermo_style custom step temp pe ke etotal press\n" + "compute eatm all pe/atom fix\n" + "compute vatm all stress/atom NULL fix\n" + "compute sum all reduce sum c_eatm c_vatm[*]\n" + "thermo_style custom step temp pe ke etotal press c_sum[*]\n" "thermo 5\n" "fix_modify ext energy yes virial yes\n"); lammps_fix_external_set_vector_length(handle, "ext", 6); @@ -75,7 +95,7 @@ TEST(lammps_external, callback) if (verbose) std::cout << output; ::testing::internal::CaptureStdout(); - lammps_set_fix_external_callback(handle, "ext", &callback_one, handle); + lammps_set_fix_external_callback(handle, "ext", &callback, handle); lammps_command(handle, "run 10 post no"); double temp = lammps_get_thermo(handle, "temp"); double pe = lammps_get_thermo(handle, "pe"); @@ -87,12 +107,21 @@ TEST(lammps_external, callback) val += *valp; lammps_free(valp); } + double *reduce = + (double *)lammps_extract_compute(handle, "sum", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); EXPECT_DOUBLE_EQ(press, 0.15416666666666667); EXPECT_DOUBLE_EQ(val, 15); + EXPECT_DOUBLE_EQ(reduce[0], 2.8); + EXPECT_DOUBLE_EQ(reduce[1], -0.7); + EXPECT_DOUBLE_EQ(reduce[2], -0.7); + EXPECT_DOUBLE_EQ(reduce[3], -0.7); + EXPECT_DOUBLE_EQ(reduce[4], 1.4); + EXPECT_DOUBLE_EQ(reduce[5], 1.4); + EXPECT_DOUBLE_EQ(reduce[6], 1.4); ::testing::internal::CaptureStdout(); lammps_close(handle); @@ -120,9 +149,9 @@ TEST(lammps_external, array) "pair_style zero 0.1\n" "pair_coeff 1 1\n" "velocity all set 0.1 0.0 -0.1\n" - "thermo 5\n" "fix 1 all nve\n" - "fix ext all external pf/array 1\n"); + "fix ext all external pf/array 1\n" + "thermo 5\n"); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; @@ -132,22 +161,28 @@ TEST(lammps_external, array) int nlocal = lammps_extract_setting(handle, "nlocal"); for (int i = 0; i < nlocal; ++i) force[i][0] = force[i][1] = force[i][2] = 0.0; + lammps_fix_external_set_energy_global(handle, "ext", 0.5); lammps_command(handle, "run 5 post no"); double temp = lammps_get_thermo(handle, "temp"); + double pe = lammps_get_thermo(handle, "pe"); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 4.0 / 525.0); + EXPECT_DOUBLE_EQ(pe, 1.0 / 16.0); ::testing::internal::CaptureStdout(); nlocal = lammps_extract_setting(handle, "nlocal"); force = lammps_fix_external_get_force(handle, "ext"); for (int i = 0; i < nlocal; ++i) force[i][0] = force[i][1] = force[i][2] = 6.0; + lammps_fix_external_set_energy_global(handle, "ext", 1.0); lammps_command(handle, "run 5 post no"); temp = lammps_get_thermo(handle, "temp"); + pe = lammps_get_thermo(handle, "pe"); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); + EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); ::testing::internal::CaptureStdout(); lammps_close(handle); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index 1b46943b5a..e1c511d480 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -4,8 +4,7 @@ from lammps import lammps, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR # add timestep dependent force def callback_one(lmp, ntimestep, nlocal, tag, x, f): - virial = [1.0, 1.0, 1.0, 0.0, 0.0, 0.0] - lmp.fix_external_set_virial_global("ext",virial) + lmp.fix_external_set_virial_global("ext",[1.0, 1.0, 1.0, 0.0, 0.0, 0.0]) for i in range(nlocal): f[i][0] = float(ntimestep) f[i][1] = float(ntimestep) @@ -74,9 +73,10 @@ class PythonExternal(unittest.TestCase): pair_style zero 0.1 pair_coeff 1 1 velocity all set 0.1 0.0 -0.1 - thermo 5 fix 1 all nve fix ext all external pf/array 1 + thermo_style custom step temp pe ke + thermo 5 """ lmp.commands_string(basic_system) force = lmp.fix_external_get_force("ext"); @@ -85,9 +85,11 @@ class PythonExternal(unittest.TestCase): force[i][0] = 0.0 force[i][1] = 0.0 force[i][2] = 0.0 + lmp.fix_external_set_energy_global("ext", 0.5) lmp.command("run 5 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),4.0/525.0,14) + self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/16.0,14) force = lmp.fix_external_get_force("ext"); nlocal = lmp.extract_setting("nlocal"); @@ -95,8 +97,10 @@ class PythonExternal(unittest.TestCase): force[i][0] = 6.0 force[i][1] = 6.0 force[i][2] = 6.0 + lmp.fix_external_set_energy_global("ext", 1.0) lmp.command("run 5 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) + self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) ############################## if __name__ == "__main__": From a1082f4de96d793e23b820f11aa2cd625ee8f7e0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 19 Jul 2021 12:15:43 -0400 Subject: [PATCH 105/352] fix typo --- doc/src/fix_qeq.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index 6992db6bca..ccacea08db 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -129,10 +129,10 @@ entries per line are required. The fix qeq styles will print a warning if the charges are not equilibrated within *tolerance* by *maxiter* steps, unless the -*warn* keyword is used with "no" as argument. This latter option +*warn* keyword is used with "no" as argument. This latter option may be useful for testing and benchmarking purposes, as it allows to use a fixed number of QEq iterations when *tolerance* is set -to a small enough value to alway reach the *maxiter* limit. Turning +to a small enough value to always reach the *maxiter* limit. Turning off warnings will avoid the excessive output in that case. The *qeq/point* style describes partial charges on atoms as point From 4e0071c8cf63c599478db9a133705404b3fa224b Mon Sep 17 00:00:00 2001 From: kipbarrett Date: Mon, 19 Jul 2021 12:52:09 -0500 Subject: [PATCH 106/352] rearranged deallocation --- src/ML-RANN/pair_rann.cpp | 145 +++++++++++++++++++++++++++----------- src/ML-RANN/pair_rann.h | 1 + 2 files changed, 104 insertions(+), 42 deletions(-) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 95e4d1af58..73ff747c81 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -75,29 +75,90 @@ static const char cite_user_rann_package[] = PairRANN::PairRANN(LAMMPS *lmp) : Pair(lmp) { + //initialize ints and bools single_enable = 0; restartinfo = 0; one_coeff = 1; manybody_flag = 1; allocated = 0; nelements = -1; - elements = nullptr; - mass = nullptr; - - // set comm size needed by this Pair - // comm unused for now. - - comm_forward = 38; - comm_reverse = 30; + nelementsp = -1; + comm_forward = 0; + comm_reverse = 0; res = 10000; cutmax = 0; - //at least one of the following will change during fingerprint definition: + dospin = false; + memguess = 0; + nmax1 = 0; + nmax2 = 0; + fmax = 0; + fnmax = 0; + //at least one of the following two flags will change during fingerprint definition: doscreen = false; allscreen = true; - dospin = false; + + //null init for arrays with sizes not yet determined. + elements = nullptr; + mass = nullptr; + elementsp = nullptr; + map = nullptr; + fingerprintcount = nullptr; + fingerprintlength = nullptr; + fingerprintperelement = nullptr; + screening_min = nullptr; + screening_max = nullptr; + weightdefined = nullptr; + biasdefined = nullptr; + xn = nullptr; + yn = nullptr; + zn = nullptr; + Sik = nullptr; + dSikx = nullptr; + dSiky = nullptr; + dSikz = nullptr; + dSijkx = nullptr; + dSijky = nullptr; + dSijkz = nullptr; + sx = nullptr; + sy = nullptr; + sz = nullptr; + dSijkxc = nullptr; + dSijkyc = nullptr; + dSijkzc = nullptr; + dfeaturesx = nullptr; + dfeaturesy = nullptr; + dfeaturesz = nullptr; + features = nullptr; + layer = nullptr; + sum = nullptr; + sum1 = nullptr; + dlayerx = nullptr; + dlayery = nullptr; + dlayerz = nullptr; + dlayersumx = nullptr; + dlayersumy = nullptr; + dlayersumz = nullptr; + dsx = nullptr; + dsy = nullptr; + dsz = nullptr; + dssumx = nullptr; + dssumy = nullptr; + dssumz = nullptr; + tn = nullptr; + jl = nullptr; + Bij = nullptr; + sims = nullptr; + net = nullptr; + activation = nullptr; + fingerprints = nullptr; } PairRANN::~PairRANN() +{ + deallocate(); +} + +void PairRANN::deallocate() { //clear memory delete[] mass; @@ -157,30 +218,26 @@ PairRANN::~PairRANN() memory->destroy(dlayersumx); memory->destroy(dlayersumy); memory->destroy(dlayersumz); - if (doscreen) { - memory->destroy(Sik); - memory->destroy(Bij); - memory->destroy(dSikx); - memory->destroy(dSiky); - memory->destroy(dSikz); - memory->destroy(dSijkx); - memory->destroy(dSijky); - memory->destroy(dSijkz); - memory->destroy(dSijkxc); - memory->destroy(dSijkyc); - memory->destroy(dSijkzc); - } - if (dospin) { - memory->destroy(sx); - memory->destroy(sy); - memory->destroy(sz); - memory->destroy(dsx); - memory->destroy(dsy); - memory->destroy(dsz); - memory->destroy(dssumx); - memory->destroy(dssumy); - memory->destroy(dssumz); - } + memory->destroy(Sik); + memory->destroy(Bij); + memory->destroy(dSikx); + memory->destroy(dSiky); + memory->destroy(dSikz); + memory->destroy(dSijkx); + memory->destroy(dSijky); + memory->destroy(dSijkz); + memory->destroy(dSijkxc); + memory->destroy(dSijkyc); + memory->destroy(dSijkzc); + memory->destroy(sx); + memory->destroy(sy); + memory->destroy(sz); + memory->destroy(dsx); + memory->destroy(dsy); + memory->destroy(dsz); + memory->destroy(dssumx); + memory->destroy(dssumy); + memory->destroy(dssumz); memory->destroy(setflag); memory->destroy(cutsq); } @@ -243,6 +300,7 @@ void PairRANN::settings(int narg, char ** /*arg*/) void PairRANN::coeff(int narg, char **arg) { int i,j; + deallocate();//clear allocation from any previous coeff map = new int[atom->ntypes+1]; if (narg != 3 + atom->ntypes) error->one(FLERR,"Incorrect args for pair coefficients"); if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) error->one(FLERR,"Incorrect args for pair coefficients"); @@ -294,7 +352,7 @@ void PairRANN::read_file(char *filename) FILE *fp; int eof = 0; std::string line,line1; - int longline = 4096; + const int longline = 4096; int linenum; char linetemp[longline]; std::string strtemp; @@ -405,12 +463,12 @@ void PairRANN::read_fpe(std::vector line,std::vector l } void PairRANN::read_fingerprints(std::vector line,std::vector line1,char *filename,int linenum) { - int nwords1,nwords,i,j,k,i1; + int nwords1,nwords,i,j,k,i1,*atomtypes; bool found; nwords1 = line1.size(); nwords = line.size(); if (nelements == -1)error->one(filename,linenum-1,"atom types must be defined before fingerprints in potential file."); - int atomtypes[nwords-1]; + atomtypes = new int[nwords-1]; for (i=1;i line,std::vectorinit(atomtypes,utils::inumeric(filename,linenum,line1[k++].c_str(),1,lmp)); fingerprintcount[i]++; } + delete[] atomtypes; } void PairRANN::read_fingerprint_constants(std::vector line,std::vector line1,char *filename,int linenum) { - int i,j,k,i1; + int i,j,k,i1,*atomtypes; bool found; int nwords = line.size(); if (nelements == -1)error->one(filename,linenum-1,"atom types must be defined before fingerprints in potential file."); int n_body_type = nwords-4; - int atomtypes[n_body_type]; + atomtypes = new int[n_body_type]; for (i=1;i<=n_body_type;i++) { found = false; for (j=0;j line,std::vec } if (!found) {error->one(filename,linenum-1,"cannot define constants for unknown fingerprint");} fingerprints[i][i1]->fullydefined=fingerprints[i][i1]->parse_values(line[nwords-1],line1); + delete[] atomtypes; } void PairRANN::read_network_layers(std::vector line,std::vector line1,char *filename,int linenum) { @@ -521,7 +581,7 @@ void PairRANN::read_layer_size(std::vector line,std::vector line,std::vector line1,FILE* fp,char *filename,int *linenum) { int i,j,k,l,nwords; char *ptr; - int longline = 4096; + const int longline = 4096; char linetemp [longline]; for (l=0;l line,std::vect } void PairRANN::read_screening(std::vector line,std::vector line1,char *filename,int linenum) { - int i,j,k; + int i,j,k,*atomtypes; bool found; int nwords = line.size(); if (nelements == -1)error->one(filename,linenum-1,"atom types must be defined before fingerprints in potential file."); if (nwords!=5)error->one(filename,linenum-1,"invalid screening command"); int n_body_type = 3; - int atomtypes[n_body_type]; + atomtypes = new int[n_body_type]; for (i=1;i<=n_body_type;i++) { found = false; for (j=0;j line,std::vectorone(filename,linenum-1,"unrecognized screening keyword"); + delete[] atomtypes; } //Called after finishing reading the potential file to make sure it is complete. True is bad. diff --git a/src/ML-RANN/pair_rann.h b/src/ML-RANN/pair_rann.h index ceaa5f445c..6c047775d4 100644 --- a/src/ML-RANN/pair_rann.h +++ b/src/ML-RANN/pair_rann.h @@ -136,6 +136,7 @@ namespace LAMMPS_NS { private: //new functions void allocate(const std::vector &);//called after reading element list, but before reading the rest of the potential + void deallocate(); void read_file(char *);//read potential file void read_atom_types(std::vector,char*,int); void read_fpe(std::vector,std::vector,char*,int);//fingerprints per element. Count total fingerprints defined for each 1st element in element combinations From 9615867600189214066c7969e5eab3e2bf0aad13 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 00:25:32 -0400 Subject: [PATCH 107/352] make contribution to global virial compatible with pf/array mode --- src/fix_external.cpp | 12 ++++++++---- src/fix_external.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 26c852fbd0..99539e86cf 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -80,7 +80,7 @@ FixExternal::~FixExternal() atom->delete_callback(id,Atom::GROW); memory->destroy(fexternal); - delete [] caller_vector; + delete[] caller_vector; } /* ---------------------------------------------------------------------- */ @@ -163,6 +163,12 @@ void FixExternal::post_force(int vflag) f[i][1] += fexternal[i][1]; f[i][2] += fexternal[i][2]; } + + // add contribution to global virial from previously stored value + + if (vflag_global) + for (int i = 0; i < 6; ++i) + virial[i] = user_virial[i]; } } @@ -196,10 +202,8 @@ void FixExternal::set_energy_global(double caller_energy) void FixExternal::set_virial_global(double *caller_virial) { - if (!vflag_global) return; - for (int i = 0; i < 6; i++) - virial[i] = caller_virial[i]; + user_virial[i] = caller_virial[i]; } /* ---------------------------------------------------------------------- diff --git a/src/fix_external.h b/src/fix_external.h index f0f46cd4c5..16db5d5015 100644 --- a/src/fix_external.h +++ b/src/fix_external.h @@ -64,6 +64,7 @@ class FixExternal : public Fix { FnPtr callback; void *ptr_caller; double user_energy; + double user_virial[6]; double *caller_vector; }; From f6e9c308181c577ec26fc4d827fb052960ad5e7d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 00:47:10 -0400 Subject: [PATCH 108/352] update unit tests --- unittest/c-library/test_library_external.cpp | 15 ++++++++++++--- unittest/python/python-fix-external.py | 9 +++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 8acb7a43f4..005b31fcab 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -162,13 +162,17 @@ TEST(lammps_external, array) for (int i = 0; i < nlocal; ++i) force[i][0] = force[i][1] = force[i][2] = 0.0; lammps_fix_external_set_energy_global(handle, "ext", 0.5); + double v[6] = {0.5, 0.5, 0.5, 0.0, 0.0, 0.0}; + lammps_fix_external_set_virial_global(handle, "ext", v); lammps_command(handle, "run 5 post no"); - double temp = lammps_get_thermo(handle, "temp"); - double pe = lammps_get_thermo(handle, "pe"); - output = ::testing::internal::GetCapturedStdout(); + double temp = lammps_get_thermo(handle, "temp"); + double pe = lammps_get_thermo(handle, "pe"); + double press = lammps_get_thermo(handle, "press"); + output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 4.0 / 525.0); EXPECT_DOUBLE_EQ(pe, 1.0 / 16.0); + EXPECT_DOUBLE_EQ(press, 0.069166666666666668); ::testing::internal::CaptureStdout(); nlocal = lammps_extract_setting(handle, "nlocal"); @@ -176,13 +180,18 @@ TEST(lammps_external, array) for (int i = 0; i < nlocal; ++i) force[i][0] = force[i][1] = force[i][2] = 6.0; lammps_fix_external_set_energy_global(handle, "ext", 1.0); + v[0] = v[1] = v[2] = 1.0; + v[3] = v[4] = v[5] = 0.0; + lammps_fix_external_set_virial_global(handle, "ext", v); lammps_command(handle, "run 5 post no"); temp = lammps_get_thermo(handle, "temp"); pe = lammps_get_thermo(handle, "pe"); + press = lammps_get_thermo(handle, "press"); output = ::testing::internal::GetCapturedStdout(); if (verbose) std::cout << output; EXPECT_DOUBLE_EQ(temp, 1.0 / 30.0); EXPECT_DOUBLE_EQ(pe, 1.0 / 8.0); + EXPECT_DOUBLE_EQ(press, 0.15416666666666667); ::testing::internal::CaptureStdout(); lammps_close(handle); diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index e1c511d480..2d4c50e454 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -75,7 +75,8 @@ class PythonExternal(unittest.TestCase): velocity all set 0.1 0.0 -0.1 fix 1 all nve fix ext all external pf/array 1 - thermo_style custom step temp pe ke + fix_modify ext energy yes virial yes + thermo_style custom step temp pe ke press thermo 5 """ lmp.commands_string(basic_system) @@ -86,10 +87,12 @@ class PythonExternal(unittest.TestCase): force[i][1] = 0.0 force[i][2] = 0.0 lmp.fix_external_set_energy_global("ext", 0.5) - + lmp.fix_external_set_virial_global("ext",[0.5, 0.5, 0.5, 0.0, 0.0, 0.0]) + lmp.command("run 5 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),4.0/525.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/16.0,14) + self.assertAlmostEqual(lmp.get_thermo("press"),0.06916666666666667,14) force = lmp.fix_external_get_force("ext"); nlocal = lmp.extract_setting("nlocal"); @@ -98,9 +101,11 @@ class PythonExternal(unittest.TestCase): force[i][1] = 6.0 force[i][2] = 6.0 lmp.fix_external_set_energy_global("ext", 1.0) + lmp.fix_external_set_virial_global("ext",[1.0, 1.0, 1.0, 0.0, 0.0, 0.0]) lmp.command("run 5 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) + self.assertAlmostEqual(lmp.get_thermo("press"),0.15416666666666667,14) ############################## if __name__ == "__main__": From f53c1978cc7dee4f407581414a1de56f57e43711 Mon Sep 17 00:00:00 2001 From: Donatas Surblys Date: Wed, 21 Jul 2021 12:27:37 +0900 Subject: [PATCH 109/352] swap groups in the example snippet to get consistent pressure and heat flux sign --- doc/src/compute_tally.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/compute_tally.rst b/doc/src/compute_tally.rst index 81756dda7c..8aca53bb3c 100644 --- a/doc/src/compute_tally.rst +++ b/doc/src/compute_tally.rst @@ -106,7 +106,7 @@ The following example demonstrates the difference: # Has LeftLiquid and RightWall groups along x direction. # Heat flux over the solid-liquid interface - compute hflow_hfvt LeftLiquid heat/flux/virial/tally RightWall + compute hflow_hfvt RightWall heat/flux/virial/tally LeftLiquid variable hflux_hfvt equal c_hflow_hfvt/(ly*lz) # x component of approximate heat flux vector inside the liquid region, @@ -131,7 +131,7 @@ The following example demonstrates the difference: variable press_ft equal c_rforce_ft/(ly*lz) # compute rforce_hfvt all reduce sum c_hflow_hfvt[1] - variable press_hfvt equal -c_rforce_hfvt/(ly*lz) + variable press_hfvt equal c_rforce_hfvt/(ly*lz) ---------- From 13147707aa6bce793a9a9a48e51c5c5939313bfd Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 21 Jul 2021 11:33:11 -0400 Subject: [PATCH 110/352] Add utility script to help update URLs for offline tool --- tools/offline/scripts/update_downloads.sh | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 tools/offline/scripts/update_downloads.sh diff --git a/tools/offline/scripts/update_downloads.sh b/tools/offline/scripts/update_downloads.sh new file mode 100755 index 0000000000..247b92e562 --- /dev/null +++ b/tools/offline/scripts/update_downloads.sh @@ -0,0 +1,25 @@ +#!/bin/bash +#helper script to update URLs from CMake folder + +CMAKE_FOLDER=../../../cmake + +function extract_setting() +{ + export $1=$(grep -Rh "set($1" ../../../cmake/ | cut -d\" -f2) +} + +function update_setting() +{ + echo Setting $1 to $2 + sed -i "/^$1=/c$1=\"$2\"" init_http_cache.sh +} + + +URLS=$(grep -Rh "_URL=" init_http_cache.sh | grep -v ^LAMMPS | grep -v SCAFACOS_FIX | cut -d= -f1) + +# update URLs by grabbing the latest ones from cmake files +for URL in $URLS +do + extract_setting "$URL" + update_setting "$URL" ${!URL} +done From d7edc95193a9ea3a7d85061b21fa4087bdbf7a89 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 21 Jul 2021 11:34:43 -0400 Subject: [PATCH 111/352] Update init_http_cache.sh --- tools/offline/scripts/init_http_cache.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/offline/scripts/init_http_cache.sh b/tools/offline/scripts/init_http_cache.sh index 9bda6cdaa5..55856bbf21 100755 --- a/tools/offline/scripts/init_http_cache.sh +++ b/tools/offline/scripts/init_http_cache.sh @@ -40,26 +40,26 @@ echo "Dowloading thirdparty tarballs..." MPICH2_WIN64_DEVEL_URL="${LAMMPS_THIRDPARTY_URL}/mpich2-win64-devel.tar.gz" MPICH2_WIN32_DEVEL_URL="${LAMMPS_THIRDPARTY_URL}/mpich2-win32-devel.tar.gz" VORO_URL="${LAMMPS_THIRDPARTY_URL}/voro++-0.4.6.tar.gz" -OPENCL_LOADER_URL="${LAMMPS_THIRDPARTY_URL}/opencl-loader-2020.12.18.tar.gz" +OPENCL_LOADER_URL="${LAMMPS_THIRDPARTY_URL}/opencl-loader-2021.06.30.tar.gz" SCAFACOS_FIX_URL="${LAMMPS_THIRDPARTY_URL}/scafacos-1.0.1-fix.diff" GTEST_URL="https://github.com/google/googletest/archive/release-1.10.0.tar.gz" YAML_URL="https://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz" -MATHJAX_URL="https://github.com/mathjax/MathJax/archive/3.1.2.tar.gz" +MATHJAX_URL="https://github.com/mathjax/MathJax/archive/3.1.3.tar.gz" EIGEN3_URL="https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz" CUB_URL="https://github.com/NVlabs/cub/archive/1.12.0.tar.gz" -KOKKOS_URL="https://github.com/kokkos/kokkos/archive/3.3.01.tar.gz" +KOKKOS_URL="https://github.com/kokkos/kokkos/archive/3.4.01.tar.gz" KIM_URL="https://s3.openkim.org/kim-api/kim-api-2.2.1.txz" MSCG_URL="https://github.com/uchicago-voth/MSCG-release/archive/1.7.3.1.tar.gz" -PLUMED_URL="https://github.com/plumed/plumed2/releases/download/v2.7.0/plumed-src-2.7.0.tgz" +PLUMED_URL="https://github.com/plumed/plumed2/releases/download/v2.7.1/plumed-src-2.7.1.tgz" PACELIB_URL="https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.4.9.tar.gz" LATTE_URL="https://github.com/lanl/LATTE/archive/v1.2.2.tar.gz" SCAFACOS_URL="https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz" MDI_URL="https://github.com/MolSSI-MDI/MDI_Library/archive/v1.2.9.tar.gz" GTEST_FILENAME="gtest-1.10.0.tar.gz" -MATHJAX_FILENAME="mathjax-3.1.2.tar.gz" +MATHJAX_FILENAME="mathjax-3.1.3.tar.gz" CUB_FILENAME="cub-1.12.0.tar.gz" -KOKKOS_FILENAME="kokkos-3.3.01.tar.gz" +KOKKOS_FILENAME="kokkos-3.4.01.tar.gz" MSCG_FILENAME="mscg-1.7.3.1.tar.gz" LATTE_FILENAME="latte-1.2.2.tar.gz" PACELIB_FILENAME="pacelib-2021.4.9.tar.gz" From 72744ea441fb2e0b04e4a8df058c2a1063ddb456 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 12:08:19 -0400 Subject: [PATCH 112/352] update swig interface file to the latest changes in the c library header --- tools/swig/lammps.i | 46 ++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/tools/swig/lammps.i b/tools/swig/lammps.i index 56547dda53..5bf47f2463 100644 --- a/tools/swig/lammps.i +++ b/tools/swig/lammps.i @@ -128,16 +128,27 @@ extern int lammps_id_name(void *, const char *, int, char *buffer, int buf_si extern int lammps_plugin_count(); extern int lammps_plugin_name(int, char *, char *, int); /* -extern int lammps_encode_image_flags(int ix, int iy, int iz); -extern void lammps_decode_image_flags(int image, int *flags); -extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); -extern void lammps_decode_image_flags(int64_t image, int *flags); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_fix_external_set_energy_global(void *, char *, double); -extern void lammps_fix_external_set_virial_global(void *, char *, double *); + * Have not found a good way to map these functions in a general way. + * So some individual customization for the specific use case and compilation is needed. + * + extern int lammps_encode_image_flags(int ix, int iy, int iz); + extern void lammps_decode_image_flags(int image, int *flags); + extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); + extern void lammps_decode_image_flags(int64_t image, int *flags); + + * Supporting the fix external callback mechanism will require extra code specific to the application. + typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); + extern void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr); + * these two functions can only be used from the callback, so we don't support them either + extern void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng); + extern void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); */ +extern double **lammps_fix_external_get_force(void *handle, const char *id); +extern void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng); +extern void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial); +extern void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); +extern void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val); + extern void lammps_free(void *ptr); extern int lammps_is_running(void *handle); extern void lammps_force_timeout(void *handle); @@ -255,16 +266,21 @@ extern int lammps_encode_image_flags(int ix, int iy, int iz); extern void lammps_decode_image_flags(int image, int *flags); extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); extern void lammps_decode_image_flags(int64_t image, int *flags); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); -extern void lammps_fix_external_set_energy_global(void *, char *, double); -extern void lammps_fix_external_set_virial_global(void *, char *, double *); +typedef void (*FixExternalFnPtr)(void *, int64_t, int, int64_t *, double **, double **); +extern void lammps_set_fix_external_callback(void *handle, const char *id, FixExternalFnPtr funcptr, void *ptr); +extern void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng); +extern void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial); */ +extern double **lammps_fix_external_get_force(void *handle, const char *id); +extern void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng); +extern void lammps_fix_external_set_virial_global(void *handle, const char *id, double *virial); +extern void lammps_fix_external_set_vector_length(void *handle, const char *id, int len); +extern void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val); + extern void lammps_free(void *ptr); 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); -/* last revised for LAMMPS 8 April 2021 */ +/* last revised on 21 July 2021 */ From b20fcbd686046687582d2d79dcf471062cd5bcf5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 16:00:28 -0400 Subject: [PATCH 113/352] implement per-atom stress and nofdotr support for reax/c/omp --- src/OPENMP/pair_reaxc_omp.cpp | 4 -- src/OPENMP/pair_reaxc_omp.h | 6 ++ src/OPENMP/reaxc_bond_orders_omp.cpp | 42 ++++--------- src/OPENMP/reaxc_bonds_omp.cpp | 16 ++--- src/OPENMP/thr_omp.cpp | 22 +++++++ src/OPENMP/thr_omp.h | 4 +- src/REAXFF/reaxc_bond_orders.cpp | 88 ++++++++++++++-------------- src/REAXFF/reaxc_bonds.cpp | 2 +- 8 files changed, 92 insertions(+), 92 deletions(-) diff --git a/src/OPENMP/pair_reaxc_omp.cpp b/src/OPENMP/pair_reaxc_omp.cpp index 2596f8390b..b65c9a391f 100644 --- a/src/OPENMP/pair_reaxc_omp.cpp +++ b/src/OPENMP/pair_reaxc_omp.cpp @@ -233,10 +233,6 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_atom) - error->all(FLERR,"Pair style reax/c/omp does not support " - "computing per-atom stress"); - api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts api->system->bigN = static_cast (atom->natoms); // all atoms in the system diff --git a/src/OPENMP/pair_reaxc_omp.h b/src/OPENMP/pair_reaxc_omp.h index d8152656ff..81d1c35b0e 100644 --- a/src/OPENMP/pair_reaxc_omp.h +++ b/src/OPENMP/pair_reaxc_omp.h @@ -76,6 +76,12 @@ class PairReaxCOMP : public PairReaxC, public ThrOMP { ev_tally3_thr(this, i, j, k, evdwl, ecoul, fj, fk, drji, drki, thrparm); } + inline void v_tally2_newton_thr_proxy(const int i, const double *const fi, + const double *const deli, ThrData *const thrparm) + { + v_tally2_newton_thr(this, i, fi, deli, thrparm); + } + inline void v_tally3_thr_proxy(const int i, const int j, const int k, const double *const fi, const double *const fk, const double *const drij, const double *const drkj, ThrData *const thrparm) diff --git a/src/OPENMP/reaxc_bond_orders_omp.cpp b/src/OPENMP/reaxc_bond_orders_omp.cpp index 9c026ee95c..3e419792d9 100644 --- a/src/OPENMP/reaxc_bond_orders_omp.cpp +++ b/src/OPENMP/reaxc_bond_orders_omp.cpp @@ -37,8 +37,8 @@ using namespace LAMMPS_NS; namespace ReaxFF { - void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, - storage *workspace, reax_list **lists) { + void Add_dBond_to_ForcesOMP(reax_system *system, int i, int pj, storage *workspace, reax_list **lists) + { reax_list *bonds = (*lists) + BONDS; bond_data *nbr_j, *nbr_k; bond_order_data *bo_ij, *bo_ji; @@ -94,12 +94,10 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+i],temp); if (system->pair_ptr->vflag_either) { - rvec_Scale(fi_tmp, -1.0, temp); + rvec_Scale(fi_tmp, -0.5, temp); rvec_ScaledSum(delij, 1., system->my_atoms[i].x,-1., system->my_atoms[j].x); - pair_reax_ptr->ev_tally_xyz_thr_proxy(i,j,system->N,0,0,0, - fi_tmp[0],fi_tmp[1],fi_tmp[2], - delij[0],delij[1],delij[2],thr); + pair_reax_ptr->v_tally2_newton_thr_proxy(i,fi_tmp,delij,thr); } c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); @@ -115,12 +113,9 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+j],temp); if (system->pair_ptr->vflag_either) { - rvec_Scale(fj_tmp, -1.0, temp); + rvec_Scale(fj_tmp, -0.5, temp); rvec_ScaledSum(delji, 1., system->my_atoms[j].x,-1., system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(j,i,system->N,0,0,0, - fj_tmp[0],fj_tmp[1],fj_tmp[2], - delji[0],delji[1],delji[2],thr); + pair_reax_ptr->v_tally2_newton_thr_proxy(j,fj_tmp,delji,thr); } // forces on k: i neighbor @@ -134,17 +129,11 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+k],temp); if (system->pair_ptr->vflag_either) { - rvec_Scale(fk_tmp, -1.0, temp); + rvec_Scale(fk_tmp, -0.5, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); + pair_reax_ptr->v_tally2_newton_thr_proxy(k,fk_tmp,delki,thr); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); + pair_reax_ptr->v_tally2_newton_thr_proxy(k,fk_tmp,delkj,thr); } } @@ -159,18 +148,11 @@ namespace ReaxFF { rvec_Add(workspace->forceReduction[reductionOffset+k],temp); if (system->pair_ptr->vflag_either) { - rvec_Scale(fk_tmp, -1.0, temp); + rvec_Scale(fk_tmp, -0.5, temp); rvec_ScaledSum(delki,1.,system->my_atoms[k].x,-1.,system->my_atoms[i].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(k,i,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delki[0],delki[1],delki[2],thr); - + pair_reax_ptr->v_tally2_newton_thr_proxy(k,fk_tmp,delki,thr); rvec_ScaledSum(delkj,1.,system->my_atoms[k].x,-1.,system->my_atoms[j].x); - - pair_reax_ptr->ev_tally_xyz_thr_proxy(k,j,system->N,0,0,0, - fk_tmp[0],fk_tmp[1],fk_tmp[2], - delkj[0],delkj[1],delkj[2],thr); + pair_reax_ptr->v_tally2_newton_thr_proxy(k,fk_tmp,delkj,thr); } } } diff --git a/src/OPENMP/reaxc_bonds_omp.cpp b/src/OPENMP/reaxc_bonds_omp.cpp index 2357d20690..784af432cc 100644 --- a/src/OPENMP/reaxc_bonds_omp.cpp +++ b/src/OPENMP/reaxc_bonds_omp.cpp @@ -1,14 +1,12 @@ // clang-format off /*---------------------------------------------------------------------- PuReMD - Purdue ReaxFF Molecular Dynamics Program - Website: https://www.cs.purdue.edu/puremd Copyright (2010) Purdue University - - Contributing authors: - H. M. Aktulga, J. Fogarty, S. Pandit, A. Grama - Corresponding author: - Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu + Hasan Metin Aktulga, hmaktulga@lbl.gov + Joseph Fogarty, jcfogart@mail.usf.edu + Sagar Pandit, pandit@usf.edu + Ananth Y Grama, ayg@cs.purdue.edu Please cite the related publication: H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, @@ -122,8 +120,7 @@ namespace ReaxFF { /* tally into per-atom energy */ if (system->pair_ptr->eflag_either) - pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, - ebond, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + pair_reax_ptr->ev_tally_thr_proxy(i,j,natoms,1,ebond,0.0,0.0,0.0,0.0,0.0,thr); /* calculate derivatives of Bond Orders */ bo_ij->Cdbo += CEbo; @@ -153,8 +150,7 @@ namespace ReaxFF { /* tally into per-atom energy */ if (system->pair_ptr->eflag_either) - pair_reax_ptr->ev_tally_thr_proxy( i, j, natoms, 1, - estriph, 0.0, 0.0, 0.0, 0.0, 0.0, thr); + pair_reax_ptr->ev_tally_thr_proxy(i,j,natoms,1,estriph,0.0,0.0,0.0,0.0,0.0,thr); bo_ij->Cdbo += decobdbo; workspace->CdDelta[i] += decobdboua; diff --git a/src/OPENMP/thr_omp.cpp b/src/OPENMP/thr_omp.cpp index 545e3bbe88..7f4bc95e8c 100644 --- a/src/OPENMP/thr_omp.cpp +++ b/src/OPENMP/thr_omp.cpp @@ -1499,6 +1499,28 @@ void ThrOMP::v_tally2_thr(Pair *const pair, const int i, const int j, const doub } } +/* ---------------------------------------------------------------------- + tally virial into per-atom accumulators + called by RexaFF potential, newton_pair is always on + fi is magnitude of force on atom i, deli is the direction + note that the other atom (j) is not updated, due to newton on +------------------------------------------------------------------------- */ + +void ThrOMP::v_tally2_newton_thr(Pair *const pair, const int i, const double * const fi, + const double * const deli, ThrData * const thr) +{ + double v[6]; + + v[0] = deli[0]*fi[0]; + v[1] = deli[1]*fi[1]; + v[2] = deli[2]*fi[2]; + v[3] = deli[0]*fi[1]; + v[4] = deli[0]*fi[2]; + v[5] = deli[1]*fi[2]; + if (pair->vflag_global) v_tally(thr->virial_pair,v); + if (pair->vflag_atom) v_tally(thr->vatom_pair[i],v); +} + /* ---------------------------------------------------------------------- tally virial into per-atom accumulators called by AIREBO and Tersoff potential, newton_pair is always on diff --git a/src/OPENMP/thr_omp.h b/src/OPENMP/thr_omp.h index 35cd43be5d..02fdbdf25b 100644 --- a/src/OPENMP/thr_omp.h +++ b/src/OPENMP/thr_omp.h @@ -135,8 +135,8 @@ class ThrOMP { void ev_tally_xyz_full_thr(Pair *const, const int, const double, const double, const double, const double, const double, const double, const double, const double, ThrData *const); - void v_tally2_thr(Pair *const, const int, const int, const double, const double *const, - ThrData *const); + void v_tally2_thr(Pair *const, const int, const int, const double, const double *const, ThrData *const); + void v_tally2_newton_thr(Pair *const, const int, const double *const, const double *const, ThrData *const); void ev_tally3_thr(Pair *const, const int, const int, const int, const double, const double, const double *const, const double *const, const double *const, const double *const, ThrData *const); diff --git a/src/REAXFF/reaxc_bond_orders.cpp b/src/REAXFF/reaxc_bond_orders.cpp index 0e4227922b..d827e3753d 100644 --- a/src/REAXFF/reaxc_bond_orders.cpp +++ b/src/REAXFF/reaxc_bond_orders.cpp @@ -50,35 +50,37 @@ namespace ReaxFF { bo_ij = &(nbr_j->bo_data); bo_ji = &(bonds->select.bond_list[nbr_j->sym_index].bo_data); - coef.C1dbo = bo_ij->C1dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C2dbo = bo_ij->C2dbo * (bo_ij->Cdbo + bo_ji->Cdbo); - coef.C3dbo = bo_ij->C3dbo * (bo_ij->Cdbo + bo_ji->Cdbo); + double c = bo_ij->Cdbo + bo_ji->Cdbo; + coef.C1dbo = bo_ij->C1dbo * c; + coef.C2dbo = bo_ij->C2dbo * c; + coef.C3dbo = bo_ij->C3dbo * c; - coef.C1dbopi = bo_ij->C1dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C2dbopi = bo_ij->C2dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C3dbopi = bo_ij->C3dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); - coef.C4dbopi = bo_ij->C4dbopi * (bo_ij->Cdbopi + bo_ji->Cdbopi); + c = bo_ij->Cdbopi + bo_ji->Cdbopi; + coef.C1dbopi = bo_ij->C1dbopi * c; + coef.C2dbopi = bo_ij->C2dbopi * c; + coef.C3dbopi = bo_ij->C3dbopi * c; + coef.C4dbopi = bo_ij->C4dbopi * c; - coef.C1dbopi2 = bo_ij->C1dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C2dbopi2 = bo_ij->C2dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C3dbopi2 = bo_ij->C3dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); - coef.C4dbopi2 = bo_ij->C4dbopi2 * (bo_ij->Cdbopi2 + bo_ji->Cdbopi2); + c = bo_ij->Cdbopi2 + bo_ji->Cdbopi2; + coef.C1dbopi2 = bo_ij->C1dbopi2 * c; + coef.C2dbopi2 = bo_ij->C2dbopi2 * c; + coef.C3dbopi2 = bo_ij->C3dbopi2 * c; + coef.C4dbopi2 = bo_ij->C4dbopi2 * c; - coef.C1dDelta = bo_ij->C1dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C2dDelta = bo_ij->C2dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); - coef.C3dDelta = bo_ij->C3dbo * (workspace->CdDelta[i]+workspace->CdDelta[j]); + c = workspace->CdDelta[i] + workspace->CdDelta[j]; + coef.C1dDelta = bo_ij->C1dbo * c; + coef.C2dDelta = bo_ij->C2dbo * c; + coef.C3dDelta = bo_ij->C3dbo * c; + + c = (coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp); + + c = (coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[i]); - // forces on i - rvec_Scale( temp, coef.C1dbo, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C2dbo, workspace->dDeltap_self[i]); - rvec_ScaledAdd(temp, coef.C1dDelta, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C2dDelta, workspace->dDeltap_self[i]); rvec_ScaledAdd(temp, coef.C1dbopi, bo_ij->dln_BOp_pi); - rvec_ScaledAdd(temp, coef.C2dbopi, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C3dbopi, workspace->dDeltap_self[i]); rvec_ScaledAdd(temp, coef.C1dbopi2, bo_ij->dln_BOp_pi2); - rvec_ScaledAdd(temp, coef.C2dbopi2, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C3dbopi2, workspace->dDeltap_self[i]); + rvec_Add(workspace->f[i], temp); if (system->pair_ptr->vflag_either) { @@ -87,17 +89,15 @@ namespace ReaxFF { system->pair_ptr->v_tally2_newton(i,fi_tmp,delij); } - // forces on j - rvec_Scale( temp, -coef.C1dbo, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C3dbo, workspace->dDeltap_self[j]); - rvec_ScaledAdd(temp, -coef.C1dDelta, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C3dDelta, workspace->dDeltap_self[j]); + c = -(coef.C1dbo + coef.C1dDelta + coef.C2dbopi + coef.C2dbopi2); + rvec_Scale( temp, c, bo_ij->dBOp); + + c = (coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_ScaledAdd(temp, c, workspace->dDeltap_self[j]); + rvec_ScaledAdd(temp, -coef.C1dbopi, bo_ij->dln_BOp_pi); - rvec_ScaledAdd(temp, -coef.C2dbopi, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C4dbopi, workspace->dDeltap_self[j]); rvec_ScaledAdd(temp, -coef.C1dbopi2, bo_ij->dln_BOp_pi2); - rvec_ScaledAdd(temp, -coef.C2dbopi2, bo_ij->dBOp); - rvec_ScaledAdd(temp, coef.C4dbopi2, workspace->dDeltap_self[j]); + rvec_Add(workspace->f[j], temp); if (system->pair_ptr->vflag_either) { @@ -111,10 +111,9 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C2dbo, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C2dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C3dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C3dbopi2, nbr_k->bo_data.dBOp); + const double c = -(coef.C2dbo + coef.C2dDelta + coef.C3dbopi + coef.C3dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + rvec_Add(workspace->f[k], temp); if (system->pair_ptr->vflag_either) { @@ -131,10 +130,9 @@ namespace ReaxFF { nbr_k = &(bonds->select.bond_list[pk]); k = nbr_k->nbr; - rvec_Scale( temp, -coef.C3dbo, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C3dDelta, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C4dbopi, nbr_k->bo_data.dBOp); - rvec_ScaledAdd(temp, -coef.C4dbopi2, nbr_k->bo_data.dBOp); + const double c = -(coef.C3dbo + coef.C3dDelta + coef.C4dbopi + coef.C4dbopi2); + rvec_Scale(temp, c, nbr_k->bo_data.dBOp); + rvec_Add(workspace->f[k], temp); if (system->pair_ptr->vflag_either) { @@ -152,14 +150,14 @@ namespace ReaxFF { single_body_parameters *sbp_i, single_body_parameters *sbp_j, two_body_parameters *twbp) { int j, btop_j; - double r2, C12, C34, C56; + double rr2, C12, C34, C56; double Cln_BOp_s, Cln_BOp_pi, Cln_BOp_pi2; double BO, BO_s, BO_pi, BO_pi2; bond_data *ibond, *jbond; bond_order_data *bo_ij, *bo_ji; j = nbr_pj->nbr; - r2 = SQR(nbr_pj->d); + rr2 = 1.0 / SQR(nbr_pj->d); if (sbp_i->r_s > 0.0 && sbp_j->r_s > 0.0) { C12 = twbp->p_bo1 * pow(nbr_pj->d / twbp->r_s, twbp->p_bo2); @@ -207,9 +205,9 @@ namespace ReaxFF { bo_ji->BO_pi2 = bo_ij->BO_pi2 = BO_pi2; /* Bond Order page2-3, derivative of total bond order prime */ - Cln_BOp_s = twbp->p_bo2 * C12 / r2; - Cln_BOp_pi = twbp->p_bo4 * C34 / r2; - Cln_BOp_pi2 = twbp->p_bo6 * C56 / r2; + Cln_BOp_s = twbp->p_bo2 * C12 * rr2; + Cln_BOp_pi = twbp->p_bo4 * C34 * rr2; + Cln_BOp_pi2 = twbp->p_bo6 * C56 * rr2; /* Only dln_BOp_xx wrt. dr_i is stored here, note that dln_BOp_xx/dr_i = -dln_BOp_xx/dr_j and all others are 0 */ diff --git a/src/REAXFF/reaxc_bonds.cpp b/src/REAXFF/reaxc_bonds.cpp index 7feea043fa..cb28aaa1ca 100644 --- a/src/REAXFF/reaxc_bonds.cpp +++ b/src/REAXFF/reaxc_bonds.cpp @@ -11,7 +11,7 @@ Please cite the related publication: H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, "Parallel Reactive Molecular Dynamics: Numerical Methods and - Algorithmic Techniques", Parallel Computing, in press. + Algorithmic Techniques", Parallel Computing, 38 (4-5), 245-259 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as From 5436975fa2f5379a465ee1fe0eba4e2514e1986d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 16:01:28 -0400 Subject: [PATCH 114/352] update unit test reference data for REAXFF also with OpenMP enabled --- .../tests/atomic-pair-reax_c.yaml | 253 +++++++++-------- .../tests/atomic-pair-reax_c_lgvdw.yaml | 249 +++++++++-------- .../tests/atomic-pair-reax_c_noqeq.yaml | 261 +++++++++--------- .../tests/atomic-pair-reax_c_tabulate.yaml | 247 +++++++++-------- 4 files changed, 503 insertions(+), 507 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index 22cc182b30..9eaad2a949 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,8 +1,7 @@ --- lammps_version: 2 Jul 2021 -date_generated: Mon Jul 12 20:56:37 2021 +date_generated: Wed Jul 21 15:49:45 2021 epsilon: 1e-11 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -38,139 +37,139 @@ natoms: 64 init_vdwl: -3296.3503506624793 init_coul: -327.06551252279587 init_stress: ! |- - -1.0522112314759645e+03 -1.2629480788292406e+03 -8.6765541430728683e+02 -2.5149818635822589e+02 2.0624598409299679e+02 -6.4309968343216531e+02 + -1.0522112314759656e+03 -1.2629480788292419e+03 -8.6765541430728797e+02 -2.5149818635822544e+02 2.0624598409299588e+02 -6.4309968343216440e+02 init_forces: ! |2 - 1 -8.8484559491557889e+01 -2.5824737864578637e+01 1.0916228789487674e+02 - 2 -1.1227736122976223e+02 -1.8092349731667616e+02 -2.2420586526896261e+02 - 3 -1.7210817575849026e+02 1.8292439782308702e+02 1.3552618819720569e+01 - 4 3.2997500231085269e+01 -5.1076027616185407e+01 9.0475628837095513e+01 - 5 1.8144778146274791e+02 1.6797701000587466e+01 -8.1725507301127038e+01 - 6 1.3634094180728110e+02 -3.0056789474000180e+02 2.9661495129805957e+01 - 7 -5.3287158661291762e+01 -1.2872927610192625e+02 -1.6347871108897493e+02 - 8 -1.5334883257588757e+02 4.0171483324130726e+01 1.5317461163040997e+02 - 9 1.8364155867634079e+01 8.1986572088186804e+01 2.8272397798081524e+01 - 10 8.4246730110712534e+01 1.4177487113456962e+02 1.2330079878579957e+02 - 11 -4.3218423112520902e+01 6.5551082199289709e+01 1.3464882148706636e+02 - 12 -9.7317470492933836e+01 -2.6234999414154014e+01 7.2277941881646539e+00 - 13 -6.3183329836753863e+01 -4.7368101002971272e+01 -3.7592654029315021e+01 - 14 7.8642975316486172e+01 -6.7997612991897455e+01 -9.9044775614596048e+01 - 15 -6.6373732796038979e+01 2.1787558547532143e+02 8.0103149369093387e+01 - 16 1.9216166082224373e+02 5.3228015320734819e+01 6.6260214054210593e+01 - 17 1.4496007689503062e+02 -3.9700923044583718e+01 -9.7503851828130053e+01 - 18 -4.4989550233790240e+01 -1.9360605894359739e+02 1.1274792197022482e+02 - 19 2.6657528138945770e+02 3.7189510796650950e+02 -3.3847307488287703e+02 - 20 -7.6341040242469418e+01 -8.8478925962203348e+01 1.3557778212060649e+00 - 21 -7.1188591900926752e+01 -5.1591439985136624e+01 -1.2279442803769274e+02 - 22 1.5504836733039957e+02 -1.3094504458746073e+02 8.1474408030760628e+01 - 23 7.8015302036861655e+01 -1.3272310040521637e+01 -2.2771427736544183e+01 - 24 -2.0546718065741098e+02 2.1611071031053456e+02 -1.2423208053538966e+02 - 25 -1.1402686646199034e+02 1.9100238121128132e+02 -8.3504908417580012e+01 - 26 2.8663576552098772e+02 -2.1773884754170604e+02 2.3144300100087472e+02 - 27 -6.3247409025611177e+01 6.9122196748087077e+01 1.8606936744368778e+02 - 28 -3.5426011055935240e+00 3.8764809029451875e+01 3.2874001946768900e+01 - 29 -7.1069178571876577e+01 3.5485903180427719e+01 2.7311648896320204e+01 - 30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123537e+02 + 1 -8.8484559491557889e+01 -2.5824737864578672e+01 1.0916228789487677e+02 + 2 -1.1227736122976222e+02 -1.8092349731667619e+02 -2.2420586526896258e+02 + 3 -1.7210817575849026e+02 1.8292439782308693e+02 1.3552618819720610e+01 + 4 3.2997500231085269e+01 -5.1076027616185407e+01 9.0475628837095528e+01 + 5 1.8144778146274791e+02 1.6797701000587494e+01 -8.1725507301127109e+01 + 6 1.3634094180728098e+02 -3.0056789474000180e+02 2.9661495129805985e+01 + 7 -5.3287158661291791e+01 -1.2872927610192625e+02 -1.6347871108897493e+02 + 8 -1.5334883257588757e+02 4.0171483324130705e+01 1.5317461163041000e+02 + 9 1.8364155867634015e+01 8.1986572088186833e+01 2.8272397798081524e+01 + 10 8.4246730110712562e+01 1.4177487113456959e+02 1.2330079878579957e+02 + 11 -4.3218423112520917e+01 6.5551082199289681e+01 1.3464882148706636e+02 + 12 -9.7317470492933836e+01 -2.6234999414154061e+01 7.2277941881646433e+00 + 13 -6.3183329836753892e+01 -4.7368101002971272e+01 -3.7592654029315028e+01 + 14 7.8642975316486144e+01 -6.7997612991897398e+01 -9.9044775614596077e+01 + 15 -6.6373732796038979e+01 2.1787558547532149e+02 8.0103149369093416e+01 + 16 1.9216166082224373e+02 5.3228015320734841e+01 6.6260214054210607e+01 + 17 1.4496007689503060e+02 -3.9700923044583725e+01 -9.7503851828130109e+01 + 18 -4.4989550233790240e+01 -1.9360605894359739e+02 1.1274792197022477e+02 + 19 2.6657528138945764e+02 3.7189510796650950e+02 -3.3847307488287709e+02 + 20 -7.6341040242469404e+01 -8.8478925962203348e+01 1.3557778212060665e+00 + 21 -7.1188591900926752e+01 -5.1591439985136596e+01 -1.2279442803769271e+02 + 22 1.5504836733039957e+02 -1.3094504458746079e+02 8.1474408030760628e+01 + 23 7.8015302036861712e+01 -1.3272310040521580e+01 -2.2771427736544119e+01 + 24 -2.0546718065741095e+02 2.1611071031053456e+02 -1.2423208053538964e+02 + 25 -1.1402686646199034e+02 1.9100238121128135e+02 -8.3504908417580054e+01 + 26 2.8663576552098777e+02 -2.1773884754170615e+02 2.3144300100087472e+02 + 27 -6.3247409025611177e+01 6.9122196748087077e+01 1.8606936744368775e+02 + 28 -3.5426011055935045e+00 3.8764809029451875e+01 3.2874001946768900e+01 + 29 -7.1069178571876577e+01 3.5485903180427727e+01 2.7311648896320222e+01 + 30 -1.7036987830119904e+02 -1.9851827590031277e+02 -1.1511401829123534e+02 31 -1.3970409889743331e+02 1.6660943915628047e+02 -1.2913930522474698e+02 - 32 2.7179130444112271e+01 -6.0169059447629905e+01 -1.7669495182022038e+02 - 33 -6.2659679124099597e+01 -6.4422131921795355e+01 6.4150928205326579e+01 - 34 -2.2119065265693539e+01 1.0450386886830508e+02 -7.3998379587547845e+01 - 35 2.6982987783286291e+02 -2.1519317040003412e+02 1.3051628460669610e+02 + 32 2.7179130444112264e+01 -6.0169059447629905e+01 -1.7669495182022038e+02 + 33 -6.2659679124099576e+01 -6.4422131921795383e+01 6.4150928205326579e+01 + 34 -2.2119065265693525e+01 1.0450386886830510e+02 -7.3998379587547845e+01 + 35 2.6982987783286291e+02 -2.1519317040003423e+02 1.3051628460669625e+02 36 1.0368628874516659e+02 1.8817377639779619e+02 -1.9748944223870336e+02 - 37 -1.8009522406836990e+02 1.2993653092243849e+02 -6.3523043394051804e+01 - 38 -2.9571205878459978e+02 1.0441609933482222e+02 1.5582204859042619e+02 - 39 8.7398805727029270e+01 -6.0025559644669258e+01 2.2209742009837157e+01 - 40 2.0540672579010824e+01 -1.0735874009092363e+02 5.8655918369892206e+01 - 41 -5.8895846271372314e+01 1.1852345624639781e+01 -6.6147257724570267e+01 - 42 -9.6895512314642531e+01 3.8928741136688721e+01 -7.5791929957116210e+01 - 43 2.2476051812062417e+02 9.5505204283237461e+01 1.2309042240718740e+02 - 44 8.9817373579488660e+01 -1.0616333580628948e+02 -8.6321519086255435e+01 - 45 1.7202629662584396e+01 1.2890307246697841e+02 5.2916171301068466e+01 - 46 1.3547783972601877e+01 -2.9276223331260049e+01 2.2187412696867376e+01 - 47 3.3389762514712210e+01 -1.9217585014965047e+02 -6.9956213241088250e+01 - 48 7.3631720332112650e+01 -2.0953007324688525e+02 -2.3183566221404728e+01 - 49 -3.7589944473227274e+02 -2.4083165714763936e+01 1.0770339502610545e+02 - 50 3.8603083564823841e+01 -7.3616481568799330e+01 9.0414065019644596e+01 + 37 -1.8009522406836996e+02 1.2993653092243866e+02 -6.3523043394051889e+01 + 38 -2.9571205878459978e+02 1.0441609933482223e+02 1.5582204859042622e+02 + 39 8.7398805727029284e+01 -6.0025559644669265e+01 2.2209742009837157e+01 + 40 2.0540672579010842e+01 -1.0735874009092362e+02 5.8655918369892206e+01 + 41 -5.8895846271372335e+01 1.1852345624639781e+01 -6.6147257724570267e+01 + 42 -9.6895512314642517e+01 3.8928741136688721e+01 -7.5791929957116153e+01 + 43 2.2476051812062425e+02 9.5505204283237461e+01 1.2309042240718746e+02 + 44 8.9817373579488660e+01 -1.0616333580628947e+02 -8.6321519086255464e+01 + 45 1.7202629662584418e+01 1.2890307246697841e+02 5.2916171301068438e+01 + 46 1.3547783972601877e+01 -2.9276223331260034e+01 2.2187412696867373e+01 + 47 3.3389762514712125e+01 -1.9217585014965050e+02 -6.9956213241088321e+01 + 48 7.3631720332112678e+01 -2.0953007324688531e+02 -2.3183566221404764e+01 + 49 -3.7589944473227263e+02 -2.4083165714763936e+01 1.0770339502610540e+02 + 50 3.8603083564823876e+01 -7.3616481568799330e+01 9.0414065019644610e+01 51 1.3736420686706188e+02 -1.0204157331506994e+02 1.5813725581150808e+02 - 52 -1.0797257051087824e+02 1.1876975735151170e+02 -1.3295758126486243e+02 - 53 -5.3807540206295350e+01 3.3259462625854701e+02 -3.8426833263187632e-03 - 54 -1.0690184616186752e+01 6.2820270853646427e+01 1.8343158343321130e+02 - 55 1.1231900459987581e+02 -1.7906654831317167e+02 7.6533681064340854e+01 - 56 -4.1027190034916586e+01 -1.4085413191133770e+02 3.7483064289953241e+01 - 57 9.9904315214040494e+01 7.0938939080461637e+01 -6.8654961257661526e+01 - 58 -2.7563642882026748e+01 -6.7445498717142405e+00 -1.8442640542823220e+01 - 59 -6.6628933617875418e+01 1.0613066354110040e+02 8.7736153919831665e+01 - 60 -1.7748415247438995e+01 6.3757605316872542e+01 -1.5086907478326543e+02 - 61 -3.3560907195791366e+01 -1.0076987083174090e+02 -7.4536106106935819e+01 - 62 1.5883428926665005e+01 -5.8433760297908881e+00 2.8392494016034941e+01 - 63 1.3294494001298787e+02 -1.2724568063770238e+02 -6.4886848316806251e+01 - 64 1.0738157273930993e+02 1.2062173788161539e+02 7.4541400611710785e+01 + 52 -1.0797257051087827e+02 1.1876975735151170e+02 -1.3295758126486243e+02 + 53 -5.3807540206295386e+01 3.3259462625854701e+02 -3.8426833262903415e-03 + 54 -1.0690184616186778e+01 6.2820270853646484e+01 1.8343158343321133e+02 + 55 1.1231900459987581e+02 -1.7906654831317167e+02 7.6533681064340868e+01 + 56 -4.1027190034916501e+01 -1.4085413191133770e+02 3.7483064289953184e+01 + 57 9.9904315214040494e+01 7.0938939080461608e+01 -6.8654961257661554e+01 + 58 -2.7563642882026748e+01 -6.7445498717142298e+00 -1.8442640542823217e+01 + 59 -6.6628933617875447e+01 1.0613066354110043e+02 8.7736153919831693e+01 + 60 -1.7748415247438984e+01 6.3757605316872557e+01 -1.5086907478326543e+02 + 61 -3.3560907195791373e+01 -1.0076987083174085e+02 -7.4536106106935819e+01 + 62 1.5883428926665005e+01 -5.8433760297908881e+00 2.8392494016034934e+01 + 63 1.3294494001298784e+02 -1.2724568063770243e+02 -6.4886848316806294e+01 + 64 1.0738157273930993e+02 1.2062173788161542e+02 7.4541400611710799e+01 run_vdwl: -3296.346882377749 run_coul: -327.0653995073912 run_stress: ! |- - -1.0521225462925122e+03 -1.2628780139889509e+03 -8.6757617693085899e+02 -2.5158592653603847e+02 2.0619472152426923e+02 -6.4312943979323541e+02 + -1.0521225462925122e+03 -1.2628780139889511e+03 -8.6757617693086104e+02 -2.5158592653603904e+02 2.0619472152426832e+02 -6.4312943979323666e+02 run_forces: ! |2 - 1 -8.8486129396001530e+01 -2.5824483374473200e+01 1.0916517213634106e+02 - 2 -1.1227648453173390e+02 -1.8093214754186130e+02 -2.2420118533940354e+02 - 3 -1.7210894875994978e+02 1.8292263268451674e+02 1.3551979435686139e+01 - 4 3.2999405001009407e+01 -5.1077312719545837e+01 9.0478579144069556e+01 - 5 1.8144963583123214e+02 1.6798391906831810e+01 -8.1723378082075570e+01 - 6 1.3640835897739447e+02 -3.0059507544862095e+02 2.9594750460783345e+01 - 7 -5.3287619129789434e+01 -1.2872953167026756e+02 -1.6348317368624129e+02 - 8 -1.5334990952322434e+02 4.0171746946780843e+01 1.5317542403106131e+02 - 9 1.8362961213927139e+01 8.1984428717784255e+01 2.8273598253027259e+01 - 10 8.4245458094789043e+01 1.4177227430519346e+02 1.2329899933660965e+02 - 11 -4.3217035356344425e+01 6.5547850976510759e+01 1.3463983671946417e+02 - 12 -9.7319343004573113e+01 -2.6236499899232278e+01 7.2232061905742402e+00 - 13 -6.3184735475530402e+01 -4.7368090836538087e+01 -3.7590268076036111e+01 - 14 7.8642680121803977e+01 -6.7994653297646451e+01 -9.9042134233434012e+01 - 15 -6.6371195967082826e+01 2.1787700653339664e+02 8.0102624694807375e+01 - 16 1.9215832443892597e+02 5.3231888618093983e+01 6.6253846562695074e+01 - 17 1.4496126989603110e+02 -3.9700366098757222e+01 -9.7506725874209380e+01 - 18 -4.4989211400008614e+01 -1.9360716191976445e+02 1.1274798810455862e+02 - 19 2.6657546213782740e+02 3.7189369483257695e+02 -3.3847202166068035e+02 - 20 -7.6352829159880940e+01 -8.8469178952301604e+01 1.3384778817072185e+00 - 21 -7.1188597560667432e+01 -5.1592404200740106e+01 -1.2279357314243519e+02 - 22 1.5504965184741241e+02 -1.3094582932680530e+02 8.1473922626938005e+01 - 23 7.8017376001392932e+01 -1.3263023728607561e+01 -2.2771654676273968e+01 - 24 -2.0547634460482251e+02 2.1612342044348730e+02 -1.2423651650061706e+02 - 25 -1.1402944116091903e+02 1.9100648219391277e+02 -8.3505645569845370e+01 - 26 2.8664542299410533e+02 -2.1774609219880716e+02 2.3144720166994406e+02 - 27 -6.3243843868043029e+01 6.9123801262965273e+01 1.8607035157681673e+02 - 28 -3.5444604841998415e+00 3.8760531647714480e+01 3.2869123667281706e+01 - 29 -7.1069494158179211e+01 3.5486459158760582e+01 2.7311657876181052e+01 - 30 -1.7037059987992399e+02 -1.9851840131669357e+02 -1.1511410156295636e+02 - 31 -1.3970663440086005e+02 1.6660841802305001e+02 -1.2914070628112796e+02 - 32 2.7179939937138432e+01 -6.0162678551485513e+01 -1.7668459764117441e+02 - 33 -6.2659124615698168e+01 -6.4421915847941520e+01 6.4151176691093482e+01 - 34 -2.2118740875419455e+01 1.0450303589341144e+02 -7.3997370482692972e+01 - 35 2.6987081482968875e+02 -2.1523754104000355e+02 1.3052736086179604e+02 - 36 1.0368798521815543e+02 1.8816694370725344e+02 -1.9748485159172907e+02 - 37 -1.8012152564003850e+02 1.2997662140302859e+02 -6.3547259053587872e+01 - 38 -2.9571525697590829e+02 1.0441941743734588e+02 1.5582112543442358e+02 - 39 8.7399620724575271e+01 -6.0025787992411310e+01 2.2209357601282150e+01 - 40 2.0541458171950978e+01 -1.0735817059033018e+02 5.8656280350524320e+01 - 41 -5.8893965304899986e+01 1.1850504754314887e+01 -6.6138932259022468e+01 - 42 -9.6894702780992361e+01 3.8926449644174809e+01 -7.5794133002764795e+01 - 43 2.2475651760389383e+02 9.5503072846836503e+01 1.2308683766845400e+02 - 44 8.9821846939843113e+01 -1.0615882525757857e+02 -8.6326896770189890e+01 - 45 1.7193681344342288e+01 1.2889564928820624e+02 5.2922372841252404e+01 - 46 1.3549091739280335e+01 -2.9276447091757493e+01 2.2187152043656500e+01 - 47 3.3389460345593150e+01 -1.9217121673024420e+02 -6.9954603582952544e+01 - 48 7.3644268618852763e+01 -2.0953201921822830e+02 -2.3192562071413278e+01 - 49 -3.7593958318941031e+02 -2.4028439106859878e+01 1.0779151134441000e+02 - 50 3.8603926624328551e+01 -7.3615255297989435e+01 9.0412505212292402e+01 + 1 -8.8486129396001502e+01 -2.5824483374473179e+01 1.0916517213634110e+02 + 2 -1.1227648453173391e+02 -1.8093214754186130e+02 -2.2420118533940348e+02 + 3 -1.7210894875994978e+02 1.8292263268451674e+02 1.3551979435686095e+01 + 4 3.2999405001009350e+01 -5.1077312719545880e+01 9.0478579144069585e+01 + 5 1.8144963583123231e+02 1.6798391906831846e+01 -8.1723378082075712e+01 + 6 1.3640835897739439e+02 -3.0059507544862095e+02 2.9594750460783359e+01 + 7 -5.3287619129789448e+01 -1.2872953167026756e+02 -1.6348317368624123e+02 + 8 -1.5334990952322434e+02 4.0171746946780829e+01 1.5317542403106131e+02 + 9 1.8362961213927182e+01 8.1984428717784269e+01 2.8273598253027302e+01 + 10 8.4245458094789058e+01 1.4177227430519352e+02 1.2329899933660965e+02 + 11 -4.3217035356344425e+01 6.5547850976510773e+01 1.3463983671946411e+02 + 12 -9.7319343004573128e+01 -2.6236499899232264e+01 7.2232061905742331e+00 + 13 -6.3184735475530417e+01 -4.7368090836538116e+01 -3.7590268076036132e+01 + 14 7.8642680121804005e+01 -6.7994653297646451e+01 -9.9042134233434012e+01 + 15 -6.6371195967082826e+01 2.1787700653339661e+02 8.0102624694807389e+01 + 16 1.9215832443892597e+02 5.3231888618093954e+01 6.6253846562695017e+01 + 17 1.4496126989603121e+02 -3.9700366098757279e+01 -9.7506725874209309e+01 + 18 -4.4989211400008635e+01 -1.9360716191976442e+02 1.1274798810455859e+02 + 19 2.6657546213782734e+02 3.7189369483257695e+02 -3.3847202166068030e+02 + 20 -7.6352829159880955e+01 -8.8469178952301633e+01 1.3384778817072787e+00 + 21 -7.1188597560667404e+01 -5.1592404200740077e+01 -1.2279357314243526e+02 + 22 1.5504965184741243e+02 -1.3094582932680530e+02 8.1473922626938020e+01 + 23 7.8017376001392918e+01 -1.3263023728607578e+01 -2.2771654676273979e+01 + 24 -2.0547634460482251e+02 2.1612342044348730e+02 -1.2423651650061711e+02 + 25 -1.1402944116091902e+02 1.9100648219391277e+02 -8.3505645569845370e+01 + 26 2.8664542299410527e+02 -2.1774609219880722e+02 2.3144720166994415e+02 + 27 -6.3243843868043086e+01 6.9123801262965259e+01 1.8607035157681676e+02 + 28 -3.5444604841998202e+00 3.8760531647714458e+01 3.2869123667281691e+01 + 29 -7.1069494158179211e+01 3.5486459158760596e+01 2.7311657876181030e+01 + 30 -1.7037059987992404e+02 -1.9851840131669360e+02 -1.1511410156295638e+02 + 31 -1.3970663440086005e+02 1.6660841802305001e+02 -1.2914070628112793e+02 + 32 2.7179939937138435e+01 -6.0162678551485499e+01 -1.7668459764117441e+02 + 33 -6.2659124615698147e+01 -6.4421915847941477e+01 6.4151176691093468e+01 + 34 -2.2118740875419469e+01 1.0450303589341145e+02 -7.3997370482692958e+01 + 35 2.6987081482968881e+02 -2.1523754104000349e+02 1.3052736086179610e+02 + 36 1.0368798521815542e+02 1.8816694370725344e+02 -1.9748485159172907e+02 + 37 -1.8012152564003850e+02 1.2997662140302853e+02 -6.3547259053587815e+01 + 38 -2.9571525697590823e+02 1.0441941743734586e+02 1.5582112543442355e+02 + 39 8.7399620724575229e+01 -6.0025787992411310e+01 2.2209357601282100e+01 + 40 2.0541458171950950e+01 -1.0735817059033015e+02 5.8656280350524284e+01 + 41 -5.8893965304899957e+01 1.1850504754314873e+01 -6.6138932259022440e+01 + 42 -9.6894702780992304e+01 3.8926449644174781e+01 -7.5794133002764809e+01 + 43 2.2475651760389385e+02 9.5503072846836503e+01 1.2308683766845402e+02 + 44 8.9821846939843127e+01 -1.0615882525757857e+02 -8.6326896770189890e+01 + 45 1.7193681344342274e+01 1.2889564928820624e+02 5.2922372841252461e+01 + 46 1.3549091739280328e+01 -2.9276447091757490e+01 2.2187152043656504e+01 + 47 3.3389460345593179e+01 -1.9217121673024417e+02 -6.9954603582952572e+01 + 48 7.3644268618852792e+01 -2.0953201921822824e+02 -2.3192562071413271e+01 + 49 -3.7593958318941031e+02 -2.4028439106859906e+01 1.0779151134441003e+02 + 50 3.8603926624328523e+01 -7.3615255297989492e+01 9.0412505212292430e+01 51 1.3736689552214156e+02 -1.0204490780187869e+02 1.5814099219652564e+02 - 52 -1.0797151154267745e+02 1.1876989597626186e+02 -1.3296150756377074e+02 - 53 -5.3843453069456601e+01 3.3257024143956778e+02 -2.3416395383797806e-02 - 54 -1.0678049522667429e+01 6.2807424617056597e+01 1.8344969045860523e+02 + 52 -1.0797151154267748e+02 1.1876989597626186e+02 -1.3296150756377079e+02 + 53 -5.3843453069456565e+01 3.3257024143956778e+02 -2.3416395383840438e-02 + 54 -1.0678049522667443e+01 6.2807424617056597e+01 1.8344969045860518e+02 55 1.1232135576105661e+02 -1.7906994470561881e+02 7.6534265234548187e+01 - 56 -4.1035945990527679e+01 -1.4084577238065074e+02 3.7489705598247994e+01 - 57 9.9903872061946146e+01 7.0936213558024505e+01 -6.8656338416452527e+01 - 58 -2.7563844572724122e+01 -6.7426705471926862e+00 -1.8442803060445037e+01 - 59 -6.6637290503389465e+01 1.0613630918459926e+02 8.7741455199772943e+01 - 60 -1.7749706497437362e+01 6.3756413885635943e+01 -1.5086911682892702e+02 - 61 -3.3559889608749941e+01 -1.0076809277084801e+02 -7.4536003122046239e+01 - 62 1.5883833834736409e+01 -5.8439916924703503e+00 2.8393403991146943e+01 - 63 1.3294237052896716e+02 -1.2724619636183067e+02 -6.4882384014219042e+01 - 64 1.0738250214938945e+02 1.2062290362868877e+02 7.4541927445529197e+01 + 56 -4.1035945990527694e+01 -1.4084577238065074e+02 3.7489705598247951e+01 + 57 9.9903872061946146e+01 7.0936213558024505e+01 -6.8656338416452499e+01 + 58 -2.7563844572724129e+01 -6.7426705471926915e+00 -1.8442803060445037e+01 + 59 -6.6637290503389465e+01 1.0613630918459928e+02 8.7741455199772943e+01 + 60 -1.7749706497437348e+01 6.3756413885635929e+01 -1.5086911682892702e+02 + 61 -3.3559889608749927e+01 -1.0076809277084796e+02 -7.4536003122046253e+01 + 62 1.5883833834736409e+01 -5.8439916924703361e+00 2.8393403991146915e+01 + 63 1.3294237052896716e+02 -1.2724619636183061e+02 -6.4882384014219113e+01 + 64 1.0738250214938944e+02 1.2062290362868877e+02 7.4541927445529197e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index d91caa277c..59cb7b5261 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -1,8 +1,7 @@ --- lammps_version: 2 Jul 2021 -date_generated: Mon Jul 12 20:56:38 2021 +date_generated: Wed Jul 21 15:49:47 2021 epsilon: 1e-12 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -38,139 +37,139 @@ natoms: 64 init_vdwl: -2454.3149508399256 init_coul: -344.1380904917976 init_stress: ! |2- - 4.8195587070292022e+03 4.4865954368949351e+03 3.2679588293062784e+03 -1.8469678134590688e+03 7.6556385424846496e+02 -4.9517278307742413e+02 + 4.8195587070292022e+03 4.4865954368949333e+03 3.2679588293062807e+03 -1.8469678134590695e+03 7.6556385424846383e+02 -4.9517278307742527e+02 init_forces: ! |2 - 1 -1.9811664067580182e+02 -1.5618748554879582e+02 -1.0716617094919907e+02 - 2 -4.1075966889759563e+01 -6.7708246449675840e+01 -4.2506724189242647e+01 - 3 3.1596544789529471e+01 8.8571277602644201e+01 1.4850846557451504e+02 - 4 1.7447178183928099e+02 3.2866954415453613e+01 -3.1178861314762706e+01 - 5 1.1873199005659009e+02 5.9095115842131946e+01 2.3739439807686179e+02 - 6 1.3052453610124778e+03 -4.4208109447713031e+02 -1.4245452171137988e+03 - 7 -8.7153363585941023e+01 -1.0895261162467337e+02 -3.5604687372058106e+02 - 8 -9.1047579854191540e+01 4.4450937169776367e+01 1.1879559986803962e+02 - 9 4.7456602925193245e+01 1.7227642506022178e+02 -1.4638226748446916e+01 - 10 6.3508986324759796e+01 4.8590610415561784e+01 1.1075535682642920e+01 - 11 -5.1919052217198669e+01 7.3820742396411859e+01 5.1375340691983297e+01 - 12 -1.0171933720752882e+02 -1.9845958414353028e+01 -1.7437665462751706e+01 - 13 -7.3048376131504796e+01 -4.5586627360377669e+01 2.8533062846208733e+01 - 14 8.6287140258369817e+01 -4.1664353236768321e+01 1.7094340432182378e+01 - 15 -3.5690271737605428e+01 1.2671711108383720e+02 4.5865072089126144e+01 - 16 1.0608232372370766e+02 3.5980003156299802e+01 1.8676593635940499e+01 - 17 2.3577630118103411e+02 -9.8579505236746968e+01 4.1005658232556200e+01 - 18 -2.0815299273687735e+01 -1.1578579968450298e+02 6.5566787154472507e+01 - 19 4.3265264076046996e+01 1.0913234729250232e+02 3.0900987497773690e+02 - 20 -1.0086773950039240e+02 7.4841212143883325e+01 -1.6547856280073117e+02 - 21 -8.5974538718179744e+01 -4.5982868874732929e+00 -7.3066508052444064e+01 - 22 1.3343492132570225e+02 -1.2211943449611955e+02 9.0328124087551757e+01 - 23 5.2985077374887140e+01 2.0040750326966958e+01 -9.0416982004666480e+00 - 24 -1.8957025969382849e+02 8.1671696884795921e+01 -1.2920621849543499e+01 - 25 -1.0067836293726950e+02 1.3220054680372047e+02 -4.8975895235994550e+01 - 26 2.1849478729429609e+02 -1.9386903120078875e+02 1.7116657218419908e+02 - 27 -3.7478069218092728e+01 3.0044804022729718e+01 9.3872627169948615e+01 - 28 9.9359193467603504e+01 -5.5156189036814503e+01 -3.1541196450035848e+01 - 29 -3.9530012231991570e+01 5.6689953230829921e+01 2.5358584427671751e+01 + 1 -1.9811664067580179e+02 -1.5618748554879582e+02 -1.0716617094919901e+02 + 2 -4.1075966889759549e+01 -6.7708246449675826e+01 -4.2506724189242625e+01 + 3 3.1596544789529435e+01 8.8571277602644230e+01 1.4850846557451499e+02 + 4 1.7447178183928099e+02 3.2866954415453542e+01 -3.1178861314762706e+01 + 5 1.1873199005659021e+02 5.9095115842131932e+01 2.3739439807686179e+02 + 6 1.3052453610124783e+03 -4.4208109447713036e+02 -1.4245452171137993e+03 + 7 -8.7153363585941023e+01 -1.0895261162467335e+02 -3.5604687372058106e+02 + 8 -9.1047579854191568e+01 4.4450937169776367e+01 1.1879559986803960e+02 + 9 4.7456602925193202e+01 1.7227642506022178e+02 -1.4638226748446902e+01 + 10 6.3508986324759796e+01 4.8590610415561791e+01 1.1075535682642935e+01 + 11 -5.1919052217198654e+01 7.3820742396411859e+01 5.1375340691983297e+01 + 12 -1.0171933720752882e+02 -1.9845958414353014e+01 -1.7437665462751710e+01 + 13 -7.3048376131504796e+01 -4.5586627360377697e+01 2.8533062846208718e+01 + 14 8.6287140258369817e+01 -4.1664353236768306e+01 1.7094340432182349e+01 + 15 -3.5690271737605421e+01 1.2671711108383721e+02 4.5865072089126137e+01 + 16 1.0608232372370769e+02 3.5980003156299816e+01 1.8676593635940495e+01 + 17 2.3577630118103411e+02 -9.8579505236746911e+01 4.1005658232556200e+01 + 18 -2.0815299273687735e+01 -1.1578579968450295e+02 6.5566787154472507e+01 + 19 4.3265264076046989e+01 1.0913234729250236e+02 3.0900987497773690e+02 + 20 -1.0086773950039242e+02 7.4841212143883340e+01 -1.6547856280073117e+02 + 21 -8.5974538718179744e+01 -4.5982868874733214e+00 -7.3066508052444064e+01 + 22 1.3343492132570225e+02 -1.2211943449611955e+02 9.0328124087551771e+01 + 23 5.2985077374887155e+01 2.0040750326966961e+01 -9.0416982004666124e+00 + 24 -1.8957025969382852e+02 8.1671696884795935e+01 -1.2920621849543528e+01 + 25 -1.0067836293726948e+02 1.3220054680372053e+02 -4.8975895235994550e+01 + 26 2.1849478729429609e+02 -1.9386903120078870e+02 1.7116657218419911e+02 + 27 -3.7478069218092713e+01 3.0044804022729696e+01 9.3872627169948643e+01 + 28 9.9359193467603504e+01 -5.5156189036814489e+01 -3.1541196450035862e+01 + 29 -3.9530012231991570e+01 5.6689953230829886e+01 2.5358584427671758e+01 30 -9.7652246814367359e+01 -2.2271920242502716e+02 -1.4460601547049507e+02 - 31 -4.6192346966779532e+01 7.2790084189834928e+01 3.1159158603346764e+01 - 32 1.2013060628467292e+01 -3.4474347848945314e+01 -1.0622600014669138e+02 - 33 5.2551051115345523e+01 4.2704675585248630e+01 -3.0154896799401914e+01 - 34 1.6822864099952500e+02 -1.6889974455036809e-02 1.1832622696299902e+02 - 35 5.1185090023661428e+02 -1.3214021604987859e+03 1.1319907541000694e+03 - 36 -1.4331382529302426e+01 9.9702896436312997e+01 -1.3159358421899245e+02 - 37 -8.9317756897655033e+02 1.3544128453102780e+03 -7.5922493710251501e+02 - 38 -3.8384748878233427e+02 1.2143676601363953e+02 1.7580047976723324e+02 - 39 1.6381134310552264e+02 -1.2998574463953725e+01 -7.8542909545441546e+01 - 40 6.1412235617277197e+01 -2.0153615037331058e+01 4.3186957794586576e+01 - 41 1.3114484088383918e+01 1.7854214885793702e+00 3.3683765652624928e+01 - 42 -6.4838533708029459e+01 5.2662237041257001e+01 -6.8645855319469462e+01 + 31 -4.6192346966779525e+01 7.2790084189834928e+01 3.1159158603346764e+01 + 32 1.2013060628467285e+01 -3.4474347848945321e+01 -1.0622600014669140e+02 + 33 5.2551051115345523e+01 4.2704675585248637e+01 -3.0154896799401911e+01 + 34 1.6822864099952500e+02 -1.6889974455004834e-02 1.1832622696299902e+02 + 35 5.1185090023661456e+02 -1.3214021604987863e+03 1.1319907541000696e+03 + 36 -1.4331382529302426e+01 9.9702896436313011e+01 -1.3159358421899239e+02 + 37 -8.9317756897655045e+02 1.3544128453102783e+03 -7.5922493710251524e+02 + 38 -3.8384748878233427e+02 1.2143676601363948e+02 1.7580047976723321e+02 + 39 1.6381134310552267e+02 -1.2998574463953721e+01 -7.8542909545441532e+01 + 40 6.1412235617277204e+01 -2.0153615037331058e+01 4.3186957794586569e+01 + 41 1.3114484088383939e+01 1.7854214885793560e+00 3.3683765652624942e+01 + 42 -6.4838533708029473e+01 5.2662237041257001e+01 -6.8645855319469405e+01 43 2.0925885626252014e+02 8.2942516657430232e+01 1.1786724503954686e+02 - 44 -3.8463410277622422e+01 -7.5319916775508801e+01 -1.3445887472637639e+02 - 45 -3.4797907366084118e+01 7.6266761873332939e+01 4.3023416525122556e+01 - 46 2.3463432665038621e+01 -1.5313857576705704e+01 -3.8707451594223810e+00 - 47 -3.7271493199629646e+01 -5.4876511333920163e+01 -1.9275411927395847e+01 - 48 2.8275275023555395e+02 -1.7973942289882834e+02 -6.0167953907639014e+02 - 49 -2.0529905689923421e+03 -6.7838314309842531e+01 7.6230272883402529e+02 - 50 1.3292222637274614e+02 -9.8795036249084134e+01 9.9132259532945980e+01 + 44 -3.8463410277622415e+01 -7.5319916775508815e+01 -1.3445887472637642e+02 + 45 -3.4797907366084097e+01 7.6266761873332939e+01 4.3023416525122514e+01 + 46 2.3463432665038606e+01 -1.5313857576705701e+01 -3.8707451594223872e+00 + 47 -3.7271493199629653e+01 -5.4876511333920178e+01 -1.9275411927395869e+01 + 48 2.8275275023555378e+02 -1.7973942289882839e+02 -6.0167953907638991e+02 + 49 -2.0529905689923417e+03 -6.7838314309842517e+01 7.6230272883402574e+02 + 50 1.3292222637274611e+02 -9.8795036249084106e+01 9.9132259532945980e+01 51 2.6168921895029303e+02 -1.9761595427509062e+02 2.4062513751852873e+02 - 52 -1.2257063176561176e+02 1.3353869954874421e+02 -1.1598337420807962e+02 - 53 3.8021621191835891e+02 8.1199705966172507e+02 2.7057346247419940e+02 - 54 6.9440336670547097e+01 -1.1592524541887400e+02 2.2072297942372262e+02 - 55 8.7300666059627744e+01 -1.3907353173150560e+02 5.9541107879138558e+01 - 56 3.4771676857170326e+02 -2.4546959502036665e+02 -3.5077189358394349e+02 - 57 6.1706174952483430e+01 7.9893925286373715e+01 3.4373445887630085e+00 - 58 3.7240798760941452e+01 -1.2919400623491822e+02 3.9695110774075808e+01 - 59 -5.2076445103995331e+02 2.1046582886974142e+02 1.7083299176148790e+02 - 60 -7.8657547105875338e+01 -2.3005356890255392e+01 -1.2454833328198771e+02 + 52 -1.2257063176561179e+02 1.3353869954874421e+02 -1.1598337420807965e+02 + 53 3.8021621191835851e+02 8.1199705966172485e+02 2.7057346247419935e+02 + 54 6.9440336670547069e+01 -1.1592524541887394e+02 2.2072297942372259e+02 + 55 8.7300666059627744e+01 -1.3907353173150562e+02 5.9541107879138558e+01 + 56 3.4771676857170337e+02 -2.4546959502036671e+02 -3.5077189358394361e+02 + 57 6.1706174952483430e+01 7.9893925286373715e+01 3.4373445887630369e+00 + 58 3.7240798760941445e+01 -1.2919400623491822e+02 3.9695110774075808e+01 + 59 -5.2076445103995343e+02 2.1046582886974139e+02 1.7083299176148785e+02 + 60 -7.8657547105875310e+01 -2.3005356890255410e+01 -1.2454833328198774e+02 61 -3.9633103573229910e+01 -5.5165443660352402e+01 -4.0780192434587690e+01 - 62 -1.8742346202622763e+01 -1.3844690899539831e+01 2.2586546200036643e+00 - 63 6.5150947885422269e+01 7.1009493033300544e+01 -8.4093092375006023e+01 - 64 4.0079516427458081e+01 9.6476598333945958e+01 9.1213458480138442e+01 + 62 -1.8742346202622748e+01 -1.3844690899539831e+01 2.2586546200036359e+00 + 63 6.5150947885422283e+01 7.1009493033300544e+01 -8.4093092375006009e+01 + 64 4.0079516427458060e+01 9.6476598333945972e+01 9.1213458480138428e+01 run_vdwl: -2454.3233099608155 run_coul: -344.1379608070739 run_stress: ! |2- - 4.8194587329953674e+03 4.4865895224706956e+03 3.2679446938086498e+03 -1.8471163065259325e+03 7.6545324620049087e+02 -4.9527853267788902e+02 + 4.8194587329953692e+03 4.4865895224706946e+03 3.2679446938086485e+03 -1.8471163065259320e+03 7.6545324620049041e+02 -4.9527853267789004e+02 run_forces: ! |2 - 1 -1.9811556407056105e+02 -1.5618143620847076e+02 -1.0716119874908736e+02 - 2 -4.1073968384374822e+01 -6.7710647015369261e+01 -4.2502864658157357e+01 - 3 3.1592798331689554e+01 8.8575236369726497e+01 1.4850890801985440e+02 - 4 1.7447282006187956e+02 3.2862369867970486e+01 -3.1175721266394820e+01 - 5 1.1873112974792335e+02 5.9090963929048286e+01 2.3738916225937453e+02 - 6 1.3053008444613590e+03 -4.4210323642713990e+02 -1.4246081409032693e+03 - 7 -8.7152343512651925e+01 -1.0895314566818783e+02 -3.5604721285130660e+02 - 8 -9.1046846091347717e+01 4.4451665481009478e+01 1.1879618751723048e+02 - 9 4.7463133585713976e+01 1.7228438483982211e+02 -1.4645071927693378e+01 - 10 6.3506921990797963e+01 4.8587688349158157e+01 1.1073324095443047e+01 - 11 -5.1917951887543467e+01 7.3818630188510326e+01 5.1369234828489169e+01 - 12 -1.0172154753205886e+02 -1.9847809999838844e+01 -1.7441731987232995e+01 - 13 -7.3048126072731904e+01 -4.5586545373889699e+01 2.8534758158919548e+01 - 14 8.6288077929554390e+01 -4.1660634795038867e+01 1.7096747148188005e+01 - 15 -3.5688114877422009e+01 1.2671728980619932e+02 4.5864235397118819e+01 - 16 1.0608395201173668e+02 3.5983845233526992e+01 1.8672925070386189e+01 - 17 2.3576828121395241e+02 -9.8577850318505511e+01 4.1004495565128586e+01 - 18 -2.0815095995902741e+01 -1.1578710179047430e+02 6.5566934287391263e+01 - 19 4.3264252619509847e+01 1.0912982970441868e+02 3.0901253523346554e+02 - 20 -1.0088948935029296e+02 7.4849484282711913e+01 -1.6550538409007385e+02 - 21 -8.5974038585183081e+01 -4.5987854992617834e+00 -7.3065890363335626e+01 - 22 1.3343130763213867e+02 -1.2211553430043760e+02 9.0325064574872243e+01 - 23 5.2984912690315269e+01 2.0042805349785095e+01 -9.0417924141684995e+00 - 24 -1.8954830238390488e+02 8.1645824240164018e+01 -1.2893974448861035e+01 - 25 -1.0068116183998592e+02 1.3220505876703567e+02 -4.8977129584747800e+01 - 26 2.1847179335289820e+02 -1.9385136258527231e+02 1.7114800244815061e+02 - 27 -3.7476307441658193e+01 3.0046433191315710e+01 9.3873685757283738e+01 - 28 9.9355970623229197e+01 -5.5158350569168128e+01 -3.1544144508393853e+01 - 29 -3.9530224377035040e+01 5.6690552166969916e+01 2.5358784555346130e+01 - 30 -9.7652510697052605e+01 -2.2271892169387453e+02 -1.4460597467192864e+02 - 31 -4.6194950503295722e+01 7.2792554749932378e+01 3.1151667586195479e+01 - 32 1.2014466624027639e+01 -3.4469133688337756e+01 -1.0621837802800977e+02 - 33 5.2553699854339712e+01 4.2706400148046903e+01 -3.0154323622364608e+01 - 34 1.6822906612351349e+02 -1.7651825961895091e-02 1.1832699040444524e+02 - 35 5.1193507571856594e+02 -1.3215008853106001e+03 1.1320319719742358e+03 - 36 -1.4340338085502863e+01 9.9690347849156822e+01 -1.3158127406978679e+02 - 37 -8.9323390159980181e+02 1.3545163222654817e+03 -7.5929442355796721e+02 - 38 -3.8384755818822509e+02 1.2143789174035305e+02 1.7579570815453911e+02 - 39 1.6381197094628513e+02 -1.2998258674043836e+01 -7.8543109639931160e+01 - 40 6.1411228642100049e+01 -2.0154566391139259e+01 4.3186834298875652e+01 - 41 1.3119781105415569e+01 1.7920555043075754e+00 3.3686007139293849e+01 - 42 -6.4838490750749202e+01 5.2660553302313652e+01 -6.8647362072367542e+01 - 43 2.0926308211689772e+02 8.2945847275902722e+01 1.1786850503407649e+02 - 44 -3.8461829626420936e+01 -7.5317323697263234e+01 -1.3445959877777378e+02 - 45 -3.4805239678702840e+01 7.6262295586966061e+01 4.3024220690600892e+01 - 46 2.3465031078234954e+01 -1.5312554894709733e+01 -3.8725170500358517e+00 - 47 -3.7271036720207945e+01 -5.4879638482209749e+01 -1.9275876359755905e+01 - 48 2.8270391245290489e+02 -1.7971102191169697e+02 -6.0165064633346822e+02 - 49 -2.0529526126133592e+03 -6.7744467074995413e+01 7.6241869031244312e+02 - 50 1.3291615685330385e+02 -9.8801239572742261e+01 9.9131933784099587e+01 + 1 -1.9811556407056102e+02 -1.5618143620847070e+02 -1.0716119874908739e+02 + 2 -4.1073968384374822e+01 -6.7710647015369261e+01 -4.2502864658157385e+01 + 3 3.1592798331689583e+01 8.8575236369726497e+01 1.4850890801985437e+02 + 4 1.7447282006187959e+02 3.2862369867970457e+01 -3.1175721266394834e+01 + 5 1.1873112974792329e+02 5.9090963929048314e+01 2.3738916225937453e+02 + 6 1.3053008444613586e+03 -4.4210323642713996e+02 -1.4246081409032695e+03 + 7 -8.7152343512651953e+01 -1.0895314566818776e+02 -3.5604721285130660e+02 + 8 -9.1046846091347703e+01 4.4451665481009499e+01 1.1879618751723051e+02 + 9 4.7463133585713919e+01 1.7228438483982211e+02 -1.4645071927693349e+01 + 10 6.3506921990797963e+01 4.8587688349158142e+01 1.1073324095443047e+01 + 11 -5.1917951887543467e+01 7.3818630188510312e+01 5.1369234828489176e+01 + 12 -1.0172154753205889e+02 -1.9847809999838830e+01 -1.7441731987232995e+01 + 13 -7.3048126072731876e+01 -4.5586545373889699e+01 2.8534758158919548e+01 + 14 8.6288077929554404e+01 -4.1660634795038867e+01 1.7096747148188040e+01 + 15 -3.5688114877422024e+01 1.2671728980619932e+02 4.5864235397118847e+01 + 16 1.0608395201173666e+02 3.5983845233526999e+01 1.8672925070386196e+01 + 17 2.3576828121395238e+02 -9.8577850318505440e+01 4.1004495565128614e+01 + 18 -2.0815095995902730e+01 -1.1578710179047432e+02 6.5566934287391277e+01 + 19 4.3264252619509840e+01 1.0912982970441865e+02 3.0901253523346554e+02 + 20 -1.0088948935029293e+02 7.4849484282711913e+01 -1.6550538409007382e+02 + 21 -8.5974038585183081e+01 -4.5987854992617692e+00 -7.3065890363335626e+01 + 22 1.3343130763213867e+02 -1.2211553430043763e+02 9.0325064574872258e+01 + 23 5.2984912690315262e+01 2.0042805349785073e+01 -9.0417924141684995e+00 + 24 -1.8954830238390488e+02 8.1645824240163975e+01 -1.2893974448861021e+01 + 25 -1.0068116183998590e+02 1.3220505876703564e+02 -4.8977129584747814e+01 + 26 2.1847179335289815e+02 -1.9385136258527231e+02 1.7114800244815055e+02 + 27 -3.7476307441658179e+01 3.0046433191315703e+01 9.3873685757283724e+01 + 28 9.9355970623229169e+01 -5.5158350569168121e+01 -3.1544144508393824e+01 + 29 -3.9530224377035040e+01 5.6690552166969916e+01 2.5358784555346112e+01 + 30 -9.7652510697052577e+01 -2.2271892169387456e+02 -1.4460597467192858e+02 + 31 -4.6194950503295701e+01 7.2792554749932393e+01 3.1151667586195508e+01 + 32 1.2014466624027643e+01 -3.4469133688337770e+01 -1.0621837802800977e+02 + 33 5.2553699854339705e+01 4.2706400148046903e+01 -3.0154323622364597e+01 + 34 1.6822906612351349e+02 -1.7651825961909302e-02 1.1832699040444521e+02 + 35 5.1193507571856611e+02 -1.3215008853106001e+03 1.1320319719742361e+03 + 36 -1.4340338085502884e+01 9.9690347849156851e+01 -1.3158127406978679e+02 + 37 -8.9323390159980192e+02 1.3545163222654817e+03 -7.5929442355796743e+02 + 38 -3.8384755818822509e+02 1.2143789174035302e+02 1.7579570815453908e+02 + 39 1.6381197094628516e+02 -1.2998258674043829e+01 -7.8543109639931160e+01 + 40 6.1411228642100035e+01 -2.0154566391139259e+01 4.3186834298875652e+01 + 41 1.3119781105415534e+01 1.7920555043075754e+00 3.3686007139293856e+01 + 42 -6.4838490750749202e+01 5.2660553302313680e+01 -6.8647362072367542e+01 + 43 2.0926308211689772e+02 8.2945847275902722e+01 1.1786850503407652e+02 + 44 -3.8461829626420936e+01 -7.5317323697263234e+01 -1.3445959877777375e+02 + 45 -3.4805239678702840e+01 7.6262295586966090e+01 4.3024220690600863e+01 + 46 2.3465031078234958e+01 -1.5312554894709733e+01 -3.8725170500358588e+00 + 47 -3.7271036720207924e+01 -5.4879638482209749e+01 -1.9275876359755912e+01 + 48 2.8270391245290489e+02 -1.7971102191169686e+02 -6.0165064633346822e+02 + 49 -2.0529526126133587e+03 -6.7744467074995427e+01 7.6241869031244289e+02 + 50 1.3291615685330387e+02 -9.8801239572742261e+01 9.9131933784099587e+01 51 2.6169570171244874e+02 -1.9762541199560968e+02 2.4063463246277209e+02 - 52 -1.2256816067286560e+02 1.3353356136884040e+02 -1.1597765595389474e+02 - 53 3.8012282364003778e+02 8.1194045374755683e+02 2.7050484440708368e+02 + 52 -1.2256816067286560e+02 1.3353356136884042e+02 -1.1597765595389475e+02 + 53 3.8012282364003789e+02 8.1194045374755683e+02 2.7050484440708351e+02 54 6.9456553969440762e+01 -1.1593864337324271e+02 2.2074869335520950e+02 55 8.7303368709848343e+01 -1.3907755259033479e+02 5.9542185087028599e+01 - 56 3.4769731101937157e+02 -2.4546533348164235e+02 -3.5075782168770780e+02 - 57 6.1706155820465277e+01 7.9892471516403987e+01 3.4375912204692596e+00 - 58 3.7237511516193948e+01 -1.2919240641738722e+02 3.9695822512620317e+01 - 59 -5.2071132643271164e+02 2.1045883047165901e+02 1.7082619476821390e+02 - 60 -7.8658294909200478e+01 -2.3007149625533529e+01 -1.2454738729229325e+02 - 61 -3.9624794908666530e+01 -5.5169201638846069e+01 -4.0777145486525050e+01 - 62 -1.8741606623350261e+01 -1.3845552517299271e+01 2.2601936169388708e+00 - 63 6.5142845574860658e+01 7.0992677773634583e+01 -8.4109461087571162e+01 - 64 4.0079794681812899e+01 9.6475030340595495e+01 9.1215541718322243e+01 + 56 3.4769731101937145e+02 -2.4546533348164240e+02 -3.5075782168770780e+02 + 57 6.1706155820465291e+01 7.9892471516403972e+01 3.4375912204692454e+00 + 58 3.7237511516193933e+01 -1.2919240641738722e+02 3.9695822512620310e+01 + 59 -5.2071132643271164e+02 2.1045883047165898e+02 1.7082619476821390e+02 + 60 -7.8658294909200450e+01 -2.3007149625533501e+01 -1.2454738729229325e+02 + 61 -3.9624794908666537e+01 -5.5169201638846069e+01 -4.0777145486525072e+01 + 62 -1.8741606623350247e+01 -1.3845552517299250e+01 2.2601936169388566e+00 + 63 6.5142845574860644e+01 7.0992677773634597e+01 -8.4109461087571191e+01 + 64 4.0079794681812906e+01 9.6475030340595453e+01 9.1215541718322228e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index 9cfaaf4625..97fbc95c46 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -1,8 +1,7 @@ --- lammps_version: 2 Jul 2021 -date_generated: Mon Jul 12 20:56:38 2021 +date_generated: Wed Jul 21 15:49:48 2021 epsilon: 5e-13 -skip_tests: omp prerequisites: ! | pair reax/c pre_commands: ! | @@ -33,139 +32,139 @@ natoms: 64 init_vdwl: -8975.381063460629 init_coul: 0.5928529868716559 init_stress: ! |- - -1.1526162173764683e+03 -4.6218014500723461e+02 3.1954383274884901e+02 -2.2197591028227621e+03 3.4480244373669785e+02 -1.2644452447488200e+03 + -1.1526162173764687e+03 -4.6218014500723211e+02 3.1954383274884714e+02 -2.2197591028227603e+03 3.4480244373669649e+02 -1.2644452447488172e+03 init_forces: ! |2 - 1 -2.0916057489019278e+02 -1.8819573882656792e+02 -2.2843342560290171e+02 - 2 -5.9711660034805291e+01 -1.3795294129596448e+02 -6.1450415050409106e+01 - 3 1.0924699545317881e+02 5.4683388561496884e+01 8.7122903226954129e+00 - 4 2.2394129214932286e+02 -1.2607110719575815e+02 5.6116628706921283e+01 - 5 2.1339173392425103e+01 2.3982132147793212e+02 -1.1311227256425612e+02 - 6 -2.3465218593173694e+02 8.7997863600775204e+01 7.1405034243397978e+01 - 7 1.7783507933620086e+02 3.8498185748852194e+01 -2.7669272643606155e+02 - 8 -2.1014288646597468e+01 -4.0711968506334620e+02 1.5140757706928005e+02 - 9 -5.9307137188585735e+01 2.6264734812019469e+02 1.7442573676385443e+01 - 10 -8.4525778086876372e+01 1.5450140994331881e+02 6.0015146335720981e+00 - 11 -1.1159775028831375e+02 1.8656236384929730e+02 3.4449805909515084e+02 - 12 3.3347376393571255e+02 -3.8243903563632881e+02 5.1141444486612528e+01 - 13 -3.9347479057410175e+02 -9.9340014971740487e+01 2.4784035090896253e+02 - 14 1.7611459182140416e+02 -2.8017601742944402e+02 -2.7997644562222024e+02 - 15 2.5245744141516636e+02 -5.4739900421247576e+01 -1.3455773775633745e+02 - 16 1.6595098746018405e+02 1.6278076690062335e+02 4.2176787064349710e+01 - 17 4.0560547690525915e+01 2.0278202415209444e+02 1.1655337573721710e+02 - 18 1.9349019934523830e+02 -3.1749998507536635e+01 -3.0048600991173725e+01 - 19 -5.9067561742604568e+01 1.7643823088626270e+01 -1.0450409059207502e+02 - 20 1.3106558748347643e+02 2.5186173846559516e+01 1.3540015692568889e+02 - 21 -3.2006237187616756e+02 -1.1510771805635616e+02 -2.5816513201572068e+01 - 22 -1.2737471666033539e+01 -1.3033080251953407e+02 -1.4399680837176066e+02 - 23 -1.0142123148353758e+02 2.3316671624708323e+02 2.3905950409694179e+02 - 24 4.1563056415358169e+01 -1.2911164666848796e+01 -3.1668646816892700e+01 - 25 2.1166667371090460e+02 -2.0418293867725825e+02 -3.1232107629433731e+01 - 26 -2.6320989589682614e+02 1.2065128452552987e+02 2.6277305997802796e+02 - 27 -7.4498892273813865e+01 1.0778676260209129e+02 1.6095170163345196e+02 - 28 -2.4911277843488330e+02 -9.8499434443852323e+01 2.2239731087969662e+02 - 29 4.5655943120047868e+02 -5.6181584973687457e+01 -2.7582701917178326e+02 - 30 -1.1441865289035461e+02 5.2275082681973409e+01 -1.7193995473573816e+02 - 31 -1.8373014671249769e+02 -1.0039330382749462e+02 -9.6978960598961947e+01 - 32 1.5285998335729258e+02 -1.2909970668700703e+02 -1.8526770753201481e+02 - 33 2.0676721005976013e+01 3.7957156269713232e+02 -3.0331770321178414e+01 - 34 -1.8483566994370270e+02 -8.4859568901690906e+01 -1.0334717791993535e+02 - 35 -4.3920895665271935e+01 1.3832065189158040e+00 3.2302673529697479e+01 - 36 6.0407395927653840e+02 6.3222430241983602e+02 -1.5530384927410198e+01 - 37 -1.7704334275340958e+02 -3.4711199127962510e+02 2.0757920588578631e+02 - 38 -1.5990280705026578e+02 3.4383476554695534e+01 -1.1348860416567172e+02 - 39 1.2481780186485386e+02 3.1854282379699551e+01 2.4141006149778542e+02 - 40 -3.3952439214884555e+02 -5.2081203805390805e+02 -3.2749145453037904e+01 - 41 1.5953768898032132e+01 -2.5259433402085026e+01 -6.0977489335468242e+01 - 42 -3.5152692860571921e+02 1.0103192674618649e+02 1.0057493004151380e+02 - 43 1.8325251692529525e+02 -1.7843397924740284e+01 3.5813821983655600e+01 - 44 -1.7148730839833942e+02 6.5823249480752622e+01 -3.9043544554425509e+01 - 45 6.8021934986582622e+01 -5.2957926506736321e+01 -1.1278207528809645e+02 - 46 -1.9814589514445538e+02 3.1899128186018817e+02 -1.7125192460144410e+02 - 47 2.3518092199846146e+02 1.7325250425397039e+02 -4.6491315549358909e+01 - 48 -7.0934283327750434e+00 -2.1510500994703639e+02 2.8256786369777672e+02 - 49 2.4924479910930853e+02 -2.5977407369868601e+01 -1.9539857038363738e+02 - 50 9.0194565818523955e+01 2.6674460312457484e+02 4.8188042682115714e+01 - 51 2.7001317908987642e+02 -2.5024437918679871e+02 3.3082272466414395e+02 - 52 2.6770006025654067e+02 -1.3486195976744685e+02 -1.0999251813934440e+02 - 53 -3.0038447974652507e+02 1.7427208891886863e+02 -2.8369940533043155e+02 - 54 -1.8044322949045332e+02 3.2006167622599366e+02 -2.1986764638272368e+02 - 55 -6.7026995338193785e+01 2.8420556560193825e+02 -1.8256943632991815e+02 - 56 -9.3944897793228427e+02 7.6593871052490795e+02 -4.5872941120666036e+02 - 57 -2.7671724574062154e+01 -1.7257977562305285e+02 -1.6210118849324644e+02 - 58 7.1032070297632515e+02 -8.0881938208311499e+02 4.6676948457734852e+02 - 59 1.5682857500225748e+02 5.9891527233627251e+01 1.2646558890105979e+02 - 60 9.4076874705709940e+01 -1.1749874299724536e+02 -2.9919368333582653e+01 - 61 -4.8945763699767674e+01 1.6634783727405593e+02 6.7645978441449785e+01 - 62 1.6618577867039602e+02 7.3503605317082432e+01 2.2193892218236812e+02 - 63 4.6491757293229652e+00 -3.5581179274724047e+02 -3.8944419279304846e+01 - 64 -2.0021113303887086e+02 -1.1223202348830974e+02 3.0276216112541510e+02 + 1 -2.0916057489019281e+02 -1.8819573882656800e+02 -2.2843342560290168e+02 + 2 -5.9711660034805249e+01 -1.3795294129596448e+02 -6.1450415050409148e+01 + 3 1.0924699545317881e+02 5.4683388561496862e+01 8.7122903226952957e+00 + 4 2.2394129214932281e+02 -1.2607110719575809e+02 5.6116628706921283e+01 + 5 2.1339173392425174e+01 2.3982132147793220e+02 -1.1311227256425610e+02 + 6 -2.3465218593173694e+02 8.7997863600775275e+01 7.1405034243397949e+01 + 7 1.7783507933620086e+02 3.8498185748852151e+01 -2.7669272643606143e+02 + 8 -2.1014288646597382e+01 -4.0711968506334631e+02 1.5140757706927999e+02 + 9 -5.9307137188585777e+01 2.6264734812019475e+02 1.7442573676385468e+01 + 10 -8.4525778086876414e+01 1.5450140994331875e+02 6.0015146335721816e+00 + 11 -1.1159775028831368e+02 1.8656236384929727e+02 3.4449805909515095e+02 + 12 3.3347376393571255e+02 -3.8243903563632887e+02 5.1141444486612457e+01 + 13 -3.9347479057410180e+02 -9.9340014971740459e+01 2.4784035090896259e+02 + 14 1.7611459182140419e+02 -2.8017601742944402e+02 -2.7997644562222013e+02 + 15 2.5245744141516630e+02 -5.4739900421247519e+01 -1.3455773775633745e+02 + 16 1.6595098746018419e+02 1.6278076690062332e+02 4.2176787064349682e+01 + 17 4.0560547690525858e+01 2.0278202415209441e+02 1.1655337573721701e+02 + 18 1.9349019934523832e+02 -3.1749998507536677e+01 -3.0048600991173775e+01 + 19 -5.9067561742604539e+01 1.7643823088626213e+01 -1.0450409059207507e+02 + 20 1.3106558748347641e+02 2.5186173846559530e+01 1.3540015692568889e+02 + 21 -3.2006237187616756e+02 -1.1510771805635612e+02 -2.5816513201572022e+01 + 22 -1.2737471666033581e+01 -1.3033080251953402e+02 -1.4399680837176064e+02 + 23 -1.0142123148353754e+02 2.3316671624708317e+02 2.3905950409694182e+02 + 24 4.1563056415358190e+01 -1.2911164666848924e+01 -3.1668646816892771e+01 + 25 2.1166667371090466e+02 -2.0418293867725822e+02 -3.1232107629433731e+01 + 26 -2.6320989589682620e+02 1.2065128452552996e+02 2.6277305997802802e+02 + 27 -7.4498892273813851e+01 1.0778676260209129e+02 1.6095170163345199e+02 + 28 -2.4911277843488335e+02 -9.8499434443852294e+01 2.2239731087969656e+02 + 29 4.5655943120047868e+02 -5.6181584973687627e+01 -2.7582701917178315e+02 + 30 -1.1441865289035459e+02 5.2275082681973402e+01 -1.7193995473573804e+02 + 31 -1.8373014671249769e+02 -1.0039330382749465e+02 -9.6978960598961947e+01 + 32 1.5285998335729258e+02 -1.2909970668700709e+02 -1.8526770753201484e+02 + 33 2.0676721005976084e+01 3.7957156269713232e+02 -3.0331770321178464e+01 + 34 -1.8483566994370267e+02 -8.4859568901690949e+01 -1.0334717791993538e+02 + 35 -4.3920895665272049e+01 1.3832065189158744e+00 3.2302673529697394e+01 + 36 6.0407395927653863e+02 6.3222430241983591e+02 -1.5530384927410136e+01 + 37 -1.7704334275340958e+02 -3.4711199127962510e+02 2.0757920588578634e+02 + 38 -1.5990280705026572e+02 3.4383476554695449e+01 -1.1348860416567172e+02 + 39 1.2481780186485392e+02 3.1854282379699594e+01 2.4141006149778536e+02 + 40 -3.3952439214884566e+02 -5.2081203805390805e+02 -3.2749145453037933e+01 + 41 1.5953768898032115e+01 -2.5259433402084984e+01 -6.0977489335468270e+01 + 42 -3.5152692860571921e+02 1.0103192674618646e+02 1.0057493004151388e+02 + 43 1.8325251692529523e+02 -1.7843397924740334e+01 3.5813821983655501e+01 + 44 -1.7148730839833948e+02 6.5823249480752679e+01 -3.9043544554425530e+01 + 45 6.8021934986582622e+01 -5.2957926506736349e+01 -1.1278207528809644e+02 + 46 -1.9814589514445535e+02 3.1899128186018834e+02 -1.7125192460144413e+02 + 47 2.3518092199846154e+02 1.7325250425397039e+02 -4.6491315549358909e+01 + 48 -7.0934283327749368e+00 -2.1510500994703631e+02 2.8256786369777683e+02 + 49 2.4924479910930842e+02 -2.5977407369868608e+01 -1.9539857038363732e+02 + 50 9.0194565818523870e+01 2.6674460312457489e+02 4.8188042682115714e+01 + 51 2.7001317908987642e+02 -2.5024437918679871e+02 3.3082272466414389e+02 + 52 2.6770006025654061e+02 -1.3486195976744682e+02 -1.0999251813934431e+02 + 53 -3.0038447974652496e+02 1.7427208891886863e+02 -2.8369940533043155e+02 + 54 -1.8044322949045329e+02 3.2006167622599372e+02 -2.1986764638272354e+02 + 55 -6.7026995338193800e+01 2.8420556560193813e+02 -1.8256943632991832e+02 + 56 -9.3944897793228449e+02 7.6593871052490772e+02 -4.5872941120666047e+02 + 57 -2.7671724574062118e+01 -1.7257977562305288e+02 -1.6210118849324647e+02 + 58 7.1032070297632538e+02 -8.0881938208311476e+02 4.6676948457734858e+02 + 59 1.5682857500225737e+02 5.9891527233627293e+01 1.2646558890105982e+02 + 60 9.4076874705709926e+01 -1.1749874299724534e+02 -2.9919368333582668e+01 + 61 -4.8945763699767689e+01 1.6634783727405593e+02 6.7645978441449742e+01 + 62 1.6618577867039599e+02 7.3503605317082489e+01 2.2193892218236817e+02 + 63 4.6491757293230078e+00 -3.5581179274724042e+02 -3.8944419279304846e+01 + 64 -2.0021113303887074e+02 -1.1223202348830974e+02 3.0276216112541510e+02 run_vdwl: -8975.380420767826 run_coul: 0.5928530763135977 run_stress: ! |- - -1.1524045146329231e+03 -4.6202672628887268e+02 3.1947257175242231e+02 -2.2198788293036200e+03 3.4537925625758328e+02 -1.2645006400276918e+03 + -1.1524045146329215e+03 -4.6202672628887183e+02 3.1947257175242123e+02 -2.2198788293036246e+03 3.4537925625758203e+02 -1.2645006400276918e+03 run_forces: ! |2 - 1 -2.0916271375742122e+02 -1.8819704628010820e+02 -2.2843189669574852e+02 - 2 -5.9713089401385787e+01 -1.3795344000202866e+02 -6.1452818077516426e+01 - 3 1.0924320976999630e+02 5.4687819694184142e+01 8.7119001425249518e+00 - 4 2.2394063345773969e+02 -1.2606895888134676e+02 5.6116327882122533e+01 - 5 2.1344393241529360e+01 2.3982487161745496e+02 -1.1311589687086055e+02 - 6 -2.3464311544028666e+02 8.7956955368837427e+01 7.1434549534144523e+01 - 7 1.7780879390887415e+02 3.8509431501988246e+01 -2.7664422105920835e+02 - 8 -2.1021838063645568e+01 -4.0712804090199722e+02 1.5141447171445833e+02 - 9 -5.9306114388327742e+01 2.6264890826456997e+02 1.7441651570743588e+01 - 10 -8.4526898873820201e+01 1.5450366474645668e+02 6.0033453272929940e+00 - 11 -1.1159943563282735e+02 1.8656190683525134e+02 3.4449923076959345e+02 - 12 3.3352091011374790e+02 -3.8250187755922349e+02 5.1084711927225143e+01 - 13 -3.9348220819701362e+02 -9.9340584671855126e+01 2.4784344215807911e+02 - 14 1.7611207455981244e+02 -2.8017472349270184e+02 -2.7998178961052838e+02 - 15 2.5245571069035290e+02 -5.4734821409382626e+01 -1.3455249096986566e+02 - 16 1.6596243938777351e+02 1.6278821061030078e+02 4.2193739172058962e+01 - 17 4.0563209609350160e+01 2.0278198687184394e+02 1.1655244113651584e+02 - 18 1.9349048420969314e+02 -3.1742251436587967e+01 -3.0059327012827964e+01 - 19 -5.9065305354749185e+01 1.7641117222083235e+01 -1.0450807266106713e+02 - 20 1.3106409577706648e+02 2.5186488486411651e+01 1.3539864929844231e+02 - 21 -3.2006405209533727e+02 -1.1510774059461794e+02 -2.5815972761838644e+01 - 22 -1.2758648770740034e+01 -1.3030598897381913e+02 -1.4401125298080760e+02 - 23 -1.0142069915754510e+02 2.3316707339244664e+02 2.3905997646640651e+02 - 24 4.1563103349612355e+01 -1.2912528416939978e+01 -3.1670350622584593e+01 - 25 2.1168614583214108e+02 -2.0420927517565983e+02 -3.1221859837734250e+01 - 26 -2.6321230702712649e+02 1.2065335797472038e+02 2.6277789068532360e+02 - 27 -7.4500805679154823e+01 1.0778230652943388e+02 1.6094824153641918e+02 - 28 -2.4910955893577807e+02 -9.8496280842320616e+01 2.2240251270644734e+02 - 29 4.5656377692784969e+02 -5.6186906107102686e+01 -2.7582984196898542e+02 - 30 -1.1442511837997856e+02 5.2288586072111144e+01 -1.7194888884507304e+02 - 31 -1.8372666861898108e+02 -1.0040300216200654e+02 -9.6974937189118549e+01 - 32 1.5285848611243131e+02 -1.2910298326427261e+02 -1.8526958855531907e+02 - 33 2.0676324457133298e+01 3.7958042970093453e+02 -3.0330268376879861e+01 - 34 -1.8482802426276322e+02 -8.4860106696650362e+01 -1.0335087798868081e+02 - 35 -4.3757312673305961e+01 1.3332543035332394e+00 3.2176626618113424e+01 - 36 6.0396434382165080e+02 6.3211513244050911e+02 -1.5608509994293938e+01 - 37 -1.7702865323607540e+02 -3.4710307878941217e+02 2.0756937792988572e+02 - 38 -1.5990155316495603e+02 3.4380405811165133e+01 -1.1348496857139023e+02 - 39 1.2481655186335834e+02 3.1838210934905270e+01 2.4138399128801109e+02 - 40 -3.3940174784427825e+02 -5.2071078889465889e+02 -3.2710078405858489e+01 - 41 1.5894692394219231e+01 -2.5287374067694170e+01 -6.0953115361932809e+01 - 42 -3.5153052244718293e+02 1.0102830549812477e+02 1.0056790310062641e+02 - 43 1.8327499597791055e+02 -1.7817142708111650e+01 3.5817319257754193e+01 - 44 -1.7148210647983669e+02 6.5813679084638309e+01 -3.9042611994879181e+01 - 45 6.8003425377666687e+01 -5.2977048819501960e+01 -1.1277968937633442e+02 - 46 -1.9814362259114762e+02 3.1898369061349177e+02 -1.7124898143652061e+02 - 47 2.3513270166768126e+02 1.7331295501003885e+02 -4.6450664399000594e+01 - 48 -7.0870567240296412e+00 -2.1510840134220808e+02 2.8256287551251631e+02 - 49 2.4924760680789768e+02 -2.5986199354026756e+01 -1.9539743684221278e+02 - 50 9.0194077117530043e+01 2.6674400385736777e+02 4.8189887304663067e+01 + 1 -2.0916271375742122e+02 -1.8819704628010817e+02 -2.2843189669574869e+02 + 2 -5.9713089401385758e+01 -1.3795344000202869e+02 -6.1452818077516390e+01 + 3 1.0924320976999630e+02 5.4687819694184149e+01 8.7119001425249856e+00 + 4 2.2394063345773964e+02 -1.2606895888134682e+02 5.6116327882122576e+01 + 5 2.1344393241529389e+01 2.3982487161745499e+02 -1.1311589687086055e+02 + 6 -2.3464311544028661e+02 8.7956955368837384e+01 7.1434549534144637e+01 + 7 1.7780879390887415e+02 3.8509431501988217e+01 -2.7664422105920829e+02 + 8 -2.1021838063645482e+01 -4.0712804090199722e+02 1.5141447171445827e+02 + 9 -5.9306114388327757e+01 2.6264890826456991e+02 1.7441651570743552e+01 + 10 -8.4526898873820215e+01 1.5450366474645668e+02 6.0033453272930384e+00 + 11 -1.1159943563282745e+02 1.8656190683525122e+02 3.4449923076959351e+02 + 12 3.3352091011374790e+02 -3.8250187755922354e+02 5.1084711927225193e+01 + 13 -3.9348220819701362e+02 -9.9340584671855169e+01 2.4784344215807909e+02 + 14 1.7611207455981241e+02 -2.8017472349270173e+02 -2.7998178961052844e+02 + 15 2.5245571069035296e+02 -5.4734821409382555e+01 -1.3455249096986572e+02 + 16 1.6596243938777354e+02 1.6278821061030078e+02 4.2193739172058905e+01 + 17 4.0563209609350160e+01 2.0278198687184386e+02 1.1655244113651577e+02 + 18 1.9349048420969311e+02 -3.1742251436588031e+01 -3.0059327012828049e+01 + 19 -5.9065305354749214e+01 1.7641117222083306e+01 -1.0450807266106700e+02 + 20 1.3106409577706646e+02 2.5186488486411605e+01 1.3539864929844234e+02 + 21 -3.2006405209533733e+02 -1.1510774059461774e+02 -2.5815972761838673e+01 + 22 -1.2758648770740059e+01 -1.3030598897381921e+02 -1.4401125298080763e+02 + 23 -1.0142069915754507e+02 2.3316707339244658e+02 2.3905997646640648e+02 + 24 4.1563103349612369e+01 -1.2912528416939935e+01 -3.1670350622584650e+01 + 25 2.1168614583214125e+02 -2.0420927517565985e+02 -3.1221859837734193e+01 + 26 -2.6321230702712660e+02 1.2065335797472045e+02 2.6277789068532365e+02 + 27 -7.4500805679154780e+01 1.0778230652943385e+02 1.6094824153641912e+02 + 28 -2.4910955893577795e+02 -9.8496280842320559e+01 2.2240251270644745e+02 + 29 4.5656377692784969e+02 -5.6186906107102686e+01 -2.7582984196898536e+02 + 30 -1.1442511837997850e+02 5.2288586072111215e+01 -1.7194888884507304e+02 + 31 -1.8372666861898102e+02 -1.0040300216200652e+02 -9.6974937189118549e+01 + 32 1.5285848611243128e+02 -1.2910298326427264e+02 -1.8526958855531913e+02 + 33 2.0676324457133269e+01 3.7958042970093453e+02 -3.0330268376879818e+01 + 34 -1.8482802426276319e+02 -8.4860106696650320e+01 -1.0335087798868084e+02 + 35 -4.3757312673306046e+01 1.3332543035332109e+00 3.2176626618113481e+01 + 36 6.0396434382165091e+02 6.3211513244050911e+02 -1.5608509994294000e+01 + 37 -1.7702865323607537e+02 -3.4710307878941217e+02 2.0756937792988569e+02 + 38 -1.5990155316495614e+02 3.4380405811165076e+01 -1.1348496857139016e+02 + 39 1.2481655186335830e+02 3.1838210934905284e+01 2.4138399128801106e+02 + 40 -3.3940174784427819e+02 -5.2071078889465889e+02 -3.2710078405858532e+01 + 41 1.5894692394219259e+01 -2.5287374067694170e+01 -6.0953115361932859e+01 + 42 -3.5153052244718299e+02 1.0102830549812481e+02 1.0056790310062642e+02 + 43 1.8327499597791055e+02 -1.7817142708111664e+01 3.5817319257754207e+01 + 44 -1.7148210647983674e+02 6.5813679084638309e+01 -3.9042611994879181e+01 + 45 6.8003425377666758e+01 -5.2977048819501903e+01 -1.1277968937633439e+02 + 46 -1.9814362259114759e+02 3.1898369061349172e+02 -1.7124898143652064e+02 + 47 2.3513270166768126e+02 1.7331295501003882e+02 -4.6450664399000594e+01 + 48 -7.0870567240295701e+00 -2.1510840134220823e+02 2.8256287551251637e+02 + 49 2.4924760680789757e+02 -2.5986199354026777e+01 -1.9539743684221281e+02 + 50 9.0194077117530171e+01 2.6674400385736777e+02 4.8189887304663053e+01 51 2.7001321252850289e+02 -2.5024728349358162e+02 3.3082537396992757e+02 - 52 2.6774804404985821e+02 -1.3486815275053038e+02 -1.0995893066873343e+02 - 53 -3.0038420314626603e+02 1.7427256870890602e+02 -2.8369883331393498e+02 - 54 -1.8044337650670002e+02 3.2006027628882646e+02 -2.1986948976707882e+02 - 55 -6.7001753892442011e+01 2.8430150309051572e+02 -1.8265115796763561e+02 - 56 -9.3985837397072532e+02 7.6632225180339810e+02 -4.5884355139046016e+02 - 57 -2.7678338148623979e+01 -1.7258885892537234e+02 -1.6210010817478292e+02 - 58 7.1048197789438450e+02 -8.0911013609888585e+02 4.6702832864248001e+02 - 59 1.5682431931196510e+02 5.9896412584257810e+01 1.2646734132724080e+02 - 60 9.4082766259421007e+01 -1.1751801568433156e+02 -2.9921033400739130e+01 - 61 -4.8935117837153584e+01 1.6627961752299834e+02 6.7603012413403007e+01 - 62 1.6622090697397982e+02 7.3539705289790803e+01 2.2199414281313432e+02 - 63 4.6500905620167821e+00 -3.5581268146467818e+02 -3.8945035187443878e+01 - 64 -2.0020316331354053e+02 -1.1222336846987974e+02 3.0276528613232387e+02 + 52 2.6774804404985809e+02 -1.3486815275053038e+02 -1.0995893066873337e+02 + 53 -3.0038420314626609e+02 1.7427256870890602e+02 -2.8369883331393498e+02 + 54 -1.8044337650670010e+02 3.2006027628882651e+02 -2.1986948976707873e+02 + 55 -6.7001753892442125e+01 2.8430150309051584e+02 -1.8265115796763567e+02 + 56 -9.3985837397072532e+02 7.6632225180339799e+02 -4.5884355139046050e+02 + 57 -2.7678338148624022e+01 -1.7258885892537234e+02 -1.6210010817478278e+02 + 58 7.1048197789438450e+02 -8.0911013609888573e+02 4.6702832864248001e+02 + 59 1.5682431931196504e+02 5.9896412584257810e+01 1.2646734132724080e+02 + 60 9.4082766259420993e+01 -1.1751801568433152e+02 -2.9921033400739145e+01 + 61 -4.8935117837153584e+01 1.6627961752299828e+02 6.7603012413403036e+01 + 62 1.6622090697397977e+02 7.3539705289790774e+01 2.2199414281313429e+02 + 63 4.6500905620168673e+00 -3.5581268146467818e+02 -3.8945035187443779e+01 + 64 -2.0020316331354053e+02 -1.1222336846987976e+02 3.0276528613232387e+02 ... diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml index 8afebb059b..23e046037c 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -1,8 +1,7 @@ --- lammps_version: 2 Jul 2021 -date_generated: Mon Jul 12 20:56:39 2021 +date_generated: Wed Jul 21 15:49:50 2021 epsilon: 1e-12 -skip_tests: omp prerequisites: ! | pair reax/c fix qeq/reax @@ -39,139 +38,139 @@ natoms: 64 init_vdwl: -3248.7357862540734 init_coul: -327.0655125227952 init_stress: ! |- - -9.1835020319343903e+02 -1.1070721188680500e+03 -7.1558466813462928e+02 -2.3040889388184371e+02 1.9640581541966435e+02 -6.6002885423290161e+02 + -9.1835020319343971e+02 -1.1070721188680495e+03 -7.1558466813462803e+02 -2.3040889388184610e+02 1.9640581541966480e+02 -6.6002885423290161e+02 init_forces: ! |2 - 1 -8.8484243142053771e+01 -2.5824351291806131e+01 1.0916231386685253e+02 - 2 -1.0451347832614758e+02 -1.8136974287862063e+02 -2.1792749625845642e+02 - 3 -1.7141330932870608e+02 1.8106971255162955e+02 1.2675253960497301e+01 - 4 3.2218812838204848e+01 -5.1411756251266169e+01 9.0007306757969332e+01 - 5 1.8144819687099243e+02 1.6798395592380494e+01 -8.1726053808337795e+01 - 6 1.3634126802325468e+02 -3.0056831863560092e+02 2.9662272655036674e+01 - 7 -5.2968391883957075e+01 -1.2850613949952665e+02 -1.6373506942005375e+02 - 8 -1.5240314403220790e+02 4.1133257093807195e+01 1.5386487473711944e+02 - 9 3.2812532468307630e+01 1.0176367686189140e+02 1.4294427965088833e+01 - 10 7.9509811085534508e+01 1.3053732532659748e+02 1.1246398073074913e+02 - 11 -4.3144361329385013e+01 6.5763458097239607e+01 1.3482625633510347e+02 - 12 -9.6706456479566398e+01 -2.5878068074726730e+01 7.8323180467847466e+00 - 13 -6.3851121453490357e+01 -4.6607020158192647e+01 -3.6458352736129619e+01 - 14 7.8283848679559682e+01 -6.3646790831912000e+01 -8.9030561188058030e+01 - 15 -6.4212540181982106e+01 2.1093128152294153e+02 7.9060299592798899e+01 - 16 1.8608410345576598e+02 5.8084942932974315e+01 5.8538920003760346e+01 - 17 1.4285494615811757e+02 -3.9754521764346137e+01 -9.7686742464543357e+01 + 1 -8.8484243142053771e+01 -2.5824351291806110e+01 1.0916231386685256e+02 + 2 -1.0451347832614756e+02 -1.8136974287862066e+02 -2.1792749625845636e+02 + 3 -1.7141330932870599e+02 1.8106971255162949e+02 1.2675253960497342e+01 + 4 3.2218812838204855e+01 -5.1411756251266183e+01 9.0007306757969360e+01 + 5 1.8144819687099243e+02 1.6798395592380508e+01 -8.1726053808337866e+01 + 6 1.3634126802325463e+02 -3.0056831863560092e+02 2.9662272655036702e+01 + 7 -5.2968391883957104e+01 -1.2850613949952665e+02 -1.6373506942005375e+02 + 8 -1.5240314403220790e+02 4.1133257093807174e+01 1.5386487473711946e+02 + 9 3.2812532468307580e+01 1.0176367686189141e+02 1.4294427965088833e+01 + 10 7.9509811085534523e+01 1.3053732532659751e+02 1.1246398073074913e+02 + 11 -4.3144361329385013e+01 6.5763458097239592e+01 1.3482625633510347e+02 + 12 -9.6706456479566398e+01 -2.5878068074726777e+01 7.8323180467847324e+00 + 13 -6.3851121453490386e+01 -4.6607020158192661e+01 -3.6458352736129626e+01 + 14 7.8283848679559611e+01 -6.3646790831912028e+01 -8.9030561188058030e+01 + 15 -6.4212540181982106e+01 2.1093128152294148e+02 7.9060299592798927e+01 + 16 1.8608410345576596e+02 5.8084942932974329e+01 5.8538920003760360e+01 + 17 1.4285494615811757e+02 -3.9754521764346144e+01 -9.7686742464543357e+01 18 -4.1881548239260340e+01 -1.8476992042512617e+02 1.0708048360801492e+02 - 19 2.6677589878662855e+02 3.7179534199157007e+02 -3.3866575926816608e+02 - 20 -7.3520359401756991e+01 -8.3905077072099573e+01 -2.3854316876052961e-01 - 21 -7.2528668519170566e+01 -5.5898051886914395e+01 -1.1976059789267009e+02 - 22 1.5613953224968657e+02 -1.3200393155013322e+02 8.2112641076919701e+01 - 23 8.1833165091702909e+01 -1.7531644917125782e+01 -2.5648343293479577e+01 - 24 -2.1833127742352656e+02 1.9453922798678227e+02 -1.0817823414171312e+02 - 25 -1.1414613109864892e+02 1.9088917707975912e+02 -8.3362585828151552e+01 - 26 2.8281696751420088e+02 -2.1478267582733659e+02 2.2873793580282316e+02 - 27 -5.9769124622217909e+01 6.5221508924768330e+01 1.7553584075622149e+02 - 28 -2.9606162623424783e+00 3.8183918395203605e+01 3.2190129571074365e+01 - 29 -7.1069178571897922e+01 3.5485903180456219e+01 2.7311648896337669e+01 - 30 -1.7036975157904502e+02 -1.9851849204561248e+02 -1.1511387046436195e+02 - 31 -1.3744101014029059e+02 1.6223817575815931e+02 -1.1915340963940670e+02 - 32 2.7247730686207166e+01 -6.0237587331413039e+01 -1.7664910575209962e+02 + 19 2.6677589878662843e+02 3.7179534199157007e+02 -3.3866575926816614e+02 + 20 -7.3520359401756977e+01 -8.3905077072099573e+01 -2.3854316876052761e-01 + 21 -7.2528668519170537e+01 -5.5898051886914395e+01 -1.1976059789267006e+02 + 22 1.5613953224968657e+02 -1.3200393155013327e+02 8.2112641076919701e+01 + 23 8.1833165091702966e+01 -1.7531644917125725e+01 -2.5648343293479527e+01 + 24 -2.1833127742352659e+02 1.9453922798678227e+02 -1.0817823414171309e+02 + 25 -1.1414613109864892e+02 1.9088917707975912e+02 -8.3362585828151580e+01 + 26 2.8281696751420094e+02 -2.1478267582733662e+02 2.2873793580282313e+02 + 27 -5.9769124622217880e+01 6.5221508924768301e+01 1.7553584075622149e+02 + 28 -2.9606162623424428e+00 3.8183918395203612e+01 3.2190129571074365e+01 + 29 -7.1069178571897922e+01 3.5485903180456219e+01 2.7311648896337690e+01 + 30 -1.7036975157904502e+02 -1.9851849204561248e+02 -1.1511387046436192e+02 + 31 -1.3744101014029056e+02 1.6223817575815926e+02 -1.1915340963940670e+02 + 32 2.7247730686207166e+01 -6.0237587331413046e+01 -1.7664910575209962e+02 33 -6.1822971861324099e+01 -6.2648749988189138e+01 6.4194672454603221e+01 - 34 -1.7144145154614481e+01 9.9612835226783460e+01 -6.7437146990430080e+01 - 35 2.7024145652918196e+02 -2.1533864682645708e+02 1.3021380112890139e+02 - 36 1.0192185945862100e+02 1.8671686332443795e+02 -1.9864174410201804e+02 - 37 -1.7944122400067195e+02 1.2994089095714943e+02 -6.4321354857450871e+01 - 38 -2.9675055634802862e+02 1.0371104129720518e+02 1.5526989537725160e+02 - 39 8.6949523213895674e+01 -5.9975159120196956e+01 2.1780252234486241e+01 - 40 2.1612729980868430e+01 -1.0242580356371293e+02 5.7270724021457731e+01 - 41 -5.7836015722979205e+01 1.2268076597657853e+01 -6.6177893589402757e+01 - 42 -9.4774792026636987e+01 3.6872244003647978e+01 -7.5003138682741707e+01 - 43 2.2327470123469593e+02 9.5798787537490540e+01 1.2250410628715080e+02 - 44 8.7959342085865870e+01 -9.8740455124804626e+01 -8.4938709742755535e+01 - 45 1.4089093363544144e+01 1.2499300233485909e+02 5.5864237375372056e+01 - 46 1.3547776948110229e+01 -2.9276229642219512e+01 2.2187402435965939e+01 - 47 3.3448457824361199e+01 -1.9209977417392150e+02 -6.9989895706263340e+01 - 48 6.7827627502625162e+01 -2.0361789453088664e+02 -2.8571736118815554e+01 - 49 -3.7476005148434922e+02 -2.4452451195186526e+01 1.0764661193358344e+02 - 50 4.0090993029105412e+01 -7.3201402054245932e+01 8.9025922810974976e+01 + 34 -1.7144145154614467e+01 9.9612835226783488e+01 -6.7437146990430065e+01 + 35 2.7024145652918202e+02 -2.1533864682645725e+02 1.3021380112890154e+02 + 36 1.0192185945862101e+02 1.8671686332443795e+02 -1.9864174410201804e+02 + 37 -1.7944122400067201e+02 1.2994089095714961e+02 -6.4321354857450956e+01 + 38 -2.9675055634802868e+02 1.0371104129720520e+02 1.5526989537725160e+02 + 39 8.6949523213895688e+01 -5.9975159120196956e+01 2.1780252234486241e+01 + 40 2.1612729980868444e+01 -1.0242580356371295e+02 5.7270724021457731e+01 + 41 -5.7836015722979198e+01 1.2268076597657853e+01 -6.6177893589402757e+01 + 42 -9.4774792026636959e+01 3.6872244003648007e+01 -7.5003138682741707e+01 + 43 2.2327470123469598e+02 9.5798787537490540e+01 1.2250410628715086e+02 + 44 8.7959342085865842e+01 -9.8740455124804612e+01 -8.4938709742755563e+01 + 45 1.4089093363544151e+01 1.2499300233485907e+02 5.5864237375372056e+01 + 46 1.3547776948110229e+01 -2.9276229642219498e+01 2.2187402435965936e+01 + 47 3.3448457824361142e+01 -1.9209977417392156e+02 -6.9989895706263411e+01 + 48 6.7827627502625162e+01 -2.0361789453088662e+02 -2.8571736118815590e+01 + 49 -3.7476005148434911e+02 -2.4452451195186555e+01 1.0764661193358336e+02 + 50 4.0090993029105427e+01 -7.3201402054245932e+01 8.9025922810974976e+01 51 1.3736420686697005e+02 -1.0204157331499377e+02 1.5813725581140889e+02 - 52 -1.1253479916199427e+02 1.2293268076535985e+02 -1.2940078007359961e+02 - 53 -5.3560738472921095e+01 3.3353082884518017e+02 -1.1314448604069298e+00 - 54 -1.0678339177259694e+01 6.2810937621378145e+01 1.8344988318246158e+02 + 52 -1.1253479916199434e+02 1.2293268076535988e+02 -1.2940078007359961e+02 + 53 -5.3560738472921159e+01 3.3353082884518022e+02 -1.1314448604069298e+00 + 54 -1.0678339177259721e+01 6.2810937621378216e+01 1.8344988318246158e+02 55 1.1231900459987534e+02 -1.7906654831317346e+02 7.6533681064342304e+01 - 56 -4.7772143767870944e+01 -1.3536779754026816e+02 3.4054518546944344e+01 - 57 9.6541690594806298e+01 7.5093838528685538e+01 -6.0858704719314126e+01 - 58 -2.0459002696752538e+01 -1.1535051272093606e+01 -1.4282722385693347e+01 - 59 -6.9459404830701018e+01 1.0185761321965332e+02 8.3383492919159224e+01 - 60 -1.6658947285275730e+01 6.4062738321772898e+01 -1.5162708730048112e+02 - 61 -3.5221540644535267e+01 -1.0209415023871217e+02 -7.4154806308030501e+01 - 62 1.5375061601631639e+01 -6.3257038363614946e+00 2.7511178147389188e+01 - 63 1.3464841040549373e+02 -1.2416888785900632e+02 -5.8961420295344652e+01 - 64 1.0701063550375264e+02 1.1895268715876718e+02 7.4448770962530915e+01 + 56 -4.7772143767870858e+01 -1.3536779754026813e+02 3.4054518546944287e+01 + 57 9.6541690594806283e+01 7.5093838528685495e+01 -6.0858704719314126e+01 + 58 -2.0459002696752535e+01 -1.1535051272093602e+01 -1.4282722385693351e+01 + 59 -6.9459404830701061e+01 1.0185761321965333e+02 8.3383492919159224e+01 + 60 -1.6658947285275733e+01 6.4062738321772926e+01 -1.5162708730048112e+02 + 61 -3.5221540644535281e+01 -1.0209415023871215e+02 -7.4154806308030501e+01 + 62 1.5375061601631639e+01 -6.3257038363614946e+00 2.7511178147389174e+01 + 63 1.3464841040549379e+02 -1.2416888785900632e+02 -5.8961420295344659e+01 + 64 1.0701063550375258e+02 1.1895268715876720e+02 7.4448770962530929e+01 run_vdwl: -3248.732462206598 run_coul: -327.0653994771387 run_stress: ! |- - -9.1826184153105692e+02 -1.1070021528099094e+03 -7.1550580149015514e+02 -2.3049698812230801e+02 1.9635464153062043e+02 -6.6005793264639442e+02 + -9.1826184153105646e+02 -1.1070021528099112e+03 -7.1550580149015627e+02 -2.3049698812231000e+02 1.9635464153062134e+02 -6.6005793264639556e+02 run_forces: ! |2 - 1 -8.8485813027206106e+01 -2.5824096764125731e+01 1.0916519811125200e+02 - 2 -1.0451269244764349e+02 -1.8137828885716391e+02 -2.1792302517211854e+02 - 3 -1.7141411648636478e+02 1.8106803267132440e+02 1.2674658958989376e+01 - 4 3.2220655253010904e+01 -5.1413086231065009e+01 9.0010227071396386e+01 - 5 1.8145005123751935e+02 1.6799086578426795e+01 -8.1723924656170567e+01 - 6 1.3640868425589994e+02 -3.0059549892327152e+02 2.9595528779455449e+01 - 7 -5.2968868171259700e+01 -1.2850640761855158e+02 -1.6373951876943795e+02 - 8 -1.5240417232930932e+02 4.1133578832982629e+01 1.5386572595284764e+02 - 9 3.2811395144161118e+01 1.0176141517530588e+02 1.4295529169373282e+01 - 10 7.9508569375402288e+01 1.3053469081285704e+02 1.1246210158699024e+02 - 11 -4.3142968406859097e+01 6.5760241919953828e+01 1.3481728343070949e+02 - 12 -9.6708250458847047e+01 -2.5879521605003774e+01 7.8278088000700450e+00 - 13 -6.3852523341823215e+01 -4.6607003335506526e+01 -3.6455965991574899e+01 - 14 7.8283534745824213e+01 -6.3643851884097081e+01 -8.9027881489336053e+01 - 15 -6.4209962316685647e+01 2.1093255387179667e+02 7.9059692211125324e+01 - 16 1.8608085162130908e+02 5.8088780803195149e+01 5.8532604899053126e+01 - 17 1.4285609630789870e+02 -3.9754014601715802e+01 -9.7689588113924358e+01 - 18 -4.1881237955183380e+01 -1.8477109777149900e+02 1.0708061287038568e+02 + 1 -8.8485813027206135e+01 -2.5824096764125731e+01 1.0916519811125200e+02 + 2 -1.0451269244764350e+02 -1.8137828885716391e+02 -2.1792302517211851e+02 + 3 -1.7141411648636486e+02 1.8106803267132440e+02 1.2674658958989427e+01 + 4 3.2220655253010918e+01 -5.1413086231064995e+01 9.0010227071396415e+01 + 5 1.8145005123751957e+02 1.6799086578426838e+01 -8.1723924656170610e+01 + 6 1.3640868425590003e+02 -3.0059549892327158e+02 2.9595528779455435e+01 + 7 -5.2968868171259714e+01 -1.2850640761855155e+02 -1.6373951876943804e+02 + 8 -1.5240417232930932e+02 4.1133578832982636e+01 1.5386572595284764e+02 + 9 3.2811395144161132e+01 1.0176141517530590e+02 1.4295529169373282e+01 + 10 7.9508569375402331e+01 1.3053469081285709e+02 1.1246210158699030e+02 + 11 -4.3142968406859097e+01 6.5760241919953813e+01 1.3481728343070949e+02 + 12 -9.6708250458847061e+01 -2.5879521605003742e+01 7.8278088000700370e+00 + 13 -6.3852523341823229e+01 -4.6607003335506541e+01 -3.6455965991574878e+01 + 14 7.8283534745824241e+01 -6.3643851884097224e+01 -8.9027881489336167e+01 + 15 -6.4209962316685690e+01 2.1093255387179667e+02 7.9059692211125295e+01 + 16 1.8608085162130908e+02 5.8088780803195142e+01 5.8532604899053133e+01 + 17 1.4285609630789864e+02 -3.9754014601715795e+01 -9.7689588113924316e+01 + 18 -4.1881237955183380e+01 -1.8477109777149900e+02 1.0708061287038571e+02 19 2.6677609377410010e+02 3.7179392086487712e+02 -3.3866472006706340e+02 - 20 -7.3532190353883053e+01 -8.3895301502997995e+01 -2.5591151698950659e-01 - 21 -7.2528695460850031e+01 -5.5899068566579935e+01 -1.1975970158720031e+02 - 22 1.5614083463623408e+02 -1.3200472837628521e+02 8.2112156159808862e+01 - 23 8.1835290134891864e+01 -1.7522433028942366e+01 -2.5648597332802922e+01 - 24 -2.1834038832017538e+02 1.9455197293610073e+02 -1.0818261235148485e+02 - 25 -1.1414871301032665e+02 1.9089327234338916e+02 -8.3363315092572321e+01 - 26 2.8282661127556162e+02 -2.1478990451658228e+02 2.2874215408671131e+02 - 27 -5.9765619577841512e+01 6.5223096224356411e+01 1.7553677772771837e+02 - 28 -2.9624987519851000e+00 3.8179667154298826e+01 3.2185280629057068e+01 - 29 -7.1069494187081830e+01 3.5486459200488397e+01 2.7311657807311487e+01 - 30 -1.7037047317028464e+02 -1.9851861739498079e+02 -1.1511395377375429e+02 - 31 -1.3744346258178371e+02 1.6223725554250467e+02 -1.1915482471876425e+02 - 32 2.7248541074999881e+01 -6.0231207974705434e+01 -1.7663875080811843e+02 - 33 -6.1822398570959187e+01 -6.2648503570177034e+01 6.4194898940197760e+01 + 20 -7.3532190353883053e+01 -8.3895301502997967e+01 -2.5591151698956521e-01 + 21 -7.2528695460850088e+01 -5.5899068566579977e+01 -1.1975970158720035e+02 + 22 1.5614083463623413e+02 -1.3200472837628527e+02 8.2112156159808862e+01 + 23 8.1835290134891864e+01 -1.7522433028942352e+01 -2.5648597332802964e+01 + 24 -2.1834038832017541e+02 1.9455197293610073e+02 -1.0818261235148486e+02 + 25 -1.1414871301032666e+02 1.9089327234338913e+02 -8.3363315092572321e+01 + 26 2.8282661127556162e+02 -2.1478990451658228e+02 2.2874215408671137e+02 + 27 -5.9765619577841541e+01 6.5223096224356439e+01 1.7553677772771840e+02 + 28 -2.9624987519851178e+00 3.8179667154298812e+01 3.2185280629057068e+01 + 29 -7.1069494187081830e+01 3.5486459200488405e+01 2.7311657807311473e+01 + 30 -1.7037047317028475e+02 -1.9851861739498079e+02 -1.1511395377375433e+02 + 31 -1.3744346258178373e+02 1.6223725554250467e+02 -1.1915482471876425e+02 + 32 2.7248541074999881e+01 -6.0231207974705420e+01 -1.7663875080811843e+02 + 33 -6.1822398570959159e+01 -6.2648503570177034e+01 6.4194898940197774e+01 34 -1.7143769208529751e+01 9.9611942509072080e+01 -6.7436075885014986e+01 - 35 2.7028238194296250e+02 -2.1538301386687789e+02 1.3022488558865325e+02 - 36 1.0192362247594352e+02 1.8671008619975407e+02 -1.9863711527085923e+02 + 35 2.7028238194296250e+02 -2.1538301386687783e+02 1.3022488558865331e+02 + 36 1.0192362247594350e+02 1.8671008619975410e+02 -1.9863711527085917e+02 37 -1.7946751638141498e+02 1.2998098195714172e+02 -6.4345576150932828e+01 - 38 -2.9675376021752191e+02 1.0371435865032235e+02 1.5526896750689889e+02 - 39 8.6950332148131110e+01 -5.9975388525042028e+01 2.1779869753193040e+01 - 40 2.1613442490343317e+01 -1.0242529062335393e+02 5.7271060256879871e+01 - 41 -5.7834219239599371e+01 1.2266148111030006e+01 -6.6169611760840567e+01 - 42 -9.4774021509187520e+01 3.6869981851995341e+01 -7.5005285702022732e+01 - 43 2.2327078175416057e+02 9.5796580610065675e+01 1.2250057895428364e+02 - 44 8.7963372590925971e+01 -9.8736166841311601e+01 -8.4943701327958067e+01 - 45 1.4080569929277514e+01 1.2498603359504317e+02 5.5870075675508225e+01 - 46 1.3549084713162141e+01 -2.9276453411015115e+01 2.2187141786216614e+01 - 47 3.3448153520154243e+01 -1.9209514330879989e+02 -6.9988284949882583e+01 - 48 6.7840148074199064e+01 -2.0361975956922109e+02 -2.8580806381848241e+01 - 49 -3.7480020999441342e+02 -2.4397739069897693e+01 1.0773474200196225e+02 - 50 4.0091767398974710e+01 -7.3200211843412532e+01 8.9024460533547710e+01 + 38 -2.9675376021752186e+02 1.0371435865032235e+02 1.5526896750689886e+02 + 39 8.6950332148131110e+01 -5.9975388525042071e+01 2.1779869753193026e+01 + 40 2.1613442490343314e+01 -1.0242529062335393e+02 5.7271060256879871e+01 + 41 -5.7834219239599364e+01 1.2266148111030034e+01 -6.6169611760840596e+01 + 42 -9.4774021509187506e+01 3.6869981851995398e+01 -7.5005285702022690e+01 + 43 2.2327078175416062e+02 9.5796580610065675e+01 1.2250057895428364e+02 + 44 8.7963372590925985e+01 -9.8736166841311601e+01 -8.4943701327958038e+01 + 45 1.4080569929277486e+01 1.2498603359504315e+02 5.5870075675508232e+01 + 46 1.3549084713162147e+01 -2.9276453411015140e+01 2.2187141786216618e+01 + 47 3.3448153520154271e+01 -1.9209514330879989e+02 -6.9988284949882569e+01 + 48 6.7840148074199092e+01 -2.0361975956922109e+02 -2.8580806381848255e+01 + 49 -3.7480020999441365e+02 -2.4397739069897636e+01 1.0773474200196219e+02 + 50 4.0091767398974682e+01 -7.3200211843412504e+01 8.9024460533547696e+01 51 1.3736689552057061e+02 -1.0204490779999098e+02 1.5814099219631356e+02 - 52 -1.1253380764229995e+02 1.2293290174735385e+02 -1.2940467151627448e+02 - 53 -5.3596650492501155e+01 3.3350644289105048e+02 -1.1510223807932292e+00 - 54 -1.0666202581574648e+01 6.2798090272532036e+01 1.8346799239172421e+02 - 55 1.1232135575968965e+02 -1.7906994470748415e+02 7.6534265236354301e+01 - 56 -4.7780797026174795e+01 -1.3535955159718560e+02 3.4061208199866762e+01 - 57 9.6541265005138669e+01 7.5091144884198542e+01 -6.0860069746425758e+01 - 58 -2.0459328007572658e+01 -1.1533053731831272e+01 -1.4282938438265621e+01 - 59 -6.9467796604507953e+01 1.0186323697055805e+02 8.3388794196804326e+01 - 60 -1.6660217426514649e+01 6.4061566362647156e+01 -1.5162714312949214e+02 - 61 -3.5220536021452773e+01 -1.0209241739133056e+02 -7.4154706185261873e+01 - 62 1.5375483178245863e+01 -6.3263099051314251e+00 2.7512110875657907e+01 - 63 1.3464595988109866e+02 -1.2416936634154251e+02 -5.8957063242418137e+01 - 64 1.0701154605982802e+02 1.1895382951205713e+02 7.4449321163285816e+01 + 52 -1.1253380764229996e+02 1.2293290174735381e+02 -1.2940467151627450e+02 + 53 -5.3596650492501162e+01 3.3350644289105031e+02 -1.1510223807932007e+00 + 54 -1.0666202581574661e+01 6.2798090272532008e+01 1.8346799239172421e+02 + 55 1.1232135575968968e+02 -1.7906994470748415e+02 7.6534265236354301e+01 + 56 -4.7780797026174810e+01 -1.3535955159718563e+02 3.4061208199866719e+01 + 57 9.6541265005138698e+01 7.5091144884198556e+01 -6.0860069746425658e+01 + 58 -2.0459328007572669e+01 -1.1533053731831259e+01 -1.4282938438265617e+01 + 59 -6.9467796604507981e+01 1.0186323697055799e+02 8.3388794196804326e+01 + 60 -1.6660217426514606e+01 6.4061566362647113e+01 -1.5162714312949211e+02 + 61 -3.5220536021452787e+01 -1.0209241739133054e+02 -7.4154706185261915e+01 + 62 1.5375483178245885e+01 -6.3263099051314251e+00 2.7512110875657893e+01 + 63 1.3464595988109866e+02 -1.2416936634154256e+02 -5.8957063242418101e+01 + 64 1.0701154605982798e+02 1.1895382951205715e+02 7.4449321163285845e+01 ... From aa885a9d8df4a432fdc1141fc73934412ff0f0c6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 17:06:21 -0400 Subject: [PATCH 115/352] make virial processing use the total global virial --- src/fix_external.cpp | 37 +++++++++++++++++++++++++++-------- src/library.cpp | 46 ++++++++++++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/fix_external.cpp b/src/fix_external.cpp index 99539e86cf..f95c30c28d 100644 --- a/src/fix_external.cpp +++ b/src/fix_external.cpp @@ -15,6 +15,7 @@ #include "fix_external.h" #include "atom.h" +#include "comm.h" #include "error.h" #include "memory.h" #include "update.h" @@ -185,10 +186,13 @@ void FixExternal::min_post_force(int vflag) /* ---------------------------------------------------------------------- caller invokes this method to set its contribution to global energy + this is the *total* energy across all MPI ranks of the external code + and must be set for all MPI ranks. unlike other energy/virial set methods: do not just return if eflag_global is not set b/c input script could access this quantity via compute_scalar() even if eflag is not set on a particular timestep + this function is compatible with CALLBACK and ARRAY mode ------------------------------------------------------------------------- */ void FixExternal::set_energy_global(double caller_energy) @@ -197,22 +201,32 @@ void FixExternal::set_energy_global(double caller_energy) } /* ---------------------------------------------------------------------- - caller invokes this method to set its contribution to global virial + caller invokes this method to set its contribution to the global virial + for all MPI ranks. the virial value is the *total* contribution across + all MPI ranks of the external code and thus we need to divide by the + number of MPI ranks since the tallying code expects per MPI rank contributions. + this function is compatible with PF_CALLBACK and PF_ARRAY mode ------------------------------------------------------------------------- */ void FixExternal::set_virial_global(double *caller_virial) { + const double npscale = 1.0/(double)comm->nprocs; for (int i = 0; i < 6; i++) - user_virial[i] = caller_virial[i]; + user_virial[i] = npscale * caller_virial[i]; } /* ---------------------------------------------------------------------- - caller invokes this method to set its contribution to peratom energy + caller invokes this method to set its contribution to peratom energy. + this is applied to the *local* atoms only. + this function is compatible with PF_CALLBACK mode only since it tallies + its energy contributions directly into the accumulator arrays. ------------------------------------------------------------------------- */ void FixExternal::set_energy_peratom(double *caller_energy) { if (!eflag_atom) return; + if ((mode == PF_ARRAY) && (comm->me == 0)) + error->warning(FLERR,"Can only set energy/atom for fix external in pf/callback mode"); int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) @@ -221,6 +235,9 @@ void FixExternal::set_energy_peratom(double *caller_energy) /* ---------------------------------------------------------------------- caller invokes this method to set its contribution to peratom virial + this is applied to the *local* atoms only. + this function is compatible with PF_CALLBACK mode only since it tallies + its virial contributions directly into the accumulator arrays. ------------------------------------------------------------------------- */ void FixExternal::set_virial_peratom(double **caller_virial) @@ -228,6 +245,8 @@ void FixExternal::set_virial_peratom(double **caller_virial) int i,j; if (!vflag_atom) return; + if ((mode == PF_ARRAY) && (comm->me == 0)) + error->warning(FLERR,"Can only set virial/atom for fix external in pf/callback mode"); int nlocal = atom->nlocal; for (i = 0; i < nlocal; i++) @@ -236,8 +255,8 @@ void FixExternal::set_virial_peratom(double **caller_virial) } /* ---------------------------------------------------------------------- - caller invokes this method to set length of vector of values - assume all vector values are extensive, could make this an option + caller invokes this method to set length of global vector of values + assume all vector values are extensive. ------------------------------------------------------------------------- */ void FixExternal::set_vector_length(int n) @@ -252,14 +271,15 @@ void FixExternal::set_vector_length(int n) } /* ---------------------------------------------------------------------- - caller invokes this method to set Index value in vector - index ranges from 1 to N inclusive + caller invokes this method to set value for item at "index" in vector + index is 1-based, thus index ranges from 1 to N inclusively. + Must be called from all MPI ranks. ------------------------------------------------------------------------- */ void FixExternal::set_vector(int index, double value) { if (index > size_vector) - error->all(FLERR,"Invalid set_vector index in fix external"); + error->all(FLERR,"Invalid set_vector index ({} of {}) in fix external",index,size_vector); caller_vector[index-1] = value; } @@ -290,6 +310,7 @@ double FixExternal::compute_vector(int n) double FixExternal::memory_usage() { double bytes = 3*atom->nmax * sizeof(double); + bytes += 6*sizeof(double); return bytes; } diff --git a/src/library.cpp b/src/library.cpp index a6e4509c56..0c897538a1 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4806,8 +4806,8 @@ void lammps_decode_image_flags(imageint image, int *flags) /* ---------------------------------------------------------------------- */ -/** Set the callback function for a fix external instance with the given ID. - Optionally also set the pointer to the calling object. +/** Set up the callback function for a fix external instance with the given ID. + \verbatim embed:rst Fix :doc:`external ` allows programs that are running LAMMPS through @@ -4821,7 +4821,15 @@ mode. The function has to have C language bindings with the prototype: void func(void *ptr, bigint timestep, int nlocal, tagint *ids, double **x, double **fexternal); -This is an alternative to the array mechanism set up by :cpp:func:`lammps_fix_external_get_force`. +The argument *ptr* to this function will be stored in fix external and +the passed as the first argument calling the callback function `func()`. +This would usually be a pointer to the LAMMPS instance, i.e. the same +pointer as the *handle* argument. This would be needed to call +functions that set the global or per-atom energy or virial +contributions. + +The callback mechanism is on of the two modes of fix external. The +alternative is the array mode set up by :cpp:func:`lammps_fix_external_get_force`. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4865,16 +4873,24 @@ its library interface to add or modify certain LAMMPS properties on specific timesteps, similar to the way other fixes do. This function provides access to the per-atom force storage in the fix -to be added to the individual atoms when using the "pf/array" mode. The -*fexternal* array can be accessed similar to the "native" per-atom -*arrays accessible via the :cpp:func:`lammps_extract_atom` function. -Because the underlying data structures can change as atoms migrate -between MPI processes, this function should be always called immediately -before the forces are going to be set. +external instance to be added to the individual atoms when using the +"pf/array" mode. The *fexternal* array can be accessed similar to the +"native" per-atom *arrays accessible via the +:cpp:func:`lammps_extract_atom` function. Please note that the array +stores forces for *local* atoms, in the order determined by the neighbor +list build. Because the underlying data structures can change as well as +the order of atom as they migrate between MPI processes, this function +should be always called immediately before the forces are going to be +set to get an up-to-date pointer. You can use +e.g. :cpp:func:`lammps_get_natoms` to obtain the number of local atoms +and thus the dimensions of the returned force array (``double force[nlocal][3]``). -This is an alternative to the callback mechanism set up by -:cpp:func:`lammps_set_fix_external_callback` with out using the callback -mechanism to call out to the external program. +This is an alternative to the callback mechanism in fix external set up by +:cpp:func:`lammps_set_fix_external_callback`. The main difference is +that this mechanism can be used when forces can be pre-computed and the +control alternates between LAMMPS and the external command, while the +callback mechanism can call the external code to compute the force when +the fix is triggered and needs them. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4914,9 +4930,11 @@ double **lammps_fix_external_get_force(void *handle, const char *id) This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and :cpp:func:`lammps_fix_external_get_force` to also set the contribution -to the global energy from the external code. The value of the *eng* +to the global energy from the external code. The value of the *eng* argument will be stored in the fix and applied on the current and all -following timesteps until changed. +following timesteps until changed by another call to this function. +When running in parallel, the value is the per-MPI process contribution, +not the total energy. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an From 6d3a5a6eb98ed710a2ac1eef34af9a10e1f64337 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Wed, 21 Jul 2021 17:05:56 -0600 Subject: [PATCH 116/352] Port custom changes to atom_kokkos --- src/KOKKOS/atom_kokkos.cpp | 93 ++++++++++++++++++++++++++++---------- src/KOKKOS/atom_kokkos.h | 4 +- 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index c41a42c99a..0962b11c20 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -248,56 +248,101 @@ void AtomKokkos::grow(unsigned int mask) { return index in ivector or dvector of its location ------------------------------------------------------------------------- */ -int AtomKokkos::add_custom(const char *name, int flag) +int AtomKokkos::add_custom(const char *name, int flag, int cols) { int index; - if (flag == 0) { + if (flag == 0 && cols == 0) { index = nivector; nivector++; - iname = (char **) memory->srealloc(iname,nivector*sizeof(char *), - "atom:iname"); + ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *), + "atom:ivname"); int n = strlen(name) + 1; - iname[index] = new char[n]; - strcpy(iname[index],name); + ivname[index] = new char[n]; + strcpy(ivname[index],name); ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), "atom:ivector"); memory->create(ivector[index],nmax,"atom:ivector"); - } else { + + } else if (flag == 1 && cols == 0) { index = ndvector; ndvector++; - dname = (char **) memory->srealloc(dname,ndvector*sizeof(char *), - "atom:dname"); + dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *), + "atom:dvname"); int n = strlen(name) + 1; - dname[index] = new char[n]; - strcpy(dname[index],name); + dvname[index] = new char[n]; + strcpy(dvname[index],name); + dvector = (double **) memory->srealloc(dvector,ndvector*sizeof(double *), + "atom:dvector"); this->sync(Device,DVECTOR_MASK); memoryKK->grow_kokkos(k_dvector,dvector,ndvector,nmax, "atom:dvector"); this->modified(Device,DVECTOR_MASK); - } + } else if (flag == 0 && cols) { + index = niarray; + niarray++; + ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *), + "atom:ianame"); + int n = strlen(name) + 1; + ianame[index] = new char[n]; + strcpy(ianame[index],name); + iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), + "atom:iarray"); + memory->create(iarray[index],nmax,cols,"atom:iarray"); + + icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); + icols[index] = cols; + + } else if (flag == 1 && cols) { + index = ndarray; + ndarray++; + daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *), + "atom:daname"); + int n = strlen(name) + 1; + daname[index] = new char[n]; + strcpy(daname[index],name); + darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **), + "atom:darray"); + memory->create(darray[index],nmax,cols,"atom:darray"); + + dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); + dcols[index] = cols; + } + return index; } /* ---------------------------------------------------------------------- remove a custom variable of type flag = 0/1 for int/double at index - free memory for vector and name and set ptrs to a null pointer - ivector/dvector and iname/dname lists never shrink + free memory for vector/array and name and set ptrs to a null pointer + these lists never shrink ------------------------------------------------------------------------- */ -void AtomKokkos::remove_custom(int flag, int index) +void AtomKokkos::remove_custom(int index, int flag, int cols) { - if (flag == 0) { + if (flag == 0 && cols == 0) { memory->destroy(ivector[index]); - ivector[index] = nullptr; - delete [] iname[index]; - iname[index] = nullptr; - } else { - //memoryKK->destroy_kokkos(dvector); - dvector[index] = nullptr; - delete [] dname[index]; - dname[index] = nullptr; + ivector[index] = NULL; + delete [] ivname[index]; + ivname[index] = NULL; + + } else if (flag == 1 && cols == 0) { + dvector[index] = NULL; + delete [] dvname[index]; + dvname[index] = NULL; + + } else if (flag == 0 && cols) { + memory->destroy(iarray[index]); + iarray[index] = NULL; + delete [] ianame[index]; + ianame[index] = NULL; + + } else if (flag == 1 && cols) { + memory->destroy(darray[index]); + darray[index] = NULL; + delete [] daname[index]; + daname[index] = NULL; } } diff --git a/src/KOKKOS/atom_kokkos.h b/src/KOKKOS/atom_kokkos.h index c875817a70..09442e2c60 100644 --- a/src/KOKKOS/atom_kokkos.h +++ b/src/KOKKOS/atom_kokkos.h @@ -69,8 +69,8 @@ class AtomKokkos : public Atom { void sync_overlapping_device(const ExecutionSpace space, unsigned int mask); virtual void sort(); virtual void grow(unsigned int mask); - int add_custom(const char *, int); - void remove_custom(int, int); + int add_custom(const char *, int, int); + void remove_custom(int, int, int); virtual void deallocate_topology(); void sync_modify(ExecutionSpace, unsigned int, unsigned int); private: From f8f4af471ff0518776e470c2483070f207430599 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 21:36:16 -0400 Subject: [PATCH 117/352] general rename of files, styles, and keywords from "reax/c", "reax", or "reaxc" to "reaxff" --- cmake/Modules/Packages/OPENMP.cmake | 18 +- doc/src/Commands_fix.rst | 6 +- doc/src/Commands_pair.rst | 2 +- doc/src/Errors_warnings.rst | 4 +- doc/src/Packages_details.rst | 8 +- doc/src/Packages_list.rst | 2 +- doc/src/Tools.rst | 15 - doc/src/compute_pair.rst | 5 +- doc/src/fix.rst | 6 +- doc/src/fix_adapt.rst | 2 +- doc/src/fix_gcmc.rst | 2 +- doc/src/fix_qeq.rst | 20 +- doc/src/fix_qeq_comb.rst | 2 +- .../{fix_qeq_reax.rst => fix_qeq_reaxff.rst} | 36 +- ...x_reaxc_bonds.rst => fix_reaxff_bonds.rst} | 20 +- ...axc_species.rst => fix_reaxff_species.rst} | 57 ++- doc/src/kim_commands.rst | 4 +- doc/src/package.rst | 3 +- doc/src/{pair_reaxc.rst => pair_reaxff.rst} | 118 ++++--- doc/src/pair_style.rst | 2 +- doc/utils/check-styles.py | 55 ++- examples/README | 2 +- examples/{reax => reaxff}/AB/README | 0 examples/{reax => reaxff}/AB/data.AB | 0 examples/{reax => reaxff}/AB/ffield.reax.AB | 0 examples/{reax => reaxff}/AB/in.AB | 0 examples/{reax => reaxff}/AB/lmp_control | 0 .../{reax => reaxff}/AB/log.8Mar18.AB.g++.1 | 0 .../{reax => reaxff}/AB/log.8Mar18.AB.g++.4 | 0 examples/{reax => reaxff}/AB/param.qeq | 0 examples/{reax => reaxff}/AuO/README | 0 examples/{reax => reaxff}/AuO/data.AuO | 0 examples/{reax => reaxff}/AuO/ffield.reax.AuO | 0 examples/{reax => reaxff}/AuO/in.AuO | 0 examples/{reax => reaxff}/AuO/lmp_control | 0 .../{reax => reaxff}/AuO/log.8Mar18.AuO.g++.1 | 0 .../{reax => reaxff}/AuO/log.8Mar18.AuO.g++.4 | 0 examples/{reax => reaxff}/AuO/param.qeq | 0 examples/{reax => reaxff}/CHO/README | 0 examples/{reax => reaxff}/CHO/data.CHO | 0 examples/{reax => reaxff}/CHO/ffield.reax.cho | 0 examples/{reax => reaxff}/CHO/in.CHO | 0 examples/{reax => reaxff}/CHO/lmp_control | 0 .../{reax => reaxff}/CHO/log.8Mar18.CHO.g++.1 | 0 .../{reax => reaxff}/CHO/log.8Mar18.CHO.g++.4 | 0 examples/{reax => reaxff}/CHO/param.qeq | 0 examples/{reax => reaxff}/FC/README | 0 examples/{reax => reaxff}/FC/data.FC | 0 examples/{reax => reaxff}/FC/ffield.reax.FC | 0 examples/{reax => reaxff}/FC/in.FC | 0 .../{reax => reaxff}/FC/log.8Mar18.FC.g++.1 | 0 .../{reax => reaxff}/FC/log.8Mar18.FC.g++.4 | 0 examples/{reax => reaxff}/FeOH3/README | 0 examples/{reax => reaxff}/FeOH3/data.FeOH3 | 0 .../FeOH3/ffield.reax.Fe_O_C_H | 0 examples/{reax => reaxff}/FeOH3/in.FeOH3 | 0 examples/{reax => reaxff}/FeOH3/lmp_control | 0 .../FeOH3/log.5Oct16.FeOH3.g++.1 | 0 .../FeOH3/log.5Oct16.FeOH3.g++.4 | 0 examples/{reax => reaxff}/FeOH3/param.qeq | 0 examples/{reax => reaxff}/HNS/README.txt | 0 examples/{reax => reaxff}/HNS/data.hns-equil | 0 examples/{reax => reaxff}/HNS/ffield.reax.hns | 0 examples/{reax => reaxff}/HNS/in.reaxc.hns | 0 .../HNS/log.8Mar18.reaxc.hns.g++.1 | 0 .../HNS/log.8Mar18.reaxc.hns.g++.4 | 0 examples/{reax => reaxff}/RDX/README | 0 examples/{reax => reaxff}/RDX/data.RDX | 0 examples/{reax => reaxff}/RDX/ffield.reax.rdx | 0 examples/{reax => reaxff}/RDX/in.RDX | 0 examples/{reax => reaxff}/RDX/lmp_control | 0 .../{reax => reaxff}/RDX/log.8Mar18.RDX.g++.1 | 0 .../{reax => reaxff}/RDX/log.8Mar18.RDX.g++.4 | 0 examples/{reax => reaxff}/RDX/param.qeq | 0 examples/{reax => reaxff}/README | 0 examples/{reax => reaxff}/VOH/README | 0 examples/{reax => reaxff}/VOH/data.VOH | 0 .../{reax => reaxff}/VOH/ffield.reax.V_O_C_H | 0 examples/{reax => reaxff}/VOH/in.VOH | 0 examples/{reax => reaxff}/VOH/lmp_control | 0 .../{reax => reaxff}/VOH/log.8Mar18.VOH.g++.1 | 0 .../{reax => reaxff}/VOH/log.8Mar18.VOH.g++.4 | 0 examples/{reax => reaxff}/VOH/param.qeq | 0 examples/{reax => reaxff}/ZnOH2/README | 0 examples/{reax => reaxff}/ZnOH2/data.ZnOH2 | 0 .../{reax => reaxff}/ZnOH2/ffield.reax.ZnOH | 0 examples/{reax => reaxff}/ZnOH2/in.ZnOH2 | 0 examples/{reax => reaxff}/ZnOH2/lmp_control | 0 .../ZnOH2/log.8Mar18.ZnOH2.g++.1 | 0 .../ZnOH2/log.8Mar18.ZnOH2.g++.4 | 0 examples/{reax => reaxff}/ZnOH2/param.qeq | 0 examples/{reax => reaxff}/ci-reaxFF/CH4.dat | 0 .../ci-reaxFF/ci-reaxFF_ZBL.dat | 0 examples/{reax => reaxff}/ci-reaxFF/control | 0 .../ci-reaxFF/ffield.ci-reax.CH | 0 .../{reax => reaxff}/ci-reaxFF/in.ci-reax.CH | 0 .../ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 | 0 .../ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 | 0 examples/{reax => reaxff}/control.reax_c.rdx | 0 examples/{reax => reaxff}/control.reax_c.tatb | 0 examples/{reax => reaxff}/data.rdx | 0 examples/{reax => reaxff}/data.tatb | 0 examples/{reax => reaxff}/ffield.reax | 0 examples/{reax => reaxff}/in.reaxc.rdx | 0 .../{reax => reaxff}/in.reaxc.rdx-shielded | 0 examples/{reax => reaxff}/in.reaxc.tatb | 0 .../{reax => reaxff}/in.reaxc.tatb-shielded | 0 .../log.21Apr21.reaxc.rdx-shielded.g++.1 | 0 .../log.21Apr21.reaxc.rdx-shielded.g++.4 | 0 .../log.21Apr21.reaxc.rdx.g++.1 | 0 .../log.21Apr21.reaxc.rdx.g++.4 | 0 .../log.21Apr21.reaxc.tatb-shielded.g++.1 | 0 .../log.21Apr21.reaxc.tatb-shielded.g++.4 | 0 .../log.21Apr21.reaxc.tatb.g++.1 | 0 .../log.21Apr21.reaxc.tatb.g++.4 | 0 ...x_kokkos.cpp => fix_qeq_reaxff_kokkos.cpp} | 196 +++++----- ..._reax_kokkos.h => fix_qeq_reaxff_kokkos.h} | 157 ++++---- ...kokkos.cpp => fix_reaxff_bonds_kokkos.cpp} | 40 +-- ...nds_kokkos.h => fix_reaxff_bonds_kokkos.h} | 23 +- ...kkos.cpp => fix_reaxff_species_kokkos.cpp} | 32 +- ...s_kokkos.h => fix_reaxff_species_kokkos.h} | 21 +- ...eaxc_kokkos.cpp => pair_reaxff_kokkos.cpp} | 334 +++++++++--------- ...ir_reaxc_kokkos.h => pair_reaxff_kokkos.h} | 89 ++--- ...eq_reax_omp.cpp => fix_qeq_reaxff_omp.cpp} | 74 ++-- ...ix_qeq_reax_omp.h => fix_qeq_reaxff_omp.h} | 15 +- ...pair_reaxc_omp.cpp => pair_reaxff_omp.cpp} | 72 ++-- .../{pair_reaxc_omp.h => pair_reaxff_omp.h} | 17 +- ...ers_omp.cpp => reaxff_bond_orders_omp.cpp} | 6 +- ...axc_bonds_omp.cpp => reaxff_bonds_omp.cpp} | 6 +- ...c_forces_omp.cpp => reaxff_forces_omp.cpp} | 6 +- ..._omp.cpp => reaxff_hydrogen_bonds_omp.cpp} | 6 +- ...init_md_omp.cpp => reaxff_init_md_omp.cpp} | 0 ...body_omp.cpp => reaxff_multi_body_omp.cpp} | 6 +- ...onded_omp.cpp => reaxff_nonbonded_omp.cpp} | 10 +- ..._omp.cpp => reaxff_torsion_angles_omp.cpp} | 6 +- ..._omp.cpp => reaxff_valence_angles_omp.cpp} | 6 +- src/Purge.list | 46 +++ src/QEQ/fix_qeq.cpp | 2 +- src/QEQ/fix_qeq_shielded.cpp | 7 +- src/REAXFF/README | 12 +- src/REAXFF/compute_spec_atom.cpp | 68 ++-- src/REAXFF/compute_spec_atom.h | 2 +- .../{fix_qeq_reax.cpp => fix_qeq_reaxff.cpp} | 180 +++++----- .../{fix_qeq_reax.h => fix_qeq_reaxff.h} | 15 +- src/REAXFF/{fix_reaxc.cpp => fix_reaxff.cpp} | 26 +- src/REAXFF/{fix_reaxc.h => fix_reaxff.h} | 16 +- ...x_reaxc_bonds.cpp => fix_reaxff_bonds.cpp} | 80 ++--- .../{fix_reaxc_bonds.h => fix_reaxff_bonds.h} | 15 +- ...axc_species.cpp => fix_reaxff_species.cpp} | 140 ++++---- ...x_reaxc_species.h => fix_reaxff_species.h} | 13 +- .../{pair_reaxc.cpp => pair_reaxff.cpp} | 116 +++--- src/REAXFF/{pair_reaxc.h => pair_reaxff.h} | 17 +- ...reaxc_allocate.cpp => reaxff_allocate.cpp} | 0 ...bond_orders.cpp => reaxff_bond_orders.cpp} | 0 .../{reaxc_bonds.cpp => reaxff_bonds.cpp} | 0 .../{reaxc_control.cpp => reaxff_control.cpp} | 0 src/REAXFF/reaxff_defs.h | 4 +- .../{reaxc_ffield.cpp => reaxff_ffield.cpp} | 0 .../{reaxc_forces.cpp => reaxff_forces.cpp} | 0 ...en_bonds.cpp => reaxff_hydrogen_bonds.cpp} | 0 .../{reaxc_init_md.cpp => reaxff_init_md.cpp} | 0 .../{reaxc_list.cpp => reaxff_list.cpp} | 0 .../{reaxc_lookup.cpp => reaxff_lookup.cpp} | 0 ...c_multi_body.cpp => reaxff_multi_body.cpp} | 0 ...axc_nonbonded.cpp => reaxff_nonbonded.cpp} | 0 ...reset_tools.cpp => reaxff_reset_tools.cpp} | 0 ...reaxc_tool_box.cpp => reaxff_tool_box.cpp} | 0 ...n_angles.cpp => reaxff_torsion_angles.cpp} | 0 ...e_angles.cpp => reaxff_valence_angles.cpp} | 0 tools/README | 1 - tools/reax/Cutoff.dic | 14 - tools/reax/README.txt | 10 - tools/reax/reaxc_bond.pl | 152 -------- 173 files changed, 1149 insertions(+), 1298 deletions(-) rename doc/src/{fix_qeq_reax.rst => fix_qeq_reaxff.rst} (82%) rename doc/src/{fix_reaxc_bonds.rst => fix_reaxff_bonds.rst} (79%) rename doc/src/{fix_reaxc_species.rst => fix_reaxff_species.rst} (77%) rename doc/src/{pair_reaxc.rst => pair_reaxff.rst} (76%) rename examples/{reax => reaxff}/AB/README (100%) rename examples/{reax => reaxff}/AB/data.AB (100%) rename examples/{reax => reaxff}/AB/ffield.reax.AB (100%) rename examples/{reax => reaxff}/AB/in.AB (100%) rename examples/{reax => reaxff}/AB/lmp_control (100%) rename examples/{reax => reaxff}/AB/log.8Mar18.AB.g++.1 (100%) rename examples/{reax => reaxff}/AB/log.8Mar18.AB.g++.4 (100%) rename examples/{reax => reaxff}/AB/param.qeq (100%) rename examples/{reax => reaxff}/AuO/README (100%) rename examples/{reax => reaxff}/AuO/data.AuO (100%) rename examples/{reax => reaxff}/AuO/ffield.reax.AuO (100%) rename examples/{reax => reaxff}/AuO/in.AuO (100%) rename examples/{reax => reaxff}/AuO/lmp_control (100%) rename examples/{reax => reaxff}/AuO/log.8Mar18.AuO.g++.1 (100%) rename examples/{reax => reaxff}/AuO/log.8Mar18.AuO.g++.4 (100%) rename examples/{reax => reaxff}/AuO/param.qeq (100%) rename examples/{reax => reaxff}/CHO/README (100%) rename examples/{reax => reaxff}/CHO/data.CHO (100%) rename examples/{reax => reaxff}/CHO/ffield.reax.cho (100%) rename examples/{reax => reaxff}/CHO/in.CHO (100%) rename examples/{reax => reaxff}/CHO/lmp_control (100%) rename examples/{reax => reaxff}/CHO/log.8Mar18.CHO.g++.1 (100%) rename examples/{reax => reaxff}/CHO/log.8Mar18.CHO.g++.4 (100%) rename examples/{reax => reaxff}/CHO/param.qeq (100%) rename examples/{reax => reaxff}/FC/README (100%) rename examples/{reax => reaxff}/FC/data.FC (100%) rename examples/{reax => reaxff}/FC/ffield.reax.FC (100%) rename examples/{reax => reaxff}/FC/in.FC (100%) rename examples/{reax => reaxff}/FC/log.8Mar18.FC.g++.1 (100%) rename examples/{reax => reaxff}/FC/log.8Mar18.FC.g++.4 (100%) rename examples/{reax => reaxff}/FeOH3/README (100%) rename examples/{reax => reaxff}/FeOH3/data.FeOH3 (100%) rename examples/{reax => reaxff}/FeOH3/ffield.reax.Fe_O_C_H (100%) rename examples/{reax => reaxff}/FeOH3/in.FeOH3 (100%) rename examples/{reax => reaxff}/FeOH3/lmp_control (100%) rename examples/{reax => reaxff}/FeOH3/log.5Oct16.FeOH3.g++.1 (100%) rename examples/{reax => reaxff}/FeOH3/log.5Oct16.FeOH3.g++.4 (100%) rename examples/{reax => reaxff}/FeOH3/param.qeq (100%) rename examples/{reax => reaxff}/HNS/README.txt (100%) rename examples/{reax => reaxff}/HNS/data.hns-equil (100%) rename examples/{reax => reaxff}/HNS/ffield.reax.hns (100%) rename examples/{reax => reaxff}/HNS/in.reaxc.hns (100%) rename examples/{reax => reaxff}/HNS/log.8Mar18.reaxc.hns.g++.1 (100%) rename examples/{reax => reaxff}/HNS/log.8Mar18.reaxc.hns.g++.4 (100%) rename examples/{reax => reaxff}/RDX/README (100%) rename examples/{reax => reaxff}/RDX/data.RDX (100%) rename examples/{reax => reaxff}/RDX/ffield.reax.rdx (100%) rename examples/{reax => reaxff}/RDX/in.RDX (100%) rename examples/{reax => reaxff}/RDX/lmp_control (100%) rename examples/{reax => reaxff}/RDX/log.8Mar18.RDX.g++.1 (100%) rename examples/{reax => reaxff}/RDX/log.8Mar18.RDX.g++.4 (100%) rename examples/{reax => reaxff}/RDX/param.qeq (100%) rename examples/{reax => reaxff}/README (100%) rename examples/{reax => reaxff}/VOH/README (100%) rename examples/{reax => reaxff}/VOH/data.VOH (100%) rename examples/{reax => reaxff}/VOH/ffield.reax.V_O_C_H (100%) rename examples/{reax => reaxff}/VOH/in.VOH (100%) rename examples/{reax => reaxff}/VOH/lmp_control (100%) rename examples/{reax => reaxff}/VOH/log.8Mar18.VOH.g++.1 (100%) rename examples/{reax => reaxff}/VOH/log.8Mar18.VOH.g++.4 (100%) rename examples/{reax => reaxff}/VOH/param.qeq (100%) rename examples/{reax => reaxff}/ZnOH2/README (100%) rename examples/{reax => reaxff}/ZnOH2/data.ZnOH2 (100%) rename examples/{reax => reaxff}/ZnOH2/ffield.reax.ZnOH (100%) rename examples/{reax => reaxff}/ZnOH2/in.ZnOH2 (100%) rename examples/{reax => reaxff}/ZnOH2/lmp_control (100%) rename examples/{reax => reaxff}/ZnOH2/log.8Mar18.ZnOH2.g++.1 (100%) rename examples/{reax => reaxff}/ZnOH2/log.8Mar18.ZnOH2.g++.4 (100%) rename examples/{reax => reaxff}/ZnOH2/param.qeq (100%) rename examples/{reax => reaxff}/ci-reaxFF/CH4.dat (100%) rename examples/{reax => reaxff}/ci-reaxFF/ci-reaxFF_ZBL.dat (100%) rename examples/{reax => reaxff}/ci-reaxFF/control (100%) rename examples/{reax => reaxff}/ci-reaxFF/ffield.ci-reax.CH (100%) rename examples/{reax => reaxff}/ci-reaxFF/in.ci-reax.CH (100%) rename examples/{reax => reaxff}/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 (100%) rename examples/{reax => reaxff}/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 (100%) rename examples/{reax => reaxff}/control.reax_c.rdx (100%) rename examples/{reax => reaxff}/control.reax_c.tatb (100%) rename examples/{reax => reaxff}/data.rdx (100%) rename examples/{reax => reaxff}/data.tatb (100%) rename examples/{reax => reaxff}/ffield.reax (100%) rename examples/{reax => reaxff}/in.reaxc.rdx (100%) rename examples/{reax => reaxff}/in.reaxc.rdx-shielded (100%) rename examples/{reax => reaxff}/in.reaxc.tatb (100%) rename examples/{reax => reaxff}/in.reaxc.tatb-shielded (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.rdx-shielded.g++.1 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.rdx-shielded.g++.4 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.rdx.g++.1 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.rdx.g++.4 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.tatb-shielded.g++.1 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.tatb-shielded.g++.4 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.tatb.g++.1 (100%) rename examples/{reax => reaxff}/log.21Apr21.reaxc.tatb.g++.4 (100%) rename src/KOKKOS/{fix_qeq_reax_kokkos.cpp => fix_qeq_reaxff_kokkos.cpp} (87%) rename src/KOKKOS/{fix_qeq_reax_kokkos.h => fix_qeq_reaxff_kokkos.h} (75%) rename src/KOKKOS/{fix_reaxc_bonds_kokkos.cpp => fix_reaxff_bonds_kokkos.cpp} (69%) rename src/KOKKOS/{fix_reaxc_bonds_kokkos.h => fix_reaxff_bonds_kokkos.h} (59%) rename src/KOKKOS/{fix_reaxc_species_kokkos.cpp => fix_reaxff_species_kokkos.cpp} (83%) rename src/KOKKOS/{fix_reaxc_species_kokkos.h => fix_reaxff_species_kokkos.h} (58%) rename src/KOKKOS/{pair_reaxc_kokkos.cpp => pair_reaxff_kokkos.cpp} (91%) rename src/KOKKOS/{pair_reaxc_kokkos.h => pair_reaxff_kokkos.h} (86%) rename src/OPENMP/{fix_qeq_reax_omp.cpp => fix_qeq_reaxff_omp.cpp} (92%) rename src/OPENMP/{fix_qeq_reax_omp.h => fix_qeq_reaxff_omp.h} (84%) rename src/OPENMP/{pair_reaxc_omp.cpp => pair_reaxff_omp.cpp} (88%) rename src/OPENMP/{pair_reaxc_omp.h => pair_reaxff_omp.h} (92%) rename src/OPENMP/{reaxc_bond_orders_omp.cpp => reaxff_bond_orders_omp.cpp} (98%) rename src/OPENMP/{reaxc_bonds_omp.cpp => reaxff_bonds_omp.cpp} (97%) rename src/OPENMP/{reaxc_forces_omp.cpp => reaxff_forces_omp.cpp} (99%) rename src/OPENMP/{reaxc_hydrogen_bonds_omp.cpp => reaxff_hydrogen_bonds_omp.cpp} (98%) rename src/OPENMP/{reaxc_init_md_omp.cpp => reaxff_init_md_omp.cpp} (100%) rename src/OPENMP/{reaxc_multi_body_omp.cpp => reaxff_multi_body_omp.cpp} (98%) rename src/OPENMP/{reaxc_nonbonded_omp.cpp => reaxff_nonbonded_omp.cpp} (97%) rename src/OPENMP/{reaxc_torsion_angles_omp.cpp => reaxff_torsion_angles_omp.cpp} (99%) rename src/OPENMP/{reaxc_valence_angles_omp.cpp => reaxff_valence_angles_omp.cpp} (99%) rename src/REAXFF/{fix_qeq_reax.cpp => fix_qeq_reaxff.cpp} (83%) rename src/REAXFF/{fix_qeq_reax.h => fix_qeq_reaxff.h} (94%) rename src/REAXFF/{fix_reaxc.cpp => fix_reaxff.cpp} (87%) rename src/REAXFF/{fix_reaxc.h => fix_reaxff.h} (89%) rename src/REAXFF/{fix_reaxc_bonds.cpp => fix_reaxff_bonds.cpp} (79%) rename src/REAXFF/{fix_reaxc_bonds.h => fix_reaxff_bonds.h} (82%) rename src/REAXFF/{fix_reaxc_species.cpp => fix_reaxff_species.cpp} (85%) rename src/REAXFF/{fix_reaxc_species.h => fix_reaxff_species.h} (87%) rename src/REAXFF/{pair_reaxc.cpp => pair_reaxff.cpp} (88%) rename src/REAXFF/{pair_reaxc.h => pair_reaxff.h} (88%) rename src/REAXFF/{reaxc_allocate.cpp => reaxff_allocate.cpp} (100%) rename src/REAXFF/{reaxc_bond_orders.cpp => reaxff_bond_orders.cpp} (100%) rename src/REAXFF/{reaxc_bonds.cpp => reaxff_bonds.cpp} (100%) rename src/REAXFF/{reaxc_control.cpp => reaxff_control.cpp} (100%) rename src/REAXFF/{reaxc_ffield.cpp => reaxff_ffield.cpp} (100%) rename src/REAXFF/{reaxc_forces.cpp => reaxff_forces.cpp} (100%) rename src/REAXFF/{reaxc_hydrogen_bonds.cpp => reaxff_hydrogen_bonds.cpp} (100%) rename src/REAXFF/{reaxc_init_md.cpp => reaxff_init_md.cpp} (100%) rename src/REAXFF/{reaxc_list.cpp => reaxff_list.cpp} (100%) rename src/REAXFF/{reaxc_lookup.cpp => reaxff_lookup.cpp} (100%) rename src/REAXFF/{reaxc_multi_body.cpp => reaxff_multi_body.cpp} (100%) rename src/REAXFF/{reaxc_nonbonded.cpp => reaxff_nonbonded.cpp} (100%) rename src/REAXFF/{reaxc_reset_tools.cpp => reaxff_reset_tools.cpp} (100%) rename src/REAXFF/{reaxc_tool_box.cpp => reaxff_tool_box.cpp} (100%) rename src/REAXFF/{reaxc_torsion_angles.cpp => reaxff_torsion_angles.cpp} (100%) rename src/REAXFF/{reaxc_valence_angles.cpp => reaxff_valence_angles.cpp} (100%) delete mode 100644 tools/reax/Cutoff.dic delete mode 100644 tools/reax/README.txt delete mode 100755 tools/reax/reaxc_bond.pl diff --git a/cmake/Modules/Packages/OPENMP.cmake b/cmake/Modules/Packages/OPENMP.cmake index 922df86ef6..0a23e58b4b 100644 --- a/cmake/Modules/Packages/OPENMP.cmake +++ b/cmake/Modules/Packages/OPENMP.cmake @@ -25,15 +25,15 @@ endif() if(PKG_REAXFF) - list(APPEND OPENMP_SOURCES ${OPENMP_SOURCES_DIR}/reaxc_bond_orders_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_hydrogen_bonds_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_nonbonded_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_bonds_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_init_md_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_torsion_angles_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_forces_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_multi_body_omp.cpp - ${OPENMP_SOURCES_DIR}/reaxc_valence_angles_omp.cpp) + list(APPEND OPENMP_SOURCES ${OPENMP_SOURCES_DIR}/reaxff_bond_orders_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_hydrogen_bonds_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_nonbonded_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_bonds_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_init_md_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_torsion_angles_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_forces_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_multi_body_omp.cpp + ${OPENMP_SOURCES_DIR}/reaxff_valence_angles_omp.cpp) endif() target_sources(lammps PRIVATE ${OPENMP_SOURCES}) diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 0ca71699a3..45a75ff394 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -179,14 +179,14 @@ OPT. * :doc:`qeq/dynamic ` * :doc:`qeq/fire ` * :doc:`qeq/point ` - * :doc:`qeq/reax (ko) ` + * :doc:`qeq/reaxff (ko) ` * :doc:`qeq/shielded ` * :doc:`qeq/slater ` * :doc:`qmmm ` * :doc:`qtb ` * :doc:`rattle ` - * :doc:`reax/c/bonds (k) ` - * :doc:`reax/c/species (k) ` + * :doc:`reaxff/bonds (k) ` + * :doc:`reaxff/species (k) ` * :doc:`recenter ` * :doc:`restrain ` * :doc:`rhok ` diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 7abb1d582a..db3d947892 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -235,7 +235,7 @@ OPT. * :doc:`python ` * :doc:`quip ` * :doc:`rann ` - * :doc:`reax/c (ko) ` + * :doc:`reaxff (ko) ` * :doc:`rebo (io) ` * :doc:`resquared (go) ` * :doc:`sdpd/taitwater/isothermal ` diff --git a/doc/src/Errors_warnings.rst b/doc/src/Errors_warnings.rst index 68d6b0451a..806dec024b 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -514,7 +514,7 @@ This will most likely cause errors in kinetic fluctuations. will integrate the body motion, but it would be more efficient to use fix rigid. -*Not using real units with pair reax* +*Not using real units with pair reaxff* This is most likely an error, unless you have created your own ReaxFF parameter file in a different set of units. @@ -805,5 +805,3 @@ This will most likely cause errors in kinetic fluctuations. *Using pair tail corrections with pair_modify compute no* The tail corrections will thus not be computed. -*pair style reax is now deprecated and will soon be retired. Users should switch to pair_style reax/c* - Self-explanatory. diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 5a4327dad6..1af1512bbf 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2274,10 +2274,10 @@ for monitoring molecules as bonds are created and destroyed. * src/REAXFF: filenames -> commands * src/REAXFF/README -* :doc:`pair_style reax/c ` -* :doc:`fix reax/c/bonds ` -* :doc:`fix reax/c/species ` -* examples/reax +* :doc:`pair_style reaxff ` +* :doc:`fix reaxff/bonds ` +* :doc:`fix reaxff/species ` +* examples/reaxff ---------- diff --git a/doc/src/Packages_list.rst b/doc/src/Packages_list.rst index 44c05f8a39..d568976ffe 100644 --- a/doc/src/Packages_list.rst +++ b/doc/src/Packages_list.rst @@ -370,7 +370,7 @@ whether an extra library is needed to build and use the package: - no * - :ref:`REAXFF ` - ReaxFF potential (C/C++) - - :doc:`pair_style reaxc ` + - :doc:`pair_style reaxff ` - reax - no * - :ref:`REPLICA ` diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 65a96ce44a..e7cd87aa78 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -76,7 +76,6 @@ Post-processing tools * :ref:`phonon ` * :ref:`pymol_asphere ` * :ref:`python ` - * :ref:`reax ` * :ref:`replica ` * :ref:`smd ` * :ref:`spin ` @@ -947,20 +946,6 @@ while at the Shell lab at UC Santa Barbara. (tanmoy dot 7989 at gmail.com) ---------- -.. _reax_tool: - -reax tool --------------------------- - -The reax sub-directory contains stand-alone codes that can -post-process the output of the :doc:`fix reax/c/bonds ` -command from a LAMMPS simulation using :doc:`ReaxFF `. See -the README.txt file for more info. - -These tools were written by Aidan Thompson at Sandia. - ----------- - .. _smd: smd tool diff --git a/doc/src/compute_pair.rst b/doc/src/compute_pair.rst index 1b074203aa..abfd1ebed4 100644 --- a/doc/src/compute_pair.rst +++ b/doc/src/compute_pair.rst @@ -24,7 +24,7 @@ Examples compute 1 all pair gauss compute 1 all pair lj/cut/coul/cut ecoul compute 1 all pair tersoff 2 epair - compute 1 all pair reax/c + compute 1 all pair reaxff Description """"""""""" @@ -64,7 +64,8 @@ is stored as a global scalar. :doc:`pair_modify ` command. Some pair styles tally additional quantities, e.g. a breakdown of -potential energy into 14 components is tallied by the :doc:`pair_style reax/c ` command. These values (1 or more) +potential energy into 14 components is tallied by the +:doc:`pair_style reaxff ` command. These values (1 or more) are stored as a global vector by this compute. See the doc page for :doc:`individual pair styles ` for info on these values. diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 912cfad255..07a663c789 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -322,14 +322,14 @@ accelerated styles exist. * :doc:`qeq/dynamic ` - charge equilibration via dynamic method * :doc:`qeq/fire ` - charge equilibration via FIRE minimizer * :doc:`qeq/point ` - charge equilibration via point method -* :doc:`qeq/reax ` - charge equilibration for ReaxFF potential +* :doc:`qeq/reaxff ` - charge equilibration for ReaxFF potential * :doc:`qeq/shielded ` - charge equilibration via shielded method * :doc:`qeq/slater ` - charge equilibration via Slater method * :doc:`qmmm ` - functionality to enable a quantum mechanics/molecular mechanics coupling * :doc:`qtb ` - implement quantum thermal bath scheme * :doc:`rattle ` - RATTLE constraints on bonds and/or angles -* :doc:`reax/c/bonds ` - write out ReaxFF bond information -* :doc:`reax/c/species ` - write out ReaxFF molecule information +* :doc:`reaxff/bonds ` - write out ReaxFF bond information +* :doc:`reaxff/species ` - write out ReaxFF molecule information * :doc:`recenter ` - constrain the center-of-mass position of a group of atoms * :doc:`restrain ` - constrain a bond, angle, dihedral * :doc:`rhok ` - add bias potential for long-range ordered systems diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index a110d93a8d..58d86f8472 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -186,7 +186,7 @@ formulas for the meaning of these parameters: +------------------------------------------------------------------------------+--------------------------------------------------+-------------+ | :doc:`nm/cut/coul/cut, nm/cut/coul/long ` | E0,R0,m,n,coulombic_cutoff | type pairs | +------------------------------------------------------------------------------+--------------------------------------------------+-------------+ -| :doc:`reax/c ` | chi, eta, gamma | type global | +| :doc:`reaxff ` | chi, eta, gamma | type global | +------------------------------------------------------------------------------+--------------------------------------------------+-------------+ | :doc:`snap ` | scale | type pairs | +------------------------------------------------------------------------------+--------------------------------------------------+-------------+ diff --git a/doc/src/fix_gcmc.rst b/doc/src/fix_gcmc.rst index c65dace601..e360fab86e 100644 --- a/doc/src/fix_gcmc.rst +++ b/doc/src/fix_gcmc.rst @@ -374,7 +374,7 @@ in the context of NVT dynamics. has been reached. With some pair_styles, such as :doc:`Buckingham `, -:doc:`Born-Mayer-Huggins ` and :doc:`ReaxFF `, two +:doc:`Born-Mayer-Huggins ` and :doc:`ReaxFF `, two atoms placed close to each other may have an arbitrary large, negative potential energy due to the functional form of the potential. While these unphysical configurations are inaccessible to typical dynamical diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index ccacea08db..113692da9b 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -32,7 +32,7 @@ Syntax * cutoff = global cutoff for charge-charge interactions (distance unit) * tolerance = precision to which charges will be equilibrated * maxiter = maximum iterations to perform charge equilibration -* qfile = a filename with QEq parameters or *coul/streitz* or *reax/c* +* qfile = a filename with QEq parameters or *coul/streitz* or *reaxff* * zero or more keyword/value pairs may be appended * keyword = *alpha* or *qdamp* or *qstep* or *warn* @@ -91,11 +91,11 @@ on the current atom configuration), then remove the fix via the The :doc:`fix qeq/comb ` command must still be used to perform charge equilibration with the :doc:`COMB potential - `. The :doc:`fix qeq/reax ` command can be + `. The :doc:`fix qeq/reaxff ` command can be used to perform charge equilibration with the :doc:`ReaxFF force - field `, although fix qeq/shielded yields the same - results as fix qeq/reax if *Nevery*\ , *cutoff*\ , and *tolerance* - are the same. Eventually the fix qeq/reax command will be + field `, although fix qeq/shielded yields the same + results as fix qeq/reaxff if *Nevery*\ , *cutoff*\ , and *tolerance* + are the same. Eventually the fix qeq/reaxff command will be deprecated. The QEq method minimizes the electrostatic energy of the system (or @@ -150,11 +150,11 @@ interaction between a pair of charged particles. Interaction through the shielded Coulomb is given by equation (13) of the :ref:`ReaxFF force field ` paper. The shielding accounts for charge overlap between charged particles at small separation. This style is the same -as :doc:`fix qeq/reax `, and can be used with -:doc:`pair_style reax/c `. Only the *chi*\ , *eta*\ , and +as :doc:`fix qeq/reaxff `, and can be used with +:doc:`pair_style reaxff `. Only the *chi*\ , *eta*\ , and *gamma* parameters from the *qfile* file are used. When using the string -*reax/c* as filename, these parameters are extracted directly from an -active *reax/c* pair style. This style solves partial charges on atoms +*reaxff* as filename, these parameters are extracted directly from an +active *reaxff* pair style. This style solves partial charges on atoms via the matrix inversion method. A tolerance of 1.0e-6 is usually a good number. @@ -235,7 +235,7 @@ The qeq fixes are not compatible with the GPU and USER-INTEL packages. Related commands """""""""""""""" -:doc:`fix qeq/reax `, :doc:`fix qeq/comb ` +:doc:`fix qeq/reaxff `, :doc:`fix qeq/comb ` Default """"""" diff --git a/doc/src/fix_qeq_comb.rst b/doc/src/fix_qeq_comb.rst index 74a97720dc..8eeea6c5b4 100644 --- a/doc/src/fix_qeq_comb.rst +++ b/doc/src/fix_qeq_comb.rst @@ -41,7 +41,7 @@ Perform charge equilibration (QeQ) in conjunction with the COMB equilibration portion of the calculation using the so-called QEq method, whereby the charge on each atom is adjusted to minimize the energy of the system. This fix can only be used with the COMB -potential; see the :doc:`fix qeq/reax ` command for a QeQ +potential; see the :doc:`fix qeq/reaxff ` command for a QeQ calculation that can be used with any potential. Only charges on the atoms in the specified group are equilibrated. diff --git a/doc/src/fix_qeq_reax.rst b/doc/src/fix_qeq_reaxff.rst similarity index 82% rename from doc/src/fix_qeq_reax.rst rename to doc/src/fix_qeq_reaxff.rst index 89fffcf2a3..96a20d4ca6 100644 --- a/doc/src/fix_qeq_reax.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -1,31 +1,31 @@ -.. index:: fix qeq/reax -.. index:: fix qeq/reax/kk -.. index:: fix qeq/reax/omp +.. index:: fix qeq/reaxff +.. index:: fix qeq/reaxff/kk +.. index:: fix qeq/reaxff/omp -fix qeq/reax command -==================== +fix qeq/reaxff command +====================== -Accelerator Variants: *qeq/reax/kk*, *qeq/reax/omp* +Accelerator Variants: *qeq/reaxff/kk*, *qeq/reaxff/omp* Syntax """""" .. parsed-literal:: - fix ID group-ID qeq/reax Nevery cutlo cuthi tolerance params args + fix ID group-ID qeq/reaxff Nevery cutlo cuthi tolerance params args * ID, group-ID are documented in :doc:`fix ` command -* qeq/reax = style name of this fix command +* qeq/reaxff = style name of this fix command * Nevery = perform QEq every this many steps * cutlo,cuthi = lo and hi cutoff for Taper radius * tolerance = precision to which charges will be equilibrated -* params = reax/c or a filename +* params = reaxff or a filename * one or more keywords or keyword/value pairs may be appended .. parsed-literal:: keyword = *dual* or *maxiter* or *nowarn* - *dual* = process S and T matrix in parallel (only for qeq/reax/omp) + *dual* = process S and T matrix in parallel (only for qeq/reaxff/omp) *maxiter* N = limit the number of iterations to *N* *nowarn* = do not print a warning message if the maximum number of iterations was reached @@ -34,8 +34,8 @@ Examples .. code-block:: LAMMPS - fix 1 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - fix 1 all qeq/reax 1 0.0 10.0 1.0e-6 param.qeq maxiter 500 + fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff + fix 1 all qeq/reaxff 1 0.0 10.0 1.0e-6 param.qeq maxiter 500 Description """"""""""" @@ -43,19 +43,19 @@ Description Perform the charge equilibration (QEq) method as described in :ref:`(Rappe and Goddard) ` and formulated in :ref:`(Nakano) `. It is typically used in conjunction with the ReaxFF force -field model as implemented in the :doc:`pair_style reax/c ` +field model as implemented in the :doc:`pair_style reaxff ` command, but it can be used with any potential in LAMMPS, so long as it defines and uses charges on each atom. The :doc:`fix qeq/comb ` command should be used to perform charge equilibration with the :doc:`COMB potential `. For more technical details -about the charge equilibration performed by fix qeq/reax, see the +about the charge equilibration performed by fix qeq/reaxff, see the :ref:`(Aktulga) ` paper. The QEq method minimizes the electrostatic energy of the system by adjusting the partial charge on individual atoms based on interactions with their neighbors. It requires some parameters for each atom type. -If the *params* setting above is the word "reax/c", then these are -extracted from the :doc:`pair_style reax/c ` command and +If the *params* setting above is the word "reaxff", then these are +extracted from the :doc:`pair_style reaxff ` command and the ReaxFF force field file it reads in. If a file name is specified for *params*\ , then the parameters are taken from the specified file and the file must contain one line for each atom type. The latter @@ -76,7 +76,7 @@ of this fix are hard-coded to be A, eV, and electronic charge. The optional *dual* keyword allows to perform the optimization of the S and T matrices in parallel. This is only supported for -the *qeq/reax/omp* style. Otherwise they are processed separately. +the *qeq/reaxff/omp* style. Otherwise they are processed separately. The optional *maxiter* keyword allows changing the max number of iterations in the linear solver. The default value is 200. @@ -119,7 +119,7 @@ periodic cell dimensions less than 10 angstroms. Related commands """""""""""""""" -:doc:`pair_style reax/c ` +:doc:`pair_style reaxff `, :doc:`fix qeq/shielded ` Default """"""" diff --git a/doc/src/fix_reaxc_bonds.rst b/doc/src/fix_reaxff_bonds.rst similarity index 79% rename from doc/src/fix_reaxc_bonds.rst rename to doc/src/fix_reaxff_bonds.rst index 9207ee7a63..5dd4df7765 100644 --- a/doc/src/fix_reaxc_bonds.rst +++ b/doc/src/fix_reaxff_bonds.rst @@ -1,17 +1,17 @@ -.. index:: fix reax/c/bonds -.. index:: fix reax/c/bonds/kk +.. index:: fix reaxff/bonds +.. index:: fix reaxff/bonds/kk -fix reax/c/bonds command +fix reaxff/bonds command ======================== -Accelerator Variants: *reax/c/bonds/kk* +Accelerator Variants: *reaxff/bonds/kk* Syntax """""" .. parsed-literal:: - fix ID group-ID reaxc/bonds Nevery filename + fix ID group-ID reaxff/bonds Nevery filename * ID, group-ID are documented in :doc:`fix ` command * reax/bonds = style name of this fix command @@ -23,17 +23,17 @@ Examples .. code-block:: LAMMPS - fix 1 all reax/c/bonds 100 bonds.reaxc + fix 1 all reaxff/bonds 100 bonds.reaxff Description """"""""""" Write out the bond information computed by the ReaxFF potential specified -by :doc:`pair_style reax/c ` in the exact same format as the +by :doc:`pair_style reaxff ` in the exact same format as the original stand-alone ReaxFF code of Adri van Duin. The bond information is written to *filename* on timesteps that are multiples of *Nevery*\ , including timestep 0. For time-averaged chemical species analysis, -please see the :doc:`fix reaxc/c/species ` command. +please see the :doc:`fix reaxff/species ` command. The specified group-ID is ignored by this fix. @@ -76,7 +76,7 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -The fix reax/c/bonds command requires that the :doc:`pair_style reax/c ` is invoked. This fix is part of the +The fix reaxff/bonds command requires that the :doc:`pair_style reaxff ` is invoked. This fix is part of the REAXFF package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. @@ -87,7 +87,7 @@ To write gzipped bond files, you must compile LAMMPS with the Related commands """""""""""""""" -:doc:`pair_style reax/c `, :doc:`fix reax/c/species ` +:doc:`pair_style reaxff `, :doc:`fix reaxff/species ` Default """"""" diff --git a/doc/src/fix_reaxc_species.rst b/doc/src/fix_reaxff_species.rst similarity index 77% rename from doc/src/fix_reaxc_species.rst rename to doc/src/fix_reaxff_species.rst index bce140a9af..bca9c2c726 100644 --- a/doc/src/fix_reaxc_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -1,20 +1,20 @@ -.. index:: fix reax/c/species -.. index:: fix reax/c/species/kk +.. index:: fix reaxff/species +.. index:: fix reaxff/species/kk -fix reax/c/species command +fix reaxff/species command ========================== -Accelerator Variants: *reax/c/species/kk* +Accelerator Variants: *reaxff/species/kk* Syntax """""" .. parsed-literal:: - fix ID group-ID reax/c/species Nevery Nrepeat Nfreq filename keyword value ... + fix ID group-ID reaxff/species Nevery Nrepeat Nfreq filename keyword value ... * ID, group-ID are documented in :doc:`fix ` command -* reax/c/species = style name of this command +* reaxff/species = style name of this command * Nevery = sample bond-order every this many timesteps * Nrepeat = # of bond-order samples used for calculating averages * Nfreq = calculate average bond-order every this many timesteps @@ -37,15 +37,15 @@ Examples .. code-block:: LAMMPS - fix 1 all reax/c/species 10 10 100 species.out - fix 1 all reax/c/species 1 2 20 species.out cutoff 1 1 0.40 cutoff 1 2 0.55 - fix 1 all reax/c/species 1 100 100 species.out element Au O H position 1000 AuOH.pos + fix 1 all reaxff/species 10 10 100 species.out + fix 1 all reaxff/species 1 2 20 species.out cutoff 1 1 0.40 cutoff 1 2 0.55 + fix 1 all reaxff/species 1 100 100 species.out element Au O H position 1000 AuOH.pos Description """"""""""" Write out the chemical species information computed by the ReaxFF -potential specified by :doc:`pair_style reax/c `. +potential specified by :doc:`pair_style reaxff `. Bond-order values (either averaged or instantaneous, depending on value of *Nrepeat*\ ) are used to determine chemical bonds. Every *Nfreq* timesteps, chemical species information is written to @@ -73,7 +73,7 @@ symbol printed for each LAMMPS atom type. The number of symbols must match the number of LAMMPS atom types and each symbol must consist of 1 or 2 alphanumeric characters. Normally, these symbols should be chosen to match the chemical identity of each LAMMPS atom type, as -specified using the :doc:`reax/c pair_coeff ` command and +specified using the :doc:`reaxff pair_coeff ` command and the ReaxFF force field file. The optional keyword *position* writes center-of-mass positions of @@ -115,12 +115,12 @@ average bond-order for the species analysis output on timestep 100. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -No information about this fix is written to :doc:`binary restart files `. None of the :doc:`fix_modify ` options -are relevant to this fix. +No information about this fix is written to :doc:`binary restart files `. +None of the :doc:`fix_modify ` options are relevant to this fix. -This fix computes both a global vector of length 2 and a per-atom -vector, either of which can be accessed by various :doc:`output commands `. The values in the global vector are -"intensive". +This fix computes both a global vector of length 2 and a per-atom vector, +either of which can be accessed by various :doc:`output commands `. +The values in the global vector are "intensive". The 2 values in the global vector are as follows: @@ -134,7 +134,8 @@ will be the same and will be equal to the smallest atom ID of any atom in the molecule. No parameter of this fix can be used with the *start/stop* keywords of -the :doc:`run ` command. This fix is not invoked during :doc:`energy minimization `. +the :doc:`run ` command. +This fix is not invoked during :doc:`energy minimization `. ---------- @@ -145,26 +146,20 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -The "fix reax/c/species" currently only works with :doc:`pair_style reax/c ` and it requires that the :doc:`pair_style reax/c ` be invoked. This fix is part of the -REAXFF package. It is only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more -info. +The "fix reaxff/species" requires that :doc:`pair_style reaxff ` is used. +This fix is part of the REAXFF package. It is only enabled if LAMMPS was built with that +package. See the :doc:`Build package ` doc page for more info. -To write gzipped species files, you must compile LAMMPS with the --DLAMMPS_GZIP option. - -It should be possible to extend it to other reactive pair_styles (such as -:doc:`rebo `, :doc:`airebo `, -:doc:`comb `, and :doc:`bop `), but this has not yet been done. +To write gzipped species files, you must compile LAMMPS with the -DLAMMPS_GZIP option. Related commands """""""""""""""" -:doc:`pair_style reax/c `, :doc:`fix reax/c/bonds ` +:doc:`pair_style reaxff `, :doc:`fix reaxff/bonds ` Default """"""" -The default values for bond-order cutoffs are 0.3 for all I-J pairs. The -default element symbols are C, H, O, N. Position files are not written -by default. +The default values for bond-order cutoffs are 0.3 for all I-J pairs. +The default element symbols are C, H, O, N. +Position files are not written by default. diff --git a/doc/src/kim_commands.rst b/doc/src/kim_commands.rst index f116a70922..fc00a574d2 100644 --- a/doc/src/kim_commands.rst +++ b/doc/src/kim_commands.rst @@ -372,9 +372,9 @@ the *kim interactions* command executes the following LAMMPS input commands: .. code-block:: LAMMPS - pair_style reax/c lmp_control safezone 2.0 mincap 100 + pair_style reaxff lmp_control safezone 2.0 mincap 100 pair_coeff * * ffield.reax.rdx C H N O - fix reaxqeq all qeq/reax 1 0.0 10.0 1.0e-6 param.qeq + fix reaxqeq all qeq/reaxff 1 0.0 10.0 1.0e-6 param.qeq .. note:: diff --git a/doc/src/package.rst b/doc/src/package.rst index e997dc6147..54cf74f5be 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -448,7 +448,8 @@ does not require atomic operations in the calculation of pair forces. For that reason, *full* is the default setting for GPUs. However, when running on CPUs, a *half* neighbor list is the default because it are often faster, just as it is for non-accelerated pair styles. Similarly, -the *neigh/qeq* keyword determines how neighbor lists are built for :doc:`fix qeq/reax/kk `. +the *neigh/qeq* keyword determines how neighbor lists are built for +:doc:`fix qeq/reaxff/kk `. If the *neigh/thread* keyword is set to *off*\ , then the KOKKOS package threads only over atoms. However, for small systems, this may not expose diff --git a/doc/src/pair_reaxc.rst b/doc/src/pair_reaxff.rst similarity index 76% rename from doc/src/pair_reaxc.rst rename to doc/src/pair_reaxff.rst index 352bcb4847..0389742ea5 100644 --- a/doc/src/pair_reaxc.rst +++ b/doc/src/pair_reaxff.rst @@ -1,18 +1,18 @@ -.. index:: pair_style reax/c -.. index:: pair_style reax/c/kk -.. index:: pair_style reax/c/omp +.. index:: pair_style reaxff +.. index:: pair_style reaxff/kk +.. index:: pair_style reaxff/omp -pair_style reax/c command +pair_style reaxff command ========================= -Accelerator Variants: *reax/c/kk*, *reax/c/omp* +Accelerator Variants: *reaxff/kk*, *reaxff/omp* Syntax """""" .. code-block:: LAMMPS - pair_style reax/c cfile keyword value + pair_style reaxff cfile keyword value * cfile = NULL or name of a control file * zero or more keyword/value pairs may be appended @@ -20,7 +20,7 @@ Syntax .. parsed-literal:: keyword = *checkqeq* or *lgvdw* or *safezone* or *mincap* or *minhbonds* - *checkqeq* value = *yes* or *no* = whether or not to require qeq/reax fix + *checkqeq* value = *yes* or *no* = whether or not to require qeq/reaxff fix *enobonds* value = *yes* or *no* = whether or not to tally energy of atoms with no bonds *lgvdw* value = *yes* or *no* = whether or not to use a low gradient vdW correction *safezone* = factor used for array allocation @@ -32,37 +32,38 @@ Examples .. code-block:: LAMMPS - pair_style reax/c NULL - pair_style reax/c controlfile checkqeq no - pair_style reax/c NULL lgvdw yes - pair_style reax/c NULL safezone 1.6 mincap 100 + pair_style reaxff NULL + pair_style reaxff controlfile checkqeq no + pair_style reaxff NULL lgvdw yes + pair_style reaxff NULL safezone 1.6 mincap 100 pair_coeff * * ffield.reax C H O N Description """"""""""" -Style *reax/c* computes the ReaxFF potential of van Duin, Goddard and +Style *reaxff* computes the ReaxFF potential of van Duin, Goddard and co-workers. ReaxFF uses distance-dependent bond-order functions to represent the contributions of chemical bonding to the potential energy. There is more than one version of ReaxFF. The version implemented in LAMMPS uses the functional forms documented in the -supplemental information of the following paper: :ref:`(Chenoweth et al., 2008) `. The version integrated into LAMMPS matches -the most up-to-date version of ReaxFF as of summer 2010. For more -technical details about the pair reax/c implementation of ReaxFF, see -the :ref:`(Aktulga) ` paper. The *reax/c* style was initially -implemented as a stand-alone C code and is now integrated into LAMMPS -as a package. +supplemental information of the following paper: +:ref:`(Chenoweth et al., 2008) `. The version integrated +into LAMMPS matches the version of ReaxFF From Summer 2010. For more +technical details about the pair reaxff implementation of ReaxFF, see +the :ref:`(Aktulga) ` paper. The *reaxff* style was initially +implemented as a stand-alone C code and is now converted to C++ and +integrated into LAMMPS as a package. -The *reax/c/kk* style is a Kokkos version of the ReaxFF potential that -is derived from the *reax/c* style. The Kokkos version can run on GPUs +The *reaxff/kk* style is a Kokkos version of the ReaxFF potential that +is derived from the *reaxff* style. The Kokkos version can run on GPUs and can also use OpenMP multithreading. For more information about the Kokkos package, see :doc:`Packages details ` and :doc:`Speed kokkos ` doc pages. One important -consideration when using the *reax/c/kk* style is the choice of either +consideration when using the *reaxff/kk* style is the choice of either half or full neighbor lists. This setting can be changed using the Kokkos :doc:`package ` command. -The *reax/c* style differs from the (obsolete) "pair_style reax" +The *reaxff* style differs from the (obsolete) "pair_style reax" command in the implementation details. The *reax* style was a Fortran library, linked to LAMMPS. The *reax* style has been removed from LAMMPS after the 12 December 2018 version. @@ -73,7 +74,7 @@ documented in potentials/README.reax. The default ffield.reax contains parameterizations for the following elements: C, H, O, N. The format of these files is identical to that used originally by van -Duin. We have tested the accuracy of *pair_style reax/c* potential +Duin. We have tested the accuracy of *pair_style reaxff* potential against the original ReaxFF code for the systems mentioned above. You can use other ffield files for specific chemical systems that may be available elsewhere (but note that their accuracy may not have been @@ -102,10 +103,11 @@ control variable. The format of the control file is described below. The LAMMPS default values for the ReaxFF global parameters correspond to those used by Adri van Duin's stand-alone serial - code. If these are changed by setting control variables in the control - file, the results from LAMMPS and the serial code will not agree. + code. If these are changed by setting control variables in the + control file, the results from LAMMPS and the serial code will + not agree. -Examples using *pair_style reax/c* are provided in the examples/reax +Examples using *pair_style reaxff* are provided in the examples/reax sub-directory. Use of this pair style requires that a charge be defined for every @@ -115,25 +117,28 @@ charges. The ReaxFF parameter files provided were created using a charge equilibration (QEq) model for handling the electrostatic interactions. -Therefore, by default, LAMMPS requires that the :doc:`fix qeq/reax ` command be used with *pair_style reax/c* -when simulating a ReaxFF model, to equilibrate charge each timestep. -Using the keyword *checkqeq* with the value *no* -turns off the check for *fix qeq/reax*\ , -allowing a simulation to be run without charge equilibration. -In this case, the static charges you -assign to each atom will be used for computing the electrostatic -interactions in the system. -See the :doc:`fix qeq/reax ` command for details. +Therefore, by default, LAMMPS requires that either the +:doc:`fix qeq/reaxff ` or the +:doc:`fix qeq/shielded ` command be used with +*pair_style reaxff* when simulating a ReaxFF model, to equilibrate +the charges each timestep. + +Using the keyword *checkqeq* with the value *no* turns off the check +for the QEq fixes, allowing a simulation to be run without charge +equilibration. In this case, the static charges you assign to each +atom will be used for computing the electrostatic interactions in +the system. See the :doc:`fix qeq/reaxff ` or +:doc:`fix qeq/shielded ` command documentation for more details. Using the optional keyword *lgvdw* with the value *yes* turns on the -low-gradient correction of the ReaxFF/C for long-range London -Dispersion, as described in the :ref:`(Liu) ` paper. Force field -file *ffield.reax.lg* is designed for this correction, and is trained -for several energetic materials (see "Liu"). When using lg-correction, -recommended value for parameter *thb* is 0.01, which can be set in the +low-gradient correction of ReaxFF for long-range London Dispersion, +as described in the :ref:`(Liu) ` paper. The bundled force +field file *ffield.reax.lg* is designed for this correction, and is +trained for several energetic materials (see "Liu"). When using *lgvdw yes*, +the recommended value for parameter *thb* is 0.01, which can be set in the control file. Note: Force field files are different for the original -or lg corrected pair styles, using wrong ffield file generates an -error message. +or lg corrected pair styles, using the wrong ffield file generates an +error. Using the optional keyword *enobonds* with the value *yes*\ , the energy of atoms with no bonds (i.e. isolated atoms) is included in the total @@ -144,7 +149,7 @@ discontinuities in the potential energy when the bonding of an atom drops to zero. Optional keywords *safezone*\ , *mincap*\ , and *minhbonds* are used -for allocating reax/c arrays. Increasing these values can avoid memory +for allocating reaxff arrays. Increasing these values can avoid memory problems, such as segmentation faults and bondchk failed errors, that could occur under certain conditions. These keywords are not used by the Kokkos version, which instead uses a more robust memory allocation @@ -158,7 +163,8 @@ equilibration contributions which are stored in the thermo variable :doc:`thermo ` command. This pair style tallies a breakdown of the total ReaxFF potential -energy into sub-categories, which can be accessed via the :doc:`compute pair ` command as a vector of values of length 14. +energy into sub-categories, which can be accessed via the +:doc:`compute pair ` command as a vector of values of length 14. The 14 values correspond to the following sub-categories (the variable names in italics match those used in the original FORTRAN ReaxFF code): @@ -183,14 +189,14 @@ headings) the following commands could be included in an input script: .. code-block:: LAMMPS - compute reax all pair reax/c + compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] [...] variable eqeq equal c_reax[14] thermo_style custom step temp epair v_eb v_ea [...] v_eqeq -Only a single pair_coeff command is used with the *reax/c* style which +Only a single pair_coeff command is used with the *reaxff* style which specifies a ReaxFF potential file with parameters for all needed elements. These are mapped to LAMMPS atom types by specifying N additional arguments after the filename in the pair_coeff command, @@ -209,7 +215,7 @@ to M. Each of the N indices you specify for the N atom types of LAMMPS atoms must be an integer from 1 to M. Atoms with LAMMPS type 1 will be mapped to whatever element you specify as the first index value, etc. If a mapping value is specified as NULL, the mapping is not -performed. This can be used when the *reax/c* style is used as part +performed. This can be used when the *reaxff* style is used as part of the *hybrid* pair style. The NULL values are placeholders for atom types that will be used with other potentials. @@ -241,7 +247,7 @@ brief description of their use and default values. *simulation_name* - Output files produced by *pair_style reax/c* carry + Output files produced by *pair_style reaxff* carry this name + extensions specific to their contents. Partial energies are reported with a ".pot" extension, while the trajectory file has ".trj" extension. @@ -286,8 +292,7 @@ brief description of their use and default values. to be considered in three body interactions. (default value = 0.00001) *write_freq* - Frequency of writes into the trajectory file. (default - value = 0) + Frequency of writes into the trajectory file. (default value = 0) *traj_title* Title of the trajectory - not the name of the trajectory file. @@ -315,7 +320,8 @@ Mixing, shift, table, tail correction, restart, rRESPA info This pair style does not support the :doc:`pair_modify ` mix, shift, table, and tail options. -This pair style does not write its information to :doc:`binary restart files `, since it is stored in potential files. Thus, you +This pair style does not write its information to :doc:`binary restart files `, +since it is stored in potential files. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. @@ -333,18 +339,20 @@ Restrictions """""""""""" This pair style is part of the REAXFF package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. +See the :doc:`Build package ` doc page for more info. The ReaxFF potential files provided with LAMMPS in the potentials -directory are parameterized for real :doc:`units `. You can use -the ReaxFF potential with any LAMMPS units, but you would need to +directory are parameterized for *real* :doc:`units `. You can use +the ReaxFF pair style with any LAMMPS units, but you would need to create your own potential file with coefficients listed in the appropriate units if your simulation does not use "real" units. Related commands """""""""""""""" -:doc:`pair_coeff `, :doc:`fix qeq/reax `, :doc:`fix reax/c/bonds `, :doc:`fix reax/c/species ` +:doc:`pair_coeff `, :doc:`fix qeq/reaxff `, +:doc:`fix reaxff/bonds `, :doc:`fix reaxff/species ` Default """"""" diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index f0497cb931..50f49c87c9 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -299,7 +299,7 @@ accelerated styles exist. * :doc:`python ` - * :doc:`quip ` - * :doc:`rann ` - -* :doc:`reax/c ` - ReaxFF potential in C +* :doc:`reaxff ` - ReaxFF potential * :doc:`rebo ` - second generation REBO potential of Brenner * :doc:`resquared ` - Everaers RE-Squared ellipsoidal potential * :doc:`sdpd/taitwater/isothermal ` - smoothed dissipative particle dynamics for water at isothermal conditions diff --git a/doc/utils/check-styles.py b/doc/utils/check-styles.py index 16a7cf2a5c..6c1fd6dd35 100755 --- a/doc/utils/check-styles.py +++ b/doc/utils/check-styles.py @@ -254,40 +254,27 @@ for command_type, entries in index.items(): print("Total number of style index entries:", total_index) +skip_fix = ('python', 'NEIGH_HISTORY/omp','qeq/reax','reax/c/bonds','reax/c/species') +skip_pair = ('meam/c','lj/sf','reax/c') + counter = 0 -counter += check_style('Commands_all.rst', doc_dir, ":doc:`(.+) <.+>`", - command,'Command',suffix=False) -counter += check_style('Commands_compute.rst', doc_dir, ":doc:`(.+) `", - compute,'Compute',suffix=True) -counter += check_style('compute.rst', doc_dir, ":doc:`(.+) ` -", - compute,'Compute',suffix=False) -counter += check_style('Commands_fix.rst', doc_dir, ":doc:`(.+) `", - fix,'Fix',skip=('python', 'NEIGH_HISTORY/omp'),suffix=True) -counter += check_style('fix.rst', doc_dir, ":doc:`(.+) ` -", - fix,'Fix',skip=('python', 'NEIGH_HISTORY/omp'),suffix=False) -counter += check_style('Commands_pair.rst', doc_dir, ":doc:`(.+) `", - pair,'Pair',skip=('meam/c','lj/sf'),suffix=True) -counter += check_style('pair_style.rst', doc_dir, ":doc:`(.+) ` -", - pair,'Pair',skip=('meam/c','lj/sf'),suffix=False) -counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `", - bond,'Bond',suffix=True) -counter += check_style('bond_style.rst', doc_dir, ":doc:`(.+) ` -", - bond,'Bond',suffix=False) -counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `", - angle,'Angle',suffix=True) -counter += check_style('angle_style.rst', doc_dir, ":doc:`(.+) ` -", - angle,'Angle',suffix=False) -counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `", - dihedral,'Dihedral',suffix=True) -counter += check_style('dihedral_style.rst', doc_dir, ":doc:`(.+) ` -", - dihedral,'Dihedral',suffix=False) -counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `", - improper,'Improper',suffix=True) -counter += check_style('improper_style.rst', doc_dir, ":doc:`(.+) ` -", - improper,'Improper',suffix=False) -counter += check_style('Commands_kspace.rst', doc_dir, ":doc:`(.+) `", - kspace,'KSpace',suffix=True) +counter += check_style('Commands_all.rst', doc_dir, ":doc:`(.+) <.+>`",command,'Command',suffix=False) +counter += check_style('Commands_compute.rst', doc_dir, ":doc:`(.+) `",compute,'Compute',suffix=True) +counter += check_style('compute.rst', doc_dir, ":doc:`(.+) ` -",compute,'Compute',suffix=False) +counter += check_style('Commands_fix.rst', doc_dir, ":doc:`(.+) `",fix,'Fix',skip=skip_fix,suffix=True) +counter += check_style('fix.rst', doc_dir, ":doc:`(.+) ` -",fix,'Fix',skip=skip_fix,suffix=False) +counter += check_style('Commands_pair.rst', doc_dir, ":doc:`(.+) `",pair,'Pair',skip=skip_pair,suffix=True) +counter += check_style('pair_style.rst', doc_dir, ":doc:`(.+) ` -",pair,'Pair',skip=skip_pair,suffix=False) +counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `",bond,'Bond',suffix=True) +counter += check_style('bond_style.rst', doc_dir, ":doc:`(.+) ` -",bond,'Bond',suffix=False) +counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `",angle,'Angle',suffix=True) +counter += check_style('angle_style.rst', doc_dir, ":doc:`(.+) ` -",angle,'Angle',suffix=False) +counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `",dihedral,'Dihedral',suffix=True) +counter += check_style('dihedral_style.rst', doc_dir, ":doc:`(.+) ` -",dihedral,'Dihedral',suffix=False) +counter += check_style('Commands_bond.rst', doc_dir, ":doc:`(.+) `",improper,'Improper',suffix=True) +counter += check_style('improper_style.rst', doc_dir, ":doc:`(.+) ` -",improper,'Improper',suffix=False) +counter += check_style('Commands_kspace.rst', doc_dir, ":doc:`(.+) `",kspace,'KSpace',suffix=True) if counter: print(f"Found {counter} issue(s) with style lists") @@ -295,13 +282,13 @@ if counter: counter = 0 counter += check_style_index("compute", compute, index["compute"]) -counter += check_style_index("fix", fix, index["fix"], skip=['python']) +counter += check_style_index("fix", fix, index["fix"], skip=['python','qeq/reax','reax/c/bonds','reax/c/species']) counter += check_style_index("angle_style", angle, index["angle_style"]) counter += check_style_index("bond_style", bond, index["bond_style"]) counter += check_style_index("dihedral_style", dihedral, index["dihedral_style"]) counter += check_style_index("improper_style", improper, index["improper_style"]) counter += check_style_index("kspace_style", kspace, index["kspace_style"]) -counter += check_style_index("pair_style", pair, index["pair_style"], skip=['meam/c', 'lj/sf']) +counter += check_style_index("pair_style", pair, index["pair_style"], skip=['meam/c', 'lj/sf','reax/c']) if counter: print(f"Found {counter} issue(s) with style index") diff --git a/examples/README b/examples/README index 4f4f671a29..68825a7dbd 100644 --- a/examples/README +++ b/examples/README @@ -103,7 +103,7 @@ pour: pouring of granular particles into a 3d box, then chute flow prd: parallel replica dynamics of vacancy diffusion in bulk Si python: use of PYTHON package to invoke Python code from input script qeq: use of QEQ package for charge equilibration -reax: RDX and TATB and several other models using ReaxFF +reaxff: RDX and TATB and several other models using ReaxFF rerun: use of rerun and read_dump commands rigid: rigid bodies modeled as independent or coupled shear: sideways shear applied to 2d solid, with and without a void diff --git a/examples/reax/AB/README b/examples/reaxff/AB/README similarity index 100% rename from examples/reax/AB/README rename to examples/reaxff/AB/README diff --git a/examples/reax/AB/data.AB b/examples/reaxff/AB/data.AB similarity index 100% rename from examples/reax/AB/data.AB rename to examples/reaxff/AB/data.AB diff --git a/examples/reax/AB/ffield.reax.AB b/examples/reaxff/AB/ffield.reax.AB similarity index 100% rename from examples/reax/AB/ffield.reax.AB rename to examples/reaxff/AB/ffield.reax.AB diff --git a/examples/reax/AB/in.AB b/examples/reaxff/AB/in.AB similarity index 100% rename from examples/reax/AB/in.AB rename to examples/reaxff/AB/in.AB diff --git a/examples/reax/AB/lmp_control b/examples/reaxff/AB/lmp_control similarity index 100% rename from examples/reax/AB/lmp_control rename to examples/reaxff/AB/lmp_control diff --git a/examples/reax/AB/log.8Mar18.AB.g++.1 b/examples/reaxff/AB/log.8Mar18.AB.g++.1 similarity index 100% rename from examples/reax/AB/log.8Mar18.AB.g++.1 rename to examples/reaxff/AB/log.8Mar18.AB.g++.1 diff --git a/examples/reax/AB/log.8Mar18.AB.g++.4 b/examples/reaxff/AB/log.8Mar18.AB.g++.4 similarity index 100% rename from examples/reax/AB/log.8Mar18.AB.g++.4 rename to examples/reaxff/AB/log.8Mar18.AB.g++.4 diff --git a/examples/reax/AB/param.qeq b/examples/reaxff/AB/param.qeq similarity index 100% rename from examples/reax/AB/param.qeq rename to examples/reaxff/AB/param.qeq diff --git a/examples/reax/AuO/README b/examples/reaxff/AuO/README similarity index 100% rename from examples/reax/AuO/README rename to examples/reaxff/AuO/README diff --git a/examples/reax/AuO/data.AuO b/examples/reaxff/AuO/data.AuO similarity index 100% rename from examples/reax/AuO/data.AuO rename to examples/reaxff/AuO/data.AuO diff --git a/examples/reax/AuO/ffield.reax.AuO b/examples/reaxff/AuO/ffield.reax.AuO similarity index 100% rename from examples/reax/AuO/ffield.reax.AuO rename to examples/reaxff/AuO/ffield.reax.AuO diff --git a/examples/reax/AuO/in.AuO b/examples/reaxff/AuO/in.AuO similarity index 100% rename from examples/reax/AuO/in.AuO rename to examples/reaxff/AuO/in.AuO diff --git a/examples/reax/AuO/lmp_control b/examples/reaxff/AuO/lmp_control similarity index 100% rename from examples/reax/AuO/lmp_control rename to examples/reaxff/AuO/lmp_control diff --git a/examples/reax/AuO/log.8Mar18.AuO.g++.1 b/examples/reaxff/AuO/log.8Mar18.AuO.g++.1 similarity index 100% rename from examples/reax/AuO/log.8Mar18.AuO.g++.1 rename to examples/reaxff/AuO/log.8Mar18.AuO.g++.1 diff --git a/examples/reax/AuO/log.8Mar18.AuO.g++.4 b/examples/reaxff/AuO/log.8Mar18.AuO.g++.4 similarity index 100% rename from examples/reax/AuO/log.8Mar18.AuO.g++.4 rename to examples/reaxff/AuO/log.8Mar18.AuO.g++.4 diff --git a/examples/reax/AuO/param.qeq b/examples/reaxff/AuO/param.qeq similarity index 100% rename from examples/reax/AuO/param.qeq rename to examples/reaxff/AuO/param.qeq diff --git a/examples/reax/CHO/README b/examples/reaxff/CHO/README similarity index 100% rename from examples/reax/CHO/README rename to examples/reaxff/CHO/README diff --git a/examples/reax/CHO/data.CHO b/examples/reaxff/CHO/data.CHO similarity index 100% rename from examples/reax/CHO/data.CHO rename to examples/reaxff/CHO/data.CHO diff --git a/examples/reax/CHO/ffield.reax.cho b/examples/reaxff/CHO/ffield.reax.cho similarity index 100% rename from examples/reax/CHO/ffield.reax.cho rename to examples/reaxff/CHO/ffield.reax.cho diff --git a/examples/reax/CHO/in.CHO b/examples/reaxff/CHO/in.CHO similarity index 100% rename from examples/reax/CHO/in.CHO rename to examples/reaxff/CHO/in.CHO diff --git a/examples/reax/CHO/lmp_control b/examples/reaxff/CHO/lmp_control similarity index 100% rename from examples/reax/CHO/lmp_control rename to examples/reaxff/CHO/lmp_control diff --git a/examples/reax/CHO/log.8Mar18.CHO.g++.1 b/examples/reaxff/CHO/log.8Mar18.CHO.g++.1 similarity index 100% rename from examples/reax/CHO/log.8Mar18.CHO.g++.1 rename to examples/reaxff/CHO/log.8Mar18.CHO.g++.1 diff --git a/examples/reax/CHO/log.8Mar18.CHO.g++.4 b/examples/reaxff/CHO/log.8Mar18.CHO.g++.4 similarity index 100% rename from examples/reax/CHO/log.8Mar18.CHO.g++.4 rename to examples/reaxff/CHO/log.8Mar18.CHO.g++.4 diff --git a/examples/reax/CHO/param.qeq b/examples/reaxff/CHO/param.qeq similarity index 100% rename from examples/reax/CHO/param.qeq rename to examples/reaxff/CHO/param.qeq diff --git a/examples/reax/FC/README b/examples/reaxff/FC/README similarity index 100% rename from examples/reax/FC/README rename to examples/reaxff/FC/README diff --git a/examples/reax/FC/data.FC b/examples/reaxff/FC/data.FC similarity index 100% rename from examples/reax/FC/data.FC rename to examples/reaxff/FC/data.FC diff --git a/examples/reax/FC/ffield.reax.FC b/examples/reaxff/FC/ffield.reax.FC similarity index 100% rename from examples/reax/FC/ffield.reax.FC rename to examples/reaxff/FC/ffield.reax.FC diff --git a/examples/reax/FC/in.FC b/examples/reaxff/FC/in.FC similarity index 100% rename from examples/reax/FC/in.FC rename to examples/reaxff/FC/in.FC diff --git a/examples/reax/FC/log.8Mar18.FC.g++.1 b/examples/reaxff/FC/log.8Mar18.FC.g++.1 similarity index 100% rename from examples/reax/FC/log.8Mar18.FC.g++.1 rename to examples/reaxff/FC/log.8Mar18.FC.g++.1 diff --git a/examples/reax/FC/log.8Mar18.FC.g++.4 b/examples/reaxff/FC/log.8Mar18.FC.g++.4 similarity index 100% rename from examples/reax/FC/log.8Mar18.FC.g++.4 rename to examples/reaxff/FC/log.8Mar18.FC.g++.4 diff --git a/examples/reax/FeOH3/README b/examples/reaxff/FeOH3/README similarity index 100% rename from examples/reax/FeOH3/README rename to examples/reaxff/FeOH3/README diff --git a/examples/reax/FeOH3/data.FeOH3 b/examples/reaxff/FeOH3/data.FeOH3 similarity index 100% rename from examples/reax/FeOH3/data.FeOH3 rename to examples/reaxff/FeOH3/data.FeOH3 diff --git a/examples/reax/FeOH3/ffield.reax.Fe_O_C_H b/examples/reaxff/FeOH3/ffield.reax.Fe_O_C_H similarity index 100% rename from examples/reax/FeOH3/ffield.reax.Fe_O_C_H rename to examples/reaxff/FeOH3/ffield.reax.Fe_O_C_H diff --git a/examples/reax/FeOH3/in.FeOH3 b/examples/reaxff/FeOH3/in.FeOH3 similarity index 100% rename from examples/reax/FeOH3/in.FeOH3 rename to examples/reaxff/FeOH3/in.FeOH3 diff --git a/examples/reax/FeOH3/lmp_control b/examples/reaxff/FeOH3/lmp_control similarity index 100% rename from examples/reax/FeOH3/lmp_control rename to examples/reaxff/FeOH3/lmp_control diff --git a/examples/reax/FeOH3/log.5Oct16.FeOH3.g++.1 b/examples/reaxff/FeOH3/log.5Oct16.FeOH3.g++.1 similarity index 100% rename from examples/reax/FeOH3/log.5Oct16.FeOH3.g++.1 rename to examples/reaxff/FeOH3/log.5Oct16.FeOH3.g++.1 diff --git a/examples/reax/FeOH3/log.5Oct16.FeOH3.g++.4 b/examples/reaxff/FeOH3/log.5Oct16.FeOH3.g++.4 similarity index 100% rename from examples/reax/FeOH3/log.5Oct16.FeOH3.g++.4 rename to examples/reaxff/FeOH3/log.5Oct16.FeOH3.g++.4 diff --git a/examples/reax/FeOH3/param.qeq b/examples/reaxff/FeOH3/param.qeq similarity index 100% rename from examples/reax/FeOH3/param.qeq rename to examples/reaxff/FeOH3/param.qeq diff --git a/examples/reax/HNS/README.txt b/examples/reaxff/HNS/README.txt similarity index 100% rename from examples/reax/HNS/README.txt rename to examples/reaxff/HNS/README.txt diff --git a/examples/reax/HNS/data.hns-equil b/examples/reaxff/HNS/data.hns-equil similarity index 100% rename from examples/reax/HNS/data.hns-equil rename to examples/reaxff/HNS/data.hns-equil diff --git a/examples/reax/HNS/ffield.reax.hns b/examples/reaxff/HNS/ffield.reax.hns similarity index 100% rename from examples/reax/HNS/ffield.reax.hns rename to examples/reaxff/HNS/ffield.reax.hns diff --git a/examples/reax/HNS/in.reaxc.hns b/examples/reaxff/HNS/in.reaxc.hns similarity index 100% rename from examples/reax/HNS/in.reaxc.hns rename to examples/reaxff/HNS/in.reaxc.hns diff --git a/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.1 b/examples/reaxff/HNS/log.8Mar18.reaxc.hns.g++.1 similarity index 100% rename from examples/reax/HNS/log.8Mar18.reaxc.hns.g++.1 rename to examples/reaxff/HNS/log.8Mar18.reaxc.hns.g++.1 diff --git a/examples/reax/HNS/log.8Mar18.reaxc.hns.g++.4 b/examples/reaxff/HNS/log.8Mar18.reaxc.hns.g++.4 similarity index 100% rename from examples/reax/HNS/log.8Mar18.reaxc.hns.g++.4 rename to examples/reaxff/HNS/log.8Mar18.reaxc.hns.g++.4 diff --git a/examples/reax/RDX/README b/examples/reaxff/RDX/README similarity index 100% rename from examples/reax/RDX/README rename to examples/reaxff/RDX/README diff --git a/examples/reax/RDX/data.RDX b/examples/reaxff/RDX/data.RDX similarity index 100% rename from examples/reax/RDX/data.RDX rename to examples/reaxff/RDX/data.RDX diff --git a/examples/reax/RDX/ffield.reax.rdx b/examples/reaxff/RDX/ffield.reax.rdx similarity index 100% rename from examples/reax/RDX/ffield.reax.rdx rename to examples/reaxff/RDX/ffield.reax.rdx diff --git a/examples/reax/RDX/in.RDX b/examples/reaxff/RDX/in.RDX similarity index 100% rename from examples/reax/RDX/in.RDX rename to examples/reaxff/RDX/in.RDX diff --git a/examples/reax/RDX/lmp_control b/examples/reaxff/RDX/lmp_control similarity index 100% rename from examples/reax/RDX/lmp_control rename to examples/reaxff/RDX/lmp_control diff --git a/examples/reax/RDX/log.8Mar18.RDX.g++.1 b/examples/reaxff/RDX/log.8Mar18.RDX.g++.1 similarity index 100% rename from examples/reax/RDX/log.8Mar18.RDX.g++.1 rename to examples/reaxff/RDX/log.8Mar18.RDX.g++.1 diff --git a/examples/reax/RDX/log.8Mar18.RDX.g++.4 b/examples/reaxff/RDX/log.8Mar18.RDX.g++.4 similarity index 100% rename from examples/reax/RDX/log.8Mar18.RDX.g++.4 rename to examples/reaxff/RDX/log.8Mar18.RDX.g++.4 diff --git a/examples/reax/RDX/param.qeq b/examples/reaxff/RDX/param.qeq similarity index 100% rename from examples/reax/RDX/param.qeq rename to examples/reaxff/RDX/param.qeq diff --git a/examples/reax/README b/examples/reaxff/README similarity index 100% rename from examples/reax/README rename to examples/reaxff/README diff --git a/examples/reax/VOH/README b/examples/reaxff/VOH/README similarity index 100% rename from examples/reax/VOH/README rename to examples/reaxff/VOH/README diff --git a/examples/reax/VOH/data.VOH b/examples/reaxff/VOH/data.VOH similarity index 100% rename from examples/reax/VOH/data.VOH rename to examples/reaxff/VOH/data.VOH diff --git a/examples/reax/VOH/ffield.reax.V_O_C_H b/examples/reaxff/VOH/ffield.reax.V_O_C_H similarity index 100% rename from examples/reax/VOH/ffield.reax.V_O_C_H rename to examples/reaxff/VOH/ffield.reax.V_O_C_H diff --git a/examples/reax/VOH/in.VOH b/examples/reaxff/VOH/in.VOH similarity index 100% rename from examples/reax/VOH/in.VOH rename to examples/reaxff/VOH/in.VOH diff --git a/examples/reax/VOH/lmp_control b/examples/reaxff/VOH/lmp_control similarity index 100% rename from examples/reax/VOH/lmp_control rename to examples/reaxff/VOH/lmp_control diff --git a/examples/reax/VOH/log.8Mar18.VOH.g++.1 b/examples/reaxff/VOH/log.8Mar18.VOH.g++.1 similarity index 100% rename from examples/reax/VOH/log.8Mar18.VOH.g++.1 rename to examples/reaxff/VOH/log.8Mar18.VOH.g++.1 diff --git a/examples/reax/VOH/log.8Mar18.VOH.g++.4 b/examples/reaxff/VOH/log.8Mar18.VOH.g++.4 similarity index 100% rename from examples/reax/VOH/log.8Mar18.VOH.g++.4 rename to examples/reaxff/VOH/log.8Mar18.VOH.g++.4 diff --git a/examples/reax/VOH/param.qeq b/examples/reaxff/VOH/param.qeq similarity index 100% rename from examples/reax/VOH/param.qeq rename to examples/reaxff/VOH/param.qeq diff --git a/examples/reax/ZnOH2/README b/examples/reaxff/ZnOH2/README similarity index 100% rename from examples/reax/ZnOH2/README rename to examples/reaxff/ZnOH2/README diff --git a/examples/reax/ZnOH2/data.ZnOH2 b/examples/reaxff/ZnOH2/data.ZnOH2 similarity index 100% rename from examples/reax/ZnOH2/data.ZnOH2 rename to examples/reaxff/ZnOH2/data.ZnOH2 diff --git a/examples/reax/ZnOH2/ffield.reax.ZnOH b/examples/reaxff/ZnOH2/ffield.reax.ZnOH similarity index 100% rename from examples/reax/ZnOH2/ffield.reax.ZnOH rename to examples/reaxff/ZnOH2/ffield.reax.ZnOH diff --git a/examples/reax/ZnOH2/in.ZnOH2 b/examples/reaxff/ZnOH2/in.ZnOH2 similarity index 100% rename from examples/reax/ZnOH2/in.ZnOH2 rename to examples/reaxff/ZnOH2/in.ZnOH2 diff --git a/examples/reax/ZnOH2/lmp_control b/examples/reaxff/ZnOH2/lmp_control similarity index 100% rename from examples/reax/ZnOH2/lmp_control rename to examples/reaxff/ZnOH2/lmp_control diff --git a/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.1 b/examples/reaxff/ZnOH2/log.8Mar18.ZnOH2.g++.1 similarity index 100% rename from examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.1 rename to examples/reaxff/ZnOH2/log.8Mar18.ZnOH2.g++.1 diff --git a/examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.4 b/examples/reaxff/ZnOH2/log.8Mar18.ZnOH2.g++.4 similarity index 100% rename from examples/reax/ZnOH2/log.8Mar18.ZnOH2.g++.4 rename to examples/reaxff/ZnOH2/log.8Mar18.ZnOH2.g++.4 diff --git a/examples/reax/ZnOH2/param.qeq b/examples/reaxff/ZnOH2/param.qeq similarity index 100% rename from examples/reax/ZnOH2/param.qeq rename to examples/reaxff/ZnOH2/param.qeq diff --git a/examples/reax/ci-reaxFF/CH4.dat b/examples/reaxff/ci-reaxFF/CH4.dat similarity index 100% rename from examples/reax/ci-reaxFF/CH4.dat rename to examples/reaxff/ci-reaxFF/CH4.dat diff --git a/examples/reax/ci-reaxFF/ci-reaxFF_ZBL.dat b/examples/reaxff/ci-reaxFF/ci-reaxFF_ZBL.dat similarity index 100% rename from examples/reax/ci-reaxFF/ci-reaxFF_ZBL.dat rename to examples/reaxff/ci-reaxFF/ci-reaxFF_ZBL.dat diff --git a/examples/reax/ci-reaxFF/control b/examples/reaxff/ci-reaxFF/control similarity index 100% rename from examples/reax/ci-reaxFF/control rename to examples/reaxff/ci-reaxFF/control diff --git a/examples/reax/ci-reaxFF/ffield.ci-reax.CH b/examples/reaxff/ci-reaxFF/ffield.ci-reax.CH similarity index 100% rename from examples/reax/ci-reaxFF/ffield.ci-reax.CH rename to examples/reaxff/ci-reaxFF/ffield.ci-reax.CH diff --git a/examples/reax/ci-reaxFF/in.ci-reax.CH b/examples/reaxff/ci-reaxFF/in.ci-reax.CH similarity index 100% rename from examples/reax/ci-reaxFF/in.ci-reax.CH rename to examples/reaxff/ci-reaxFF/in.ci-reax.CH diff --git a/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 b/examples/reaxff/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 similarity index 100% rename from examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 rename to examples/reaxff/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.1 diff --git a/examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 b/examples/reaxff/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 similarity index 100% rename from examples/reax/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 rename to examples/reaxff/ci-reaxFF/log.8Mar18.ci-reax.CH.g++.4 diff --git a/examples/reax/control.reax_c.rdx b/examples/reaxff/control.reax_c.rdx similarity index 100% rename from examples/reax/control.reax_c.rdx rename to examples/reaxff/control.reax_c.rdx diff --git a/examples/reax/control.reax_c.tatb b/examples/reaxff/control.reax_c.tatb similarity index 100% rename from examples/reax/control.reax_c.tatb rename to examples/reaxff/control.reax_c.tatb diff --git a/examples/reax/data.rdx b/examples/reaxff/data.rdx similarity index 100% rename from examples/reax/data.rdx rename to examples/reaxff/data.rdx diff --git a/examples/reax/data.tatb b/examples/reaxff/data.tatb similarity index 100% rename from examples/reax/data.tatb rename to examples/reaxff/data.tatb diff --git a/examples/reax/ffield.reax b/examples/reaxff/ffield.reax similarity index 100% rename from examples/reax/ffield.reax rename to examples/reaxff/ffield.reax diff --git a/examples/reax/in.reaxc.rdx b/examples/reaxff/in.reaxc.rdx similarity index 100% rename from examples/reax/in.reaxc.rdx rename to examples/reaxff/in.reaxc.rdx diff --git a/examples/reax/in.reaxc.rdx-shielded b/examples/reaxff/in.reaxc.rdx-shielded similarity index 100% rename from examples/reax/in.reaxc.rdx-shielded rename to examples/reaxff/in.reaxc.rdx-shielded diff --git a/examples/reax/in.reaxc.tatb b/examples/reaxff/in.reaxc.tatb similarity index 100% rename from examples/reax/in.reaxc.tatb rename to examples/reaxff/in.reaxc.tatb diff --git a/examples/reax/in.reaxc.tatb-shielded b/examples/reaxff/in.reaxc.tatb-shielded similarity index 100% rename from examples/reax/in.reaxc.tatb-shielded rename to examples/reaxff/in.reaxc.tatb-shielded diff --git a/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 b/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.1 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.1 rename to examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.1 diff --git a/examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 b/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.rdx-shielded.g++.4 rename to examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 diff --git a/examples/reax/log.21Apr21.reaxc.rdx.g++.1 b/examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.rdx.g++.1 rename to examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 diff --git a/examples/reax/log.21Apr21.reaxc.rdx.g++.4 b/examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.rdx.g++.4 rename to examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 diff --git a/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 b/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.1 rename to examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 diff --git a/examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 b/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.tatb-shielded.g++.4 rename to examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 diff --git a/examples/reax/log.21Apr21.reaxc.tatb.g++.1 b/examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.tatb.g++.1 rename to examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 diff --git a/examples/reax/log.21Apr21.reaxc.tatb.g++.4 b/examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 similarity index 100% rename from examples/reax/log.21Apr21.reaxc.tatb.g++.4 rename to examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp similarity index 87% rename from src/KOKKOS/fix_qeq_reax_kokkos.cpp rename to src/KOKKOS/fix_qeq_reaxff_kokkos.cpp index f389808cf3..77bd013ad4 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.cpp @@ -17,7 +17,7 @@ Kamesh Arumugam (NVIDIA) ------------------------------------------------------------------------- */ -#include "fix_qeq_reax_kokkos.h" +#include "fix_qeq_reaxff_kokkos.h" #include "atom.h" #include "atom_kokkos.h" @@ -43,9 +43,9 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ template -FixQEqReaxKokkos:: -FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) : - FixQEqReax(lmp, narg, arg) +FixQEqReaxFFKokkos:: +FixQEqReaxFFKokkos(LAMMPS *lmp, int narg, char **arg) : + FixQEqReaxFF(lmp, narg, arg) { kokkosable = 1; forward_comm_device = 1; @@ -69,7 +69,7 @@ FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ template -FixQEqReaxKokkos::~FixQEqReaxKokkos() +FixQEqReaxFFKokkos::~FixQEqReaxFFKokkos() { if (copymode) return; @@ -80,11 +80,11 @@ FixQEqReaxKokkos::~FixQEqReaxKokkos() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::init() +void FixQEqReaxFFKokkos::init() { atomKK->sync(execution_space,Q_MASK); - FixQEqReax::init(); + FixQEqReaxFF::init(); neighflag = lmp->kokkos->neighflag_qeq; int irequest = neighbor->nrequest - 1; @@ -110,7 +110,7 @@ void FixQEqReaxKokkos::init() int ntypes = atom->ntypes; k_params = Kokkos::DualView - ("FixQEqReax::params",ntypes+1); + ("FixQEqReaxFF::params",ntypes+1); params = k_params.template view(); for (int n = 1; n <= ntypes; n++) { @@ -131,7 +131,7 @@ void FixQEqReaxKokkos::init() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::init_shielding_k() +void FixQEqReaxFFKokkos::init_shielding_k() { int i,j; int ntypes = atom->ntypes; @@ -159,7 +159,7 @@ void FixQEqReaxKokkos::init_shielding_k() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::init_hist() +void FixQEqReaxFFKokkos::init_hist() { k_s_hist.clear_sync_state(); k_t_hist.clear_sync_state(); @@ -174,7 +174,7 @@ void FixQEqReaxKokkos::init_hist() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::setup_pre_force(int vflag) +void FixQEqReaxFFKokkos::setup_pre_force(int vflag) { //neighbor->build_one(list); @@ -184,7 +184,7 @@ void FixQEqReaxKokkos::setup_pre_force(int vflag) /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::pre_force(int /*vflag*/) +void FixQEqReaxFFKokkos::pre_force(int /*vflag*/) { if (update->ntimestep % nevery) return; @@ -228,10 +228,10 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) if (execution_space == Host) { // CPU if (neighflag == FULL) { - FixQEqReaxKokkosComputeHFunctor computeH_functor(this); + FixQEqReaxFFKokkosComputeHFunctor computeH_functor(this); Kokkos::parallel_scan(inum,computeH_functor); } else { // HALF and HALFTHREAD are the same - FixQEqReaxKokkosComputeHFunctor computeH_functor(this); + FixQEqReaxFFKokkosComputeHFunctor computeH_functor(this); Kokkos::parallel_scan(inum,computeH_functor); } } else { // GPU, use teams @@ -244,11 +244,11 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) Kokkos::TeamPolicy policy(num_teams, atoms_per_team, vector_length); if (neighflag == FULL) { - FixQEqReaxKokkosComputeHFunctor computeH_functor( + FixQEqReaxFFKokkosComputeHFunctor computeH_functor( this, atoms_per_team, vector_length); Kokkos::parallel_for(policy, computeH_functor); } else { // HALF and HALFTHREAD are the same - FixQEqReaxKokkosComputeHFunctor computeH_functor( + FixQEqReaxFFKokkosComputeHFunctor computeH_functor( this, atoms_per_team, vector_length); Kokkos::parallel_for(policy, computeH_functor); } @@ -258,7 +258,7 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) k_s_hist.template sync(); k_t_hist.template sync(); - FixQEqReaxKokkosMatVecFunctor matvec_functor(this); + FixQEqReaxFFKokkosMatVecFunctor matvec_functor(this); Kokkos::parallel_for(inum,matvec_functor); // comm->forward_comm_fix(this); //Dist_vector(s); @@ -313,7 +313,7 @@ void FixQEqReaxKokkos::pre_force(int /*vflag*/) template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::num_neigh_item(int ii, int &maxneigh) const +void FixQEqReaxFFKokkos::num_neigh_item(int ii, int &maxneigh) const { const int i = d_ilist[ii]; maxneigh += d_numneigh[i]; @@ -322,7 +322,7 @@ void FixQEqReaxKokkos::num_neigh_item(int ii, int &maxneigh) const /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::allocate_matrix() +void FixQEqReaxFFKokkos::allocate_matrix() { const int inum = list->inum; @@ -331,7 +331,7 @@ void FixQEqReaxKokkos::allocate_matrix() // determine the total space for the H matrix m_cap = 0; - FixQEqReaxKokkosNumNeighFunctor neigh_functor(this); + FixQEqReaxFFKokkosNumNeighFunctor neigh_functor(this); Kokkos::parallel_reduce(inum,neigh_functor,m_cap); d_firstnbr = typename AT::t_int_1d("qeq/kk:firstnbr",nmax); @@ -343,7 +343,7 @@ void FixQEqReaxKokkos::allocate_matrix() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::allocate_array() +void FixQEqReaxFFKokkos::allocate_array() { if (atom->nmax > nmax) { nmax = atom->nmax; @@ -377,7 +377,7 @@ void FixQEqReaxKokkos::allocate_array() // init_storage - FixQEqReaxKokkosZeroFunctor zero_functor(this); + FixQEqReaxFFKokkosZeroFunctor zero_functor(this); Kokkos::parallel_for(ignum,zero_functor); } @@ -385,7 +385,7 @@ void FixQEqReaxKokkos::allocate_array() template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::zero_item(int ii) const +void FixQEqReaxFFKokkos::zero_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -409,7 +409,7 @@ void FixQEqReaxKokkos::zero_item(int ii) const template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::compute_h_item(int ii, int &m_fill, const bool &final) const +void FixQEqReaxFFKokkos::compute_h_item(int ii, int &m_fill, const bool &final) const { const int i = d_ilist[ii]; int j,jj,jtype; @@ -477,7 +477,7 @@ void FixQEqReaxKokkos::compute_h_item(int ii, int &m_fill, const boo template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::compute_h_team( +void FixQEqReaxFFKokkos::compute_h_team( const typename Kokkos::TeamPolicy::member_type &team, int atoms_per_team, int vector_length) const { @@ -682,7 +682,7 @@ void FixQEqReaxKokkos::compute_h_team( template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const +double FixQEqReaxFFKokkos::calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const { F_FLOAT taper, denom; @@ -704,7 +704,7 @@ double FixQEqReaxKokkos::calculate_H_k(const F_FLOAT &r, const F_FLO template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::matvec_item(int ii) const +void FixQEqReaxFFKokkos::matvec_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -722,7 +722,7 @@ void FixQEqReaxKokkos::matvec_item(int ii) const /* ---------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::cg_solve1() +int FixQEqReaxFFKokkos::cg_solve1() // b = b_s, x = s; { const int inum = list->inum; @@ -733,15 +733,15 @@ int FixQEqReaxKokkos::cg_solve1() else teamsize = 128; // sparse_matvec(&H, x, q); - FixQEqReaxKokkosSparse12Functor sparse12_functor(this); + FixQEqReaxFFKokkosSparse12Functor sparse12_functor(this); Kokkos::parallel_for(inum,sparse12_functor); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(inum,ignum),*this); if (neighflag == HALF) { - FixQEqReaxKokkosSparse13Functor sparse13_functor(this); + FixQEqReaxFFKokkosSparse13Functor sparse13_functor(this); Kokkos::parallel_for(inum,sparse13_functor); } else if (neighflag == HALFTHREAD) { - FixQEqReaxKokkosSparse13Functor sparse13_functor(this); + FixQEqReaxFFKokkosSparse13Functor sparse13_functor(this); Kokkos::parallel_for(inum,sparse13_functor); } if (need_dup) @@ -760,7 +760,7 @@ int FixQEqReaxKokkos::cg_solve1() // preconditioning: d[j] = r[j] * Hdia_inv[j]; // b_norm = parallel_norm(b, nn); F_FLOAT my_norm = 0.0; - FixQEqReaxKokkosNorm1Functor norm1_functor(this); + FixQEqReaxFFKokkosNorm1Functor norm1_functor(this); Kokkos::parallel_reduce(inum,norm1_functor,my_norm); F_FLOAT norm_sqr = 0.0; MPI_Allreduce(&my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); @@ -768,7 +768,7 @@ int FixQEqReaxKokkos::cg_solve1() // sig_new = parallel_dot(r, d, nn); F_FLOAT my_dot = 0.0; - FixQEqReaxKokkosDot1Functor dot1_functor(this); + FixQEqReaxFFKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); F_FLOAT dot_sqr = 0.0; MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); @@ -784,17 +784,17 @@ int FixQEqReaxKokkos::cg_solve1() k_d.template sync(); // sparse_matvec(&H, d, q); - FixQEqReaxKokkosSparse22Functor sparse22_functor(this); + FixQEqReaxFFKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(inum,ignum),*this); if (need_dup) dup_o.reset_except(d_o); if (neighflag == HALF) { - FixQEqReaxKokkosSparse23Functor sparse23_functor(this); + FixQEqReaxFFKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); } else if (neighflag == HALFTHREAD) { - FixQEqReaxKokkosSparse23Functor sparse23_functor(this); + FixQEqReaxFFKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); } if (need_dup) @@ -811,7 +811,7 @@ int FixQEqReaxKokkos::cg_solve1() // tmp = parallel_dot(d, q, nn); my_dot = dot_sqr = 0.0; - FixQEqReaxKokkosDot2Functor dot2_functor(this); + FixQEqReaxFFKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); tmp = dot_sqr; @@ -823,11 +823,11 @@ int FixQEqReaxKokkos::cg_solve1() // vector_add(s, alpha, d, nn); // vector_add(r, -alpha, q, nn); my_dot = dot_sqr = 0.0; - FixQEqReaxKokkosPrecon1Functor precon1_functor(this); + FixQEqReaxFFKokkosPrecon1Functor precon1_functor(this); Kokkos::parallel_for(inum,precon1_functor); // preconditioning: p[j] = r[j] * Hdia_inv[j]; // sig_new = parallel_dot(r, p, nn); - FixQEqReaxKokkosPreconFunctor precon_functor(this); + FixQEqReaxFFKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); sig_new = dot_sqr; @@ -835,12 +835,12 @@ int FixQEqReaxKokkos::cg_solve1() beta = sig_new / sig_old; // vector_sum(d, 1., p, beta, d, nn); - FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); + FixQEqReaxFFKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); } if ((loop >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve1 convergence " + error->warning(FLERR,fmt::format("Fix qeq/reaxff/kk cg_solve1 convergence " "failed after {} iterations at step {}: " "{}", loop, update->ntimestep, sqrt(sig_new)/b_norm)); @@ -850,7 +850,7 @@ int FixQEqReaxKokkos::cg_solve1() /* ---------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::cg_solve2() +int FixQEqReaxFFKokkos::cg_solve2() // b = b_t, x = t; { const int inum = list->inum; @@ -861,17 +861,17 @@ int FixQEqReaxKokkos::cg_solve2() else teamsize = 128; // sparse_matvec(&H, x, q); - FixQEqReaxKokkosSparse32Functor sparse32_functor(this); + FixQEqReaxFFKokkosSparse32Functor sparse32_functor(this); Kokkos::parallel_for(inum,sparse32_functor); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(inum,ignum),*this); if (need_dup) dup_o.reset_except(d_o); if (neighflag == HALF) { - FixQEqReaxKokkosSparse33Functor sparse33_functor(this); + FixQEqReaxFFKokkosSparse33Functor sparse33_functor(this); Kokkos::parallel_for(inum,sparse33_functor); } else if (neighflag == HALFTHREAD) { - FixQEqReaxKokkosSparse33Functor sparse33_functor(this); + FixQEqReaxFFKokkosSparse33Functor sparse33_functor(this); Kokkos::parallel_for(inum,sparse33_functor); } if (need_dup) @@ -890,7 +890,7 @@ int FixQEqReaxKokkos::cg_solve2() // preconditioning: d[j] = r[j] * Hdia_inv[j]; // b_norm = parallel_norm(b, nn); F_FLOAT my_norm = 0.0; - FixQEqReaxKokkosNorm2Functor norm2_functor(this); + FixQEqReaxFFKokkosNorm2Functor norm2_functor(this); Kokkos::parallel_reduce(inum,norm2_functor,my_norm); F_FLOAT norm_sqr = 0.0; MPI_Allreduce(&my_norm, &norm_sqr, 1, MPI_DOUBLE, MPI_SUM, world); @@ -898,7 +898,7 @@ int FixQEqReaxKokkos::cg_solve2() // sig_new = parallel_dot(r, d, nn); F_FLOAT my_dot = 0.0; - FixQEqReaxKokkosDot1Functor dot1_functor(this); + FixQEqReaxFFKokkosDot1Functor dot1_functor(this); Kokkos::parallel_reduce(inum,dot1_functor,my_dot); F_FLOAT dot_sqr = 0.0; MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); @@ -914,17 +914,17 @@ int FixQEqReaxKokkos::cg_solve2() k_d.template sync(); // sparse_matvec(&H, d, q); - FixQEqReaxKokkosSparse22Functor sparse22_functor(this); + FixQEqReaxFFKokkosSparse22Functor sparse22_functor(this); Kokkos::parallel_for(inum,sparse22_functor); if (neighflag != FULL) { Kokkos::parallel_for(Kokkos::RangePolicy(inum,ignum),*this); if (need_dup) dup_o.reset_except(d_o); if (neighflag == HALF) { - FixQEqReaxKokkosSparse23Functor sparse23_functor(this); + FixQEqReaxFFKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); } else if (neighflag == HALFTHREAD) { - FixQEqReaxKokkosSparse23Functor sparse23_functor(this); + FixQEqReaxFFKokkosSparse23Functor sparse23_functor(this); Kokkos::parallel_for(inum,sparse23_functor); } if (need_dup) @@ -941,7 +941,7 @@ int FixQEqReaxKokkos::cg_solve2() // tmp = parallel_dot(d, q, nn); my_dot = dot_sqr = 0.0; - FixQEqReaxKokkosDot2Functor dot2_functor(this); + FixQEqReaxFFKokkosDot2Functor dot2_functor(this); Kokkos::parallel_reduce(inum,dot2_functor,my_dot); MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); tmp = dot_sqr; @@ -953,11 +953,11 @@ int FixQEqReaxKokkos::cg_solve2() // vector_add(t, alpha, d, nn); // vector_add(r, -alpha, q, nn); my_dot = dot_sqr = 0.0; - FixQEqReaxKokkosPrecon2Functor precon2_functor(this); + FixQEqReaxFFKokkosPrecon2Functor precon2_functor(this); Kokkos::parallel_for(inum,precon2_functor); // preconditioning: p[j] = r[j] * Hdia_inv[j]; // sig_new = parallel_dot(r, p, nn); - FixQEqReaxKokkosPreconFunctor precon_functor(this); + FixQEqReaxFFKokkosPreconFunctor precon_functor(this); Kokkos::parallel_reduce(inum,precon_functor,my_dot); MPI_Allreduce(&my_dot, &dot_sqr, 1, MPI_DOUBLE, MPI_SUM, world); sig_new = dot_sqr; @@ -965,12 +965,12 @@ int FixQEqReaxKokkos::cg_solve2() beta = sig_new / sig_old; // vector_sum(d, 1., p, beta, d, nn); - FixQEqReaxKokkosVecSum2Functor vecsum2_functor(this); + FixQEqReaxFFKokkosVecSum2Functor vecsum2_functor(this); Kokkos::parallel_for(inum,vecsum2_functor); } if ((loop >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reax/kk cg_solve2 convergence " + error->warning(FLERR,fmt::format("Fix qeq/reaxff/kk cg_solve2 convergence " "failed after {} iterations at step {}: " "{}", loop, update->ntimestep, sqrt(sig_new)/b_norm)); @@ -980,21 +980,21 @@ int FixQEqReaxKokkos::cg_solve2() /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::calculate_q() +void FixQEqReaxFFKokkos::calculate_q() { F_FLOAT sum, sum_all; const int inum = list->inum; // s_sum = parallel_vector_acc(s, nn); sum = sum_all = 0.0; - FixQEqReaxKokkosVecAcc1Functor vecacc1_functor(this); + FixQEqReaxFFKokkosVecAcc1Functor vecacc1_functor(this); Kokkos::parallel_reduce(inum,vecacc1_functor,sum); MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world); const F_FLOAT s_sum = sum_all; // t_sum = parallel_vector_acc(t, nn); sum = sum_all = 0.0; - FixQEqReaxKokkosVecAcc2Functor vecacc2_functor(this); + FixQEqReaxFFKokkosVecAcc2Functor vecacc2_functor(this); Kokkos::parallel_reduce(inum,vecacc2_functor,sum); MPI_Allreduce(&sum, &sum_all, 1, MPI_DOUBLE, MPI_SUM, world); const F_FLOAT t_sum = sum_all; @@ -1003,7 +1003,7 @@ void FixQEqReaxKokkos::calculate_q() delta = s_sum/t_sum; // q[i] = s[i] - u * t[i]; - FixQEqReaxKokkosCalculateQFunctor calculateQ_functor(this); + FixQEqReaxFFKokkosCalculateQFunctor calculateQ_functor(this); Kokkos::parallel_for(inum,calculateQ_functor); atomKK->modified(execution_space,Q_MASK); @@ -1016,7 +1016,7 @@ void FixQEqReaxKokkos::calculate_q() template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse12_item(int ii) const +void FixQEqReaxFFKokkos::sparse12_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1030,7 +1030,7 @@ void FixQEqReaxKokkos::sparse12_item(int ii) const template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse13_item(int ii) const +void FixQEqReaxFFKokkos::sparse13_item(int ii) const { // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial auto v_o = ScatterViewHelper::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o); @@ -1052,7 +1052,7 @@ void FixQEqReaxKokkos::sparse13_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator() (TagSparseMatvec1, const membertype1 &team) const +void FixQEqReaxFFKokkos::operator() (TagSparseMatvec1, const membertype1 &team) const { const int i = d_ilist[team.league_rank()]; if (mask[i] & groupbit) { @@ -1069,7 +1069,7 @@ void FixQEqReaxKokkos::operator() (TagSparseMatvec1, const membertyp template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse22_item(int ii) const +void FixQEqReaxFFKokkos::sparse22_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1083,7 +1083,7 @@ void FixQEqReaxKokkos::sparse22_item(int ii) const template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse23_item(int ii) const +void FixQEqReaxFFKokkos::sparse23_item(int ii) const { // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial auto v_o = ScatterViewHelper::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o); @@ -1105,7 +1105,7 @@ void FixQEqReaxKokkos::sparse23_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator() (TagSparseMatvec2, const membertype2 &team) const +void FixQEqReaxFFKokkos::operator() (TagSparseMatvec2, const membertype2 &team) const { const int i = d_ilist[team.league_rank()]; if (mask[i] & groupbit) { @@ -1120,7 +1120,7 @@ void FixQEqReaxKokkos::operator() (TagSparseMatvec2, const membertyp template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator() (TagZeroQGhosts, const int &i) const +void FixQEqReaxFFKokkos::operator() (TagZeroQGhosts, const int &i) const { if (mask[i] & groupbit) d_o[i] = 0.0; @@ -1130,7 +1130,7 @@ void FixQEqReaxKokkos::operator() (TagZeroQGhosts, const int &i) con template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse32_item(int ii) const +void FixQEqReaxFFKokkos::sparse32_item(int ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1143,7 +1143,7 @@ void FixQEqReaxKokkos::sparse32_item(int ii) const template template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::sparse33_item(int ii) const +void FixQEqReaxFFKokkos::sparse33_item(int ii) const { // The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial auto v_o = ScatterViewHelper::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o); @@ -1165,7 +1165,7 @@ void FixQEqReaxKokkos::sparse33_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator() (TagSparseMatvec3, const membertype3 &team) const +void FixQEqReaxFFKokkos::operator() (TagSparseMatvec3, const membertype3 &team) const { const int i = d_ilist[team.league_rank()]; if (mask[i] & groupbit) { @@ -1182,7 +1182,7 @@ void FixQEqReaxKokkos::operator() (TagSparseMatvec3, const membertyp template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::vecsum2_item(int ii) const +void FixQEqReaxFFKokkos::vecsum2_item(int ii) const { const int i = d_ilist[ii]; if (mask[i] & groupbit) @@ -1193,7 +1193,7 @@ void FixQEqReaxKokkos::vecsum2_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::norm1_item(int ii) const +double FixQEqReaxFFKokkos::norm1_item(int ii) const { F_FLOAT tmp = 0; const int i = d_ilist[ii]; @@ -1209,7 +1209,7 @@ double FixQEqReaxKokkos::norm1_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::norm2_item(int ii) const +double FixQEqReaxFFKokkos::norm2_item(int ii) const { F_FLOAT tmp = 0; const int i = d_ilist[ii]; @@ -1225,7 +1225,7 @@ double FixQEqReaxKokkos::norm2_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::dot1_item(int ii) const +double FixQEqReaxFFKokkos::dot1_item(int ii) const { F_FLOAT tmp = 0.0; const int i = d_ilist[ii]; @@ -1238,7 +1238,7 @@ double FixQEqReaxKokkos::dot1_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::dot2_item(int ii) const +double FixQEqReaxFFKokkos::dot2_item(int ii) const { double tmp = 0.0; const int i = d_ilist[ii]; @@ -1252,7 +1252,7 @@ double FixQEqReaxKokkos::dot2_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::precon1_item(int ii) const +void FixQEqReaxFFKokkos::precon1_item(int ii) const { const int i = d_ilist[ii]; if (mask[i] & groupbit) { @@ -1265,7 +1265,7 @@ void FixQEqReaxKokkos::precon1_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::precon2_item(int ii) const +void FixQEqReaxFFKokkos::precon2_item(int ii) const { const int i = d_ilist[ii]; if (mask[i] & groupbit) { @@ -1278,7 +1278,7 @@ void FixQEqReaxKokkos::precon2_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::precon_item(int ii) const +double FixQEqReaxFFKokkos::precon_item(int ii) const { F_FLOAT tmp = 0.0; const int i = d_ilist[ii]; @@ -1293,7 +1293,7 @@ double FixQEqReaxKokkos::precon_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::vecacc1_item(int ii) const +double FixQEqReaxFFKokkos::vecacc1_item(int ii) const { F_FLOAT tmp = 0.0; const int i = d_ilist[ii]; @@ -1306,7 +1306,7 @@ double FixQEqReaxKokkos::vecacc1_item(int ii) const template KOKKOS_INLINE_FUNCTION -double FixQEqReaxKokkos::vecacc2_item(int ii) const +double FixQEqReaxFFKokkos::vecacc2_item(int ii) const { F_FLOAT tmp = 0.0; const int i = d_ilist[ii]; @@ -1320,7 +1320,7 @@ double FixQEqReaxKokkos::vecacc2_item(int ii) const template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::calculate_q_item(int ii) const +void FixQEqReaxFFKokkos::calculate_q_item(int ii) const { const int i = d_ilist[ii]; if (mask[i] & groupbit) { @@ -1339,20 +1339,20 @@ void FixQEqReaxKokkos::calculate_q_item(int ii) const /* ---------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::pack_forward_comm_fix_kokkos(int n, DAT::tdual_int_2d k_sendlist, +int FixQEqReaxFFKokkos::pack_forward_comm_fix_kokkos(int n, DAT::tdual_int_2d k_sendlist, int iswap_in, DAT::tdual_xfloat_1d &k_buf, int /*pbc_flag*/, int * /*pbc*/) { d_sendlist = k_sendlist.view(); iswap = iswap_in; d_buf = k_buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); return n; } template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator()(TagFixQEqReaxPackForwardComm, const int &i) const { +void FixQEqReaxFFKokkos::operator()(TagFixQEqReaxFFPackForwardComm, const int &i) const { int j = d_sendlist(iswap, i); if (pack_flag == 1) @@ -1368,11 +1368,11 @@ void FixQEqReaxKokkos::operator()(TagFixQEqReaxPackForwardComm, cons /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::unpack_forward_comm_fix_kokkos(int n, int first_in, DAT::tdual_xfloat_1d &buf) +void FixQEqReaxFFKokkos::unpack_forward_comm_fix_kokkos(int n, int first_in, DAT::tdual_xfloat_1d &buf) { first = first_in; d_buf = buf.view(); - Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); + Kokkos::parallel_for(Kokkos::RangePolicy(0,n),*this); if (pack_flag == 4) atomKK->modified(execution_space,Q_MASK); // needed for auto_sync @@ -1380,7 +1380,7 @@ void FixQEqReaxKokkos::unpack_forward_comm_fix_kokkos(int n, int fir template KOKKOS_INLINE_FUNCTION -void FixQEqReaxKokkos::operator()(TagFixQEqReaxUnpackForwardComm, const int &i) const { +void FixQEqReaxFFKokkos::operator()(TagFixQEqReaxFFUnpackForwardComm, const int &i) const { if (pack_flag == 1) d_d[i + first] = d_buf[i]; else if (pack_flag == 2) @@ -1395,7 +1395,7 @@ void FixQEqReaxKokkos::operator()(TagFixQEqReaxUnpackForwardComm, co /* ---------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::pack_forward_comm(int n, int *list, double *buf, +int FixQEqReaxFFKokkos::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { int m; @@ -1420,7 +1420,7 @@ int FixQEqReaxKokkos::pack_forward_comm(int n, int *list, double *bu /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::unpack_forward_comm(int n, int first, double *buf) +void FixQEqReaxFFKokkos::unpack_forward_comm(int n, int first, double *buf) { int i, m; @@ -1446,7 +1446,7 @@ void FixQEqReaxKokkos::unpack_forward_comm(int n, int first, double /* ---------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::pack_reverse_comm(int n, int first, double *buf) +int FixQEqReaxFFKokkos::pack_reverse_comm(int n, int first, double *buf) { k_o.sync_host(); @@ -1460,7 +1460,7 @@ int FixQEqReaxKokkos::pack_reverse_comm(int n, int first, double *bu /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::unpack_reverse_comm(int n, int *list, double *buf) +void FixQEqReaxFFKokkos::unpack_reverse_comm(int n, int *list, double *buf) { k_o.sync_host(); @@ -1474,7 +1474,7 @@ void FixQEqReaxKokkos::unpack_reverse_comm(int n, int *list, double /* ---------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::cleanup_copy() +void FixQEqReaxFFKokkos::cleanup_copy() { id = style = nullptr; } @@ -1484,7 +1484,7 @@ void FixQEqReaxKokkos::cleanup_copy() ------------------------------------------------------------------------- */ template -double FixQEqReaxKokkos::memory_usage() +double FixQEqReaxFFKokkos::memory_usage() { double bytes; @@ -1502,7 +1502,7 @@ double FixQEqReaxKokkos::memory_usage() ------------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::grow_arrays(int nmax) +void FixQEqReaxFFKokkos::grow_arrays(int nmax) { k_s_hist.template sync(); k_t_hist.template sync(); @@ -1525,7 +1525,7 @@ void FixQEqReaxKokkos::grow_arrays(int nmax) ------------------------------------------------------------------------- */ template -void FixQEqReaxKokkos::copy_arrays(int i, int j, int /*delflag*/) +void FixQEqReaxFFKokkos::copy_arrays(int i, int j, int /*delflag*/) { k_s_hist.template sync(); k_t_hist.template sync(); @@ -1544,7 +1544,7 @@ void FixQEqReaxKokkos::copy_arrays(int i, int j, int /*delflag*/) ------------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::pack_exchange(int i, double *buf) +int FixQEqReaxFFKokkos::pack_exchange(int i, double *buf) { k_s_hist.template sync(); k_t_hist.template sync(); @@ -1559,7 +1559,7 @@ int FixQEqReaxKokkos::pack_exchange(int i, double *buf) ------------------------------------------------------------------------- */ template -int FixQEqReaxKokkos::unpack_exchange(int nlocal, double *buf) +int FixQEqReaxFFKokkos::unpack_exchange(int nlocal, double *buf) { k_s_hist.template sync(); k_t_hist.template sync(); @@ -1576,8 +1576,8 @@ int FixQEqReaxKokkos::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ namespace LAMMPS_NS { -template class FixQEqReaxKokkos; +template class FixQEqReaxFFKokkos; #ifdef LMP_KOKKOS_GPU -template class FixQEqReaxKokkos; +template class FixQEqReaxFFKokkos; #endif } diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.h b/src/KOKKOS/fix_qeq_reaxff_kokkos.h similarity index 75% rename from src/KOKKOS/fix_qeq_reax_kokkos.h rename to src/KOKKOS/fix_qeq_reaxff_kokkos.h index 8485c68122..71c0808b0f 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.h +++ b/src/KOKKOS/fix_qeq_reaxff_kokkos.h @@ -14,16 +14,19 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(qeq/reax/kk,FixQEqReaxKokkos); -FixStyle(qeq/reax/kk/device,FixQEqReaxKokkos); -FixStyle(qeq/reax/kk/host,FixQEqReaxKokkos); +FixStyle(qeq/reaxff/kk,FixQEqReaxFFKokkos); +FixStyle(qeq/reaxff/kk/device,FixQEqReaxFFKokkos); +FixStyle(qeq/reaxff/kk/host,FixQEqReaxFFKokkos); +FixStyle(qeq/reax/kk,FixQEqReaxFFKokkos); +FixStyle(qeq/reax/kk/device,FixQEqReaxFFKokkos); +FixStyle(qeq/reax/kk/host,FixQEqReaxFFKokkos); // clang-format on #else -#ifndef LMP_FIX_QEQ_REAX_KOKKOS_H -#define LMP_FIX_QEQ_REAX_KOKKOS_H +#ifndef LMP_FIX_QEQ_REAXFF_KOKKOS_H +#define LMP_FIX_QEQ_REAXFF_KOKKOS_H -#include "fix_qeq_reax.h" +#include "fix_qeq_reaxff.h" #include "kokkos_type.h" #include "neigh_list.h" #include "neigh_list_kokkos.h" @@ -35,16 +38,16 @@ struct TagSparseMatvec1 {}; struct TagSparseMatvec2 {}; struct TagSparseMatvec3 {}; struct TagZeroQGhosts{}; -struct TagFixQEqReaxPackForwardComm {}; -struct TagFixQEqReaxUnpackForwardComm {}; +struct TagFixQEqReaxFFPackForwardComm {}; +struct TagFixQEqReaxFFUnpackForwardComm {}; template -class FixQEqReaxKokkos : public FixQEqReax, public KokkosBase { +class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase { public: typedef DeviceType device_type; typedef ArrayTypes AT; - FixQEqReaxKokkos(class LAMMPS *, int, char **); - ~FixQEqReaxKokkos(); + FixQEqReaxFFKokkos(class LAMMPS *, int, char **); + ~FixQEqReaxFFKokkos(); void cleanup_copy(); void init(); @@ -141,10 +144,10 @@ class FixQEqReaxKokkos : public FixQEqReax, public KokkosBase { double calculate_H_k(const F_FLOAT &r, const F_FLOAT &shld) const; KOKKOS_INLINE_FUNCTION - void operator()(TagFixQEqReaxPackForwardComm, const int&) const; + void operator()(TagFixQEqReaxFFPackForwardComm, const int&) const; KOKKOS_INLINE_FUNCTION - void operator()(TagFixQEqReaxUnpackForwardComm, const int&) const; + void operator()(TagFixQEqReaxFFUnpackForwardComm, const int&) const; struct params_qeq{ KOKKOS_INLINE_FUNCTION @@ -241,11 +244,11 @@ class FixQEqReaxKokkos : public FixQEqReax, public KokkosBase { }; template -struct FixQEqReaxKokkosNumNeighFunctor { +struct FixQEqReaxFFKokkosNumNeighFunctor { typedef DeviceType device_type ; typedef int value_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosNumNeighFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosNumNeighFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -255,10 +258,10 @@ struct FixQEqReaxKokkosNumNeighFunctor { }; template -struct FixQEqReaxKokkosMatVecFunctor { +struct FixQEqReaxFFKokkosMatVecFunctor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosMatVecFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosMatVecFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -268,17 +271,17 @@ struct FixQEqReaxKokkosMatVecFunctor { }; template -struct FixQEqReaxKokkosComputeHFunctor { +struct FixQEqReaxFFKokkosComputeHFunctor { int atoms_per_team, vector_length; typedef int value_type; typedef Kokkos::ScratchMemorySpace scratch_space; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; - FixQEqReaxKokkosComputeHFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosComputeHFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; - FixQEqReaxKokkosComputeHFunctor(FixQEqReaxKokkos *c_ptr, + FixQEqReaxFFKokkosComputeHFunctor(FixQEqReaxFFKokkos *c_ptr, int _atoms_per_team, int _vector_length) : atoms_per_team(_atoms_per_team), vector_length(_vector_length), c(*c_ptr) { c.cleanup_copy(); @@ -315,10 +318,10 @@ struct FixQEqReaxKokkosComputeHFunctor { }; template -struct FixQEqReaxKokkosZeroFunctor { +struct FixQEqReaxFFKokkosZeroFunctor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosZeroFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosZeroFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -328,10 +331,10 @@ struct FixQEqReaxKokkosZeroFunctor { }; template -struct FixQEqReaxKokkosSparse12Functor { +struct FixQEqReaxFFKokkosSparse12Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse12Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse12Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -341,10 +344,10 @@ struct FixQEqReaxKokkosSparse12Functor { }; template -struct FixQEqReaxKokkosSparse13Functor { +struct FixQEqReaxFFKokkosSparse13Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse13Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse13Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -354,10 +357,10 @@ struct FixQEqReaxKokkosSparse13Functor { }; template -struct FixQEqReaxKokkosSparse22Functor { +struct FixQEqReaxFFKokkosSparse22Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse22Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse22Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -367,10 +370,10 @@ struct FixQEqReaxKokkosSparse22Functor { }; template -struct FixQEqReaxKokkosSparse23Functor { +struct FixQEqReaxFFKokkosSparse23Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse23Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse23Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -380,10 +383,10 @@ struct FixQEqReaxKokkosSparse23Functor { }; template -struct FixQEqReaxKokkosSparse32Functor { +struct FixQEqReaxFFKokkosSparse32Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse32Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse32Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -393,10 +396,10 @@ struct FixQEqReaxKokkosSparse32Functor { }; template -struct FixQEqReaxKokkosSparse33Functor { +struct FixQEqReaxFFKokkosSparse33Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosSparse33Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosSparse33Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -406,10 +409,10 @@ struct FixQEqReaxKokkosSparse33Functor { }; template -struct FixQEqReaxKokkosVecSum2Functor { +struct FixQEqReaxFFKokkosVecSum2Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosVecSum2Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosVecSum2Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -419,11 +422,11 @@ struct FixQEqReaxKokkosVecSum2Functor { }; template -struct FixQEqReaxKokkosNorm1Functor { +struct FixQEqReaxFFKokkosNorm1Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosNorm1Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosNorm1Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -433,11 +436,11 @@ struct FixQEqReaxKokkosNorm1Functor { }; template -struct FixQEqReaxKokkosNorm2Functor { +struct FixQEqReaxFFKokkosNorm2Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosNorm2Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosNorm2Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -447,11 +450,11 @@ struct FixQEqReaxKokkosNorm2Functor { }; template -struct FixQEqReaxKokkosDot1Functor { +struct FixQEqReaxFFKokkosDot1Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosDot1Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosDot1Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -461,11 +464,11 @@ struct FixQEqReaxKokkosDot1Functor { }; template -struct FixQEqReaxKokkosDot2Functor { +struct FixQEqReaxFFKokkosDot2Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosDot2Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosDot2Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -475,10 +478,10 @@ struct FixQEqReaxKokkosDot2Functor { }; template -struct FixQEqReaxKokkosPrecon1Functor { +struct FixQEqReaxFFKokkosPrecon1Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosPrecon1Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosPrecon1Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -488,10 +491,10 @@ struct FixQEqReaxKokkosPrecon1Functor { }; template -struct FixQEqReaxKokkosPrecon2Functor { +struct FixQEqReaxFFKokkosPrecon2Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosPrecon2Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosPrecon2Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -501,11 +504,11 @@ struct FixQEqReaxKokkosPrecon2Functor { }; template -struct FixQEqReaxKokkosPreconFunctor { +struct FixQEqReaxFFKokkosPreconFunctor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosPreconFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosPreconFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -515,11 +518,11 @@ struct FixQEqReaxKokkosPreconFunctor { }; template -struct FixQEqReaxKokkosVecAcc1Functor { +struct FixQEqReaxFFKokkosVecAcc1Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosVecAcc1Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosVecAcc1Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -529,11 +532,11 @@ struct FixQEqReaxKokkosVecAcc1Functor { }; template -struct FixQEqReaxKokkosVecAcc2Functor { +struct FixQEqReaxFFKokkosVecAcc2Functor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; + FixQEqReaxFFKokkos c; typedef double value_type; - FixQEqReaxKokkosVecAcc2Functor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkosVecAcc2Functor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION @@ -543,10 +546,10 @@ struct FixQEqReaxKokkosVecAcc2Functor { }; template -struct FixQEqReaxKokkosCalculateQFunctor { +struct FixQEqReaxFFKokkosCalculateQFunctor { typedef DeviceType device_type ; - FixQEqReaxKokkos c; - FixQEqReaxKokkosCalculateQFunctor(FixQEqReaxKokkos* c_ptr):c(*c_ptr) { + FixQEqReaxFFKokkos c; + FixQEqReaxFFKokkosCalculateQFunctor(FixQEqReaxFFKokkos* c_ptr):c(*c_ptr) { c.cleanup_copy(); }; KOKKOS_INLINE_FUNCTION diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp b/src/KOKKOS/fix_reaxff_bonds_kokkos.cpp similarity index 69% rename from src/KOKKOS/fix_reaxc_bonds_kokkos.cpp rename to src/KOKKOS/fix_reaxff_bonds_kokkos.cpp index 3da59ce972..2fc7d4639d 100644 --- a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp +++ b/src/KOKKOS/fix_reaxff_bonds_kokkos.cpp @@ -16,22 +16,22 @@ Contributing author: Stan Moore (Sandia) ------------------------------------------------------------------------- */ -#include "fix_reaxc_bonds_kokkos.h" +#include "fix_reaxff_bonds_kokkos.h" #include "atom.h" #include "atom_masks.h" #include "error.h" #include "force.h" #include "memory_kokkos.h" -#include "pair_reaxc_kokkos.h" +#include "pair_reaxff_kokkos.h" using namespace LAMMPS_NS; using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixReaxCBondsKokkos::FixReaxCBondsKokkos(LAMMPS *lmp, int narg, char **arg) : - FixReaxCBonds(lmp, narg, arg) +FixReaxFFBondsKokkos::FixReaxFFBondsKokkos(LAMMPS *lmp, int narg, char **arg) : + FixReaxFFBonds(lmp, narg, arg) { kokkosable = 1; atomKK = (AtomKokkos *) atom; @@ -42,25 +42,25 @@ FixReaxCBondsKokkos::FixReaxCBondsKokkos(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixReaxCBondsKokkos::~FixReaxCBondsKokkos() +FixReaxFFBondsKokkos::~FixReaxFFBondsKokkos() { } /* ---------------------------------------------------------------------- */ -void FixReaxCBondsKokkos::init() +void FixReaxFFBondsKokkos::init() { - Pair *pair_kk = force->pair_match("reax/c/kk",0); - if (pair_kk == nullptr) error->all(FLERR,"Cannot use fix reax/c/bonds without " - "pair_style reax/c/kk"); + Pair *pair_kk = force->pair_match("^reax../kk",0); + if (pair_kk == nullptr) error->all(FLERR,"Cannot use fix reaxff/bonds without " + "pair_style reaxff/kk"); - FixReaxCBonds::init(); + FixReaxFFBonds::init(); } /* ---------------------------------------------------------------------- */ -void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/) +void FixReaxFFBondsKokkos::Output_ReaxFF_Bonds() { int nbuf_local; @@ -72,23 +72,23 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/ int nlocal_tot = static_cast (atom->natoms); numbonds = 0; - if (reaxc->execution_space == Device) - ((PairReaxCKokkos*) reaxc)->FindBond(numbonds); + if (reaxff->execution_space == Device) + ((PairReaxFFKokkos*) reaxff)->FindBond(numbonds); else - ((PairReaxCKokkos*) reaxc)->FindBond(numbonds); + ((PairReaxFFKokkos*) reaxff)->FindBond(numbonds); // allocate a temporary buffer for the snapshot info MPI_Allreduce(&numbonds,&numbonds_max,1,MPI_INT,MPI_MAX,world); MPI_Allreduce(&nlocal,&nlocal_max,1,MPI_INT,MPI_MAX,world); nbuf = 1+(numbonds_max*2+10)*nlocal_max; - memoryKK->create_kokkos(k_buf,buf,nbuf,"reax/c/bonds:buf"); + memoryKK->create_kokkos(k_buf,buf,nbuf,"reaxff/bonds:buf"); // Pass information to buffer - if (reaxc->execution_space == Device) - ((PairReaxCKokkos*) reaxc)->PackBondBuffer(k_buf,nbuf_local); + if (reaxff->execution_space == Device) + ((PairReaxFFKokkos*) reaxff)->PackBondBuffer(k_buf,nbuf_local); else - ((PairReaxCKokkos*) reaxc)->PackBondBuffer(k_buf,nbuf_local); + ((PairReaxFFKokkos*) reaxff)->PackBondBuffer(k_buf,nbuf_local); buf[0] = nlocal; // Receive information from buffer for output @@ -99,12 +99,12 @@ void FixReaxCBondsKokkos::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/ /* ---------------------------------------------------------------------- */ -double FixReaxCBondsKokkos::memory_usage() +double FixReaxFFBondsKokkos::memory_usage() { double bytes; bytes = nbuf*sizeof(double); - // These are accounted for in PairReaxCKokkos: + // These are accounted for in PairReaxFFKokkos: //bytes += nmax*sizeof(int); //bytes += 1.0*nmax*MAXREAXBOND*sizeof(double); //bytes += 1.0*nmax*MAXREAXBOND*sizeof(int); diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.h b/src/KOKKOS/fix_reaxff_bonds_kokkos.h similarity index 59% rename from src/KOKKOS/fix_reaxc_bonds_kokkos.h rename to src/KOKKOS/fix_reaxff_bonds_kokkos.h index 8c1bb9bef9..b1203e472d 100644 --- a/src/KOKKOS/fix_reaxc_bonds_kokkos.h +++ b/src/KOKKOS/fix_reaxff_bonds_kokkos.h @@ -14,29 +14,32 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(reax/c/bonds/kk,FixReaxCBondsKokkos); -FixStyle(reax/c/bonds/kk/device,FixReaxCBondsKokkos); -FixStyle(reax/c/bonds/kk/host,FixReaxCBondsKokkos); +FixStyle(reaxff/bonds/kk,FixReaxFFBondsKokkos); +FixStyle(reaxff/bonds/kk/device,FixReaxFFBondsKokkos); +FixStyle(reaxff/bonds/kk/host,FixReaxFFBondsKokkos); +FixStyle(reax/c/bonds/kk,FixReaxFFBondsKokkos); +FixStyle(reax/c/bonds/kk/device,FixReaxFFBondsKokkos); +FixStyle(reax/c/bonds/kk/host,FixReaxFFBondsKokkos); // clang-format on #else -#ifndef LMP_FIX_REAXC_BONDS_KOKKOS_H -#define LMP_FIX_REAXC_BONDS_KOKKOS_H +#ifndef LMP_FIX_REAXFF_BONDS_KOKKOS_H +#define LMP_FIX_REAXFF_BONDS_KOKKOS_H -#include "fix_reaxc_bonds.h" +#include "fix_reaxff_bonds.h" #include "kokkos_type.h" namespace LAMMPS_NS { -class FixReaxCBondsKokkos : public FixReaxCBonds { +class FixReaxFFBondsKokkos : public FixReaxFFBonds { public: - FixReaxCBondsKokkos(class LAMMPS *, int, char **); - virtual ~FixReaxCBondsKokkos(); + FixReaxFFBondsKokkos(class LAMMPS *, int, char **); + virtual ~FixReaxFFBondsKokkos(); void init(); private: int nbuf; - void Output_ReaxC_Bonds(bigint, FILE *); + void Output_ReaxFF_Bonds() double memory_usage(); }; } diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.cpp b/src/KOKKOS/fix_reaxff_species_kokkos.cpp similarity index 83% rename from src/KOKKOS/fix_reaxc_species_kokkos.cpp rename to src/KOKKOS/fix_reaxff_species_kokkos.cpp index 9d01164b6f..d3d913eda8 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp +++ b/src/KOKKOS/fix_reaxff_species_kokkos.cpp @@ -16,7 +16,7 @@ Contributing authors: Stan Moore (Sandia) ------------------------------------------------------------------------- */ -#include "fix_reaxc_species_kokkos.h" +#include "fix_reaxff_species_kokkos.h" #include "atom.h" #include "atom_masks.h" @@ -29,7 +29,7 @@ #include "neigh_request.h" #include "fix_ave_atom.h" -#include "pair_reaxc_kokkos.h" +#include "pair_reaxff_kokkos.h" #include "reaxff_defs.h" using namespace LAMMPS_NS; @@ -37,8 +37,8 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixReaxCSpeciesKokkos::FixReaxCSpeciesKokkos(LAMMPS *lmp, int narg, char **arg) : - FixReaxCSpecies(lmp, narg, arg) +FixReaxFFSpeciesKokkos::FixReaxFFSpeciesKokkos(LAMMPS *lmp, int narg, char **arg) : + FixReaxFFSpecies(lmp, narg, arg) { kokkosable = 1; atomKK = (AtomKokkos *) atom; @@ -51,25 +51,25 @@ FixReaxCSpeciesKokkos::FixReaxCSpeciesKokkos(LAMMPS *lmp, int narg, char **arg) /* ---------------------------------------------------------------------- */ -FixReaxCSpeciesKokkos::~FixReaxCSpeciesKokkos() +FixReaxFFSpeciesKokkos::~FixReaxFFSpeciesKokkos() { } /* ---------------------------------------------------------------------- */ -void FixReaxCSpeciesKokkos::init() +void FixReaxFFSpeciesKokkos::init() { - Pair* pair_kk = force->pair_match("reax/c/kk",0); - if (pair_kk == nullptr) error->all(FLERR,"Cannot use fix reax/c/species/kk without " - "pair_style reax/c/kk"); + Pair* pair_kk = force->pair_match("^reax../kk",0); + if (pair_kk == nullptr) error->all(FLERR,"Cannot use fix reaxff/species/kk without " + "pair_style reaxff/kk"); - FixReaxCSpecies::init(); + FixReaxFFSpecies::init(); } /* ---------------------------------------------------------------------- */ -void FixReaxCSpeciesKokkos::FindMolecule() +void FixReaxFFSpeciesKokkos::FindMolecule() { int i,j,ii,jj,inum,itype,jtype,loop,looptot; int change,done,anychange; @@ -77,14 +77,14 @@ void FixReaxCSpeciesKokkos::FindMolecule() double bo_tmp,bo_cut; double **spec_atom = f_SPECBOND->array_atom; - inum = reaxc->list->inum; + inum = reaxff->list->inum; typename ArrayTypes::t_int_1d ilist; - if (reaxc->execution_space == Host) { - NeighListKokkos* k_list = static_cast*>(reaxc->list); + if (reaxff->execution_space == Host) { + NeighListKokkos* k_list = static_cast*>(reaxff->list); k_list->k_ilist.sync(); ilist = k_list->k_ilist.h_view; } else { - NeighListKokkos* k_list = static_cast*>(reaxc->list); + NeighListKokkos* k_list = static_cast*>(reaxff->list); k_list->k_ilist.sync(); ilist = k_list->k_ilist.h_view; } @@ -116,7 +116,7 @@ void FixReaxCSpeciesKokkos::FindMolecule() itype = atom->type[i]; for (jj = 0; jj < MAXSPECBOND; jj++) { - j = reaxc->tmpid[i][jj]; + j = reaxff->tmpid[i][jj]; if ((j == 0) && (j < i)) continue; if (!(mask[j] & groupbit)) continue; diff --git a/src/KOKKOS/fix_reaxc_species_kokkos.h b/src/KOKKOS/fix_reaxff_species_kokkos.h similarity index 58% rename from src/KOKKOS/fix_reaxc_species_kokkos.h rename to src/KOKKOS/fix_reaxff_species_kokkos.h index 1a5f204132..ad9d02319d 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.h +++ b/src/KOKKOS/fix_reaxff_species_kokkos.h @@ -14,25 +14,28 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(reax/c/species/kk,FixReaxCSpeciesKokkos); -FixStyle(reax/c/species/kk/device,FixReaxCSpeciesKokkos); -FixStyle(reax/c/species/kk/host,FixReaxCSpeciesKokkos); +FixStyle(reaxff/species/kk,FixReaxFFSpeciesKokkos); +FixStyle(reaxff/species/kk/device,FixReaxFFSpeciesKokkos); +FixStyle(reaxff/species/kk/host,FixReaxFFSpeciesKokkos); +FixStyle(reax/c/species/kk,FixReaxFFSpeciesKokkos); +FixStyle(reax/c/species/kk/device,FixReaxFFSpeciesKokkos); +FixStyle(reax/c/species/kk/host,FixReaxFFSpeciesKokkos); // clang-format on #else -#ifndef LMP_FIX_REAXC_SPECIES_KOKKOS_H -#define LMP_FIX_REAXC_SPECIES_KOKKOS_H +#ifndef LMP_FIX_REAXFF_SPECIES_KOKKOS_H +#define LMP_FIX_REAXFF_SPECIES_KOKKOS_H -#include "fix_reaxc_species.h" +#include "fix_reaxff_species.h" #define BUFLEN 1000 namespace LAMMPS_NS { -class FixReaxCSpeciesKokkos : public FixReaxCSpecies { +class FixReaxFFSpeciesKokkos : public FixReaxFFSpecies { public: - FixReaxCSpeciesKokkos(class LAMMPS *, int, char **); - virtual ~FixReaxCSpeciesKokkos(); + FixReaxFFSpeciesKokkos(class LAMMPS *, int, char **); + virtual ~FixReaxFFSpeciesKokkos(); void init(); private: diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp similarity index 91% rename from src/KOKKOS/pair_reaxc_kokkos.cpp rename to src/KOKKOS/pair_reaxff_kokkos.cpp index 266a8b09f9..6e49b5081c 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -16,7 +16,7 @@ Contributing author: Ray Shan (SNL), Stan Moore (SNL) ------------------------------------------------------------------------- */ -#include "pair_reaxc_kokkos.h" +#include "pair_reaxff_kokkos.h" #include "atom_kokkos.h" #include "atom_masks.h" @@ -44,7 +44,7 @@ using namespace MathConst; using namespace MathSpecial; template -PairReaxCKokkos::PairReaxCKokkos(LAMMPS *lmp) : PairReaxC(lmp) +PairReaxFFKokkos::PairReaxFFKokkos(LAMMPS *lmp) : PairReaxFF(lmp) { respa_enable = 0; @@ -73,7 +73,7 @@ PairReaxCKokkos::PairReaxCKokkos(LAMMPS *lmp) : PairReaxC(lmp) /* ---------------------------------------------------------------------- */ template -PairReaxCKokkos::~PairReaxCKokkos() +PairReaxFFKokkos::~PairReaxFFKokkos() { if (copymode) return; @@ -100,28 +100,28 @@ PairReaxCKokkos::~PairReaxCKokkos() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::allocate() +void PairReaxFFKokkos::allocate() { int n = atom->ntypes; k_params_sing = Kokkos::DualView - ("PairReaxC::params_sing",n+1); + ("PairReaxFF::params_sing",n+1); paramssing = k_params_sing.template view(); k_params_twbp = Kokkos::DualView - ("PairReaxC::params_twbp",n+1,n+1); + ("PairReaxFF::params_twbp",n+1,n+1); paramstwbp = k_params_twbp.template view(); k_params_thbp = Kokkos::DualView - ("PairReaxC::params_thbp",n+1,n+1,n+1); + ("PairReaxFF::params_thbp",n+1,n+1,n+1); paramsthbp = k_params_thbp.template view(); k_params_fbp = Kokkos::DualView - ("PairReaxC::params_fbp",n+1,n+1,n+1,n+1); + ("PairReaxFF::params_fbp",n+1,n+1,n+1,n+1); paramsfbp = k_params_fbp.template view(); k_params_hbp = Kokkos::DualView - ("PairReaxC::params_hbp",n+1,n+1,n+1); + ("PairReaxFF::params_hbp",n+1,n+1,n+1); paramshbp = k_params_hbp.template view(); k_tap = DAT::tdual_ffloat_1d("pair:tap",8); @@ -135,9 +135,9 @@ void PairReaxCKokkos::allocate() ------------------------------------------------------------------------- */ template -void PairReaxCKokkos::init_style() +void PairReaxFFKokkos::init_style() { - PairReaxC::init_style(); + PairReaxFF::init_style(); if (fix_reax) modify->delete_fix(fix_id); // not needed in the Kokkos version fix_reax = nullptr; @@ -157,7 +157,7 @@ void PairReaxCKokkos::init_style() neighbor->requests[irequest]->half = 1; neighbor->requests[irequest]->ghost = 1; } else { - error->all(FLERR,"Must use half neighbor list with pair style reax/c/kk"); + error->all(FLERR,"Must use half neighbor list with pair style reaxff/kk"); } allocate(); @@ -168,7 +168,7 @@ void PairReaxCKokkos::init_style() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::setup() +void PairReaxFFKokkos::setup() { int i,j,k,m; int n = atom->ntypes; @@ -335,7 +335,7 @@ void PairReaxCKokkos::setup() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::init_md() +void PairReaxFFKokkos::init_md() { // init_taper() F_FLOAT d1, d7, swa, swa2, swa3, swb, swb2, swb3; @@ -430,7 +430,7 @@ void PairReaxCKokkos::init_md() /* ---------------------------------------------------------------------- */ template -int PairReaxCKokkos::Init_Lookup_Tables() +int PairReaxFFKokkos::Init_Lookup_Tables() { int i, j, r; int num_atom_types; @@ -538,7 +538,7 @@ int PairReaxCKokkos::Init_Lookup_Tables() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::Deallocate_Lookup_Tables() +void PairReaxFFKokkos::Deallocate_Lookup_Tables() { int i, j; int ntypes; @@ -567,7 +567,7 @@ void PairReaxCKokkos::Deallocate_Lookup_Tables() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::LR_vdW_Coulomb(int i, int j, double r_ij, LR_data *lr) +void PairReaxFFKokkos::LR_vdW_Coulomb(int i, int j, double r_ij, LR_data *lr) { double p_vdW1 = api->system->reax_param.gp.l[28]; double p_vdW1i = 1.0 / p_vdW1; @@ -663,7 +663,7 @@ void PairReaxCKokkos::LR_vdW_Coulomb(int i, int j, double r_ij, LR_d /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::compute(int eflag_in, int vflag_in) +void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) { copymode = 1; @@ -724,14 +724,14 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Polarization (self) if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } ev_all += ev; pvector[13] = ev.ecoul; @@ -740,26 +740,26 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) if (api->control->tabulate) { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } else { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } ev_all += ev; @@ -853,34 +853,34 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Bond energy if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; pvector[0] = ev.evdwl; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; pvector[0] = ev.evdwl; } // Multi-body corrections if (neighflag == HALF) { - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[2] = ev.ereax[0]; @@ -891,15 +891,15 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Angular if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[4] = ev.ereax[3]; @@ -910,15 +910,15 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) // Torsion if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[8] = ev.ereax[6]; @@ -929,15 +929,15 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) if (cut_hbsq > 0.0) { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } } @@ -969,9 +969,9 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) //} if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); ev_all += ev; pvector[0] += ev.evdwl; } else { //if (neighflag == HALFTHREAD) { @@ -985,9 +985,9 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) //} if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); ev_all += ev; pvector[0] += ev.evdwl; } @@ -1049,7 +1049,7 @@ void PairReaxCKokkos::compute(int eflag_in, int vflag_in) template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputePolar, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputePolar, const int &ii, EV_FLOAT_REAX& ev) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1067,9 +1067,9 @@ void PairReaxCKokkos::operator()(PairReaxComputePolar template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputePolar, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputePolar, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputePolar(), ii, ev); + this->template operator()(PairReaxFFomputePolar(), ii, ev); } @@ -1078,7 +1078,7 @@ void PairReaxCKokkos::operator()(PairReaxComputePolar template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { // The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial @@ -1220,9 +1220,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeLJCoulomb template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeLJCoulomb, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeLJCoulomb(), ii, ev); + this->template operator()(PairReaxFFomputeLJCoulomb(), ii, ev); } /* ---------------------------------------------------------------------- */ @@ -1230,7 +1230,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeLJCoulomb template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeTabulatedLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { // The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial @@ -1327,84 +1327,84 @@ void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeTabulatedLJCoulomb, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeTabulatedLJCoulomb(), ii, ev); + this->template operator()(PairReaxFFomputeTabulatedLJCoulomb(), ii, ev); } /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::allocate_array() +void PairReaxFFKokkos::allocate_array() { if (cut_hbsq > 0.0) { - d_hb_first = typename AT::t_int_1d("reax/c/kk:hb_first",nmax); - d_hb_num = typename AT::t_int_1d("reax/c/kk:hb_num",nmax); - d_hb_list = typename AT::t_int_1d("reax/c/kk:hb_list",nmax*maxhb); + d_hb_first = typename AT::t_int_1d("reaxff/kk:hb_first",nmax); + d_hb_num = typename AT::t_int_1d("reaxff/kk:hb_num",nmax); + d_hb_list = typename AT::t_int_1d("reaxff/kk:hb_list",nmax*maxhb); } - d_bo_first = typename AT::t_int_1d("reax/c/kk:bo_first",nmax); - d_bo_num = typename AT::t_int_1d("reax/c/kk:bo_num",nmax); - d_bo_list = typename AT::t_int_1d("reax/c/kk:bo_list",nmax*maxbo); + d_bo_first = typename AT::t_int_1d("reaxff/kk:bo_first",nmax); + d_bo_num = typename AT::t_int_1d("reaxff/kk:bo_num",nmax); + d_bo_list = typename AT::t_int_1d("reaxff/kk:bo_list",nmax*maxbo); - d_BO = typename AT::t_ffloat_2d_dl("reax/c/kk:BO",nmax,maxbo); - d_BO_s = typename AT::t_ffloat_2d_dl("reax/c/kk:BO",nmax,maxbo); - d_BO_pi = typename AT::t_ffloat_2d_dl("reax/c/kk:BO_pi",nmax,maxbo); - d_BO_pi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:BO_pi2",nmax,maxbo); + d_BO = typename AT::t_ffloat_2d_dl("reaxff/kk:BO",nmax,maxbo); + d_BO_s = typename AT::t_ffloat_2d_dl("reaxff/kk:BO",nmax,maxbo); + d_BO_pi = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi",nmax,maxbo); + d_BO_pi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:BO_pi2",nmax,maxbo); - d_dln_BOp_pix = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_pix",nmax,maxbo); - d_dln_BOp_piy = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_piy",nmax,maxbo); - d_dln_BOp_piz = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_piz",nmax,maxbo); + d_dln_BOp_pix = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pix",nmax,maxbo); + d_dln_BOp_piy = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piy",nmax,maxbo); + d_dln_BOp_piz = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_piz",nmax,maxbo); - d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_pi2x",nmax,maxbo); - d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_pi2y",nmax,maxbo); - d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl("reax/c/kk:d_dln_BOp_pi2z",nmax,maxbo); + d_dln_BOp_pi2x = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2x",nmax,maxbo); + d_dln_BOp_pi2y = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2y",nmax,maxbo); + d_dln_BOp_pi2z = typename AT::t_ffloat_2d_dl("reaxff/kk:d_dln_BOp_pi2z",nmax,maxbo); - d_C1dbo = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C1dbo",nmax,maxbo); - d_C2dbo = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C2dbo",nmax,maxbo); - d_C3dbo = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C3dbo",nmax,maxbo); + d_C1dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C1dbo",nmax,maxbo); + d_C2dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C2dbo",nmax,maxbo); + d_C3dbo = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C3dbo",nmax,maxbo); - d_C1dbopi = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C1dbopi",nmax,maxbo); - d_C2dbopi = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C2dbopi",nmax,maxbo); - d_C3dbopi = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C3dbopi",nmax,maxbo); - d_C4dbopi = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C4dbopi",nmax,maxbo); + d_C1dbopi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C1dbopi",nmax,maxbo); + d_C2dbopi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C2dbopi",nmax,maxbo); + d_C3dbopi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C3dbopi",nmax,maxbo); + d_C4dbopi = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C4dbopi",nmax,maxbo); - d_C1dbopi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C1dbopi2",nmax,maxbo); - d_C2dbopi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C2dbopi2",nmax,maxbo); - d_C3dbopi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C3dbopi2",nmax,maxbo); - d_C4dbopi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:d_C4dbopi2",nmax,maxbo); + d_C1dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C1dbopi2",nmax,maxbo); + d_C2dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C2dbopi2",nmax,maxbo); + d_C3dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C3dbopi2",nmax,maxbo); + d_C4dbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:d_C4dbopi2",nmax,maxbo); - d_dBOpx = typename AT::t_ffloat_2d_dl("reax/c/kk:dBOpx",nmax,maxbo); - d_dBOpy = typename AT::t_ffloat_2d_dl("reax/c/kk:dBOpy",nmax,maxbo); - d_dBOpz = typename AT::t_ffloat_2d_dl("reax/c/kk:dBOpz",nmax,maxbo); + d_dBOpx = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpx",nmax,maxbo); + d_dBOpy = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpy",nmax,maxbo); + d_dBOpz = typename AT::t_ffloat_2d_dl("reaxff/kk:dBOpz",nmax,maxbo); - d_dDeltap_self = typename AT::t_ffloat_2d_dl("reax/c/kk:dDeltap_self",nmax,3); - d_Deltap_boc = typename AT::t_ffloat_1d("reax/c/kk:Deltap_boc",nmax); - d_Deltap = typename AT::t_ffloat_1d("reax/c/kk:Deltap",nmax); - d_total_bo = typename AT::t_ffloat_1d("reax/c/kk:total_bo",nmax); + d_dDeltap_self = typename AT::t_ffloat_2d_dl("reaxff/kk:dDeltap_self",nmax,3); + d_Deltap_boc = typename AT::t_ffloat_1d("reaxff/kk:Deltap_boc",nmax); + d_Deltap = typename AT::t_ffloat_1d("reaxff/kk:Deltap",nmax); + d_total_bo = typename AT::t_ffloat_1d("reaxff/kk:total_bo",nmax); - d_Cdbo = typename AT::t_ffloat_2d_dl("reax/c/kk:Cdbo",nmax,3*maxbo); - d_Cdbopi = typename AT::t_ffloat_2d_dl("reax/c/kk:Cdbopi",nmax,3*maxbo); - d_Cdbopi2 = typename AT::t_ffloat_2d_dl("reax/c/kk:Cdbopi2",nmax,3*maxbo); + d_Cdbo = typename AT::t_ffloat_2d_dl("reaxff/kk:Cdbo",nmax,3*maxbo); + d_Cdbopi = typename AT::t_ffloat_2d_dl("reaxff/kk:Cdbopi",nmax,3*maxbo); + d_Cdbopi2 = typename AT::t_ffloat_2d_dl("reaxff/kk:Cdbopi2",nmax,3*maxbo); - d_Delta = typename AT::t_ffloat_1d("reax/c/kk:Delta",nmax); - d_Delta_boc = typename AT::t_ffloat_1d("reax/c/kk:Delta_boc",nmax); - d_dDelta_lp = typename AT::t_ffloat_1d("reax/c/kk:dDelta_lp",nmax); - d_Delta_lp = typename AT::t_ffloat_1d("reax/c/kk:Delta_lp",nmax); - d_Delta_lp_temp = typename AT::t_ffloat_1d("reax/c/kk:Delta_lp_temp",nmax); - d_CdDelta = typename AT::t_ffloat_1d("reax/c/kk:CdDelta",nmax); - d_sum_ovun = typename AT::t_ffloat_2d_dl("reax/c/kk:sum_ovun",nmax,3); + d_Delta = typename AT::t_ffloat_1d("reaxff/kk:Delta",nmax); + d_Delta_boc = typename AT::t_ffloat_1d("reaxff/kk:Delta_boc",nmax); + d_dDelta_lp = typename AT::t_ffloat_1d("reaxff/kk:dDelta_lp",nmax); + d_Delta_lp = typename AT::t_ffloat_1d("reaxff/kk:Delta_lp",nmax); + d_Delta_lp_temp = typename AT::t_ffloat_1d("reaxff/kk:Delta_lp_temp",nmax); + d_CdDelta = typename AT::t_ffloat_1d("reaxff/kk:CdDelta",nmax); + d_sum_ovun = typename AT::t_ffloat_2d_dl("reaxff/kk:sum_ovun",nmax,3); - // FixReaxCBonds - d_abo = typename AT::t_ffloat_2d("reax/c/kk:abo",nmax,maxbo); - d_neighid = typename AT::t_tagint_2d("reax/c/kk:neighid",nmax,maxbo); - d_numneigh_bonds = typename AT::t_int_1d("reax/c/kk:numneigh_bonds",nmax); + // FixReaxFFBonds + d_abo = typename AT::t_ffloat_2d("reaxff/kk:abo",nmax,maxbo); + d_neighid = typename AT::t_tagint_2d("reaxff/kk:neighid",nmax,maxbo); + d_numneigh_bonds = typename AT::t_int_1d("reaxff/kk:numneigh_bonds",nmax); } /* ---------------------------------------------------------------------- */ template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxZero, const int &n) const { +void PairReaxFFKokkos::operator()(PairReaxZero, const int &n) const { d_total_bo(n) = 0.0; d_CdDelta(n) = 0.0; d_bo_num(n) = 0.0; @@ -1415,13 +1415,13 @@ void PairReaxCKokkos::operator()(PairReaxZero, const int &n) const { template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxZeroEAtom, const int &i) const { +void PairReaxFFKokkos::operator()(PairReaxZeroEAtom, const int &i) const { d_eatom(i) = 0.0; } template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxZeroVAtom, const int &i) const { +void PairReaxFFKokkos::operator()(PairReaxZeroVAtom, const int &i) const { d_vatom(i,0) = 0.0; d_vatom(i,1) = 0.0; d_vatom(i,2) = 0.0; @@ -1434,7 +1434,7 @@ void PairReaxCKokkos::operator()(PairReaxZeroVAtom, const int &i) co template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxBuildListsFull, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxBuildListsFull, const int &ii) const { if (d_resize_bo() || d_resize_hb()) return; @@ -1592,7 +1592,7 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsFull, const int & template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxBuildListsHalf, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxBuildListsHalf, const int &ii) const { if (d_resize_bo() || d_resize_hb()) return; @@ -1805,7 +1805,7 @@ void PairReaxCKokkos::operator()(PairReaxBuildListsHalf, template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxBondOrder1, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxBondOrder1, const int &ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1819,7 +1819,7 @@ void PairReaxCKokkos::operator()(PairReaxBondOrder1, const int &ii) template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxBondOrder2, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxBondOrder2, const int &ii) const { F_FLOAT exp_p1i, exp_p2i, exp_p1j, exp_p2j, f1, f2, f3, u1_ij, u1_ji, Cf1A_ij, Cf1B_ij, Cf1_ij, Cf1_ji; F_FLOAT f4, f5, exp_f4, exp_f5, f4f5, Cf45_ij, Cf45_ji; @@ -1953,7 +1953,7 @@ void PairReaxCKokkos::operator()(PairReaxBondOrder2, const int &ii) template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxBondOrder3, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxBondOrder3, const int &ii) const { // bot part of BO() const int i = d_ilist[ii]; @@ -1989,7 +1989,7 @@ void PairReaxCKokkos::operator()(PairReaxBondOrder3, const int &ii) template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeMulti1, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti1, const int &ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -2023,7 +2023,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti1 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeMulti2, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2, const int &ii, EV_FLOAT_REAX& ev) const { auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access::value>(); @@ -2164,9 +2164,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeMulti2, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeMulti2(), ii, ev); + this->template operator()(PairReaxFFomputeMulti2(), ii, ev); } @@ -2175,7 +2175,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeAngular, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2476,9 +2476,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeAngular, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeAngular(), ii, ev); + this->template operator()(PairReaxFFomputeAngular(), ii, ev); } @@ -2487,7 +2487,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeAngular template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeTorsion, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2497,7 +2497,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeTorsion::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; //auto a_Cdbo = dup_Cdbo.template access::value>(); - // in reaxc_torsion_angles: j = i, k = j, i = k; + // in reaxff_torsion_angles: j = i, k = j, i = k; F_FLOAT Delta_i, Delta_j, bo_ij, bo_ik, bo_jl, BOA_ij, BOA_ik, BOA_jl; F_FLOAT p_tor1, p_cot1, V1, V2, V3; @@ -2851,9 +2851,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeTorsion template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeTorsion, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeTorsion(), ii, ev); + this->template operator()(PairReaxFFomputeTorsion(), ii, ev); } @@ -2862,7 +2862,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeTorsion template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeHydrogen, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeHydrogen, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2998,9 +2998,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeHydrogen template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeHydrogen, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeHydrogen, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeHydrogen(), ii, ev); + this->template operator()(PairReaxFFomputeHydrogen(), ii, ev); } @@ -3009,7 +3009,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeHydrogen template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxUpdateBond, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxUpdateBond, const int &ii) const { Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbo = d_Cdbo; Kokkos::View::value,Kokkos::MemoryTraits::value> > a_Cdbopi = d_Cdbopi; @@ -3061,7 +3061,7 @@ void PairReaxCKokkos::operator()(PairReaxUpdateBond, cons template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeBond1, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); @@ -3168,9 +3168,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeBond1 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeBond1, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeBond1(), ii, ev); + this->template operator()(PairReaxFFomputeBond1(), ii, ev); } @@ -3179,7 +3179,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeBond1 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeBond2, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeBond2, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -3369,9 +3369,9 @@ void PairReaxCKokkos::operator()(PairReaxComputeBond2 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxComputeBond2, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFomputeBond2, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxComputeBond2(), ii, ev); + this->template operator()(PairReaxFFomputeBond2(), ii, ev); } @@ -3380,7 +3380,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeBond2 template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::ev_tally(EV_FLOAT_REAX &ev, const int &i, const int &j, +void PairReaxFFKokkos::ev_tally(EV_FLOAT_REAX &ev, const int &i, const int &j, const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, const F_FLOAT &dely, const F_FLOAT &delz) const { @@ -3439,7 +3439,7 @@ void PairReaxCKokkos::ev_tally(EV_FLOAT_REAX &ev, const int &i, cons template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::e_tally(EV_FLOAT_REAX & /*ev*/, const int &i, const int &j, +void PairReaxFFKokkos::e_tally(EV_FLOAT_REAX & /*ev*/, const int &i, const int &j, const F_FLOAT &epair) const { @@ -3461,7 +3461,7 @@ void PairReaxCKokkos::e_tally(EV_FLOAT_REAX & /*ev*/, const int &i, template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::e_tally_single(EV_FLOAT_REAX & /*ev*/, const int &i, +void PairReaxFFKokkos::e_tally_single(EV_FLOAT_REAX & /*ev*/, const int &i, const F_FLOAT &epair) const { // The eatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial @@ -3476,7 +3476,7 @@ void PairReaxCKokkos::e_tally_single(EV_FLOAT_REAX & /*ev*/, const i template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::v_tally(EV_FLOAT_REAX &ev, const int &i, +void PairReaxFFKokkos::v_tally(EV_FLOAT_REAX &ev, const int &i, F_FLOAT *fi, F_FLOAT *drij) const { @@ -3512,7 +3512,7 @@ void PairReaxCKokkos::v_tally(EV_FLOAT_REAX &ev, const int &i, template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::v_tally3(EV_FLOAT_REAX &ev, const int &i, const int &j, const int &k, +void PairReaxFFKokkos::v_tally3(EV_FLOAT_REAX &ev, const int &i, const int &j, const int &k, F_FLOAT *fj, F_FLOAT *fk, F_FLOAT *drij, F_FLOAT *drik) const { @@ -3554,7 +3554,7 @@ void PairReaxCKokkos::v_tally3(EV_FLOAT_REAX &ev, const int &i, cons template template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::v_tally4(EV_FLOAT_REAX &ev, const int &i, const int &j, const int &k, +void PairReaxFFKokkos::v_tally4(EV_FLOAT_REAX &ev, const int &i, const int &j, const int &k, const int &l, F_FLOAT *fi, F_FLOAT *fj, F_FLOAT *fk, F_FLOAT *dril, F_FLOAT *drjl, F_FLOAT *drkl) const { @@ -3598,7 +3598,7 @@ void PairReaxCKokkos::v_tally4(EV_FLOAT_REAX &ev, const int &i, cons template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::v_tally3_atom(EV_FLOAT_REAX &ev, const int &i, const int & /*j*/, +void PairReaxFFKokkos::v_tally3_atom(EV_FLOAT_REAX &ev, const int &i, const int & /*j*/, const int & /*k*/, F_FLOAT *fj, F_FLOAT *fk, F_FLOAT *drji, F_FLOAT *drjk) const { @@ -3634,7 +3634,7 @@ void PairReaxCKokkos::v_tally3_atom(EV_FLOAT_REAX &ev, const int &i, ------------------------------------------------------------------------- */ template -void PairReaxCKokkos::ev_setup(int eflag, int vflag, int) +void PairReaxFFKokkos::ev_setup(int eflag, int vflag, int) { int i; @@ -3689,7 +3689,7 @@ void PairReaxCKokkos::ev_setup(int eflag, int vflag, int) /* ---------------------------------------------------------------------- */ template -double PairReaxCKokkos::memory_usage() +double PairReaxFFKokkos::memory_usage() { double bytes = 0.0; @@ -3703,13 +3703,13 @@ double PairReaxCKokkos::memory_usage() bytes += (double)nmax*17*sizeof(F_FLOAT); bytes += (double)maxbo*nmax*34*sizeof(F_FLOAT); - // FixReaxCSpecies + // FixReaxFFSpecies if (fixspecies_flag) { bytes += (double)MAXSPECBOND*nmax*sizeof(tagint); bytes += (double)MAXSPECBOND*nmax*sizeof(F_FLOAT); } - // FixReaxCBonds + // FixReaxFFBonds bytes += (double)maxbo*nmax*sizeof(tagint); bytes += (double)maxbo*nmax*sizeof(F_FLOAT); bytes += (double)nmax*sizeof(int); @@ -3720,7 +3720,7 @@ double PairReaxCKokkos::memory_usage() /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::FindBond(int &numbonds) +void PairReaxFFKokkos::FindBond(int &numbonds) { copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nmax),*this); @@ -3735,14 +3735,14 @@ void PairReaxCKokkos::FindBond(int &numbonds) d_ilist = k_list->d_ilist; numbonds = 0; - PairReaxCKokkosFindBondFunctor find_bond_functor(this); + PairReaxFFKokkosFindBondFunctor find_bond_functor(this); Kokkos::parallel_reduce(inum,find_bond_functor,numbonds); copymode = 0; } template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxFindBondZero, const int &i) const { +void PairReaxFFKokkos::operator()(PairReaxFindBondZero, const int &i) const { d_numneigh_bonds[i] = 0; for (int j = 0; j < maxbo; j++) { d_neighid(i,j) = 0; @@ -3752,7 +3752,7 @@ void PairReaxCKokkos::operator()(PairReaxFindBondZero, const int &i) template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::calculate_find_bond_item(int ii, int &numbonds) const +void PairReaxFFKokkos::calculate_find_bond_item(int ii, int &numbonds) const { const int i = d_ilist[ii]; int nj = 0; @@ -3779,7 +3779,7 @@ void PairReaxCKokkos::calculate_find_bond_item(int ii, int &numbonds /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::PackBondBuffer(DAT::tdual_ffloat_1d k_buf, int &nbuf_local) +void PairReaxFFKokkos::PackBondBuffer(DAT::tdual_ffloat_1d k_buf, int &nbuf_local) { d_buf = k_buf.view(); k_params_sing.template sync(); @@ -3793,7 +3793,7 @@ void PairReaxCKokkos::PackBondBuffer(DAT::tdual_ffloat_1d k_buf, int copymode = 1; nlocal = atomKK->nlocal; - PairReaxCKokkosPackBondBufferFunctor pack_bond_buffer_functor(this); + PairReaxFFKokkosPackBondBufferFunctor pack_bond_buffer_functor(this); Kokkos::parallel_scan(nlocal,pack_bond_buffer_functor); copymode = 0; @@ -3807,7 +3807,7 @@ void PairReaxCKokkos::PackBondBuffer(DAT::tdual_ffloat_1d k_buf, int template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::pack_bond_buffer_item(int i, int &j, const bool &final) const +void PairReaxFFKokkos::pack_bond_buffer_item(int i, int &j, const bool &final) const { if (i == 0) j += 2; @@ -3849,7 +3849,7 @@ void PairReaxCKokkos::pack_bond_buffer_item(int i, int &j, const boo /* ---------------------------------------------------------------------- */ template -void PairReaxCKokkos::FindBondSpecies() +void PairReaxFFKokkos::FindBondSpecies() { if (nmax > (int)k_tmpid.extent(0)) { @@ -3877,12 +3877,12 @@ void PairReaxCKokkos::FindBondSpecies() k_error_flag.sync(); if (k_error_flag.h_view()) - error->all(FLERR,"Increase MAXSPECBOND in reaxc_defs.h"); + error->all(FLERR,"Increase MAXSPECBOND in reaxff_defs.h"); } template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxFindBondSpeciesZero, const int &i) const { +void PairReaxFFKokkos::operator()(PairReaxFindBondSpeciesZero, const int &i) const { for (int j = 0; j < MAXSPECBOND; j++) { k_tmpbo.view()(i,j) = 0.0; k_tmpid.view()(i,j) = 0; @@ -3891,7 +3891,7 @@ void PairReaxCKokkos::operator()(PairReaxFindBondSpeciesZero, const template KOKKOS_INLINE_FUNCTION -void PairReaxCKokkos::operator()(PairReaxFindBondSpecies, const int &i) const { +void PairReaxFFKokkos::operator()(PairReaxFindBondSpecies, const int &i) const { int nj = 0; const int j_start = d_bo_first[i]; @@ -3913,8 +3913,8 @@ void PairReaxCKokkos::operator()(PairReaxFindBondSpecies, const int } } -template class PairReaxCKokkos; +template class PairReaxFFKokkos; #ifdef LMP_KOKKOS_GPU -template class PairReaxCKokkos; +template class PairReaxFFKokkos; #endif } diff --git a/src/KOKKOS/pair_reaxc_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h similarity index 86% rename from src/KOKKOS/pair_reaxc_kokkos.h rename to src/KOKKOS/pair_reaxff_kokkos.h index d7457f54fd..08f0911292 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -15,9 +15,12 @@ #ifdef PAIR_CLASS // clang-format off -PairStyle(reax/c/kk,PairReaxCKokkos); -PairStyle(reax/c/kk/device,PairReaxCKokkos); -PairStyle(reax/c/kk/host,PairReaxCKokkos); +PairStyle(reaxff/kk,PairReaxFFKokkos); +PairStyle(reaxff/kk/device,PairReaxFFKokkos); +PairStyle(reaxff/kk/host,PairReaxFFKokkos); +PairStyle(reax/c/kk,PairReaxFFKokkos); +PairStyle(reax/c/kk/device,PairReaxFFKokkos); +PairStyle(reax/c/kk/host,PairReaxFFKokkos); // clang-format on #else @@ -25,7 +28,7 @@ PairStyle(reax/c/kk/host,PairReaxCKokkos); #define LMP_PAIR_REAXC_KOKKOS_H #include "pair_kokkos.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "neigh_list_kokkos.h" #define C_ele 332.06371 @@ -53,13 +56,13 @@ struct LR_lookup_table_kk }; template -struct PairReaxComputePolar{}; +struct PairReaxFFomputePolar{}; template -struct PairReaxComputeLJCoulomb{}; +struct PairReaxFFomputeLJCoulomb{}; template -struct PairReaxComputeTabulatedLJCoulomb{}; +struct PairReaxFFomputeTabulatedLJCoulomb{}; struct PairReaxBuildListsFull{}; @@ -82,25 +85,25 @@ template struct PairReaxUpdateBond{}; template -struct PairReaxComputeBond1{}; +struct PairReaxFFomputeBond1{}; template -struct PairReaxComputeBond2{}; +struct PairReaxFFomputeBond2{}; template -struct PairReaxComputeMulti1{}; +struct PairReaxFFomputeMulti1{}; template -struct PairReaxComputeMulti2{}; +struct PairReaxFFomputeMulti2{}; template -struct PairReaxComputeAngular{}; +struct PairReaxFFomputeAngular{}; template -struct PairReaxComputeTorsion{}; +struct PairReaxFFomputeTorsion{}; template -struct PairReaxComputeHydrogen{}; +struct PairReaxFFomputeHydrogen{}; struct PairReaxFindBondZero{}; @@ -110,7 +113,7 @@ struct PairReaxFindBondSpecies{}; template -class PairReaxCKokkos : public PairReaxC { +class PairReaxFFKokkos : public PairReaxFF { public: enum {EnabledNeighFlags=FULL|HALF|HALFTHREAD}; enum {COUL_FLAG=1}; @@ -118,8 +121,8 @@ class PairReaxCKokkos : public PairReaxC { typedef ArrayTypes AT; typedef EV_FLOAT_REAX value_type; - PairReaxCKokkos(class LAMMPS *); - virtual ~PairReaxCKokkos(); + PairReaxFFKokkos(class LAMMPS *); + virtual ~PairReaxFFKokkos(); void ev_setup(int, int, int alloc = 1); void compute(int, int); @@ -131,27 +134,27 @@ class PairReaxCKokkos : public PairReaxC { template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputePolar, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputePolar, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputePolar, const int&) const; + void operator()(PairReaxFFomputePolar, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeLJCoulomb, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeLJCoulomb, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeLJCoulomb, const int&) const; + void operator()(PairReaxFFomputeLJCoulomb, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeTabulatedLJCoulomb, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeTabulatedLJCoulomb, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeTabulatedLJCoulomb, const int&) const; + void operator()(PairReaxFFomputeTabulatedLJCoulomb, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(PairReaxBuildListsFull, const int&) const; @@ -184,55 +187,55 @@ class PairReaxCKokkos : public PairReaxC { template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeBond1, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeBond1, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeBond1, const int&) const; + void operator()(PairReaxFFomputeBond1, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeBond2, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeBond2, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeBond2, const int&) const; + void operator()(PairReaxFFomputeBond2, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeMulti1, const int&) const; + void operator()(PairReaxFFomputeMulti1, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeMulti2, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeMulti2, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeMulti2, const int&) const; + void operator()(PairReaxFFomputeMulti2, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeAngular, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeAngular, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeAngular, const int&) const; + void operator()(PairReaxFFomputeAngular, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeTorsion, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeTorsion, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeTorsion, const int&) const; + void operator()(PairReaxFFomputeTorsion, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeHydrogen, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFomputeHydrogen, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxComputeHydrogen, const int&) const; + void operator()(PairReaxFFomputeHydrogen, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(PairReaxFindBondZero, const int&) const; @@ -433,7 +436,7 @@ class PairReaxCKokkos : public PairReaxC { int vdwflag, lgflag; F_FLOAT gp[39], p_boc1, p_boc2; - friend void pair_virial_fdotr_compute(PairReaxCKokkos*); + friend void pair_virial_fdotr_compute(PairReaxFFKokkos*); int bocnt,hbcnt,enobondsflag; @@ -458,11 +461,11 @@ class PairReaxCKokkos : public PairReaxC { }; template -struct PairReaxCKokkosFindBondFunctor { +struct PairReaxFFKokkosFindBondFunctor { typedef DeviceType device_type; typedef int value_type; - PairReaxCKokkos c; - PairReaxCKokkosFindBondFunctor(PairReaxCKokkos* c_ptr):c(*c_ptr) {}; + PairReaxFFKokkos c; + PairReaxFFKokkosFindBondFunctor(PairReaxFFKokkos* c_ptr):c(*c_ptr) {}; KOKKOS_INLINE_FUNCTION void join(volatile int &dst, @@ -477,11 +480,11 @@ struct PairReaxCKokkosFindBondFunctor { }; template -struct PairReaxCKokkosPackBondBufferFunctor { +struct PairReaxFFKokkosPackBondBufferFunctor { typedef DeviceType device_type; typedef int value_type; - PairReaxCKokkos c; - PairReaxCKokkosPackBondBufferFunctor(PairReaxCKokkos* c_ptr):c(*c_ptr) {}; + PairReaxFFKokkos c; + PairReaxFFKokkosPackBondBufferFunctor(PairReaxFFKokkos* c_ptr):c(*c_ptr) {}; KOKKOS_INLINE_FUNCTION void operator()(const int ii, int &j, const bool &final) const { diff --git a/src/OPENMP/fix_qeq_reax_omp.cpp b/src/OPENMP/fix_qeq_reaxff_omp.cpp similarity index 92% rename from src/OPENMP/fix_qeq_reax_omp.cpp rename to src/OPENMP/fix_qeq_reaxff_omp.cpp index 4cdab8a6fa..89b75bfe7a 100644 --- a/src/OPENMP/fix_qeq_reax_omp.cpp +++ b/src/OPENMP/fix_qeq_reaxff_omp.cpp @@ -18,11 +18,11 @@ Hybrid & sub-group capabilities added by Ray Shan (Materials Design) - OpenMP based threading support for fix qeq/reax/omp added + OpenMP based threading support for fix qeq/reaxff/omp added by Hasan Metin Aktulga (MSU), Chris Knight (ALCF), Paul Coffman (ALCF), Kurt O'Hearn (MSU), Ray Shan (Materials Design), Wei Jiang (ALCF) - Integration of the pair_style reax/c/omp into the OPENMP package + Integration of the pair_style reaxff/omp into the OPENMP package by Axel Kohlmeyer (Temple U.) Please cite the related publication: @@ -32,7 +32,7 @@ High Performance Computing Applications, to appear. ------------------------------------------------------------------------- */ -#include "fix_qeq_reax_omp.h" +#include "fix_qeq_reaxff_omp.h" #include "atom.h" #include "comm.h" @@ -41,7 +41,7 @@ #include "neigh_list.h" #include "update.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "reaxff_defs.h" #include @@ -55,8 +55,8 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : - FixQEqReax(lmp, narg, arg) +FixQEqReaxFFOMP::FixQEqReaxFFOMP(LAMMPS *lmp, int narg, char **arg) : + FixQEqReaxFF(lmp, narg, arg) { b_temp = nullptr; @@ -69,14 +69,14 @@ FixQEqReaxOMP::FixQEqReaxOMP(LAMMPS *lmp, int narg, char **arg) : aspc_b = nullptr; } -FixQEqReaxOMP::~FixQEqReaxOMP() +FixQEqReaxFFOMP::~FixQEqReaxFFOMP() { memory->destroy(b_temp); } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::post_constructor() +void FixQEqReaxFFOMP::post_constructor() { grow_arrays(atom->nmax); for (int i = 0; i < atom->nmax; i++) @@ -88,34 +88,34 @@ void FixQEqReaxOMP::post_constructor() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::allocate_storage() +void FixQEqReaxFFOMP::allocate_storage() { - FixQEqReax::allocate_storage(); + FixQEqReaxFF::allocate_storage(); // dual CG support int size = nmax; if (dual_enabled) size*= 2; - memory->create(b_temp, comm->nthreads, size, "qeq/reax/omp:b_temp"); + memory->create(b_temp, comm->nthreads, size, "qeq/reaxff/omp:b_temp"); } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::deallocate_storage() +void FixQEqReaxFFOMP::deallocate_storage() { memory->destroy(b_temp); - FixQEqReax::deallocate_storage(); + FixQEqReaxFF::deallocate_storage(); } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::init() +void FixQEqReaxFFOMP::init() { - FixQEqReax::init(); + FixQEqReaxFF::init(); // APSC setup if (do_aspc) { - memory->create(aspc_b, aspc_order_max+2, "qeq/reax/aspc_b"); + memory->create(aspc_b, aspc_order_max+2, "qeq/reaxff/aspc_b"); // Calculate damping factor double o = double(aspc_order); @@ -144,7 +144,7 @@ void FixQEqReaxOMP::init() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::compute_H() +void FixQEqReaxFFOMP::compute_H() { double SMALL = 0.0001; @@ -224,13 +224,13 @@ void FixQEqReaxOMP::compute_H() } // omp if (m_fill >= H.m) - error->all(FLERR,fmt::format("Fix qeq/reax: H matrix size has been " + error->all(FLERR,fmt::format("Fix qeq/reaxff: H matrix size has been " "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); } /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::init_storage() +void FixQEqReaxFFOMP::init_storage() { #if defined(_OPENMP) #pragma omp parallel for schedule(static) @@ -247,18 +247,18 @@ void FixQEqReaxOMP::init_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::pre_force(int /* vflag */) +void FixQEqReaxFFOMP::pre_force(int /* vflag */) { if (update->ntimestep % nevery) return; int n = atom->nlocal; - if (reaxc) { - nn = reaxc->list->inum; - NN = reaxc->list->inum + reaxc->list->gnum; - ilist = reaxc->list->ilist; - numneigh = reaxc->list->numneigh; - firstneigh = reaxc->list->firstneigh; + if (reaxff) { + nn = reaxff->list->inum; + NN = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; NN = list->inum + list->gnum; @@ -289,7 +289,7 @@ void FixQEqReaxOMP::pre_force(int /* vflag */) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::init_matvec() +void FixQEqReaxFFOMP::init_matvec() { /* fill-in H matrix */ compute_H(); @@ -363,7 +363,7 @@ void FixQEqReaxOMP::init_matvec() /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::CG(double *b, double *x) +int FixQEqReaxFFOMP::CG(double *b, double *x) { int i; double alpha, beta, b_norm; @@ -464,7 +464,7 @@ int FixQEqReaxOMP::CG(double *b, double *x) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " + error->warning(FLERR,fmt::format("Fix qeq/reaxff/omp CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); return i; @@ -472,7 +472,7 @@ int FixQEqReaxOMP::CG(double *b, double *x) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) +void FixQEqReaxFFOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -539,7 +539,7 @@ void FixQEqReaxOMP::sparse_matvec(sparse_matrix *A, double *x, double *b) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::calculate_Q() +void FixQEqReaxFFOMP::calculate_Q() { int i; double *q = atom->q; @@ -592,7 +592,7 @@ void FixQEqReaxOMP::calculate_Q() /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::vector_sum(double* dest, double c, double* v, +void FixQEqReaxFFOMP::vector_sum(double* dest, double c, double* v, double d, double* y, int k) { int i; @@ -608,7 +608,7 @@ void FixQEqReaxOMP::vector_sum(double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::vector_add(double* dest, double c, double* v, int k) +void FixQEqReaxFFOMP::vector_add(double* dest, double c, double* v, int k) { int i; @@ -627,7 +627,7 @@ void FixQEqReaxOMP::vector_add(double* dest, double c, double* v, int k) /* dual CG support */ /* ---------------------------------------------------------------------- */ -int FixQEqReaxOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) +int FixQEqReaxFFOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) { int i; double alpha_s, alpha_t, beta_s, beta_t, b_norm_s, b_norm_t; @@ -791,7 +791,7 @@ int FixQEqReaxOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reax/omp CG convergence failed " + error->warning(FLERR,fmt::format("Fix qeq/reaxff/omp CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); return matvecs_s + matvecs_t; @@ -799,7 +799,7 @@ int FixQEqReaxOMP::dual_CG(double *b1, double *b2, double *x1, double *x2) /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x2, double *b) +void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x2, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) @@ -890,7 +890,7 @@ void FixQEqReaxOMP::dual_sparse_matvec(sparse_matrix *A, double *x1, double *x2, /* ---------------------------------------------------------------------- */ -void FixQEqReaxOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) +void FixQEqReaxFFOMP::dual_sparse_matvec(sparse_matrix *A, double *x, double *b) { #if defined(_OPENMP) #pragma omp parallel default(shared) diff --git a/src/OPENMP/fix_qeq_reax_omp.h b/src/OPENMP/fix_qeq_reaxff_omp.h similarity index 84% rename from src/OPENMP/fix_qeq_reax_omp.h rename to src/OPENMP/fix_qeq_reaxff_omp.h index 62855a6f78..b99034edf0 100644 --- a/src/OPENMP/fix_qeq_reax_omp.h +++ b/src/OPENMP/fix_qeq_reaxff_omp.h @@ -13,22 +13,23 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(qeq/reax/omp,FixQEqReaxOMP); +FixStyle(qeq/reaxff/omp,FixQEqReaxFFOMP); +FixStyle(qeq/reax/omp,FixQEqReaxFFOMP); // clang-format on #else -#ifndef LMP_FIX_QEQ_REAX_OMP_H -#define LMP_FIX_QEQ_REAX_OMP_H +#ifndef LMP_FIX_QEQ_REAXFF_OMP_H +#define LMP_FIX_QEQ_REAXFF_OMP_H -#include "fix_qeq_reax.h" +#include "fix_qeq_reaxff.h" namespace LAMMPS_NS { -class FixQEqReaxOMP : public FixQEqReax { +class FixQEqReaxFFOMP : public FixQEqReaxFF { public: - FixQEqReaxOMP(class LAMMPS *, int, char **); - ~FixQEqReaxOMP(); + FixQEqReaxFFOMP(class LAMMPS *, int, char **); + ~FixQEqReaxFFOMP(); virtual void init(); virtual void init_storage(); virtual void pre_force(int); diff --git a/src/OPENMP/pair_reaxc_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp similarity index 88% rename from src/OPENMP/pair_reaxc_omp.cpp rename to src/OPENMP/pair_reaxff_omp.cpp index b65c9a391f..48fa9e8312 100644 --- a/src/OPENMP/pair_reaxc_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -17,14 +17,14 @@ Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu Per-atom energy/virial added by Ray Shan (Materials Design, Inc.) - Fix reax/c/bonds and fix reax/c/species for pair_style reax/c added + Fix reaxff/bonds and fix reaxff/species for pair_style reaxff added by Ray Shan (Materials Design) - OpenMP based threading support for pair_style reax/c/omp added + OpenMP based threading support for pair_style reaxff/omp added by Hasan Metin Aktulga (MSU), Chris Knight (ALCF), Paul Coffman (ALCF), Kurt O'Hearn (MSU), Ray Shan (Materials Design), Wei Jiang (ALCF) - Integration of the pair_style reax/c/omp into the OPENMP package + Integration of the pair_style reaxff/omp into the OPENMP package by Axel Kohlmeyer (Temple U.) Please cite the related publication: @@ -34,13 +34,13 @@ High Performance Computing Applications, to appear. ------------------------------------------------------------------------- */ -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "atom.h" #include "citeme.h" #include "comm.h" #include "error.h" -#include "fix_reaxc.h" +#include "fix_reaxff.h" #include "force.h" #include "memory.h" #include "modify.h" @@ -62,8 +62,8 @@ using namespace LAMMPS_NS; using namespace ReaxFF; -static const char cite_pair_reax_c_omp[] = - "pair reax/c/omp and fix qeq/reax/omp command:\n\n" +static const char cite_pair_reaxff_omp[] = + "pair reaxff/omp and fix qeq/reaxff/omp command:\n\n" "@Article{Aktulga17,\n" " author = {H. M. Aktulga, C. Knight, P. Coffman, K. A. OHearn, T. R. Shan, W. Jiang},\n" " title = {Optimizing the performance of reactive molecular dynamics simulations for multi-core architectures},\n" @@ -73,9 +73,9 @@ static const char cite_pair_reax_c_omp[] = /* ---------------------------------------------------------------------- */ -PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) +PairReaxFFOMP::PairReaxFFOMP(LAMMPS *lmp) : PairReaxFF(lmp), ThrOMP(lmp, THR_PAIR) { - if (lmp->citeme) lmp->citeme->add(cite_pair_reax_c_omp); + if (lmp->citeme) lmp->citeme->add(cite_pair_reaxff_omp); suffix_flag |= Suffix::OMP; api->system->pair_ptr = this; @@ -86,7 +86,7 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) /* ---------------------------------------------------------------------- */ -PairReaxCOMP::~PairReaxCOMP() +PairReaxFFOMP::~PairReaxFFOMP() { if (setup_flag) { reax_list * bonds = api->lists+BONDS; @@ -98,15 +98,15 @@ PairReaxCOMP::~PairReaxCOMP() /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::init_style() +void PairReaxFFOMP::init_style() { if (!atom->q_flag) - error->all(FLERR,"Pair style reax/c/omp requires atom attribute q"); + error->all(FLERR,"Pair style reaxff/omp requires atom attribute q"); bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) || (modify->find_fix_by_style("^qeq/shielded") != -1)); if (!have_qeq && qeqflag == 1) - error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); + error->all(FLERR,"Pair reaxff/omp requires use of fix qeq/reaxff or qeq/shielded"); api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts @@ -114,14 +114,14 @@ void PairReaxCOMP::init_style() api->system->wsize = comm->nprocs; if (atom->tag_enable == 0) - error->all(FLERR,"Pair style reax/c/omp requires atom IDs"); + error->all(FLERR,"Pair style reaxff/omp requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); + error->all(FLERR,"Pair style reaxff/omp requires newton pair on"); // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT if (atom->natoms > MAXSMALLINT) - error->all(FLERR,"Too many atoms for pair style reax/c/omp"); + error->all(FLERR,"Too many atoms for pair style reaxff/omp"); // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs @@ -135,9 +135,9 @@ void PairReaxCOMP::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - if (fix_reax == nullptr) { - modify->add_fix(fmt::format("{} all REAXC",fix_id)); - fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; + if (fix_reaxff == nullptr) { + modify->add_fix(fmt::format("{} all REAXFF",fix_id)); + fix_reaxff = (FixReaxFF *) modify->fix[modify->nfix-1]; } api->control->nthreads = comm->nthreads; @@ -145,7 +145,7 @@ void PairReaxCOMP::init_style() /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::setup() +void PairReaxFFOMP::setup() { int oldN; int mincap = api->system->mincap; @@ -166,8 +166,8 @@ void PairReaxCOMP::setup() setup_flag = 1; - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; // determine the local and total capacity @@ -183,7 +183,7 @@ void PairReaxCOMP::setup() int num_nbrs = estimate_reax_lists(); if (num_nbrs < 0) - error->all(FLERR,"Too many neighbors for pair style reax/c"); + error->all(FLERR,"Too many neighbors for pair style reaxff"); Make_List(api->system->total_cap,num_nbrs,TYP_FAR_NEIGHBOR,api->lists+FAR_NBRS); (api->lists+FAR_NBRS)->error_ptr=error; @@ -219,16 +219,16 @@ void PairReaxCOMP::setup() /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::compute(int eflag, int vflag) +void PairReaxFFOMP::compute(int eflag, int vflag) { double evdwl,ecoul; // communicate num_bonds once every reneighboring // 2 num arrays stored by fix, grab ptr to them - if (neighbor->ago == 0) comm->forward_comm_fix(fix_reax); - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + if (neighbor->ago == 0) comm->forward_comm_fix(fix_reaxff); + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; evdwl = ecoul = 0.0; ev_init(eflag,vflag); @@ -304,7 +304,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) api->data->step = update->ntimestep; - // populate tmpid and tmpbo arrays for fix reax/c/species + // populate tmpid and tmpbo arrays for fix reaxff/species if (fixspecies_flag) { if (api->system->N > nmax) { @@ -330,10 +330,10 @@ void PairReaxCOMP::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::write_reax_atoms() +void PairReaxFFOMP::write_reax_atoms() { - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; if (api->system->N > api->system->total_cap) error->all(FLERR,"Too many ghost atoms"); @@ -355,7 +355,7 @@ void PairReaxCOMP::write_reax_atoms() /* ---------------------------------------------------------------------- */ -int PairReaxCOMP::estimate_reax_lists() +int PairReaxFFOMP::estimate_reax_lists() { int i; int *ilist = list->ilist; @@ -384,7 +384,7 @@ int PairReaxCOMP::estimate_reax_lists() /* ---------------------------------------------------------------------- */ -int PairReaxCOMP::write_reax_lists() +int PairReaxFFOMP::write_reax_lists() { int itr_i, itr_j, i, j, num_mynbrs; int *jlist; @@ -450,7 +450,7 @@ int PairReaxCOMP::write_reax_lists() /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::read_reax_forces(int /* vflag */) +void PairReaxFFOMP::read_reax_forces(int /* vflag */) { #if defined(_OPENMP) #pragma omp parallel for schedule(static) default(shared) @@ -468,7 +468,7 @@ void PairReaxCOMP::read_reax_forces(int /* vflag */) /* ---------------------------------------------------------------------- */ -void PairReaxCOMP::FindBond() +void PairReaxFFOMP::FindBond() { const double bo_cut = 0.10; @@ -492,7 +492,7 @@ void PairReaxCOMP::FindBond() tmpid[i][nj] = j; tmpbo[i][nj] = bo_tmp; nj ++; - if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in fix_reaxc_species.h"); + if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in fix_reaxff_species.h"); } } } diff --git a/src/OPENMP/pair_reaxc_omp.h b/src/OPENMP/pair_reaxff_omp.h similarity index 92% rename from src/OPENMP/pair_reaxc_omp.h rename to src/OPENMP/pair_reaxff_omp.h index 81d1c35b0e..cced5861be 100644 --- a/src/OPENMP/pair_reaxc_omp.h +++ b/src/OPENMP/pair_reaxff_omp.h @@ -13,22 +13,23 @@ #ifdef PAIR_CLASS // clang-format off -PairStyle(reax/c/omp,PairReaxCOMP); +PairStyle(reaxff/omp,PairReaxFFOMP); +PairStyle(reax/c/omp,PairReaxFFOMP); // clang-format on #else -#ifndef LMP_PAIR_REAXC_OMP_H -#define LMP_PAIR_REAXC_OMP_H +#ifndef LMP_PAIR_REAXFF_OMP_H +#define LMP_PAIR_REAXFF_OMP_H -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "thr_omp.h" namespace LAMMPS_NS { -class PairReaxCOMP : public PairReaxC, public ThrOMP { +class PairReaxFFOMP : public PairReaxFF, public ThrOMP { public: - PairReaxCOMP(class LAMMPS *); - ~PairReaxCOMP(); + PairReaxFFOMP(class LAMMPS *); + ~PairReaxFFOMP(); virtual void compute(int, int); virtual void init_style(); @@ -120,7 +121,7 @@ class PairReaxCOMP : public PairReaxC, public ThrOMP { E: Too many ghost atoms Number of ghost atoms has increased too much during simulation and has exceeded -the size of reax/c arrays. Increase safe_zone and min_cap in pair_style reax/c +the size of reaxff arrays. Increase safe_zone and min_cap in pair_style reaxff command */ diff --git a/src/OPENMP/reaxc_bond_orders_omp.cpp b/src/OPENMP/reaxff_bond_orders_omp.cpp similarity index 98% rename from src/OPENMP/reaxc_bond_orders_omp.cpp rename to src/OPENMP/reaxff_bond_orders_omp.cpp index 3e419792d9..2fe68280d1 100644 --- a/src/OPENMP/reaxc_bond_orders_omp.cpp +++ b/src/OPENMP/reaxff_bond_orders_omp.cpp @@ -29,7 +29,7 @@ #include "reaxff_omp.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" #include @@ -45,7 +45,7 @@ namespace ReaxFF { dbond_coefficients coef; int pk, k, j; - PairReaxCOMP *pair_reax_ptr = static_cast(system->pair_ptr); + PairReaxFFOMP *pair_reax_ptr = static_cast(system->pair_ptr); int tid = get_tid(); ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); @@ -173,7 +173,7 @@ namespace ReaxFF { j = nbr_pj->nbr; rr2 = 1.0 / SQR(nbr_pj->d); - // Top portion of BOp() moved to reaxc_forces_omp.cpp::Init_Forces_noQEq_OMP() + // Top portion of BOp() moved to reaxff_forces_omp.cpp::Init_Forces_noQEq_OMP() /* Initially BO values are the uncorrected ones, page 1 */ diff --git a/src/OPENMP/reaxc_bonds_omp.cpp b/src/OPENMP/reaxff_bonds_omp.cpp similarity index 97% rename from src/OPENMP/reaxc_bonds_omp.cpp rename to src/OPENMP/reaxff_bonds_omp.cpp index 784af432cc..1a97f2a6af 100644 --- a/src/OPENMP/reaxc_bonds_omp.cpp +++ b/src/OPENMP/reaxff_bonds_omp.cpp @@ -28,7 +28,7 @@ #include "reaxff_omp.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" #include @@ -67,8 +67,8 @@ namespace ReaxFF { int tid = get_tid(); long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); pair_reax_ptr->ev_setup_thr_proxy(system->pair_ptr->eflag_either, diff --git a/src/OPENMP/reaxc_forces_omp.cpp b/src/OPENMP/reaxff_forces_omp.cpp similarity index 99% rename from src/OPENMP/reaxc_forces_omp.cpp rename to src/OPENMP/reaxff_forces_omp.cpp index 26f36f1357..77106a5e44 100644 --- a/src/OPENMP/reaxc_forces_omp.cpp +++ b/src/OPENMP/reaxff_forces_omp.cpp @@ -31,7 +31,7 @@ #include "error.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" @@ -90,8 +90,8 @@ namespace ReaxFF { int tid = get_tid(); bond_order_data *bo_jk; - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); pair_reax_ptr->ev_setup_thr_proxy(0, 1, natoms, system->pair_ptr->eatom, diff --git a/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp b/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp similarity index 98% rename from src/OPENMP/reaxc_hydrogen_bonds_omp.cpp rename to src/OPENMP/reaxff_hydrogen_bonds_omp.cpp index 1b174aef81..64bbbf56b1 100644 --- a/src/OPENMP/reaxc_hydrogen_bonds_omp.cpp +++ b/src/OPENMP/reaxff_hydrogen_bonds_omp.cpp @@ -30,7 +30,7 @@ #include "reaxff_omp.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" @@ -87,8 +87,8 @@ namespace ReaxFF { long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); diff --git a/src/OPENMP/reaxc_init_md_omp.cpp b/src/OPENMP/reaxff_init_md_omp.cpp similarity index 100% rename from src/OPENMP/reaxc_init_md_omp.cpp rename to src/OPENMP/reaxff_init_md_omp.cpp diff --git a/src/OPENMP/reaxc_multi_body_omp.cpp b/src/OPENMP/reaxff_multi_body_omp.cpp similarity index 98% rename from src/OPENMP/reaxc_multi_body_omp.cpp rename to src/OPENMP/reaxff_multi_body_omp.cpp index 6b7a7c76f4..17b93d7487 100644 --- a/src/OPENMP/reaxc_multi_body_omp.cpp +++ b/src/OPENMP/reaxff_multi_body_omp.cpp @@ -30,7 +30,7 @@ #include "reaxff_omp.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" @@ -84,8 +84,8 @@ namespace ReaxFF { int tid = get_tid(); long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) diff --git a/src/OPENMP/reaxc_nonbonded_omp.cpp b/src/OPENMP/reaxff_nonbonded_omp.cpp similarity index 97% rename from src/OPENMP/reaxc_nonbonded_omp.cpp rename to src/OPENMP/reaxff_nonbonded_omp.cpp index 595731b005..a57542f550 100644 --- a/src/OPENMP/reaxc_nonbonded_omp.cpp +++ b/src/OPENMP/reaxff_nonbonded_omp.cpp @@ -29,7 +29,7 @@ #include "reaxff_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" #include @@ -72,8 +72,8 @@ namespace ReaxFF { long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); e_core = 0; @@ -254,8 +254,8 @@ namespace ReaxFF { long froffset = (system->N * tid); LR_lookup_table ** & LR = system->LR; - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) diff --git a/src/OPENMP/reaxc_torsion_angles_omp.cpp b/src/OPENMP/reaxff_torsion_angles_omp.cpp similarity index 99% rename from src/OPENMP/reaxc_torsion_angles_omp.cpp rename to src/OPENMP/reaxff_torsion_angles_omp.cpp index 83f49e96de..648603b143 100644 --- a/src/OPENMP/reaxc_torsion_angles_omp.cpp +++ b/src/OPENMP/reaxff_torsion_angles_omp.cpp @@ -30,7 +30,7 @@ #include "reaxff_omp.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" #include @@ -100,8 +100,8 @@ namespace ReaxFF { int tid = get_tid(); long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); #if defined(_OPENMP) diff --git a/src/OPENMP/reaxc_valence_angles_omp.cpp b/src/OPENMP/reaxff_valence_angles_omp.cpp similarity index 99% rename from src/OPENMP/reaxc_valence_angles_omp.cpp rename to src/OPENMP/reaxff_valence_angles_omp.cpp index ed457c96fe..423b6336df 100644 --- a/src/OPENMP/reaxc_valence_angles_omp.cpp +++ b/src/OPENMP/reaxff_valence_angles_omp.cpp @@ -31,7 +31,7 @@ #include "error.h" #include "fix_omp.h" -#include "pair_reaxc_omp.h" +#include "pair_reaxff_omp.h" #include "reaxff_api.h" #include @@ -154,8 +154,8 @@ namespace ReaxFF { int tid = get_tid(); long reductionOffset = (system->N * tid); - class PairReaxCOMP *pair_reax_ptr; - pair_reax_ptr = static_cast(system->pair_ptr); + class PairReaxFFOMP *pair_reax_ptr; + pair_reax_ptr = static_cast(system->pair_ptr); class ThrData *thr = pair_reax_ptr->getFixOMP()->get_thr(tid); // Run through a minimal for (jpair_match("^reax/c",0); - if (pair == nullptr) error->all(FLERR,"No pair reax/c for fix qeq/shielded"); + Pair *pair = force->pair_match("^reax..",0); + if (pair == nullptr) error->all(FLERR,"No pair reaxff for fix qeq/shielded"); int tmp; chi = (double *) pair->extract("chi",tmp); eta = (double *) pair->extract("eta",tmp); gamma = (double *) pair->extract("gamma",tmp); if (chi == nullptr || eta == nullptr || gamma == nullptr) - error->all(FLERR, - "Fix qeq/slater could not extract params from pair reax/c"); + error->all(FLERR, "Fix qeq/shielded could not extract params from pair reaxff"); } diff --git a/src/REAXFF/README b/src/REAXFF/README index 485a56785e..528b782932 100644 --- a/src/REAXFF/README +++ b/src/REAXFF/README @@ -4,16 +4,6 @@ represent the contributions of chemical bonding to the potential energy. It was originally developed by Adri van Duin and the Goddard group at CalTech. -The REAXFF version of ReaxFF (pair_style reax/c), implemented in -C, should give identical or very similar results to pair_style reax, -which is a ReaxFF implementation on top of a Fortran library, a -version of which library was originally authored by Adri van Duin. - -The reax/c version should be somewhat faster and more scalable, -particularly with respect to the charge equilibration calculation. It -should also be easier to build and use since there are no complicating -issues with Fortran memory allocation or linking to a Fortran library. - For technical details about this implementation of ReaxFF, see this paper: @@ -21,7 +11,7 @@ Parallel and Scalable Reactive Molecular Dynamics: Numerical Methods and Algorithmic Techniques, H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama, Parallel Computing, in press (2011). -See the doc page for the pair_style reax/c command for details +See the doc page for the pair_style reaxff command for details of how to use it in LAMMPS. The person who created this package is Hasan Metin Aktulga (hmaktulga diff --git a/src/REAXFF/compute_spec_atom.cpp b/src/REAXFF/compute_spec_atom.cpp index 1381f2cf96..66886cd1e2 100644 --- a/src/REAXFF/compute_spec_atom.cpp +++ b/src/REAXFF/compute_spec_atom.cpp @@ -13,13 +13,15 @@ ------------------------------------------------------------------------- */ #include "compute_spec_atom.h" -#include + #include "atom.h" -#include "update.h" +#include "error.h" #include "force.h" #include "memory.h" -#include "error.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" +#include "update.h" + +#include using namespace LAMMPS_NS; @@ -30,15 +32,15 @@ enum{KEYWORD,COMPUTE,FIX,VARIABLE}; ComputeSpecAtom::ComputeSpecAtom(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute reax/c/atom command"); + if (narg < 4) error->all(FLERR,"Illegal compute spec/atom command"); peratom_flag = 1; nvalues = narg - 3; if (nvalues == 1) size_peratom_cols = 0; else size_peratom_cols = nvalues; - // Initiate reaxc - reaxc = (PairReaxC *) force->pair_match("reax/c",0); + // get reference to ReaxFF pair style + reaxff = (PairReaxFF *) force->pair_match("^reax..",0); pack_choice = new FnPtrPack[nvalues]; @@ -64,7 +66,7 @@ ComputeSpecAtom::ComputeSpecAtom(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"vz") == 0) { pack_choice[i] = &ComputeSpecAtom::pack_vz; - // from pair_reaxc + // from pair_reaxff } else if (strcmp(arg[iarg],"abo01") == 0) { pack_choice[i] = &ComputeSpecAtom::pack_abo01; } else if (strcmp(arg[iarg],"abo02") == 0) { @@ -114,7 +116,7 @@ ComputeSpecAtom::ComputeSpecAtom(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"abo24") == 0) { pack_choice[i] = &ComputeSpecAtom::pack_abo24; - } else error->all(FLERR,"Invalid keyword in compute reax/c/atom command"); + } else error->all(FLERR,"Invalid keyword in compute spec/atom command"); } nmax = 0; @@ -310,7 +312,7 @@ void ComputeSpecAtom::pack_abo01(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][0]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][0]; else buf[n] = 0.0; n += nvalues; } @@ -324,7 +326,7 @@ void ComputeSpecAtom::pack_abo02(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][1]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][1]; else buf[n] = 0.0; n += nvalues; } @@ -338,7 +340,7 @@ void ComputeSpecAtom::pack_abo03(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][2]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][2]; else buf[n] = 0.0; n += nvalues; } @@ -352,7 +354,7 @@ void ComputeSpecAtom::pack_abo04(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][3]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][3]; else buf[n] = 0.0; n += nvalues; } @@ -366,7 +368,7 @@ void ComputeSpecAtom::pack_abo05(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][4]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][4]; else buf[n] = 0.0; n += nvalues; } @@ -380,7 +382,7 @@ void ComputeSpecAtom::pack_abo06(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][5]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][5]; else buf[n] = 0.0; n += nvalues; } @@ -394,7 +396,7 @@ void ComputeSpecAtom::pack_abo07(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][6]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][6]; else buf[n] = 0.0; n += nvalues; } @@ -408,7 +410,7 @@ void ComputeSpecAtom::pack_abo08(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][7]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][7]; else buf[n] = 0.0; n += nvalues; } @@ -422,7 +424,7 @@ void ComputeSpecAtom::pack_abo09(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][8]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][8]; else buf[n] = 0.0; n += nvalues; } @@ -436,7 +438,7 @@ void ComputeSpecAtom::pack_abo10(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][9]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][9]; else buf[n] = 0.0; n += nvalues; } @@ -450,7 +452,7 @@ void ComputeSpecAtom::pack_abo11(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][10]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][10]; else buf[n] = 0.0; n += nvalues; } @@ -464,7 +466,7 @@ void ComputeSpecAtom::pack_abo12(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][11]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][11]; else buf[n] = 0.0; n += nvalues; } @@ -478,7 +480,7 @@ void ComputeSpecAtom::pack_abo13(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][12]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][12]; else buf[n] = 0.0; n += nvalues; } @@ -492,7 +494,7 @@ void ComputeSpecAtom::pack_abo14(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][13]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][13]; else buf[n] = 0.0; n += nvalues; } @@ -506,7 +508,7 @@ void ComputeSpecAtom::pack_abo15(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][14]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][14]; else buf[n] = 0.0; n += nvalues; } @@ -520,7 +522,7 @@ void ComputeSpecAtom::pack_abo16(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][15]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][15]; else buf[n] = 0.0; n += nvalues; } @@ -534,7 +536,7 @@ void ComputeSpecAtom::pack_abo17(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][16]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][16]; else buf[n] = 0.0; n += nvalues; } @@ -548,7 +550,7 @@ void ComputeSpecAtom::pack_abo18(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][17]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][17]; else buf[n] = 0.0; n += nvalues; } @@ -562,7 +564,7 @@ void ComputeSpecAtom::pack_abo19(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][18]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][18]; else buf[n] = 0.0; n += nvalues; } @@ -576,7 +578,7 @@ void ComputeSpecAtom::pack_abo20(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][19]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][19]; else buf[n] = 0.0; n += nvalues; } @@ -590,7 +592,7 @@ void ComputeSpecAtom::pack_abo21(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][20]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][20]; else buf[n] = 0.0; n += nvalues; } @@ -604,7 +606,7 @@ void ComputeSpecAtom::pack_abo22(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][21]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][21]; else buf[n] = 0.0; n += nvalues; } @@ -618,7 +620,7 @@ void ComputeSpecAtom::pack_abo23(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][22]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][22]; else buf[n] = 0.0; n += nvalues; } @@ -632,7 +634,7 @@ void ComputeSpecAtom::pack_abo24(int n) int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = reaxc->tmpbo[i][23]; + if (mask[i] & groupbit) buf[n] = reaxff->tmpbo[i][23]; else buf[n] = 0.0; n += nvalues; } diff --git a/src/REAXFF/compute_spec_atom.h b/src/REAXFF/compute_spec_atom.h index ce4ce5b1cc..61dd63e272 100644 --- a/src/REAXFF/compute_spec_atom.h +++ b/src/REAXFF/compute_spec_atom.h @@ -75,7 +75,7 @@ class ComputeSpecAtom : public Compute { void pack_abo23(int); void pack_abo24(int); - class PairReaxC *reaxc; + class PairReaxFF *reaxff; }; } diff --git a/src/REAXFF/fix_qeq_reax.cpp b/src/REAXFF/fix_qeq_reaxff.cpp similarity index 83% rename from src/REAXFF/fix_qeq_reax.cpp rename to src/REAXFF/fix_qeq_reaxff.cpp index 2591813534..fd197a156a 100644 --- a/src/REAXFF/fix_qeq_reax.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -19,7 +19,7 @@ Hybrid and sub-group capabilities: Ray Shan (Sandia) ------------------------------------------------------------------------- */ -#include "fix_qeq_reax.h" +#include "fix_qeq_reaxff.h" #include "atom.h" #include "citeme.h" @@ -37,7 +37,7 @@ #include "tokenizer.h" #include "update.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "reaxff_api.h" #include @@ -57,8 +57,8 @@ public: #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) -static const char cite_fix_qeq_reax[] = - "fix qeq/reax command:\n\n" +static const char cite_fix_qeq_reaxff[] = + "fix qeq/reaxff command:\n\n" "@Article{Aktulga12,\n" " author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama},\n" " title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques},\n" @@ -70,7 +70,7 @@ static const char cite_fix_qeq_reax[] = /* ---------------------------------------------------------------------- */ -FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : +FixQEqReaxFF::FixQEqReaxFF(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), matvecs(0), pertype_option(nullptr) { scalar_flag = 1; @@ -78,10 +78,10 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : imax = 200; maxwarn = 1; - if ((narg < 8) || (narg > 12)) error->all(FLERR,"Illegal fix qeq/reax command"); + if ((narg < 8) || (narg > 12)) error->all(FLERR,"Illegal fix qeq/reaxff command"); nevery = utils::inumeric(FLERR,arg[3],false,lmp); - if (nevery <= 0) error->all(FLERR,"Illegal fix qeq/reax command"); + if (nevery <= 0) error->all(FLERR,"Illegal fix qeq/reaxff command"); swa = utils::numeric(FLERR,arg[4],false,lmp); swb = utils::numeric(FLERR,arg[5],false,lmp); @@ -99,10 +99,10 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg],"nowarn") == 0) maxwarn = 0; else if (strcmp(arg[iarg],"maxiter") == 0) { if (iarg+1 > narg-1) - error->all(FLERR,"Illegal fix qeq/reax command"); + error->all(FLERR,"Illegal fix qeq/reaxff command"); imax = utils::numeric(FLERR,arg[iarg+1],false,lmp); iarg++; - } else error->all(FLERR,"Illegal fix qeq/reax command"); + } else error->all(FLERR,"Illegal fix qeq/reaxff command"); iarg++; } shld = nullptr; @@ -144,7 +144,7 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : // perform initial allocation of atom-based arrays // register with Atom class - reaxc = (PairReaxC *) force->pair_match("^reax/c",0); + reaxff = (PairReaxFF *) force->pair_match("^reax..",0); s_hist = t_hist = nullptr; atom->add_callback(Atom::GROW); @@ -152,7 +152,7 @@ FixQEqReax::FixQEqReax(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixQEqReax::~FixQEqReax() +FixQEqReaxFF::~FixQEqReaxFF() { if (copymode) return; @@ -179,9 +179,9 @@ FixQEqReax::~FixQEqReax() /* ---------------------------------------------------------------------- */ -void FixQEqReax::post_constructor() +void FixQEqReaxFF::post_constructor() { - if (lmp->citeme) lmp->citeme->add(cite_fix_qeq_reax); + if (lmp->citeme) lmp->citeme->add(cite_fix_qeq_reaxff); grow_arrays(atom->nmax); for (int i = 0; i < atom->nmax; i++) @@ -190,12 +190,12 @@ void FixQEqReax::post_constructor() pertype_parameters(pertype_option); if (dual_enabled) - error->all(FLERR,"Dual keyword only supported with fix qeq/reax/omp"); + error->all(FLERR,"Dual keyword only supported with fix qeq/reaxff/omp"); } /* ---------------------------------------------------------------------- */ -int FixQEqReax::setmask() +int FixQEqReaxFF::setmask() { int mask = 0; mask |= PRE_FORCE; @@ -206,47 +206,47 @@ int FixQEqReax::setmask() /* ---------------------------------------------------------------------- */ -void FixQEqReax::pertype_parameters(char *arg) +void FixQEqReaxFF::pertype_parameters(char *arg) { - if (strcmp(arg,"reax/c") == 0) { + // match either new keyword "reaxff" or old keyword "reax/c" + if (utils::strmatch(arg,"^reax..$")) { reaxflag = 1; - Pair *pair = force->pair_match("^reax/c",0); - if (!pair) error->all(FLERR,"No reax/c pair style for fix qeq/reax"); + Pair *pair = force->pair_match("^reax..",0); + if (!pair) error->all(FLERR,"No reaxff pair style for fix qeq/reaxff"); int tmp; chi = (double *) pair->extract("chi",tmp); eta = (double *) pair->extract("eta",tmp); gamma = (double *) pair->extract("gamma",tmp); if (chi == nullptr || eta == nullptr || gamma == nullptr) - error->all(FLERR, - "Fix qeq/reax could not extract params from pair reax/c"); + error->all(FLERR, "Fix qeq/reaxff could not extract params from pair reaxff"); return; } reaxflag = 0; const int ntypes = atom->ntypes; - memory->create(chi,ntypes+1,"qeq/reax:chi"); - memory->create(eta,ntypes+1,"qeq/reax:eta"); - memory->create(gamma,ntypes+1,"qeq/reax:gamma"); + memory->create(chi,ntypes+1,"qeq/reaxff:chi"); + memory->create(eta,ntypes+1,"qeq/reaxff:eta"); + memory->create(gamma,ntypes+1,"qeq/reaxff:gamma"); if (comm->me == 0) { chi[0] = eta[0] = gamma[0] = 0.0; try { - TextFileReader reader(arg,"qeq/reax parameter"); + TextFileReader reader(arg,"qeq/reaxff parameter"); reader.ignore_comments = false; for (int i = 1; i <= ntypes; i++) { const char *line = reader.next_line(); if (!line) - throw parser_error("Invalid param file for fix qeq/reax"); + throw parser_error("Invalid param file for fix qeq/reaxff"); ValueTokenizer values(line); if (values.count() != 4) - throw parser_error("Fix qeq/reax: Incorrect format of param file"); + throw parser_error("Fix qeq/reaxff: Incorrect format of param file"); int itype = values.next_int(); if ((itype < 1) || (itype > ntypes)) - throw parser_error("Fix qeq/reax: invalid atom type in param file"); + throw parser_error("Fix qeq/reaxff: invalid atom type in param file"); chi[itype] = values.next_double(); eta[itype] = values.next_double(); @@ -264,7 +264,7 @@ void FixQEqReax::pertype_parameters(char *arg) /* ---------------------------------------------------------------------- */ -void FixQEqReax::allocate_storage() +void FixQEqReaxFF::allocate_storage() { nmax = atom->nmax; @@ -289,7 +289,7 @@ void FixQEqReax::allocate_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReax::deallocate_storage() +void FixQEqReaxFF::deallocate_storage() { memory->destroy(s); memory->destroy(t); @@ -308,7 +308,7 @@ void FixQEqReax::deallocate_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReax::reallocate_storage() +void FixQEqReaxFF::reallocate_storage() { deallocate_storage(); allocate_storage(); @@ -317,7 +317,7 @@ void FixQEqReax::reallocate_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReax::allocate_matrix() +void FixQEqReaxFF::allocate_matrix() { int i,ii,n,m; @@ -325,8 +325,8 @@ void FixQEqReax::allocate_matrix() double safezone; if (reaxflag) { - mincap = reaxc->api->system->mincap; - safezone = reaxc->api->system->safezone; + mincap = reaxff->api->system->mincap; + safezone = reaxff->api->system->safezone; } else { mincap = REAX_MIN_CAP; safezone = REAX_SAFE_ZONE; @@ -354,7 +354,7 @@ void FixQEqReax::allocate_matrix() /* ---------------------------------------------------------------------- */ -void FixQEqReax::deallocate_matrix() +void FixQEqReaxFF::deallocate_matrix() { memory->destroy(H.firstnbr); memory->destroy(H.numnbrs); @@ -364,7 +364,7 @@ void FixQEqReax::deallocate_matrix() /* ---------------------------------------------------------------------- */ -void FixQEqReax::reallocate_matrix() +void FixQEqReaxFF::reallocate_matrix() { deallocate_matrix(); allocate_matrix(); @@ -372,13 +372,13 @@ void FixQEqReax::reallocate_matrix() /* ---------------------------------------------------------------------- */ -void FixQEqReax::init() +void FixQEqReaxFF::init() { if (!atom->q_flag) - error->all(FLERR,"Fix qeq/reax requires atom attribute q"); + error->all(FLERR,"Fix qeq/reaxff requires atom attribute q"); if (group->count(igroup) == 0) - error->all(FLERR,"Fix qeq/reax group has no atoms"); + error->all(FLERR,"Fix qeq/reaxff group has no atoms"); // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs @@ -398,21 +398,21 @@ void FixQEqReax::init() /* ---------------------------------------------------------------------- */ -double FixQEqReax::compute_scalar() +double FixQEqReaxFF::compute_scalar() { return matvecs/2.0; } /* ---------------------------------------------------------------------- */ -void FixQEqReax::init_list(int /*id*/, NeighList *ptr) +void FixQEqReaxFF::init_list(int /*id*/, NeighList *ptr) { list = ptr; } /* ---------------------------------------------------------------------- */ -void FixQEqReax::init_shielding() +void FixQEqReaxFF::init_shielding() { int i,j; int ntypes; @@ -428,16 +428,16 @@ void FixQEqReax::init_shielding() /* ---------------------------------------------------------------------- */ -void FixQEqReax::init_taper() +void FixQEqReaxFF::init_taper() { double d7, swa2, swa3, swb2, swb3; if (fabs(swa) > 0.01 && comm->me == 0) - error->warning(FLERR,"Fix qeq/reax has non-zero lower Taper radius cutoff"); + error->warning(FLERR,"Fix qeq/reaxff has non-zero lower Taper radius cutoff"); if (swb < 0) - error->all(FLERR, "Fix qeq/reax has negative upper Taper radius cutoff"); + error->all(FLERR, "Fix qeq/reaxff has negative upper Taper radius cutoff"); else if (swb < 5 && comm->me == 0) - error->warning(FLERR,"Fix qeq/reax has very low Taper radius cutoff"); + error->warning(FLERR,"Fix qeq/reaxff has very low Taper radius cutoff"); d7 = pow(swb - swa, 7); swa2 = SQR(swa); @@ -458,14 +458,14 @@ void FixQEqReax::init_taper() /* ---------------------------------------------------------------------- */ -void FixQEqReax::setup_pre_force(int vflag) +void FixQEqReaxFF::setup_pre_force(int vflag) { - if (reaxc) { - nn = reaxc->list->inum; - NN = reaxc->list->inum + reaxc->list->gnum; - ilist = reaxc->list->ilist; - numneigh = reaxc->list->numneigh; - firstneigh = reaxc->list->firstneigh; + if (reaxff) { + nn = reaxff->list->inum; + NN = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; NN = list->inum + list->gnum; @@ -487,7 +487,7 @@ void FixQEqReax::setup_pre_force(int vflag) /* ---------------------------------------------------------------------- */ -void FixQEqReax::setup_pre_force_respa(int vflag, int ilevel) +void FixQEqReaxFF::setup_pre_force_respa(int vflag, int ilevel) { if (ilevel < nlevels_respa-1) return; setup_pre_force(vflag); @@ -495,21 +495,21 @@ void FixQEqReax::setup_pre_force_respa(int vflag, int ilevel) /* ---------------------------------------------------------------------- */ -void FixQEqReax::min_setup_pre_force(int vflag) +void FixQEqReaxFF::min_setup_pre_force(int vflag) { setup_pre_force(vflag); } /* ---------------------------------------------------------------------- */ -void FixQEqReax::init_storage() +void FixQEqReaxFF::init_storage() { int NN; int *ilist; - if (reaxc) { - NN = reaxc->list->inum + reaxc->list->gnum; - ilist = reaxc->list->ilist; + if (reaxff) { + NN = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; } else { NN = list->inum + list->gnum; ilist = list->ilist; @@ -530,18 +530,18 @@ void FixQEqReax::init_storage() /* ---------------------------------------------------------------------- */ -void FixQEqReax::pre_force(int /*vflag*/) +void FixQEqReaxFF::pre_force(int /*vflag*/) { if (update->ntimestep % nevery) return; int n = atom->nlocal; - if (reaxc) { - nn = reaxc->list->inum; - NN = reaxc->list->inum + reaxc->list->gnum; - ilist = reaxc->list->ilist; - numneigh = reaxc->list->numneigh; - firstneigh = reaxc->list->firstneigh; + if (reaxff) { + nn = reaxff->list->inum; + NN = reaxff->list->inum + reaxff->list->gnum; + ilist = reaxff->list->ilist; + numneigh = reaxff->list->numneigh; + firstneigh = reaxff->list->firstneigh; } else { nn = list->inum; NN = list->inum + list->gnum; @@ -568,21 +568,21 @@ void FixQEqReax::pre_force(int /*vflag*/) /* ---------------------------------------------------------------------- */ -void FixQEqReax::pre_force_respa(int vflag, int ilevel, int /*iloop*/) +void FixQEqReaxFF::pre_force_respa(int vflag, int ilevel, int /*iloop*/) { if (ilevel == nlevels_respa-1) pre_force(vflag); } /* ---------------------------------------------------------------------- */ -void FixQEqReax::min_pre_force(int vflag) +void FixQEqReaxFF::min_pre_force(int vflag) { pre_force(vflag); } /* ---------------------------------------------------------------------- */ -void FixQEqReax::init_matvec() +void FixQEqReaxFF::init_matvec() { /* fill-in H matrix */ compute_H(); @@ -614,7 +614,7 @@ void FixQEqReax::init_matvec() /* ---------------------------------------------------------------------- */ -void FixQEqReax::compute_H() +void FixQEqReaxFF::compute_H() { int jnum; int i, j, ii, jj, flag; @@ -670,13 +670,13 @@ void FixQEqReax::compute_H() } if (m_fill >= H.m) - error->all(FLERR,fmt::format("Fix qeq/reax: H matrix size has been " + error->all(FLERR,fmt::format("Fix qeq/reaxff H matrix size has been " "exceeded: m_fill={} H.m={}\n", m_fill, H.m)); } /* ---------------------------------------------------------------------- */ -double FixQEqReax::calculate_H(double r, double gamma) +double FixQEqReaxFF::calculate_H(double r, double gamma) { double Taper, denom; @@ -696,7 +696,7 @@ double FixQEqReax::calculate_H(double r, double gamma) /* ---------------------------------------------------------------------- */ -int FixQEqReax::CG(double *b, double *x) +int FixQEqReaxFF::CG(double *b, double *x) { int i, j; double tmp, alpha, beta, b_norm; @@ -745,7 +745,7 @@ int FixQEqReax::CG(double *b, double *x) } if ((i >= imax) && maxwarn && (comm->me == 0)) - error->warning(FLERR,fmt::format("Fix qeq/reax CG convergence failed " + error->warning(FLERR,fmt::format("Fix qeq/reaxff CG convergence failed " "after {} iterations at step {}", i,update->ntimestep)); return i; @@ -754,7 +754,7 @@ int FixQEqReax::CG(double *b, double *x) /* ---------------------------------------------------------------------- */ -void FixQEqReax::sparse_matvec(sparse_matrix *A, double *x, double *b) +void FixQEqReaxFF::sparse_matvec(sparse_matrix *A, double *x, double *b) { int i, j, itr_j; int ii; @@ -786,7 +786,7 @@ void FixQEqReax::sparse_matvec(sparse_matrix *A, double *x, double *b) /* ---------------------------------------------------------------------- */ -void FixQEqReax::calculate_Q() +void FixQEqReaxFF::calculate_Q() { int i, k; double u, s_sum, t_sum; @@ -819,7 +819,7 @@ void FixQEqReax::calculate_Q() /* ---------------------------------------------------------------------- */ -int FixQEqReax::pack_forward_comm(int n, int *list, double *buf, +int FixQEqReaxFF::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { int m; @@ -846,7 +846,7 @@ int FixQEqReax::pack_forward_comm(int n, int *list, double *buf, /* ---------------------------------------------------------------------- */ -void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) +void FixQEqReaxFF::unpack_forward_comm(int n, int first, double *buf) { int i, m; @@ -871,7 +871,7 @@ void FixQEqReax::unpack_forward_comm(int n, int first, double *buf) /* ---------------------------------------------------------------------- */ -int FixQEqReax::pack_reverse_comm(int n, int first, double *buf) +int FixQEqReaxFF::pack_reverse_comm(int n, int first, double *buf) { int i, m; if (pack_flag == 5) { @@ -891,7 +891,7 @@ int FixQEqReax::pack_reverse_comm(int n, int first, double *buf) /* ---------------------------------------------------------------------- */ -void FixQEqReax::unpack_reverse_comm(int n, int *list, double *buf) +void FixQEqReaxFF::unpack_reverse_comm(int n, int *list, double *buf) { if (pack_flag == 5) { int m = 0; @@ -909,7 +909,7 @@ void FixQEqReax::unpack_reverse_comm(int n, int *list, double *buf) memory usage of local atom-based arrays ------------------------------------------------------------------------- */ -double FixQEqReax::memory_usage() +double FixQEqReaxFF::memory_usage() { double bytes; @@ -929,7 +929,7 @@ double FixQEqReax::memory_usage() allocate fictitious charge arrays ------------------------------------------------------------------------- */ -void FixQEqReax::grow_arrays(int nmax) +void FixQEqReaxFF::grow_arrays(int nmax) { memory->grow(s_hist,nmax,nprev,"qeq:s_hist"); memory->grow(t_hist,nmax,nprev,"qeq:t_hist"); @@ -939,7 +939,7 @@ void FixQEqReax::grow_arrays(int nmax) copy values within fictitious charge arrays ------------------------------------------------------------------------- */ -void FixQEqReax::copy_arrays(int i, int j, int /*delflag*/) +void FixQEqReaxFF::copy_arrays(int i, int j, int /*delflag*/) { for (int m = 0; m < nprev; m++) { s_hist[j][m] = s_hist[i][m]; @@ -951,7 +951,7 @@ void FixQEqReax::copy_arrays(int i, int j, int /*delflag*/) pack values in local atom-based array for exchange with another proc ------------------------------------------------------------------------- */ -int FixQEqReax::pack_exchange(int i, double *buf) +int FixQEqReaxFF::pack_exchange(int i, double *buf) { for (int m = 0; m < nprev; m++) buf[m] = s_hist[i][m]; for (int m = 0; m < nprev; m++) buf[nprev+m] = t_hist[i][m]; @@ -962,7 +962,7 @@ int FixQEqReax::pack_exchange(int i, double *buf) unpack values in local atom-based array from exchange with another proc ------------------------------------------------------------------------- */ -int FixQEqReax::unpack_exchange(int nlocal, double *buf) +int FixQEqReaxFF::unpack_exchange(int nlocal, double *buf) { for (int m = 0; m < nprev; m++) s_hist[nlocal][m] = buf[m]; for (int m = 0; m < nprev; m++) t_hist[nlocal][m] = buf[nprev+m]; @@ -971,7 +971,7 @@ int FixQEqReax::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_norm(double *v, int n) +double FixQEqReaxFF::parallel_norm(double *v, int n) { int i; double my_sum, norm_sqr; @@ -993,7 +993,7 @@ double FixQEqReax::parallel_norm(double *v, int n) /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_dot(double *v1, double *v2, int n) +double FixQEqReaxFF::parallel_dot(double *v1, double *v2, int n) { int i; double my_dot, res; @@ -1015,7 +1015,7 @@ double FixQEqReax::parallel_dot(double *v1, double *v2, int n) /* ---------------------------------------------------------------------- */ -double FixQEqReax::parallel_vector_acc(double *v, int n) +double FixQEqReaxFF::parallel_vector_acc(double *v, int n) { int i; double my_acc, res; @@ -1037,7 +1037,7 @@ double FixQEqReax::parallel_vector_acc(double *v, int n) /* ---------------------------------------------------------------------- */ -void FixQEqReax::vector_sum(double* dest, double c, double* v, +void FixQEqReaxFF::vector_sum(double* dest, double c, double* v, double d, double* y, int k) { int kk; @@ -1051,7 +1051,7 @@ void FixQEqReax::vector_sum(double* dest, double c, double* v, /* ---------------------------------------------------------------------- */ -void FixQEqReax::vector_add(double* dest, double c, double* v, int k) +void FixQEqReaxFF::vector_add(double* dest, double c, double* v, int k) { int kk; diff --git a/src/REAXFF/fix_qeq_reax.h b/src/REAXFF/fix_qeq_reaxff.h similarity index 94% rename from src/REAXFF/fix_qeq_reax.h rename to src/REAXFF/fix_qeq_reaxff.h index cf05096fe6..b787bb9c7a 100644 --- a/src/REAXFF/fix_qeq_reax.h +++ b/src/REAXFF/fix_qeq_reaxff.h @@ -24,21 +24,22 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(qeq/reax,FixQEqReax); +FixStyle(qeq/reaxff,FixQEqReaxFF); +FixStyle(qeq/reax,FixQEqReaxFF); // clang-format on #else -#ifndef LMP_FIX_QEQ_REAX_H -#define LMP_FIX_QEQ_REAX_H +#ifndef LMP_FIX_QEQ_REAXFF_H +#define LMP_FIX_QEQ_REAXFF_H #include "fix.h" namespace LAMMPS_NS { -class FixQEqReax : public Fix { +class FixQEqReaxFF : public Fix { public: - FixQEqReax(class LAMMPS *, int, char **); - ~FixQEqReax(); + FixQEqReaxFF(class LAMMPS *, int, char **); + ~FixQEqReaxFF(); int setmask(); virtual void post_constructor(); virtual void init(); @@ -63,7 +64,7 @@ class FixQEqReax : public Fix { int pack_flag; int nlevels_respa; class NeighList *list; - class PairReaxC *reaxc; + class PairReaxFF *reaxff; int *ilist, *jlist, *numneigh, **firstneigh; double swa, swb; // lower/upper Taper cutoff radius diff --git a/src/REAXFF/fix_reaxc.cpp b/src/REAXFF/fix_reaxff.cpp similarity index 87% rename from src/REAXFF/fix_reaxc.cpp rename to src/REAXFF/fix_reaxff.cpp index 2b39ef5a0e..bd95dbcb38 100644 --- a/src/REAXFF/fix_reaxc.cpp +++ b/src/REAXFF/fix_reaxff.cpp @@ -22,7 +22,7 @@ Algorithmic Techniques", Parallel Computing, in press. ------------------------------------------------------------------------- */ -#include "fix_reaxc.h" +#include "fix_reaxff.h" #include "atom.h" #include "memory.h" @@ -35,7 +35,7 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixReaxC::FixReaxC(LAMMPS *lmp,int narg, char **arg) : +FixReaxFF::FixReaxFF(LAMMPS *lmp,int narg, char **arg) : Fix(lmp, narg, arg) { // perform initial allocation of atom-based arrays @@ -57,7 +57,7 @@ FixReaxC::FixReaxC(LAMMPS *lmp,int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixReaxC::~FixReaxC() +FixReaxFF::~FixReaxFF() { // unregister this fix so atom class doesn't invoke it any more @@ -71,7 +71,7 @@ FixReaxC::~FixReaxC() /* ---------------------------------------------------------------------- */ -int FixReaxC::setmask() +int FixReaxFF::setmask() { int mask = 0; return mask; @@ -81,7 +81,7 @@ int FixReaxC::setmask() memory usage of local atom-based arrays ------------------------------------------------------------------------- */ -double FixReaxC::memory_usage() +double FixReaxFF::memory_usage() { int nmax = atom->nmax; double bytes = (double)nmax * 2 * sizeof(int); @@ -92,10 +92,10 @@ double FixReaxC::memory_usage() allocate local atom-based arrays ------------------------------------------------------------------------- */ -void FixReaxC::grow_arrays(int nmax) +void FixReaxFF::grow_arrays(int nmax) { - memory->grow(num_bonds,nmax,"reaxc:num_bonds"); - memory->grow(num_hbonds,nmax,"reaxc:num_hbonds"); + memory->grow(num_bonds,nmax,"reaxff:num_bonds"); + memory->grow(num_hbonds,nmax,"reaxff:num_hbonds"); for (int i = oldnmax; i < nmax; i++) { num_hbonds[i] = MIN_REAX_HBONDS; num_bonds[i] = MIN_REAX_BONDS; @@ -107,7 +107,7 @@ void FixReaxC::grow_arrays(int nmax) copy values within local atom-based arrays ------------------------------------------------------------------------- */ -void FixReaxC::copy_arrays(int i, int j, int /*delflag*/) +void FixReaxFF::copy_arrays(int i, int j, int /*delflag*/) { num_bonds[j] = num_bonds[i]; num_hbonds[j] = num_hbonds[i]; @@ -117,7 +117,7 @@ void FixReaxC::copy_arrays(int i, int j, int /*delflag*/) pack values in local atom-based arrays for exchange with another proc ------------------------------------------------------------------------- */ -int FixReaxC::pack_exchange(int i, double *buf) +int FixReaxFF::pack_exchange(int i, double *buf) { buf[0] = num_bonds[i]; buf[1] = num_hbonds[i]; @@ -128,7 +128,7 @@ int FixReaxC::pack_exchange(int i, double *buf) unpack values in local atom-based arrays from exchange with another proc ------------------------------------------------------------------------- */ -int FixReaxC::unpack_exchange(int nlocal, double *buf) +int FixReaxFF::unpack_exchange(int nlocal, double *buf) { num_bonds[nlocal] = static_cast (buf[0]); num_hbonds[nlocal] = static_cast (buf[1]); @@ -137,7 +137,7 @@ int FixReaxC::unpack_exchange(int nlocal, double *buf) /* ---------------------------------------------------------------------- */ -int FixReaxC::pack_forward_comm(int n, int *list, double *buf, +int FixReaxFF::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { int i,j,m; @@ -152,7 +152,7 @@ int FixReaxC::pack_forward_comm(int n, int *list, double *buf, /* ---------------------------------------------------------------------- */ -void FixReaxC::unpack_forward_comm(int n, int first, double *buf) +void FixReaxFF::unpack_forward_comm(int n, int first, double *buf) { int i,m,last; diff --git a/src/REAXFF/fix_reaxc.h b/src/REAXFF/fix_reaxff.h similarity index 89% rename from src/REAXFF/fix_reaxc.h rename to src/REAXFF/fix_reaxff.h index 6347f30c23..0b18f6d118 100644 --- a/src/REAXFF/fix_reaxc.h +++ b/src/REAXFF/fix_reaxff.h @@ -24,24 +24,24 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(REAXC,FixReaxC); +FixStyle(REAXFF,FixReaxFF); // clang-format on #else -#ifndef LMP_FIX_REAXC_H -#define LMP_FIX_REAXC_H +#ifndef LMP_FIX_REAXFF_H +#define LMP_FIX_REAXFF_H #include "fix.h" namespace LAMMPS_NS { -class FixReaxC : public Fix { - friend class PairReaxC; - friend class PairReaxCOMP; +class FixReaxFF : public Fix { + friend class PairReaxFF; + friend class PairReaxFFOMP; public: - FixReaxC(class LAMMPS *,int, char **); - ~FixReaxC(); + FixReaxFF(class LAMMPS *,int, char **); + ~FixReaxFF(); int setmask(); double memory_usage(); diff --git a/src/REAXFF/fix_reaxc_bonds.cpp b/src/REAXFF/fix_reaxff_bonds.cpp similarity index 79% rename from src/REAXFF/fix_reaxc_bonds.cpp rename to src/REAXFF/fix_reaxff_bonds.cpp index 0ef3c351e6..f13056c5b6 100644 --- a/src/REAXFF/fix_reaxc_bonds.cpp +++ b/src/REAXFF/fix_reaxff_bonds.cpp @@ -16,7 +16,7 @@ Contributing author: Ray Shan (Sandia, tnshan@sandia.gov) ------------------------------------------------------------------------- */ -#include "fix_reaxc_bonds.h" +#include "fix_reaxff_bonds.h" #include "atom.h" #include "error.h" @@ -25,7 +25,7 @@ #include "neigh_list.h" #include "update.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "reaxff_api.h" #include @@ -36,10 +36,10 @@ using namespace ReaxFF; /* ---------------------------------------------------------------------- */ -FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : +FixReaxFFBonds::FixReaxFFBonds(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg != 5) error->all(FLERR,"Illegal fix reax/c/bonds command"); + if (narg != 5) error->all(FLERR,"Illegal fix reaxff/bonds command"); MPI_Comm_rank(world,&me); MPI_Comm_size(world,&nprocs); @@ -49,7 +49,7 @@ FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : nevery = utils::inumeric(FLERR,arg[3],false,lmp); if (nevery <= 0) - error->all(FLERR,"Illegal fix reax/c/bonds command"); + error->all(FLERR,"Illegal fix reaxff/bonds command"); if (me == 0) { char *suffix = strrchr(arg[4],'.'); @@ -67,12 +67,12 @@ FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : } else fp = fopen(arg[4],"w"); if (!fp) - error->one(FLERR,fmt::format("Cannot open fix reax/c/bonds file {}: " + error->one(FLERR,fmt::format("Cannot open fix reaxff/bonds file {}: " "{}",arg[4],utils::getsyserror())); } if (atom->tag_consecutive() == 0) - error->all(FLERR,"Atom IDs must be consecutive for fix reax/c bonds"); + error->all(FLERR,"Atom IDs must be consecutive for fix reaxff bonds"); abo = nullptr; neighid = nullptr; @@ -83,7 +83,7 @@ FixReaxCBonds::FixReaxCBonds(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixReaxCBonds::~FixReaxCBonds() +FixReaxFFBonds::~FixReaxFFBonds() { MPI_Comm_rank(world,&me); @@ -94,7 +94,7 @@ FixReaxCBonds::~FixReaxCBonds() /* ---------------------------------------------------------------------- */ -int FixReaxCBonds::setmask() +int FixReaxFFBonds::setmask() { int mask = 0; mask |= END_OF_STEP; @@ -103,32 +103,31 @@ int FixReaxCBonds::setmask() /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::setup(int /*vflag*/) +void FixReaxFFBonds::setup(int /*vflag*/) { end_of_step(); } /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::init() +void FixReaxFFBonds::init() { - reaxc = (PairReaxC *) force->pair_match("reax/c",0); - if (reaxc == nullptr) error->all(FLERR,"Cannot use fix reax/c/bonds without " - "pair_style reax/c, reax/c/kk, or reax/c/omp"); - + reaxff = (PairReaxFF *) force->pair_match("^reax..",0); + if (reaxff == nullptr) error->all(FLERR,"Cannot use fix reaxff/bonds without " + "pair_style reaxff, reaxff/kk, or reaxff/omp"); } /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::end_of_step() +void FixReaxFFBonds::end_of_step() { - Output_ReaxC_Bonds(update->ntimestep,fp); + Output_ReaxFF_Bonds(); if (me == 0) fflush(fp); } /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/) +void FixReaxFFBonds::Output_ReaxFF_Bonds() { int i, j; @@ -152,16 +151,14 @@ void FixReaxCBonds::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/) abo[i][j] = 0.0; } } - numbonds = 0; - - FindBond(lists, numbonds); + numbonds = FindBond(); // allocate a temporary buffer for the snapshot info MPI_Allreduce(&numbonds,&numbonds_max,1,MPI_INT,MPI_MAX,world); MPI_Allreduce(&nlocal,&nlocal_max,1,MPI_INT,MPI_MAX,world); nbuf = 1+(numbonds_max*2+10)*nlocal_max; - memory->create(buf,nbuf,"reax/c/bonds:buf"); + memory->create(buf,nbuf,"reaxff/bonds:buf"); for (i = 0; i < nbuf; i ++) buf[i] = 0.0; // Pass information to buffer @@ -176,26 +173,27 @@ void FixReaxCBonds::Output_ReaxC_Bonds(bigint /*ntimestep*/, FILE * /*fp*/) /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::FindBond(struct _reax_list * /*lists*/, int &numbonds) +int FixReaxFFBonds::FindBond() { int *ilist, i, ii, inum; int j, pj, nj; tagint jtag; double bo_tmp,bo_cut; - inum = reaxc->list->inum; - ilist = reaxc->list->ilist; + inum = reaxff->list->inum; + ilist = reaxff->list->ilist; bond_data *bo_ij; - bo_cut = reaxc->api->control->bg_cut; + bo_cut = reaxff->api->control->bg_cut; tagint *tag = atom->tag; + int numbonds = 0; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; nj = 0; - for (pj = Start_Index(i, reaxc->api->lists); pj < End_Index(i, reaxc->api->lists); ++pj) { - bo_ij = &(reaxc->api->lists->select.bond_list[pj]); + for (pj = Start_Index(i, reaxff->api->lists); pj < End_Index(i, reaxff->api->lists); ++pj) { + bo_ij = &(reaxff->api->lists->select.bond_list[pj]); j = bo_ij->nbr; jtag = tag[j]; bo_tmp = bo_ij->bo_data.BO; @@ -209,11 +207,11 @@ void FixReaxCBonds::FindBond(struct _reax_list * /*lists*/, int &numbonds) numneigh[i] = nj; if (nj > numbonds) numbonds = nj; } - + return numbonds; } /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::PassBuffer(double *buf, int &nbuf_local) +void FixReaxFFBonds::PassBuffer(double *buf, int &nbuf_local) { int i, j, k, numbonds; int nlocal = atom->nlocal; @@ -223,8 +221,8 @@ void FixReaxCBonds::PassBuffer(double *buf, int &nbuf_local) for (i = 0; i < nlocal; i++) { buf[j-1] = atom->tag[i]; buf[j+0] = atom->type[i]; - buf[j+1] = reaxc->api->workspace->total_bond_order[i]; - buf[j+2] = reaxc->api->workspace->nlp[i]; + buf[j+1] = reaxff->api->workspace->total_bond_order[i]; + buf[j+2] = reaxff->api->workspace->nlp[i]; buf[j+3] = atom->q[i]; buf[j+4] = numneigh[i]; numbonds = nint(buf[j+4]); @@ -248,7 +246,7 @@ void FixReaxCBonds::PassBuffer(double *buf, int &nbuf_local) /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local, +void FixReaxFFBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local, int natoms, int maxnum) { int i, j, k, itype; @@ -258,7 +256,7 @@ void FixReaxCBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local, bigint ntimestep = update->ntimestep; double sbotmp, nlptmp, avqtmp, abotmp; - double cutof3 = reaxc->api->control->bg_cut; + double cutof3 = reaxff->api->control->bg_cut; MPI_Request irequest, irequest2; if (me == 0) { @@ -320,7 +318,7 @@ void FixReaxCBonds::RecvBuffer(double *buf, int nbuf, int nbuf_local, /* ---------------------------------------------------------------------- */ -int FixReaxCBonds::nint(const double &r) +int FixReaxFFBonds::nint(const double &r) { int i = 0; if (r>0.0) i = static_cast(r+0.5); @@ -330,7 +328,7 @@ int FixReaxCBonds::nint(const double &r) /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::destroy() +void FixReaxFFBonds::destroy() { memory->destroy(abo); memory->destroy(neighid); @@ -339,16 +337,16 @@ void FixReaxCBonds::destroy() /* ---------------------------------------------------------------------- */ -void FixReaxCBonds::allocate() +void FixReaxFFBonds::allocate() { - memory->create(abo,nmax,MAXREAXBOND,"reax/c/bonds:abo"); - memory->create(neighid,nmax,MAXREAXBOND,"reax/c/bonds:neighid"); - memory->create(numneigh,nmax,"reax/c/bonds:numneigh"); + memory->create(abo,nmax,MAXREAXBOND,"reaxff/bonds:abo"); + memory->create(neighid,nmax,MAXREAXBOND,"reaxff/bonds:neighid"); + memory->create(numneigh,nmax,"reaxff/bonds:numneigh"); } /* ---------------------------------------------------------------------- */ -double FixReaxCBonds::memory_usage() +double FixReaxFFBonds::memory_usage() { double bytes; diff --git a/src/REAXFF/fix_reaxc_bonds.h b/src/REAXFF/fix_reaxff_bonds.h similarity index 82% rename from src/REAXFF/fix_reaxc_bonds.h rename to src/REAXFF/fix_reaxff_bonds.h index fbca39fa95..ceb763b205 100644 --- a/src/REAXFF/fix_reaxc_bonds.h +++ b/src/REAXFF/fix_reaxff_bonds.h @@ -14,7 +14,8 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(reax/c/bonds,FixReaxCBonds); +FixStyle(reaxff/bonds,FixReaxFFBonds); +FixStyle(reax/c/bonds,FixReaxFFBonds); // clang-format on #else @@ -25,10 +26,10 @@ FixStyle(reax/c/bonds,FixReaxCBonds); namespace LAMMPS_NS { -class FixReaxCBonds : public Fix { +class FixReaxFFBonds : public Fix { public: - FixReaxCBonds(class LAMMPS *, int, char **); - virtual ~FixReaxCBonds(); + FixReaxFFBonds(class LAMMPS *, int, char **); + virtual ~FixReaxFFBonds(); int setmask(); virtual void init(); void setup(int); @@ -43,8 +44,8 @@ class FixReaxCBonds : public Fix { void allocate(); void destroy(); - virtual void Output_ReaxC_Bonds(bigint, FILE *); - void FindBond(struct _reax_list*, int &); + virtual void Output_ReaxFF_Bonds(); + int FindBond(); void PassBuffer(double *, int &); void RecvBuffer(double *, int, int, int, int); int nint(const double &); @@ -52,7 +53,7 @@ class FixReaxCBonds : public Fix { bigint nvalid, nextvalid(); struct _reax_list *lists; - class PairReaxC *reaxc; + class PairReaxFF *reaxff; class NeighList *list; }; } diff --git a/src/REAXFF/fix_reaxc_species.cpp b/src/REAXFF/fix_reaxff_species.cpp similarity index 85% rename from src/REAXFF/fix_reaxc_species.cpp rename to src/REAXFF/fix_reaxff_species.cpp index da1307ac79..53746b968b 100644 --- a/src/REAXFF/fix_reaxc_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -17,7 +17,7 @@ Oleg Sergeev (VNIIA, sergeev@vniia.ru) ------------------------------------------------------------------------- */ -#include "fix_reaxc_species.h" +#include "fix_reaxff_species.h" #include "atom.h" #include "comm.h" @@ -31,7 +31,7 @@ #include "neighbor.h" #include "update.h" -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "reaxff_defs.h" #include @@ -41,10 +41,10 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : +FixReaxFFSpecies::FixReaxFFSpecies(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - if (narg < 7) error->all(FLERR,"Illegal fix reax/c/species command"); + if (narg < 7) error->all(FLERR,"Illegal fix reaxff/species command"); force_reneighbor = 0; @@ -69,9 +69,9 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : comm_forward = 4; if (nevery <= 0 || nrepeat <= 0 || nfreq <= 0) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); if (nfreq % nevery || nrepeat*nevery > nfreq) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); // Neighbor lists must stay unchanged during averaging of bonds, // but may be updated when no averaging is performed. @@ -96,11 +96,11 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : } if (me == 0 && rene_flag) { - error->warning(FLERR,"Resetting reneighboring criteria for fix reax/c/species"); + error->warning(FLERR,"Resetting reneighboring criteria for fix reaxff/species"); } tmparg = nullptr; - memory->create(tmparg,4,4,"reax/c/species:tmparg"); + memory->create(tmparg,4,4,"reaxff/species:tmparg"); strcpy(tmparg[0],arg[3]); strcpy(tmparg[1],arg[4]); strcpy(tmparg[2],arg[5]); @@ -121,7 +121,7 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : } else fp = fopen(arg[6],"w"); if (!fp) - error->one(FLERR,fmt::format("Cannot open fix reax/c/species file {}: " + error->one(FLERR,fmt::format("Cannot open fix reaxff/species file {}: " "{}",arg[6],utils::getsyserror())); } @@ -129,8 +129,8 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : clusterID = nullptr; int ntmp = 1; - memory->create(x0,ntmp,"reax/c/species:x0"); - memory->create(clusterID,ntmp,"reax/c/species:clusterID"); + memory->create(x0,ntmp,"reaxff/species:x0"); + memory->create(clusterID,ntmp,"reaxff/species:clusterID"); vector_atom = clusterID; BOCut = nullptr; @@ -149,7 +149,7 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : double bo_cut; bg_cut = 0.30; n = ntypes+1; - memory->create(BOCut,n,n,"reax/c/species:BOCut"); + memory->create(BOCut,n,n,"reaxff/species:BOCut"); for (i = 1; i < n; i ++) for (j = 1; j < n; j ++) BOCut[i][j] = bg_cut; @@ -168,16 +168,16 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : // set BO cutoff if (strcmp(arg[iarg],"cutoff") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix reax/c/species command"); + if (iarg+4 > narg) error->all(FLERR,"Illegal fix reaxff/species command"); itype = atoi(arg[iarg+1]); jtype = atoi(arg[iarg+2]); bo_cut = atof(arg[iarg+3]); if (itype > ntypes || jtype > ntypes) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); if (itype <= 0 || jtype <= 0) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); if (bo_cut > 1.0 || bo_cut < 0.0) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); BOCut[itype][jtype] = bo_cut; BOCut[jtype][itype] = bo_cut; @@ -185,7 +185,7 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : // modify element type names } else if (strcmp(arg[iarg],"element") == 0) { - if (iarg+ntypes+1 > narg) error->all(FLERR,"Illegal fix reax/c/species command"); + if (iarg+ntypes+1 > narg) error->all(FLERR,"Illegal fix reaxff/species command"); eletype = (char**) malloc(ntypes*sizeof(char*)); int len; @@ -199,11 +199,11 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : // position of molecules } else if (strcmp(arg[iarg],"position") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix reax/c/species command"); + if (iarg+3 > narg) error->all(FLERR,"Illegal fix reaxff/species command"); posflag = 1; posfreq = atoi(arg[iarg+1]); if (posfreq < nfreq || (posfreq%nfreq != 0)) - error->all(FLERR,"Illegal fix reax/c/species command"); + error->all(FLERR,"Illegal fix reaxff/species command"); filepos = new char[255]; strcpy(filepos,arg[iarg+2]); @@ -212,17 +212,17 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : } else { if (me == 0) { pos = fopen(filepos, "w"); - if (pos == nullptr) error->one(FLERR,"Cannot open fix reax/c/species position file"); + if (pos == nullptr) error->one(FLERR,"Cannot open fix reaxff/species position file"); } singlepos_opened = 1; multipos = 0; } iarg += 3; - } else error->all(FLERR,"Illegal fix reax/c/species command"); + } else error->all(FLERR,"Illegal fix reaxff/species command"); } if (!eleflag) { - memory->create(ele,ntypes+1,"reax/c/species:ele"); + memory->create(ele,ntypes+1,"reaxff/species:ele"); ele[0]='C'; if (ntypes > 1) ele[1]='H'; @@ -239,7 +239,7 @@ FixReaxCSpecies::FixReaxCSpecies(LAMMPS *lmp, int narg, char **arg) : /* ---------------------------------------------------------------------- */ -FixReaxCSpecies::~FixReaxCSpecies() +FixReaxFFSpecies::~FixReaxFFSpecies() { memory->destroy(ele); memory->destroy(BOCut); @@ -265,7 +265,7 @@ FixReaxCSpecies::~FixReaxCSpecies() /* ---------------------------------------------------------------------- */ -int FixReaxCSpecies::setmask() +int FixReaxFFSpecies::setmask() { int mask = 0; mask |= POST_INTEGRATE; @@ -274,27 +274,27 @@ int FixReaxCSpecies::setmask() /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::setup(int /*vflag*/) +void FixReaxFFSpecies::setup(int /*vflag*/) { ntotal = static_cast (atom->natoms); if (Name == nullptr) - memory->create(Name,ntypes,"reax/c/species:Name"); + memory->create(Name,ntypes,"reaxff/species:Name"); post_integrate(); } /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::init() +void FixReaxFFSpecies::init() { if (atom->tag_enable == 0) - error->all(FLERR,"Cannot use fix reax/c/species unless atoms have IDs"); + error->all(FLERR,"Cannot use fix reaxff/species unless atoms have IDs"); - reaxc = (PairReaxC *) force->pair_match("reax/c",0); - if (reaxc == nullptr) error->all(FLERR,"Cannot use fix reax/c/species without " - "pair_style reax/c, reax/c/kk, or reax/c/omp"); + reaxff = (PairReaxFF *) force->pair_match("^reax..",0); + if (reaxff == nullptr) error->all(FLERR,"Cannot use fix reaxff/species without " + "pair_style reaxff, reaxff/kk, or reaxff/omp"); - reaxc->fixspecies_flag = 1; + reaxff->fixspecies_flag = 1; // reset next output timestep if not yet set or timestep has been reset if (nvalid != update->ntimestep) @@ -303,9 +303,9 @@ void FixReaxCSpecies::init() // check if this fix has been called twice int count = 0; for (int i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"reax/c/species") == 0) count++; + if (strcmp(modify->fix[i]->style,"reaxff/species") == 0) count++; if (count > 1 && comm->me == 0) - error->warning(FLERR,"More than one fix reax/c/species"); + error->warning(FLERR,"More than one fix reaxff/species"); if (!setupflag) { // create a compute to store properties @@ -321,7 +321,7 @@ void FixReaxCSpecies::init() /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::create_compute() +void FixReaxFFSpecies::create_compute() { int narg; char **args; @@ -368,7 +368,7 @@ void FixReaxCSpecies::create_compute() /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::create_fix() +void FixReaxFFSpecies::create_fix() { int narg; char **args; @@ -420,22 +420,22 @@ void FixReaxCSpecies::create_fix() /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::init_list(int /*id*/, NeighList *ptr) +void FixReaxFFSpecies::init_list(int /*id*/, NeighList *ptr) { list = ptr; } /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::post_integrate() +void FixReaxFFSpecies::post_integrate() { - Output_ReaxC_Bonds(update->ntimestep,fp); + Output_ReaxFF_Bonds(update->ntimestep,fp); if (me == 0) fflush(fp); } /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::Output_ReaxC_Bonds(bigint ntimestep, FILE * /*fp*/) +void FixReaxFFSpecies::Output_ReaxFF_Bonds(bigint ntimestep, FILE * /*fp*/) { int Nmole, Nspec; @@ -451,8 +451,8 @@ void FixReaxCSpecies::Output_ReaxC_Bonds(bigint ntimestep, FILE * /*fp*/) nmax = atom->nmax; memory->destroy(x0); memory->destroy(clusterID); - memory->create(x0,nmax,"reax/c/species:x0"); - memory->create(clusterID,nmax,"reax/c/species:clusterID"); + memory->create(x0,nmax,"reaxff/species:x0"); + memory->create(clusterID,nmax,"reaxff/species:clusterID"); vector_atom = clusterID; } @@ -484,7 +484,7 @@ void FixReaxCSpecies::Output_ReaxC_Bonds(bigint ntimestep, FILE * /*fp*/) /* ---------------------------------------------------------------------- */ -AtomCoord FixReaxCSpecies::chAnchor(AtomCoord in1, AtomCoord in2) +AtomCoord FixReaxFFSpecies::chAnchor(AtomCoord in1, AtomCoord in2) { if (in1.x < in2.x) return in1; @@ -501,7 +501,7 @@ AtomCoord FixReaxCSpecies::chAnchor(AtomCoord in1, AtomCoord in2) /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::FindMolecule () +void FixReaxFFSpecies::FindMolecule () { int i,j,ii,jj,inum,itype,jtype,loop,looptot; int change,done,anychange; @@ -510,8 +510,8 @@ void FixReaxCSpecies::FindMolecule () double bo_tmp,bo_cut; double **spec_atom = f_SPECBOND->array_atom; - inum = reaxc->list->inum; - ilist = reaxc->list->ilist; + inum = reaxff->list->inum; + ilist = reaxff->list->ilist; for (ii = 0; ii < inum; ii++) { i = ilist[ii]; @@ -540,7 +540,7 @@ void FixReaxCSpecies::FindMolecule () itype = atom->type[i]; for (jj = 0; jj < MAXSPECBOND; jj++) { - j = reaxc->tmpid[i][jj]; + j = reaxff->tmpid[i][jj]; if ((j == 0) || (j < i)) continue; if (!(mask[j] & groupbit)) continue; @@ -575,7 +575,7 @@ void FixReaxCSpecies::FindMolecule () /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::SortMolecule(int &Nmole) +void FixReaxFFSpecies::SortMolecule(int &Nmole) { memory->destroy(molmap); molmap = nullptr; @@ -595,16 +595,16 @@ void FixReaxCSpecies::SortMolecule(int &Nmole) MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,world); if (flagall && me == 0) error->warning(FLERR,"Atom with cluster ID = 0 included in " - "fix reax/c/species group"); + "fix reaxff/species group"); MPI_Allreduce(&lo,&idlo,1,MPI_INT,MPI_MIN,world); MPI_Allreduce(&hi,&idhi,1,MPI_INT,MPI_MAX,world); if (idlo == ntotal) if (me == 0) error->warning(FLERR,"Atom with cluster ID = maxmol " - "included in fix reax/c/species group"); + "included in fix reaxff/species group"); int nlen = idhi - idlo + 1; - memory->create(molmap,nlen,"reax/c/species:molmap"); + memory->create(molmap,nlen,"reaxff/species:molmap"); for (n = 0; n < nlen; n++) molmap[n] = 0; for (n = 0; n < nlocal; n++) { @@ -613,7 +613,7 @@ void FixReaxCSpecies::SortMolecule(int &Nmole) } int *molmapall; - memory->create(molmapall,nlen,"reax/c/species:molmapall"); + memory->create(molmapall,nlen,"reaxff/species:molmapall"); MPI_Allreduce(molmap,molmapall,nlen,MPI_INT,MPI_MAX,world); Nmole = 0; @@ -646,7 +646,7 @@ void FixReaxCSpecies::SortMolecule(int &Nmole) /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::FindSpecies(int Nmole, int &Nspec) +void FixReaxFFSpecies::FindSpecies(int Nmole, int &Nspec) { int k, l, m, n, itype, cid; int flag_identity, flag_mol, flag_spec; @@ -656,16 +656,16 @@ void FixReaxCSpecies::FindSpecies(int Nmole, int &Nspec) memory->destroy(MolName); MolName = nullptr; - memory->create(MolName,Nmole*(ntypes+1),"reax/c/species:MolName"); + memory->create(MolName,Nmole*(ntypes+1),"reaxff/species:MolName"); memory->destroy(NMol); NMol = nullptr; - memory->create(NMol,Nmole,"reax/c/species:NMol"); + memory->create(NMol,Nmole,"reaxff/species:NMol"); for (m = 0; m < Nmole; m ++) NMol[m] = 1; - memory->create(Nameall,ntypes,"reax/c/species:Nameall"); - memory->create(NMolall,Nmole,"reax/c/species:NMolall"); + memory->create(Nameall,ntypes,"reaxff/species:Nameall"); + memory->create(NMolall,Nmole,"reaxff/species:NMolall"); for (m = 1, Nspec = 0; m <= Nmole; m ++) { for (n = 0; n < ntypes; n ++) Name[n] = 0; @@ -705,16 +705,16 @@ void FixReaxCSpecies::FindSpecies(int Nmole, int &Nspec) memory->destroy(nd); nd = nullptr; - memory->create(nd,Nspec,"reax/c/species:nd"); + memory->create(nd,Nspec,"reaxff/species:nd"); memory->destroy(MolType); MolType = nullptr; - memory->create(MolType,Nspec*(ntypes+2),"reax/c/species:MolType"); + memory->create(MolType,Nspec*(ntypes+2),"reaxff/species:MolType"); } /* ---------------------------------------------------------------------- */ -int FixReaxCSpecies::CheckExistence(int id, int ntypes) +int FixReaxFFSpecies::CheckExistence(int id, int ntypes) { int i, j, molid, flag; @@ -735,7 +735,7 @@ int FixReaxCSpecies::CheckExistence(int id, int ntypes) /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::WriteFormulas(int Nmole, int Nspec) +void FixReaxFFSpecies::WriteFormulas(int Nmole, int Nspec) { int i, j, itemp; bigint ntimestep = update->ntimestep; @@ -771,7 +771,7 @@ void FixReaxCSpecies::WriteFormulas(int Nmole, int Nspec) /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::OpenPos() +void FixReaxFFSpecies::OpenPos() { char *filecurrent; bigint ntimestep = update->ntimestep; @@ -792,7 +792,7 @@ void FixReaxCSpecies::OpenPos() if (me == 0) { pos = fopen(filecurrent, "w"); - if (pos == nullptr) error->one(FLERR,"Cannot open fix reax/c/species position file"); + if (pos == nullptr) error->one(FLERR,"Cannot open fix reaxff/species position file"); } else pos = nullptr; multipos_opened = 1; @@ -801,7 +801,7 @@ void FixReaxCSpecies::OpenPos() /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::WritePos(int Nmole, int Nspec) +void FixReaxFFSpecies::WritePos(int Nmole, int Nspec) { int i, itype, cid; int count, count_tmp, m, n, k; @@ -831,7 +831,7 @@ void FixReaxCSpecies::WritePos(int Nmole, int Nspec) } Nameall = nullptr; - memory->create(Nameall,ntypes,"reax/c/species:Nameall"); + memory->create(Nameall,ntypes,"reaxff/species:Nameall"); for (m = 1; m <= Nmole; m ++) { @@ -916,7 +916,7 @@ void FixReaxCSpecies::WritePos(int Nmole, int Nspec) /* ---------------------------------------------------------------------- */ -double FixReaxCSpecies::compute_vector(int n) +double FixReaxFFSpecies::compute_vector(int n) { if (n == 0) return vector_nmole; @@ -928,7 +928,7 @@ double FixReaxCSpecies::compute_vector(int n) /* ---------------------------------------------------------------------- */ -int FixReaxCSpecies::nint(const double &r) +int FixReaxFFSpecies::nint(const double &r) { int i = 0; if (r>0.0) i = static_cast(r+0.5); @@ -938,7 +938,7 @@ int FixReaxCSpecies::nint(const double &r) /* ---------------------------------------------------------------------- */ -int FixReaxCSpecies::pack_forward_comm(int n, int *list, double *buf, +int FixReaxFFSpecies::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { int i,j,m; @@ -957,7 +957,7 @@ int FixReaxCSpecies::pack_forward_comm(int n, int *list, double *buf, /* ---------------------------------------------------------------------- */ -void FixReaxCSpecies::unpack_forward_comm(int n, int first, double *buf) +void FixReaxFFSpecies::unpack_forward_comm(int n, int first, double *buf) { int i,m,last; @@ -974,7 +974,7 @@ void FixReaxCSpecies::unpack_forward_comm(int n, int first, double *buf) /* ---------------------------------------------------------------------- */ -double FixReaxCSpecies::memory_usage() +double FixReaxFFSpecies::memory_usage() { double bytes; diff --git a/src/REAXFF/fix_reaxc_species.h b/src/REAXFF/fix_reaxff_species.h similarity index 87% rename from src/REAXFF/fix_reaxc_species.h rename to src/REAXFF/fix_reaxff_species.h index 225e0bcf24..1957c1f8b1 100644 --- a/src/REAXFF/fix_reaxc_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -14,7 +14,8 @@ #ifdef FIX_CLASS // clang-format off -FixStyle(reax/c/species,FixReaxCSpecies); +FixStyle(reaxff/species,FixReaxFFSpecies); +FixStyle(reax/c/species,FixReaxFFSpecies); // clang-format on #else @@ -31,10 +32,10 @@ typedef struct { double x, y, z; } AtomCoord; -class FixReaxCSpecies : public Fix { +class FixReaxFFSpecies : public Fix { public: - FixReaxCSpecies(class LAMMPS *, int, char **); - virtual ~FixReaxCSpecies(); + FixReaxFFSpecies(class LAMMPS *, int, char **); + virtual ~FixReaxFFSpecies(); int setmask(); virtual void init(); void init_list(int, class NeighList *); @@ -59,7 +60,7 @@ class FixReaxCSpecies : public Fix { int singlepos_opened, multipos_opened; char *ele, **eletype, *filepos; - void Output_ReaxC_Bonds(bigint, FILE *); + void Output_ReaxFF_Bonds(bigint, FILE *); void create_compute(); void create_fix(); AtomCoord chAnchor(AtomCoord, AtomCoord); @@ -80,7 +81,7 @@ class FixReaxCSpecies : public Fix { class NeighList *list; class FixAveAtom *f_SPECBOND; - class PairReaxC *reaxc; + class PairReaxFF *reaxff; }; } diff --git a/src/REAXFF/pair_reaxc.cpp b/src/REAXFF/pair_reaxff.cpp similarity index 88% rename from src/REAXFF/pair_reaxc.cpp rename to src/REAXFF/pair_reaxff.cpp index 389b7d9e13..0aea45b9cd 100644 --- a/src/REAXFF/pair_reaxc.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -17,18 +17,18 @@ Hasan Metin Aktulga, Michigan State University, hma@cse.msu.edu Per-atom energy/virial added by Ray Shan (Sandia) - Fix reax/c/bonds and fix reax/c/species for pair_style reax/c added by + Fix reaxff/bonds and fix reaxff/species for pair_style reaxff added by Ray Shan (Sandia) Hybrid and hybrid/overlay compatibility added by Ray Shan (Sandia) ------------------------------------------------------------------------- */ -#include "pair_reaxc.h" +#include "pair_reaxff.h" #include "atom.h" #include "citeme.h" #include "comm.h" #include "error.h" -#include "fix_reaxc.h" +#include "fix_reaxff.h" #include "force.h" #include "memory.h" #include "modify.h" @@ -47,7 +47,7 @@ using namespace LAMMPS_NS; using namespace ReaxFF; static const char cite_pair_reax_c[] = - "pair reax/c command:\n\n" + "pair reaxff command:\n\n" "@Article{Aktulga12,\n" " author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama},\n" " title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques},\n" @@ -59,7 +59,7 @@ static const char cite_pair_reax_c[] = /* ---------------------------------------------------------------------- */ -PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) +PairReaxFF::PairReaxFF(LAMMPS *lmp) : Pair(lmp) { if (lmp->citeme) lmp->citeme->add(cite_pair_reax_c); @@ -70,7 +70,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) centroidstressflag = CENTROID_NOTAVAIL; ghostneigh = 1; - fix_id = utils::strdup("REAXC_" + std::to_string(instance_me)); + fix_id = utils::strdup("REAXFF_" + std::to_string(instance_me)); api = new API; @@ -102,7 +102,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) api->system->omp_active = 0; - fix_reax = nullptr; + fix_reaxff = nullptr; tmpid = nullptr; tmpbo = nullptr; @@ -117,11 +117,11 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) /* ---------------------------------------------------------------------- */ -PairReaxC::~PairReaxC() +PairReaxFF::~PairReaxFF() { if (copymode) return; - if (fix_reax) modify->delete_fix(fix_id); + if (fix_reaxff) modify->delete_fix(fix_id); delete[] fix_id; if (setup_flag) { @@ -166,7 +166,7 @@ PairReaxC::~PairReaxC() /* ---------------------------------------------------------------------- */ -void PairReaxC::allocate() +void PairReaxFF::allocate() { allocated = 1; int n = atom->ntypes; @@ -183,7 +183,7 @@ void PairReaxC::allocate() /* ---------------------------------------------------------------------- */ -void PairReaxC::settings(int narg, char **arg) +void PairReaxFF::settings(int narg, char **arg) { if (narg < 1) error->all(FLERR,"Illegal pair_style command"); @@ -226,49 +226,49 @@ void PairReaxC::settings(int narg, char **arg) while (iarg < narg) { if (strcmp(arg[iarg],"checkqeq") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); if (strcmp(arg[iarg+1],"yes") == 0) qeqflag = 1; else if (strcmp(arg[iarg+1],"no") == 0) qeqflag = 0; - else error->all(FLERR,"Illegal pair_style reax/c command"); + else error->all(FLERR,"Illegal pair_style reaxff command"); iarg += 2; } else if (strcmp(arg[iarg],"enobonds") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); if (strcmp(arg[iarg+1],"yes") == 0) api->control->enobondsflag = 1; else if (strcmp(arg[iarg+1],"no") == 0) api->control->enobondsflag = 0; - else error->all(FLERR,"Illegal pair_style reax/c command"); + else error->all(FLERR,"Illegal pair_style reaxff command"); iarg += 2; } else if (strcmp(arg[iarg],"lgvdw") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); if (strcmp(arg[iarg+1],"yes") == 0) api->control->lgflag = 1; else if (strcmp(arg[iarg+1],"no") == 0) api->control->lgflag = 0; - else error->all(FLERR,"Illegal pair_style reax/c command"); + else error->all(FLERR,"Illegal pair_style reaxff command"); iarg += 2; } else if (strcmp(arg[iarg],"safezone") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); api->system->safezone = utils::numeric(FLERR,arg[iarg+1],false,lmp); if (api->system->safezone < 0.0) - error->all(FLERR,"Illegal pair_style reax/c safezone command"); + error->all(FLERR,"Illegal pair_style reaxff safezone command"); api->system->saferzone = api->system->safezone*1.2 + 0.2; iarg += 2; } else if (strcmp(arg[iarg],"mincap") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); api->system->mincap = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (api->system->mincap < 0) - error->all(FLERR,"Illegal pair_style reax/c mincap command"); + error->all(FLERR,"Illegal pair_style reaxff mincap command"); iarg += 2; } else if (strcmp(arg[iarg],"minhbonds") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reax/c command"); + if (iarg+2 > narg) error->all(FLERR,"Illegal pair_style reaxff command"); api->system->minhbonds = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (api->system->minhbonds < 0) - error->all(FLERR,"Illegal pair_style reax/c minhbonds command"); + error->all(FLERR,"Illegal pair_style reaxff minhbonds command"); iarg += 2; - } else error->all(FLERR,"Illegal pair_style reax/c command"); + } else error->all(FLERR,"Illegal pair_style reaxff command"); } } /* ---------------------------------------------------------------------- */ -void PairReaxC::coeff(int nargs, char **args) +void PairReaxFF::coeff(int nargs, char **args) { if (!allocated) allocate(); @@ -331,15 +331,15 @@ void PairReaxC::coeff(int nargs, char **args) /* ---------------------------------------------------------------------- */ -void PairReaxC::init_style() +void PairReaxFF::init_style() { if (!atom->q_flag) - error->all(FLERR,"Pair style reax/c requires atom attribute q"); + error->all(FLERR,"Pair style reaxff requires atom attribute q"); bool have_qeq = ((modify->find_fix_by_style("^qeq/reax") != -1) || (modify->find_fix_by_style("^qeq/shielded") != -1)); if (!have_qeq && qeqflag == 1) - error->all(FLERR,"Pair reax/c requires use of fix qeq/reax or qeq/shielded"); + error->all(FLERR,"Pair reaxff requires use of fix qeq/reaxff or qeq/shielded"); api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts @@ -347,14 +347,14 @@ void PairReaxC::init_style() api->system->wsize = comm->nprocs; if (atom->tag_enable == 0) - error->all(FLERR,"Pair style reax/c requires atom IDs"); + error->all(FLERR,"Pair style reaxff requires atom IDs"); if (force->newton_pair == 0) - error->all(FLERR,"Pair style reax/c requires newton pair on"); + error->all(FLERR,"Pair style reaxff requires newton pair on"); // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT if (atom->natoms > MAXSMALLINT) - error->all(FLERR,"Too many atoms for pair style reax/c"); + error->all(FLERR,"Too many atoms for pair style reaxff"); // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs @@ -368,15 +368,15 @@ void PairReaxC::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - if (fix_reax == nullptr) { - modify->add_fix(fmt::format("{} all REAXC",fix_id)); - fix_reax = (FixReaxC *) modify->fix[modify->nfix-1]; + if (fix_reaxff == nullptr) { + modify->add_fix(fmt::format("{} all REAXFF",fix_id)); + fix_reaxff = (FixReaxFF *) modify->fix[modify->nfix-1]; } } /* ---------------------------------------------------------------------- */ -void PairReaxC::setup() +void PairReaxFF::setup() { int oldN; int mincap = api->system->mincap; @@ -391,8 +391,8 @@ void PairReaxC::setup() setup_flag = 1; - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; // determine the local and total capacity @@ -408,7 +408,7 @@ void PairReaxC::setup() int num_nbrs = estimate_reax_lists(); if (num_nbrs < 0) - error->all(FLERR,"Too many neighbors for pair style reax/c"); + error->all(FLERR,"Too many neighbors for pair style reaxff"); Make_List(api->system->total_cap,num_nbrs,TYP_FAR_NEIGHBOR,api->lists+FAR_NBRS); (api->lists+FAR_NBRS)->error_ptr=error; @@ -440,7 +440,7 @@ void PairReaxC::setup() /* ---------------------------------------------------------------------- */ -double PairReaxC::init_one(int i, int j) +double PairReaxFF::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -450,16 +450,16 @@ double PairReaxC::init_one(int i, int j) /* ---------------------------------------------------------------------- */ -void PairReaxC::compute(int eflag, int vflag) +void PairReaxFF::compute(int eflag, int vflag) { double evdwl,ecoul; // communicate num_bonds once every reneighboring // 2 num arrays stored by fix, grab ptr to them - if (neighbor->ago == 0) comm->forward_comm_fix(fix_reax); - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + if (neighbor->ago == 0) comm->forward_comm_fix(fix_reaxff); + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; evdwl = ecoul = 0.0; ev_init(eflag,vflag); @@ -528,7 +528,7 @@ void PairReaxC::compute(int eflag, int vflag) api->data->step = update->ntimestep; - // populate tmpid and tmpbo arrays for fix reax/c/species + // populate tmpid and tmpbo arrays for fix reaxff/species int i, j; if (fixspecies_flag) { @@ -552,10 +552,10 @@ void PairReaxC::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairReaxC::write_reax_atoms() +void PairReaxFF::write_reax_atoms() { - int *num_bonds = fix_reax->num_bonds; - int *num_hbonds = fix_reax->num_hbonds; + int *num_bonds = fix_reaxff->num_bonds; + int *num_hbonds = fix_reaxff->num_hbonds; if (api->system->N > api->system->total_cap) error->all(FLERR,"Too many ghost atoms"); @@ -574,7 +574,7 @@ void PairReaxC::write_reax_atoms() /* ---------------------------------------------------------------------- */ -void PairReaxC::get_distance(rvec xj, rvec xi, double *d_sqr, rvec *dvec) +void PairReaxFF::get_distance(rvec xj, rvec xi, double *d_sqr, rvec *dvec) { (*dvec)[0] = xj[0] - xi[0]; (*dvec)[1] = xj[1] - xi[1]; @@ -584,7 +584,7 @@ void PairReaxC::get_distance(rvec xj, rvec xi, double *d_sqr, rvec *dvec) /* ---------------------------------------------------------------------- */ -void PairReaxC::set_far_nbr(far_neighbor_data *fdest, +void PairReaxFF::set_far_nbr(far_neighbor_data *fdest, int j, double d, rvec dvec) { fdest->nbr = j; @@ -595,7 +595,7 @@ void PairReaxC::set_far_nbr(far_neighbor_data *fdest, /* ---------------------------------------------------------------------- */ -int PairReaxC::estimate_reax_lists() +int PairReaxFF::estimate_reax_lists() { int itr_i, itr_j, i, j; int num_nbrs, num_marked; @@ -641,7 +641,7 @@ int PairReaxC::estimate_reax_lists() /* ---------------------------------------------------------------------- */ -int PairReaxC::write_reax_lists() +int PairReaxFF::write_reax_lists() { int itr_i, itr_j, i, j; int num_nbrs; @@ -697,7 +697,7 @@ int PairReaxC::write_reax_lists() /* ---------------------------------------------------------------------- */ -void PairReaxC::read_reax_forces(int /*vflag*/) +void PairReaxFF::read_reax_forces(int /*vflag*/) { for (int i = 0; i < api->system->N; ++i) { api->system->my_atoms[i].f[0] = api->workspace->f[i][0]; @@ -713,7 +713,7 @@ void PairReaxC::read_reax_forces(int /*vflag*/) /* ---------------------------------------------------------------------- */ -void *PairReaxC::extract(const char *str, int &dim) +void *PairReaxFF::extract(const char *str, int &dim) { dim = 1; if (strcmp(str,"chi") == 0 && chi) { @@ -739,7 +739,7 @@ void *PairReaxC::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -double PairReaxC::memory_usage() +double PairReaxFF::memory_usage() { double bytes = 0.0; @@ -747,12 +747,12 @@ double PairReaxC::memory_usage() bytes += (double)1.0 * api->system->N * sizeof(int); bytes += (double)1.0 * api->system->N * sizeof(double); - // From reaxc_allocate: BO + // From reaxff_allocate: BO bytes += (double)1.0 * api->system->total_cap * sizeof(reax_atom); bytes += (double)19.0 * api->system->total_cap * sizeof(double); bytes += (double)3.0 * api->system->total_cap * sizeof(int); - // From reaxc_lists + // From reaxff_lists bytes += (double)2.0 * api->lists->n * sizeof(int); bytes += (double)api->lists->num_intrs * sizeof(three_body_interaction_data); bytes += (double)api->lists->num_intrs * sizeof(bond_data); @@ -767,7 +767,7 @@ double PairReaxC::memory_usage() /* ---------------------------------------------------------------------- */ -void PairReaxC::FindBond() +void PairReaxFF::FindBond() { int i, j, pj, nj; double bo_tmp, bo_cut; @@ -788,7 +788,7 @@ void PairReaxC::FindBond() tmpid[i][nj] = j; tmpbo[i][nj] = bo_tmp; nj ++; - if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in reaxc_defs.h"); + if (nj > MAXSPECBOND) error->all(FLERR,"Increase MAXSPECBOND in reaxff_defs.h"); } } } diff --git a/src/REAXFF/pair_reaxc.h b/src/REAXFF/pair_reaxff.h similarity index 88% rename from src/REAXFF/pair_reaxc.h rename to src/REAXFF/pair_reaxff.h index 36f5bf61d5..f9f3b636c3 100644 --- a/src/REAXFF/pair_reaxc.h +++ b/src/REAXFF/pair_reaxff.h @@ -24,12 +24,13 @@ #ifdef PAIR_CLASS // clang-format off -PairStyle(reax/c,PairReaxC); +PairStyle(reaxff,PairReaxFF); +PairStyle(reax/c,PairReaxFF); // clang-format on #else -#ifndef LMP_PAIR_REAXC_H -#define LMP_PAIR_REAXC_H +#ifndef LMP_PAIR_REAXFF_H +#define LMP_PAIR_REAXFF_H #include "pair.h" @@ -40,10 +41,10 @@ namespace ReaxFF { namespace LAMMPS_NS { -class PairReaxC : public Pair { +class PairReaxFF : public Pair { public: - PairReaxC(class LAMMPS *); - ~PairReaxC(); + PairReaxFF(class LAMMPS *); + ~PairReaxFF(); void compute(int, int); void settings(int, char **); void coeff(int, char **); @@ -60,7 +61,7 @@ class PairReaxC : public Pair { protected: char *fix_id; double cutmax; - class FixReaxC *fix_reax; + class FixReaxFF *fix_reaxff; double *chi,*eta,*gamma; int qeqflag; @@ -93,7 +94,7 @@ protected: E: Too many ghost atoms Number of ghost atoms has increased too much during simulation and has exceeded -the size of reax/c arrays. Increase safe_zone and min_cap in pair_style reax/c +the size of reaxff arrays. Increase safe_zone and min_cap in pair_style reaxff command */ diff --git a/src/REAXFF/reaxc_allocate.cpp b/src/REAXFF/reaxff_allocate.cpp similarity index 100% rename from src/REAXFF/reaxc_allocate.cpp rename to src/REAXFF/reaxff_allocate.cpp diff --git a/src/REAXFF/reaxc_bond_orders.cpp b/src/REAXFF/reaxff_bond_orders.cpp similarity index 100% rename from src/REAXFF/reaxc_bond_orders.cpp rename to src/REAXFF/reaxff_bond_orders.cpp diff --git a/src/REAXFF/reaxc_bonds.cpp b/src/REAXFF/reaxff_bonds.cpp similarity index 100% rename from src/REAXFF/reaxc_bonds.cpp rename to src/REAXFF/reaxff_bonds.cpp diff --git a/src/REAXFF/reaxc_control.cpp b/src/REAXFF/reaxff_control.cpp similarity index 100% rename from src/REAXFF/reaxc_control.cpp rename to src/REAXFF/reaxff_control.cpp diff --git a/src/REAXFF/reaxff_defs.h b/src/REAXFF/reaxff_defs.h index 868f6e22c2..c6df5de0ea 100644 --- a/src/REAXFF/reaxff_defs.h +++ b/src/REAXFF/reaxff_defs.h @@ -50,8 +50,8 @@ #define DANGER_ZONE 0.90 #define LOOSE_ZONE 0.75 -#define MAXREAXBOND 24 /* used in fix_reaxc_bonds.cpp and pair_reaxc.cpp */ -#define MAXSPECBOND 24 /* used in fix_reaxc_species.cpp and pair_reaxc.cpp */ +#define MAXREAXBOND 24 /* used in fix_reaxff_bonds.cpp and pair_reaxff.cpp */ +#define MAXSPECBOND 24 /* used in fix_reaxff_species.cpp and pair_reaxff.cpp */ #define REAX_MAX_3BODY_PARAM 5 #define REAX_MAX_4BODY_PARAM 5 diff --git a/src/REAXFF/reaxc_ffield.cpp b/src/REAXFF/reaxff_ffield.cpp similarity index 100% rename from src/REAXFF/reaxc_ffield.cpp rename to src/REAXFF/reaxff_ffield.cpp diff --git a/src/REAXFF/reaxc_forces.cpp b/src/REAXFF/reaxff_forces.cpp similarity index 100% rename from src/REAXFF/reaxc_forces.cpp rename to src/REAXFF/reaxff_forces.cpp diff --git a/src/REAXFF/reaxc_hydrogen_bonds.cpp b/src/REAXFF/reaxff_hydrogen_bonds.cpp similarity index 100% rename from src/REAXFF/reaxc_hydrogen_bonds.cpp rename to src/REAXFF/reaxff_hydrogen_bonds.cpp diff --git a/src/REAXFF/reaxc_init_md.cpp b/src/REAXFF/reaxff_init_md.cpp similarity index 100% rename from src/REAXFF/reaxc_init_md.cpp rename to src/REAXFF/reaxff_init_md.cpp diff --git a/src/REAXFF/reaxc_list.cpp b/src/REAXFF/reaxff_list.cpp similarity index 100% rename from src/REAXFF/reaxc_list.cpp rename to src/REAXFF/reaxff_list.cpp diff --git a/src/REAXFF/reaxc_lookup.cpp b/src/REAXFF/reaxff_lookup.cpp similarity index 100% rename from src/REAXFF/reaxc_lookup.cpp rename to src/REAXFF/reaxff_lookup.cpp diff --git a/src/REAXFF/reaxc_multi_body.cpp b/src/REAXFF/reaxff_multi_body.cpp similarity index 100% rename from src/REAXFF/reaxc_multi_body.cpp rename to src/REAXFF/reaxff_multi_body.cpp diff --git a/src/REAXFF/reaxc_nonbonded.cpp b/src/REAXFF/reaxff_nonbonded.cpp similarity index 100% rename from src/REAXFF/reaxc_nonbonded.cpp rename to src/REAXFF/reaxff_nonbonded.cpp diff --git a/src/REAXFF/reaxc_reset_tools.cpp b/src/REAXFF/reaxff_reset_tools.cpp similarity index 100% rename from src/REAXFF/reaxc_reset_tools.cpp rename to src/REAXFF/reaxff_reset_tools.cpp diff --git a/src/REAXFF/reaxc_tool_box.cpp b/src/REAXFF/reaxff_tool_box.cpp similarity index 100% rename from src/REAXFF/reaxc_tool_box.cpp rename to src/REAXFF/reaxff_tool_box.cpp diff --git a/src/REAXFF/reaxc_torsion_angles.cpp b/src/REAXFF/reaxff_torsion_angles.cpp similarity index 100% rename from src/REAXFF/reaxc_torsion_angles.cpp rename to src/REAXFF/reaxff_torsion_angles.cpp diff --git a/src/REAXFF/reaxc_valence_angles.cpp b/src/REAXFF/reaxff_valence_angles.cpp similarity index 100% rename from src/REAXFF/reaxc_valence_angles.cpp rename to src/REAXFF/reaxff_valence_angles.cpp diff --git a/tools/README b/tools/README index 0f6f36e78a..eb329e27cd 100644 --- a/tools/README +++ b/tools/README @@ -43,7 +43,6 @@ phonon post-process output of the fix phonon command polybond Python tool for programmable polymer bonding pymol_asphere convert LAMMPS output of ellipsoids to PyMol format python Python scripts for post-processing LAMMPS output -reax Tools for analyzing output of ReaxFF simulations replica tool to reorder LAMMPS replica trajectories according to temperature singularity Singularity container descriptions suitable for LAMMPS development smd convert Smooth Mach Dynamics triangles to VTK diff --git a/tools/reax/Cutoff.dic b/tools/reax/Cutoff.dic deleted file mode 100644 index 7c52b74468..0000000000 --- a/tools/reax/Cutoff.dic +++ /dev/null @@ -1,14 +0,0 @@ -# Interesting name. This file contains -# the bond-order cut off for each -# pair of ReaxFF elements -C N 0.3 -C C 0.55 -C O 0.65 -C H 0.4 -O O 0.65 -N O 0.40 -O H 0.4 -H H 0.55 -H N 0.55 -N N 0.55 -# diff --git a/tools/reax/README.txt b/tools/reax/README.txt deleted file mode 100644 index 3c9fe4506b..0000000000 --- a/tools/reax/README.txt +++ /dev/null @@ -1,10 +0,0 @@ -=== ReaxFF tools === -=============================== - -The programs in this folder can be used to analyze the -output of simulations using the ReaxFF potentials; - -reaxc_bond.pl: reads the bonding information in the - .trj file produced by pair_style reax/c and - outputs molecule counts for each frame. - diff --git a/tools/reax/reaxc_bond.pl b/tools/reax/reaxc_bond.pl deleted file mode 100755 index cc0fd8f238..0000000000 --- a/tools/reax/reaxc_bond.pl +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/perl -use Getopt::Long; -Getopt::Long::Configure ('bundling'); - -################################################################# -# # -# This script is designed to take the bond information from a # -# Lammps/reaxc *.trj file and output a molecular fraction file # -# for each frame. # -# # -# written by Mike Russo, PSU # -# modified by Aidan Thompson, 5/12/2011 # -# # -# The required .trj file is generated by running LAMMPS # -# with pair_style reax/c and the following settings in # -# the corresponding reax/c control file # -# write_freq 25 ! write trajectory after so many steps -# traj_compress 0 ! 0: no compression 1: uses zlib to compress trajectory output -# traj_title TATB ! (no white spaces) -# atom_info 0 ! 0: no atom info, 1: print basic atom info in the trajectory file -# atom_forces 0 ! 0: basic atom format, 1: print force on each atom in the trajectory file -# atom_velocities 0 ! 0: basic atom format, 1: print the velocity of each atom in the trajectory file -# bond_info 1 ! 0: do not print bonds, 1: print bonds in the trajectory file -# angle_info 0 ! 0: do not print angles, 1: print angles in the trajectory file -# # -################################################################# - -################################################################# -# Setting up some default variables, and options for the user # -# to input. # -################################################################# -$in_file = "bonds.trj"; -@test = qw(C H O N); -GetOptions ('f|file=s' => \$in_file, 'a|atoms=s' => \@atoms, 'h|help' => \$help); -if($help) { - print "Options for this program:\n-f --file for input file default= bonds.trj\n-a --atoms atom types (in correct order and input separately) default= @test\n"; - exit; -} -open INPUT, "<$in_file" or die "Cannot open $in_file: $!"; -open OUTPUT, ">frac.dat" or die "Cannot open output file: $!"; - -if(@atoms) { - @test = @atoms; -} - -print "Input for this run:\n Input file = $in_file\n Atom types = @test\n"; -################################################################# - -################################################################# -# Main loop of the script. Goes through each frames bond list. # -################################################################# -$i = 0; -$section = 0; -$at_count = -1; -while() { - if(/chars_to_skip_section/) { - $section++; - &bonds if($section > 2); - next; - } - next if($section <= 0); #skipping the header section - next if(/\s*[A-Za-z]/); #skip text lines - - split; - if ($section == 1) { - $q = $_[0]; - $temp = $_[1]; - $q--; - $at_type[$q] = $temp; - next; - } - - $_[0]--; - $_[1]--; -# Add i-j and j-i entries - push @{$list[$_[0]]}, $_[1]; - push @{$list[$_[1]]}, $_[0]; - $at_count++ if($section == 2); -} -$section++; -&bonds; -close(INPUT); -################################################################# - -################################################################# -# Subroutine bonds: Uses the bond information to generate a # -# count for each species, put them into molecules, and then # -# count the number of each molecule type. # -################################################################# -sub bonds { - $flag = (); - $k = 0; - for(0..$#list) { - if($flag[$_] == 0) { - push @{$full_list[$k]}, $_; - foreach $atom (@{$full_list[$k]}) { - for($o = 0; $o <= $#{$list[$atom]}; $o++) { - unless(grep /^$list[$atom][$o]$/, @{$full_list[$k]}) { - push @{$full_list[$k]}, $list[$atom][$o]; - $flag[$list[$atom][$o]] = 1; - } - } - } - } else { - next; - } - $k++; - } - -### Output section ### - $frame = $section - 2; - open OUTPUT2, ">temp_$frame.dat" or die "Cannot open temp file: $!"; - print OUTPUT2 "Frame # $frame\n"; - for($m = 0; $m < $k; $m++) { #cycle through each molecule - foreach $atom ((@{$full_list[$m]})) { #for each atom in this molecule - ${"$test[$at_type[$atom]]"} += 1; #Create variable named C,H,O, etc and set it to count - } - print OUTPUT2 "Mol $m = "; - foreach $atom (@test) { - print OUTPUT2 "$atom${$atom}" if(${$atom} > 0); - } - print OUTPUT2 "\n"; - for($r = 0; $r <= $#test; $r++) { - ${"$test[$r]"} = 0; - } - } - - close (OUTPUT2); #close the temp file as output - open INPUT3, ") { - next if(/Frame/); - split; - push @mol_list, $_[3] unless(grep /^$_[3]$/, @mol_list); - ${"$_[3]"}++; - } - print OUTPUT "Frame # $frame\n"; - foreach $mol (@mol_list) { - printf OUTPUT "%4d %s\n", ${"$mol"}, $mol; - ${"$mol"} = 0; - } - @mol_list = (); -### - -### Cleanup between frames ### - for(0..$at_count) { - @{$full_list[$_]} = (); - @{$list[$_]} = (); - } -### -} -################################################################# - From e12070316b4f8c30b8904a6cdd9fc29c8d6696ba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:00:18 -0400 Subject: [PATCH 118/352] fix spelling issue --- 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 45728b5caf..778fa93e84 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2744,6 +2744,7 @@ reamin reax REAXFF ReaxFF +reaxff rebo recursing Ree From 03249dec8bf86e59906db4c6cc9102847e8ac4c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:00:27 -0400 Subject: [PATCH 119/352] reformat --- src/compute_pair.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/compute_pair.cpp b/src/compute_pair.cpp index a5bf54d5ef..7e1b6fc062 100644 --- a/src/compute_pair.cpp +++ b/src/compute_pair.cpp @@ -14,12 +14,13 @@ #include "compute_pair.h" -#include -#include -#include "update.h" +#include "error.h" #include "force.h" #include "pair.h" -#include "error.h" +#include "update.h" + +#include +#include using namespace LAMMPS_NS; @@ -89,9 +90,9 @@ ComputePair::ComputePair(LAMMPS *lmp, int narg, char **arg) : ComputePair::~ComputePair() { - delete [] pstyle; - delete [] one; - delete [] vector; + delete[] pstyle; + delete[] one; + delete[] vector; } /* ---------------------------------------------------------------------- */ From 5b46e679c818535a78723c33110c109dc954deb4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:00:43 -0400 Subject: [PATCH 120/352] update style names --- unittest/force-styles/tests/atomic-pair-reax_c.yaml | 8 ++++---- unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml | 8 ++++---- unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml | 4 ++-- .../force-styles/tests/atomic-pair-reax_c_tabulate.yaml | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index 9eaad2a949..c4d41a2f2a 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -3,8 +3,8 @@ lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:45 2021 epsilon: 1e-11 prerequisites: ! | - pair reax/c - fix qeq/reax + pair reaxff + fix qeq/reaxff pre_commands: ! | echo screen variable newton_pair delete @@ -27,9 +27,9 @@ pre_commands: ! | set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c + fix qeq all qeq/reaxff 1 0.0 8.0 1.0e-20 reaxff input_file: in.empty -pair_style: reax/c NULL checkqeq yes +pair_style: reaxff NULL checkqeq yes pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index 59cb7b5261..c766c242f9 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -3,8 +3,8 @@ lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:47 2021 epsilon: 1e-12 prerequisites: ! | - pair reax/c - fix qeq/reax + pair reaxff + fix qeq/reaxff pre_commands: ! | echo screen variable newton_pair delete @@ -27,9 +27,9 @@ pre_commands: ! | set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c + fix qeq all qeq/reaxff 1 0.0 8.0 1.0e-20 reaxff input_file: in.empty -pair_style: reax/c NULL checkqeq yes lgvdw yes safezone 1.6 +pair_style: reaxff NULL checkqeq yes lgvdw yes safezone 1.6 pair_coeff: ! | * * ffield.reax.lg H C O extract: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml index 97fbc95c46..de9527d99e 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml @@ -3,7 +3,7 @@ lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:48 2021 epsilon: 5e-13 prerequisites: ! | - pair reax/c + pair reaxff pre_commands: ! | echo screen variable newton_pair delete @@ -24,7 +24,7 @@ pre_commands: ! | velocity all create 100 4534624 loop geom post_commands: ! "" input_file: in.empty -pair_style: reax/c NULL checkqeq no +pair_style: reaxff NULL checkqeq no pair_coeff: ! | * * ffield.reax.mattsson C C extract: ! "" diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml index 23e046037c..59a7f2eea4 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml @@ -3,8 +3,8 @@ lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:50 2021 epsilon: 1e-12 prerequisites: ! | - pair reax/c - fix qeq/reax + pair reaxff + fix qeq/reaxff pre_commands: ! | echo screen shell cp ${input_dir}/reaxff.control reaxff-1.control @@ -28,9 +28,9 @@ pre_commands: ! | set type 3 charge -0.01 velocity all create 100 4534624 loop geom post_commands: ! | - fix qeq all qeq/reax 1 0.0 8.0 1.0e-20 reax/c + fix qeq all qeq/reaxff 1 0.0 8.0 1.0e-20 reaxff input_file: in.empty -pair_style: reax/c reaxff-1.control checkqeq yes +pair_style: reaxff reaxff-1.control checkqeq yes pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" From 9cf50eb4db669ee7f6b9a0e5fc5647db535eba8a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:44:18 -0400 Subject: [PATCH 121/352] add allocation and reduction for per-atom stress with OpenMP --- src/OPENMP/pair_reaxff_omp.cpp | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 48fa9e8312..69d68e67e8 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -58,6 +58,7 @@ #include #endif +#include "omp_compat.h" #include "suffix.h" using namespace LAMMPS_NS; using namespace ReaxFF; @@ -236,7 +237,21 @@ void PairReaxFFOMP::compute(int eflag, int vflag) api->system->n = atom->nlocal; // my atoms api->system->N = atom->nlocal + atom->nghost; // mine + ghosts api->system->bigN = static_cast (atom->natoms); // all atoms in the system + const int nall = api->system->N; +#if defined(_OPENMP) +#pragma omp parallel LMP_DEFAULT_NONE LMP_SHARED(eflag,vflag) +#endif + { +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::START); + ev_setup_thr(eflag, vflag, api->system->N, eatom, vatom, nullptr, thr); + } // setup data structures setup(); @@ -253,6 +268,27 @@ void PairReaxFFOMP::compute(int eflag, int vflag) Compute_ForcesOMP(api->system,api->control,api->data,api->workspace,&api->lists); read_reax_forces(vflag); + const int nthreads = comm->nthreads; +#if defined(_OPENMP) +#pragma omp parallel LMP_DEFAULT_NONE LMP_SHARED(vflag) +#endif + { +#if defined(_OPENMP) + int tid = omp_get_thread_num(); +#else + int tid = 0; +#endif + ThrData *thr = fix->get_thr(tid); + thr->timer(Timer::PAIR); + + // the pair style reduces energy and forces directly. so only reduce virial/ + // per-atom virial and per-atom centroid virial are the same for two-body + // many-body pair styles not yet implemented + if (vflag & (VIRIAL_ATOM | VIRIAL_CENTROID)) { + data_reduce_thr(&(vatom[0][0]), nall , nthreads, 6, tid); + } + } + #if defined(_OPENMP) #pragma omp parallel for schedule(static) #endif From c78d4eab36dcc36be52884fb93519b2d8ec05258 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:52:43 -0400 Subject: [PATCH 122/352] update standard examples for new style names --- .../reaxff/{in.reaxc.rdx => in.reaxff.rdx} | 9 +- ...xc.rdx-shielded => in.reaxff.rdx-shielded} | 9 +- .../reaxff/{in.reaxc.tatb => in.reaxff.tatb} | 13 +- ....tatb-shielded => in.reaxff.tatb-shielded} | 13 +- .../log.21Apr21.reaxc.rdx-shielded.g++.4 | 154 ------------------ examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 | 154 ------------------ examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 | 154 ------------------ .../log.21Apr21.reaxc.tatb-shielded.g++.1 | 154 ------------------ .../log.21Apr21.reaxc.tatb-shielded.g++.4 | 154 ------------------ examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 | 154 ------------------ examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 | 154 ------------------ .../log.21Jul21.reaxff.rdx-shielded.g++.1 | 144 ++++++++++++++++ .../log.21Jul21.reaxff.rdx-shielded.g++.4 | 144 ++++++++++++++++ ...ded.g++.1 => log.21Jul21.reaxff.rdx.g++.1} | 60 +++---- examples/reaxff/log.21Jul21.reaxff.rdx.g++.4 | 154 ++++++++++++++++++ .../log.21Jul21.reaxff.tatb-shielded.g++.1 | 142 ++++++++++++++++ .../log.21Jul21.reaxff.tatb-shielded.g++.4 | 142 ++++++++++++++++ examples/reaxff/log.21Jul21.reaxff.tatb.g++.1 | 151 +++++++++++++++++ examples/reaxff/log.21Jul21.reaxff.tatb.g++.4 | 151 +++++++++++++++++ 19 files changed, 1078 insertions(+), 1132 deletions(-) rename examples/reaxff/{in.reaxc.rdx => in.reaxff.rdx} (84%) rename examples/reaxff/{in.reaxc.rdx-shielded => in.reaxff.rdx-shielded} (84%) rename examples/reaxff/{in.reaxc.tatb => in.reaxff.tatb} (78%) rename examples/reaxff/{in.reaxc.tatb-shielded => in.reaxff.tatb-shielded} (77%) delete mode 100644 examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 delete mode 100644 examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 create mode 100644 examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.1 create mode 100644 examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.4 rename examples/reaxff/{log.21Apr21.reaxc.rdx-shielded.g++.1 => log.21Jul21.reaxff.rdx.g++.1} (78%) create mode 100644 examples/reaxff/log.21Jul21.reaxff.rdx.g++.4 create mode 100644 examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.1 create mode 100644 examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.4 create mode 100644 examples/reaxff/log.21Jul21.reaxff.tatb.g++.1 create mode 100644 examples/reaxff/log.21Jul21.reaxff.tatb.g++.4 diff --git a/examples/reaxff/in.reaxc.rdx b/examples/reaxff/in.reaxff.rdx similarity index 84% rename from examples/reaxff/in.reaxc.rdx rename to examples/reaxff/in.reaxff.rdx index 36bf2a6e8c..82a582e958 100644 --- a/examples/reaxff/in.reaxc.rdx +++ b/examples/reaxff/in.reaxff.rdx @@ -1,15 +1,14 @@ # ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx units real atom_style charge read_data data.rdx -pair_style reax/c control.reax_c.rdx +pair_style reaxff control.reax_c.rdx pair_coeff * * ffield.reax C H O N -compute reax all pair reax/c +compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] @@ -30,7 +29,7 @@ neighbor 2.5 bin neigh_modify every 10 delay 0 check no fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff variable nqeq equal f_2 @@ -41,7 +40,7 @@ thermo_style custom step temp epair etotal press & timestep 1.0 -#dump 1 all atom 10 dump.reaxc.rdx +#dump 1 all atom 10 dump.reaxff.rdx #dump 2 all image 25 image.*.jpg type type & # axes yes 0.8 0.02 view 60 -30 diff --git a/examples/reaxff/in.reaxc.rdx-shielded b/examples/reaxff/in.reaxff.rdx-shielded similarity index 84% rename from examples/reaxff/in.reaxc.rdx-shielded rename to examples/reaxff/in.reaxff.rdx-shielded index 2151f63a5f..d1a5f0beaa 100644 --- a/examples/reaxff/in.reaxc.rdx-shielded +++ b/examples/reaxff/in.reaxff.rdx-shielded @@ -1,15 +1,14 @@ # ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx units real atom_style charge read_data data.rdx -pair_style reax/c control.reax_c.rdx +pair_style reaxff control.reax_c.rdx pair_coeff * * ffield.reax C H O N -compute reax all pair reax/c +compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] @@ -30,7 +29,7 @@ neighbor 2.5 bin neigh_modify every 10 delay 0 check no fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff variable nqeq equal f_2 thermo 10 @@ -40,7 +39,7 @@ thermo_style custom step temp epair etotal press & timestep 1.0 -#dump 1 all atom 10 dump.reaxc.rdx +#dump 1 all atom 10 dump.reaxff.rdx #dump 2 all image 25 image.*.jpg type type & # axes yes 0.8 0.02 view 60 -30 diff --git a/examples/reaxff/in.reaxc.tatb b/examples/reaxff/in.reaxff.tatb similarity index 78% rename from examples/reaxff/in.reaxc.tatb rename to examples/reaxff/in.reaxff.tatb index 474290340f..6cf7828cf1 100644 --- a/examples/reaxff/in.reaxc.tatb +++ b/examples/reaxff/in.reaxff.tatb @@ -1,15 +1,14 @@ # ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, units real atom_style charge read_data data.tatb -pair_style reax/c control.reax_c.tatb +pair_style reaxff control.reax_c.tatb pair_coeff * * ffield.reax C H O N -compute reax all pair reax/c +compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] @@ -30,8 +29,8 @@ neighbor 2.5 bin neigh_modify delay 0 every 5 check no fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff variable nqeq equal f_2 thermo 5 @@ -41,7 +40,7 @@ thermo_style custom step temp epair etotal press & timestep 0.0625 -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z #dump 2 all image 5 image.*.jpg type type & # axes yes 0.8 0.02 view 60 -30 @@ -51,6 +50,6 @@ timestep 0.0625 # axes yes 0.8 0.02 view 60 -30 #dump_modify 3 pad 3 -fix 3 all reax/c/species 1 5 5 species.tatb +fix 3 all reaxff/species 1 5 5 species.tatb run 25 diff --git a/examples/reaxff/in.reaxc.tatb-shielded b/examples/reaxff/in.reaxff.tatb-shielded similarity index 77% rename from examples/reaxff/in.reaxc.tatb-shielded rename to examples/reaxff/in.reaxff.tatb-shielded index aeac3308a8..5a809ecdd2 100644 --- a/examples/reaxff/in.reaxc.tatb-shielded +++ b/examples/reaxff/in.reaxff.tatb-shielded @@ -1,15 +1,14 @@ # ReaxFF potential for TATB system -# this run is equivalent to reax/in.reax.tatb, units real atom_style charge read_data data.tatb -pair_style reax/c control.reax_c.tatb +pair_style reaxff control.reax_c.tatb pair_coeff * * ffield.reax C H O N -compute reax all pair reax/c +compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] @@ -30,8 +29,8 @@ neighbor 2.5 bin neigh_modify delay 0 every 5 check no fix 1 all nve -fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reax/c -fix 4 all reax/c/bonds 5 bonds.reaxc +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff variable nqeq equal f_2 thermo 5 @@ -41,7 +40,7 @@ thermo_style custom step temp epair etotal press & timestep 0.0625 -#dump 1 all custom 100 dump.reaxc.tatb id type q x y z +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z #dump 2 all image 5 image.*.jpg type type & # axes yes 0.8 0.02 view 60 -30 @@ -51,6 +50,6 @@ timestep 0.0625 # axes yes 0.8 0.02 view 60 -30 #dump_modify 3 pad 3 -fix 3 all reax/c/species 1 5 5 species.tatb +fix 3 all reaxff/species 1 5 5 species.tatb run 25 diff --git a/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 b/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 deleted file mode 100644 index 79fa5f77b2..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.4 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.617778 on 1 procs for 100 steps with 21 atoms - -Performance: 13.986 ns/day, 1.716 hours/ns, 161.871 timesteps/s -99.8% 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.52159 | 0.52159 | 0.52159 | 0.0 | 84.43 -Neigh | 0.03479 | 0.03479 | 0.03479 | 0.0 | 5.63 -Comm | 0.0017166 | 0.0017166 | 0.0017166 | 0.0 | 0.28 -Output | 0.00061226 | 0.00061226 | 0.00061226 | 0.0 | 0.10 -Modify | 0.058924 | 0.058924 | 0.058924 | 0.0 | 9.54 -Other | | 0.0001466 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 b/examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 deleted file mode 100644 index 38347ffce7..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.rdx.g++.1 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.618477 on 1 procs for 100 steps with 21 atoms - -Performance: 13.970 ns/day, 1.718 hours/ns, 161.687 timesteps/s -99.9% 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.52329 | 0.52329 | 0.52329 | 0.0 | 84.61 -Neigh | 0.03397 | 0.03397 | 0.03397 | 0.0 | 5.49 -Comm | 0.0017006 | 0.0017006 | 0.0017006 | 0.0 | 0.27 -Output | 0.00060892 | 0.00060892 | 0.00060892 | 0.0 | 0.10 -Modify | 0.058764 | 0.058764 | 0.058764 | 0.0 | 9.50 -Other | | 0.0001407 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 b/examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 deleted file mode 100644 index a409cbe358..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.rdx.g++.4 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.618479 on 1 procs for 100 steps with 21 atoms - -Performance: 13.970 ns/day, 1.718 hours/ns, 161.687 timesteps/s -99.8% 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.52299 | 0.52299 | 0.52299 | 0.0 | 84.56 -Neigh | 0.034338 | 0.034338 | 0.034338 | 0.0 | 5.55 -Comm | 0.0017166 | 0.0017166 | 0.0017166 | 0.0 | 0.28 -Output | 0.00060272 | 0.00060272 | 0.00060272 | 0.0 | 0.10 -Modify | 0.058692 | 0.058692 | 0.058692 | 0.0 | 9.49 -Other | | 0.0001385 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 b/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 deleted file mode 100644 index dac271442b..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.1 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.618214 on 1 procs for 100 steps with 21 atoms - -Performance: 13.976 ns/day, 1.717 hours/ns, 161.756 timesteps/s -99.9% 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.52298 | 0.52298 | 0.52298 | 0.0 | 84.60 -Neigh | 0.033964 | 0.033964 | 0.033964 | 0.0 | 5.49 -Comm | 0.001708 | 0.001708 | 0.001708 | 0.0 | 0.28 -Output | 0.00060844 | 0.00060844 | 0.00060844 | 0.0 | 0.10 -Modify | 0.058812 | 0.058812 | 0.058812 | 0.0 | 9.51 -Other | | 0.0001411 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 b/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 deleted file mode 100644 index 74c2a13875..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.tatb-shielded.g++.4 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.617311 on 1 procs for 100 steps with 21 atoms - -Performance: 13.996 ns/day, 1.715 hours/ns, 161.993 timesteps/s -99.9% 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.52226 | 0.52226 | 0.52226 | 0.0 | 84.60 -Neigh | 0.033952 | 0.033952 | 0.033952 | 0.0 | 5.50 -Comm | 0.0017183 | 0.0017183 | 0.0017183 | 0.0 | 0.28 -Output | 0.00060129 | 0.00060129 | 0.00060129 | 0.0 | 0.10 -Modify | 0.058648 | 0.058648 | 0.058648 | 0.0 | 9.50 -Other | | 0.0001364 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 b/examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 deleted file mode 100644 index d79287b694..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.tatb.g++.1 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.617401 on 1 procs for 100 steps with 21 atoms - -Performance: 13.994 ns/day, 1.715 hours/ns, 161.969 timesteps/s -99.8% 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.52185 | 0.52185 | 0.52185 | 0.0 | 84.52 -Neigh | 0.034507 | 0.034507 | 0.034507 | 0.0 | 5.59 -Comm | 0.0017211 | 0.0017211 | 0.0017211 | 0.0 | 0.28 -Output | 0.00060844 | 0.00060844 | 0.00060844 | 0.0 | 0.10 -Modify | 0.058573 | 0.058573 | 0.058573 | 0.0 | 9.49 -Other | | 0.0001466 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 b/examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 deleted file mode 100644 index e0cb6b6760..0000000000 --- a/examples/reaxff/log.21Apr21.reaxc.tatb.g++.4 +++ /dev/null @@ -1,154 +0,0 @@ -LAMMPS (8 Apr 2021) - using 1 OpenMP thread(s) per MPI task -# ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx - -units real - -atom_style charge -read_data data.rdx -Reading data file ... - orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 21 atoms - read_data CPU = 0.001 seconds - -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) -pair_coeff * * ffield.reax C H O N -Reading potential file ffield.reax with DATE: 2010-02-19 - -compute reax all pair reax/c - -variable eb equal c_reax[1] -variable ea equal c_reax[2] -variable elp equal c_reax[3] -variable emol equal c_reax[4] -variable ev equal c_reax[5] -variable epen equal c_reax[6] -variable ecoa equal c_reax[7] -variable ehb equal c_reax[8] -variable et equal c_reax[9] -variable eco equal c_reax[10] -variable ew equal c_reax[11] -variable ep equal c_reax[12] -variable efi equal c_reax[13] -variable eqeq equal c_reax[14] - -neighbor 2.5 bin -neigh_modify every 10 delay 0 check no - -fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c - -variable nqeq equal f_2 - -thermo 10 -thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - -timestep 1.0 - -#dump 1 all atom 10 dump.reaxc.rdx - -#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 2 pad 3 - -#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 -#dump_modify 3 pad 3 - -run 100 - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Your simulation uses code contributions which should be cited: - -- pair reax/c command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -- fix qeq/reax command: - -@Article{Aktulga12, - author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, - title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, - journal = {Parallel Computing}, - year = 2012, - volume = 38, - pages = {245--259} -} - -CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE - -Neighbor list info ... - update every 10 steps, delay 0 steps, check no - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 12.5 - ghost atom cutoff = 12.5 - binsize = 6.25, bins = 3 3 3 - 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual - attributes: half, newton off, ghost - pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff - bin: standard - (2) fix qeq/reax, perpetual, copy from (1) - attributes: half, newton off, ghost - pair build: copy - stencil: none - bin: none -Per MPI rank memory allocation (min/avg/max) = 13.36 | 13.36 | 13.36 Mbytes -Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq - 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79931 0 168.88396 12.5 - 10 1288.6116 -1989.6644 -1912.8422 -19456.353 -2734.6769 -15.607221 0.2017796 0 54.629557 3.125229 -77.7067 0 14.933901 -5.8108541 843.92073 -180.43321 0 107.75935 8 - 20 538.95819 -1942.7037 -1910.5731 -10725.639 -2803.7394 7.9078269 0.07792668 0 81.610053 0.22951941 -57.557107 0 30.331207 -10.178049 878.99009 -159.68914 0 89.313379 7 - 30 463.09535 -1933.5765 -1905.9686 -33255.546 -2749.859 -8.0154745 0.02762893 0 81.627395 0.11972413 -50.262293 0 20.820303 -9.6327015 851.88715 -149.49499 0 79.205727 8 - 40 885.49171 -1958.9125 -1906.1229 -4814.6856 -2795.644 9.150669 0.13747498 0 70.947982 0.24360485 -57.862663 0 19.076496 -11.141218 873.73893 -159.99393 0 92.434096 11 - 50 861.16578 -1954.4599 -1903.1205 -1896.7713 -2784.845 3.8270515 0.15793266 0 79.851823 3.3492142 -78.06613 0 32.629016 -7.956541 872.81838 -190.98567 0 114.75995 10 - 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 - 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 - 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 - 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.617397 on 1 procs for 100 steps with 21 atoms - -Performance: 13.994 ns/day, 1.715 hours/ns, 161.970 timesteps/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 | 0.52183 | 0.52183 | 0.52183 | 0.0 | 84.52 -Neigh | 0.034217 | 0.034217 | 0.034217 | 0.0 | 5.54 -Comm | 0.0017104 | 0.0017104 | 0.0017104 | 0.0 | 0.28 -Output | 0.00059891 | 0.00059891 | 0.00059891 | 0.0 | 0.10 -Modify | 0.0589 | 0.0589 | 0.0589 | 0.0 | 9.54 -Other | | 0.0001419 | | | 0.02 - -Nlocal: 21.0000 ave 21 max 21 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 546.000 ave 546 max 546 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1096.00 ave 1096 max 1096 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1096 -Ave neighs/atom = 52.190476 -Neighbor list builds = 10 -Dangerous builds not checked -Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.1 b/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.1 new file mode 100644 index 0000000000..7a0fcf53b5 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.1 @@ -0,0 +1,144 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reaxff control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxff.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 13.86 | 13.86 | 13.86 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.181 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79932 0 168.88397 12 + 10 1288.6114 -1989.6644 -1912.8422 -19456.349 -2734.6769 -15.607218 0.20177961 0 54.629555 3.1252297 -77.7067 0 14.933901 -5.810854 843.92074 -180.43322 0 107.75935 8 + 20 538.95852 -1942.7037 -1910.5731 -10725.667 -2803.7395 7.9078343 0.077926704 0 81.610044 0.22951937 -57.557105 0 30.331203 -10.178049 878.99016 -159.69263 0 89.316862 7 + 30 463.09515 -1933.5765 -1905.9685 -33255.499 -2749.8591 -8.0154635 0.02762867 0 81.627413 0.1197239 -50.262272 0 20.82032 -9.632703 851.88721 -149.49497 0 79.205707 8 + 40 885.49689 -1958.9125 -1906.1226 -4814.6325 -2795.644 9.1505916 0.13747481 0 70.948074 0.24360544 -57.862695 0 19.076518 -11.14121 873.73893 -159.9939 0 92.434061 11 + 50 861.16008 -1954.4602 -1903.1211 -1896.648 -2784.8451 3.8269988 0.1579331 0 79.851597 3.349208 -78.066133 0 32.628942 -7.9565363 872.8186 -190.98572 0 114.76001 10 + 60 1167.7831 -1971.8435 -1902.2247 -3482.927 -2705.8639 -17.121541 0.22749081 0 44.507721 7.8559737 -74.789039 0 16.2565 -4.6046718 835.8307 -188.33687 0 114.19412 10 + 70 1439.9897 -1989.3024 -1903.4557 23845.83 -2890.7894 31.958658 0.26671716 0 85.758318 3.1804201 -71.002959 0 24.35723 -10.31128 905.86819 -175.38505 0 106.79678 10 + 80 502.39931 -1930.7551 -1900.804 -20356.375 -2703.8109 -18.66274 0.1128617 0 99.80351 2.0329611 -76.171312 0 19.236815 -6.2786426 826.47424 -166.03148 0 92.539616 9 + 90 749.08601 -1946.984 -1902.3264 17798.716 -2863.7585 42.068606 0.24338046 0 96.181674 0.96183581 -69.955564 0 24.615514 -11.582742 903.68878 -190.13822 0 120.69121 11 + 100 1109.6946 -1968.588 -1902.4322 -4490.4001 -2755.899 -7.1224954 0.21757676 0 61.805955 7.0825894 -75.645488 0 20.115437 -6.2372635 863.56481 -198.56946 0 122.09935 10 +Loop time of 0.23792 on 1 procs for 100 steps with 21 atoms + +Performance: 36.315 ns/day, 0.661 hours/ns, 420.310 timesteps/s +99.3% 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.21046 | 0.21046 | 0.21046 | 0.0 | 88.46 +Neigh | 0.010947 | 0.010947 | 0.010947 | 0.0 | 4.60 +Comm | 0.00060345 | 0.00060345 | 0.00060345 | 0.0 | 0.25 +Output | 0.00071705 | 0.00071705 | 0.00071705 | 0.0 | 0.30 +Modify | 0.014873 | 0.014873 | 0.014873 | 0.0 | 6.25 +Other | | 0.0003213 | | | 0.14 + +Nlocal: 21.0000 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 546.000 ave 546 max 546 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1096.00 ave 1096 max 1096 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 1306.00 ave 1306 max 1306 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1306 +Ave neighs/atom = 62.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.4 b/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.4 new file mode 100644 index 0000000000..4840b5fa2b --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.rdx-shielded.g++.4 @@ -0,0 +1,144 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.003 seconds + +pair_style reaxff control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxff.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 9.856 | 11.02 | 12.23 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.179 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79963 0 168.88428 12 + 10 1288.6115 -1989.6644 -1912.8422 -19456.352 -2734.6769 -15.607219 0.20177961 0 54.629556 3.1252291 -77.7067 0 14.933901 -5.8108542 843.92074 -180.43321 0 107.75934 8 + 20 538.95831 -1942.7037 -1910.5731 -10725.628 -2803.7395 7.9078316 0.077926725 0 81.610046 0.22951948 -57.55711 0 30.331206 -10.178049 878.99011 -159.68964 0 89.313879 6 + 30 463.09528 -1933.5765 -1905.9685 -33255.523 -2749.859 -8.015479 0.027628772 0 81.627413 0.11972402 -50.262283 0 20.82031 -9.6327014 851.88714 -149.49498 0 79.205717 8 + 40 885.49492 -1958.9125 -1906.1227 -4814.6646 -2795.6439 9.1506063 0.13747482 0 70.948055 0.2436053 -57.862686 0 19.076515 -11.141211 873.73888 -159.99391 0 92.434067 11 + 50 861.15982 -1954.4602 -1903.1212 -1896.7209 -2784.845 3.8269674 0.15793308 0 79.851587 3.3492059 -78.06613 0 32.628933 -7.9565341 872.81849 -190.9857 0 114.75999 10 + 60 1167.7827 -1971.8436 -1902.2248 -3482.8501 -2705.8641 -17.121497 0.22749093 0 44.507698 7.8559911 -74.78902 0 16.256511 -4.6046743 835.83081 -188.33692 0 114.19416 10 + 70 1439.9904 -1989.3026 -1903.4558 23846.02 -2890.7894 31.95863 0.26671716 0 85.758232 3.1804311 -71.002978 0 24.357223 -10.311272 905.86809 -175.38506 0 106.79678 10 + 80 502.39774 -1930.7552 -1900.8041 -20356.27 -2703.8119 -18.66246 0.11286127 0 99.803504 2.0329528 -76.171312 0 19.236983 -6.278675 826.47474 -166.03143 0 92.539573 9 + 90 749.07673 -1946.984 -1902.3269 17798.497 -2863.7581 42.06868 0.24338043 0 96.181508 0.9618341 -69.955454 0 24.615416 -11.582759 903.68853 -190.13817 0 120.69116 11 + 100 1109.6909 -1968.5881 -1902.4325 -4490.3603 -2755.8994 -7.1223998 0.21757662 0 61.805909 7.0826145 -75.645472 0 20.115466 -6.2372802 863.565 -198.56948 0 122.09938 10 +Loop time of 0.427646 on 4 procs for 100 steps with 21 atoms + +Performance: 20.204 ns/day, 1.188 hours/ns, 233.838 timesteps/s +88.6% 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.1373 | 0.20047 | 0.27938 | 11.8 | 46.88 +Neigh | 0.0067 | 0.009334 | 0.01249 | 2.1 | 2.18 +Comm | 0.057132 | 0.13685 | 0.19972 | 14.4 | 32.00 +Output | 0.00078935 | 0.0013884 | 0.0031266 | 2.7 | 0.32 +Modify | 0.075213 | 0.079164 | 0.082556 | 0.9 | 18.51 +Other | | 0.0004359 | | | 0.10 + +Nlocal: 5.25000 ave 15 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Nghost: 355.500 ave 432 max 282 min +Histogram: 1 0 0 0 1 1 0 0 0 1 +Neighs: 298.750 ave 822 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +FullNghs: 326.500 ave 927 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 + +Total # of neighbors = 1306 +Ave neighs/atom = 62.190476 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.1 b/examples/reaxff/log.21Jul21.reaxff.rdx.g++.1 similarity index 78% rename from examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.1 rename to examples/reaxff/log.21Jul21.reaxff.rdx.g++.1 index 5ff8307135..89e5c606c2 100644 --- a/examples/reaxff/log.21Apr21.reaxc.rdx-shielded.g++.1 +++ b/examples/reaxff/log.21Jul21.reaxff.rdx.g++.1 @@ -1,7 +1,7 @@ -LAMMPS (8 Apr 2021) +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) using 1 OpenMP thread(s) per MPI task # ReaxFF potential for RDX system -# this run is equivalent to reax/in.reax.rdx units real @@ -14,20 +14,20 @@ Reading data file ... 21 atoms read_data CPU = 0.001 seconds -pair_style reax/c control.reax_c.rdx -WARNING: Ignoring inactive control parameter: simulation_name (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: energy_update_freq (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/USER-REAXC/reaxc_control.cpp:113) -WARNING: Ignoring inactive control parameter: traj_title (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_forces (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: atom_velocities (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: bond_info (src/USER-REAXC/reaxc_control.cpp:97) -WARNING: Ignoring inactive control parameter: angle_info (src/USER-REAXC/reaxc_control.cpp:97) +pair_style reaxff control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) pair_coeff * * ffield.reax C H O N Reading potential file ffield.reax with DATE: 2010-02-19 -compute reax all pair reax/c +compute reax all pair reaxff variable eb equal c_reax[1] variable ea equal c_reax[2] @@ -48,7 +48,7 @@ neighbor 2.5 bin neigh_modify every 10 delay 0 check no fix 1 all nve -fix 2 all qeq/reax 1 0.0 10.0 1.0e-6 reax/c +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff variable nqeq equal f_2 @@ -57,7 +57,7 @@ thermo_style custom step temp epair etotal press v_eb v_ea v_ timestep 1.0 -#dump 1 all atom 10 dump.reaxc.rdx +#dump 1 all atom 10 dump.reaxff.rdx #dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 #dump_modify 2 pad 3 @@ -71,7 +71,7 @@ CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE Your simulation uses code contributions which should be cited: -- pair reax/c command: +- pair reaxff command: @Article{Aktulga12, author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, @@ -82,7 +82,7 @@ Your simulation uses code contributions which should be cited: pages = {245--259} } -- fix qeq/reax command: +- fix qeq/reaxff command: @Article{Aktulga12, author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, @@ -102,12 +102,12 @@ Neighbor list info ... ghost atom cutoff = 12.5 binsize = 6.25, bins = 3 3 3 2 neighbor lists, perpetual/occasional/extra = 2 0 0 - (1) pair reax/c, perpetual + (1) pair reaxff, perpetual attributes: half, newton off, ghost pair build: half/bin/newtoff/ghost - stencil: half/ghost/bin/3d/newtoff + stencil: full/ghost/bin/3d bin: standard - (2) fix qeq/reax, perpetual, copy from (1) + (2) fix qeq/reaxff, perpetual, copy from (1) attributes: half, newton off, ghost pair build: copy stencil: none @@ -123,22 +123,22 @@ Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_ 60 1167.7852 -1971.8429 -1902.224 -3482.7305 -2705.863 -17.12171 0.22749077 0 44.507654 7.8560745 -74.788955 0 16.256483 -4.6046431 835.8304 -188.33691 0 114.19413 10 70 1439.9966 -1989.3024 -1903.4553 23845.651 -2890.7895 31.958845 0.26671721 0 85.758695 3.1803544 -71.002903 0 24.357134 -10.31131 905.86775 -175.38471 0 106.79648 10 80 502.39438 -1930.7544 -1900.8035 -20356.316 -2703.8115 -18.662467 0.11286011 0 99.804201 2.0329024 -76.171317 0 19.237028 -6.2786907 826.47451 -166.03125 0 92.539398 9 - 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068716 0.2433807 0 96.181613 0.96184888 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 + 90 749.08499 -1946.9838 -1902.3262 17798.51 -2863.7576 42.068717 0.2433807 0 96.181613 0.96184887 -69.955448 0 24.615302 -11.582765 903.68818 -190.13843 0 120.69141 11 100 1109.6968 -1968.5874 -1902.4315 -4490.1018 -2755.8965 -7.1231014 0.21757699 0 61.806018 7.0827673 -75.645345 0 20.114997 -6.2371964 863.5635 -198.56976 0 122.09961 10.5 -Loop time of 0.617026 on 1 procs for 100 steps with 21 atoms +Loop time of 0.231802 on 1 procs for 100 steps with 21 atoms -Performance: 14.003 ns/day, 1.714 hours/ns, 162.068 timesteps/s -99.7% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 37.273 ns/day, 0.644 hours/ns, 431.402 timesteps/s +99.2% 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.52176 | 0.52176 | 0.52176 | 0.0 | 84.56 -Neigh | 0.033948 | 0.033948 | 0.033948 | 0.0 | 5.50 -Comm | 0.0017188 | 0.0017188 | 0.0017188 | 0.0 | 0.28 -Output | 0.00059319 | 0.00059319 | 0.00059319 | 0.0 | 0.10 -Modify | 0.05887 | 0.05887 | 0.05887 | 0.0 | 9.54 -Other | | 0.0001347 | | | 0.02 +Pair | 0.20857 | 0.20857 | 0.20857 | 0.0 | 89.98 +Neigh | 0.010489 | 0.010489 | 0.010489 | 0.0 | 4.52 +Comm | 0.00059632 | 0.00059632 | 0.00059632 | 0.0 | 0.26 +Output | 0.00067498 | 0.00067498 | 0.00067498 | 0.0 | 0.29 +Modify | 0.011161 | 0.011161 | 0.011161 | 0.0 | 4.82 +Other | | 0.000307 | | | 0.13 Nlocal: 21.0000 ave 21 max 21 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/reaxff/log.21Jul21.reaxff.rdx.g++.4 b/examples/reaxff/log.21Jul21.reaxff.rdx.g++.4 new file mode 100644 index 0000000000..29c36c54f0 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.rdx.g++.4 @@ -0,0 +1,154 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for RDX system + +units real + +atom_style charge +read_data data.rdx +Reading data file ... + orthogonal box = (35.000000 35.000000 35.000000) to (48.000000 48.000000 48.000000) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 21 atoms + read_data CPU = 0.001 seconds + +pair_style reaxff control.reax_c.rdx +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify every 10 delay 0 check no + +fix 1 all nve +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff + +variable nqeq equal f_2 + +thermo 10 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 1.0 + +#dump 1 all atom 10 dump.reaxff.rdx + +#dump 2 all image 25 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +run 100 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 10 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 3 3 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 9.353 | 10.52 | 11.73 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -1884.3081 -1884.3081 27186.18 -2958.4712 79.527715 0.31082031 0 98.589783 25.846176 -0.18034154 0 16.709078 -9.1620736 938.43732 -244.79953 0 168.88418 12 + 10 1288.6115 -1989.6644 -1912.8422 -19456.352 -2734.6769 -15.607219 0.20177961 0 54.629556 3.1252292 -77.7067 0 14.933901 -5.8108542 843.92074 -180.43321 0 107.75934 8 + 20 538.95847 -1942.7037 -1910.5731 -10725.668 -2803.7395 7.9078328 0.077926688 0 81.610045 0.22951933 -57.557103 0 30.331203 -10.178049 878.99015 -159.69262 0 89.316856 7 + 30 463.09521 -1933.5765 -1905.9685 -33255.503 -2749.8591 -8.0154614 0.027628708 0 81.627408 0.11972393 -50.262275 0 20.820319 -9.6327031 851.88721 -149.49497 0 79.205707 8 + 40 885.49559 -1958.9126 -1906.1227 -4814.661 -2795.644 9.1506103 0.13747486 0 70.948058 0.24360549 -57.862693 0 19.076514 -11.141211 873.73894 -159.9939 0 92.434063 11 + 50 861.16222 -1954.4601 -1903.1209 -1896.7328 -2784.8449 3.8269573 0.15793301 0 79.851661 3.3492101 -78.066131 0 32.628939 -7.9565311 872.81847 -190.9857 0 114.75999 10 + 60 1167.7838 -1971.8434 -1902.2246 -3482.8253 -2705.8639 -17.121553 0.22749078 0 44.507707 7.8560156 -74.789002 0 16.256509 -4.6046674 835.83076 -188.33689 0 114.19413 10 + 70 1439.9922 -1989.3024 -1903.4556 23845.682 -2890.7894 31.958742 0.26671722 0 85.758402 3.1803955 -71.002937 0 24.357176 -10.311293 905.86805 -175.38494 0 106.79668 10 + 80 502.39847 -1930.7549 -1900.8038 -20356.357 -2703.8111 -18.662668 0.11286141 0 99.803668 2.0329484 -76.17132 0 19.236866 -6.2786536 826.47435 -166.03145 0 92.539587 9 + 90 749.0857 -1946.984 -1902.3263 17798.657 -2863.7584 42.068704 0.24338054 0 96.181666 0.96183837 -69.955527 0 24.615445 -11.58275 903.68864 -190.13828 0 120.69127 11 + 100 1109.695 -1968.5879 -1902.4321 -4490.3441 -2755.8984 -7.1226574 0.21757683 0 61.806014 7.0826278 -75.645456 0 20.115306 -6.2372466 863.56451 -198.56953 0 122.09941 10.5 +Loop time of 0.371707 on 4 procs for 100 steps with 21 atoms + +Performance: 23.244 ns/day, 1.033 hours/ns, 269.029 timesteps/s +91.8% 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.13518 | 0.19123 | 0.24947 | 9.7 | 51.45 +Neigh | 0.0073075 | 0.0096968 | 0.012228 | 1.8 | 2.61 +Comm | 0.034511 | 0.093329 | 0.14912 | 14.0 | 25.11 +Output | 0.00081416 | 0.0011345 | 0.0019655 | 1.4 | 0.31 +Modify | 0.073177 | 0.075449 | 0.078618 | 0.7 | 20.30 +Other | | 0.0008711 | | | 0.23 + +Nlocal: 5.25000 ave 15 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 +Nghost: 355.500 ave 432 max 282 min +Histogram: 1 0 0 0 1 1 0 0 0 1 +Neighs: 298.750 ave 822 max 0 min +Histogram: 1 0 2 0 0 0 0 0 0 1 + +Total # of neighbors = 1195 +Ave neighs/atom = 56.904762 +Neighbor list builds = 10 +Dangerous builds not checked +Total wall time: 0:00:00 diff --git a/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.1 b/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.1 new file mode 100644 index 0000000000..4c84081d44 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.1 @@ -0,0 +1,142 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for TATB system + +units real + +atom_style charge +read_data data.tatb +Reading data file ... + triclinic box = (0.0000000 0.0000000 0.0000000) to (13.624000 17.114915 15.182639) with tilt (-5.7531563 -6.3254660 7.4257288) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 384 atoms + read_data CPU = 0.002 seconds + +pair_style reaxff control.reax_c.tatb +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no + +fix 1 all nve +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff +variable nqeq equal f_2 + +thermo 5 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 0.0625 + +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z + +#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +fix 3 all reaxff/species 1 5 5 species.tatb + +run 25 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 5 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 141.3 | 141.3 | 141.3 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -44760.998 -44760.998 7827.7874 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6395 0 6391.0275 31 + 5 0.61603968 -44761.698 -44760.994 8934.6339 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1905 0 6388.6665 8 + 10 2.3525543 -44763.227 -44760.541 12288.589 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9762 0 6381.714 10 + 15 4.9013256 -44766.36 -44760.764 17716.957 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2536 0 6370.4198 9 + 20 7.8294699 -44769.686 -44760.747 25205.552 -61089.006 490.21314 4.7193021 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.5055 0 6355.2567 8 + 25 10.697916 -44772.904 -44760.691 34232.955 -61069.308 490.25886 4.7163736 0 1570.7397 20.181347 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.308 0 6336.7889 7 +Loop time of 3.31728 on 1 procs for 25 steps with 384 atoms + +Performance: 0.041 ns/day, 589.738 hours/ns, 7.536 timesteps/s +99.4% 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.9321 | 1.9321 | 1.9321 | 0.0 | 58.24 +Neigh | 0.6452 | 0.6452 | 0.6452 | 0.0 | 19.45 +Comm | 0.0020122 | 0.0020122 | 0.0020122 | 0.0 | 0.06 +Output | 0.00030173 | 0.00030173 | 0.00030173 | 0.0 | 0.01 +Modify | 0.73726 | 0.73726 | 0.73726 | 0.0 | 22.22 +Other | | 0.0003829 | | | 0.01 + +Nlocal: 384.000 ave 384 max 384 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7559.00 ave 7559 max 7559 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 286828.0 ave 286828 max 286828 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 336304.0 ave 336304 max 336304 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 336304 +Ave neighs/atom = 875.79167 +Neighbor list builds = 5 +Dangerous builds not checked +Total wall time: 0:00:03 diff --git a/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.4 b/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.4 new file mode 100644 index 0000000000..d4cb8a0190 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.tatb-shielded.g++.4 @@ -0,0 +1,142 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for TATB system + +units real + +atom_style charge +read_data data.tatb +Reading data file ... + triclinic box = (0.0000000 0.0000000 0.0000000) to (13.624000 17.114915 15.182639) with tilt (-5.7531563 -6.3254660 7.4257288) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 384 atoms + read_data CPU = 0.004 seconds + +pair_style reaxff control.reax_c.tatb +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no + +fix 1 all nve +fix 2 all qeq/shielded 1 10.0 1.0e-6 100 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff +variable nqeq equal f_2 + +thermo 5 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 0.0625 + +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z + +#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +fix 3 all reaxff/species 1 5 5 species.tatb + +run 25 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 5 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/shielded, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 94.50 | 94.50 | 94.50 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -44760.998 -44760.998 7827.7865 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6398 0 6391.0278 31 + 5 0.61603964 -44761.698 -44760.994 8934.6344 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1911 0 6388.6671 9 + 10 2.3525559 -44763.227 -44760.541 12288.611 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9712 0 6381.7089 11 + 15 4.9013319 -44766.36 -44760.764 17716.965 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2514 0 6370.4176 9 + 20 7.8294706 -44769.686 -44760.747 25205.511 -61089.006 490.21313 4.719302 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.5196 0 6355.2708 7 + 25 10.69792 -44772.904 -44760.691 34232.831 -61069.308 490.25885 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.353 0 6336.8339 11 +Loop time of 2.66226 on 4 procs for 25 steps with 384 atoms + +Performance: 0.051 ns/day, 473.290 hours/ns, 9.391 timesteps/s +96.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 | 1.7311 | 1.7619 | 1.794 | 2.0 | 66.18 +Neigh | 0.46483 | 0.46901 | 0.47348 | 0.5 | 17.62 +Comm | 0.039253 | 0.073989 | 0.10705 | 10.7 | 2.78 +Output | 0.0012206 | 0.0080282 | 0.010299 | 4.4 | 0.30 +Modify | 0.34359 | 0.3488 | 0.36264 | 1.4 | 13.10 +Other | | 0.0005529 | | | 0.02 + +Nlocal: 96.0000 ave 96 max 96 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 5118.00 ave 5118 max 5118 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 79754.0 ave 79754 max 79754 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 84076.0 ave 84076 max 84076 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 336304 +Ave neighs/atom = 875.79167 +Neighbor list builds = 5 +Dangerous builds not checked +Total wall time: 0:00:03 diff --git a/examples/reaxff/log.21Jul21.reaxff.tatb.g++.1 b/examples/reaxff/log.21Jul21.reaxff.tatb.g++.1 new file mode 100644 index 0000000000..2e1c7a5b26 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.tatb.g++.1 @@ -0,0 +1,151 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for TATB system + +units real + +atom_style charge +read_data data.tatb +Reading data file ... + triclinic box = (0.0000000 0.0000000 0.0000000) to (13.624000 17.114915 15.182639) with tilt (-5.7531563 -6.3254660 7.4257288) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 384 atoms + read_data CPU = 0.008 seconds + +pair_style reaxff control.reax_c.tatb +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no + +fix 1 all nve +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff +variable nqeq equal f_2 + +thermo 5 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 0.0625 + +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z + +#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +fix 3 all reaxff/species 1 5 5 species.tatb + +run 25 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 5 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 148.1 | 148.1 | 148.1 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -44760.998 -44760.998 7827.7878 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6394 0 6391.0274 31.5 + 5 0.61603968 -44761.698 -44760.994 8934.6346 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.1911 0 6388.6671 9 + 10 2.3525552 -44763.227 -44760.541 12288.581 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50357 -1560.7569 252.85309 -655.44063 18850.391 -8730.9765 0 6381.7142 10.5 + 15 4.9013309 -44766.36 -44760.764 17716.918 -61103.434 489.14722 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2622 0 6370.4284 9.5 + 20 7.829469 -44769.686 -44760.747 25205.568 -61089.006 490.21314 4.719302 0 1571.7022 20.420943 -260.85564 -1573.7378 253.3539 -654.31623 18816.07 -8703.5126 0 6355.2639 8 + 25 10.697899 -44772.904 -44760.691 34232.788 -61069.308 490.25886 4.7163736 0 1570.7397 20.181346 -251.91377 -1582.3261 253.82253 -653.53184 18791.975 -8684.3619 0 6336.8427 11 +Loop time of 2.91659 on 1 procs for 25 steps with 384 atoms + +Performance: 0.046 ns/day, 518.504 hours/ns, 8.572 timesteps/s +99.6% 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.9139 | 1.9139 | 1.9139 | 0.0 | 65.62 +Neigh | 0.5948 | 0.5948 | 0.5948 | 0.0 | 20.39 +Comm | 0.0020205 | 0.0020205 | 0.0020205 | 0.0 | 0.07 +Output | 0.00031287 | 0.00031287 | 0.00031287 | 0.0 | 0.01 +Modify | 0.40513 | 0.40513 | 0.40513 | 0.0 | 13.89 +Other | | 0.0003856 | | | 0.01 + +Nlocal: 384.000 ave 384 max 384 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 7559.00 ave 7559 max 7559 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 286828.0 ave 286828 max 286828 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 286828 +Ave neighs/atom = 746.94792 +Neighbor list builds = 5 +Dangerous builds not checked +Total wall time: 0:00:03 diff --git a/examples/reaxff/log.21Jul21.reaxff.tatb.g++.4 b/examples/reaxff/log.21Jul21.reaxff.tatb.g++.4 new file mode 100644 index 0000000000..100c2f7ca4 --- /dev/null +++ b/examples/reaxff/log.21Jul21.reaxff.tatb.g++.4 @@ -0,0 +1,151 @@ +LAMMPS (2 Jul 2021) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:98) + using 1 OpenMP thread(s) per MPI task +# ReaxFF potential for TATB system + +units real + +atom_style charge +read_data data.tatb +Reading data file ... + triclinic box = (0.0000000 0.0000000 0.0000000) to (13.624000 17.114915 15.182639) with tilt (-5.7531563 -6.3254660 7.4257288) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 384 atoms + read_data CPU = 0.002 seconds + +pair_style reaxff control.reax_c.tatb +WARNING: Ignoring inactive control parameter: simulation_name (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: energy_update_freq (src/REAXFF/reaxff_control.cpp:97) +WARNING: Support for writing native trajectories has been removed after LAMMPS version 8 April 2021 (src/REAXFF/reaxff_control.cpp:113) +WARNING: Ignoring inactive control parameter: traj_title (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_forces (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: atom_velocities (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: bond_info (src/REAXFF/reaxff_control.cpp:97) +WARNING: Ignoring inactive control parameter: angle_info (src/REAXFF/reaxff_control.cpp:97) +pair_coeff * * ffield.reax C H O N +Reading potential file ffield.reax with DATE: 2010-02-19 + +compute reax all pair reaxff + +variable eb equal c_reax[1] +variable ea equal c_reax[2] +variable elp equal c_reax[3] +variable emol equal c_reax[4] +variable ev equal c_reax[5] +variable epen equal c_reax[6] +variable ecoa equal c_reax[7] +variable ehb equal c_reax[8] +variable et equal c_reax[9] +variable eco equal c_reax[10] +variable ew equal c_reax[11] +variable ep equal c_reax[12] +variable efi equal c_reax[13] +variable eqeq equal c_reax[14] + +neighbor 2.5 bin +neigh_modify delay 0 every 5 check no + +fix 1 all nve +fix 2 all qeq/reaxff 1 0.0 10.0 1.0e-6 reaxff +fix 4 all reaxff/bonds 5 bonds.reaxff +variable nqeq equal f_2 + +thermo 5 +thermo_style custom step temp epair etotal press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + +timestep 0.0625 + +#dump 1 all custom 100 dump.reaxff.tatb id type q x y z + +#dump 2 all image 5 image.*.jpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 5 movie.mpg type type # axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +fix 3 all reaxff/species 1 5 5 species.tatb + +run 25 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- pair reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +- fix qeq/reaxff command: + +@Article{Aktulga12, + author = {H. M. Aktulga, J. C. Fogarty, S. A. Pandit, A. Y. Grama}, + title = {Parallel reactive molecular dynamics: Numerical methods and algorithmic techniques}, + journal = {Parallel Computing}, + year = 2012, + volume = 38, + pages = {245--259} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Neighbor list info ... + update every 5 steps, delay 0 steps, check no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 12.5 + ghost atom cutoff = 12.5 + binsize = 6.25, bins = 5 4 3 + 2 neighbor lists, perpetual/occasional/extra = 2 0 0 + (1) pair reaxff, perpetual + attributes: half, newton off, ghost + pair build: half/bin/newtoff/ghost + stencil: full/ghost/bin/3d + bin: standard + (2) fix qeq/reaxff, perpetual, copy from (1) + attributes: half, newton off, ghost + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 99.27 | 99.27 | 99.27 Mbytes +Step Temp E_pair TotEng Press v_eb v_ea v_elp v_emol v_ev v_epen v_ecoa v_ehb v_et v_eco v_ew v_ep v_efi v_eqeq v_nqeq + 0 0 -44760.998 -44760.998 7827.7866 -61120.591 486.4378 4.7236377 0 1574.1033 20.788929 -279.51642 -1556.4696 252.57147 -655.84699 18862.412 -8740.6397 0 6391.0277 31 + 5 0.61603941 -44761.698 -44760.994 8934.6279 -61118.769 486.81263 4.7234094 0 1573.9241 20.768834 -278.24084 -1557.6713 252.64377 -655.74435 18859.379 -8738.193 0 6388.6691 10 + 10 2.352555 -44763.227 -44760.541 12288.61 -61113.174 487.82738 4.7226863 0 1573.411 20.705939 -274.50358 -1560.7569 252.85309 -655.44063 18850.391 -8730.9686 0 6381.7064 9 + 15 4.9013339 -44766.36 -44760.764 17716.995 -61103.434 489.14721 4.7213644 0 1572.6349 20.593139 -268.56847 -1566.3829 252.95174 -654.96611 18835.777 -8719.2413 0 6370.4076 10.5 + 20 7.8294636 -44769.686 -44760.747 25205.611 -61089.006 490.21313 4.719302 0 1571.7022 20.420943 -260.85565 -1573.7378 253.3539 -654.31623 18816.07 -8703.4966 0 6355.2478 10 + 25 10.6979 -44772.904 -44760.691 34232.798 -61069.308 490.25886 4.7163736 0 1570.7397 20.181346 -251.91378 -1582.3261 253.82253 -653.53184 18791.975 -8684.3574 0 6336.8382 10.5 +Loop time of 2.53633 on 4 procs for 25 steps with 384 atoms + +Performance: 0.053 ns/day, 450.902 hours/ns, 9.857 timesteps/s +97.8% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.7343 | 1.7637 | 1.815 | 2.4 | 69.54 +Neigh | 0.44441 | 0.44869 | 0.45403 | 0.6 | 17.69 +Comm | 0.025287 | 0.074702 | 0.10592 | 11.9 | 2.95 +Output | 0.0016916 | 0.0080527 | 0.010178 | 4.1 | 0.32 +Modify | 0.23126 | 0.24065 | 0.25706 | 2.1 | 9.49 +Other | | 0.000566 | | | 0.02 + +Nlocal: 96.0000 ave 96 max 96 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 5118.00 ave 5118 max 5118 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 79754.0 ave 79754 max 79754 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 319016 +Ave neighs/atom = 830.77083 +Neighbor list builds = 5 +Dangerous builds not checked +Total wall time: 0:00:02 From c59dc079dbb2b453cb71bef3bd78c2704649c7e3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 22:53:18 -0400 Subject: [PATCH 123/352] correctly detect when to retrieve parameters from pair style reaxff --- src/QEQ/fix_qeq.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 964cc26cc9..a0d012bb5b 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -126,7 +126,7 @@ FixQEq::FixQEq(LAMMPS *lmp, int narg, char **arg) : if (strcmp(arg[7],"coul/streitz") == 0) { streitz_flag = 1; - } else if (utils::strmatch(arg[7],"^reax..") == 0) { + } else if (utils::strmatch(arg[7],"^reax..")) { reax_flag = 1; } else { read_file(arg[7]); From f79b6ac3737e95f0f6b5bf185c97ca14c93e1f99 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 21 Jul 2021 23:12:06 -0400 Subject: [PATCH 124/352] recover compilation of KOKKOS package --- src/KOKKOS/fix_reaxff_bonds_kokkos.h | 2 +- src/KOKKOS/pair_reaxff_kokkos.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/KOKKOS/fix_reaxff_bonds_kokkos.h b/src/KOKKOS/fix_reaxff_bonds_kokkos.h index b1203e472d..b39dfa3c17 100644 --- a/src/KOKKOS/fix_reaxff_bonds_kokkos.h +++ b/src/KOKKOS/fix_reaxff_bonds_kokkos.h @@ -39,7 +39,7 @@ class FixReaxFFBondsKokkos : public FixReaxFFBonds { private: int nbuf; - void Output_ReaxFF_Bonds() + void Output_ReaxFF_Bonds(); double memory_usage(); }; } diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 6e49b5081c..26d5450046 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -138,8 +138,8 @@ template void PairReaxFFKokkos::init_style() { PairReaxFF::init_style(); - if (fix_reax) modify->delete_fix(fix_id); // not needed in the Kokkos version - fix_reax = nullptr; + if (fix_reaxff) modify->delete_fix(fix_id); // not needed in the Kokkos version + fix_reaxff = nullptr; // irequest = neigh request made by parent class From d5ba7b25784cc6c3406e5c93cc33e132c9ed1e54 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 22 Jul 2021 08:10:42 -0600 Subject: [PATCH 125/352] Propagate variable rename --- src/KOKKOS/pair_exp6_rx_kokkos.cpp | 6 +++--- src/KOKKOS/pair_table_rx_kokkos.cpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp index 5c1a3b3589..000f9dcc7d 100644 --- a/src/KOKKOS/pair_exp6_rx_kokkos.cpp +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -1787,7 +1787,7 @@ void PairExp6rxKokkos::read_file(char *file) while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; for (ispecies = 0; ispecies < nspecies; ispecies++) - if (strcmp(words[0],&atom->dname[ispecies][0]) == 0) break; + if (strcmp(words[0],&atom->dvname[ispecies][0]) == 0) break; if (ispecies == nspecies) continue; // load up parameter settings and error check their values @@ -1801,9 +1801,9 @@ void PairExp6rxKokkos::read_file(char *file) params[nparams].ispecies = ispecies; - n = strlen(&atom->dname[ispecies][0]) + 1; + n = strlen(&atom->dvname[ispecies][0]) + 1; params[nparams].name = new char[n]; - strcpy(params[nparams].name,&atom->dname[ispecies][0]); + strcpy(params[nparams].name,&atom->dvname[ispecies][0]); n = strlen(words[1]) + 1; params[nparams].potential = new char[n]; diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp index b672b126ef..d5eaa7af3f 100644 --- a/src/KOKKOS/pair_table_rx_kokkos.cpp +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -1047,7 +1047,7 @@ void PairTableRXKokkos::coeff(int narg, char **arg) int ispecies; for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site1,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site1,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site1,"1fluid") != 0) error->all(FLERR,"Site1 name not recognized in pair coefficients"); @@ -1057,7 +1057,7 @@ void PairTableRXKokkos::coeff(int narg, char **arg) strcpy(site2,arg[5]); for (ispecies = 0; ispecies < nspecies; ispecies++) { - if (strcmp(site2,&atom->dname[ispecies][0]) == 0) break; + if (strcmp(site2,&atom->dvname[ispecies][0]) == 0) break; } if (ispecies == nspecies && strcmp(site2,"1fluid") != 0) error->all(FLERR,"Site2 name not recognized in pair coefficients"); @@ -1124,7 +1124,7 @@ void PairTableRXKokkos::coeff(int narg, char **arg) isite1 = nspecies; for (int k = 0; k < nspecies; k++) { - if (strcmp(site1, atom->dname[k]) == 0) { + if (strcmp(site1, atom->dvname[k]) == 0) { isite1 = k; break; } @@ -1139,7 +1139,7 @@ void PairTableRXKokkos::coeff(int narg, char **arg) isite2 = nspecies; for (int k = 0; k < nspecies; k++) { - if (strcmp(site2, atom->dname[k]) == 0) { + if (strcmp(site2, atom->dvname[k]) == 0) { isite2 = ispecies; break; } From fde6cae56df482ac80aae0846810096416784702 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 22 Jul 2021 08:44:32 -0600 Subject: [PATCH 126/352] Add logic for GPU-enabled MPICH --- src/KOKKOS/kokkos.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 2588bf5d49..aa435d5b0b 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -293,9 +293,14 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) error->warning(FLERR,"MVAPICH2 'MV2_USE_CUDA' environment variable is not set. Disabling GPU-aware MPI"); // pure MPICH or some unsupported MPICH derivative #elif defined(MPICH) && !defined(MVAPICH2_VERSION) - if (me == 0) - error->warning(FLERR,"Detected MPICH. Disabling GPU-aware MPI"); + char* str; gpu_aware_flag = 0; + if ((str = getenv("MPICH_GPU_SUPPORT_ENABLED"))) + if ((strcmp(str,"1") == 0)) + gpu_aware_flag = 1; + + if (!gpu_aware_flag && me == 0) + error->warning(FLERR,"Detected MPICH. Disabling GPU-aware MPI"); #else if (me == 0) error->warning(FLERR,"Kokkos with CUDA, HIP, or SYCL assumes CUDA-aware MPI is available," From bb46dd7d1f765a3e9c5b926b102e59662ec39f9f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 13:14:49 -0400 Subject: [PATCH 127/352] update embedded documentation for the library interface functions for accessing fix external --- src/library.cpp | 122 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 35 deletions(-) diff --git a/src/library.cpp b/src/library.cpp index 0c897538a1..b9c2fbe4e9 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -4823,13 +4823,14 @@ mode. The function has to have C language bindings with the prototype: The argument *ptr* to this function will be stored in fix external and the passed as the first argument calling the callback function `func()`. -This would usually be a pointer to the LAMMPS instance, i.e. the same +This would usually be a pointer to the active LAMMPS instance, i.e. the same pointer as the *handle* argument. This would be needed to call -functions that set the global or per-atom energy or virial -contributions. +functions that set the global or per-atom energy or virial contributions +from within the callback function. -The callback mechanism is on of the two modes of fix external. The -alternative is the array mode set up by :cpp:func:`lammps_fix_external_get_force`. +The callback mechanism is one of the two modes of how forces and can be +applied to a simulation with the help of fix external. The alternative +is the array mode where you call :cpp:func:`lammps_fix_external_get_force`. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4872,23 +4873,25 @@ Fix :doc:`external ` allows programs that are running LAMMPS throu its library interface to add or modify certain LAMMPS properties on specific timesteps, similar to the way other fixes do. -This function provides access to the per-atom force storage in the fix -external instance to be added to the individual atoms when using the -"pf/array" mode. The *fexternal* array can be accessed similar to the -"native" per-atom *arrays accessible via the +This function provides access to the per-atom force storage in a fix +external instance with the given fix-ID to be added to the individual +atoms when using the "pf/array" mode. The *fexternal* array can be +accessed like other "native" per-atom arrays accessible via the :cpp:func:`lammps_extract_atom` function. Please note that the array -stores forces for *local* atoms, in the order determined by the neighbor -list build. Because the underlying data structures can change as well as -the order of atom as they migrate between MPI processes, this function -should be always called immediately before the forces are going to be -set to get an up-to-date pointer. You can use -e.g. :cpp:func:`lammps_get_natoms` to obtain the number of local atoms -and thus the dimensions of the returned force array (``double force[nlocal][3]``). +stores holds the forces for *local* atoms for each MPI ranks, in the +order determined by the neighbor list build. Because the underlying +data structures can change as well as the order of atom as they migrate +between MPI processes because of the domain decomposition +parallelization, this function should be always called immediately +before the forces are going to be set to get an up-to-date pointer. + You can use e.g. :cpp:func:`lammps_get_natoms` to obtain the number +of local atoms `nlocal` and then assume the dimensions of the returned +force array as ``double force[nlocal][3]``. This is an alternative to the callback mechanism in fix external set up by :cpp:func:`lammps_set_fix_external_callback`. The main difference is -that this mechanism can be used when forces can be pre-computed and the -control alternates between LAMMPS and the external command, while the +that this mechanism can be used when forces are be pre-computed and the +control alternates between LAMMPS and the external code, while the callback mechanism can call the external code to compute the force when the fix is triggered and needs them. @@ -4933,8 +4936,12 @@ This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and to the global energy from the external code. The value of the *eng* argument will be stored in the fix and applied on the current and all following timesteps until changed by another call to this function. -When running in parallel, the value is the per-MPI process contribution, -not the total energy. +The energy is in energy units as determined by the current :doc:`units ` +settings and is the **total** energy of the contribution. Thus when +running in parallel all MPI processes have to call this function with +the **same** value and this will be returned as scalar property of the +fix external instance when accessed in LAMMPS input commands or from +variables. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -4944,7 +4951,7 @@ external code. * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param id fix ID of fix external instance - * \param eng energy to be added to the global energy */ + * \param eng total energy to be added to the global energy */ void lammps_fix_external_set_energy_global(void *handle, const char *id, double eng) { @@ -4972,10 +4979,18 @@ void lammps_fix_external_set_energy_global(void *handle, const char *id, double \verbatim embed:rst This is a companion function to :cpp:func:`lammps_set_fix_external_callback` -to set the contribution to the global virial from the external code -as part of the callback function. For this to work, the handle to the -LAMMPS object must be passed as the *ptr* argument when registering the -callback function. +and :cpp:func:`lammps_fix_external_get_force` to set the contribution to +the global virial from the external code. + +The 6 values of the *virial* array will be stored in the fix and applied +on the current and all following timesteps until changed by another call +to this function. The components of the virial need to be stored in the +order: *xx*, *yy*, *zz*, *xy*, *xz*, *yz*. In LAMMPS the virial is +stored internally as `stress*volume` in units of `pressure*volume` as +determined by the current :doc:`units ` settings and is the +**total** contribution. Thus when running in parallel all MPI processes +have to call this function with the **same** value and this will then +be added by fix external. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5016,8 +5031,15 @@ This is a companion function to :cpp:func:`lammps_set_fix_external_callback` to set the per-atom energy contribution due to the fix from the external code as part of the callback function. For this to work, the handle to the LAMMPS object must be passed as the *ptr* argument when registering the -callback function. No check is made whether the sum of the -contributions are consistent with any global added energy. +callback function. + +.. note:: + + This function is fully independent from :cpp:func:`lammps_fix_external_set_energy_global` + and will **NOT** add any contributions to the global energy tally + and **NOT** check whether the sum of the contributions added here are + consistent with the global added energy. + Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5027,7 +5049,7 @@ external code. * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param id fix ID of fix external instance - * \param eng energy to be added to the per-atom energy */ + * \param eng pointer to array of length nlocal with the energy to be added to the per-atom energy */ void lammps_fix_external_set_energy_peratom(void *handle, const char *id, double *eng) { @@ -5058,8 +5080,18 @@ This is a companion function to :cpp:func:`lammps_set_fix_external_callback` to set the per-atom virial contribution due to the fix from the external code as part of the callback function. For this to work, the handle to the LAMMPS object must be passed as the *ptr* argument when registering the -callback function. No check is made whether the sum of the -contributions are consistent with any globally added virial components. +callback function. + +.. note:: + + This function is fully independent from :cpp:func:`lammps_fix_external_set_virial_global` + and will **NOT** add any contributions to the global virial tally + and **NOT** check whether the sum of the contributions added here are + consistent with the global added virial. + +The order and units of the per-atom stress tensor elements are the same +as for the global virial. The code in fix external assumes the +dimensions of the per-atom virial array is ``double virial[nlocal][6]``. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5069,7 +5101,7 @@ external code. * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param id fix ID of fix external instance - * \param virial the 6 per-atom stress tensor components to be added to the per-atom virial */ + * \param virial a list of nlocal entries with the 6 per-atom stress tensor components to be added to the per-atom virial */ void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double **virial) { @@ -5098,7 +5130,13 @@ void lammps_fix_external_set_virial_peratom(void *handle, const char *id, double This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and :cpp:func:`lammps_fix_external_get_force` to set the length of a global vector of -properties that will be stored with the fix via :cpp:func:`lammps_fix_external_set_vector`. +properties that will be stored with the fix via +:cpp:func:`lammps_fix_external_set_vector`. + +This function needs to be called **before** a call to +:cpp:func:`lammps_fix_external_set_vector` and **before** a run or minimize +command. When running in parallel it must be called from **all** MPI +processes and with the same length parameter. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5137,8 +5175,22 @@ void lammps_fix_external_set_vector_length(void *handle, const char *id, int len This is a companion function to :cpp:func:`lammps_set_fix_external_callback` and :cpp:func:`lammps_fix_external_get_force` to set the values of a global vector of -properties that will be stored with the fix. The length of the vector -must be set beforehand with :cpp:func:`lammps_fix_external_set_vector_length`. +properties that will be stored with the fix. And can be accessed from +within LAMMPS input commands (e.g. fix ave/time or variables) when used +in a vector context. + +This function needs to be called **after** a call to +:cpp:func:`lammps_fix_external_set_vector_length` and the and **before** a run or minimize +command. When running in parallel it must be called from **all** MPI +processes and with the **same** index and value parameters. The value +is assumed to be extensive. + +.. note:: + + The index in the *idx* parameter is 1-based, i.e. the first element + is set with idx = 1 and the last element of the vector with idx = N, + where N is the value of the *len* parameter of the call to + :cpp:func:`lammps_fix_external_set_vector_length`. Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an @@ -5148,7 +5200,7 @@ external code. * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param id fix ID of fix external instance - * \param idx 1 based index of in global vector + * \param idx 1-based index of in global vector * \param val value to be stored in global vector */ void lammps_fix_external_set_vector(void *handle, const char *id, int idx, double val) From 2d93edab1b4b7631eaf50d87a726d237d56cbccd Mon Sep 17 00:00:00 2001 From: Aidan Thompson Date: Thu, 22 Jul 2021 12:22:34 -0600 Subject: [PATCH 128/352] Added one line of diagnostic output to create_atoms command --- src/create_atoms.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 02efba7e93..96e1476228 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -596,10 +596,13 @@ void CreateAtoms::command(int narg, char **arg) // print status MPI_Barrier(world); - if (me == 0) - utils::logmesg(lmp,"Created {} atoms\n" - " create_atoms CPU = {:.3f} seconds\n", - atom->natoms - natoms_previous, MPI_Wtime() - time1); + if (me == 0) { + utils::logmesg(lmp,"Created {} atoms\n", atom->natoms - natoms_previous); + if (scaleflag) domain->print_box(" using lattice units in "); + else domain->print_box(" using box units in "); + utils::logmesg(lmp," create_atoms CPU = {:.3f} seconds\n", + MPI_Wtime() - time1); + } } /* ---------------------------------------------------------------------- From d211cea89864d2872249ab13a9e15e40b9990708 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 14:58:33 -0400 Subject: [PATCH 129/352] bugfix from Dan Bolintineanu. closes #2812 --- src/GRANULAR/fix_wall_gran.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index 52311f64a7..a604782993 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -1193,7 +1193,7 @@ void FixWallGran::granular(double rsq, double dx, double dy, double dz, knfac = E; //Hooke a = sqrt(dR); Fne = knfac*delta; - if (normal_model != HOOKE) { + if (normal_model != NORMAL_HOOKE) { Fne *= a; knfac *= a; } From 324ae3181bcfee8b1eca651136fe78073b0067e4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 15:27:51 -0400 Subject: [PATCH 130/352] python interface for per-atom data for fix external --- python/lammps/core.py | 52 ++++++++++++++++++++++++-- python/lammps/numpy_wrapper.py | 20 ++++++++++ unittest/python/python-fix-external.py | 41 +++++++++++++++++++- 3 files changed, 109 insertions(+), 4 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 9ea2530cdc..e5ff88cda0 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1749,8 +1749,8 @@ class lammps(object): - ntimestep is the current timestep - nlocal is the number of local atoms on the current MPI process - tag is a 1d NumPy array of integers representing the atom IDs of the local atoms - - x is a 2d NumPy array of floating point numbers of the coordinates of the local atoms - - f is a 2d NumPy array of floating point numbers of the forces on the local atoms that will be added + - x is a 2d NumPy array of doubles of the coordinates of the local atoms + - f is a 2d NumPy array of doubles of the forces on the local atoms that will be added :param fix_id: Fix-ID of a fix external instance :type: string @@ -1777,7 +1777,7 @@ class lammps(object): # ------------------------------------------------------------------------- def fix_external_get_force(self, fix_id): - """Get access to that array with per-atom forces of a fix external instance with a given fix ID. + """Get access to the array with per-atom forces of a fix external instance with a given fix ID. This is a wrapper around the :cpp:func:`lammps_fix_external_get_force` function of the C-library interface. @@ -1827,6 +1827,52 @@ class lammps(object): with ExceptionCheck(self): return self.lib.lammps_fix_external_set_virial_global(self.lmp, fix_id.encode(), cvirial) + # ------------------------------------------------------------------------- + + def fix_external_set_energy_peratom(self, fix_id, eatom): + """Set the global energy contribution for a fix external instance with the given ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_set_energy_peratom` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eatom: list of potential energy values for local atoms to be added by fix external + :type: float + """ + + nlocal = self.extract_setting('nlocal') + ceatom = (nlocal*c_double)(*eatom) + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_energy_peratom(self.lmp, fix_id.encode(), ceatom) + + # ------------------------------------------------------------------------- + + def fix_external_set_virial_peratom(self, fix_id, virial): + """Set the global virial contribution for a fix external instance with the given ID. + + This is a wrapper around the :cpp:func:`lammps_fix_external_set_virial_peratom` function + of the C-library interface. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eng: list of natoms lists with 6 floating point numbers to be added by fix external + :type: float + """ + + # copy virial data to C compatible buffer + nlocal = self.extract_setting('nlocal') + vbuf = (c_double * 6) + vptr = POINTER(c_double) + cvirial = (vptr * nlocal)() + for i in range(nlocal): + cvirial[i] = vbuf() + for j in range(6): + cvirial[i][j] = virial[i][j] + + with ExceptionCheck(self): + return self.lib.lammps_fix_external_set_virial_peratom(self.lmp, fix_id.encode(), cvirial) + # ------------------------------------------------------------------------- def fix_external_set_vector_length(self, fix_id, length): """Set the vector length for a global vector stored with fix external for analysis diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index 20fdf4cc68..1998930319 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -246,6 +246,26 @@ class numpy_wrapper: return np.ctypeslib.as_array(value) return value + # ------------------------------------------------------------------------- + + def fix_external_get_force(self, fix_id): + """Get access to the array with per-atom forces of a fix external instance with a given fix ID. + + This function is a wrapper around the + :py:meth:`lammps.fix_external_get_force() ` + method. It behaves the same as the original method, but returns a NumPy array instead + of a ``ctypes`` pointer. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :return: requested data + :rtype: numpy.array + """ + import numpy as np + nlocal = self.lmp.extract_setting('nlocal') + value = self.lmp.fix_external_get_force(fix_id) + return self.darray(value,nlocal,3) + # ------------------------------------------------------------------------- def get_neighlist(self, idx): diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index 2d4c50e454..8b85d2ccd1 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -20,6 +20,18 @@ def callback_one(lmp, ntimestep, nlocal, tag, x, f): lmp.fix_external_set_vector("ext", 5, -1.0) lmp.fix_external_set_vector("ext", 6, 0.25) + eatom = [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7] + vatom = [ [0.1,0.0,0.0,0.0,0.0,0.0], + [0.0,0.2,0.0,0.0,0.0,0.0], + [0.0,0.0,0.3,0.0,0.0,0.0], + [0.0,0.0,0.0,0.4,0.0,0.0], + [0.0,0.0,0.0,0.0,0.5,0.0], + [0.0,0.0,0.0,0.0,0.0,0.6], + [0.0,0.0,0.0,0.0,-7.0,0.0], + [0.0,-8.0,0.0,0.0,0.0,0.0] ] + lmp.fix_external_set_energy_peratom("ext",eatom) + lmp.fix_external_set_virial_peratom("ext",vatom) + class PythonExternal(unittest.TestCase): def testExternalCallback(self): """Test fix external from Python with pf/callback""" @@ -42,6 +54,10 @@ class PythonExternal(unittest.TestCase): thermo 5 fix 1 all nve fix ext all external pf/callback 5 1 + compute eatm all pe/atom fix + compute vatm all stress/atom NULL fix + compute sum all reduce sum c_eatm c_vatm[*] + thermo_style custom step temp pe ke etotal press c_sum[*] fix_modify ext energy yes virial yes """ lmp.commands_string(basic_system) @@ -51,6 +67,14 @@ class PythonExternal(unittest.TestCase): self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) self.assertAlmostEqual(lmp.get_thermo("press"),0.15416666666666667,14) + reduce = lmp.extract_compute("sum", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR) + self.assertAlmostEqual(reduce[0],2.8,14) + self.assertAlmostEqual(reduce[1],-0.1,14) + self.assertAlmostEqual(reduce[2],7.8,14) + self.assertAlmostEqual(reduce[3],-0.3,14) + self.assertAlmostEqual(reduce[4],-0.4,14) + self.assertAlmostEqual(reduce[5],6.5,14) + self.assertAlmostEqual(reduce[6],-0.6,14) val = 0.0 for i in range(0,6): val += lmp.extract_fix("ext",LMP_STYLE_GLOBAL,LMP_TYPE_VECTOR,nrow=i) @@ -59,6 +83,12 @@ class PythonExternal(unittest.TestCase): def testExternalArray(self): """Test fix external from Python with pf/array""" + try: + import numpy + NUMPY_INSTALLED = True + except ImportError: + NUMPY_INSTALLED = False + machine=None if 'LAMMPS_MACHINE_NAME' in os.environ: machine=os.environ['LAMMPS_MACHINE_NAME'] @@ -93,6 +123,11 @@ class PythonExternal(unittest.TestCase): self.assertAlmostEqual(lmp.get_thermo("temp"),4.0/525.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/16.0,14) self.assertAlmostEqual(lmp.get_thermo("press"),0.06916666666666667,14) + if NUMPY_INSTALLED: + npforce = lmp.numpy.fix_external_get_force("ext") + self.assertEqual(len(npforce),8) + self.assertEqual(len(npforce[0]),3) + self.assertEqual(npforce[1][1],0.0) force = lmp.fix_external_get_force("ext"); nlocal = lmp.extract_setting("nlocal"); @@ -106,8 +141,12 @@ class PythonExternal(unittest.TestCase): self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) self.assertAlmostEqual(lmp.get_thermo("press"),0.15416666666666667,14) + if NUMPY_INSTALLED: + npforce = lmp.numpy.fix_external_get_force("ext") + self.assertEqual(npforce[0][0],6.0) + self.assertEqual(npforce[3][1],6.0) + self.assertEqual(npforce[7][2],6.0) ############################## if __name__ == "__main__": unittest.main() - From 74c306b32bc01eb8988053dbb5a695dbaaa15c6d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 16:37:06 -0400 Subject: [PATCH 131/352] whitespace --- src/create_atoms.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 96e1476228..2d11a5a3bc 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -599,7 +599,7 @@ void CreateAtoms::command(int narg, char **arg) if (me == 0) { utils::logmesg(lmp,"Created {} atoms\n", atom->natoms - natoms_previous); if (scaleflag) domain->print_box(" using lattice units in "); - else domain->print_box(" using box units in "); + else domain->print_box(" using box units in "); utils::logmesg(lmp," create_atoms CPU = {:.3f} seconds\n", MPI_Wtime() - time1); } From fbf3bcae708150bfb4189ba32735e25c043828d9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 16:45:30 -0400 Subject: [PATCH 132/352] correct automated substition mistake --- src/KOKKOS/pair_reaxff_kokkos.cpp | 132 +++++++++++++++--------------- src/KOKKOS/pair_reaxff_kokkos.h | 58 ++++++------- 2 files changed, 95 insertions(+), 95 deletions(-) diff --git a/src/KOKKOS/pair_reaxff_kokkos.cpp b/src/KOKKOS/pair_reaxff_kokkos.cpp index 26d5450046..aac0229f87 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.cpp +++ b/src/KOKKOS/pair_reaxff_kokkos.cpp @@ -724,14 +724,14 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // Polarization (self) if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } ev_all += ev; pvector[13] = ev.ecoul; @@ -740,26 +740,26 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) if (api->control->tabulate) { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } else { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } else if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); } } ev_all += ev; @@ -853,34 +853,34 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // Bond energy if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; pvector[0] = ev.evdwl; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; pvector[0] = ev.evdwl; } // Multi-body corrections if (neighflag == HALF) { - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[2] = ev.ereax[0]; @@ -891,15 +891,15 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // Angular if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[4] = ev.ereax[3]; @@ -910,15 +910,15 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) // Torsion if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } pvector[8] = ev.ereax[6]; @@ -929,15 +929,15 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) if (cut_hbsq > 0.0) { if (neighflag == HALF) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } else { //if (neighflag == HALFTHREAD) { if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,inum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,inum),*this); ev_all += ev; } } @@ -969,9 +969,9 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) //} if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); ev_all += ev; pvector[0] += ev.evdwl; } else { //if (neighflag == HALFTHREAD) { @@ -985,9 +985,9 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) //} if (evflag) - Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); + Kokkos::parallel_reduce(Kokkos::RangePolicy >(0,ignum),*this,ev); else - Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); + Kokkos::parallel_for(Kokkos::RangePolicy >(0,ignum),*this); ev_all += ev; pvector[0] += ev.evdwl; } @@ -1049,7 +1049,7 @@ void PairReaxFFKokkos::compute(int eflag_in, int vflag_in) template template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputePolar, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputePolar, const int &ii, EV_FLOAT_REAX& ev) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -1067,9 +1067,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputePolar template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputePolar, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputePolar, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputePolar(), ii, ev); + this->template operator()(PairReaxFFComputePolar(), ii, ev); } @@ -1078,7 +1078,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputePolar template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { // The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial @@ -1220,9 +1220,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeLJCoulomb, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeLJCoulomb(), ii, ev); + this->template operator()(PairReaxFFComputeLJCoulomb(), ii, ev); } /* ---------------------------------------------------------------------- */ @@ -1230,7 +1230,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeLJCoulomb template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeTabulatedLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeTabulatedLJCoulomb, const int &ii, EV_FLOAT_REAX& ev) const { // The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial @@ -1327,9 +1327,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeTabulatedLJCoulomb template template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeTabulatedLJCoulomb, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeTabulatedLJCoulomb, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeTabulatedLJCoulomb(), ii, ev); + this->template operator()(PairReaxFFComputeTabulatedLJCoulomb(), ii, ev); } /* ---------------------------------------------------------------------- */ @@ -1989,7 +1989,7 @@ void PairReaxFFKokkos::operator()(PairReaxBondOrder3, const int &ii) template template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti1, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeMulti1, const int &ii) const { const int i = d_ilist[ii]; const int itype = type(i); @@ -2023,7 +2023,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti1 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeMulti2, const int &ii, EV_FLOAT_REAX& ev) const { auto v_CdDelta = ScatterViewHelper::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta); auto a_CdDelta = v_CdDelta.template access::value>(); @@ -2164,9 +2164,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeMulti2, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeMulti2(), ii, ev); + this->template operator()(PairReaxFFComputeMulti2(), ii, ev); } @@ -2175,7 +2175,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeMulti2 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeAngular, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2476,9 +2476,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeAngular, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeAngular(), ii, ev); + this->template operator()(PairReaxFFComputeAngular(), ii, ev); } @@ -2487,7 +2487,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeAngular template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeTorsion, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2851,9 +2851,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeTorsion, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeTorsion(), ii, ev); + this->template operator()(PairReaxFFComputeTorsion(), ii, ev); } @@ -2862,7 +2862,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeTorsion template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeHydrogen, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeHydrogen, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -2998,9 +2998,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeHydrogen template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeHydrogen, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeHydrogen, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeHydrogen(), ii, ev); + this->template operator()(PairReaxFFComputeHydrogen(), ii, ev); } @@ -3061,7 +3061,7 @@ void PairReaxFFKokkos::operator()(PairReaxUpdateBond, con template template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeBond1, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); @@ -3168,9 +3168,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeBond1, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeBond1(), ii, ev); + this->template operator()(PairReaxFFComputeBond1(), ii, ev); } @@ -3179,7 +3179,7 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeBond1 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeBond2, const int &ii, EV_FLOAT_REAX& ev) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeBond2, const int &ii, EV_FLOAT_REAX& ev) const { auto v_f = ScatterViewHelper::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f); auto a_f = v_f.template access::value>(); @@ -3369,9 +3369,9 @@ void PairReaxFFKokkos::operator()(PairReaxFFomputeBond2 template KOKKOS_INLINE_FUNCTION -void PairReaxFFKokkos::operator()(PairReaxFFomputeBond2, const int &ii) const { +void PairReaxFFKokkos::operator()(PairReaxFFComputeBond2, const int &ii) const { EV_FLOAT_REAX ev; - this->template operator()(PairReaxFFomputeBond2(), ii, ev); + this->template operator()(PairReaxFFComputeBond2(), ii, ev); } diff --git a/src/KOKKOS/pair_reaxff_kokkos.h b/src/KOKKOS/pair_reaxff_kokkos.h index 08f0911292..e60533f61e 100644 --- a/src/KOKKOS/pair_reaxff_kokkos.h +++ b/src/KOKKOS/pair_reaxff_kokkos.h @@ -56,13 +56,13 @@ struct LR_lookup_table_kk }; template -struct PairReaxFFomputePolar{}; +struct PairReaxFFComputePolar{}; template -struct PairReaxFFomputeLJCoulomb{}; +struct PairReaxFFComputeLJCoulomb{}; template -struct PairReaxFFomputeTabulatedLJCoulomb{}; +struct PairReaxFFComputeTabulatedLJCoulomb{}; struct PairReaxBuildListsFull{}; @@ -85,25 +85,25 @@ template struct PairReaxUpdateBond{}; template -struct PairReaxFFomputeBond1{}; +struct PairReaxFFComputeBond1{}; template -struct PairReaxFFomputeBond2{}; +struct PairReaxFFComputeBond2{}; template -struct PairReaxFFomputeMulti1{}; +struct PairReaxFFComputeMulti1{}; template -struct PairReaxFFomputeMulti2{}; +struct PairReaxFFComputeMulti2{}; template -struct PairReaxFFomputeAngular{}; +struct PairReaxFFComputeAngular{}; template -struct PairReaxFFomputeTorsion{}; +struct PairReaxFFComputeTorsion{}; template -struct PairReaxFFomputeHydrogen{}; +struct PairReaxFFComputeHydrogen{}; struct PairReaxFindBondZero{}; @@ -134,27 +134,27 @@ class PairReaxFFKokkos : public PairReaxFF { template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputePolar, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputePolar, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputePolar, const int&) const; + void operator()(PairReaxFFComputePolar, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeLJCoulomb, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeLJCoulomb, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeLJCoulomb, const int&) const; + void operator()(PairReaxFFComputeLJCoulomb, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeTabulatedLJCoulomb, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeTabulatedLJCoulomb, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeTabulatedLJCoulomb, const int&) const; + void operator()(PairReaxFFComputeTabulatedLJCoulomb, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(PairReaxBuildListsFull, const int&) const; @@ -187,55 +187,55 @@ class PairReaxFFKokkos : public PairReaxFF { template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeBond1, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeBond1, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeBond1, const int&) const; + void operator()(PairReaxFFComputeBond1, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeBond2, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeBond2, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeBond2, const int&) const; + void operator()(PairReaxFFComputeBond2, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeMulti1, const int&) const; + void operator()(PairReaxFFComputeMulti1, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeMulti2, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeMulti2, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeMulti2, const int&) const; + void operator()(PairReaxFFComputeMulti2, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeAngular, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeAngular, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeAngular, const int&) const; + void operator()(PairReaxFFComputeAngular, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeTorsion, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeTorsion, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeTorsion, const int&) const; + void operator()(PairReaxFFComputeTorsion, const int&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeHydrogen, const int&, EV_FLOAT_REAX&) const; + void operator()(PairReaxFFComputeHydrogen, const int&, EV_FLOAT_REAX&) const; template KOKKOS_INLINE_FUNCTION - void operator()(PairReaxFFomputeHydrogen, const int&) const; + void operator()(PairReaxFFComputeHydrogen, const int&) const; KOKKOS_INLINE_FUNCTION void operator()(PairReaxFindBondZero, const int&) const; From bf8bde5b03a4d00010375c4889d164209c965242 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 16:59:04 -0400 Subject: [PATCH 133/352] implement numpy wrapper for setting per-atom energy. virial not yet implemented --- python/lammps/core.py | 16 ++++----- python/lammps/numpy_wrapper.py | 45 +++++++++++++++++++++++++- src/library.cpp | 2 +- unittest/python/python-fix-external.py | 7 ++++ 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index e5ff88cda0..269b716c13 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1830,7 +1830,7 @@ class lammps(object): # ------------------------------------------------------------------------- def fix_external_set_energy_peratom(self, fix_id, eatom): - """Set the global energy contribution for a fix external instance with the given ID. + """Set the per-atom energy contribution for a fix external instance with the given ID. This is a wrapper around the :cpp:func:`lammps_fix_external_set_energy_peratom` function of the C-library interface. @@ -1848,15 +1848,15 @@ class lammps(object): # ------------------------------------------------------------------------- - def fix_external_set_virial_peratom(self, fix_id, virial): - """Set the global virial contribution for a fix external instance with the given ID. + def fix_external_set_virial_peratom(self, fix_id, vatom): + """Set the per-atom virial contribution for a fix external instance with the given ID. This is a wrapper around the :cpp:func:`lammps_fix_external_set_virial_peratom` function of the C-library interface. :param fix_id: Fix-ID of a fix external instance :type: string - :param eng: list of natoms lists with 6 floating point numbers to be added by fix external + :param vatom: list of natoms lists with 6 floating point numbers to be added by fix external :type: float """ @@ -1864,14 +1864,14 @@ class lammps(object): nlocal = self.extract_setting('nlocal') vbuf = (c_double * 6) vptr = POINTER(c_double) - cvirial = (vptr * nlocal)() + c_virial = (vptr * nlocal)() for i in range(nlocal): - cvirial[i] = vbuf() + c_virial[i] = vbuf() for j in range(6): - cvirial[i][j] = virial[i][j] + c_virial[i][j] = vatom[i][j] with ExceptionCheck(self): - return self.lib.lammps_fix_external_set_virial_peratom(self.lmp, fix_id.encode(), cvirial) + return self.lib.lammps_fix_external_set_virial_peratom(self.lmp, fix_id.encode(), c_virial) # ------------------------------------------------------------------------- def fix_external_set_vector_length(self, fix_id, length): diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index 1998930319..7752d7902e 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -266,7 +266,50 @@ class numpy_wrapper: value = self.lmp.fix_external_get_force(fix_id) return self.darray(value,nlocal,3) - # ------------------------------------------------------------------------- + # ------------------------------------------------------------------------- + + def fix_external_set_energy_peratom(self, fix_id, eatom): + """Set the per-atom energy contribution for a fix external instance with the given ID. + + This function is an alternative to + :py:meth:`lammps.fix_external_set_energy_peratom() ` + method. It behaves the same as the original method, but accepts a NumPy array + instead of a list as argument. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eatom: per-atom potential energy + :type: numpy.array + """ + import numpy as np + nlocal = self.lmp.extract_setting('nlocal') + c_double_p = POINTER(c_double) + value = eatom.astype(np.double) + return self.lmp.lib.lammps_fix_external_set_energy_peratom(self.lmp.lmp, fix_id.encode(), + value.ctypes.data_as(c_double_p)) + + # ------------------------------------------------------------------------- + + def fix_external_set_virial_peratom(self, fix_id, vatom): + """Set the per-atom virial contribution for a fix external instance with the given ID. + + This function is an alternative to + :py:meth:`lammps.fix_external_set_virial_peratom() ` + method. It behaves the same as the original method, but accepts a NumPy array + instead of a list as argument. + + .. note:: + + This function is not yet implemented. + + :param fix_id: Fix-ID of a fix external instance + :type: string + :param eatom: per-atom potential energy + :type: numpy.array + """ + raise Exception('fix_external_set_virial_peratom() not yet implemented for NumPy arrays') + + # ------------------------------------------------------------------------- def get_neighlist(self, idx): """Returns an instance of :class:`NumPyNeighList` which wraps access to the neighbor list with the given index diff --git a/src/library.cpp b/src/library.cpp index b9c2fbe4e9..7d49868158 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -5189,7 +5189,7 @@ is assumed to be extensive. The index in the *idx* parameter is 1-based, i.e. the first element is set with idx = 1 and the last element of the vector with idx = N, - where N is the value of the *len* parameter of the call to + where N is the value of the *len* parameter of the call to :cpp:func:`lammps_fix_external_set_vector_length`. Please see the documentation for :doc:`fix external ` for diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index 8b85d2ccd1..d7928ccbe2 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -32,6 +32,13 @@ def callback_one(lmp, ntimestep, nlocal, tag, x, f): lmp.fix_external_set_energy_peratom("ext",eatom) lmp.fix_external_set_virial_peratom("ext",vatom) + #import numpy as np + #eng = np.array(eatom) + #vir = np.array(vatom) + + #lmp.numpy.fix_external_set_energy_peratom("ext",eng) + #lmp.numpy.fix_external_set_virial_peratom("ext",vir) # not yet implemented + class PythonExternal(unittest.TestCase): def testExternalCallback(self): """Test fix external from Python with pf/callback""" From a078d1ba53f5698ea58b11456a01a6437bab7d10 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 22:49:16 -0400 Subject: [PATCH 134/352] check energy and virial per atom arrays for correct size --- python/lammps/core.py | 6 ++++++ python/lammps/numpy_wrapper.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 269b716c13..d981243503 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1842,6 +1842,8 @@ class lammps(object): """ nlocal = self.extract_setting('nlocal') + if len(eatom) < nlocal: + raise Exception('per-atom energy list length must be at least nlocal') ceatom = (nlocal*c_double)(*eatom) with ExceptionCheck(self): return self.lib.lammps_fix_external_set_energy_peratom(self.lmp, fix_id.encode(), ceatom) @@ -1862,6 +1864,10 @@ class lammps(object): # copy virial data to C compatible buffer nlocal = self.extract_setting('nlocal') + if len(vatom) < nlocal: + raise Exception('per-atom virial first dimension must be at least nlocal') + if len(vatom[0]) != 6: + raise Exception('per-atom virial second dimension must be 6') vbuf = (c_double * 6) vptr = POINTER(c_double) c_virial = (vptr * nlocal)() diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index 7752d7902e..29a6f9d74e 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -283,6 +283,9 @@ class numpy_wrapper: """ import numpy as np nlocal = self.lmp.extract_setting('nlocal') + if len(eatom) < nlocal: + raise Exception('per-atom energy dimension must be at least nlocal') + c_double_p = POINTER(c_double) value = eatom.astype(np.double) return self.lmp.lib.lammps_fix_external_set_energy_peratom(self.lmp.lmp, fix_id.encode(), @@ -307,7 +310,13 @@ class numpy_wrapper: :param eatom: per-atom potential energy :type: numpy.array """ - raise Exception('fix_external_set_virial_peratom() not yet implemented for NumPy arrays') + import numpy as np + nlocal = self.lmp.extract_setting('nlocal') + if len(vatom) < nlocal: + raise Exception('per-atom virial first dimension must be at least nlocal') + if len(vatom[0]) != 6: + raise Exception('per-atom virial second dimension must be 6') + # ------------------------------------------------------------------------- From c8cc5ecb9fcc4848e2c4447a7d420fc839f433a1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 22:50:05 -0400 Subject: [PATCH 135/352] implement setting per-atom virial from numpy array (thanks to stackoverflow) --- python/lammps/numpy_wrapper.py | 16 +++++++--- unittest/python/python-fix-external.py | 43 ++++++++++++++++++-------- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index 29a6f9d74e..6f4503a9c8 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -17,7 +17,7 @@ ################################################################################ import warnings -from ctypes import POINTER, c_double, c_int, c_int32, c_int64, cast +from ctypes import POINTER, c_void_p, c_char_p, c_double, c_int, c_int32, c_int64, cast from .constants import * # lgtm [py/polluting-import] @@ -301,10 +301,6 @@ class numpy_wrapper: method. It behaves the same as the original method, but accepts a NumPy array instead of a list as argument. - .. note:: - - This function is not yet implemented. - :param fix_id: Fix-ID of a fix external instance :type: string :param eatom: per-atom potential energy @@ -317,6 +313,16 @@ class numpy_wrapper: if len(vatom[0]) != 6: raise Exception('per-atom virial second dimension must be 6') + c_double_pp = np.ctypeslib.ndpointer(dtype=np.uintp, ndim=1, flags='C') + + # recast numpy array to be compatible with library interface + value = (vatom.__array_interface__['data'][0] + + np.arange(vatom.shape[0])*vatom.strides[0]).astype(np.uintp) + + # change prototype to our custom type + self.lmp.lib.lammps_fix_external_set_virial_peratom.argtypes = [ c_void_p, c_char_p, c_double_pp ] + + self.lmp.lib.lammps_fix_external_set_virial_peratom(self.lmp.lmp, fix_id.encode(), value) # ------------------------------------------------------------------------- diff --git a/unittest/python/python-fix-external.py b/unittest/python/python-fix-external.py index d7928ccbe2..c061b9f466 100644 --- a/unittest/python/python-fix-external.py +++ b/unittest/python/python-fix-external.py @@ -2,6 +2,12 @@ import sys,os,unittest from ctypes import * from lammps import lammps, LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR +try: + import numpy + NUMPY_INSTALLED = True +except ImportError: + NUMPY_INSTALLED = False + # add timestep dependent force def callback_one(lmp, ntimestep, nlocal, tag, x, f): lmp.fix_external_set_virial_global("ext",[1.0, 1.0, 1.0, 0.0, 0.0, 0.0]) @@ -29,17 +35,21 @@ def callback_one(lmp, ntimestep, nlocal, tag, x, f): [0.0,0.0,0.0,0.0,0.0,0.6], [0.0,0.0,0.0,0.0,-7.0,0.0], [0.0,-8.0,0.0,0.0,0.0,0.0] ] - lmp.fix_external_set_energy_peratom("ext",eatom) - lmp.fix_external_set_virial_peratom("ext",vatom) + if ntimestep < 5: + lmp.fix_external_set_energy_peratom("ext",eatom) + lmp.fix_external_set_virial_peratom("ext",vatom) + else: + import numpy as np + eng = np.array(eatom) + vir = np.array(vatom) - #import numpy as np - #eng = np.array(eatom) - #vir = np.array(vatom) + lmp.numpy.fix_external_set_energy_peratom("ext",eng) + lmp.numpy.fix_external_set_virial_peratom("ext",vir) - #lmp.numpy.fix_external_set_energy_peratom("ext",eng) - #lmp.numpy.fix_external_set_virial_peratom("ext",vir) # not yet implemented + # ------------------------------------------------------------------------ class PythonExternal(unittest.TestCase): + @unittest.skipIf(not NUMPY_INSTALLED, "NumPy is not available") def testExternalCallback(self): """Test fix external from Python with pf/callback""" @@ -70,10 +80,23 @@ class PythonExternal(unittest.TestCase): lmp.commands_string(basic_system) lmp.fix_external_set_vector_length("ext",6); lmp.set_fix_external_callback("ext",callback_one,lmp) + + # check setting per-atom data with python lists + lmp.command("run 0 post no") + reduce = lmp.extract_compute("sum", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR) + self.assertAlmostEqual(reduce[0],2.8,14) + self.assertAlmostEqual(reduce[1],-0.1,14) + self.assertAlmostEqual(reduce[2],7.8,14) + self.assertAlmostEqual(reduce[3],-0.3,14) + self.assertAlmostEqual(reduce[4],-0.4,14) + self.assertAlmostEqual(reduce[5],6.5,14) + self.assertAlmostEqual(reduce[6],-0.6,14) + lmp.command("run 10 post no") self.assertAlmostEqual(lmp.get_thermo("temp"),1.0/30.0,14) self.assertAlmostEqual(lmp.get_thermo("pe"),1.0/8.0,14) self.assertAlmostEqual(lmp.get_thermo("press"),0.15416666666666667,14) + # check setting per-atom data numpy arrays reduce = lmp.extract_compute("sum", LMP_STYLE_GLOBAL, LMP_TYPE_VECTOR) self.assertAlmostEqual(reduce[0],2.8,14) self.assertAlmostEqual(reduce[1],-0.1,14) @@ -90,12 +113,6 @@ class PythonExternal(unittest.TestCase): def testExternalArray(self): """Test fix external from Python with pf/array""" - try: - import numpy - NUMPY_INSTALLED = True - except ImportError: - NUMPY_INSTALLED = False - machine=None if 'LAMMPS_MACHINE_NAME' in os.environ: machine=os.environ['LAMMPS_MACHINE_NAME'] From c33bead8b1a9b2c412666f178d8edf23b5c31303 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Jul 2021 23:26:22 -0400 Subject: [PATCH 136/352] silence static code analysis warning --- src/MISC/fix_pair_tracker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MISC/fix_pair_tracker.cpp b/src/MISC/fix_pair_tracker.cpp index 7939485aff..755025baed 100644 --- a/src/MISC/fix_pair_tracker.cpp +++ b/src/MISC/fix_pair_tracker.cpp @@ -246,7 +246,7 @@ void FixPairTracker::reallocate(int n) double FixPairTracker::memory_usage() { - double bytes = nmax * nvalues * sizeof(double); + double bytes = nmax * (double) nvalues * sizeof(double); bytes += nmax * 2 * sizeof(int); return bytes; } From fd3be6176d7c40317c23cb181aba00ae87064b54 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 08:36:23 -0400 Subject: [PATCH 137/352] remove dead code --- python/lammps/core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index d981243503..c4639eee4f 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1790,7 +1790,6 @@ class lammps(object): with ExceptionCheck(self): return self.lib.lammps_fix_external_get_force(self.lmp, fix_id.encode()) - return None # ------------------------------------------------------------------------- From 594bf56ee34b069341eee38fef0b2865245cf00c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 12:12:40 -0400 Subject: [PATCH 138/352] silence compiler warnings on macOS --- unittest/formats/test_file_operations.cpp | 1 - unittest/utils/test_tokenizer.cpp | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/unittest/formats/test_file_operations.cpp b/unittest/formats/test_file_operations.cpp index 794222fe5a..af2023cebb 100644 --- a/unittest/formats/test_file_operations.cpp +++ b/unittest/formats/test_file_operations.cpp @@ -281,7 +281,6 @@ TEST_F(FileOperationsTest, error_message_warn) TEST_F(FileOperationsTest, error_all_one) { - char buf[64]; BEGIN_HIDE_OUTPUT(); command("echo none"); command("log none"); diff --git a/unittest/utils/test_tokenizer.cpp b/unittest/utils/test_tokenizer.cpp index c62a947d5c..698283ea53 100644 --- a/unittest/utils/test_tokenizer.cpp +++ b/unittest/utils/test_tokenizer.cpp @@ -94,7 +94,8 @@ TEST(Tokenizer, copy_constructor) TEST(Tokenizer, move_constructor) { - Tokenizer u = std::move(Tokenizer("test new word ", " ")); + Tokenizer t("test new word ", " "); + Tokenizer u = std::move(t); ASSERT_THAT(u.next(), Eq("test")); ASSERT_THAT(u.next(), Eq("new")); ASSERT_THAT(u.next(), Eq("word")); @@ -248,7 +249,8 @@ TEST(ValueTokenizer, copy_constructor) TEST(ValueTokenizer, move_constructor) { - ValueTokenizer u = std::move(ValueTokenizer(" test new word ", " ")); + ValueTokenizer t(" test new word ", " "); + ValueTokenizer u = std::move(t); ASSERT_THAT(u.next_string(), Eq("test")); ASSERT_THAT(u.next_string(), Eq("new")); ASSERT_THAT(u.next_string(), Eq("word")); From 25aa2029769f43801d28a7bce9cdec9e8cf5a35d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 12:12:57 -0400 Subject: [PATCH 139/352] tweak epsilon to pass reaxff unittests on macOS --- unittest/force-styles/tests/atomic-pair-reax_c.yaml | 2 +- unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reax_c.yaml index c4d41a2f2a..d5bed64ae6 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c.yaml @@ -1,7 +1,7 @@ --- lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:45 2021 -epsilon: 1e-11 +epsilon: 2e-11 prerequisites: ! | pair reaxff fix qeq/reaxff diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml index c766c242f9..b124a6b00b 100644 --- a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml @@ -1,7 +1,7 @@ --- lammps_version: 2 Jul 2021 date_generated: Wed Jul 21 15:49:47 2021 -epsilon: 1e-12 +epsilon: 3e-12 prerequisites: ! | pair reaxff fix qeq/reaxff From c5872528948884d7f1fa6eece6dc6dd9b198bcf7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 12:13:50 -0400 Subject: [PATCH 140/352] rename unittest YAML files --- .../tests/{atomic-pair-reax_c.yaml => atomic-pair-reaxff.yaml} | 0 ...tomic-pair-reax_c_lgvdw.yaml => atomic-pair-reaxff_lgvdw.yaml} | 0 ...tomic-pair-reax_c_noqeq.yaml => atomic-pair-reaxff_noqeq.yaml} | 0 ...pair-reax_c_tabulate.yaml => atomic-pair-reaxff_tabulate.yaml} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename unittest/force-styles/tests/{atomic-pair-reax_c.yaml => atomic-pair-reaxff.yaml} (100%) rename unittest/force-styles/tests/{atomic-pair-reax_c_lgvdw.yaml => atomic-pair-reaxff_lgvdw.yaml} (100%) rename unittest/force-styles/tests/{atomic-pair-reax_c_noqeq.yaml => atomic-pair-reaxff_noqeq.yaml} (100%) rename unittest/force-styles/tests/{atomic-pair-reax_c_tabulate.yaml => atomic-pair-reaxff_tabulate.yaml} (100%) diff --git a/unittest/force-styles/tests/atomic-pair-reax_c.yaml b/unittest/force-styles/tests/atomic-pair-reaxff.yaml similarity index 100% rename from unittest/force-styles/tests/atomic-pair-reax_c.yaml rename to unittest/force-styles/tests/atomic-pair-reaxff.yaml diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml similarity index 100% rename from unittest/force-styles/tests/atomic-pair-reax_c_lgvdw.yaml rename to unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml similarity index 100% rename from unittest/force-styles/tests/atomic-pair-reax_c_noqeq.yaml rename to unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml diff --git a/unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml similarity index 100% rename from unittest/force-styles/tests/atomic-pair-reax_c_tabulate.yaml rename to unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml From 852f18525d8a6a93fe041036c96e1a2da7b1972d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 18:00:28 -0400 Subject: [PATCH 141/352] complete moving packages and styles around --- cmake/CMakeLists.txt | 7 +- cmake/presets/all_off.cmake | 7 +- cmake/presets/all_on.cmake | 7 +- cmake/presets/mingw-cross.cmake | 8 +- cmake/presets/most.cmake | 7 +- src/.gitignore | 63 ++++++++++++++-- .../pair_lj_sf_dipole_sf.cpp | 0 .../pair_lj_sf_dipole_sf.h | 0 src/Depend.sh | 24 +++--- .../compute_ackland_atom.cpp | 0 .../compute_ackland_atom.h | 0 src/{ => EXTRA-COMPUTE}/compute_adf.cpp | 0 src/{ => EXTRA-COMPUTE}/compute_adf.h | 0 .../compute_aggregate_atom.cpp | 0 .../compute_aggregate_atom.h | 0 .../compute_basal_atom.cpp | 0 .../compute_basal_atom.h | 0 .../compute_cluster_atom.cpp | 0 .../compute_cluster_atom.h | 0 .../compute_cnp_atom.cpp | 0 .../compute_cnp_atom.h | 0 .../compute_entropy_atom.cpp | 0 .../compute_entropy_atom.h | 0 .../compute_fragment_atom.cpp | 0 .../compute_fragment_atom.h | 0 .../compute_gyration_shape.cpp | 0 .../compute_gyration_shape.h | 0 .../compute_gyration_shape_chunk.cpp | 0 .../compute_gyration_shape_chunk.h | 0 .../compute_hexorder_atom.cpp | 0 .../compute_hexorder_atom.h | 0 .../compute_hma.cpp | 0 .../compute_hma.h | 0 .../compute_momentum.cpp | 0 .../compute_momentum.h | 0 .../compute_msd_nongauss.cpp | 0 .../compute_msd_nongauss.h | 0 .../compute_orientorder_atom.cpp | 0 .../compute_orientorder_atom.h | 0 .../compute_pressure_cylinder.cpp | 0 .../compute_pressure_cylinder.h | 0 .../compute_stress_mop.cpp | 0 .../compute_stress_mop.h | 0 .../compute_stress_mop_profile.cpp | 0 .../compute_stress_mop_profile.h | 0 .../compute_temp_rotate.cpp | 0 .../compute_temp_rotate.h | 0 src/{MISC => EXTRA-COMPUTE}/compute_ti.cpp | 0 src/{MISC => EXTRA-COMPUTE}/compute_ti.h | 0 src/{ => EXTRA-DUMP}/dump_dcd.cpp | 0 src/{ => EXTRA-DUMP}/dump_dcd.h | 0 src/{MISC => EXTRA-DUMP}/dump_xtc.cpp | 0 src/{MISC => EXTRA-DUMP}/dump_xtc.h | 0 src/{MISC => EXTRA-DUMP}/xdr_compat.cpp | 0 src/{MISC => EXTRA-DUMP}/xdr_compat.h | 0 src/{MISC => EXTRA-FIX}/fix_addtorque.cpp | 0 src/{MISC => EXTRA-FIX}/fix_addtorque.h | 0 .../fix_ave_correlate_long.cpp | 0 .../fix_ave_correlate_long.h | 0 src/{ => EXTRA-FIX}/fix_controller.cpp | 0 src/{ => EXTRA-FIX}/fix_controller.h | 0 src/{ => EXTRA-FIX}/fix_drag.cpp | 0 src/{ => EXTRA-FIX}/fix_drag.h | 0 .../fix_electron_stopping.cpp | 0 .../fix_electron_stopping.h | 0 .../fix_electron_stopping_fit.cpp | 0 .../fix_electron_stopping_fit.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_ffl.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_ffl.h | 0 .../fix_filter_corotate.cpp | 0 .../fix_filter_corotate.h | 0 .../fix_flow_gauss.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_flow_gauss.h | 0 src/{MISC => EXTRA-FIX}/fix_gld.cpp | 0 src/{MISC => EXTRA-FIX}/fix_gld.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_gle.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_gle.h | 0 .../fix_momentum_chunk.cpp | 0 .../fix_momentum_chunk.h | 0 .../fix_npt_cauchy.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_npt_cauchy.h | 0 src/{ => EXTRA-FIX}/fix_numdiff.cpp | 0 src/{ => EXTRA-FIX}/fix_numdiff.h | 0 src/{ => EXTRA-FIX}/fix_nve_noforce.cpp | 0 src/{ => EXTRA-FIX}/fix_nve_noforce.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_nvk.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_nvk.h | 0 src/{MISC => EXTRA-FIX}/fix_oneway.cpp | 0 src/{MISC => EXTRA-FIX}/fix_oneway.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_pafi.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_pafi.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_pimd.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_pimd.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_rhok.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_rhok.h | 0 src/{MISC => EXTRA-FIX}/fix_smd.cpp | 0 src/{MISC => EXTRA-FIX}/fix_smd.h | 0 src/{ => EXTRA-FIX}/fix_spring_rg.cpp | 0 src/{ => EXTRA-FIX}/fix_spring_rg.h | 0 src/{ => EXTRA-FIX}/fix_temp_csld.cpp | 0 src/{ => EXTRA-FIX}/fix_temp_csld.h | 0 src/{ => EXTRA-FIX}/fix_temp_csvr.cpp | 0 src/{ => EXTRA-FIX}/fix_temp_csvr.h | 0 .../fix_ti_spring.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_ti_spring.h | 0 src/{ => EXTRA-FIX}/fix_tmd.cpp | 0 src/{ => EXTRA-FIX}/fix_tmd.h | 0 src/{MISC => EXTRA-FIX}/fix_ttm.cpp | 0 src/{MISC => EXTRA-FIX}/fix_ttm.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_ttm_mod.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_ttm_mod.h | 0 src/{MISC => EXTRA-FIX}/fix_viscosity.cpp | 0 src/{MISC => EXTRA-FIX}/fix_viscosity.h | 0 src/{USER-MISC => EXTRA-FIX}/fix_wall_ees.cpp | 0 src/{USER-MISC => EXTRA-FIX}/fix_wall_ees.h | 0 .../fix_wall_reflect_stochastic.cpp | 0 .../fix_wall_reflect_stochastic.h | 0 .../fix_wall_region_ees.cpp | 0 .../fix_wall_region_ees.h | 0 .../angle_cosine_delta.cpp | 0 .../angle_cosine_delta.h | 0 .../angle_cosine_periodic.cpp | 0 .../angle_cosine_periodic.h | 0 .../angle_cosine_shift.cpp | 0 .../angle_cosine_shift.h | 0 .../angle_cosine_shift_exp.cpp | 0 .../angle_cosine_shift_exp.h | 0 .../angle_fourier.cpp | 0 .../angle_fourier.h | 0 .../angle_fourier_simple.cpp | 0 .../angle_fourier_simple.h | 0 .../angle_gaussian.cpp | 0 .../angle_gaussian.h | 0 .../angle_quartic.cpp | 0 .../angle_quartic.h | 0 .../bond_gaussian.cpp | 0 .../bond_gaussian.h | 0 .../bond_harmonic_shift.cpp | 0 .../bond_harmonic_shift.h | 0 .../bond_harmonic_shift_cut.cpp | 0 .../bond_harmonic_shift_cut.h | 0 .../bond_nonlinear.cpp | 0 .../bond_nonlinear.h | 0 .../dihedral_cosine_shift_exp.cpp | 0 .../dihedral_cosine_shift_exp.h | 0 .../dihedral_fourier.cpp | 0 .../dihedral_fourier.h | 0 .../dihedral_helix.cpp | 0 .../dihedral_helix.h | 0 .../dihedral_nharmonic.cpp | 0 .../dihedral_nharmonic.h | 0 .../dihedral_quadratic.cpp | 0 .../dihedral_quadratic.h | 0 .../dihedral_spherical.cpp | 0 .../dihedral_spherical.h | 0 .../dihedral_table_cut.cpp | 0 .../dihedral_table_cut.h | 0 .../improper_cossq.cpp | 0 .../improper_cossq.h | 0 .../improper_distance.cpp | 0 .../improper_distance.h | 0 .../improper_fourier.cpp | 0 .../improper_fourier.h | 0 .../improper_ring.cpp | 0 .../improper_ring.h | 0 src/{ => EXTRA-PAIR}/pair_born_coul_dsf.cpp | 0 src/{ => EXTRA-PAIR}/pair_born_coul_dsf.h | 0 src/{ => EXTRA-PAIR}/pair_born_coul_wolf.cpp | 0 src/{ => EXTRA-PAIR}/pair_born_coul_wolf.h | 0 .../pair_buck_mdf.cpp | 0 src/{USER-MISC => EXTRA-PAIR}/pair_buck_mdf.h | 0 .../pair_cosine_squared.cpp | 0 .../pair_cosine_squared.h | 0 src/{ => EXTRA-PAIR}/pair_coul_cut_global.cpp | 0 src/{ => EXTRA-PAIR}/pair_coul_cut_global.h | 0 .../pair_coul_diel.cpp | 0 .../pair_coul_diel.h | 0 .../pair_coul_slater_cut.cpp | 0 .../pair_coul_slater_cut.h | 0 .../pair_coul_slater_long.cpp | 0 .../pair_coul_slater_long.h | 0 src/{ => EXTRA-PAIR}/pair_coul_streitz.cpp | 0 src/{ => EXTRA-PAIR}/pair_coul_streitz.h | 0 src/{USER-MISC => EXTRA-PAIR}/pair_e3b.cpp | 0 src/{USER-MISC => EXTRA-PAIR}/pair_e3b.h | 0 src/{ => EXTRA-PAIR}/pair_gauss.cpp | 0 src/{ => EXTRA-PAIR}/pair_gauss.h | 0 .../pair_gauss_cut.cpp | 0 .../pair_gauss_cut.h | 0 .../pair_lennard_mdf.cpp | 0 .../pair_lennard_mdf.h | 0 src/{ => EXTRA-PAIR}/pair_lj96_cut.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj96_cut.h | 0 src/{ => EXTRA-PAIR}/pair_lj_cubic.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_cubic.h | 0 src/{ => EXTRA-PAIR}/pair_lj_cubic_const.h | 0 .../pair_lj_cut_coul_debye.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_cut_coul_debye.h | 0 src/{ => EXTRA-PAIR}/pair_lj_cut_coul_dsf.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_cut_coul_dsf.h | 0 .../pair_lj_cut_coul_wolf.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_cut_coul_wolf.h | 0 .../pair_lj_expand_coul_long.cpp | 0 .../pair_lj_expand_coul_long.h | 0 src/{ => EXTRA-PAIR}/pair_lj_gromacs.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_gromacs.h | 0 .../pair_lj_gromacs_coul_gromacs.cpp | 0 .../pair_lj_gromacs_coul_gromacs.h | 0 src/{USER-MISC => EXTRA-PAIR}/pair_lj_mdf.cpp | 0 src/{USER-MISC => EXTRA-PAIR}/pair_lj_mdf.h | 0 src/{ => EXTRA-PAIR}/pair_lj_relres.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_relres.h | 0 src/{ => EXTRA-PAIR}/pair_lj_smooth.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_smooth.h | 0 .../pair_lj_smooth_linear.cpp | 0 src/{ => EXTRA-PAIR}/pair_lj_smooth_linear.h | 0 src/{ => EXTRA-PAIR}/pair_mie_cut.cpp | 0 src/{ => EXTRA-PAIR}/pair_mie_cut.h | 0 src/{USER-MISC => EXTRA-PAIR}/pair_momb.cpp | 0 src/{USER-MISC => EXTRA-PAIR}/pair_momb.h | 0 .../pair_morse_smooth_linear.cpp | 0 .../pair_morse_smooth_linear.h | 0 src/{MISC => EXTRA-PAIR}/pair_nm_cut.cpp | 0 src/{MISC => EXTRA-PAIR}/pair_nm_cut.h | 0 .../pair_nm_cut_coul_cut.cpp | 0 .../pair_nm_cut_coul_cut.h | 0 .../pair_nm_cut_coul_long.cpp | 0 .../pair_nm_cut_coul_long.h | 0 src/{ => EXTRA-PAIR}/pair_ufm.cpp | 0 src/{ => EXTRA-PAIR}/pair_ufm.h | 0 src/{USER-MISC => EXTRA-PAIR}/pair_wf_cut.cpp | 0 src/{USER-MISC => EXTRA-PAIR}/pair_wf_cut.h | 0 src/{ => GRANULAR}/compute_contact_atom.cpp | 0 src/{ => GRANULAR}/compute_contact_atom.h | 0 src/KOKKOS/Install.sh | 16 ++-- src/{USER-MISC => MANYBODY}/pair_edip.cpp | 0 src/{USER-MISC => MANYBODY}/pair_edip.h | 0 .../pair_edip_multi.cpp | 0 src/{USER-MISC => MANYBODY}/pair_edip_multi.h | 0 src/{USER-MISC => MANYBODY}/pair_extep.cpp | 0 src/{USER-MISC => MANYBODY}/pair_extep.h | 0 .../pair_local_density.cpp | 0 .../pair_local_density.h | 0 .../pair_meam_spline.cpp | 0 .../pair_meam_spline.h | 0 .../pair_meam_sw_spline.cpp | 0 .../pair_meam_sw_spline.h | 0 .../pair_tersoff_table.cpp | 0 .../pair_tersoff_table.h | 0 .../compute_viscosity_cos.cpp | 0 .../compute_viscosity_cos.h | 0 .../fix_accelerate_cos.cpp | 0 src/{USER-MISC => MISC}/fix_accelerate_cos.h | 0 src/{USER-MISC => MISC}/fix_ipi.cpp | 0 src/{USER-MISC => MISC}/fix_ipi.h | 0 src/{USER-MISC => MISC}/fix_srp.cpp | 0 src/{USER-MISC => MISC}/fix_srp.h | 0 src/{USER-MISC => MISC}/pair_agni.cpp | 0 src/{USER-MISC => MISC}/pair_agni.h | 0 src/Makefile | 16 +++- src/{MISC => ORIENT}/fix_orient_bcc.cpp | 0 src/{MISC => ORIENT}/fix_orient_bcc.h | 0 src/{USER-MISC => ORIENT}/fix_orient_eco.cpp | 0 src/{USER-MISC => ORIENT}/fix_orient_eco.h | 0 src/{MISC => ORIENT}/fix_orient_fcc.cpp | 0 src/{MISC => ORIENT}/fix_orient_fcc.h | 0 src/Purge.list | 7 -- src/USER-MISC/README | 73 ------------------- src/{MISC => }/fix_deposit.cpp | 0 src/{MISC => }/fix_deposit.h | 0 src/{MISC => }/fix_efield.cpp | 0 src/{MISC => }/fix_efield.h | 0 src/{MISC => }/fix_evaporate.cpp | 0 src/{MISC => }/fix_evaporate.h | 0 src/{MISC => }/fix_thermal_conductivity.cpp | 0 src/{MISC => }/fix_thermal_conductivity.h | 0 276 files changed, 122 insertions(+), 113 deletions(-) rename src/{USER-MISC => DIPOLE}/pair_lj_sf_dipole_sf.cpp (100%) rename src/{USER-MISC => DIPOLE}/pair_lj_sf_dipole_sf.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_ackland_atom.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_ackland_atom.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_adf.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_adf.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_aggregate_atom.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_aggregate_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_basal_atom.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_basal_atom.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_cluster_atom.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_cluster_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_cnp_atom.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_cnp_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_entropy_atom.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_entropy_atom.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_fragment_atom.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_fragment_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_gyration_shape.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_gyration_shape.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_gyration_shape_chunk.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_gyration_shape_chunk.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_hexorder_atom.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_hexorder_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_hma.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_hma.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_momentum.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_momentum.h (100%) rename src/{MISC => EXTRA-COMPUTE}/compute_msd_nongauss.cpp (100%) rename src/{MISC => EXTRA-COMPUTE}/compute_msd_nongauss.h (100%) rename src/{ => EXTRA-COMPUTE}/compute_orientorder_atom.cpp (100%) rename src/{ => EXTRA-COMPUTE}/compute_orientorder_atom.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_pressure_cylinder.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_pressure_cylinder.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_stress_mop.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_stress_mop.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_stress_mop_profile.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_stress_mop_profile.h (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_temp_rotate.cpp (100%) rename src/{USER-MISC => EXTRA-COMPUTE}/compute_temp_rotate.h (100%) rename src/{MISC => EXTRA-COMPUTE}/compute_ti.cpp (100%) rename src/{MISC => EXTRA-COMPUTE}/compute_ti.h (100%) rename src/{ => EXTRA-DUMP}/dump_dcd.cpp (100%) rename src/{ => EXTRA-DUMP}/dump_dcd.h (100%) rename src/{MISC => EXTRA-DUMP}/dump_xtc.cpp (100%) rename src/{MISC => EXTRA-DUMP}/dump_xtc.h (100%) rename src/{MISC => EXTRA-DUMP}/xdr_compat.cpp (100%) rename src/{MISC => EXTRA-DUMP}/xdr_compat.h (100%) rename src/{MISC => EXTRA-FIX}/fix_addtorque.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_addtorque.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ave_correlate_long.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ave_correlate_long.h (100%) rename src/{ => EXTRA-FIX}/fix_controller.cpp (100%) rename src/{ => EXTRA-FIX}/fix_controller.h (100%) rename src/{ => EXTRA-FIX}/fix_drag.cpp (100%) rename src/{ => EXTRA-FIX}/fix_drag.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_electron_stopping.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_electron_stopping.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_electron_stopping_fit.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_electron_stopping_fit.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ffl.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ffl.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_filter_corotate.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_filter_corotate.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_flow_gauss.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_flow_gauss.h (100%) rename src/{MISC => EXTRA-FIX}/fix_gld.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_gld.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_gle.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_gle.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_momentum_chunk.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_momentum_chunk.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_npt_cauchy.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_npt_cauchy.h (100%) rename src/{ => EXTRA-FIX}/fix_numdiff.cpp (100%) rename src/{ => EXTRA-FIX}/fix_numdiff.h (100%) rename src/{ => EXTRA-FIX}/fix_nve_noforce.cpp (100%) rename src/{ => EXTRA-FIX}/fix_nve_noforce.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_nvk.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_nvk.h (100%) rename src/{MISC => EXTRA-FIX}/fix_oneway.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_oneway.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_pafi.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_pafi.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_pimd.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_pimd.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_rhok.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_rhok.h (100%) rename src/{MISC => EXTRA-FIX}/fix_smd.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_smd.h (100%) rename src/{ => EXTRA-FIX}/fix_spring_rg.cpp (100%) rename src/{ => EXTRA-FIX}/fix_spring_rg.h (100%) rename src/{ => EXTRA-FIX}/fix_temp_csld.cpp (100%) rename src/{ => EXTRA-FIX}/fix_temp_csld.h (100%) rename src/{ => EXTRA-FIX}/fix_temp_csvr.cpp (100%) rename src/{ => EXTRA-FIX}/fix_temp_csvr.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ti_spring.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ti_spring.h (100%) rename src/{ => EXTRA-FIX}/fix_tmd.cpp (100%) rename src/{ => EXTRA-FIX}/fix_tmd.h (100%) rename src/{MISC => EXTRA-FIX}/fix_ttm.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_ttm.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ttm_mod.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_ttm_mod.h (100%) rename src/{MISC => EXTRA-FIX}/fix_viscosity.cpp (100%) rename src/{MISC => EXTRA-FIX}/fix_viscosity.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_ees.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_ees.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_reflect_stochastic.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_reflect_stochastic.h (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_region_ees.cpp (100%) rename src/{USER-MISC => EXTRA-FIX}/fix_wall_region_ees.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_delta.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_delta.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_periodic.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_periodic.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_shift.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_shift.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_shift_exp.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_cosine_shift_exp.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_fourier.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_fourier.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_fourier_simple.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_fourier_simple.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_gaussian.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_gaussian.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_quartic.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/angle_quartic.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_gaussian.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_gaussian.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_harmonic_shift.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_harmonic_shift.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_harmonic_shift_cut.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_harmonic_shift_cut.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_nonlinear.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/bond_nonlinear.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_cosine_shift_exp.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_cosine_shift_exp.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_fourier.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_fourier.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_helix.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_helix.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_nharmonic.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_nharmonic.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_quadratic.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_quadratic.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_spherical.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_spherical.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_table_cut.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/dihedral_table_cut.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_cossq.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_cossq.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_distance.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_distance.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_fourier.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_fourier.h (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_ring.cpp (100%) rename src/{MOLECULE => EXTRA-MOLECULE}/improper_ring.h (100%) rename src/{ => EXTRA-PAIR}/pair_born_coul_dsf.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_born_coul_dsf.h (100%) rename src/{ => EXTRA-PAIR}/pair_born_coul_wolf.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_born_coul_wolf.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_buck_mdf.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_buck_mdf.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_cosine_squared.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_cosine_squared.h (100%) rename src/{ => EXTRA-PAIR}/pair_coul_cut_global.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_coul_cut_global.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_diel.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_diel.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_slater_cut.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_slater_cut.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_slater_long.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_coul_slater_long.h (100%) rename src/{ => EXTRA-PAIR}/pair_coul_streitz.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_coul_streitz.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_e3b.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_e3b.h (100%) rename src/{ => EXTRA-PAIR}/pair_gauss.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_gauss.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_gauss_cut.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_gauss_cut.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lennard_mdf.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lennard_mdf.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj96_cut.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj96_cut.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cubic.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cubic.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cubic_const.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_debye.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_debye.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_dsf.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_dsf.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_wolf.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_cut_coul_wolf.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lj_expand_coul_long.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lj_expand_coul_long.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_gromacs.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_gromacs.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_gromacs_coul_gromacs.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_gromacs_coul_gromacs.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lj_mdf.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_lj_mdf.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_relres.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_relres.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_smooth.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_smooth.h (100%) rename src/{ => EXTRA-PAIR}/pair_lj_smooth_linear.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_lj_smooth_linear.h (100%) rename src/{ => EXTRA-PAIR}/pair_mie_cut.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_mie_cut.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_momb.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_momb.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_morse_smooth_linear.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_morse_smooth_linear.h (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut.cpp (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut.h (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut_coul_cut.cpp (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut_coul_cut.h (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut_coul_long.cpp (100%) rename src/{MISC => EXTRA-PAIR}/pair_nm_cut_coul_long.h (100%) rename src/{ => EXTRA-PAIR}/pair_ufm.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_ufm.h (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_wf_cut.cpp (100%) rename src/{USER-MISC => EXTRA-PAIR}/pair_wf_cut.h (100%) rename src/{ => GRANULAR}/compute_contact_atom.cpp (100%) rename src/{ => GRANULAR}/compute_contact_atom.h (100%) rename src/{USER-MISC => MANYBODY}/pair_edip.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_edip.h (100%) rename src/{USER-MISC => MANYBODY}/pair_edip_multi.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_edip_multi.h (100%) rename src/{USER-MISC => MANYBODY}/pair_extep.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_extep.h (100%) rename src/{USER-MISC => MANYBODY}/pair_local_density.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_local_density.h (100%) rename src/{USER-MISC => MANYBODY}/pair_meam_spline.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_meam_spline.h (100%) rename src/{USER-MISC => MANYBODY}/pair_meam_sw_spline.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_meam_sw_spline.h (100%) rename src/{USER-MISC => MANYBODY}/pair_tersoff_table.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_tersoff_table.h (100%) rename src/{USER-MISC => MISC}/compute_viscosity_cos.cpp (100%) rename src/{USER-MISC => MISC}/compute_viscosity_cos.h (100%) rename src/{USER-MISC => MISC}/fix_accelerate_cos.cpp (100%) rename src/{USER-MISC => MISC}/fix_accelerate_cos.h (100%) rename src/{USER-MISC => MISC}/fix_ipi.cpp (100%) rename src/{USER-MISC => MISC}/fix_ipi.h (100%) rename src/{USER-MISC => MISC}/fix_srp.cpp (100%) rename src/{USER-MISC => MISC}/fix_srp.h (100%) rename src/{USER-MISC => MISC}/pair_agni.cpp (100%) rename src/{USER-MISC => MISC}/pair_agni.h (100%) rename src/{MISC => ORIENT}/fix_orient_bcc.cpp (100%) rename src/{MISC => ORIENT}/fix_orient_bcc.h (100%) rename src/{USER-MISC => ORIENT}/fix_orient_eco.cpp (100%) rename src/{USER-MISC => ORIENT}/fix_orient_eco.h (100%) rename src/{MISC => ORIENT}/fix_orient_fcc.cpp (100%) rename src/{MISC => ORIENT}/fix_orient_fcc.h (100%) delete mode 100644 src/USER-MISC/README rename src/{MISC => }/fix_deposit.cpp (100%) rename src/{MISC => }/fix_deposit.h (100%) rename src/{MISC => }/fix_efield.cpp (100%) rename src/{MISC => }/fix_efield.h (100%) rename src/{MISC => }/fix_evaporate.cpp (100%) rename src/{MISC => }/fix_evaporate.h (100%) rename src/{MISC => }/fix_thermal_conductivity.cpp (100%) rename src/{MISC => }/fix_thermal_conductivity.h (100%) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e340a8bdb3..b2f5360020 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -161,6 +161,11 @@ set(STANDARD_PACKAGES DPD-SMOOTH DRUDE EFF + EXTRA-COMPUTE + EXTRA-DUMP + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR FEP GRANULAR H5MD @@ -191,6 +196,7 @@ set(STANDARD_PACKAGES MPIIO MSCG NETCDF + ORIENT PERI PHONON PLUGIN @@ -213,7 +219,6 @@ set(STANDARD_PACKAGES SRD TALLY UEF - USER-MISC VORONOI VTK YAFF) diff --git a/cmake/presets/all_off.cmake b/cmake/presets/all_off.cmake index b873965fe4..2893bbab6b 100644 --- a/cmake/presets/all_off.cmake +++ b/cmake/presets/all_off.cmake @@ -25,6 +25,11 @@ set(ALL_PACKAGES DPD-SMOOTH DRUDE EFF + EXTRA-COMPUTE + EXTRA-DUMP + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR FEP GPU GRANULAR @@ -60,6 +65,7 @@ set(ALL_PACKAGES NETCDF OPENMP OPT + ORIENT PERI PHONON PLUGIN @@ -82,7 +88,6 @@ set(ALL_PACKAGES SRD TALLY UEF - USER-MISC VORONOI VTK YAFF) diff --git a/cmake/presets/all_on.cmake b/cmake/presets/all_on.cmake index b4fe8e5303..9f38f1e1e4 100644 --- a/cmake/presets/all_on.cmake +++ b/cmake/presets/all_on.cmake @@ -27,6 +27,11 @@ set(ALL_PACKAGES DPD-SMOOTH DRUDE EFF + EXTRA-COMPUTE + EXTRA-DUMP + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR FEP GPU GRANULAR @@ -62,6 +67,7 @@ set(ALL_PACKAGES NETCDF OPENMP OPT + ORIENT PERI PHONON PLUGIN @@ -84,7 +90,6 @@ set(ALL_PACKAGES SRD TALLY UEF - USER-MISC VORONOI VTK YAFF) diff --git a/cmake/presets/mingw-cross.cmake b/cmake/presets/mingw-cross.cmake index 71675ba9d7..fe828a6d9a 100644 --- a/cmake/presets/mingw-cross.cmake +++ b/cmake/presets/mingw-cross.cmake @@ -21,6 +21,11 @@ set(WIN_PACKAGES DPD-SMOOTH DRUDE EFF + EXTRA-COMPUTE + EXTRA-DUMP + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR FEP GPU GRANULAR @@ -40,11 +45,13 @@ set(WIN_PACKAGES ML-HDNNP ML-IAP ML-SNAP + ML-RANN MOFFF MOLECULE MOLFILE OPENMP OPT + ORIENT PERI PHONON POEMS @@ -62,7 +69,6 @@ set(WIN_PACKAGES SRD TALLY UEF - USER-MISC VORONOI YAFF) diff --git a/cmake/presets/most.cmake b/cmake/presets/most.cmake index 8ad6ff31dc..9546f1f9a3 100644 --- a/cmake/presets/most.cmake +++ b/cmake/presets/most.cmake @@ -23,6 +23,10 @@ set(ALL_PACKAGES DPD-SMOOTH DRUDE EFF + EXTRA-COMPUTE + EXTRA-FIX + EXTRA-MOLECULE + EXTRA-PAIR FEP GRANULAR INTERLAYER @@ -38,6 +42,7 @@ set(ALL_PACKAGES MOLECULE OPENMP OPT + ORIENT PERI PHONON PLUGIN @@ -52,8 +57,8 @@ set(ALL_PACKAGES SPH SPIN SRD + TALLY UEF - USER-MISC VORONOI YAFF) diff --git a/src/.gitignore b/src/.gitignore index 42e1548c43..961901e322 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -250,6 +250,61 @@ /pair_mesont_tpm.cpp /pair_mesont_tpm.h +/compute_contact_atom.cpp +/compute_contact_atom.h +/dump_dcd.cpp +/dump_dcd.h +/fix_controller.cpp +/fix_controller.h +/fix_drag.cpp +/fix_drag.h +/fix_numdiff.cpp +/fix_numdiff.h +/fix_nve_noforce.cpp +/fix_nve_noforce.h +/fix_spring_rg.cpp +/fix_spring_rg.h +/fix_temp_csld.cpp +/fix_temp_csld.h +/fix_temp_csvr.cpp +/fix_temp_csvr.h +/fix_tmd.cpp +/fix_tmd.h +/pair_born_coul_dsf.cpp +/pair_born_coul_dsf.h +/pair_born_coul_wolf.cpp +/pair_born_coul_wolf.h +/pair_coul_cut_global.cpp +/pair_coul_cut_global.h +/pair_coul_streitz.cpp +/pair_coul_streitz.h +/pair_gauss.cpp +/pair_gauss.h +/pair_lj96_cut.cpp +/pair_lj96_cut.h +/pair_lj_cubic.cpp +/pair_lj_cubic.h +/pair_lj_cut_coul_debye.cpp +/pair_lj_cut_coul_debye.h +/pair_lj_cut_coul_dsf.cpp +/pair_lj_cut_coul_dsf.h +/pair_lj_cut_coul_wolf.cpp +/pair_lj_cut_coul_wolf.h +/pair_lj_gromacs.cpp +/pair_lj_gromacs.h +/pair_lj_gromacs_could_gromacs.cpp +/pair_lj_gromacs_could_gromacs.h +/pair_lj_relres.cpp +/pair_lj_relres.h +/pair_lj_smooth.cpp +/pair_lj_smooth.h +/pair_lj_smooth_linear.cpp +/pair_lj_smooth_linear.h +/pair_mie_cut.cpp +/pair_mie_cut.h +/pair_ufm.cpp +/pair_ufm.h + /angle_cg_cmm.cpp /angle_cg_cmm.h /angle_charmm.cpp @@ -578,12 +633,8 @@ /fix_client_md.h /fix_cmap.cpp /fix_cmap.h -/fix_deposit.cpp -/fix_deposit.h /fix_dpd_energy.cpp /fix_dpd_energy.h -/fix_efield.cpp -/fix_efield.h /fix_electron_stopping.cpp /fix_electron_stopping.h /fix_electron_stopping_fit.cpp @@ -592,8 +643,6 @@ /fix_eos_cv.h /fix_eos_table.cpp /fix_eos_table.h -/fix_evaporate.cpp -/fix_evaporate.h /fix_ffl.cpp /fix_ffl.h /fix_filter_corotate.cpp @@ -797,8 +846,6 @@ /fix_tgnpt_drude.h /fix_tgnvt_drude.cpp /fix_tgnvt_drude.h -/fix_thermal_conductivity.cpp -/fix_thermal_conductivity.h /fix_ti_rs.cpp /fix_ti_rs.h /fix_ti_spring.cpp diff --git a/src/USER-MISC/pair_lj_sf_dipole_sf.cpp b/src/DIPOLE/pair_lj_sf_dipole_sf.cpp similarity index 100% rename from src/USER-MISC/pair_lj_sf_dipole_sf.cpp rename to src/DIPOLE/pair_lj_sf_dipole_sf.cpp diff --git a/src/USER-MISC/pair_lj_sf_dipole_sf.h b/src/DIPOLE/pair_lj_sf_dipole_sf.h similarity index 100% rename from src/USER-MISC/pair_lj_sf_dipole_sf.h rename to src/DIPOLE/pair_lj_sf_dipole_sf.h diff --git a/src/Depend.sh b/src/Depend.sh index 4700b6f5f0..4bbbeb9a51 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -63,8 +63,11 @@ if (test $1 = "COLLOID") then depend OPENMP fi +if (test $1 = "DIELECTRIC") then + depend OPENMP +fi + if (test $1 = "DIPOLE") then - depend USER-MISC depend OPENMP fi @@ -72,6 +75,16 @@ if (test $1 = "DPD-BASIC") then depend GPU fi +if (test $1 = "EXTRA-MOLECULE") then + depend GPU + depend OPENMP +fi + +if (test $1 = "EXTRA-PAIR") then + depend GPU + depend OPENMP +fi + if (test $1 = "GRANULAR") then depend KOKKOS depend OPENMP @@ -96,14 +109,13 @@ if (test $1 = "MANYBODY") then depend KOKKOS depend OPT depend QEQ - depend USER-MISC depend OPENMP fi if (test $1 = "MOLECULE") then + depend EXTRA-MOLECULE depend GPU depend KOKKOS - depend USER-MISC depend FEP depend OPENMP depend INTEL @@ -146,12 +158,6 @@ if (test $1 = "FEP") then depend OPENMP fi -if (test $1 = "USER-MISC") then - depend GPU - depend OPENMP - depend INTEL -fi - if (test $1 = "REAXFF") then depend KOKKOS depend OPENMP diff --git a/src/USER-MISC/compute_ackland_atom.cpp b/src/EXTRA-COMPUTE/compute_ackland_atom.cpp similarity index 100% rename from src/USER-MISC/compute_ackland_atom.cpp rename to src/EXTRA-COMPUTE/compute_ackland_atom.cpp diff --git a/src/USER-MISC/compute_ackland_atom.h b/src/EXTRA-COMPUTE/compute_ackland_atom.h similarity index 100% rename from src/USER-MISC/compute_ackland_atom.h rename to src/EXTRA-COMPUTE/compute_ackland_atom.h diff --git a/src/compute_adf.cpp b/src/EXTRA-COMPUTE/compute_adf.cpp similarity index 100% rename from src/compute_adf.cpp rename to src/EXTRA-COMPUTE/compute_adf.cpp diff --git a/src/compute_adf.h b/src/EXTRA-COMPUTE/compute_adf.h similarity index 100% rename from src/compute_adf.h rename to src/EXTRA-COMPUTE/compute_adf.h diff --git a/src/compute_aggregate_atom.cpp b/src/EXTRA-COMPUTE/compute_aggregate_atom.cpp similarity index 100% rename from src/compute_aggregate_atom.cpp rename to src/EXTRA-COMPUTE/compute_aggregate_atom.cpp diff --git a/src/compute_aggregate_atom.h b/src/EXTRA-COMPUTE/compute_aggregate_atom.h similarity index 100% rename from src/compute_aggregate_atom.h rename to src/EXTRA-COMPUTE/compute_aggregate_atom.h diff --git a/src/USER-MISC/compute_basal_atom.cpp b/src/EXTRA-COMPUTE/compute_basal_atom.cpp similarity index 100% rename from src/USER-MISC/compute_basal_atom.cpp rename to src/EXTRA-COMPUTE/compute_basal_atom.cpp diff --git a/src/USER-MISC/compute_basal_atom.h b/src/EXTRA-COMPUTE/compute_basal_atom.h similarity index 100% rename from src/USER-MISC/compute_basal_atom.h rename to src/EXTRA-COMPUTE/compute_basal_atom.h diff --git a/src/compute_cluster_atom.cpp b/src/EXTRA-COMPUTE/compute_cluster_atom.cpp similarity index 100% rename from src/compute_cluster_atom.cpp rename to src/EXTRA-COMPUTE/compute_cluster_atom.cpp diff --git a/src/compute_cluster_atom.h b/src/EXTRA-COMPUTE/compute_cluster_atom.h similarity index 100% rename from src/compute_cluster_atom.h rename to src/EXTRA-COMPUTE/compute_cluster_atom.h diff --git a/src/USER-MISC/compute_cnp_atom.cpp b/src/EXTRA-COMPUTE/compute_cnp_atom.cpp similarity index 100% rename from src/USER-MISC/compute_cnp_atom.cpp rename to src/EXTRA-COMPUTE/compute_cnp_atom.cpp diff --git a/src/USER-MISC/compute_cnp_atom.h b/src/EXTRA-COMPUTE/compute_cnp_atom.h similarity index 100% rename from src/USER-MISC/compute_cnp_atom.h rename to src/EXTRA-COMPUTE/compute_cnp_atom.h diff --git a/src/USER-MISC/compute_entropy_atom.cpp b/src/EXTRA-COMPUTE/compute_entropy_atom.cpp similarity index 100% rename from src/USER-MISC/compute_entropy_atom.cpp rename to src/EXTRA-COMPUTE/compute_entropy_atom.cpp diff --git a/src/USER-MISC/compute_entropy_atom.h b/src/EXTRA-COMPUTE/compute_entropy_atom.h similarity index 100% rename from src/USER-MISC/compute_entropy_atom.h rename to src/EXTRA-COMPUTE/compute_entropy_atom.h diff --git a/src/compute_fragment_atom.cpp b/src/EXTRA-COMPUTE/compute_fragment_atom.cpp similarity index 100% rename from src/compute_fragment_atom.cpp rename to src/EXTRA-COMPUTE/compute_fragment_atom.cpp diff --git a/src/compute_fragment_atom.h b/src/EXTRA-COMPUTE/compute_fragment_atom.h similarity index 100% rename from src/compute_fragment_atom.h rename to src/EXTRA-COMPUTE/compute_fragment_atom.h diff --git a/src/USER-MISC/compute_gyration_shape.cpp b/src/EXTRA-COMPUTE/compute_gyration_shape.cpp similarity index 100% rename from src/USER-MISC/compute_gyration_shape.cpp rename to src/EXTRA-COMPUTE/compute_gyration_shape.cpp diff --git a/src/USER-MISC/compute_gyration_shape.h b/src/EXTRA-COMPUTE/compute_gyration_shape.h similarity index 100% rename from src/USER-MISC/compute_gyration_shape.h rename to src/EXTRA-COMPUTE/compute_gyration_shape.h diff --git a/src/USER-MISC/compute_gyration_shape_chunk.cpp b/src/EXTRA-COMPUTE/compute_gyration_shape_chunk.cpp similarity index 100% rename from src/USER-MISC/compute_gyration_shape_chunk.cpp rename to src/EXTRA-COMPUTE/compute_gyration_shape_chunk.cpp diff --git a/src/USER-MISC/compute_gyration_shape_chunk.h b/src/EXTRA-COMPUTE/compute_gyration_shape_chunk.h similarity index 100% rename from src/USER-MISC/compute_gyration_shape_chunk.h rename to src/EXTRA-COMPUTE/compute_gyration_shape_chunk.h diff --git a/src/compute_hexorder_atom.cpp b/src/EXTRA-COMPUTE/compute_hexorder_atom.cpp similarity index 100% rename from src/compute_hexorder_atom.cpp rename to src/EXTRA-COMPUTE/compute_hexorder_atom.cpp diff --git a/src/compute_hexorder_atom.h b/src/EXTRA-COMPUTE/compute_hexorder_atom.h similarity index 100% rename from src/compute_hexorder_atom.h rename to src/EXTRA-COMPUTE/compute_hexorder_atom.h diff --git a/src/USER-MISC/compute_hma.cpp b/src/EXTRA-COMPUTE/compute_hma.cpp similarity index 100% rename from src/USER-MISC/compute_hma.cpp rename to src/EXTRA-COMPUTE/compute_hma.cpp diff --git a/src/USER-MISC/compute_hma.h b/src/EXTRA-COMPUTE/compute_hma.h similarity index 100% rename from src/USER-MISC/compute_hma.h rename to src/EXTRA-COMPUTE/compute_hma.h diff --git a/src/USER-MISC/compute_momentum.cpp b/src/EXTRA-COMPUTE/compute_momentum.cpp similarity index 100% rename from src/USER-MISC/compute_momentum.cpp rename to src/EXTRA-COMPUTE/compute_momentum.cpp diff --git a/src/USER-MISC/compute_momentum.h b/src/EXTRA-COMPUTE/compute_momentum.h similarity index 100% rename from src/USER-MISC/compute_momentum.h rename to src/EXTRA-COMPUTE/compute_momentum.h diff --git a/src/MISC/compute_msd_nongauss.cpp b/src/EXTRA-COMPUTE/compute_msd_nongauss.cpp similarity index 100% rename from src/MISC/compute_msd_nongauss.cpp rename to src/EXTRA-COMPUTE/compute_msd_nongauss.cpp diff --git a/src/MISC/compute_msd_nongauss.h b/src/EXTRA-COMPUTE/compute_msd_nongauss.h similarity index 100% rename from src/MISC/compute_msd_nongauss.h rename to src/EXTRA-COMPUTE/compute_msd_nongauss.h diff --git a/src/compute_orientorder_atom.cpp b/src/EXTRA-COMPUTE/compute_orientorder_atom.cpp similarity index 100% rename from src/compute_orientorder_atom.cpp rename to src/EXTRA-COMPUTE/compute_orientorder_atom.cpp diff --git a/src/compute_orientorder_atom.h b/src/EXTRA-COMPUTE/compute_orientorder_atom.h similarity index 100% rename from src/compute_orientorder_atom.h rename to src/EXTRA-COMPUTE/compute_orientorder_atom.h diff --git a/src/USER-MISC/compute_pressure_cylinder.cpp b/src/EXTRA-COMPUTE/compute_pressure_cylinder.cpp similarity index 100% rename from src/USER-MISC/compute_pressure_cylinder.cpp rename to src/EXTRA-COMPUTE/compute_pressure_cylinder.cpp diff --git a/src/USER-MISC/compute_pressure_cylinder.h b/src/EXTRA-COMPUTE/compute_pressure_cylinder.h similarity index 100% rename from src/USER-MISC/compute_pressure_cylinder.h rename to src/EXTRA-COMPUTE/compute_pressure_cylinder.h diff --git a/src/USER-MISC/compute_stress_mop.cpp b/src/EXTRA-COMPUTE/compute_stress_mop.cpp similarity index 100% rename from src/USER-MISC/compute_stress_mop.cpp rename to src/EXTRA-COMPUTE/compute_stress_mop.cpp diff --git a/src/USER-MISC/compute_stress_mop.h b/src/EXTRA-COMPUTE/compute_stress_mop.h similarity index 100% rename from src/USER-MISC/compute_stress_mop.h rename to src/EXTRA-COMPUTE/compute_stress_mop.h diff --git a/src/USER-MISC/compute_stress_mop_profile.cpp b/src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp similarity index 100% rename from src/USER-MISC/compute_stress_mop_profile.cpp rename to src/EXTRA-COMPUTE/compute_stress_mop_profile.cpp diff --git a/src/USER-MISC/compute_stress_mop_profile.h b/src/EXTRA-COMPUTE/compute_stress_mop_profile.h similarity index 100% rename from src/USER-MISC/compute_stress_mop_profile.h rename to src/EXTRA-COMPUTE/compute_stress_mop_profile.h diff --git a/src/USER-MISC/compute_temp_rotate.cpp b/src/EXTRA-COMPUTE/compute_temp_rotate.cpp similarity index 100% rename from src/USER-MISC/compute_temp_rotate.cpp rename to src/EXTRA-COMPUTE/compute_temp_rotate.cpp diff --git a/src/USER-MISC/compute_temp_rotate.h b/src/EXTRA-COMPUTE/compute_temp_rotate.h similarity index 100% rename from src/USER-MISC/compute_temp_rotate.h rename to src/EXTRA-COMPUTE/compute_temp_rotate.h diff --git a/src/MISC/compute_ti.cpp b/src/EXTRA-COMPUTE/compute_ti.cpp similarity index 100% rename from src/MISC/compute_ti.cpp rename to src/EXTRA-COMPUTE/compute_ti.cpp diff --git a/src/MISC/compute_ti.h b/src/EXTRA-COMPUTE/compute_ti.h similarity index 100% rename from src/MISC/compute_ti.h rename to src/EXTRA-COMPUTE/compute_ti.h diff --git a/src/dump_dcd.cpp b/src/EXTRA-DUMP/dump_dcd.cpp similarity index 100% rename from src/dump_dcd.cpp rename to src/EXTRA-DUMP/dump_dcd.cpp diff --git a/src/dump_dcd.h b/src/EXTRA-DUMP/dump_dcd.h similarity index 100% rename from src/dump_dcd.h rename to src/EXTRA-DUMP/dump_dcd.h diff --git a/src/MISC/dump_xtc.cpp b/src/EXTRA-DUMP/dump_xtc.cpp similarity index 100% rename from src/MISC/dump_xtc.cpp rename to src/EXTRA-DUMP/dump_xtc.cpp diff --git a/src/MISC/dump_xtc.h b/src/EXTRA-DUMP/dump_xtc.h similarity index 100% rename from src/MISC/dump_xtc.h rename to src/EXTRA-DUMP/dump_xtc.h diff --git a/src/MISC/xdr_compat.cpp b/src/EXTRA-DUMP/xdr_compat.cpp similarity index 100% rename from src/MISC/xdr_compat.cpp rename to src/EXTRA-DUMP/xdr_compat.cpp diff --git a/src/MISC/xdr_compat.h b/src/EXTRA-DUMP/xdr_compat.h similarity index 100% rename from src/MISC/xdr_compat.h rename to src/EXTRA-DUMP/xdr_compat.h diff --git a/src/MISC/fix_addtorque.cpp b/src/EXTRA-FIX/fix_addtorque.cpp similarity index 100% rename from src/MISC/fix_addtorque.cpp rename to src/EXTRA-FIX/fix_addtorque.cpp diff --git a/src/MISC/fix_addtorque.h b/src/EXTRA-FIX/fix_addtorque.h similarity index 100% rename from src/MISC/fix_addtorque.h rename to src/EXTRA-FIX/fix_addtorque.h diff --git a/src/USER-MISC/fix_ave_correlate_long.cpp b/src/EXTRA-FIX/fix_ave_correlate_long.cpp similarity index 100% rename from src/USER-MISC/fix_ave_correlate_long.cpp rename to src/EXTRA-FIX/fix_ave_correlate_long.cpp diff --git a/src/USER-MISC/fix_ave_correlate_long.h b/src/EXTRA-FIX/fix_ave_correlate_long.h similarity index 100% rename from src/USER-MISC/fix_ave_correlate_long.h rename to src/EXTRA-FIX/fix_ave_correlate_long.h diff --git a/src/fix_controller.cpp b/src/EXTRA-FIX/fix_controller.cpp similarity index 100% rename from src/fix_controller.cpp rename to src/EXTRA-FIX/fix_controller.cpp diff --git a/src/fix_controller.h b/src/EXTRA-FIX/fix_controller.h similarity index 100% rename from src/fix_controller.h rename to src/EXTRA-FIX/fix_controller.h diff --git a/src/fix_drag.cpp b/src/EXTRA-FIX/fix_drag.cpp similarity index 100% rename from src/fix_drag.cpp rename to src/EXTRA-FIX/fix_drag.cpp diff --git a/src/fix_drag.h b/src/EXTRA-FIX/fix_drag.h similarity index 100% rename from src/fix_drag.h rename to src/EXTRA-FIX/fix_drag.h diff --git a/src/USER-MISC/fix_electron_stopping.cpp b/src/EXTRA-FIX/fix_electron_stopping.cpp similarity index 100% rename from src/USER-MISC/fix_electron_stopping.cpp rename to src/EXTRA-FIX/fix_electron_stopping.cpp diff --git a/src/USER-MISC/fix_electron_stopping.h b/src/EXTRA-FIX/fix_electron_stopping.h similarity index 100% rename from src/USER-MISC/fix_electron_stopping.h rename to src/EXTRA-FIX/fix_electron_stopping.h diff --git a/src/USER-MISC/fix_electron_stopping_fit.cpp b/src/EXTRA-FIX/fix_electron_stopping_fit.cpp similarity index 100% rename from src/USER-MISC/fix_electron_stopping_fit.cpp rename to src/EXTRA-FIX/fix_electron_stopping_fit.cpp diff --git a/src/USER-MISC/fix_electron_stopping_fit.h b/src/EXTRA-FIX/fix_electron_stopping_fit.h similarity index 100% rename from src/USER-MISC/fix_electron_stopping_fit.h rename to src/EXTRA-FIX/fix_electron_stopping_fit.h diff --git a/src/USER-MISC/fix_ffl.cpp b/src/EXTRA-FIX/fix_ffl.cpp similarity index 100% rename from src/USER-MISC/fix_ffl.cpp rename to src/EXTRA-FIX/fix_ffl.cpp diff --git a/src/USER-MISC/fix_ffl.h b/src/EXTRA-FIX/fix_ffl.h similarity index 100% rename from src/USER-MISC/fix_ffl.h rename to src/EXTRA-FIX/fix_ffl.h diff --git a/src/USER-MISC/fix_filter_corotate.cpp b/src/EXTRA-FIX/fix_filter_corotate.cpp similarity index 100% rename from src/USER-MISC/fix_filter_corotate.cpp rename to src/EXTRA-FIX/fix_filter_corotate.cpp diff --git a/src/USER-MISC/fix_filter_corotate.h b/src/EXTRA-FIX/fix_filter_corotate.h similarity index 100% rename from src/USER-MISC/fix_filter_corotate.h rename to src/EXTRA-FIX/fix_filter_corotate.h diff --git a/src/USER-MISC/fix_flow_gauss.cpp b/src/EXTRA-FIX/fix_flow_gauss.cpp similarity index 100% rename from src/USER-MISC/fix_flow_gauss.cpp rename to src/EXTRA-FIX/fix_flow_gauss.cpp diff --git a/src/USER-MISC/fix_flow_gauss.h b/src/EXTRA-FIX/fix_flow_gauss.h similarity index 100% rename from src/USER-MISC/fix_flow_gauss.h rename to src/EXTRA-FIX/fix_flow_gauss.h diff --git a/src/MISC/fix_gld.cpp b/src/EXTRA-FIX/fix_gld.cpp similarity index 100% rename from src/MISC/fix_gld.cpp rename to src/EXTRA-FIX/fix_gld.cpp diff --git a/src/MISC/fix_gld.h b/src/EXTRA-FIX/fix_gld.h similarity index 100% rename from src/MISC/fix_gld.h rename to src/EXTRA-FIX/fix_gld.h diff --git a/src/USER-MISC/fix_gle.cpp b/src/EXTRA-FIX/fix_gle.cpp similarity index 100% rename from src/USER-MISC/fix_gle.cpp rename to src/EXTRA-FIX/fix_gle.cpp diff --git a/src/USER-MISC/fix_gle.h b/src/EXTRA-FIX/fix_gle.h similarity index 100% rename from src/USER-MISC/fix_gle.h rename to src/EXTRA-FIX/fix_gle.h diff --git a/src/USER-MISC/fix_momentum_chunk.cpp b/src/EXTRA-FIX/fix_momentum_chunk.cpp similarity index 100% rename from src/USER-MISC/fix_momentum_chunk.cpp rename to src/EXTRA-FIX/fix_momentum_chunk.cpp diff --git a/src/USER-MISC/fix_momentum_chunk.h b/src/EXTRA-FIX/fix_momentum_chunk.h similarity index 100% rename from src/USER-MISC/fix_momentum_chunk.h rename to src/EXTRA-FIX/fix_momentum_chunk.h diff --git a/src/USER-MISC/fix_npt_cauchy.cpp b/src/EXTRA-FIX/fix_npt_cauchy.cpp similarity index 100% rename from src/USER-MISC/fix_npt_cauchy.cpp rename to src/EXTRA-FIX/fix_npt_cauchy.cpp diff --git a/src/USER-MISC/fix_npt_cauchy.h b/src/EXTRA-FIX/fix_npt_cauchy.h similarity index 100% rename from src/USER-MISC/fix_npt_cauchy.h rename to src/EXTRA-FIX/fix_npt_cauchy.h diff --git a/src/fix_numdiff.cpp b/src/EXTRA-FIX/fix_numdiff.cpp similarity index 100% rename from src/fix_numdiff.cpp rename to src/EXTRA-FIX/fix_numdiff.cpp diff --git a/src/fix_numdiff.h b/src/EXTRA-FIX/fix_numdiff.h similarity index 100% rename from src/fix_numdiff.h rename to src/EXTRA-FIX/fix_numdiff.h diff --git a/src/fix_nve_noforce.cpp b/src/EXTRA-FIX/fix_nve_noforce.cpp similarity index 100% rename from src/fix_nve_noforce.cpp rename to src/EXTRA-FIX/fix_nve_noforce.cpp diff --git a/src/fix_nve_noforce.h b/src/EXTRA-FIX/fix_nve_noforce.h similarity index 100% rename from src/fix_nve_noforce.h rename to src/EXTRA-FIX/fix_nve_noforce.h diff --git a/src/USER-MISC/fix_nvk.cpp b/src/EXTRA-FIX/fix_nvk.cpp similarity index 100% rename from src/USER-MISC/fix_nvk.cpp rename to src/EXTRA-FIX/fix_nvk.cpp diff --git a/src/USER-MISC/fix_nvk.h b/src/EXTRA-FIX/fix_nvk.h similarity index 100% rename from src/USER-MISC/fix_nvk.h rename to src/EXTRA-FIX/fix_nvk.h diff --git a/src/MISC/fix_oneway.cpp b/src/EXTRA-FIX/fix_oneway.cpp similarity index 100% rename from src/MISC/fix_oneway.cpp rename to src/EXTRA-FIX/fix_oneway.cpp diff --git a/src/MISC/fix_oneway.h b/src/EXTRA-FIX/fix_oneway.h similarity index 100% rename from src/MISC/fix_oneway.h rename to src/EXTRA-FIX/fix_oneway.h diff --git a/src/USER-MISC/fix_pafi.cpp b/src/EXTRA-FIX/fix_pafi.cpp similarity index 100% rename from src/USER-MISC/fix_pafi.cpp rename to src/EXTRA-FIX/fix_pafi.cpp diff --git a/src/USER-MISC/fix_pafi.h b/src/EXTRA-FIX/fix_pafi.h similarity index 100% rename from src/USER-MISC/fix_pafi.h rename to src/EXTRA-FIX/fix_pafi.h diff --git a/src/USER-MISC/fix_pimd.cpp b/src/EXTRA-FIX/fix_pimd.cpp similarity index 100% rename from src/USER-MISC/fix_pimd.cpp rename to src/EXTRA-FIX/fix_pimd.cpp diff --git a/src/USER-MISC/fix_pimd.h b/src/EXTRA-FIX/fix_pimd.h similarity index 100% rename from src/USER-MISC/fix_pimd.h rename to src/EXTRA-FIX/fix_pimd.h diff --git a/src/USER-MISC/fix_rhok.cpp b/src/EXTRA-FIX/fix_rhok.cpp similarity index 100% rename from src/USER-MISC/fix_rhok.cpp rename to src/EXTRA-FIX/fix_rhok.cpp diff --git a/src/USER-MISC/fix_rhok.h b/src/EXTRA-FIX/fix_rhok.h similarity index 100% rename from src/USER-MISC/fix_rhok.h rename to src/EXTRA-FIX/fix_rhok.h diff --git a/src/MISC/fix_smd.cpp b/src/EXTRA-FIX/fix_smd.cpp similarity index 100% rename from src/MISC/fix_smd.cpp rename to src/EXTRA-FIX/fix_smd.cpp diff --git a/src/MISC/fix_smd.h b/src/EXTRA-FIX/fix_smd.h similarity index 100% rename from src/MISC/fix_smd.h rename to src/EXTRA-FIX/fix_smd.h diff --git a/src/fix_spring_rg.cpp b/src/EXTRA-FIX/fix_spring_rg.cpp similarity index 100% rename from src/fix_spring_rg.cpp rename to src/EXTRA-FIX/fix_spring_rg.cpp diff --git a/src/fix_spring_rg.h b/src/EXTRA-FIX/fix_spring_rg.h similarity index 100% rename from src/fix_spring_rg.h rename to src/EXTRA-FIX/fix_spring_rg.h diff --git a/src/fix_temp_csld.cpp b/src/EXTRA-FIX/fix_temp_csld.cpp similarity index 100% rename from src/fix_temp_csld.cpp rename to src/EXTRA-FIX/fix_temp_csld.cpp diff --git a/src/fix_temp_csld.h b/src/EXTRA-FIX/fix_temp_csld.h similarity index 100% rename from src/fix_temp_csld.h rename to src/EXTRA-FIX/fix_temp_csld.h diff --git a/src/fix_temp_csvr.cpp b/src/EXTRA-FIX/fix_temp_csvr.cpp similarity index 100% rename from src/fix_temp_csvr.cpp rename to src/EXTRA-FIX/fix_temp_csvr.cpp diff --git a/src/fix_temp_csvr.h b/src/EXTRA-FIX/fix_temp_csvr.h similarity index 100% rename from src/fix_temp_csvr.h rename to src/EXTRA-FIX/fix_temp_csvr.h diff --git a/src/USER-MISC/fix_ti_spring.cpp b/src/EXTRA-FIX/fix_ti_spring.cpp similarity index 100% rename from src/USER-MISC/fix_ti_spring.cpp rename to src/EXTRA-FIX/fix_ti_spring.cpp diff --git a/src/USER-MISC/fix_ti_spring.h b/src/EXTRA-FIX/fix_ti_spring.h similarity index 100% rename from src/USER-MISC/fix_ti_spring.h rename to src/EXTRA-FIX/fix_ti_spring.h diff --git a/src/fix_tmd.cpp b/src/EXTRA-FIX/fix_tmd.cpp similarity index 100% rename from src/fix_tmd.cpp rename to src/EXTRA-FIX/fix_tmd.cpp diff --git a/src/fix_tmd.h b/src/EXTRA-FIX/fix_tmd.h similarity index 100% rename from src/fix_tmd.h rename to src/EXTRA-FIX/fix_tmd.h diff --git a/src/MISC/fix_ttm.cpp b/src/EXTRA-FIX/fix_ttm.cpp similarity index 100% rename from src/MISC/fix_ttm.cpp rename to src/EXTRA-FIX/fix_ttm.cpp diff --git a/src/MISC/fix_ttm.h b/src/EXTRA-FIX/fix_ttm.h similarity index 100% rename from src/MISC/fix_ttm.h rename to src/EXTRA-FIX/fix_ttm.h diff --git a/src/USER-MISC/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp similarity index 100% rename from src/USER-MISC/fix_ttm_mod.cpp rename to src/EXTRA-FIX/fix_ttm_mod.cpp diff --git a/src/USER-MISC/fix_ttm_mod.h b/src/EXTRA-FIX/fix_ttm_mod.h similarity index 100% rename from src/USER-MISC/fix_ttm_mod.h rename to src/EXTRA-FIX/fix_ttm_mod.h diff --git a/src/MISC/fix_viscosity.cpp b/src/EXTRA-FIX/fix_viscosity.cpp similarity index 100% rename from src/MISC/fix_viscosity.cpp rename to src/EXTRA-FIX/fix_viscosity.cpp diff --git a/src/MISC/fix_viscosity.h b/src/EXTRA-FIX/fix_viscosity.h similarity index 100% rename from src/MISC/fix_viscosity.h rename to src/EXTRA-FIX/fix_viscosity.h diff --git a/src/USER-MISC/fix_wall_ees.cpp b/src/EXTRA-FIX/fix_wall_ees.cpp similarity index 100% rename from src/USER-MISC/fix_wall_ees.cpp rename to src/EXTRA-FIX/fix_wall_ees.cpp diff --git a/src/USER-MISC/fix_wall_ees.h b/src/EXTRA-FIX/fix_wall_ees.h similarity index 100% rename from src/USER-MISC/fix_wall_ees.h rename to src/EXTRA-FIX/fix_wall_ees.h diff --git a/src/USER-MISC/fix_wall_reflect_stochastic.cpp b/src/EXTRA-FIX/fix_wall_reflect_stochastic.cpp similarity index 100% rename from src/USER-MISC/fix_wall_reflect_stochastic.cpp rename to src/EXTRA-FIX/fix_wall_reflect_stochastic.cpp diff --git a/src/USER-MISC/fix_wall_reflect_stochastic.h b/src/EXTRA-FIX/fix_wall_reflect_stochastic.h similarity index 100% rename from src/USER-MISC/fix_wall_reflect_stochastic.h rename to src/EXTRA-FIX/fix_wall_reflect_stochastic.h diff --git a/src/USER-MISC/fix_wall_region_ees.cpp b/src/EXTRA-FIX/fix_wall_region_ees.cpp similarity index 100% rename from src/USER-MISC/fix_wall_region_ees.cpp rename to src/EXTRA-FIX/fix_wall_region_ees.cpp diff --git a/src/USER-MISC/fix_wall_region_ees.h b/src/EXTRA-FIX/fix_wall_region_ees.h similarity index 100% rename from src/USER-MISC/fix_wall_region_ees.h rename to src/EXTRA-FIX/fix_wall_region_ees.h diff --git a/src/MOLECULE/angle_cosine_delta.cpp b/src/EXTRA-MOLECULE/angle_cosine_delta.cpp similarity index 100% rename from src/MOLECULE/angle_cosine_delta.cpp rename to src/EXTRA-MOLECULE/angle_cosine_delta.cpp diff --git a/src/MOLECULE/angle_cosine_delta.h b/src/EXTRA-MOLECULE/angle_cosine_delta.h similarity index 100% rename from src/MOLECULE/angle_cosine_delta.h rename to src/EXTRA-MOLECULE/angle_cosine_delta.h diff --git a/src/MOLECULE/angle_cosine_periodic.cpp b/src/EXTRA-MOLECULE/angle_cosine_periodic.cpp similarity index 100% rename from src/MOLECULE/angle_cosine_periodic.cpp rename to src/EXTRA-MOLECULE/angle_cosine_periodic.cpp diff --git a/src/MOLECULE/angle_cosine_periodic.h b/src/EXTRA-MOLECULE/angle_cosine_periodic.h similarity index 100% rename from src/MOLECULE/angle_cosine_periodic.h rename to src/EXTRA-MOLECULE/angle_cosine_periodic.h diff --git a/src/MOLECULE/angle_cosine_shift.cpp b/src/EXTRA-MOLECULE/angle_cosine_shift.cpp similarity index 100% rename from src/MOLECULE/angle_cosine_shift.cpp rename to src/EXTRA-MOLECULE/angle_cosine_shift.cpp diff --git a/src/MOLECULE/angle_cosine_shift.h b/src/EXTRA-MOLECULE/angle_cosine_shift.h similarity index 100% rename from src/MOLECULE/angle_cosine_shift.h rename to src/EXTRA-MOLECULE/angle_cosine_shift.h diff --git a/src/MOLECULE/angle_cosine_shift_exp.cpp b/src/EXTRA-MOLECULE/angle_cosine_shift_exp.cpp similarity index 100% rename from src/MOLECULE/angle_cosine_shift_exp.cpp rename to src/EXTRA-MOLECULE/angle_cosine_shift_exp.cpp diff --git a/src/MOLECULE/angle_cosine_shift_exp.h b/src/EXTRA-MOLECULE/angle_cosine_shift_exp.h similarity index 100% rename from src/MOLECULE/angle_cosine_shift_exp.h rename to src/EXTRA-MOLECULE/angle_cosine_shift_exp.h diff --git a/src/MOLECULE/angle_fourier.cpp b/src/EXTRA-MOLECULE/angle_fourier.cpp similarity index 100% rename from src/MOLECULE/angle_fourier.cpp rename to src/EXTRA-MOLECULE/angle_fourier.cpp diff --git a/src/MOLECULE/angle_fourier.h b/src/EXTRA-MOLECULE/angle_fourier.h similarity index 100% rename from src/MOLECULE/angle_fourier.h rename to src/EXTRA-MOLECULE/angle_fourier.h diff --git a/src/MOLECULE/angle_fourier_simple.cpp b/src/EXTRA-MOLECULE/angle_fourier_simple.cpp similarity index 100% rename from src/MOLECULE/angle_fourier_simple.cpp rename to src/EXTRA-MOLECULE/angle_fourier_simple.cpp diff --git a/src/MOLECULE/angle_fourier_simple.h b/src/EXTRA-MOLECULE/angle_fourier_simple.h similarity index 100% rename from src/MOLECULE/angle_fourier_simple.h rename to src/EXTRA-MOLECULE/angle_fourier_simple.h diff --git a/src/MOLECULE/angle_gaussian.cpp b/src/EXTRA-MOLECULE/angle_gaussian.cpp similarity index 100% rename from src/MOLECULE/angle_gaussian.cpp rename to src/EXTRA-MOLECULE/angle_gaussian.cpp diff --git a/src/MOLECULE/angle_gaussian.h b/src/EXTRA-MOLECULE/angle_gaussian.h similarity index 100% rename from src/MOLECULE/angle_gaussian.h rename to src/EXTRA-MOLECULE/angle_gaussian.h diff --git a/src/MOLECULE/angle_quartic.cpp b/src/EXTRA-MOLECULE/angle_quartic.cpp similarity index 100% rename from src/MOLECULE/angle_quartic.cpp rename to src/EXTRA-MOLECULE/angle_quartic.cpp diff --git a/src/MOLECULE/angle_quartic.h b/src/EXTRA-MOLECULE/angle_quartic.h similarity index 100% rename from src/MOLECULE/angle_quartic.h rename to src/EXTRA-MOLECULE/angle_quartic.h diff --git a/src/MOLECULE/bond_gaussian.cpp b/src/EXTRA-MOLECULE/bond_gaussian.cpp similarity index 100% rename from src/MOLECULE/bond_gaussian.cpp rename to src/EXTRA-MOLECULE/bond_gaussian.cpp diff --git a/src/MOLECULE/bond_gaussian.h b/src/EXTRA-MOLECULE/bond_gaussian.h similarity index 100% rename from src/MOLECULE/bond_gaussian.h rename to src/EXTRA-MOLECULE/bond_gaussian.h diff --git a/src/MOLECULE/bond_harmonic_shift.cpp b/src/EXTRA-MOLECULE/bond_harmonic_shift.cpp similarity index 100% rename from src/MOLECULE/bond_harmonic_shift.cpp rename to src/EXTRA-MOLECULE/bond_harmonic_shift.cpp diff --git a/src/MOLECULE/bond_harmonic_shift.h b/src/EXTRA-MOLECULE/bond_harmonic_shift.h similarity index 100% rename from src/MOLECULE/bond_harmonic_shift.h rename to src/EXTRA-MOLECULE/bond_harmonic_shift.h diff --git a/src/MOLECULE/bond_harmonic_shift_cut.cpp b/src/EXTRA-MOLECULE/bond_harmonic_shift_cut.cpp similarity index 100% rename from src/MOLECULE/bond_harmonic_shift_cut.cpp rename to src/EXTRA-MOLECULE/bond_harmonic_shift_cut.cpp diff --git a/src/MOLECULE/bond_harmonic_shift_cut.h b/src/EXTRA-MOLECULE/bond_harmonic_shift_cut.h similarity index 100% rename from src/MOLECULE/bond_harmonic_shift_cut.h rename to src/EXTRA-MOLECULE/bond_harmonic_shift_cut.h diff --git a/src/MOLECULE/bond_nonlinear.cpp b/src/EXTRA-MOLECULE/bond_nonlinear.cpp similarity index 100% rename from src/MOLECULE/bond_nonlinear.cpp rename to src/EXTRA-MOLECULE/bond_nonlinear.cpp diff --git a/src/MOLECULE/bond_nonlinear.h b/src/EXTRA-MOLECULE/bond_nonlinear.h similarity index 100% rename from src/MOLECULE/bond_nonlinear.h rename to src/EXTRA-MOLECULE/bond_nonlinear.h diff --git a/src/MOLECULE/dihedral_cosine_shift_exp.cpp b/src/EXTRA-MOLECULE/dihedral_cosine_shift_exp.cpp similarity index 100% rename from src/MOLECULE/dihedral_cosine_shift_exp.cpp rename to src/EXTRA-MOLECULE/dihedral_cosine_shift_exp.cpp diff --git a/src/MOLECULE/dihedral_cosine_shift_exp.h b/src/EXTRA-MOLECULE/dihedral_cosine_shift_exp.h similarity index 100% rename from src/MOLECULE/dihedral_cosine_shift_exp.h rename to src/EXTRA-MOLECULE/dihedral_cosine_shift_exp.h diff --git a/src/MOLECULE/dihedral_fourier.cpp b/src/EXTRA-MOLECULE/dihedral_fourier.cpp similarity index 100% rename from src/MOLECULE/dihedral_fourier.cpp rename to src/EXTRA-MOLECULE/dihedral_fourier.cpp diff --git a/src/MOLECULE/dihedral_fourier.h b/src/EXTRA-MOLECULE/dihedral_fourier.h similarity index 100% rename from src/MOLECULE/dihedral_fourier.h rename to src/EXTRA-MOLECULE/dihedral_fourier.h diff --git a/src/MOLECULE/dihedral_helix.cpp b/src/EXTRA-MOLECULE/dihedral_helix.cpp similarity index 100% rename from src/MOLECULE/dihedral_helix.cpp rename to src/EXTRA-MOLECULE/dihedral_helix.cpp diff --git a/src/MOLECULE/dihedral_helix.h b/src/EXTRA-MOLECULE/dihedral_helix.h similarity index 100% rename from src/MOLECULE/dihedral_helix.h rename to src/EXTRA-MOLECULE/dihedral_helix.h diff --git a/src/MOLECULE/dihedral_nharmonic.cpp b/src/EXTRA-MOLECULE/dihedral_nharmonic.cpp similarity index 100% rename from src/MOLECULE/dihedral_nharmonic.cpp rename to src/EXTRA-MOLECULE/dihedral_nharmonic.cpp diff --git a/src/MOLECULE/dihedral_nharmonic.h b/src/EXTRA-MOLECULE/dihedral_nharmonic.h similarity index 100% rename from src/MOLECULE/dihedral_nharmonic.h rename to src/EXTRA-MOLECULE/dihedral_nharmonic.h diff --git a/src/MOLECULE/dihedral_quadratic.cpp b/src/EXTRA-MOLECULE/dihedral_quadratic.cpp similarity index 100% rename from src/MOLECULE/dihedral_quadratic.cpp rename to src/EXTRA-MOLECULE/dihedral_quadratic.cpp diff --git a/src/MOLECULE/dihedral_quadratic.h b/src/EXTRA-MOLECULE/dihedral_quadratic.h similarity index 100% rename from src/MOLECULE/dihedral_quadratic.h rename to src/EXTRA-MOLECULE/dihedral_quadratic.h diff --git a/src/MOLECULE/dihedral_spherical.cpp b/src/EXTRA-MOLECULE/dihedral_spherical.cpp similarity index 100% rename from src/MOLECULE/dihedral_spherical.cpp rename to src/EXTRA-MOLECULE/dihedral_spherical.cpp diff --git a/src/MOLECULE/dihedral_spherical.h b/src/EXTRA-MOLECULE/dihedral_spherical.h similarity index 100% rename from src/MOLECULE/dihedral_spherical.h rename to src/EXTRA-MOLECULE/dihedral_spherical.h diff --git a/src/MOLECULE/dihedral_table_cut.cpp b/src/EXTRA-MOLECULE/dihedral_table_cut.cpp similarity index 100% rename from src/MOLECULE/dihedral_table_cut.cpp rename to src/EXTRA-MOLECULE/dihedral_table_cut.cpp diff --git a/src/MOLECULE/dihedral_table_cut.h b/src/EXTRA-MOLECULE/dihedral_table_cut.h similarity index 100% rename from src/MOLECULE/dihedral_table_cut.h rename to src/EXTRA-MOLECULE/dihedral_table_cut.h diff --git a/src/MOLECULE/improper_cossq.cpp b/src/EXTRA-MOLECULE/improper_cossq.cpp similarity index 100% rename from src/MOLECULE/improper_cossq.cpp rename to src/EXTRA-MOLECULE/improper_cossq.cpp diff --git a/src/MOLECULE/improper_cossq.h b/src/EXTRA-MOLECULE/improper_cossq.h similarity index 100% rename from src/MOLECULE/improper_cossq.h rename to src/EXTRA-MOLECULE/improper_cossq.h diff --git a/src/MOLECULE/improper_distance.cpp b/src/EXTRA-MOLECULE/improper_distance.cpp similarity index 100% rename from src/MOLECULE/improper_distance.cpp rename to src/EXTRA-MOLECULE/improper_distance.cpp diff --git a/src/MOLECULE/improper_distance.h b/src/EXTRA-MOLECULE/improper_distance.h similarity index 100% rename from src/MOLECULE/improper_distance.h rename to src/EXTRA-MOLECULE/improper_distance.h diff --git a/src/MOLECULE/improper_fourier.cpp b/src/EXTRA-MOLECULE/improper_fourier.cpp similarity index 100% rename from src/MOLECULE/improper_fourier.cpp rename to src/EXTRA-MOLECULE/improper_fourier.cpp diff --git a/src/MOLECULE/improper_fourier.h b/src/EXTRA-MOLECULE/improper_fourier.h similarity index 100% rename from src/MOLECULE/improper_fourier.h rename to src/EXTRA-MOLECULE/improper_fourier.h diff --git a/src/MOLECULE/improper_ring.cpp b/src/EXTRA-MOLECULE/improper_ring.cpp similarity index 100% rename from src/MOLECULE/improper_ring.cpp rename to src/EXTRA-MOLECULE/improper_ring.cpp diff --git a/src/MOLECULE/improper_ring.h b/src/EXTRA-MOLECULE/improper_ring.h similarity index 100% rename from src/MOLECULE/improper_ring.h rename to src/EXTRA-MOLECULE/improper_ring.h diff --git a/src/pair_born_coul_dsf.cpp b/src/EXTRA-PAIR/pair_born_coul_dsf.cpp similarity index 100% rename from src/pair_born_coul_dsf.cpp rename to src/EXTRA-PAIR/pair_born_coul_dsf.cpp diff --git a/src/pair_born_coul_dsf.h b/src/EXTRA-PAIR/pair_born_coul_dsf.h similarity index 100% rename from src/pair_born_coul_dsf.h rename to src/EXTRA-PAIR/pair_born_coul_dsf.h diff --git a/src/pair_born_coul_wolf.cpp b/src/EXTRA-PAIR/pair_born_coul_wolf.cpp similarity index 100% rename from src/pair_born_coul_wolf.cpp rename to src/EXTRA-PAIR/pair_born_coul_wolf.cpp diff --git a/src/pair_born_coul_wolf.h b/src/EXTRA-PAIR/pair_born_coul_wolf.h similarity index 100% rename from src/pair_born_coul_wolf.h rename to src/EXTRA-PAIR/pair_born_coul_wolf.h diff --git a/src/USER-MISC/pair_buck_mdf.cpp b/src/EXTRA-PAIR/pair_buck_mdf.cpp similarity index 100% rename from src/USER-MISC/pair_buck_mdf.cpp rename to src/EXTRA-PAIR/pair_buck_mdf.cpp diff --git a/src/USER-MISC/pair_buck_mdf.h b/src/EXTRA-PAIR/pair_buck_mdf.h similarity index 100% rename from src/USER-MISC/pair_buck_mdf.h rename to src/EXTRA-PAIR/pair_buck_mdf.h diff --git a/src/USER-MISC/pair_cosine_squared.cpp b/src/EXTRA-PAIR/pair_cosine_squared.cpp similarity index 100% rename from src/USER-MISC/pair_cosine_squared.cpp rename to src/EXTRA-PAIR/pair_cosine_squared.cpp diff --git a/src/USER-MISC/pair_cosine_squared.h b/src/EXTRA-PAIR/pair_cosine_squared.h similarity index 100% rename from src/USER-MISC/pair_cosine_squared.h rename to src/EXTRA-PAIR/pair_cosine_squared.h diff --git a/src/pair_coul_cut_global.cpp b/src/EXTRA-PAIR/pair_coul_cut_global.cpp similarity index 100% rename from src/pair_coul_cut_global.cpp rename to src/EXTRA-PAIR/pair_coul_cut_global.cpp diff --git a/src/pair_coul_cut_global.h b/src/EXTRA-PAIR/pair_coul_cut_global.h similarity index 100% rename from src/pair_coul_cut_global.h rename to src/EXTRA-PAIR/pair_coul_cut_global.h diff --git a/src/USER-MISC/pair_coul_diel.cpp b/src/EXTRA-PAIR/pair_coul_diel.cpp similarity index 100% rename from src/USER-MISC/pair_coul_diel.cpp rename to src/EXTRA-PAIR/pair_coul_diel.cpp diff --git a/src/USER-MISC/pair_coul_diel.h b/src/EXTRA-PAIR/pair_coul_diel.h similarity index 100% rename from src/USER-MISC/pair_coul_diel.h rename to src/EXTRA-PAIR/pair_coul_diel.h diff --git a/src/USER-MISC/pair_coul_slater_cut.cpp b/src/EXTRA-PAIR/pair_coul_slater_cut.cpp similarity index 100% rename from src/USER-MISC/pair_coul_slater_cut.cpp rename to src/EXTRA-PAIR/pair_coul_slater_cut.cpp diff --git a/src/USER-MISC/pair_coul_slater_cut.h b/src/EXTRA-PAIR/pair_coul_slater_cut.h similarity index 100% rename from src/USER-MISC/pair_coul_slater_cut.h rename to src/EXTRA-PAIR/pair_coul_slater_cut.h diff --git a/src/USER-MISC/pair_coul_slater_long.cpp b/src/EXTRA-PAIR/pair_coul_slater_long.cpp similarity index 100% rename from src/USER-MISC/pair_coul_slater_long.cpp rename to src/EXTRA-PAIR/pair_coul_slater_long.cpp diff --git a/src/USER-MISC/pair_coul_slater_long.h b/src/EXTRA-PAIR/pair_coul_slater_long.h similarity index 100% rename from src/USER-MISC/pair_coul_slater_long.h rename to src/EXTRA-PAIR/pair_coul_slater_long.h diff --git a/src/pair_coul_streitz.cpp b/src/EXTRA-PAIR/pair_coul_streitz.cpp similarity index 100% rename from src/pair_coul_streitz.cpp rename to src/EXTRA-PAIR/pair_coul_streitz.cpp diff --git a/src/pair_coul_streitz.h b/src/EXTRA-PAIR/pair_coul_streitz.h similarity index 100% rename from src/pair_coul_streitz.h rename to src/EXTRA-PAIR/pair_coul_streitz.h diff --git a/src/USER-MISC/pair_e3b.cpp b/src/EXTRA-PAIR/pair_e3b.cpp similarity index 100% rename from src/USER-MISC/pair_e3b.cpp rename to src/EXTRA-PAIR/pair_e3b.cpp diff --git a/src/USER-MISC/pair_e3b.h b/src/EXTRA-PAIR/pair_e3b.h similarity index 100% rename from src/USER-MISC/pair_e3b.h rename to src/EXTRA-PAIR/pair_e3b.h diff --git a/src/pair_gauss.cpp b/src/EXTRA-PAIR/pair_gauss.cpp similarity index 100% rename from src/pair_gauss.cpp rename to src/EXTRA-PAIR/pair_gauss.cpp diff --git a/src/pair_gauss.h b/src/EXTRA-PAIR/pair_gauss.h similarity index 100% rename from src/pair_gauss.h rename to src/EXTRA-PAIR/pair_gauss.h diff --git a/src/USER-MISC/pair_gauss_cut.cpp b/src/EXTRA-PAIR/pair_gauss_cut.cpp similarity index 100% rename from src/USER-MISC/pair_gauss_cut.cpp rename to src/EXTRA-PAIR/pair_gauss_cut.cpp diff --git a/src/USER-MISC/pair_gauss_cut.h b/src/EXTRA-PAIR/pair_gauss_cut.h similarity index 100% rename from src/USER-MISC/pair_gauss_cut.h rename to src/EXTRA-PAIR/pair_gauss_cut.h diff --git a/src/USER-MISC/pair_lennard_mdf.cpp b/src/EXTRA-PAIR/pair_lennard_mdf.cpp similarity index 100% rename from src/USER-MISC/pair_lennard_mdf.cpp rename to src/EXTRA-PAIR/pair_lennard_mdf.cpp diff --git a/src/USER-MISC/pair_lennard_mdf.h b/src/EXTRA-PAIR/pair_lennard_mdf.h similarity index 100% rename from src/USER-MISC/pair_lennard_mdf.h rename to src/EXTRA-PAIR/pair_lennard_mdf.h diff --git a/src/pair_lj96_cut.cpp b/src/EXTRA-PAIR/pair_lj96_cut.cpp similarity index 100% rename from src/pair_lj96_cut.cpp rename to src/EXTRA-PAIR/pair_lj96_cut.cpp diff --git a/src/pair_lj96_cut.h b/src/EXTRA-PAIR/pair_lj96_cut.h similarity index 100% rename from src/pair_lj96_cut.h rename to src/EXTRA-PAIR/pair_lj96_cut.h diff --git a/src/pair_lj_cubic.cpp b/src/EXTRA-PAIR/pair_lj_cubic.cpp similarity index 100% rename from src/pair_lj_cubic.cpp rename to src/EXTRA-PAIR/pair_lj_cubic.cpp diff --git a/src/pair_lj_cubic.h b/src/EXTRA-PAIR/pair_lj_cubic.h similarity index 100% rename from src/pair_lj_cubic.h rename to src/EXTRA-PAIR/pair_lj_cubic.h diff --git a/src/pair_lj_cubic_const.h b/src/EXTRA-PAIR/pair_lj_cubic_const.h similarity index 100% rename from src/pair_lj_cubic_const.h rename to src/EXTRA-PAIR/pair_lj_cubic_const.h diff --git a/src/pair_lj_cut_coul_debye.cpp b/src/EXTRA-PAIR/pair_lj_cut_coul_debye.cpp similarity index 100% rename from src/pair_lj_cut_coul_debye.cpp rename to src/EXTRA-PAIR/pair_lj_cut_coul_debye.cpp diff --git a/src/pair_lj_cut_coul_debye.h b/src/EXTRA-PAIR/pair_lj_cut_coul_debye.h similarity index 100% rename from src/pair_lj_cut_coul_debye.h rename to src/EXTRA-PAIR/pair_lj_cut_coul_debye.h diff --git a/src/pair_lj_cut_coul_dsf.cpp b/src/EXTRA-PAIR/pair_lj_cut_coul_dsf.cpp similarity index 100% rename from src/pair_lj_cut_coul_dsf.cpp rename to src/EXTRA-PAIR/pair_lj_cut_coul_dsf.cpp diff --git a/src/pair_lj_cut_coul_dsf.h b/src/EXTRA-PAIR/pair_lj_cut_coul_dsf.h similarity index 100% rename from src/pair_lj_cut_coul_dsf.h rename to src/EXTRA-PAIR/pair_lj_cut_coul_dsf.h diff --git a/src/pair_lj_cut_coul_wolf.cpp b/src/EXTRA-PAIR/pair_lj_cut_coul_wolf.cpp similarity index 100% rename from src/pair_lj_cut_coul_wolf.cpp rename to src/EXTRA-PAIR/pair_lj_cut_coul_wolf.cpp diff --git a/src/pair_lj_cut_coul_wolf.h b/src/EXTRA-PAIR/pair_lj_cut_coul_wolf.h similarity index 100% rename from src/pair_lj_cut_coul_wolf.h rename to src/EXTRA-PAIR/pair_lj_cut_coul_wolf.h diff --git a/src/USER-MISC/pair_lj_expand_coul_long.cpp b/src/EXTRA-PAIR/pair_lj_expand_coul_long.cpp similarity index 100% rename from src/USER-MISC/pair_lj_expand_coul_long.cpp rename to src/EXTRA-PAIR/pair_lj_expand_coul_long.cpp diff --git a/src/USER-MISC/pair_lj_expand_coul_long.h b/src/EXTRA-PAIR/pair_lj_expand_coul_long.h similarity index 100% rename from src/USER-MISC/pair_lj_expand_coul_long.h rename to src/EXTRA-PAIR/pair_lj_expand_coul_long.h diff --git a/src/pair_lj_gromacs.cpp b/src/EXTRA-PAIR/pair_lj_gromacs.cpp similarity index 100% rename from src/pair_lj_gromacs.cpp rename to src/EXTRA-PAIR/pair_lj_gromacs.cpp diff --git a/src/pair_lj_gromacs.h b/src/EXTRA-PAIR/pair_lj_gromacs.h similarity index 100% rename from src/pair_lj_gromacs.h rename to src/EXTRA-PAIR/pair_lj_gromacs.h diff --git a/src/pair_lj_gromacs_coul_gromacs.cpp b/src/EXTRA-PAIR/pair_lj_gromacs_coul_gromacs.cpp similarity index 100% rename from src/pair_lj_gromacs_coul_gromacs.cpp rename to src/EXTRA-PAIR/pair_lj_gromacs_coul_gromacs.cpp diff --git a/src/pair_lj_gromacs_coul_gromacs.h b/src/EXTRA-PAIR/pair_lj_gromacs_coul_gromacs.h similarity index 100% rename from src/pair_lj_gromacs_coul_gromacs.h rename to src/EXTRA-PAIR/pair_lj_gromacs_coul_gromacs.h diff --git a/src/USER-MISC/pair_lj_mdf.cpp b/src/EXTRA-PAIR/pair_lj_mdf.cpp similarity index 100% rename from src/USER-MISC/pair_lj_mdf.cpp rename to src/EXTRA-PAIR/pair_lj_mdf.cpp diff --git a/src/USER-MISC/pair_lj_mdf.h b/src/EXTRA-PAIR/pair_lj_mdf.h similarity index 100% rename from src/USER-MISC/pair_lj_mdf.h rename to src/EXTRA-PAIR/pair_lj_mdf.h diff --git a/src/pair_lj_relres.cpp b/src/EXTRA-PAIR/pair_lj_relres.cpp similarity index 100% rename from src/pair_lj_relres.cpp rename to src/EXTRA-PAIR/pair_lj_relres.cpp diff --git a/src/pair_lj_relres.h b/src/EXTRA-PAIR/pair_lj_relres.h similarity index 100% rename from src/pair_lj_relres.h rename to src/EXTRA-PAIR/pair_lj_relres.h diff --git a/src/pair_lj_smooth.cpp b/src/EXTRA-PAIR/pair_lj_smooth.cpp similarity index 100% rename from src/pair_lj_smooth.cpp rename to src/EXTRA-PAIR/pair_lj_smooth.cpp diff --git a/src/pair_lj_smooth.h b/src/EXTRA-PAIR/pair_lj_smooth.h similarity index 100% rename from src/pair_lj_smooth.h rename to src/EXTRA-PAIR/pair_lj_smooth.h diff --git a/src/pair_lj_smooth_linear.cpp b/src/EXTRA-PAIR/pair_lj_smooth_linear.cpp similarity index 100% rename from src/pair_lj_smooth_linear.cpp rename to src/EXTRA-PAIR/pair_lj_smooth_linear.cpp diff --git a/src/pair_lj_smooth_linear.h b/src/EXTRA-PAIR/pair_lj_smooth_linear.h similarity index 100% rename from src/pair_lj_smooth_linear.h rename to src/EXTRA-PAIR/pair_lj_smooth_linear.h diff --git a/src/pair_mie_cut.cpp b/src/EXTRA-PAIR/pair_mie_cut.cpp similarity index 100% rename from src/pair_mie_cut.cpp rename to src/EXTRA-PAIR/pair_mie_cut.cpp diff --git a/src/pair_mie_cut.h b/src/EXTRA-PAIR/pair_mie_cut.h similarity index 100% rename from src/pair_mie_cut.h rename to src/EXTRA-PAIR/pair_mie_cut.h diff --git a/src/USER-MISC/pair_momb.cpp b/src/EXTRA-PAIR/pair_momb.cpp similarity index 100% rename from src/USER-MISC/pair_momb.cpp rename to src/EXTRA-PAIR/pair_momb.cpp diff --git a/src/USER-MISC/pair_momb.h b/src/EXTRA-PAIR/pair_momb.h similarity index 100% rename from src/USER-MISC/pair_momb.h rename to src/EXTRA-PAIR/pair_momb.h diff --git a/src/USER-MISC/pair_morse_smooth_linear.cpp b/src/EXTRA-PAIR/pair_morse_smooth_linear.cpp similarity index 100% rename from src/USER-MISC/pair_morse_smooth_linear.cpp rename to src/EXTRA-PAIR/pair_morse_smooth_linear.cpp diff --git a/src/USER-MISC/pair_morse_smooth_linear.h b/src/EXTRA-PAIR/pair_morse_smooth_linear.h similarity index 100% rename from src/USER-MISC/pair_morse_smooth_linear.h rename to src/EXTRA-PAIR/pair_morse_smooth_linear.h diff --git a/src/MISC/pair_nm_cut.cpp b/src/EXTRA-PAIR/pair_nm_cut.cpp similarity index 100% rename from src/MISC/pair_nm_cut.cpp rename to src/EXTRA-PAIR/pair_nm_cut.cpp diff --git a/src/MISC/pair_nm_cut.h b/src/EXTRA-PAIR/pair_nm_cut.h similarity index 100% rename from src/MISC/pair_nm_cut.h rename to src/EXTRA-PAIR/pair_nm_cut.h diff --git a/src/MISC/pair_nm_cut_coul_cut.cpp b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp similarity index 100% rename from src/MISC/pair_nm_cut_coul_cut.cpp rename to src/EXTRA-PAIR/pair_nm_cut_coul_cut.cpp diff --git a/src/MISC/pair_nm_cut_coul_cut.h b/src/EXTRA-PAIR/pair_nm_cut_coul_cut.h similarity index 100% rename from src/MISC/pair_nm_cut_coul_cut.h rename to src/EXTRA-PAIR/pair_nm_cut_coul_cut.h diff --git a/src/MISC/pair_nm_cut_coul_long.cpp b/src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp similarity index 100% rename from src/MISC/pair_nm_cut_coul_long.cpp rename to src/EXTRA-PAIR/pair_nm_cut_coul_long.cpp diff --git a/src/MISC/pair_nm_cut_coul_long.h b/src/EXTRA-PAIR/pair_nm_cut_coul_long.h similarity index 100% rename from src/MISC/pair_nm_cut_coul_long.h rename to src/EXTRA-PAIR/pair_nm_cut_coul_long.h diff --git a/src/pair_ufm.cpp b/src/EXTRA-PAIR/pair_ufm.cpp similarity index 100% rename from src/pair_ufm.cpp rename to src/EXTRA-PAIR/pair_ufm.cpp diff --git a/src/pair_ufm.h b/src/EXTRA-PAIR/pair_ufm.h similarity index 100% rename from src/pair_ufm.h rename to src/EXTRA-PAIR/pair_ufm.h diff --git a/src/USER-MISC/pair_wf_cut.cpp b/src/EXTRA-PAIR/pair_wf_cut.cpp similarity index 100% rename from src/USER-MISC/pair_wf_cut.cpp rename to src/EXTRA-PAIR/pair_wf_cut.cpp diff --git a/src/USER-MISC/pair_wf_cut.h b/src/EXTRA-PAIR/pair_wf_cut.h similarity index 100% rename from src/USER-MISC/pair_wf_cut.h rename to src/EXTRA-PAIR/pair_wf_cut.h diff --git a/src/compute_contact_atom.cpp b/src/GRANULAR/compute_contact_atom.cpp similarity index 100% rename from src/compute_contact_atom.cpp rename to src/GRANULAR/compute_contact_atom.cpp diff --git a/src/compute_contact_atom.h b/src/GRANULAR/compute_contact_atom.h similarity index 100% rename from src/compute_contact_atom.h rename to src/GRANULAR/compute_contact_atom.h diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index a28b17270a..073f094836 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -137,12 +137,12 @@ action fix_nvt_kokkos.cpp action fix_nvt_kokkos.h action fix_property_atom_kokkos.cpp action fix_property_atom_kokkos.h -action fix_qeq_reax_kokkos.cpp fix_qeq_reax.cpp -action fix_qeq_reax_kokkos.h fix_qeq_reax.h -action fix_reaxc_bonds_kokkos.cpp fix_reaxc_bonds.cpp -action fix_reaxc_bonds_kokkos.h fix_reaxc_bonds.h -action fix_reaxc_species_kokkos.cpp fix_reaxc_species.cpp -action fix_reaxc_species_kokkos.h fix_reaxc_species.h +action fix_qeq_reaxff_kokkos.cpp fix_qeq_reaxff.cpp +action fix_qeq_reaxff_kokkos.h fix_qeq_reaxff.h +action fix_reaxff_bonds_kokkos.cpp fix_reaxff_bonds.cpp +action fix_reaxff_bonds_kokkos.h fix_reaxff_bonds.h +action fix_reaxff_species_kokkos.cpp fix_reaxff_species.cpp +action fix_reaxff_species_kokkos.h fix_reaxff_species.h action fix_setforce_kokkos.cpp action fix_setforce_kokkos.h action fix_shake_kokkos.cpp fix_shake.cpp @@ -271,8 +271,8 @@ action pair_morse_kokkos.cpp action pair_morse_kokkos.h action pair_multi_lucy_rx_kokkos.cpp pair_multi_lucy_rx.cpp action pair_multi_lucy_rx_kokkos.h pair_multi_lucy_rx.h -action pair_reaxc_kokkos.cpp pair_reaxc.cpp -action pair_reaxc_kokkos.h pair_reaxc.h +action pair_reaxff_kokkos.cpp pair_reaxff.cpp +action pair_reaxff_kokkos.h pair_reaxff.h action pair_snap_kokkos.cpp pair_snap.cpp action pair_snap_kokkos.h pair_snap.h action pair_snap_kokkos_impl.h pair_snap.cpp diff --git a/src/USER-MISC/pair_edip.cpp b/src/MANYBODY/pair_edip.cpp similarity index 100% rename from src/USER-MISC/pair_edip.cpp rename to src/MANYBODY/pair_edip.cpp diff --git a/src/USER-MISC/pair_edip.h b/src/MANYBODY/pair_edip.h similarity index 100% rename from src/USER-MISC/pair_edip.h rename to src/MANYBODY/pair_edip.h diff --git a/src/USER-MISC/pair_edip_multi.cpp b/src/MANYBODY/pair_edip_multi.cpp similarity index 100% rename from src/USER-MISC/pair_edip_multi.cpp rename to src/MANYBODY/pair_edip_multi.cpp diff --git a/src/USER-MISC/pair_edip_multi.h b/src/MANYBODY/pair_edip_multi.h similarity index 100% rename from src/USER-MISC/pair_edip_multi.h rename to src/MANYBODY/pair_edip_multi.h diff --git a/src/USER-MISC/pair_extep.cpp b/src/MANYBODY/pair_extep.cpp similarity index 100% rename from src/USER-MISC/pair_extep.cpp rename to src/MANYBODY/pair_extep.cpp diff --git a/src/USER-MISC/pair_extep.h b/src/MANYBODY/pair_extep.h similarity index 100% rename from src/USER-MISC/pair_extep.h rename to src/MANYBODY/pair_extep.h diff --git a/src/USER-MISC/pair_local_density.cpp b/src/MANYBODY/pair_local_density.cpp similarity index 100% rename from src/USER-MISC/pair_local_density.cpp rename to src/MANYBODY/pair_local_density.cpp diff --git a/src/USER-MISC/pair_local_density.h b/src/MANYBODY/pair_local_density.h similarity index 100% rename from src/USER-MISC/pair_local_density.h rename to src/MANYBODY/pair_local_density.h diff --git a/src/USER-MISC/pair_meam_spline.cpp b/src/MANYBODY/pair_meam_spline.cpp similarity index 100% rename from src/USER-MISC/pair_meam_spline.cpp rename to src/MANYBODY/pair_meam_spline.cpp diff --git a/src/USER-MISC/pair_meam_spline.h b/src/MANYBODY/pair_meam_spline.h similarity index 100% rename from src/USER-MISC/pair_meam_spline.h rename to src/MANYBODY/pair_meam_spline.h diff --git a/src/USER-MISC/pair_meam_sw_spline.cpp b/src/MANYBODY/pair_meam_sw_spline.cpp similarity index 100% rename from src/USER-MISC/pair_meam_sw_spline.cpp rename to src/MANYBODY/pair_meam_sw_spline.cpp diff --git a/src/USER-MISC/pair_meam_sw_spline.h b/src/MANYBODY/pair_meam_sw_spline.h similarity index 100% rename from src/USER-MISC/pair_meam_sw_spline.h rename to src/MANYBODY/pair_meam_sw_spline.h diff --git a/src/USER-MISC/pair_tersoff_table.cpp b/src/MANYBODY/pair_tersoff_table.cpp similarity index 100% rename from src/USER-MISC/pair_tersoff_table.cpp rename to src/MANYBODY/pair_tersoff_table.cpp diff --git a/src/USER-MISC/pair_tersoff_table.h b/src/MANYBODY/pair_tersoff_table.h similarity index 100% rename from src/USER-MISC/pair_tersoff_table.h rename to src/MANYBODY/pair_tersoff_table.h diff --git a/src/USER-MISC/compute_viscosity_cos.cpp b/src/MISC/compute_viscosity_cos.cpp similarity index 100% rename from src/USER-MISC/compute_viscosity_cos.cpp rename to src/MISC/compute_viscosity_cos.cpp diff --git a/src/USER-MISC/compute_viscosity_cos.h b/src/MISC/compute_viscosity_cos.h similarity index 100% rename from src/USER-MISC/compute_viscosity_cos.h rename to src/MISC/compute_viscosity_cos.h diff --git a/src/USER-MISC/fix_accelerate_cos.cpp b/src/MISC/fix_accelerate_cos.cpp similarity index 100% rename from src/USER-MISC/fix_accelerate_cos.cpp rename to src/MISC/fix_accelerate_cos.cpp diff --git a/src/USER-MISC/fix_accelerate_cos.h b/src/MISC/fix_accelerate_cos.h similarity index 100% rename from src/USER-MISC/fix_accelerate_cos.h rename to src/MISC/fix_accelerate_cos.h diff --git a/src/USER-MISC/fix_ipi.cpp b/src/MISC/fix_ipi.cpp similarity index 100% rename from src/USER-MISC/fix_ipi.cpp rename to src/MISC/fix_ipi.cpp diff --git a/src/USER-MISC/fix_ipi.h b/src/MISC/fix_ipi.h similarity index 100% rename from src/USER-MISC/fix_ipi.h rename to src/MISC/fix_ipi.h diff --git a/src/USER-MISC/fix_srp.cpp b/src/MISC/fix_srp.cpp similarity index 100% rename from src/USER-MISC/fix_srp.cpp rename to src/MISC/fix_srp.cpp diff --git a/src/USER-MISC/fix_srp.h b/src/MISC/fix_srp.h similarity index 100% rename from src/USER-MISC/fix_srp.h rename to src/MISC/fix_srp.h diff --git a/src/USER-MISC/pair_agni.cpp b/src/MISC/pair_agni.cpp similarity index 100% rename from src/USER-MISC/pair_agni.cpp rename to src/MISC/pair_agni.cpp diff --git a/src/USER-MISC/pair_agni.h b/src/MISC/pair_agni.h similarity index 100% rename from src/USER-MISC/pair_agni.h rename to src/MISC/pair_agni.h diff --git a/src/Makefile b/src/Makefile index 5e26de47ce..f7ec0a06f4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -55,7 +55,7 @@ PACKAGE = \ body \ brownian \ cg-dna \ - cg-sdk\ + cg-sdk \ class2 \ colloid \ colvars \ @@ -69,6 +69,11 @@ PACKAGE = \ dpd-smooth \ drude \ eff \ + extra-compute \ + extra-dump \ + extra-fix \ + extra-molecule \ + extra-pair \ fep \ gpu \ granular \ @@ -103,6 +108,7 @@ PACKAGE = \ netcdf \ openmp \ opt \ + orient \ peri \ plugin \ plumed \ @@ -124,7 +130,6 @@ PACKAGE = \ srd \ tally \ uef \ - user-misc \ voronoi \ vtk \ yaff \ @@ -156,6 +161,11 @@ PACKMOST = \ dpd-smooth \ drude \ eff \ + extra-compute \ + extra-dump \ + extra-fix \ + extra-molecule \ + extra-pair \ fep \ granular \ interlayer \ @@ -169,6 +179,7 @@ PACKMOST = \ molecule \ openmp \ opt \ + orient \ peri \ plugin \ poems \ @@ -182,7 +193,6 @@ PACKMOST = \ spin \ srd \ uef \ - user-misc \ yaff \ dielectric \ ml-iap \ diff --git a/src/MISC/fix_orient_bcc.cpp b/src/ORIENT/fix_orient_bcc.cpp similarity index 100% rename from src/MISC/fix_orient_bcc.cpp rename to src/ORIENT/fix_orient_bcc.cpp diff --git a/src/MISC/fix_orient_bcc.h b/src/ORIENT/fix_orient_bcc.h similarity index 100% rename from src/MISC/fix_orient_bcc.h rename to src/ORIENT/fix_orient_bcc.h diff --git a/src/USER-MISC/fix_orient_eco.cpp b/src/ORIENT/fix_orient_eco.cpp similarity index 100% rename from src/USER-MISC/fix_orient_eco.cpp rename to src/ORIENT/fix_orient_eco.cpp diff --git a/src/USER-MISC/fix_orient_eco.h b/src/ORIENT/fix_orient_eco.h similarity index 100% rename from src/USER-MISC/fix_orient_eco.h rename to src/ORIENT/fix_orient_eco.h diff --git a/src/MISC/fix_orient_fcc.cpp b/src/ORIENT/fix_orient_fcc.cpp similarity index 100% rename from src/MISC/fix_orient_fcc.cpp rename to src/ORIENT/fix_orient_fcc.cpp diff --git a/src/MISC/fix_orient_fcc.h b/src/ORIENT/fix_orient_fcc.h similarity index 100% rename from src/MISC/fix_orient_fcc.h rename to src/ORIENT/fix_orient_fcc.h diff --git a/src/Purge.list b/src/Purge.list index 40bdc50d0d..feb30a9ad7 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -97,11 +97,6 @@ reaxc_reset_tools.cpp reaxc_tool_box.cpp reaxc_torsion_angles.cpp reaxc_valence_angles.cpp -# moved to DPD-BASIC package on 1 July 2021 -pair_dpd.cpp -pair_dpd.h -pair_dpd_tstat.cpp -pair_dpd_tstat.h # removed on 14 May 2021 nstencil_half_bin_2d_newton_ssa.cpp nstencil_half_bin_2d_newton_ssa.h @@ -170,8 +165,6 @@ pair_reax.h pair_reax_fortran.h fix_reax_bonds.cpp fix_reax_bonds.h -pair_meam.cpp -pair_meam.h # removed on 27 September 2018 pair_nb3b_harmonic_omp.h pair_nb3b_harmonic_omp.cpp diff --git a/src/USER-MISC/README b/src/USER-MISC/README deleted file mode 100644 index a5416c6804..0000000000 --- a/src/USER-MISC/README +++ /dev/null @@ -1,73 +0,0 @@ -The files in this package are a potpourri of (mostly) unrelated -features contributed to LAMMPS by users. Each feature is a single -pair of files (*.cpp and *.h). - -More information about each feature can be found by reading its doc -page in the LAMMPS doc directory. The doc page which lists all LAMMPS -input script commands is as follows: - -doc/Commands_all.html - -User-contributed features are listed at the bottom of the fix, -compute, pair, etc sections. - -The list of features and author of each is given below. - -You should contact the author directly if you have specific questions -about the feature or its coding. - ------------------------------------------------------------- - -compute ackland/atom, Gerolf Ziegenhain, gerolf at ziegenhain.com, 4 Oct 2007 -compute basal/atom, Christopher Barrett, cdb333 at cavs.msstate.edu, 3 Mar 2013 -compute cnp/atom, Paulo Branicio (USC), branicio at usc.edu, 31 May 2017 -compute entropy/atom, Pablo Piaggi (EPFL), pablo.piaggi at epfl.ch, 15 June 2018 -compute gyration/shape, Evangelos Voyiatzis, evoyiatzis at gmail.com, 25 July 2019 -compute gyration/shape/chunk, Evangelos Voyiatzis, evoyiatzis at gmail.com, 22 October 2019 -compute hma, Andrew Schultz & David Kofke (UB), ajs42 at buffalo.edu & kofke at buffalo.edu, 1 Jul 2019 -compute pressure/cylinder, Cody K. Addington (NCSU), , 2 Oct 2018 -compute momentum, Rupert Nash (University of Edinburgh), r.nash at epcc.ed.ac.uk, 28 June 2019 -compute stress/mop, Romain Vermorel (U Pau) & Laurent Joly (U Lyon), romain.vermorel at univ-pau.fr & ljoly.ulyon at gmail.com, 5 Sep 18 -compute stress/mop/profile, Romain Vermorel (U Pau) & Laurent Joly (U Lyon), romain.vermorel at univ-pau.fr & ljoly.ulyon at gmail.com, 5 Sep 18 -compute temp/rotate, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 -compute viscosity/cos, Zheng Gong (ENS de Lyon), z.gong@outlook.com, 24 Apr 20 -fix accelerate/cos, Zheng Gong (ENS de Lyon), z.gong@outlook.com, 24 Apr 20 -fix ave/correlate/long, Jorge Ramirez (UPM Madrid), jorge.ramirez at upm.es, 21 Oct 2015 -fix electron/stopping/fit, James Stewart (SNL), jstewa .at. sandia.gov, 23 Sep 2020 -fix electron/stopping, Konstantin Avchaciov, k.avchachov at gmail.com, 26 Feb 2019 -fix ffl, David Wilkins (EPFL Lausanne), david.wilkins @ epfl.ch, 28 Sep 2018 -fix filter/corotate, Lukas Fath (KIT), lukas.fath at kit.edu, 15 Mar 2017 -fix flow/gauss, Joel Eaves (CU Boulder), Joel.Eaves@Colorado.edu, 23 Aug 2016 -fix ipi, Michele Ceriotti (EPFL Lausanne), michele.ceriotti at gmail.com, 24 Nov 2014 -fix momentum/chunk, Jiang Xiao (Hong Kong Polytechnic University), polyu-xiao.jiang at connect.polyu.hk, 19 Aug 2020 -fix npt/cauchy, R. E. Miller (Carleton University), F. Pavia and S. Pattamatta, 12 Jan 2020 -fix nvk, Efrem Braun (UC Berkeley), efrem.braun at gmail.com, https://github.com/lammps/lammps/pull/310 -fix orient/eco Adrian A. Schratt and Volker Mohles (Ruhr-Uni Bochum), volker.mohles at rub.de, 6 Jun 2020 -fix pafi, Thomas Swinburne (CNRS), swinburne at cinam.univ-mrs.fr, 1st Sep 2020 -fix pimd, Yuxing Peng (U Chicago), yuxing at uchicago.edu, 24 Nov 2014 -fix rhok, Ulf Pedersen (Roskilde U), ulf at urp.dk, 25 Sep 2017 -fix ti/spring, Rodrigo Freitas (Unicamp/Brazil), rodrigohb at gmail.com, 7 Nov 2013 -fix ttm/mod, Sergey Starikov and Vasily Pisarev (JIHT), pisarevvv at gmail.com, 2 Feb 2015 -fix wall/ees, Abdoreza Ershadinia, a.ershadinia at gmail.com, Jul 2017 -fix wall/reflect/stochastic, Quy-Dong To (U Gustave Eiffel), toquydong at gmail.com, Jan 2020 -fix wall/region/ees, Abdoreza Ershadinia, a.ershadinia at gmail.com, Jul 2017 -pair_style agni, Axel Kohlmeyer, akohlmey at gmail.com, 9 Nov 16 -pair_style buck/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 -pair_style cosine/squared, Eugen Rozic, eugen.rozic.17 at ucl.ac.uk, 9 Aug 19 -pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 -pair_style coul/slater/cut, Evangelos Voyiatzis, evoyiatzis at gmail.com, 26 February 2020 -pair_style coul/slater/long, Evangelos Voyiatzis, evoyiatzis at gmail.com, 26 February 2020 -pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 -pair_style e3b, Steven Strong (U Chicago), stevene.strong at gmail dot com, 16 Apr 19 -pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 -pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17 -pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 -pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 -pair_style lj/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 -pair_style local/density, Tanmoy Sanyal (tanmoy dot 7989 at gmail.com) and M. Scott Shell (UCSB), and David Rosenberger (TU Darmstadt), 9 Sept 19 -pair_style meam/spline, Alexander Stukowski (LLNL), alex at stukowski.com, 1 Feb 12 -pair_style meam/sw/spline, Robert Rudd (LLNL), robert.rudd at llnl.gov, 1 Oct 12 -pair_style morse/smooth/linear, Stefan Paquay (TU Eindhoven), stefanpaquay at gmail.com, 29 Feb 16 -pair_style tersoff/table, Luca Ferraro, luca.ferraro@caspur.it, 1 Dec 11 -pair_style momb, Kristen Fichthorn, Tonnam Balankura, Ya Zhou, fichthorn@psu.edu, 18 Mar 17 -pair_style wf_cut, Simon Ramirez-Hinestrosa, Xipeng Wang, sr802 at cam.ac.uk, 4 Nov 20 diff --git a/src/MISC/fix_deposit.cpp b/src/fix_deposit.cpp similarity index 100% rename from src/MISC/fix_deposit.cpp rename to src/fix_deposit.cpp diff --git a/src/MISC/fix_deposit.h b/src/fix_deposit.h similarity index 100% rename from src/MISC/fix_deposit.h rename to src/fix_deposit.h diff --git a/src/MISC/fix_efield.cpp b/src/fix_efield.cpp similarity index 100% rename from src/MISC/fix_efield.cpp rename to src/fix_efield.cpp diff --git a/src/MISC/fix_efield.h b/src/fix_efield.h similarity index 100% rename from src/MISC/fix_efield.h rename to src/fix_efield.h diff --git a/src/MISC/fix_evaporate.cpp b/src/fix_evaporate.cpp similarity index 100% rename from src/MISC/fix_evaporate.cpp rename to src/fix_evaporate.cpp diff --git a/src/MISC/fix_evaporate.h b/src/fix_evaporate.h similarity index 100% rename from src/MISC/fix_evaporate.h rename to src/fix_evaporate.h diff --git a/src/MISC/fix_thermal_conductivity.cpp b/src/fix_thermal_conductivity.cpp similarity index 100% rename from src/MISC/fix_thermal_conductivity.cpp rename to src/fix_thermal_conductivity.cpp diff --git a/src/MISC/fix_thermal_conductivity.h b/src/fix_thermal_conductivity.h similarity index 100% rename from src/MISC/fix_thermal_conductivity.h rename to src/fix_thermal_conductivity.h From add7565d9f4c599b53a03dbf0db7dc275f4edbb3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 23 Jul 2021 18:24:40 -0400 Subject: [PATCH 142/352] recover unit test compilation --- unittest/formats/test_potential_file_reader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/formats/test_potential_file_reader.cpp b/unittest/formats/test_potential_file_reader.cpp index 646ce5dd0e..af6abfa25f 100644 --- a/unittest/formats/test_potential_file_reader.cpp +++ b/unittest/formats/test_potential_file_reader.cpp @@ -22,7 +22,7 @@ #include "MANYBODY/pair_tersoff_mod_c.h" #include "MANYBODY/pair_tersoff_zbl.h" #include "MANYBODY/pair_vashishta.h" -#include "USER-MISC/pair_tersoff_table.h" +#include "MANYBODY/pair_tersoff_table.h" #include "info.h" #include "input.h" #include "potential_file_reader.h" From 57270c5339609748f26a18ad05250a5a45aba981 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Jul 2021 13:46:13 -0400 Subject: [PATCH 143/352] set flag to tell CMake to not use/link the MPI C++ interface in the correct place --- cmake/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a5861ab885..6c446bdb1b 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -238,20 +238,20 @@ if(PKG_ADIOS) endif() if(NOT CMAKE_CROSSCOMPILING) - set(MPI_CXX_SKIP_MPICXX TRUE) find_package(MPI QUIET) option(BUILD_MPI "Build MPI version" ${MPI_FOUND}) else() - set(MPI_CXX_SKIP_MPICXX TRUE) option(BUILD_MPI "Build MPI version" OFF) endif() if(BUILD_MPI) # We use a non-standard procedure to cross-compile with MPI on Windows if((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND CMAKE_CROSSCOMPILING) + set(MPI_CXX_SKIP_MPICXX TRUE) include(MPI4WIN) target_link_libraries(lammps PUBLIC MPI::MPI_CXX) else() + set(MPI_CXX_SKIP_MPICXX TRUE) find_package(MPI REQUIRED) target_link_libraries(lammps PUBLIC MPI::MPI_CXX) option(LAMMPS_LONGLONG_TO_LONG "Workaround if your system or MPI version does not recognize 'long long' data types" OFF) From f192102da98b47e60421a4b2cf20410f15e079d1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Jul 2021 20:53:23 -0400 Subject: [PATCH 144/352] move examples away from USER-MISC now that the package folder is gone --- .../{USER-MISC => PACKAGES}/agni/Al_jpc.agni | 0 .../{USER-MISC => PACKAGES}/agni/adatom.data | 0 .../{USER-MISC => PACKAGES}/agni/in.adatom | 0 .../{USER-MISC => PACKAGES}/agni/in.vacancy | 0 .../agni/log.20Jan21.adatom.g++.1 | 0 .../agni/log.20Jan21.adatom.g++.4 | 0 .../agni/log.20Jan21.vacancy.g++.1 | 0 .../agni/log.20Jan21.vacancy.g++.4 | 0 .../{USER-MISC => PACKAGES}/agni/vacancy.data | 0 .../{USER-MISC => PACKAGES}/basal/almg.liu | 0 .../{USER-MISC => PACKAGES}/basal/in.basal | 0 .../cauchy/NiAlH_jea.eam.alloy | 0 .../{USER-MISC => PACKAGES}/cauchy/README | 0 .../cauchy/in.cauchystat | 0 .../cauchy/log.2Jun2020.cauchystat.g++.1 | 0 .../charge_regulation/README | 0 .../charge_regulation/data.chreg-acid | 0 .../charge_regulation/data.chreg-acid-real | 0 .../charge_regulation/data.chreg-polymer | 0 .../charge_regulation/in.chreg-acid | 0 .../charge_regulation/in.chreg-acid-real | 0 .../charge_regulation/in.chreg-polymer | 0 .../log.10Feb21.chreg-acid.g++.1 | 0 .../log.10Feb21.chreg-acid.g++.4 | 0 .../log.10Feb21.chreg-polymer.g++.1 | 0 .../log.10Feb21.chreg-polymer.g++.4 | 0 .../log.11Apr21.chreg-acid-real.g++.1 | 0 .../log.11Apr21.chreg-acid-real.g++.4 | 0 .../cnp/Cu_Mishin1.eam | 0 examples/{USER-MISC => PACKAGES}/cnp/in.cnp | 0 .../cnp/log.31May17.cnp.g++.4 | 0 examples/{USER-MISC => PACKAGES}/e3b/README | 0 .../{USER-MISC => PACKAGES}/e3b/e3b_box.data | 0 .../e3b/in.e3b-tip4p2005 | 0 .../e3b/log.29Mar2019.e3b-tip4p2005.g++.1 | 0 .../e3b/log.29Mar2019.e3b-tip4p2005.g++.4 | 0 examples/{USER-MISC => PACKAGES}/edip/Si.edip | 0 .../{USER-MISC => PACKAGES}/edip/SiC.edip | 0 .../{USER-MISC => PACKAGES}/edip/data.SiC | 0 .../{USER-MISC => PACKAGES}/edip/in.edip-Si | 0 .../edip/in.edip-Si-multi | 0 .../{USER-MISC => PACKAGES}/edip/in.edip-SiC | 0 .../edip/log.4May2017.g++.edip-Si-multi.1 | 0 .../edip/log.4May2017.g++.edip-Si-multi.4 | 0 .../edip/log.4May2017.g++.edip-Si.1 | 0 .../edip/log.4May2017.g++.edip-Si.4 | 0 .../edip/log.4May2017.g++.edip-SiC.1 | 0 .../edip/log.4May2017.g++.edip-SiC.4 | 0 .../{USER-MISC => PACKAGES}/ees/Data_region | 0 .../{USER-MISC => PACKAGES}/ees/Data_wall | 0 examples/{USER-MISC => PACKAGES}/ees/README | 0 .../{USER-MISC => PACKAGES}/ees/in.fix_wall | 0 .../ees/in.fix_wall_region | 0 .../ees/log.23Jun17.fix_wall.g++.1 | 0 .../ees/log.23Jun17.fix_wall.g++.4 | 0 .../ees/log.23Jun17.fix_wall_region.g++.1 | 0 .../ees/log.23Jun17.fix_wall_region.g++.4 | 0 .../electron_stopping/Si.Si.elstop | 0 .../electron_stopping/Si.sw | 0 .../electron_stopping/in.cascade_AlCu | 0 .../electron_stopping/in.cascade_SiSi | 0 .../electron_stopping/in.elstop | 0 .../electron_stopping/in.elstop.only | 0 .../log.18Sep2020.cascade_AlCu.intel.1 | 0 .../log.18Sep2020.cascade_AlCu.intel.4 | 0 .../log.18Sep2020.cascade_SiSi.intel.1 | 0 .../log.18Sep2020.cascade_SiSi.intel.4 | 0 .../log.20Mar19.elstop.g++.1 | 0 .../log.20Mar19.elstop.g++.4 | 0 .../log.20Mar19.elstop.only.g++.1 | 0 .../log.20Mar19.elstop.only.g++.4 | 0 .../entropy/Na_MendelevM_2014.eam.fs | 0 .../entropy/data.interface | 0 .../entropy/in.entropy | 0 .../entropy/log.entropy | 0 .../{USER-MISC => PACKAGES}/extep/BN.data | 0 .../{USER-MISC => PACKAGES}/extep/in.extep-bn | 0 .../extep/log.23Oct17.extep-bn.g++.1 | 0 .../extep/log.23Oct17.extep-bn.g++.4 | 0 .../filter_corotate/data.bpti | 0 .../filter_corotate/data.peptide | 0 .../filter_corotate/in.bpti | 0 .../filter_corotate/in.peptide | 0 .../filter_corotate/log.22Jun2017.bpti.g++.1 | 0 .../filter_corotate/log.22Jun2017.bpti.g++.4 | 0 .../log.22Jun2017.peptide.g++.1 | 0 .../log.22Jun2017.peptide.g++.4 | 0 .../{USER-MISC => PACKAGES}/flow_gauss/README | 0 .../{USER-MISC => PACKAGES}/flow_gauss/in.GD | 0 .../flow_gauss/log.6Jul17.GD.g++.1 | 0 .../flow_gauss/log.6Jul17.GD.g++.4 | 0 .../flow_gauss/output-files/GD.out | 0 .../flow_gauss/output-files/Vy_profile | 0 .../flow_gauss/output-files/x_profiles | 0 .../gauss_diel/data.gauss-diel | 0 .../gauss_diel/in.gauss-diel | 0 .../gauss_diel/in.gauss-diel-cg | 0 .../gauss_diel/in.gauss-diel-split | 0 .../gauss_diel/log.gauss-diel | 0 .../gauss_diel/log.gauss-diel-cg | 0 .../gauss_diel/log.gauss-diel-split | 0 examples/{USER-MISC => PACKAGES}/hma/README | 0 examples/{USER-MISC => PACKAGES}/hma/hma.in | 0 .../hma/log.6Nov18.hma.g++.1 | 0 .../hma/log.6Nov18.hma.g++.4 | 0 .../{USER-MISC => PACKAGES}/ipi/C.opt.tersoff | 0 examples/{USER-MISC => PACKAGES}/ipi/README | 0 .../{USER-MISC => PACKAGES}/ipi/data.graphene | 0 .../ipi/i-pi_input.xml | 0 .../ipi/i-pi_positions.xyz | 0 .../{USER-MISC => PACKAGES}/ipi/in.graphene | 0 .../benzene_water/benzene_water.data | 0 .../benzene_water/benzene_water.in | 0 .../benzene_water.localdensity.table | 0 .../benzene_water/benzene_water.pair.table | 0 .../benzene_water/log.04Sep19.g++.1 | 0 .../methanol_implicit_water/log.04Sep19.g++.1 | 0 .../methanol_implicit_water.data | 0 .../methanol_implicit_water.in | 0 ...methanol_implicit_water.localdensity.table | 0 .../methanol_implicit_water.pair.table | 0 .../meam_spline/Si_1.meam.spline | 0 .../meam_spline/TiO.meam.spline | 0 .../meam_spline/in.meam-spline.Si | 0 .../meam_spline/in.meam-spline.TiO2 | 0 .../log.4May2017.meam-spline.Si.g++.1 | 0 .../log.4May2017.meam-spline.Si.g++.4 | 0 .../log.4May2017.meam-spline.TiO2.g++.1 | 0 .../log.4May2017.meam-spline.TiO2.g++.4 | 0 .../meam_sw_spline/Si/bcc.in | 0 .../meam_sw_spline/Si/bcc_relax.in | 0 .../meam_sw_spline/Si/dc.in | 0 .../meam_sw_spline/Si/dc_relax.in | 0 .../Si/energy_conservation.meam.sw.in | 0 .../meam_sw_spline/Si/fcc.in | 0 .../meam_sw_spline/Si/fcc_relax.in | 0 .../meam_sw_spline/Si/hcp_relax.in | 0 .../meam_sw_spline/Si/sc.in | 0 .../meam_sw_spline/Si/sc_relax.in | 0 .../meam_sw_spline/Si/single_atom.in | 0 .../meam_sw_spline/Ti/alpha.in | 0 .../meam_sw_spline/Ti/alpha_relaxation.in | 0 .../meam_sw_spline/Ti/beta.in | 0 .../Ti/energy_conservation.meam.sw.in | 0 .../meam_sw_spline/Ti/fcc.in | 0 .../meam_sw_spline/Ti/hexagonal.in | 0 .../meam_sw_spline/Ti/omega.in | 0 .../meam_sw_spline/Ti/single_atom.in | 0 .../momb/Ag_O1X5.5_O2X0.55.eam.fs | 0 examples/{USER-MISC => PACKAGES}/momb/README | 0 .../{USER-MISC => PACKAGES}/momb/in.system | 0 .../momb/log.17Mar2017.system.g++.1 | 0 .../momb/log.17Mar2017.system.g++.4 | 0 .../{USER-MISC => PACKAGES}/momb/system.data | 0 .../momentum/in.momentum | 0 examples/{USER-MISC => PACKAGES}/mop/data.mop | 0 .../mop/in.compute_stress_mop | 0 .../mop/log.5Sep18.compute_stress_mop.g++.1 | 0 .../mop/log.5Sep18.compute_stress_mop.g++.4 | 0 .../mop/moppz.time.reference | 0 .../mop/mopz0.time.reference | 0 .../orient_eco/Ni_u3.eam | 0 .../orient_eco/data.sigma5 | 0 .../orient_eco/in.orient_eco | 0 .../orient_eco/log.2Jun2020.orent_eco.g++.1 | 0 .../orient_eco/log.2Jun2020.orent_eco.g++.4 | 0 .../orient_eco/sigma5.ori | 0 .../{USER-MISC => PACKAGES}/pafi/.gitignore | 0 examples/{USER-MISC => PACKAGES}/pafi/README | 0 examples/{USER-MISC => PACKAGES}/pafi/in.pafi | 0 .../pafi/log.15Apr20.pafi.g++.1 | 0 .../pafi/log.15Apr20.pafi.g++.4 | 0 .../pafi/pafipath.4.data | 0 .../pimd/para-h2/H2.data | 0 .../pimd/para-h2/H2.xyz | 0 .../pimd/para-h2/NM.info | 0 .../pimd/para-h2/in.scp | 0 .../pimd/para-h2/pair.table | 0 .../pimd/para-h2/run.sh | 0 .../pimd/para-h2/vmd.src | 0 .../pimd/prot-hairpin/in.scp | 0 .../pimd/prot-hairpin/run.sh | 0 .../pimd/prot-hairpin/system.data | 0 .../{USER-MISC => PACKAGES}/rhok/README.md | 0 .../{USER-MISC => PACKAGES}/rhok/in.crystal | 0 .../{USER-MISC => PACKAGES}/rhok/in.pinning | 0 .../{USER-MISC => PACKAGES}/rhok/in.setup | 0 .../rhok/log.22Sep2017.crystal.g++.1 | 0 .../rhok/log.22Sep2017.crystal.g++.4 | 0 .../rhok/log.22Sep2017.pinning.g++.1 | 0 .../rhok/log.22Sep2017.pinning.g++.4 | 0 .../rhok/log.22Sep2017.setup.g++.1 | 0 .../rhok/log.22Sep2017.setup.g++.4 | 0 .../slater/data.after_equilibration | 0 .../slater/data.after_production_run | 0 .../{USER-MISC => PACKAGES}/slater/in.slater | 0 .../{USER-MISC => PACKAGES}/slater/log.lammps | 0 .../slater/tmp_1_1.rdf | 0 .../slater/tmp_1_2.rdf | 0 .../slater/tmp_1_3.rdf | 0 .../slater/tmp_2_2.rdf | 0 .../slater/tmp_2_3.rdf | 0 .../slater/tmp_3_3.rdf | 0 .../temper_npt/data.peptide | 0 .../temper_npt/in.temper_npt | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.0 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.1 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.2 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.3 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.4 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.5 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.6 | 0 .../temper_npt/log.temper_npt-17Aug17.g++.8.7 | 0 .../{USER-MISC => PACKAGES}/ti/in.ti_spring | 0 examples/README | 19 +++++++------------ 216 files changed, 7 insertions(+), 12 deletions(-) rename examples/{USER-MISC => PACKAGES}/agni/Al_jpc.agni (100%) rename examples/{USER-MISC => PACKAGES}/agni/adatom.data (100%) rename examples/{USER-MISC => PACKAGES}/agni/in.adatom (100%) rename examples/{USER-MISC => PACKAGES}/agni/in.vacancy (100%) rename examples/{USER-MISC => PACKAGES}/agni/log.20Jan21.adatom.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/agni/log.20Jan21.adatom.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/agni/log.20Jan21.vacancy.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/agni/log.20Jan21.vacancy.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/agni/vacancy.data (100%) rename examples/{USER-MISC => PACKAGES}/basal/almg.liu (100%) rename examples/{USER-MISC => PACKAGES}/basal/in.basal (100%) rename examples/{USER-MISC => PACKAGES}/cauchy/NiAlH_jea.eam.alloy (100%) rename examples/{USER-MISC => PACKAGES}/cauchy/README (100%) rename examples/{USER-MISC => PACKAGES}/cauchy/in.cauchystat (100%) rename examples/{USER-MISC => PACKAGES}/cauchy/log.2Jun2020.cauchystat.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/README (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/data.chreg-acid (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/data.chreg-acid-real (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/data.chreg-polymer (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/in.chreg-acid (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/in.chreg-acid-real (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/in.chreg-polymer (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.10Feb21.chreg-acid.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.10Feb21.chreg-acid.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.10Feb21.chreg-polymer.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.10Feb21.chreg-polymer.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.11Apr21.chreg-acid-real.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/charge_regulation/log.11Apr21.chreg-acid-real.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/cnp/Cu_Mishin1.eam (100%) rename examples/{USER-MISC => PACKAGES}/cnp/in.cnp (100%) rename examples/{USER-MISC => PACKAGES}/cnp/log.31May17.cnp.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/e3b/README (100%) rename examples/{USER-MISC => PACKAGES}/e3b/e3b_box.data (100%) rename examples/{USER-MISC => PACKAGES}/e3b/in.e3b-tip4p2005 (100%) rename examples/{USER-MISC => PACKAGES}/e3b/log.29Mar2019.e3b-tip4p2005.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/e3b/log.29Mar2019.e3b-tip4p2005.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/edip/Si.edip (100%) rename examples/{USER-MISC => PACKAGES}/edip/SiC.edip (100%) rename examples/{USER-MISC => PACKAGES}/edip/data.SiC (100%) rename examples/{USER-MISC => PACKAGES}/edip/in.edip-Si (100%) rename examples/{USER-MISC => PACKAGES}/edip/in.edip-Si-multi (100%) rename examples/{USER-MISC => PACKAGES}/edip/in.edip-SiC (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-Si-multi.1 (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-Si-multi.4 (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-Si.1 (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-Si.4 (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-SiC.1 (100%) rename examples/{USER-MISC => PACKAGES}/edip/log.4May2017.g++.edip-SiC.4 (100%) rename examples/{USER-MISC => PACKAGES}/ees/Data_region (100%) rename examples/{USER-MISC => PACKAGES}/ees/Data_wall (100%) rename examples/{USER-MISC => PACKAGES}/ees/README (100%) rename examples/{USER-MISC => PACKAGES}/ees/in.fix_wall (100%) rename examples/{USER-MISC => PACKAGES}/ees/in.fix_wall_region (100%) rename examples/{USER-MISC => PACKAGES}/ees/log.23Jun17.fix_wall.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/ees/log.23Jun17.fix_wall.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/ees/log.23Jun17.fix_wall_region.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/ees/log.23Jun17.fix_wall_region.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/Si.Si.elstop (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/Si.sw (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/in.cascade_AlCu (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/in.cascade_SiSi (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/in.elstop (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/in.elstop.only (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.18Sep2020.cascade_AlCu.intel.1 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.18Sep2020.cascade_AlCu.intel.4 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.18Sep2020.cascade_SiSi.intel.1 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.18Sep2020.cascade_SiSi.intel.4 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.20Mar19.elstop.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.20Mar19.elstop.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.20Mar19.elstop.only.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/electron_stopping/log.20Mar19.elstop.only.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/entropy/Na_MendelevM_2014.eam.fs (100%) rename examples/{USER-MISC => PACKAGES}/entropy/data.interface (100%) rename examples/{USER-MISC => PACKAGES}/entropy/in.entropy (100%) rename examples/{USER-MISC => PACKAGES}/entropy/log.entropy (100%) rename examples/{USER-MISC => PACKAGES}/extep/BN.data (100%) rename examples/{USER-MISC => PACKAGES}/extep/in.extep-bn (100%) rename examples/{USER-MISC => PACKAGES}/extep/log.23Oct17.extep-bn.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/extep/log.23Oct17.extep-bn.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/data.bpti (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/data.peptide (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/in.bpti (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/in.peptide (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/log.22Jun2017.bpti.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/log.22Jun2017.bpti.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/log.22Jun2017.peptide.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/filter_corotate/log.22Jun2017.peptide.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/README (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/in.GD (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/log.6Jul17.GD.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/log.6Jul17.GD.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/output-files/GD.out (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/output-files/Vy_profile (100%) rename examples/{USER-MISC => PACKAGES}/flow_gauss/output-files/x_profiles (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/data.gauss-diel (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/in.gauss-diel (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/in.gauss-diel-cg (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/in.gauss-diel-split (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/log.gauss-diel (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/log.gauss-diel-cg (100%) rename examples/{USER-MISC => PACKAGES}/gauss_diel/log.gauss-diel-split (100%) rename examples/{USER-MISC => PACKAGES}/hma/README (100%) rename examples/{USER-MISC => PACKAGES}/hma/hma.in (100%) rename examples/{USER-MISC => PACKAGES}/hma/log.6Nov18.hma.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/hma/log.6Nov18.hma.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/ipi/C.opt.tersoff (100%) rename examples/{USER-MISC => PACKAGES}/ipi/README (100%) rename examples/{USER-MISC => PACKAGES}/ipi/data.graphene (100%) rename examples/{USER-MISC => PACKAGES}/ipi/i-pi_input.xml (100%) rename examples/{USER-MISC => PACKAGES}/ipi/i-pi_positions.xyz (100%) rename examples/{USER-MISC => PACKAGES}/ipi/in.graphene (100%) rename examples/{USER-MISC => PACKAGES}/local_density/benzene_water/benzene_water.data (100%) rename examples/{USER-MISC => PACKAGES}/local_density/benzene_water/benzene_water.in (100%) rename examples/{USER-MISC => PACKAGES}/local_density/benzene_water/benzene_water.localdensity.table (100%) rename examples/{USER-MISC => PACKAGES}/local_density/benzene_water/benzene_water.pair.table (100%) rename examples/{USER-MISC => PACKAGES}/local_density/benzene_water/log.04Sep19.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/local_density/methanol_implicit_water/log.04Sep19.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/local_density/methanol_implicit_water/methanol_implicit_water.data (100%) rename examples/{USER-MISC => PACKAGES}/local_density/methanol_implicit_water/methanol_implicit_water.in (100%) rename examples/{USER-MISC => PACKAGES}/local_density/methanol_implicit_water/methanol_implicit_water.localdensity.table (100%) rename examples/{USER-MISC => PACKAGES}/local_density/methanol_implicit_water/methanol_implicit_water.pair.table (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/Si_1.meam.spline (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/TiO.meam.spline (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/in.meam-spline.Si (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/in.meam-spline.TiO2 (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/log.4May2017.meam-spline.Si.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/log.4May2017.meam-spline.Si.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/log.4May2017.meam-spline.TiO2.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/meam_spline/log.4May2017.meam-spline.TiO2.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/bcc.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/bcc_relax.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/dc.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/dc_relax.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/energy_conservation.meam.sw.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/fcc.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/fcc_relax.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/hcp_relax.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/sc.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/sc_relax.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Si/single_atom.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/alpha.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/alpha_relaxation.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/beta.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/energy_conservation.meam.sw.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/fcc.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/hexagonal.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/omega.in (100%) rename examples/{USER-MISC => PACKAGES}/meam_sw_spline/Ti/single_atom.in (100%) rename examples/{USER-MISC => PACKAGES}/momb/Ag_O1X5.5_O2X0.55.eam.fs (100%) rename examples/{USER-MISC => PACKAGES}/momb/README (100%) rename examples/{USER-MISC => PACKAGES}/momb/in.system (100%) rename examples/{USER-MISC => PACKAGES}/momb/log.17Mar2017.system.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/momb/log.17Mar2017.system.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/momb/system.data (100%) rename examples/{USER-MISC => PACKAGES}/momentum/in.momentum (100%) rename examples/{USER-MISC => PACKAGES}/mop/data.mop (100%) rename examples/{USER-MISC => PACKAGES}/mop/in.compute_stress_mop (100%) rename examples/{USER-MISC => PACKAGES}/mop/log.5Sep18.compute_stress_mop.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/mop/log.5Sep18.compute_stress_mop.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/mop/moppz.time.reference (100%) rename examples/{USER-MISC => PACKAGES}/mop/mopz0.time.reference (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/Ni_u3.eam (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/data.sigma5 (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/in.orient_eco (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/log.2Jun2020.orent_eco.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/log.2Jun2020.orent_eco.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/orient_eco/sigma5.ori (100%) rename examples/{USER-MISC => PACKAGES}/pafi/.gitignore (100%) rename examples/{USER-MISC => PACKAGES}/pafi/README (100%) rename examples/{USER-MISC => PACKAGES}/pafi/in.pafi (100%) rename examples/{USER-MISC => PACKAGES}/pafi/log.15Apr20.pafi.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/pafi/log.15Apr20.pafi.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/pafi/pafipath.4.data (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/H2.data (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/H2.xyz (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/NM.info (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/in.scp (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/pair.table (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/run.sh (100%) rename examples/{USER-MISC => PACKAGES}/pimd/para-h2/vmd.src (100%) rename examples/{USER-MISC => PACKAGES}/pimd/prot-hairpin/in.scp (100%) rename examples/{USER-MISC => PACKAGES}/pimd/prot-hairpin/run.sh (100%) rename examples/{USER-MISC => PACKAGES}/pimd/prot-hairpin/system.data (100%) rename examples/{USER-MISC => PACKAGES}/rhok/README.md (100%) rename examples/{USER-MISC => PACKAGES}/rhok/in.crystal (100%) rename examples/{USER-MISC => PACKAGES}/rhok/in.pinning (100%) rename examples/{USER-MISC => PACKAGES}/rhok/in.setup (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.crystal.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.crystal.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.pinning.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.pinning.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.setup.g++.1 (100%) rename examples/{USER-MISC => PACKAGES}/rhok/log.22Sep2017.setup.g++.4 (100%) rename examples/{USER-MISC => PACKAGES}/slater/data.after_equilibration (100%) rename examples/{USER-MISC => PACKAGES}/slater/data.after_production_run (100%) rename examples/{USER-MISC => PACKAGES}/slater/in.slater (100%) rename examples/{USER-MISC => PACKAGES}/slater/log.lammps (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_1_1.rdf (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_1_2.rdf (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_1_3.rdf (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_2_2.rdf (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_2_3.rdf (100%) rename examples/{USER-MISC => PACKAGES}/slater/tmp_3_3.rdf (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/data.peptide (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/in.temper_npt (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.0 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.1 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.2 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.3 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.4 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.5 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.6 (100%) rename examples/{USER-MISC => PACKAGES}/temper_npt/log.temper_npt-17Aug17.g++.8.7 (100%) rename examples/{USER-MISC => PACKAGES}/ti/in.ti_spring (100%) diff --git a/examples/USER-MISC/agni/Al_jpc.agni b/examples/PACKAGES/agni/Al_jpc.agni similarity index 100% rename from examples/USER-MISC/agni/Al_jpc.agni rename to examples/PACKAGES/agni/Al_jpc.agni diff --git a/examples/USER-MISC/agni/adatom.data b/examples/PACKAGES/agni/adatom.data similarity index 100% rename from examples/USER-MISC/agni/adatom.data rename to examples/PACKAGES/agni/adatom.data diff --git a/examples/USER-MISC/agni/in.adatom b/examples/PACKAGES/agni/in.adatom similarity index 100% rename from examples/USER-MISC/agni/in.adatom rename to examples/PACKAGES/agni/in.adatom diff --git a/examples/USER-MISC/agni/in.vacancy b/examples/PACKAGES/agni/in.vacancy similarity index 100% rename from examples/USER-MISC/agni/in.vacancy rename to examples/PACKAGES/agni/in.vacancy diff --git a/examples/USER-MISC/agni/log.20Jan21.adatom.g++.1 b/examples/PACKAGES/agni/log.20Jan21.adatom.g++.1 similarity index 100% rename from examples/USER-MISC/agni/log.20Jan21.adatom.g++.1 rename to examples/PACKAGES/agni/log.20Jan21.adatom.g++.1 diff --git a/examples/USER-MISC/agni/log.20Jan21.adatom.g++.4 b/examples/PACKAGES/agni/log.20Jan21.adatom.g++.4 similarity index 100% rename from examples/USER-MISC/agni/log.20Jan21.adatom.g++.4 rename to examples/PACKAGES/agni/log.20Jan21.adatom.g++.4 diff --git a/examples/USER-MISC/agni/log.20Jan21.vacancy.g++.1 b/examples/PACKAGES/agni/log.20Jan21.vacancy.g++.1 similarity index 100% rename from examples/USER-MISC/agni/log.20Jan21.vacancy.g++.1 rename to examples/PACKAGES/agni/log.20Jan21.vacancy.g++.1 diff --git a/examples/USER-MISC/agni/log.20Jan21.vacancy.g++.4 b/examples/PACKAGES/agni/log.20Jan21.vacancy.g++.4 similarity index 100% rename from examples/USER-MISC/agni/log.20Jan21.vacancy.g++.4 rename to examples/PACKAGES/agni/log.20Jan21.vacancy.g++.4 diff --git a/examples/USER-MISC/agni/vacancy.data b/examples/PACKAGES/agni/vacancy.data similarity index 100% rename from examples/USER-MISC/agni/vacancy.data rename to examples/PACKAGES/agni/vacancy.data diff --git a/examples/USER-MISC/basal/almg.liu b/examples/PACKAGES/basal/almg.liu similarity index 100% rename from examples/USER-MISC/basal/almg.liu rename to examples/PACKAGES/basal/almg.liu diff --git a/examples/USER-MISC/basal/in.basal b/examples/PACKAGES/basal/in.basal similarity index 100% rename from examples/USER-MISC/basal/in.basal rename to examples/PACKAGES/basal/in.basal diff --git a/examples/USER-MISC/cauchy/NiAlH_jea.eam.alloy b/examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy similarity index 100% rename from examples/USER-MISC/cauchy/NiAlH_jea.eam.alloy rename to examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy diff --git a/examples/USER-MISC/cauchy/README b/examples/PACKAGES/cauchy/README similarity index 100% rename from examples/USER-MISC/cauchy/README rename to examples/PACKAGES/cauchy/README diff --git a/examples/USER-MISC/cauchy/in.cauchystat b/examples/PACKAGES/cauchy/in.cauchystat similarity index 100% rename from examples/USER-MISC/cauchy/in.cauchystat rename to examples/PACKAGES/cauchy/in.cauchystat diff --git a/examples/USER-MISC/cauchy/log.2Jun2020.cauchystat.g++.1 b/examples/PACKAGES/cauchy/log.2Jun2020.cauchystat.g++.1 similarity index 100% rename from examples/USER-MISC/cauchy/log.2Jun2020.cauchystat.g++.1 rename to examples/PACKAGES/cauchy/log.2Jun2020.cauchystat.g++.1 diff --git a/examples/USER-MISC/charge_regulation/README b/examples/PACKAGES/charge_regulation/README similarity index 100% rename from examples/USER-MISC/charge_regulation/README rename to examples/PACKAGES/charge_regulation/README diff --git a/examples/USER-MISC/charge_regulation/data.chreg-acid b/examples/PACKAGES/charge_regulation/data.chreg-acid similarity index 100% rename from examples/USER-MISC/charge_regulation/data.chreg-acid rename to examples/PACKAGES/charge_regulation/data.chreg-acid diff --git a/examples/USER-MISC/charge_regulation/data.chreg-acid-real b/examples/PACKAGES/charge_regulation/data.chreg-acid-real similarity index 100% rename from examples/USER-MISC/charge_regulation/data.chreg-acid-real rename to examples/PACKAGES/charge_regulation/data.chreg-acid-real diff --git a/examples/USER-MISC/charge_regulation/data.chreg-polymer b/examples/PACKAGES/charge_regulation/data.chreg-polymer similarity index 100% rename from examples/USER-MISC/charge_regulation/data.chreg-polymer rename to examples/PACKAGES/charge_regulation/data.chreg-polymer diff --git a/examples/USER-MISC/charge_regulation/in.chreg-acid b/examples/PACKAGES/charge_regulation/in.chreg-acid similarity index 100% rename from examples/USER-MISC/charge_regulation/in.chreg-acid rename to examples/PACKAGES/charge_regulation/in.chreg-acid diff --git a/examples/USER-MISC/charge_regulation/in.chreg-acid-real b/examples/PACKAGES/charge_regulation/in.chreg-acid-real similarity index 100% rename from examples/USER-MISC/charge_regulation/in.chreg-acid-real rename to examples/PACKAGES/charge_regulation/in.chreg-acid-real diff --git a/examples/USER-MISC/charge_regulation/in.chreg-polymer b/examples/PACKAGES/charge_regulation/in.chreg-polymer similarity index 100% rename from examples/USER-MISC/charge_regulation/in.chreg-polymer rename to examples/PACKAGES/charge_regulation/in.chreg-polymer diff --git a/examples/USER-MISC/charge_regulation/log.10Feb21.chreg-acid.g++.1 b/examples/PACKAGES/charge_regulation/log.10Feb21.chreg-acid.g++.1 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.10Feb21.chreg-acid.g++.1 rename to examples/PACKAGES/charge_regulation/log.10Feb21.chreg-acid.g++.1 diff --git a/examples/USER-MISC/charge_regulation/log.10Feb21.chreg-acid.g++.4 b/examples/PACKAGES/charge_regulation/log.10Feb21.chreg-acid.g++.4 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.10Feb21.chreg-acid.g++.4 rename to examples/PACKAGES/charge_regulation/log.10Feb21.chreg-acid.g++.4 diff --git a/examples/USER-MISC/charge_regulation/log.10Feb21.chreg-polymer.g++.1 b/examples/PACKAGES/charge_regulation/log.10Feb21.chreg-polymer.g++.1 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.10Feb21.chreg-polymer.g++.1 rename to examples/PACKAGES/charge_regulation/log.10Feb21.chreg-polymer.g++.1 diff --git a/examples/USER-MISC/charge_regulation/log.10Feb21.chreg-polymer.g++.4 b/examples/PACKAGES/charge_regulation/log.10Feb21.chreg-polymer.g++.4 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.10Feb21.chreg-polymer.g++.4 rename to examples/PACKAGES/charge_regulation/log.10Feb21.chreg-polymer.g++.4 diff --git a/examples/USER-MISC/charge_regulation/log.11Apr21.chreg-acid-real.g++.1 b/examples/PACKAGES/charge_regulation/log.11Apr21.chreg-acid-real.g++.1 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.11Apr21.chreg-acid-real.g++.1 rename to examples/PACKAGES/charge_regulation/log.11Apr21.chreg-acid-real.g++.1 diff --git a/examples/USER-MISC/charge_regulation/log.11Apr21.chreg-acid-real.g++.4 b/examples/PACKAGES/charge_regulation/log.11Apr21.chreg-acid-real.g++.4 similarity index 100% rename from examples/USER-MISC/charge_regulation/log.11Apr21.chreg-acid-real.g++.4 rename to examples/PACKAGES/charge_regulation/log.11Apr21.chreg-acid-real.g++.4 diff --git a/examples/USER-MISC/cnp/Cu_Mishin1.eam b/examples/PACKAGES/cnp/Cu_Mishin1.eam similarity index 100% rename from examples/USER-MISC/cnp/Cu_Mishin1.eam rename to examples/PACKAGES/cnp/Cu_Mishin1.eam diff --git a/examples/USER-MISC/cnp/in.cnp b/examples/PACKAGES/cnp/in.cnp similarity index 100% rename from examples/USER-MISC/cnp/in.cnp rename to examples/PACKAGES/cnp/in.cnp diff --git a/examples/USER-MISC/cnp/log.31May17.cnp.g++.4 b/examples/PACKAGES/cnp/log.31May17.cnp.g++.4 similarity index 100% rename from examples/USER-MISC/cnp/log.31May17.cnp.g++.4 rename to examples/PACKAGES/cnp/log.31May17.cnp.g++.4 diff --git a/examples/USER-MISC/e3b/README b/examples/PACKAGES/e3b/README similarity index 100% rename from examples/USER-MISC/e3b/README rename to examples/PACKAGES/e3b/README diff --git a/examples/USER-MISC/e3b/e3b_box.data b/examples/PACKAGES/e3b/e3b_box.data similarity index 100% rename from examples/USER-MISC/e3b/e3b_box.data rename to examples/PACKAGES/e3b/e3b_box.data diff --git a/examples/USER-MISC/e3b/in.e3b-tip4p2005 b/examples/PACKAGES/e3b/in.e3b-tip4p2005 similarity index 100% rename from examples/USER-MISC/e3b/in.e3b-tip4p2005 rename to examples/PACKAGES/e3b/in.e3b-tip4p2005 diff --git a/examples/USER-MISC/e3b/log.29Mar2019.e3b-tip4p2005.g++.1 b/examples/PACKAGES/e3b/log.29Mar2019.e3b-tip4p2005.g++.1 similarity index 100% rename from examples/USER-MISC/e3b/log.29Mar2019.e3b-tip4p2005.g++.1 rename to examples/PACKAGES/e3b/log.29Mar2019.e3b-tip4p2005.g++.1 diff --git a/examples/USER-MISC/e3b/log.29Mar2019.e3b-tip4p2005.g++.4 b/examples/PACKAGES/e3b/log.29Mar2019.e3b-tip4p2005.g++.4 similarity index 100% rename from examples/USER-MISC/e3b/log.29Mar2019.e3b-tip4p2005.g++.4 rename to examples/PACKAGES/e3b/log.29Mar2019.e3b-tip4p2005.g++.4 diff --git a/examples/USER-MISC/edip/Si.edip b/examples/PACKAGES/edip/Si.edip similarity index 100% rename from examples/USER-MISC/edip/Si.edip rename to examples/PACKAGES/edip/Si.edip diff --git a/examples/USER-MISC/edip/SiC.edip b/examples/PACKAGES/edip/SiC.edip similarity index 100% rename from examples/USER-MISC/edip/SiC.edip rename to examples/PACKAGES/edip/SiC.edip diff --git a/examples/USER-MISC/edip/data.SiC b/examples/PACKAGES/edip/data.SiC similarity index 100% rename from examples/USER-MISC/edip/data.SiC rename to examples/PACKAGES/edip/data.SiC diff --git a/examples/USER-MISC/edip/in.edip-Si b/examples/PACKAGES/edip/in.edip-Si similarity index 100% rename from examples/USER-MISC/edip/in.edip-Si rename to examples/PACKAGES/edip/in.edip-Si diff --git a/examples/USER-MISC/edip/in.edip-Si-multi b/examples/PACKAGES/edip/in.edip-Si-multi similarity index 100% rename from examples/USER-MISC/edip/in.edip-Si-multi rename to examples/PACKAGES/edip/in.edip-Si-multi diff --git a/examples/USER-MISC/edip/in.edip-SiC b/examples/PACKAGES/edip/in.edip-SiC similarity index 100% rename from examples/USER-MISC/edip/in.edip-SiC rename to examples/PACKAGES/edip/in.edip-SiC diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-Si-multi.1 b/examples/PACKAGES/edip/log.4May2017.g++.edip-Si-multi.1 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-Si-multi.1 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-Si-multi.1 diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-Si-multi.4 b/examples/PACKAGES/edip/log.4May2017.g++.edip-Si-multi.4 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-Si-multi.4 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-Si-multi.4 diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-Si.1 b/examples/PACKAGES/edip/log.4May2017.g++.edip-Si.1 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-Si.1 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-Si.1 diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-Si.4 b/examples/PACKAGES/edip/log.4May2017.g++.edip-Si.4 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-Si.4 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-Si.4 diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-SiC.1 b/examples/PACKAGES/edip/log.4May2017.g++.edip-SiC.1 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-SiC.1 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-SiC.1 diff --git a/examples/USER-MISC/edip/log.4May2017.g++.edip-SiC.4 b/examples/PACKAGES/edip/log.4May2017.g++.edip-SiC.4 similarity index 100% rename from examples/USER-MISC/edip/log.4May2017.g++.edip-SiC.4 rename to examples/PACKAGES/edip/log.4May2017.g++.edip-SiC.4 diff --git a/examples/USER-MISC/ees/Data_region b/examples/PACKAGES/ees/Data_region similarity index 100% rename from examples/USER-MISC/ees/Data_region rename to examples/PACKAGES/ees/Data_region diff --git a/examples/USER-MISC/ees/Data_wall b/examples/PACKAGES/ees/Data_wall similarity index 100% rename from examples/USER-MISC/ees/Data_wall rename to examples/PACKAGES/ees/Data_wall diff --git a/examples/USER-MISC/ees/README b/examples/PACKAGES/ees/README similarity index 100% rename from examples/USER-MISC/ees/README rename to examples/PACKAGES/ees/README diff --git a/examples/USER-MISC/ees/in.fix_wall b/examples/PACKAGES/ees/in.fix_wall similarity index 100% rename from examples/USER-MISC/ees/in.fix_wall rename to examples/PACKAGES/ees/in.fix_wall diff --git a/examples/USER-MISC/ees/in.fix_wall_region b/examples/PACKAGES/ees/in.fix_wall_region similarity index 100% rename from examples/USER-MISC/ees/in.fix_wall_region rename to examples/PACKAGES/ees/in.fix_wall_region diff --git a/examples/USER-MISC/ees/log.23Jun17.fix_wall.g++.1 b/examples/PACKAGES/ees/log.23Jun17.fix_wall.g++.1 similarity index 100% rename from examples/USER-MISC/ees/log.23Jun17.fix_wall.g++.1 rename to examples/PACKAGES/ees/log.23Jun17.fix_wall.g++.1 diff --git a/examples/USER-MISC/ees/log.23Jun17.fix_wall.g++.4 b/examples/PACKAGES/ees/log.23Jun17.fix_wall.g++.4 similarity index 100% rename from examples/USER-MISC/ees/log.23Jun17.fix_wall.g++.4 rename to examples/PACKAGES/ees/log.23Jun17.fix_wall.g++.4 diff --git a/examples/USER-MISC/ees/log.23Jun17.fix_wall_region.g++.1 b/examples/PACKAGES/ees/log.23Jun17.fix_wall_region.g++.1 similarity index 100% rename from examples/USER-MISC/ees/log.23Jun17.fix_wall_region.g++.1 rename to examples/PACKAGES/ees/log.23Jun17.fix_wall_region.g++.1 diff --git a/examples/USER-MISC/ees/log.23Jun17.fix_wall_region.g++.4 b/examples/PACKAGES/ees/log.23Jun17.fix_wall_region.g++.4 similarity index 100% rename from examples/USER-MISC/ees/log.23Jun17.fix_wall_region.g++.4 rename to examples/PACKAGES/ees/log.23Jun17.fix_wall_region.g++.4 diff --git a/examples/USER-MISC/electron_stopping/Si.Si.elstop b/examples/PACKAGES/electron_stopping/Si.Si.elstop similarity index 100% rename from examples/USER-MISC/electron_stopping/Si.Si.elstop rename to examples/PACKAGES/electron_stopping/Si.Si.elstop diff --git a/examples/USER-MISC/electron_stopping/Si.sw b/examples/PACKAGES/electron_stopping/Si.sw similarity index 100% rename from examples/USER-MISC/electron_stopping/Si.sw rename to examples/PACKAGES/electron_stopping/Si.sw diff --git a/examples/USER-MISC/electron_stopping/in.cascade_AlCu b/examples/PACKAGES/electron_stopping/in.cascade_AlCu similarity index 100% rename from examples/USER-MISC/electron_stopping/in.cascade_AlCu rename to examples/PACKAGES/electron_stopping/in.cascade_AlCu diff --git a/examples/USER-MISC/electron_stopping/in.cascade_SiSi b/examples/PACKAGES/electron_stopping/in.cascade_SiSi similarity index 100% rename from examples/USER-MISC/electron_stopping/in.cascade_SiSi rename to examples/PACKAGES/electron_stopping/in.cascade_SiSi diff --git a/examples/USER-MISC/electron_stopping/in.elstop b/examples/PACKAGES/electron_stopping/in.elstop similarity index 100% rename from examples/USER-MISC/electron_stopping/in.elstop rename to examples/PACKAGES/electron_stopping/in.elstop diff --git a/examples/USER-MISC/electron_stopping/in.elstop.only b/examples/PACKAGES/electron_stopping/in.elstop.only similarity index 100% rename from examples/USER-MISC/electron_stopping/in.elstop.only rename to examples/PACKAGES/electron_stopping/in.elstop.only diff --git a/examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_AlCu.intel.1 b/examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_AlCu.intel.1 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_AlCu.intel.1 rename to examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_AlCu.intel.1 diff --git a/examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_AlCu.intel.4 b/examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_AlCu.intel.4 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_AlCu.intel.4 rename to examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_AlCu.intel.4 diff --git a/examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_SiSi.intel.1 b/examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_SiSi.intel.1 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_SiSi.intel.1 rename to examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_SiSi.intel.1 diff --git a/examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_SiSi.intel.4 b/examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_SiSi.intel.4 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.18Sep2020.cascade_SiSi.intel.4 rename to examples/PACKAGES/electron_stopping/log.18Sep2020.cascade_SiSi.intel.4 diff --git a/examples/USER-MISC/electron_stopping/log.20Mar19.elstop.g++.1 b/examples/PACKAGES/electron_stopping/log.20Mar19.elstop.g++.1 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.20Mar19.elstop.g++.1 rename to examples/PACKAGES/electron_stopping/log.20Mar19.elstop.g++.1 diff --git a/examples/USER-MISC/electron_stopping/log.20Mar19.elstop.g++.4 b/examples/PACKAGES/electron_stopping/log.20Mar19.elstop.g++.4 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.20Mar19.elstop.g++.4 rename to examples/PACKAGES/electron_stopping/log.20Mar19.elstop.g++.4 diff --git a/examples/USER-MISC/electron_stopping/log.20Mar19.elstop.only.g++.1 b/examples/PACKAGES/electron_stopping/log.20Mar19.elstop.only.g++.1 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.20Mar19.elstop.only.g++.1 rename to examples/PACKAGES/electron_stopping/log.20Mar19.elstop.only.g++.1 diff --git a/examples/USER-MISC/electron_stopping/log.20Mar19.elstop.only.g++.4 b/examples/PACKAGES/electron_stopping/log.20Mar19.elstop.only.g++.4 similarity index 100% rename from examples/USER-MISC/electron_stopping/log.20Mar19.elstop.only.g++.4 rename to examples/PACKAGES/electron_stopping/log.20Mar19.elstop.only.g++.4 diff --git a/examples/USER-MISC/entropy/Na_MendelevM_2014.eam.fs b/examples/PACKAGES/entropy/Na_MendelevM_2014.eam.fs similarity index 100% rename from examples/USER-MISC/entropy/Na_MendelevM_2014.eam.fs rename to examples/PACKAGES/entropy/Na_MendelevM_2014.eam.fs diff --git a/examples/USER-MISC/entropy/data.interface b/examples/PACKAGES/entropy/data.interface similarity index 100% rename from examples/USER-MISC/entropy/data.interface rename to examples/PACKAGES/entropy/data.interface diff --git a/examples/USER-MISC/entropy/in.entropy b/examples/PACKAGES/entropy/in.entropy similarity index 100% rename from examples/USER-MISC/entropy/in.entropy rename to examples/PACKAGES/entropy/in.entropy diff --git a/examples/USER-MISC/entropy/log.entropy b/examples/PACKAGES/entropy/log.entropy similarity index 100% rename from examples/USER-MISC/entropy/log.entropy rename to examples/PACKAGES/entropy/log.entropy diff --git a/examples/USER-MISC/extep/BN.data b/examples/PACKAGES/extep/BN.data similarity index 100% rename from examples/USER-MISC/extep/BN.data rename to examples/PACKAGES/extep/BN.data diff --git a/examples/USER-MISC/extep/in.extep-bn b/examples/PACKAGES/extep/in.extep-bn similarity index 100% rename from examples/USER-MISC/extep/in.extep-bn rename to examples/PACKAGES/extep/in.extep-bn diff --git a/examples/USER-MISC/extep/log.23Oct17.extep-bn.g++.1 b/examples/PACKAGES/extep/log.23Oct17.extep-bn.g++.1 similarity index 100% rename from examples/USER-MISC/extep/log.23Oct17.extep-bn.g++.1 rename to examples/PACKAGES/extep/log.23Oct17.extep-bn.g++.1 diff --git a/examples/USER-MISC/extep/log.23Oct17.extep-bn.g++.4 b/examples/PACKAGES/extep/log.23Oct17.extep-bn.g++.4 similarity index 100% rename from examples/USER-MISC/extep/log.23Oct17.extep-bn.g++.4 rename to examples/PACKAGES/extep/log.23Oct17.extep-bn.g++.4 diff --git a/examples/USER-MISC/filter_corotate/data.bpti b/examples/PACKAGES/filter_corotate/data.bpti similarity index 100% rename from examples/USER-MISC/filter_corotate/data.bpti rename to examples/PACKAGES/filter_corotate/data.bpti diff --git a/examples/USER-MISC/filter_corotate/data.peptide b/examples/PACKAGES/filter_corotate/data.peptide similarity index 100% rename from examples/USER-MISC/filter_corotate/data.peptide rename to examples/PACKAGES/filter_corotate/data.peptide diff --git a/examples/USER-MISC/filter_corotate/in.bpti b/examples/PACKAGES/filter_corotate/in.bpti similarity index 100% rename from examples/USER-MISC/filter_corotate/in.bpti rename to examples/PACKAGES/filter_corotate/in.bpti diff --git a/examples/USER-MISC/filter_corotate/in.peptide b/examples/PACKAGES/filter_corotate/in.peptide similarity index 100% rename from examples/USER-MISC/filter_corotate/in.peptide rename to examples/PACKAGES/filter_corotate/in.peptide diff --git a/examples/USER-MISC/filter_corotate/log.22Jun2017.bpti.g++.1 b/examples/PACKAGES/filter_corotate/log.22Jun2017.bpti.g++.1 similarity index 100% rename from examples/USER-MISC/filter_corotate/log.22Jun2017.bpti.g++.1 rename to examples/PACKAGES/filter_corotate/log.22Jun2017.bpti.g++.1 diff --git a/examples/USER-MISC/filter_corotate/log.22Jun2017.bpti.g++.4 b/examples/PACKAGES/filter_corotate/log.22Jun2017.bpti.g++.4 similarity index 100% rename from examples/USER-MISC/filter_corotate/log.22Jun2017.bpti.g++.4 rename to examples/PACKAGES/filter_corotate/log.22Jun2017.bpti.g++.4 diff --git a/examples/USER-MISC/filter_corotate/log.22Jun2017.peptide.g++.1 b/examples/PACKAGES/filter_corotate/log.22Jun2017.peptide.g++.1 similarity index 100% rename from examples/USER-MISC/filter_corotate/log.22Jun2017.peptide.g++.1 rename to examples/PACKAGES/filter_corotate/log.22Jun2017.peptide.g++.1 diff --git a/examples/USER-MISC/filter_corotate/log.22Jun2017.peptide.g++.4 b/examples/PACKAGES/filter_corotate/log.22Jun2017.peptide.g++.4 similarity index 100% rename from examples/USER-MISC/filter_corotate/log.22Jun2017.peptide.g++.4 rename to examples/PACKAGES/filter_corotate/log.22Jun2017.peptide.g++.4 diff --git a/examples/USER-MISC/flow_gauss/README b/examples/PACKAGES/flow_gauss/README similarity index 100% rename from examples/USER-MISC/flow_gauss/README rename to examples/PACKAGES/flow_gauss/README diff --git a/examples/USER-MISC/flow_gauss/in.GD b/examples/PACKAGES/flow_gauss/in.GD similarity index 100% rename from examples/USER-MISC/flow_gauss/in.GD rename to examples/PACKAGES/flow_gauss/in.GD diff --git a/examples/USER-MISC/flow_gauss/log.6Jul17.GD.g++.1 b/examples/PACKAGES/flow_gauss/log.6Jul17.GD.g++.1 similarity index 100% rename from examples/USER-MISC/flow_gauss/log.6Jul17.GD.g++.1 rename to examples/PACKAGES/flow_gauss/log.6Jul17.GD.g++.1 diff --git a/examples/USER-MISC/flow_gauss/log.6Jul17.GD.g++.4 b/examples/PACKAGES/flow_gauss/log.6Jul17.GD.g++.4 similarity index 100% rename from examples/USER-MISC/flow_gauss/log.6Jul17.GD.g++.4 rename to examples/PACKAGES/flow_gauss/log.6Jul17.GD.g++.4 diff --git a/examples/USER-MISC/flow_gauss/output-files/GD.out b/examples/PACKAGES/flow_gauss/output-files/GD.out similarity index 100% rename from examples/USER-MISC/flow_gauss/output-files/GD.out rename to examples/PACKAGES/flow_gauss/output-files/GD.out diff --git a/examples/USER-MISC/flow_gauss/output-files/Vy_profile b/examples/PACKAGES/flow_gauss/output-files/Vy_profile similarity index 100% rename from examples/USER-MISC/flow_gauss/output-files/Vy_profile rename to examples/PACKAGES/flow_gauss/output-files/Vy_profile diff --git a/examples/USER-MISC/flow_gauss/output-files/x_profiles b/examples/PACKAGES/flow_gauss/output-files/x_profiles similarity index 100% rename from examples/USER-MISC/flow_gauss/output-files/x_profiles rename to examples/PACKAGES/flow_gauss/output-files/x_profiles diff --git a/examples/USER-MISC/gauss_diel/data.gauss-diel b/examples/PACKAGES/gauss_diel/data.gauss-diel similarity index 100% rename from examples/USER-MISC/gauss_diel/data.gauss-diel rename to examples/PACKAGES/gauss_diel/data.gauss-diel diff --git a/examples/USER-MISC/gauss_diel/in.gauss-diel b/examples/PACKAGES/gauss_diel/in.gauss-diel similarity index 100% rename from examples/USER-MISC/gauss_diel/in.gauss-diel rename to examples/PACKAGES/gauss_diel/in.gauss-diel diff --git a/examples/USER-MISC/gauss_diel/in.gauss-diel-cg b/examples/PACKAGES/gauss_diel/in.gauss-diel-cg similarity index 100% rename from examples/USER-MISC/gauss_diel/in.gauss-diel-cg rename to examples/PACKAGES/gauss_diel/in.gauss-diel-cg diff --git a/examples/USER-MISC/gauss_diel/in.gauss-diel-split b/examples/PACKAGES/gauss_diel/in.gauss-diel-split similarity index 100% rename from examples/USER-MISC/gauss_diel/in.gauss-diel-split rename to examples/PACKAGES/gauss_diel/in.gauss-diel-split diff --git a/examples/USER-MISC/gauss_diel/log.gauss-diel b/examples/PACKAGES/gauss_diel/log.gauss-diel similarity index 100% rename from examples/USER-MISC/gauss_diel/log.gauss-diel rename to examples/PACKAGES/gauss_diel/log.gauss-diel diff --git a/examples/USER-MISC/gauss_diel/log.gauss-diel-cg b/examples/PACKAGES/gauss_diel/log.gauss-diel-cg similarity index 100% rename from examples/USER-MISC/gauss_diel/log.gauss-diel-cg rename to examples/PACKAGES/gauss_diel/log.gauss-diel-cg diff --git a/examples/USER-MISC/gauss_diel/log.gauss-diel-split b/examples/PACKAGES/gauss_diel/log.gauss-diel-split similarity index 100% rename from examples/USER-MISC/gauss_diel/log.gauss-diel-split rename to examples/PACKAGES/gauss_diel/log.gauss-diel-split diff --git a/examples/USER-MISC/hma/README b/examples/PACKAGES/hma/README similarity index 100% rename from examples/USER-MISC/hma/README rename to examples/PACKAGES/hma/README diff --git a/examples/USER-MISC/hma/hma.in b/examples/PACKAGES/hma/hma.in similarity index 100% rename from examples/USER-MISC/hma/hma.in rename to examples/PACKAGES/hma/hma.in diff --git a/examples/USER-MISC/hma/log.6Nov18.hma.g++.1 b/examples/PACKAGES/hma/log.6Nov18.hma.g++.1 similarity index 100% rename from examples/USER-MISC/hma/log.6Nov18.hma.g++.1 rename to examples/PACKAGES/hma/log.6Nov18.hma.g++.1 diff --git a/examples/USER-MISC/hma/log.6Nov18.hma.g++.4 b/examples/PACKAGES/hma/log.6Nov18.hma.g++.4 similarity index 100% rename from examples/USER-MISC/hma/log.6Nov18.hma.g++.4 rename to examples/PACKAGES/hma/log.6Nov18.hma.g++.4 diff --git a/examples/USER-MISC/ipi/C.opt.tersoff b/examples/PACKAGES/ipi/C.opt.tersoff similarity index 100% rename from examples/USER-MISC/ipi/C.opt.tersoff rename to examples/PACKAGES/ipi/C.opt.tersoff diff --git a/examples/USER-MISC/ipi/README b/examples/PACKAGES/ipi/README similarity index 100% rename from examples/USER-MISC/ipi/README rename to examples/PACKAGES/ipi/README diff --git a/examples/USER-MISC/ipi/data.graphene b/examples/PACKAGES/ipi/data.graphene similarity index 100% rename from examples/USER-MISC/ipi/data.graphene rename to examples/PACKAGES/ipi/data.graphene diff --git a/examples/USER-MISC/ipi/i-pi_input.xml b/examples/PACKAGES/ipi/i-pi_input.xml similarity index 100% rename from examples/USER-MISC/ipi/i-pi_input.xml rename to examples/PACKAGES/ipi/i-pi_input.xml diff --git a/examples/USER-MISC/ipi/i-pi_positions.xyz b/examples/PACKAGES/ipi/i-pi_positions.xyz similarity index 100% rename from examples/USER-MISC/ipi/i-pi_positions.xyz rename to examples/PACKAGES/ipi/i-pi_positions.xyz diff --git a/examples/USER-MISC/ipi/in.graphene b/examples/PACKAGES/ipi/in.graphene similarity index 100% rename from examples/USER-MISC/ipi/in.graphene rename to examples/PACKAGES/ipi/in.graphene diff --git a/examples/USER-MISC/local_density/benzene_water/benzene_water.data b/examples/PACKAGES/local_density/benzene_water/benzene_water.data similarity index 100% rename from examples/USER-MISC/local_density/benzene_water/benzene_water.data rename to examples/PACKAGES/local_density/benzene_water/benzene_water.data diff --git a/examples/USER-MISC/local_density/benzene_water/benzene_water.in b/examples/PACKAGES/local_density/benzene_water/benzene_water.in similarity index 100% rename from examples/USER-MISC/local_density/benzene_water/benzene_water.in rename to examples/PACKAGES/local_density/benzene_water/benzene_water.in diff --git a/examples/USER-MISC/local_density/benzene_water/benzene_water.localdensity.table b/examples/PACKAGES/local_density/benzene_water/benzene_water.localdensity.table similarity index 100% rename from examples/USER-MISC/local_density/benzene_water/benzene_water.localdensity.table rename to examples/PACKAGES/local_density/benzene_water/benzene_water.localdensity.table diff --git a/examples/USER-MISC/local_density/benzene_water/benzene_water.pair.table b/examples/PACKAGES/local_density/benzene_water/benzene_water.pair.table similarity index 100% rename from examples/USER-MISC/local_density/benzene_water/benzene_water.pair.table rename to examples/PACKAGES/local_density/benzene_water/benzene_water.pair.table diff --git a/examples/USER-MISC/local_density/benzene_water/log.04Sep19.g++.1 b/examples/PACKAGES/local_density/benzene_water/log.04Sep19.g++.1 similarity index 100% rename from examples/USER-MISC/local_density/benzene_water/log.04Sep19.g++.1 rename to examples/PACKAGES/local_density/benzene_water/log.04Sep19.g++.1 diff --git a/examples/USER-MISC/local_density/methanol_implicit_water/log.04Sep19.g++.1 b/examples/PACKAGES/local_density/methanol_implicit_water/log.04Sep19.g++.1 similarity index 100% rename from examples/USER-MISC/local_density/methanol_implicit_water/log.04Sep19.g++.1 rename to examples/PACKAGES/local_density/methanol_implicit_water/log.04Sep19.g++.1 diff --git a/examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.data b/examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.data similarity index 100% rename from examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.data rename to examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.data diff --git a/examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.in b/examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.in similarity index 100% rename from examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.in rename to examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.in diff --git a/examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.localdensity.table b/examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.localdensity.table similarity index 100% rename from examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.localdensity.table rename to examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.localdensity.table diff --git a/examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.pair.table b/examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.pair.table similarity index 100% rename from examples/USER-MISC/local_density/methanol_implicit_water/methanol_implicit_water.pair.table rename to examples/PACKAGES/local_density/methanol_implicit_water/methanol_implicit_water.pair.table diff --git a/examples/USER-MISC/meam_spline/Si_1.meam.spline b/examples/PACKAGES/meam_spline/Si_1.meam.spline similarity index 100% rename from examples/USER-MISC/meam_spline/Si_1.meam.spline rename to examples/PACKAGES/meam_spline/Si_1.meam.spline diff --git a/examples/USER-MISC/meam_spline/TiO.meam.spline b/examples/PACKAGES/meam_spline/TiO.meam.spline similarity index 100% rename from examples/USER-MISC/meam_spline/TiO.meam.spline rename to examples/PACKAGES/meam_spline/TiO.meam.spline diff --git a/examples/USER-MISC/meam_spline/in.meam-spline.Si b/examples/PACKAGES/meam_spline/in.meam-spline.Si similarity index 100% rename from examples/USER-MISC/meam_spline/in.meam-spline.Si rename to examples/PACKAGES/meam_spline/in.meam-spline.Si diff --git a/examples/USER-MISC/meam_spline/in.meam-spline.TiO2 b/examples/PACKAGES/meam_spline/in.meam-spline.TiO2 similarity index 100% rename from examples/USER-MISC/meam_spline/in.meam-spline.TiO2 rename to examples/PACKAGES/meam_spline/in.meam-spline.TiO2 diff --git a/examples/USER-MISC/meam_spline/log.4May2017.meam-spline.Si.g++.1 b/examples/PACKAGES/meam_spline/log.4May2017.meam-spline.Si.g++.1 similarity index 100% rename from examples/USER-MISC/meam_spline/log.4May2017.meam-spline.Si.g++.1 rename to examples/PACKAGES/meam_spline/log.4May2017.meam-spline.Si.g++.1 diff --git a/examples/USER-MISC/meam_spline/log.4May2017.meam-spline.Si.g++.4 b/examples/PACKAGES/meam_spline/log.4May2017.meam-spline.Si.g++.4 similarity index 100% rename from examples/USER-MISC/meam_spline/log.4May2017.meam-spline.Si.g++.4 rename to examples/PACKAGES/meam_spline/log.4May2017.meam-spline.Si.g++.4 diff --git a/examples/USER-MISC/meam_spline/log.4May2017.meam-spline.TiO2.g++.1 b/examples/PACKAGES/meam_spline/log.4May2017.meam-spline.TiO2.g++.1 similarity index 100% rename from examples/USER-MISC/meam_spline/log.4May2017.meam-spline.TiO2.g++.1 rename to examples/PACKAGES/meam_spline/log.4May2017.meam-spline.TiO2.g++.1 diff --git a/examples/USER-MISC/meam_spline/log.4May2017.meam-spline.TiO2.g++.4 b/examples/PACKAGES/meam_spline/log.4May2017.meam-spline.TiO2.g++.4 similarity index 100% rename from examples/USER-MISC/meam_spline/log.4May2017.meam-spline.TiO2.g++.4 rename to examples/PACKAGES/meam_spline/log.4May2017.meam-spline.TiO2.g++.4 diff --git a/examples/USER-MISC/meam_sw_spline/Si/bcc.in b/examples/PACKAGES/meam_sw_spline/Si/bcc.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/bcc.in rename to examples/PACKAGES/meam_sw_spline/Si/bcc.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/bcc_relax.in b/examples/PACKAGES/meam_sw_spline/Si/bcc_relax.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/bcc_relax.in rename to examples/PACKAGES/meam_sw_spline/Si/bcc_relax.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/dc.in b/examples/PACKAGES/meam_sw_spline/Si/dc.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/dc.in rename to examples/PACKAGES/meam_sw_spline/Si/dc.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/dc_relax.in b/examples/PACKAGES/meam_sw_spline/Si/dc_relax.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/dc_relax.in rename to examples/PACKAGES/meam_sw_spline/Si/dc_relax.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/energy_conservation.meam.sw.in b/examples/PACKAGES/meam_sw_spline/Si/energy_conservation.meam.sw.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/energy_conservation.meam.sw.in rename to examples/PACKAGES/meam_sw_spline/Si/energy_conservation.meam.sw.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/fcc.in b/examples/PACKAGES/meam_sw_spline/Si/fcc.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/fcc.in rename to examples/PACKAGES/meam_sw_spline/Si/fcc.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/fcc_relax.in b/examples/PACKAGES/meam_sw_spline/Si/fcc_relax.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/fcc_relax.in rename to examples/PACKAGES/meam_sw_spline/Si/fcc_relax.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/hcp_relax.in b/examples/PACKAGES/meam_sw_spline/Si/hcp_relax.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/hcp_relax.in rename to examples/PACKAGES/meam_sw_spline/Si/hcp_relax.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/sc.in b/examples/PACKAGES/meam_sw_spline/Si/sc.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/sc.in rename to examples/PACKAGES/meam_sw_spline/Si/sc.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/sc_relax.in b/examples/PACKAGES/meam_sw_spline/Si/sc_relax.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/sc_relax.in rename to examples/PACKAGES/meam_sw_spline/Si/sc_relax.in diff --git a/examples/USER-MISC/meam_sw_spline/Si/single_atom.in b/examples/PACKAGES/meam_sw_spline/Si/single_atom.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Si/single_atom.in rename to examples/PACKAGES/meam_sw_spline/Si/single_atom.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/alpha.in b/examples/PACKAGES/meam_sw_spline/Ti/alpha.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/alpha.in rename to examples/PACKAGES/meam_sw_spline/Ti/alpha.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/alpha_relaxation.in b/examples/PACKAGES/meam_sw_spline/Ti/alpha_relaxation.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/alpha_relaxation.in rename to examples/PACKAGES/meam_sw_spline/Ti/alpha_relaxation.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/beta.in b/examples/PACKAGES/meam_sw_spline/Ti/beta.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/beta.in rename to examples/PACKAGES/meam_sw_spline/Ti/beta.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/energy_conservation.meam.sw.in b/examples/PACKAGES/meam_sw_spline/Ti/energy_conservation.meam.sw.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/energy_conservation.meam.sw.in rename to examples/PACKAGES/meam_sw_spline/Ti/energy_conservation.meam.sw.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/fcc.in b/examples/PACKAGES/meam_sw_spline/Ti/fcc.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/fcc.in rename to examples/PACKAGES/meam_sw_spline/Ti/fcc.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/hexagonal.in b/examples/PACKAGES/meam_sw_spline/Ti/hexagonal.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/hexagonal.in rename to examples/PACKAGES/meam_sw_spline/Ti/hexagonal.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/omega.in b/examples/PACKAGES/meam_sw_spline/Ti/omega.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/omega.in rename to examples/PACKAGES/meam_sw_spline/Ti/omega.in diff --git a/examples/USER-MISC/meam_sw_spline/Ti/single_atom.in b/examples/PACKAGES/meam_sw_spline/Ti/single_atom.in similarity index 100% rename from examples/USER-MISC/meam_sw_spline/Ti/single_atom.in rename to examples/PACKAGES/meam_sw_spline/Ti/single_atom.in diff --git a/examples/USER-MISC/momb/Ag_O1X5.5_O2X0.55.eam.fs b/examples/PACKAGES/momb/Ag_O1X5.5_O2X0.55.eam.fs similarity index 100% rename from examples/USER-MISC/momb/Ag_O1X5.5_O2X0.55.eam.fs rename to examples/PACKAGES/momb/Ag_O1X5.5_O2X0.55.eam.fs diff --git a/examples/USER-MISC/momb/README b/examples/PACKAGES/momb/README similarity index 100% rename from examples/USER-MISC/momb/README rename to examples/PACKAGES/momb/README diff --git a/examples/USER-MISC/momb/in.system b/examples/PACKAGES/momb/in.system similarity index 100% rename from examples/USER-MISC/momb/in.system rename to examples/PACKAGES/momb/in.system diff --git a/examples/USER-MISC/momb/log.17Mar2017.system.g++.1 b/examples/PACKAGES/momb/log.17Mar2017.system.g++.1 similarity index 100% rename from examples/USER-MISC/momb/log.17Mar2017.system.g++.1 rename to examples/PACKAGES/momb/log.17Mar2017.system.g++.1 diff --git a/examples/USER-MISC/momb/log.17Mar2017.system.g++.4 b/examples/PACKAGES/momb/log.17Mar2017.system.g++.4 similarity index 100% rename from examples/USER-MISC/momb/log.17Mar2017.system.g++.4 rename to examples/PACKAGES/momb/log.17Mar2017.system.g++.4 diff --git a/examples/USER-MISC/momb/system.data b/examples/PACKAGES/momb/system.data similarity index 100% rename from examples/USER-MISC/momb/system.data rename to examples/PACKAGES/momb/system.data diff --git a/examples/USER-MISC/momentum/in.momentum b/examples/PACKAGES/momentum/in.momentum similarity index 100% rename from examples/USER-MISC/momentum/in.momentum rename to examples/PACKAGES/momentum/in.momentum diff --git a/examples/USER-MISC/mop/data.mop b/examples/PACKAGES/mop/data.mop similarity index 100% rename from examples/USER-MISC/mop/data.mop rename to examples/PACKAGES/mop/data.mop diff --git a/examples/USER-MISC/mop/in.compute_stress_mop b/examples/PACKAGES/mop/in.compute_stress_mop similarity index 100% rename from examples/USER-MISC/mop/in.compute_stress_mop rename to examples/PACKAGES/mop/in.compute_stress_mop diff --git a/examples/USER-MISC/mop/log.5Sep18.compute_stress_mop.g++.1 b/examples/PACKAGES/mop/log.5Sep18.compute_stress_mop.g++.1 similarity index 100% rename from examples/USER-MISC/mop/log.5Sep18.compute_stress_mop.g++.1 rename to examples/PACKAGES/mop/log.5Sep18.compute_stress_mop.g++.1 diff --git a/examples/USER-MISC/mop/log.5Sep18.compute_stress_mop.g++.4 b/examples/PACKAGES/mop/log.5Sep18.compute_stress_mop.g++.4 similarity index 100% rename from examples/USER-MISC/mop/log.5Sep18.compute_stress_mop.g++.4 rename to examples/PACKAGES/mop/log.5Sep18.compute_stress_mop.g++.4 diff --git a/examples/USER-MISC/mop/moppz.time.reference b/examples/PACKAGES/mop/moppz.time.reference similarity index 100% rename from examples/USER-MISC/mop/moppz.time.reference rename to examples/PACKAGES/mop/moppz.time.reference diff --git a/examples/USER-MISC/mop/mopz0.time.reference b/examples/PACKAGES/mop/mopz0.time.reference similarity index 100% rename from examples/USER-MISC/mop/mopz0.time.reference rename to examples/PACKAGES/mop/mopz0.time.reference diff --git a/examples/USER-MISC/orient_eco/Ni_u3.eam b/examples/PACKAGES/orient_eco/Ni_u3.eam similarity index 100% rename from examples/USER-MISC/orient_eco/Ni_u3.eam rename to examples/PACKAGES/orient_eco/Ni_u3.eam diff --git a/examples/USER-MISC/orient_eco/data.sigma5 b/examples/PACKAGES/orient_eco/data.sigma5 similarity index 100% rename from examples/USER-MISC/orient_eco/data.sigma5 rename to examples/PACKAGES/orient_eco/data.sigma5 diff --git a/examples/USER-MISC/orient_eco/in.orient_eco b/examples/PACKAGES/orient_eco/in.orient_eco similarity index 100% rename from examples/USER-MISC/orient_eco/in.orient_eco rename to examples/PACKAGES/orient_eco/in.orient_eco diff --git a/examples/USER-MISC/orient_eco/log.2Jun2020.orent_eco.g++.1 b/examples/PACKAGES/orient_eco/log.2Jun2020.orent_eco.g++.1 similarity index 100% rename from examples/USER-MISC/orient_eco/log.2Jun2020.orent_eco.g++.1 rename to examples/PACKAGES/orient_eco/log.2Jun2020.orent_eco.g++.1 diff --git a/examples/USER-MISC/orient_eco/log.2Jun2020.orent_eco.g++.4 b/examples/PACKAGES/orient_eco/log.2Jun2020.orent_eco.g++.4 similarity index 100% rename from examples/USER-MISC/orient_eco/log.2Jun2020.orent_eco.g++.4 rename to examples/PACKAGES/orient_eco/log.2Jun2020.orent_eco.g++.4 diff --git a/examples/USER-MISC/orient_eco/sigma5.ori b/examples/PACKAGES/orient_eco/sigma5.ori similarity index 100% rename from examples/USER-MISC/orient_eco/sigma5.ori rename to examples/PACKAGES/orient_eco/sigma5.ori diff --git a/examples/USER-MISC/pafi/.gitignore b/examples/PACKAGES/pafi/.gitignore similarity index 100% rename from examples/USER-MISC/pafi/.gitignore rename to examples/PACKAGES/pafi/.gitignore diff --git a/examples/USER-MISC/pafi/README b/examples/PACKAGES/pafi/README similarity index 100% rename from examples/USER-MISC/pafi/README rename to examples/PACKAGES/pafi/README diff --git a/examples/USER-MISC/pafi/in.pafi b/examples/PACKAGES/pafi/in.pafi similarity index 100% rename from examples/USER-MISC/pafi/in.pafi rename to examples/PACKAGES/pafi/in.pafi diff --git a/examples/USER-MISC/pafi/log.15Apr20.pafi.g++.1 b/examples/PACKAGES/pafi/log.15Apr20.pafi.g++.1 similarity index 100% rename from examples/USER-MISC/pafi/log.15Apr20.pafi.g++.1 rename to examples/PACKAGES/pafi/log.15Apr20.pafi.g++.1 diff --git a/examples/USER-MISC/pafi/log.15Apr20.pafi.g++.4 b/examples/PACKAGES/pafi/log.15Apr20.pafi.g++.4 similarity index 100% rename from examples/USER-MISC/pafi/log.15Apr20.pafi.g++.4 rename to examples/PACKAGES/pafi/log.15Apr20.pafi.g++.4 diff --git a/examples/USER-MISC/pafi/pafipath.4.data b/examples/PACKAGES/pafi/pafipath.4.data similarity index 100% rename from examples/USER-MISC/pafi/pafipath.4.data rename to examples/PACKAGES/pafi/pafipath.4.data diff --git a/examples/USER-MISC/pimd/para-h2/H2.data b/examples/PACKAGES/pimd/para-h2/H2.data similarity index 100% rename from examples/USER-MISC/pimd/para-h2/H2.data rename to examples/PACKAGES/pimd/para-h2/H2.data diff --git a/examples/USER-MISC/pimd/para-h2/H2.xyz b/examples/PACKAGES/pimd/para-h2/H2.xyz similarity index 100% rename from examples/USER-MISC/pimd/para-h2/H2.xyz rename to examples/PACKAGES/pimd/para-h2/H2.xyz diff --git a/examples/USER-MISC/pimd/para-h2/NM.info b/examples/PACKAGES/pimd/para-h2/NM.info similarity index 100% rename from examples/USER-MISC/pimd/para-h2/NM.info rename to examples/PACKAGES/pimd/para-h2/NM.info diff --git a/examples/USER-MISC/pimd/para-h2/in.scp b/examples/PACKAGES/pimd/para-h2/in.scp similarity index 100% rename from examples/USER-MISC/pimd/para-h2/in.scp rename to examples/PACKAGES/pimd/para-h2/in.scp diff --git a/examples/USER-MISC/pimd/para-h2/pair.table b/examples/PACKAGES/pimd/para-h2/pair.table similarity index 100% rename from examples/USER-MISC/pimd/para-h2/pair.table rename to examples/PACKAGES/pimd/para-h2/pair.table diff --git a/examples/USER-MISC/pimd/para-h2/run.sh b/examples/PACKAGES/pimd/para-h2/run.sh similarity index 100% rename from examples/USER-MISC/pimd/para-h2/run.sh rename to examples/PACKAGES/pimd/para-h2/run.sh diff --git a/examples/USER-MISC/pimd/para-h2/vmd.src b/examples/PACKAGES/pimd/para-h2/vmd.src similarity index 100% rename from examples/USER-MISC/pimd/para-h2/vmd.src rename to examples/PACKAGES/pimd/para-h2/vmd.src diff --git a/examples/USER-MISC/pimd/prot-hairpin/in.scp b/examples/PACKAGES/pimd/prot-hairpin/in.scp similarity index 100% rename from examples/USER-MISC/pimd/prot-hairpin/in.scp rename to examples/PACKAGES/pimd/prot-hairpin/in.scp diff --git a/examples/USER-MISC/pimd/prot-hairpin/run.sh b/examples/PACKAGES/pimd/prot-hairpin/run.sh similarity index 100% rename from examples/USER-MISC/pimd/prot-hairpin/run.sh rename to examples/PACKAGES/pimd/prot-hairpin/run.sh diff --git a/examples/USER-MISC/pimd/prot-hairpin/system.data b/examples/PACKAGES/pimd/prot-hairpin/system.data similarity index 100% rename from examples/USER-MISC/pimd/prot-hairpin/system.data rename to examples/PACKAGES/pimd/prot-hairpin/system.data diff --git a/examples/USER-MISC/rhok/README.md b/examples/PACKAGES/rhok/README.md similarity index 100% rename from examples/USER-MISC/rhok/README.md rename to examples/PACKAGES/rhok/README.md diff --git a/examples/USER-MISC/rhok/in.crystal b/examples/PACKAGES/rhok/in.crystal similarity index 100% rename from examples/USER-MISC/rhok/in.crystal rename to examples/PACKAGES/rhok/in.crystal diff --git a/examples/USER-MISC/rhok/in.pinning b/examples/PACKAGES/rhok/in.pinning similarity index 100% rename from examples/USER-MISC/rhok/in.pinning rename to examples/PACKAGES/rhok/in.pinning diff --git a/examples/USER-MISC/rhok/in.setup b/examples/PACKAGES/rhok/in.setup similarity index 100% rename from examples/USER-MISC/rhok/in.setup rename to examples/PACKAGES/rhok/in.setup diff --git a/examples/USER-MISC/rhok/log.22Sep2017.crystal.g++.1 b/examples/PACKAGES/rhok/log.22Sep2017.crystal.g++.1 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.crystal.g++.1 rename to examples/PACKAGES/rhok/log.22Sep2017.crystal.g++.1 diff --git a/examples/USER-MISC/rhok/log.22Sep2017.crystal.g++.4 b/examples/PACKAGES/rhok/log.22Sep2017.crystal.g++.4 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.crystal.g++.4 rename to examples/PACKAGES/rhok/log.22Sep2017.crystal.g++.4 diff --git a/examples/USER-MISC/rhok/log.22Sep2017.pinning.g++.1 b/examples/PACKAGES/rhok/log.22Sep2017.pinning.g++.1 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.pinning.g++.1 rename to examples/PACKAGES/rhok/log.22Sep2017.pinning.g++.1 diff --git a/examples/USER-MISC/rhok/log.22Sep2017.pinning.g++.4 b/examples/PACKAGES/rhok/log.22Sep2017.pinning.g++.4 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.pinning.g++.4 rename to examples/PACKAGES/rhok/log.22Sep2017.pinning.g++.4 diff --git a/examples/USER-MISC/rhok/log.22Sep2017.setup.g++.1 b/examples/PACKAGES/rhok/log.22Sep2017.setup.g++.1 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.setup.g++.1 rename to examples/PACKAGES/rhok/log.22Sep2017.setup.g++.1 diff --git a/examples/USER-MISC/rhok/log.22Sep2017.setup.g++.4 b/examples/PACKAGES/rhok/log.22Sep2017.setup.g++.4 similarity index 100% rename from examples/USER-MISC/rhok/log.22Sep2017.setup.g++.4 rename to examples/PACKAGES/rhok/log.22Sep2017.setup.g++.4 diff --git a/examples/USER-MISC/slater/data.after_equilibration b/examples/PACKAGES/slater/data.after_equilibration similarity index 100% rename from examples/USER-MISC/slater/data.after_equilibration rename to examples/PACKAGES/slater/data.after_equilibration diff --git a/examples/USER-MISC/slater/data.after_production_run b/examples/PACKAGES/slater/data.after_production_run similarity index 100% rename from examples/USER-MISC/slater/data.after_production_run rename to examples/PACKAGES/slater/data.after_production_run diff --git a/examples/USER-MISC/slater/in.slater b/examples/PACKAGES/slater/in.slater similarity index 100% rename from examples/USER-MISC/slater/in.slater rename to examples/PACKAGES/slater/in.slater diff --git a/examples/USER-MISC/slater/log.lammps b/examples/PACKAGES/slater/log.lammps similarity index 100% rename from examples/USER-MISC/slater/log.lammps rename to examples/PACKAGES/slater/log.lammps diff --git a/examples/USER-MISC/slater/tmp_1_1.rdf b/examples/PACKAGES/slater/tmp_1_1.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_1_1.rdf rename to examples/PACKAGES/slater/tmp_1_1.rdf diff --git a/examples/USER-MISC/slater/tmp_1_2.rdf b/examples/PACKAGES/slater/tmp_1_2.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_1_2.rdf rename to examples/PACKAGES/slater/tmp_1_2.rdf diff --git a/examples/USER-MISC/slater/tmp_1_3.rdf b/examples/PACKAGES/slater/tmp_1_3.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_1_3.rdf rename to examples/PACKAGES/slater/tmp_1_3.rdf diff --git a/examples/USER-MISC/slater/tmp_2_2.rdf b/examples/PACKAGES/slater/tmp_2_2.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_2_2.rdf rename to examples/PACKAGES/slater/tmp_2_2.rdf diff --git a/examples/USER-MISC/slater/tmp_2_3.rdf b/examples/PACKAGES/slater/tmp_2_3.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_2_3.rdf rename to examples/PACKAGES/slater/tmp_2_3.rdf diff --git a/examples/USER-MISC/slater/tmp_3_3.rdf b/examples/PACKAGES/slater/tmp_3_3.rdf similarity index 100% rename from examples/USER-MISC/slater/tmp_3_3.rdf rename to examples/PACKAGES/slater/tmp_3_3.rdf diff --git a/examples/USER-MISC/temper_npt/data.peptide b/examples/PACKAGES/temper_npt/data.peptide similarity index 100% rename from examples/USER-MISC/temper_npt/data.peptide rename to examples/PACKAGES/temper_npt/data.peptide diff --git a/examples/USER-MISC/temper_npt/in.temper_npt b/examples/PACKAGES/temper_npt/in.temper_npt similarity index 100% rename from examples/USER-MISC/temper_npt/in.temper_npt rename to examples/PACKAGES/temper_npt/in.temper_npt diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.0 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.0 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.0 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.0 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.1 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.1 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.1 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.1 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.2 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.2 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.2 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.2 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.3 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.3 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.3 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.3 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.4 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.4 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.4 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.4 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.5 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.5 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.5 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.5 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.6 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.6 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.6 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.6 diff --git a/examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.7 b/examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.7 similarity index 100% rename from examples/USER-MISC/temper_npt/log.temper_npt-17Aug17.g++.8.7 rename to examples/PACKAGES/temper_npt/log.temper_npt-17Aug17.g++.8.7 diff --git a/examples/USER-MISC/ti/in.ti_spring b/examples/PACKAGES/ti/in.ti_spring similarity index 100% rename from examples/USER-MISC/ti/in.ti_spring rename to examples/PACKAGES/ti/in.ti_spring diff --git a/examples/README b/examples/README index 68825a7dbd..9e873b49b9 100644 --- a/examples/README +++ b/examples/README @@ -5,8 +5,7 @@ problems you can run with LAMMPS. lower-case directories = simple test problems for LAMMPS and its packages upper-case directories = more complex problems -PACKAGES directory with its own sub-directories = tests for specific packages -USER-MISC directory with its own sub-directories = tests for commands in USER-MISC package +PACKAGES directory with its own sub-directories = tests for styles from specific packages Each is discussed below. @@ -172,10 +171,12 @@ energy-evaluation engine in a iterative Monte Carlo energy-relaxation loop. The PACKAGES directory contains subdirectories of example scripts for -individual packages. Most of those are contributed by the corresponding -package developers. See the README files in those directories -for more info. See the doc/html/Build_package.html file for more info -about installing and building packages. +individual packages or additional individual styles. Most of those are +contributed by the corresponding package or style developers. +See the README files in those directories (if available) or the +corresponding doc page in the manual for more info. See the +https://docs.lammps.org/Build_package.html page for more info about +installing and building packages. The TIP4P directory has an example for testing forces computed on a GPU. @@ -186,12 +187,6 @@ lj, real, and metal. So that you can see how to scale/unscale input and output values read/written by LAMMPS to verify you are performing the same simulation in different unit systems. -The USER-MISC directory contains subdirectories of example scripts for -individual commands in the USER-MISC package. Most of those are contributed -by the corresponding developers. See the README files in those directories -for more info. See the doc/html/Build_package.html file for more info -about installing and building packages. - The VISCOSITY directory has example scripts for computing the viscosity of a LJ liquid using 4 different methods. See the VISCOSITY/README file for more info. From 2e4119dca7d1b0d515c013024908b48462f76aad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 24 Jul 2021 20:54:24 -0400 Subject: [PATCH 145/352] update package list and details for newly created packages and removed USER-MISC --- doc/src/Packages_details.rst | 145 +++++++++++++++++++++++++++-------- doc/src/Packages_list.rst | 35 +++++++-- 2 files changed, 141 insertions(+), 39 deletions(-) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 6d3df5c955..5051ce937c 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -49,6 +49,11 @@ page gives those details. * :ref:`DPD-SMOOTH ` * :ref:`DRUDE ` * :ref:`EFF ` + * :ref:`EXTRA-COMPUTE ` + * :ref:`EXTRA-DUMP ` + * :ref:`EXTRA-FIX ` + * :ref:`EXTRA-MOLECULE ` + * :ref:`EXTRA-PAIR ` * :ref:`FEP ` * :ref:`GPU ` * :ref:`GRANULAR ` @@ -84,6 +89,7 @@ page gives those details. * :ref:`NETCDF ` * :ref:`OPENMP ` * :ref:`OPT ` + * :ref:`ORIENT ` * :ref:`PERI ` * :ref:`PHONON ` * :ref:`PLUGIN ` @@ -109,7 +115,6 @@ page gives those details. * :ref:`VORONOI ` * :ref:`VTK ` * :ref:`YAFF ` - * :ref:`USER-MISC ` ---------- @@ -757,6 +762,86 @@ tools/eff; see its README file. * tools/eff * https://www.lammps.org/movies.html#eff +------------------- + +.. _PKG-EXTRA-COMPUTE: + +EXTRA-COMPUTE package +--------------------- + +**Contents:** + +Additional compute styles that are less commonly used. + +**Supporting info:** + +* src/EXTRA-COMPUTE: filenames -> commands +* :doc:`compute ` + +---------- + +.. _PKG-EXTRA-DUMP: + +EXTRA-DUMP package +------------------ + +**Contents:** + +Additional dump styles that are less commonly used. + +**Supporting info:** + +* src/EXTRA-DUMP: filenames -> commands +* :doc:`dump ` + +---------- + +.. _PKG-EXTRA-FIX: + +EXTRA-FIX package +----------------- + +**Contents:** + +Additional fix styles that are less commonly used. + +**Supporting info:** + +* src/EXTRA-FIX: filenames -> commands +* :doc:`fix ` + +---------- + +.. _PKG-EXTRA-MOLECULE: + +EXTRA-MOLECULE package +---------------------- + +**Contents:** + +Additional bond, angle, dihedral, and improper styles that are less commonly used. + +**Supporting info:** + +* src/EXTRA-MOLECULE: filenames -> commands +* :doc:`molecular styles ` + +---------- + +.. _PKG-EXTRA-PAIR: + +EXTRA-PAIR package +------------------ + +**Contents:** + +Additional pair styles that are less commonly used. + +**Supporting info:** + +* src/EXTRA-PAIR: filenames -> commands +* :doc:`pair_style ` + ---------- .. _PKG-FEP: @@ -1448,7 +1533,7 @@ MISC package **Contents:** -A variety of compute, fix, pair, dump styles with specialized +A variety of compute, fix, pair, bond styles with specialized capabilities that don't align with other packages. Do a directory listing, "ls src/MISC", to see the list of commands. @@ -1461,20 +1546,15 @@ listing, "ls src/MISC", to see the list of commands. * src/MISC: filenames -> commands * :doc:`bond_style special ` -* :doc:`compute ti ` -* :doc:`fix deposit ` -* :doc:`fix evaporate ` +* :doc:`compute viscosity/cos ` +* :doc:`fix accelerate/cos ` * :doc:`fix imd ` -* :doc:`fix oneway ` -* :doc:`fix orient/fcc ` -* :doc:`fix ttm ` -* :doc:`fix thermal/conductivity ` -* :doc:`fix viscosity ` +* :doc:`fix ipi ` +* :doc:`pair_style agni ` * :doc:`pair_style list ` -* examples/KAPPA -* examples/VISCOSITY -* https://www.lammps.org/pictures.html#ttm -* https://www.lammps.org/movies.html#evaporation +* :doc:`pair_style srp ` +* :doc:`pair_style tracker ` +* :doc:`fix pair/tracker ` ---------- @@ -1959,6 +2039,23 @@ This package has :ref:`specific installation instructions ` on the :doc:`Bu * Search the :doc:`pair style ` page for styles followed by (t) * `Benchmarks page `_ of web site +.. _PKG-ORIENT: + +ORIENT package +-------------- + +**Contents:** + +A few fixes that apply orientation dependent forces for studying +grain boundary migration. + +**Supporting info:** + +* src/ORIENT: filenames -> commands +* :doc:`fix orient/bcc ` +* :doc:`fix orient/fcc ` +* :doc:`fix orient/eco ` + ---------- .. _PKG-PERI: @@ -2687,23 +2784,3 @@ which discuss the `QuickFF `_ methodology. ---------- -.. _PKG-USER-MISC: - -USER-MISC package ------------------ - -**Contents:** - -A potpourri of (mostly) unrelated features contributed to LAMMPS by -users. Each feature is a single fix, compute, pair, bond, angle, -dihedral, improper, or command style. - -**Authors:** The author for each style in the package is listed in the -src/USER-MISC/README file. - -**Supporting info:** - -* src/USER-MISC: filenames -> commands -* src/USER-MISC/README -* one page per individual command listed in src/USER-MISC/README -* examples/USER-MISC diff --git a/doc/src/Packages_list.rst b/doc/src/Packages_list.rst index 913389dcc6..22dfa2c69e 100644 --- a/doc/src/Packages_list.rst +++ b/doc/src/Packages_list.rst @@ -143,6 +143,31 @@ whether an extra library is needed to build and use the package: - :doc:`pair_style eff/cut ` - PACKAGES/eff - no + * - :ref:`EXTRA-COMPUTE ` + - additional compute styles + - :doc:`compute ` + - n/a + - no + * - :ref:`EXTRA-DUMP ` + - additional dump styles + - :doc:`dump ` + - n/a + - no + * - :ref:`EXTRA-FIX ` + - additional fix styles + - :doc:`fix ` + - n/a + - no + * - :ref:`EXTRA-MOLECULE ` + - additional molecular styles + - :doc:`molecular styles ` + - n/a + - no + * - :ref:`EXTRA-PAIR ` + - additional pair styles + - :doc:`pair_style ` + - n/a + - no * - :ref:`FEP ` - free energy perturbation - :doc:`compute fep ` @@ -318,6 +343,11 @@ whether an extra library is needed to build and use the package: - :doc:`Speed opt ` - `Benchmarks `_ - no + * - :ref:`ORIENT ` + - fixes for orientation depended forces + - :doc:`fix orient/* ` + - PACKAGES/orient_eco + - no * - :ref:`PERI ` - Peridynamics models - :doc:`pair_style peri ` @@ -428,11 +458,6 @@ whether an extra library is needed to build and use the package: - :doc:`fix nvt/uef ` - PACKAGES/uef - no - * - :ref:`USER-MISC ` - - single-file contributions - - USER-MISC/README - - USER-MISC - - no * - :ref:`VORONOI ` - Voronoi tesselation - :doc:`compute voronoi/atom ` From 9d162d865a7a05ab804ee5e7d02bb03cee95f202 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 09:59:56 -0400 Subject: [PATCH 146/352] move pimd to REPLICA --- src/{EXTRA-FIX => REPLICA}/fix_pimd.cpp | 0 src/{EXTRA-FIX => REPLICA}/fix_pimd.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{EXTRA-FIX => REPLICA}/fix_pimd.cpp (100%) rename src/{EXTRA-FIX => REPLICA}/fix_pimd.h (100%) diff --git a/src/EXTRA-FIX/fix_pimd.cpp b/src/REPLICA/fix_pimd.cpp similarity index 100% rename from src/EXTRA-FIX/fix_pimd.cpp rename to src/REPLICA/fix_pimd.cpp diff --git a/src/EXTRA-FIX/fix_pimd.h b/src/REPLICA/fix_pimd.h similarity index 100% rename from src/EXTRA-FIX/fix_pimd.h rename to src/REPLICA/fix_pimd.h From 9d9b0897003d81e350cb2ce1b6d0870fbb795405 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 10:03:16 -0400 Subject: [PATCH 147/352] get rid of references to USER-MISC in the general discussion --- doc/src/Developer_org.rst | 2 +- doc/src/Errors_bugs.rst | 5 ++- doc/src/Examples.rst | 7 +-- doc/src/Howto_cmake.rst | 2 +- doc/src/Howto_replica.rst | 49 ++++++++++---------- doc/src/Intro_website.rst | 3 +- doc/src/Modify_contribute.rst | 84 ++++++++++++++++++----------------- doc/src/Packages_details.rst | 3 -- 8 files changed, 77 insertions(+), 78 deletions(-) diff --git a/doc/src/Developer_org.rst b/doc/src/Developer_org.rst index 133d567cb3..b5acdf5631 100644 --- a/doc/src/Developer_org.rst +++ b/doc/src/Developer_org.rst @@ -17,7 +17,7 @@ currently supports building with :doc:`conventional makefiles differ in how packages are enabled or disabled for inclusion into a LAMMPS binary so they cannot be mixed. The source files for each package are in all-uppercase sub-directories of the ``src`` folder, for -example ``src/MOLECULE`` or ``src/USER-MISC``. The ``src/STUBS`` +example ``src/MOLECULE`` or ``src/EXTRA-MOLECULE``. The ``src/STUBS`` sub-directory is not a package but contains a dummy MPI library, that is used when building a serial version of the code. The ``src/MAKE`` directory and its sub-directories contain makefiles with settings and diff --git a/doc/src/Errors_bugs.rst b/doc/src/Errors_bugs.rst index 1ea368a5a3..dbec1ef895 100644 --- a/doc/src/Errors_bugs.rst +++ b/doc/src/Errors_bugs.rst @@ -17,8 +17,9 @@ the steps outlined below: if your issue has already been reported and if it is still open. * Check the `GitHub Pull Requests page `_ to see if there is already a fix for your bug pending. - * Check the `mailing list archives `_ - to see if the issue has been discussed before. + * Check the `mailing list archives `_ or + the `LAMMPS forum `_ to see if the + issue has been discussed before. If none of these steps yields any useful information, please file a new bug report on the `GitHub Issue page `_. diff --git a/doc/src/Examples.rst b/doc/src/Examples.rst index df9d1616a6..043820c5dd 100644 --- a/doc/src/Examples.rst +++ b/doc/src/Examples.rst @@ -207,14 +207,12 @@ Uppercase directories +------------+--------------------------------------------------------------------------------------------------+ | MC | using LAMMPS in a Monte Carlo mode to relax the energy of a system | +------------+--------------------------------------------------------------------------------------------------+ -| PACKAGES | examples for specific packages and contributed commands in USER-MISC | +| PACKAGES | examples for specific packages and contributed commands | +------------+--------------------------------------------------------------------------------------------------+ | SPIN | examples for features of the SPIN package | +------------+--------------------------------------------------------------------------------------------------+ | UNITS | examples that run the same simulation in lj, real, metal units | +------------+--------------------------------------------------------------------------------------------------+ -| USER-MISC | examples for commands in the USER-MISC packages | -+------------+--------------------------------------------------------------------------------------------------+ | VISCOSITY | compute viscosity via several methods | +------------+--------------------------------------------------------------------------------------------------+ @@ -228,7 +226,4 @@ of the sub-directories have their own README files which give further instructions. See the :doc:`Packages_details ` doc page for more info on specific packages. -Similarly the USER-MISC directory has sub-directories for examples -corresponding to individual commands or styles in the USER-MISC package. - .. _openkim: https://openkim.org diff --git a/doc/src/Howto_cmake.rst b/doc/src/Howto_cmake.rst index 244bcf6323..832a8b8770 100644 --- a/doc/src/Howto_cmake.rst +++ b/doc/src/Howto_cmake.rst @@ -362,7 +362,7 @@ have to be enabled to be included into a LAMMPS executable. Packages are enabled through setting variables of the kind ``PKG_`` to ``on`` and disabled by setting them to ``off`` (or using ``yes``, ``no``, ``1``, ``0`` correspondingly). ```` has to be replaced by -the name of the package, e.g. ``MOLECULE`` or ``USER-MISC``. +the name of the package, e.g. ``MOLECULE`` or ``EXTRA-PAIR``. Using presets diff --git a/doc/src/Howto_replica.rst b/doc/src/Howto_replica.rst index e9fba37dcd..e34f3523f0 100644 --- a/doc/src/Howto_replica.rst +++ b/doc/src/Howto_replica.rst @@ -8,34 +8,33 @@ periodically. These are the relevant commands: -* :doc:`neb ` for nudged elastic band calculations +* :doc:`hyper ` for bond boost hyperdynamics (HD) +* :doc:`neb ` for nudged elastic band calculations (NEB) * :doc:`neb_spin ` for magnetic nudged elastic band calculations -* :doc:`prd ` for parallel replica dynamics -* :doc:`tad ` for temperature accelerated dynamics -* :doc:`temper ` for parallel tempering +* :doc:`prd ` for parallel replica dynamics (PRD) +* :doc:`tad ` for temperature accelerated dynamics (TAD) +* :doc:`temper ` for parallel tempering with fixed volume +* :doc:`temper/npt ` for parallel tempering extended for NPT +* :doc:`temper/grem ` for parallel tempering with generalized replica exchange (gREM) * :doc:`fix pimd ` for path-integral molecular dynamics (PIMD) -NEB is a method for finding transition states and barrier energies. -PRD and TAD are methods for performing accelerated dynamics to find -and perform infrequent events. Parallel tempering or replica exchange -runs different replicas at a series of temperature to facilitate -rare-event sampling. +NEB is a method for finding transition states and barrier potential energies. +HD, PRD, and TAD are methods for performing accelerated dynamics to find and +perform infrequent events. Parallel tempering or replica exchange runs +different replicas at a series of temperature to facilitate rare-event +sampling. PIMD runs different replicas whose individual particles in different +replicas are coupled together by springs to model a system of ring-polymers which +can represent the quantum nature of atom cores. These commands can only be used if LAMMPS was built with the REPLICA package. See the :doc:`Build package ` doc page for more info. -PIMD runs different replicas whose individual particles are coupled -together by springs to model a system or ring-polymers. - -This commands can only be used if LAMMPS was built with the USER-MISC -package. See the :doc:`Build package ` doc page for more -info. - In all these cases, you must run with one or more processors per replica. The processors assigned to each replica are determined at -run-time by using the :doc:`-partition command-line switch ` to launch LAMMPS on multiple partitions, -which in this context are the same as replicas. E.g. these commands: +run-time by using the :doc:`-partition command-line switch +` to launch LAMMPS on multiple partitions, which in this +context are the same as replicas. E.g. these commands: .. code-block:: bash @@ -46,9 +45,11 @@ would each run 8 replicas, on either 16 or 8 processors. Note the use of the :doc:`-in command-line switch ` to specify the input script which is required when running in multi-replica mode. -Also note that with MPI installed on a machine (e.g. your desktop), -you can run on more (virtual) processors than you have physical -processors. Thus the above commands could be run on a -single-processor (or few-processor) desktop so that you can run -a multi-replica simulation on more replicas than you have -physical processors. +Also note that with MPI installed on a machine (e.g. your desktop), you +can run on more (virtual) processors than you have physical processors. +Thus the above commands could be run on a single-processor (or +few-processor) desktop so that you can run a multi-replica simulation on +more replicas than you have physical processors. This is useful for +testing and debugging, since with most modern processors and MPI +libraries the efficiency of a calculation can severely diminish when +oversubscribing processors. diff --git a/doc/src/Intro_website.rst b/doc/src/Intro_website.rst index 3fccaf4dca..2ea1969f2a 100644 --- a/doc/src/Intro_website.rst +++ b/doc/src/Intro_website.rst @@ -20,7 +20,8 @@ available online are listed below. * `Glossary of terms relevant to LAMMPS `_ * `LAMMPS highlights with images `_ * `LAMMPS highlights with movies `_ -* `Mail list `_ +* `Mailing list `_ +* `LAMMPS forum `_ * `Workshops `_ * `Tutorials `_ diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst index 42ce8d2498..bcd368c3a3 100644 --- a/doc/src/Modify_contribute.rst +++ b/doc/src/Modify_contribute.rst @@ -25,13 +25,16 @@ the work of others (and possibly get scooped by them) or have your work duplicated by others. For informal communication with (some of) the LAMMPS developers you may -ask to join the `LAMMPS developers on Slack `_. -This slack work space is by invitation only. Thus for access, please -send an e-mail to ``slack@lammps.org`` explaining what part of LAMMPS -you are working on. Only discussions related to LAMMPS development are -tolerated, so this is **NOT** for people that look for help with compiling, -installing, or using LAMMPS. Please contact the `lammps-users mailing -list `_ for those purposes instead. +ask to join the `LAMMPS developers on Slack +`_. This slack work space is by invitation +only. Thus for access, please send an e-mail to ``slack@lammps.org`` +explaining what part of LAMMPS you are working on. Only discussions +related to LAMMPS development are tolerated, so this is **NOT** for +people that look for help with compiling, installing, or using +LAMMPS. Please contact the +`lammps-users mailing list `_ or the +`LAMMPS forum `_ for those purposes +instead. How quickly your contribution will be integrated depends largely on how much effort it will cause to integrate and test it, how many and what @@ -49,11 +52,9 @@ with gzip. Please only use gzip compression, as this works well and is available on all platforms. If the new features/files are broadly useful we may add them as core -files to LAMMPS or as part of a :doc:`package `. The -USER-MISC package is simply a collection of (mostly) unrelated single -files, which is the simplest way to have your contribution quickly added -to the LAMMPS distribution. All packages are listed and described -on the :doc:`Packages details ` doc page. +files to LAMMPS or as part of a :doc:`package `. All +packages are listed and described on the :doc:`Packages details +` doc page. Note that by providing us files to release, you are agreeing to make them open-source, i.e. we can release them under the terms of the GPL @@ -92,7 +93,7 @@ trivial change is making a parent-class method "virtual" when you derive a new child class from it. Here is a checklist of steps you need to follow to submit a single file -or user package for our consideration. Following these steps will save +or package for our consideration. Following these steps will save both you and us time. Please have a look at the existing files in packages in the src directory for examples. If you are uncertain, please ask. @@ -150,37 +151,40 @@ packages in the src directory for examples. If you are uncertain, please ask. You may also use ``// clang-format on/off`` throughout your file to protect sections of the file from being reformatted. -* If you want your contribution to be added as a user-contributed - feature, and it's a single file (actually a \*.cpp and \*.h file) it can - rapidly be added to the USER-MISC directory. Send us the one-line - entry to add to the USER-MISC/README file in that dir, along with the - 2 source files. You can do this multiple times if you wish to - contribute several individual features. +* Please review the list of :doc:`available Packages ` + to see if your contribution could be added to be added to one of them. + It should fit into the general purposed of that package. If it does not + fit well, it can be added to one of the EXTRA- packages or the MISC package. -* If you want your contribution to be added and it has several related - features or is dependent on an external or bundled library, it is best - to make it a package directory with a name like FOO. In addition to - your new files, the directory should contain a README text file. The - README should contain your name and contact information and a brief - description of what your new package does. If your files depend on - other LAMMPS style files also being installed (e.g. because your file - is a derived class from the other LAMMPS class), then an Install.sh - file is also needed to check for those dependencies. See other README - and Install.sh files in other directories as examples. Submit a pull - request on GitHub or send us a tarball of this FOO directory. Pull - requests are strongly encouraged since the greatly reduce the effort - to integrate a contribution and simplify the process of adjusting the - contributed code to cleanly integrate into the LAMMPS distribution. +* If your contribution has several related features that are not covered + by one of the existing packages or is dependent on a library (bundled + or external), it is best to make it a package directory with a name + like FOO. In addition to your new files, the directory should contain + a README text file. The README should contain your name and contact + information and a brief description of what your new package does. If + your files depend on other LAMMPS style files also being installed + (e.g. because your file is a derived class from the other LAMMPS + class), then an Install.sh file is also needed to check for those + dependencies and modifications to src/Depend.sh to trigger the checks. + See other README and Install.sh files in other directories as examples. + Similarly for CMake support changes need to be made to cmake/CMakeLists.txt, + the files in cmake/presets, and possibly a file to cmake/Modules/Packages/ + added. Please check out how this is handled for existing packages and + ask the LAMMPS developers if you need assistance. Please submit a pull + request on GitHub or send us a tarball of this FOO directory and all + modified files. Pull requests are strongly encouraged since they greatly + reduce the effort required to integrate a contribution and simplify the + process of adjusting the contributed code to cleanly fit into the + LAMMPS distribution. * Your new source files need to have the LAMMPS copyright, GPL notice, and your name and email address at the top, like other user-contributed LAMMPS source files. They need to create a class - that is inside the LAMMPS namespace. If the file is for one of the - USER packages, including USER-MISC, then we are not as picky about the - coding style (see above). I.e. the files do not need to be in the - same stylistic format and syntax as other LAMMPS files, though that - would be nice for developers as well as users who try to read your - code. + that is inside the LAMMPS namespace. To simplify maintenance, we + may ask to adjust the progamming style and formatting style to closer + match the rest of LAMMPS. We bundle a clang-format configuration file + that can help with adjusting the formatting, although this is not a + strict requirement. * You **must** also create a **documentation** file for each new command or style you are adding to LAMMPS. For simplicity and convenience, @@ -205,7 +209,7 @@ packages in the src directory for examples. If you are uncertain, please ask. cite itself. Citation labels must be unique across all .rst files. The "Restrictions" section of the doc page should indicate if your command is only available if LAMMPS is built with the appropriate - USER-MISC or FOO package. See other package doc files for examples of + FOO package. See other package doc files for examples of how to do this. Please run at least "make html" and "make spelling" and carefully inspect and proofread the resulting HTML format doc page before submitting your code. Upon submission of a pull request, diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 5051ce937c..28ae032d34 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -2781,6 +2781,3 @@ which discuss the `QuickFF `_ methodology. * :doc:`pair_style mm3/switch3/coulgauss/long ` * :doc:`pair_style lj/switch3/coulgauss/long ` * examples/PACKAGES/yaff - ----------- - From 513e792eced8ce5530f3155051c74a1d4cae5b50 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 10:15:15 -0400 Subject: [PATCH 148/352] fix required package message --- doc/src/pair_kolmogorov_crespi_full.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_kolmogorov_crespi_full.rst b/doc/src/pair_kolmogorov_crespi_full.rst index 265299cfdd..9408148e72 100644 --- a/doc/src/pair_kolmogorov_crespi_full.rst +++ b/doc/src/pair_kolmogorov_crespi_full.rst @@ -119,7 +119,7 @@ that reads a restart file. Restrictions """""""""""" -This pair style is part of the USER-MISCt package. It is only enabled +This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. From 41db4235d647b1d60ece03e728b5474f94e40400 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 10:28:40 -0400 Subject: [PATCH 149/352] update package names for pair style moved away from USER-MISC --- doc/src/pair_agni.rst | 4 ++-- doc/src/pair_cosine_squared.rst | 2 +- doc/src/pair_coul_diel.rst | 2 +- doc/src/pair_coul_slater.rst | 2 +- doc/src/pair_dipole.rst | 13 +++++-------- doc/src/pair_e3b.rst | 4 ++-- doc/src/pair_edip.rst | 2 +- doc/src/pair_gauss.rst | 6 +++--- doc/src/pair_local_density.rst | 5 +++-- doc/src/pair_mdf.rst | 2 +- doc/src/pair_meam_spline.rst | 2 +- doc/src/pair_meam_sw_spline.rst | 4 ++-- doc/src/pair_momb.rst | 2 +- doc/src/pair_morse.rst | 3 ++- doc/src/pair_srp.rst | 2 +- doc/src/pair_wf_cut.rst | 2 +- 16 files changed, 28 insertions(+), 29 deletions(-) diff --git a/doc/src/pair_agni.rst b/doc/src/pair_agni.rst index cfbcfb0c05..2e4d95760f 100644 --- a/doc/src/pair_agni.rst +++ b/doc/src/pair_agni.rst @@ -63,7 +63,7 @@ to specify the path for the force field file. An AGNI force field is fully specified by the filename which contains the parameters of the force field, i.e., the reference training environments used to construct the machine learning force field. Example force field -and input files are provided in the examples/USER-MISC/agni directory. +and input files are provided in the examples/PACKAGES/agni directory. ---------- @@ -112,7 +112,7 @@ It should work with damped dynamics based minimizers like *fire* or *quickmin*\ . However, one can access the energy via thermodynamic integration of the forces as discussed in :ref:`(Botu3) `. This pair style is part of the -USER-MISC package. It is only enabled if LAMMPS was built with that +MISC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/pair_cosine_squared.rst b/doc/src/pair_cosine_squared.rst index faa45c9286..185bffff99 100644 --- a/doc/src/pair_cosine_squared.rst +++ b/doc/src/pair_cosine_squared.rst @@ -107,7 +107,7 @@ These pair styles can only be used via the *pair* keyword of the Restrictions """""""""""" -The *cosine/squared* style is part of the USER-MISC package. It is only +The *cosine/squared* style is part of the EXTRA-PAIR package. It is only enabled if LAMMPS is build with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/pair_coul_diel.rst b/doc/src/pair_coul_diel.rst index bcf0c48e4d..573329a1bb 100644 --- a/doc/src/pair_coul_diel.rst +++ b/doc/src/pair_coul_diel.rst @@ -95,7 +95,7 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -This style is part of the USER-MISC package. It is only enabled if +This style is part of the EXTRA-PAIR package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/pair_coul_slater.rst b/doc/src/pair_coul_slater.rst index a4d8b253b1..f3dab4c778 100644 --- a/doc/src/pair_coul_slater.rst +++ b/doc/src/pair_coul_slater.rst @@ -100,7 +100,7 @@ Restrictions The *coul/slater/long* style requires the long-range solvers included in the KSPACE package. -These styles are part of the USER-MISC package. They are only enabled if +These styles are part of the EXTRA-PAIR package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/pair_dipole.rst b/doc/src/pair_dipole.rst index 602c374d9f..7645966229 100644 --- a/doc/src/pair_dipole.rst +++ b/doc/src/pair_dipole.rst @@ -325,15 +325,12 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -The *lj/cut/dipole/cut*\ , *lj/cut/dipole/long*\ , and -*lj/long/dipole/long* styles are part of the DIPOLE package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +The *lj/cut/dipole/cut*\ , *lj/cut/dipole/long*\ , *lj/long/dipole/long*, +and lj/sf/dipole/sf* styles are part of the DIPOLE package. They are only +enabled if LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. -The *lj/sf/dipole/sf* style is part of the USER-MISC package. It is -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. - -Using dipole pair styles with *electron* :doc:`units ` is not -currently supported. +Using dipole pair styles with *electron* :doc:`units ` is not currently supported. Related commands """""""""""""""" diff --git a/doc/src/pair_e3b.rst b/doc/src/pair_e3b.rst index 2083e61119..9aeebfc020 100644 --- a/doc/src/pair_e3b.rst +++ b/doc/src/pair_e3b.rst @@ -111,7 +111,7 @@ If the neigh setting is too large, the pair style will use more memory than nece This pair style tallies a breakdown of the total E3B potential energy into sub-categories, which can be accessed via the :doc:`compute pair ` command as a vector of values of length 4. The 4 values correspond to the terms in the first equation above: the E2 term, the Ea term, the Eb term, and the Ec term. -See the examples/USER-MISC/e3b directory for a complete example script. +See the examples/PACKAGES/e3b directory for a complete example script. ---------- @@ -132,7 +132,7 @@ This pair style is incompatible with :doc:`respa `. Restrictions """""""""""" -This pair style is part of the USER-MISC package. It is only enabled +This pair style is part of the EXTRA-PAIR package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This pair style requires the :doc:`newton ` setting to be "on" diff --git a/doc/src/pair_edip.rst b/doc/src/pair_edip.rst index 8f8d70f2f6..b57ba3d162 100644 --- a/doc/src/pair_edip.rst +++ b/doc/src/pair_edip.rst @@ -150,7 +150,7 @@ Restrictions """""""""""" This pair style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +MANYBODY package. See the :doc:`Build package ` doc page for more info. This pair style requires the :doc:`newton ` setting to be "on" diff --git a/doc/src/pair_gauss.rst b/doc/src/pair_gauss.rst index 9b516cce7b..71b8df6e3a 100644 --- a/doc/src/pair_gauss.rst +++ b/doc/src/pair_gauss.rst @@ -163,9 +163,9 @@ heading) the following commands could be included in an input script: Restrictions """""""""""" -The *gauss/cut* style is part of the USER-MISC package. It is only -enabled if LAMMPS is build with that package. See the :doc:`Build -package ` doc page for more info. +The *gauss* and *gauss/cut* styles are part of the EXTRA-PAIR package. +They are only enabled if LAMMPS is build with that package. See the +:doc:`Build package ` doc page for more info. The *gauss* style does not apply :doc:`special_bonds ` factors. When using this pair style on a system that has bonds, the diff --git a/doc/src/pair_local_density.rst b/doc/src/pair_local_density.rst index 8fab58ef12..c2bae5ced9 100644 --- a/doc/src/pair_local_density.rst +++ b/doc/src/pair_local_density.rst @@ -220,8 +220,9 @@ an input script that reads a restart file. Restrictions """""""""""" -The local/density pair style is a part of the USER-MISC package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +The local/density pair style is a part of the MANYBODY package. It is +only enabled if LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_mdf.rst b/doc/src/pair_mdf.rst index 84d312e47c..1e4ad1f8d6 100644 --- a/doc/src/pair_mdf.rst +++ b/doc/src/pair_mdf.rst @@ -167,7 +167,7 @@ Restrictions """""""""""" These pair styles can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +EXTRA-PAIR package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/pair_meam_spline.rst b/doc/src/pair_meam_spline.rst index a24b74bc7f..e7680ddc15 100644 --- a/doc/src/pair_meam_spline.rst +++ b/doc/src/pair_meam_spline.rst @@ -144,7 +144,7 @@ for pair interactions. This pair style does not support mapping multiple atom types to the same element. -This pair style is only enabled if LAMMPS was built with the USER-MISC +This pair style is only enabled if LAMMPS was built with the MANYBODY package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/pair_meam_sw_spline.rst b/doc/src/pair_meam_sw_spline.rst index b57d122774..79236819b9 100644 --- a/doc/src/pair_meam_sw_spline.rst +++ b/doc/src/pair_meam_sw_spline.rst @@ -94,7 +94,7 @@ potentials. systems in the future. Example input scripts that use this pair style are provided -in the examples/USER-MISC/meam_sw_spline directory. +in the examples/PACKAGES/meam_sw_spline directory. ---------- @@ -124,7 +124,7 @@ Restrictions This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. -This pair style is only enabled if LAMMPS was built with the USER-MISC +This pair style is only enabled if LAMMPS was built with the MANYBODY package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/pair_momb.rst b/doc/src/pair_momb.rst index b1d43252fd..71dfe84087 100644 --- a/doc/src/pair_momb.rst +++ b/doc/src/pair_momb.rst @@ -55,7 +55,7 @@ read by the :doc:`read_data ` as described below: Restrictions """""""""""" -This style is part of the USER-MISC package. It is only enabled if +This style is part of the EXTRA-PAIR package. It is only enabled if LAMMPS is built with that package. See the :doc:`Build package ` doc page on for more info. diff --git a/doc/src/pair_morse.rst b/doc/src/pair_morse.rst index 87638e16f4..b977c58eaa 100644 --- a/doc/src/pair_morse.rst +++ b/doc/src/pair_morse.rst @@ -127,7 +127,8 @@ Restrictions """""""""""" The *morse/smooth/linear* pair style is only enabled if LAMMPS was -built with the USER-MISC package. See the :doc:`Build package ` doc page for more info. +built with the EXTRA-PAIR package. +See the :doc:`Build package ` doc page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_srp.rst b/doc/src/pair_srp.rst index 05168ce1ba..c1e8403022 100644 --- a/doc/src/pair_srp.rst +++ b/doc/src/pair_srp.rst @@ -150,7 +150,7 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -This pair style is part of the USER-MISC package. It is only enabled +This pair style is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the Making LAMMPS section for more info. diff --git a/doc/src/pair_wf_cut.rst b/doc/src/pair_wf_cut.rst index e69b982d8a..6ae1c3e897 100644 --- a/doc/src/pair_wf_cut.rst +++ b/doc/src/pair_wf_cut.rst @@ -99,7 +99,7 @@ and *outer* keywords of the :doc:`run_style respa ` command. Restrictions """""""""""" This pair style can only be used if LAMMPS was built with the -USER-MISC package. See the :doc:`Build package ` doc +EXTRA-PAIR package. See the :doc:`Build package ` doc page for more info. Related commands From afc54639c464491bd8636ef8382c3c1801e3c46e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 10:42:35 -0400 Subject: [PATCH 150/352] update references to USER-MISC package --- doc/src/compute_ackland_atom.rst | 2 +- doc/src/compute_basal_atom.rst | 4 ++-- doc/src/compute_cnp_atom.rst | 4 ++-- doc/src/compute_entropy_atom.rst | 2 +- doc/src/compute_gyration_shape.rst | 2 +- doc/src/compute_gyration_shape_chunk.rst | 2 +- doc/src/compute_hma.rst | 2 +- doc/src/compute_momentum.rst | 2 +- doc/src/compute_pressure_cylinder.rst | 2 +- doc/src/compute_stress_mop.rst | 2 +- doc/src/compute_temp_rotate.rst | 2 +- doc/src/compute_viscosity_cos.rst | 2 +- doc/src/fix_accelerate_cos.rst | 2 +- doc/src/fix_ave_correlate_long.rst | 2 +- doc/src/fix_electron_stopping.rst | 4 ++-- doc/src/fix_ffl.rst | 2 +- doc/src/fix_filter_corotate.rst | 2 +- doc/src/fix_flow_gauss.rst | 2 +- doc/src/fix_gle.rst | 2 +- doc/src/fix_ipi.rst | 9 +++++---- doc/src/fix_momentum.rst | 2 +- doc/src/fix_npt_cauchy.rst | 2 +- doc/src/fix_nvk.rst | 5 +++-- doc/src/fix_orient.rst | 4 ++-- doc/src/fix_orient_eco.rst | 2 +- doc/src/fix_pafi.rst | 4 ++-- doc/src/fix_pimd.rst | 5 +++-- doc/src/fix_rhok.rst | 4 ++-- doc/src/fix_ti_spring.rst | 5 +++-- doc/src/fix_ttm.rst | 5 ++--- doc/src/fix_wall_ees.rst | 4 ++-- doc/src/fix_wall_reflect_stochastic.rst | 2 +- 32 files changed, 50 insertions(+), 47 deletions(-) diff --git a/doc/src/compute_ackland_atom.rst b/doc/src/compute_ackland_atom.rst index 74922ba17b..b4d4268244 100644 --- a/doc/src/compute_ackland_atom.rst +++ b/doc/src/compute_ackland_atom.rst @@ -69,7 +69,7 @@ LAMMPS output options. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The per-atom vector values will be unitless since they are the diff --git a/doc/src/compute_basal_atom.rst b/doc/src/compute_basal_atom.rst index 8d8037e54e..e1b04d48c4 100644 --- a/doc/src/compute_basal_atom.rst +++ b/doc/src/compute_basal_atom.rst @@ -42,7 +42,7 @@ too frequently or to have multiple compute/dump commands, each of which computes this quantity. An example input script that uses this compute is provided -in examples/USER-MISC/basal. +in examples/PACKAGES/basal. Output info """"""""""" @@ -58,7 +58,7 @@ components of a unit vector. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The output of this compute will be meaningless unless the atoms are on diff --git a/doc/src/compute_cnp_atom.rst b/doc/src/compute_cnp_atom.rst index 1a1b509162..30f045a67b 100644 --- a/doc/src/compute_cnp_atom.rst +++ b/doc/src/compute_cnp_atom.rst @@ -40,7 +40,7 @@ This parameter is computed using the following formula from .. math:: - Q_{i} = \frac{1}{n_i}\sum_{j = 1}^{n_i} | \sum_{k = 1}^{n_{ij}} \vec{R}_{ik} + \vec{R}_{jk} |^2 + Q_{i} = \frac{1}{n_i}\sum_{j = 1}^{n_i} \left | \sum_{k = 1}^{n_{ij}} \vec{R}_{ik} + \vec{R}_{jk} \right | ^{2} where the index *j* goes over the :math:`n_i` nearest neighbors of atom *i*\ , and the index *k* goes over the :math:`n_{ij}` common nearest neighbors @@ -110,7 +110,7 @@ values: Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_entropy_atom.rst b/doc/src/compute_entropy_atom.rst index 59b0059376..0ca07815d3 100644 --- a/doc/src/compute_entropy_atom.rst +++ b/doc/src/compute_entropy_atom.rst @@ -124,7 +124,7 @@ ordered environments. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_gyration_shape.rst b/doc/src/compute_gyration_shape.rst index fced528015..b2b22df9ef 100644 --- a/doc/src/compute_gyration_shape.rst +++ b/doc/src/compute_gyration_shape.rst @@ -80,7 +80,7 @@ distance\^2 :doc:`units ` while the sixth one is dimensionless. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_gyration_shape_chunk.rst b/doc/src/compute_gyration_shape_chunk.rst index 375dc85134..fd0b08cae6 100644 --- a/doc/src/compute_gyration_shape_chunk.rst +++ b/doc/src/compute_gyration_shape_chunk.rst @@ -81,7 +81,7 @@ distance\^2 :doc:`units ` while the sixth one is dimensionless. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_hma.rst b/doc/src/compute_hma.rst index 0f5b32b8d1..575740a2d5 100644 --- a/doc/src/compute_hma.rst +++ b/doc/src/compute_hma.rst @@ -169,7 +169,7 @@ scalar value will be in energy :doc:`units `. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is enabled only +This compute is part of the EXTRA-COMPUTE package. It is enabled only if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Usage restricted to canonical (NVT) ensemble simulation only. diff --git a/doc/src/compute_momentum.rst b/doc/src/compute_momentum.rst index bcc5f3d421..266e4b5e18 100644 --- a/doc/src/compute_momentum.rst +++ b/doc/src/compute_momentum.rst @@ -43,7 +43,7 @@ value will be in mass\*velocity :doc:`units `. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_pressure_cylinder.rst b/doc/src/compute_pressure_cylinder.rst index d1102cd9bc..cc94c339c8 100644 --- a/doc/src/compute_pressure_cylinder.rst +++ b/doc/src/compute_pressure_cylinder.rst @@ -67,7 +67,7 @@ calculations are also excluded. Note that this pressure compute outputs the configurational terms only; the kinetic contribution is not included and may be calculated from the number density output by P_kin=density\*k\*T. -This compute is part of the USER-MISC package. It is only enabled +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_stress_mop.rst b/doc/src/compute_stress_mop.rst index feda7ee193..f02d279414 100644 --- a/doc/src/compute_stress_mop.rst +++ b/doc/src/compute_stress_mop.rst @@ -92,7 +92,7 @@ The values produced by this compute can be accessed by various :doc:`output comm Restrictions """""""""""" -These styles are part of the USER-MISC package. They are only enabled if +These styles are part of the EXTRA-COMPUTE package. They are only enabled if LAMMPS is built with that package. See the :doc:`Build package ` doc page on for more info. diff --git a/doc/src/compute_temp_rotate.rst b/doc/src/compute_temp_rotate.rst index e489136d2b..b4adea43bf 100644 --- a/doc/src/compute_temp_rotate.rst +++ b/doc/src/compute_temp_rotate.rst @@ -84,7 +84,7 @@ vector values will be in energy :doc:`units `. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-COMPUTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/compute_viscosity_cos.rst b/doc/src/compute_viscosity_cos.rst index 862f65a482..880b1ff3d3 100644 --- a/doc/src/compute_viscosity_cos.rst +++ b/doc/src/compute_viscosity_cos.rst @@ -137,7 +137,7 @@ The 7-th element of vector value will be in velocity :doc:`units `. Restrictions """""""""""" -This command is only available when LAMMPS was built with the USER-MISC package. +This command is only available when LAMMPS was built with the MISC package. Since this compute depends on :doc:`fix accelerate/cos ` which can only work for 3d systems, it cannot be used for 2d systems. diff --git a/doc/src/fix_accelerate_cos.rst b/doc/src/fix_accelerate_cos.rst index 7fad6be913..46e08e68b4 100644 --- a/doc/src/fix_accelerate_cos.rst +++ b/doc/src/fix_accelerate_cos.rst @@ -86,7 +86,7 @@ This fix is not invoked during energy minimization. Restrictions """""""""""" -This command is only available when LAMMPS was built with the USER-MISC package. +This command is only available when LAMMPS was built with the MISC package. Since this fix depends on the z-coordinate of atoms, it cannot be used in 2d simulations. Related commands diff --git a/doc/src/fix_ave_correlate_long.rst b/doc/src/fix_ave_correlate_long.rst index c740099aae..e3e118744a 100644 --- a/doc/src/fix_ave_correlate_long.rst +++ b/doc/src/fix_ave_correlate_long.rst @@ -127,7 +127,7 @@ the run command. This fix is not invoked during energy minimization. Restrictions """""""""""" -This compute is part of the USER-MISC package. It is only enabled if +This compute is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/fix_electron_stopping.rst b/doc/src/fix_electron_stopping.rst index 62037e66c7..d2bc65608d 100644 --- a/doc/src/fix_electron_stopping.rst +++ b/doc/src/fix_electron_stopping.rst @@ -153,7 +153,7 @@ atoms moving above some minimum cutoff velocity (i.e., kinetic energy). These coefficients can be determined by fitting a quadratic polynomial to electronic stopping data predicted by, for example, SRIM or TD-DFT. Multiple 'Ecut c1 c2' values can be provided for multi-species simulations in the order -of the atom types. There is an examples/USER-MISC/electron_stopping/ directory, +of the atom types. There is an examples/PACKAGES/electron_stopping/ directory, which illustrates uses of this command. Details of this implementation are further described in :ref:`Stewart2018 ` and :ref:`Lee2020 `. @@ -175,7 +175,7 @@ on this fix. Restrictions """""""""""" -This pair style is part of the USER-MISC package. It is only enabled if +This pair style is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_ffl.rst b/doc/src/fix_ffl.rst index 0bfdaf87c9..02bcaa710d 100644 --- a/doc/src/fix_ffl.rst +++ b/doc/src/fix_ffl.rst @@ -110,7 +110,7 @@ In order to perform constant-pressure simulations please use :doc:`fix npt `, to avoid duplicate integration of the equations of motion. -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/fix_filter_corotate.rst b/doc/src/fix_filter_corotate.rst index e33fc0ac4a..6bfcad27e8 100644 --- a/doc/src/fix_filter_corotate.rst +++ b/doc/src/fix_filter_corotate.rst @@ -72,7 +72,7 @@ fixes are not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Currently, it does not support :doc:`molecule templates `. diff --git a/doc/src/fix_flow_gauss.rst b/doc/src/fix_flow_gauss.rst index 343bf083ae..ce114fdfcd 100644 --- a/doc/src/fix_flow_gauss.rst +++ b/doc/src/fix_flow_gauss.rst @@ -158,7 +158,7 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_gle.rst b/doc/src/fix_gle.rst index a341e0fa08..c7d46c09fa 100644 --- a/doc/src/fix_gle.rst +++ b/doc/src/fix_gle.rst @@ -142,7 +142,7 @@ In order to perform constant-pressure simulations please use :doc:`fix npt `, to avoid duplicate integration of the equations of motion. -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/fix_ipi.rst b/doc/src/fix_ipi.rst index ccd1c9f58c..f8ea49c845 100644 --- a/doc/src/fix_ipi.rst +++ b/doc/src/fix_ipi.rst @@ -84,10 +84,11 @@ coordinates are transferred. However, one could use this strategy to define an external potential acting on the atoms that are moved by i-PI. -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Because of the -use of UNIX domain sockets, this fix will only work in a UNIX -environment. +This fix is part of the MISC package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. +Because of the use of UNIX domain sockets, this fix will only +work in a UNIX environment. Related commands """""""""""""""" diff --git a/doc/src/fix_momentum.rst b/doc/src/fix_momentum.rst index 393a6a16cd..71b50ddcdb 100644 --- a/doc/src/fix_momentum.rst +++ b/doc/src/fix_momentum.rst @@ -97,7 +97,7 @@ the :doc:`run ` command. This fix is not invoked during Restrictions """""""""""" -Fix momentum/chunk is part of the USER-MISC package. It is only enabled +Fix momentum/chunk is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_npt_cauchy.rst b/doc/src/fix_npt_cauchy.rst index 8ef74b25c9..01bf34927c 100644 --- a/doc/src/fix_npt_cauchy.rst +++ b/doc/src/fix_npt_cauchy.rst @@ -554,7 +554,7 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. *X*\ , *y*\ , *z* cannot be barostatted if the associated dimension is not diff --git a/doc/src/fix_nvk.rst b/doc/src/fix_nvk.rst index 6226635010..30f5a0e004 100644 --- a/doc/src/fix_nvk.rst +++ b/doc/src/fix_nvk.rst @@ -56,8 +56,9 @@ the simulation box. Therefore, the group must be set to all. This fix has not yet been implemented to work with the RESPA integrator. -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the EXTRA-FIX package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_orient.rst b/doc/src/fix_orient.rst index 3397261552..02fda71a0a 100644 --- a/doc/src/fix_orient.rst +++ b/doc/src/fix_orient.rst @@ -177,11 +177,11 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS +These fixes are part of the ORIENT package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. -This fix should only be used with fcc or bcc lattices. +These fixes should only be used with fcc or bcc lattices. Related commands """""""""""""""" diff --git a/doc/src/fix_orient_eco.rst b/doc/src/fix_orient_eco.rst index 1db83338d4..b58cf2dd8e 100644 --- a/doc/src/fix_orient_eco.rst +++ b/doc/src/fix_orient_eco.rst @@ -122,7 +122,7 @@ the run command. This fix is not invoked during energy minimization. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the ORIENT package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_pafi.rst b/doc/src/fix_pafi.rst index f50dc1dc0e..4c38123dd3 100644 --- a/doc/src/fix_pafi.rst +++ b/doc/src/fix_pafi.rst @@ -45,7 +45,7 @@ projection is also calculated, whose time integral can be shown to be equal to the true free energy gradient along the minimum free energy path local to the reference pathway. A detailed discussion of the projection technique can be found in :ref:`(Swinburne) `. -This fix can be used with LAMMPS as demonstrated in examples/USER-MISC/pafi, +This fix can be used with LAMMPS as demonstrated in examples/PACKAGES/pafi, though it is primarily intended to be coupled with the PAFI C++ code, developed at `https://github.com/tomswinburne/pafi `_, which distributes multiple LAMMPS workers in parallel to compute and collate @@ -84,7 +84,7 @@ This fix produces a global vector each timestep which can be accessed by various Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 5bc7b75c90..60e0847eab 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -152,8 +152,9 @@ related tasks for each of the partitions, e.g. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the REPLICA package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. A PIMD simulation can be initialized with a single data file read via the :doc:`read_data ` command. However, this means all diff --git a/doc/src/fix_rhok.rst b/doc/src/fix_rhok.rst index 71a575810c..f48b562ca8 100644 --- a/doc/src/fix_rhok.rst +++ b/doc/src/fix_rhok.rst @@ -43,7 +43,7 @@ used to study crystal-liquid interfaces and determine melting temperatures :ref:`(Pedersen) `. An example of using the interface pinning method is located in the -*examples/USER-MISC/rhok* directory. +*examples/PACKAGES/rhok* directory. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" @@ -70,7 +70,7 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_ti_spring.rst b/doc/src/fix_ti_spring.rst index 7003100631..e7758350f7 100644 --- a/doc/src/fix_ti_spring.rst +++ b/doc/src/fix_ti_spring.rst @@ -170,8 +170,9 @@ Related commands Restrictions """""""""""" -This fix is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the EXTRA-FIX package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` doc page for more info. Default """"""" diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst index 24bc6f297f..92a884ee58 100644 --- a/doc/src/fix_ttm.rst +++ b/doc/src/fix_ttm.rst @@ -322,9 +322,8 @@ of the :doc:`run ` command. The fixes are not invoked during Restrictions """""""""""" -Fix *ttm* is part of the MISC package. It is only enabled if LAMMPS -was built with that package. Fix *ttm/mod* is part of the USER-MISC -package. It is only enabled if LAMMPS was built with that package. +Fix *ttm* and *ttm/mod* are part of the EXTRA-FIX package. They are +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. These fixes can only be used for 3d simulations and orthogonal diff --git a/doc/src/fix_wall_ees.rst b/doc/src/fix_wall_ees.rst index 1b1e904126..a2aab975ca 100644 --- a/doc/src/fix_wall_ees.rst +++ b/doc/src/fix_wall_ees.rst @@ -117,7 +117,7 @@ ellipsoidal particles according to the EES potential introduced above. Other details of this command are the same as for the :doc:`fix wall/region ` command. One may also find an example -of using this fix in the examples/USER-MISC/ees/ directory. +of using this fix in the examples/PACKAGES/ees/ directory. ---------- @@ -160,7 +160,7 @@ minimization, invoked by the :doc:`minimize ` command. Restrictions """""""""""" -These fixes are part of the USER-MISC package. They are only enabled +These fixes are part of the EXTRA-FIX package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. diff --git a/doc/src/fix_wall_reflect_stochastic.rst b/doc/src/fix_wall_reflect_stochastic.rst index ddeebfbe38..e03e8db5bc 100644 --- a/doc/src/fix_wall_reflect_stochastic.rst +++ b/doc/src/fix_wall_reflect_stochastic.rst @@ -106,7 +106,7 @@ bodies such as those defined by the :doc:`fix rigid ` command. The wall velocity must lie on the same plane as the wall itself. -This fix is part of the USER-MISC package. It is only enabled if +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. Related commands From 1ebd60e35e5956c6d0691bbe4098da393e9f80f6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 10:56:38 -0400 Subject: [PATCH 151/352] update and add explanation --- cmake/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 6c446bdb1b..7269fc5c9b 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -245,13 +245,14 @@ else() endif() if(BUILD_MPI) + # do not include the (obsolete) MPI C++ bindings which makes + # for leaner object files and avoids namespace conflicts + set(MPI_CXX_SKIP_MPICXX TRUE) # We use a non-standard procedure to cross-compile with MPI on Windows if((CMAKE_SYSTEM_NAME STREQUAL "Windows") AND CMAKE_CROSSCOMPILING) - set(MPI_CXX_SKIP_MPICXX TRUE) include(MPI4WIN) target_link_libraries(lammps PUBLIC MPI::MPI_CXX) else() - set(MPI_CXX_SKIP_MPICXX TRUE) find_package(MPI REQUIRED) target_link_libraries(lammps PUBLIC MPI::MPI_CXX) option(LAMMPS_LONGLONG_TO_LONG "Workaround if your system or MPI version does not recognize 'long long' data types" OFF) From 5a79429f034640bafa1c75b4fa4e3f113ec17a17 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 20:23:37 -0400 Subject: [PATCH 152/352] fix up some more package designations and clean up some legacy formatting --- doc/src/Bibliography.rst | 4 +- doc/src/Commands_category.rst | 2 +- doc/src/Commands_input.rst | 2 +- doc/src/Commands_parse.rst | 2 +- doc/src/Errors_messages.rst | 32 ++--- doc/src/Errors_warnings.rst | 2 +- doc/src/Examples.rst | 4 +- doc/src/Howto_barostat.rst | 2 +- doc/src/Howto_bioFF.rst | 2 +- doc/src/Howto_body.rst | 10 +- doc/src/Howto_chunk.rst | 2 +- doc/src/Howto_client_server.rst | 4 +- doc/src/Howto_coreshell.rst | 4 +- doc/src/Howto_couple.rst | 2 +- doc/src/Howto_drude2.rst | 16 +-- doc/src/Howto_github.rst | 4 +- doc/src/Howto_kappa.rst | 4 +- doc/src/Howto_manifold.rst | 2 +- doc/src/Howto_mdi.rst | 4 +- doc/src/Howto_output.rst | 4 +- doc/src/Howto_replica.rst | 2 +- doc/src/Howto_thermostat.rst | 4 +- doc/src/Howto_triclinic.rst | 30 ++-- doc/src/Howto_viscosity.rst | 2 +- doc/src/Howto_viz.rst | 2 +- doc/src/Howto_walls.rst | 2 +- doc/src/Intro_nonfeatures.rst | 8 +- doc/src/Intro_overview.rst | 2 +- doc/src/Modify_body.rst | 2 +- doc/src/Modify_contribute.rst | 10 +- doc/src/Modify_fix.rst | 2 +- doc/src/Packages.rst | 2 +- doc/src/Python_call.rst | 2 +- doc/src/Python_objects.rst | 2 +- doc/src/Python_trouble.rst | 2 +- doc/src/Run_basics.rst | 2 +- doc/src/Run_options.rst | 12 +- doc/src/Run_output.rst | 2 +- doc/src/Speed_gpu.rst | 6 +- doc/src/Speed_intel.rst | 4 +- doc/src/Speed_kokkos.rst | 6 +- doc/src/Speed_omp.rst | 6 +- doc/src/Speed_opt.rst | 2 +- doc/src/Tools.rst | 2 +- doc/src/accel_styles.rst | 6 +- doc/src/angle_charmm.rst | 6 +- doc/src/angle_cosine_delta.rst | 2 +- doc/src/angle_cosine_periodic.rst | 2 +- doc/src/angle_hybrid.rst | 2 +- doc/src/angle_sdk.rst | 2 +- doc/src/angle_style.rst | 4 +- doc/src/atc_control_thermal.rst | 2 +- doc/src/atom_modify.rst | 2 +- doc/src/atom_style.rst | 26 ++-- doc/src/balance.rst | 16 +-- doc/src/bond_class2.rst | 2 +- doc/src/bond_fene.rst | 2 +- doc/src/bond_fene_expand.rst | 2 +- doc/src/bond_gromos.rst | 2 +- doc/src/bond_harmonic.rst | 2 +- doc/src/bond_hybrid.rst | 2 +- doc/src/bond_morse.rst | 2 +- doc/src/bond_nonlinear.rst | 4 +- doc/src/bond_oxdna.rst | 4 +- doc/src/bond_quartic.rst | 2 +- doc/src/bond_style.rst | 2 +- doc/src/bond_table.rst | 2 +- doc/src/boundary.rst | 12 +- doc/src/box.rst | 6 +- doc/src/change_box.rst | 30 ++-- doc/src/comm_modify.rst | 10 +- doc/src/compute.rst | 12 +- doc/src/compute_ackland_atom.rst | 4 +- doc/src/compute_adf.rst | 23 ++-- doc/src/compute_angle.rst | 2 +- doc/src/compute_angle_local.rst | 2 +- doc/src/compute_angmom_chunk.rst | 2 +- doc/src/compute_basal_atom.rst | 2 +- doc/src/compute_body_local.rst | 6 +- doc/src/compute_bond.rst | 2 +- doc/src/compute_bond_local.rst | 8 +- doc/src/compute_centro_atom.rst | 6 +- doc/src/compute_chunk_atom.rst | 128 +++++++++--------- doc/src/compute_chunk_spread_atom.rst | 2 +- doc/src/compute_cluster_atom.rst | 9 +- doc/src/compute_cna_atom.rst | 2 +- doc/src/compute_cnp_atom.rst | 6 +- doc/src/compute_contact_atom.rst | 6 +- doc/src/compute_coord_atom.rst | 4 +- doc/src/compute_damage_atom.rst | 4 +- doc/src/compute_dihedral.rst | 2 +- doc/src/compute_dihedral_local.rst | 2 +- doc/src/compute_dilatation_atom.rst | 4 +- doc/src/compute_dipole.rst | 4 +- doc/src/compute_dipole_chunk.rst | 4 +- doc/src/compute_dpd.rst | 4 +- doc/src/compute_dpd_atom.rst | 4 +- doc/src/compute_edpd_temp_atom.rst | 4 +- doc/src/compute_efield_atom.rst | 2 +- doc/src/compute_entropy_atom.rst | 6 +- doc/src/compute_erotate_asphere.rst | 2 +- doc/src/compute_erotate_rigid.rst | 4 +- doc/src/compute_erotate_sphere.rst | 2 +- doc/src/compute_erotate_sphere_atom.rst | 2 +- doc/src/compute_event_displace.rst | 2 +- doc/src/compute_fep.rst | 8 +- doc/src/compute_global_atom.rst | 4 +- doc/src/compute_group_group.rst | 10 +- doc/src/compute_gyration.rst | 2 +- doc/src/compute_gyration_chunk.rst | 2 +- doc/src/compute_gyration_shape.rst | 4 +- doc/src/compute_gyration_shape_chunk.rst | 4 +- doc/src/compute_heat_flux.rst | 4 +- doc/src/compute_hexorder_atom.rst | 6 +- doc/src/compute_hma.rst | 6 +- doc/src/compute_improper.rst | 2 +- doc/src/compute_improper_local.rst | 2 +- doc/src/compute_inertia_chunk.rst | 2 +- doc/src/compute_ke_atom.rst | 2 +- doc/src/compute_ke_atom_eff.rst | 4 +- doc/src/compute_ke_eff.rst | 4 +- doc/src/compute_ke_rigid.rst | 4 +- doc/src/compute_mesont.rst | 2 +- doc/src/compute_mliap.rst | 2 +- doc/src/compute_modify.rst | 4 +- doc/src/compute_momentum.rst | 4 +- doc/src/compute_msd_chunk.rst | 2 +- doc/src/compute_msd_nongauss.rst | 6 +- doc/src/compute_omega_chunk.rst | 2 +- doc/src/compute_orientorder_atom.rst | 4 +- doc/src/compute_pair.rst | 10 +- doc/src/compute_pair_local.rst | 20 +-- doc/src/compute_pe_atom.rst | 2 +- doc/src/compute_plasticity_atom.rst | 4 +- doc/src/compute_pressure.rst | 2 +- doc/src/compute_pressure_cylinder.rst | 2 +- doc/src/compute_pressure_uef.rst | 2 +- doc/src/compute_property_atom.rst | 14 +- doc/src/compute_property_chunk.rst | 8 +- doc/src/compute_property_local.rst | 12 +- doc/src/compute_ptm_atom.rst | 4 +- doc/src/compute_rdf.rst | 10 +- doc/src/compute_reduce.rst | 6 +- doc/src/compute_reduce_chunk.rst | 2 +- doc/src/compute_rigid_local.rst | 28 ++-- doc/src/compute_saed.rst | 4 +- doc/src/compute_slice.rst | 8 +- doc/src/compute_smd_contact_radius.rst | 4 +- doc/src/compute_smd_damage.rst | 2 +- doc/src/compute_smd_hourglass_error.rst | 4 +- doc/src/compute_smd_internal_energy.rst | 4 +- doc/src/compute_smd_plastic_strain.rst | 4 +- doc/src/compute_smd_plastic_strain_rate.rst | 4 +- doc/src/compute_smd_rho.rst | 4 +- doc/src/compute_smd_tlsph_defgrad.rst | 2 +- doc/src/compute_smd_tlsph_dt.rst | 4 +- doc/src/compute_smd_tlsph_num_neighs.rst | 4 +- doc/src/compute_smd_tlsph_shape.rst | 4 +- doc/src/compute_smd_tlsph_strain.rst | 2 +- doc/src/compute_smd_tlsph_strain_rate.rst | 2 +- doc/src/compute_smd_tlsph_stress.rst | 2 +- doc/src/compute_smd_triangle_vertices.rst | 4 +- doc/src/compute_smd_ulsph_effm.rst | 4 +- doc/src/compute_smd_ulsph_num_neighs.rst | 4 +- doc/src/compute_smd_ulsph_strain.rst | 4 +- doc/src/compute_smd_ulsph_strain_rate.rst | 2 +- doc/src/compute_smd_ulsph_stress.rst | 2 +- doc/src/compute_smd_vol.rst | 4 +- doc/src/compute_sna_atom.rst | 24 ++-- doc/src/compute_sph_e_atom.rst | 4 +- doc/src/compute_sph_rho_atom.rst | 4 +- doc/src/compute_sph_t_atom.rst | 4 +- doc/src/compute_spin.rst | 2 +- doc/src/compute_stress_atom.rst | 2 +- doc/src/compute_stress_mop.rst | 4 +- doc/src/compute_tally.rst | 4 +- doc/src/compute_tdpd_cc_atom.rst | 4 +- doc/src/compute_temp.rst | 4 +- doc/src/compute_temp_asphere.rst | 6 +- doc/src/compute_temp_body.rst | 6 +- doc/src/compute_temp_chunk.rst | 4 +- doc/src/compute_temp_com.rst | 4 +- doc/src/compute_temp_cs.rst | 4 +- doc/src/compute_temp_deform.rst | 4 +- doc/src/compute_temp_deform_eff.rst | 4 +- doc/src/compute_temp_drude.rst | 2 +- doc/src/compute_temp_eff.rst | 4 +- doc/src/compute_temp_partial.rst | 4 +- doc/src/compute_temp_profile.rst | 14 +- doc/src/compute_temp_ramp.rst | 4 +- doc/src/compute_temp_region.rst | 4 +- doc/src/compute_temp_region_eff.rst | 4 +- doc/src/compute_temp_rotate.rst | 6 +- doc/src/compute_temp_sphere.rst | 4 +- doc/src/compute_temp_uef.rst | 2 +- doc/src/compute_ti.rst | 6 +- doc/src/compute_vcm_chunk.rst | 2 +- doc/src/compute_viscosity_cos.rst | 4 +- doc/src/compute_voronoi_atom.rst | 8 +- doc/src/compute_xrd.rst | 2 +- doc/src/create_atoms.rst | 12 +- doc/src/create_bonds.rst | 8 +- doc/src/create_box.rst | 6 +- doc/src/delete_atoms.rst | 8 +- doc/src/delete_bonds.rst | 10 +- doc/src/dihedral_charmm.rst | 2 +- doc/src/dihedral_helix.rst | 2 +- doc/src/dihedral_hybrid.rst | 2 +- doc/src/dihedral_style.rst | 4 +- doc/src/dimension.rst | 2 +- doc/src/displace_atoms.rst | 2 +- doc/src/dump.rst | 78 +++++------ doc/src/dump_adios.rst | 2 +- doc/src/dump_cfg_uef.rst | 2 +- doc/src/dump_h5md.rst | 8 +- doc/src/dump_image.rst | 32 ++--- doc/src/dump_modify.rst | 82 +++++------ doc/src/dump_molfile.rst | 2 +- doc/src/dump_netcdf.rst | 2 +- doc/src/dump_vtk.rst | 6 +- doc/src/dynamical_matrix.rst | 2 +- doc/src/fix.rst | 14 +- doc/src/fix_adapt.rst | 8 +- doc/src/fix_adapt_fep.rst | 8 +- doc/src/fix_addforce.rst | 6 +- doc/src/fix_addtorque.rst | 6 +- doc/src/fix_append_atoms.rst | 4 +- doc/src/fix_atom_swap.rst | 8 +- doc/src/fix_ave_atom.rst | 4 +- doc/src/fix_ave_chunk.rst | 42 +++--- doc/src/fix_ave_correlate.rst | 24 ++-- doc/src/fix_ave_correlate_long.rst | 8 +- doc/src/fix_ave_histo.rst | 20 +-- doc/src/fix_ave_time.rst | 18 +-- doc/src/fix_aveforce.rst | 2 +- doc/src/fix_balance.rst | 2 +- doc/src/fix_bocs.rst | 10 +- doc/src/fix_bond_break.rst | 2 +- doc/src/fix_bond_create.rst | 10 +- doc/src/fix_bond_react.rst | 6 +- doc/src/fix_bond_swap.rst | 4 +- doc/src/fix_box_relax.rst | 34 ++--- doc/src/fix_charge_regulation.rst | 2 +- doc/src/fix_client_md.rst | 4 +- doc/src/fix_cmap.rst | 4 +- doc/src/fix_colvars.rst | 4 +- doc/src/fix_controller.rst | 14 +- doc/src/fix_deform.rst | 52 +++---- doc/src/fix_deposit.rst | 5 +- doc/src/fix_dpd_energy.rst | 8 +- doc/src/fix_dpd_source.rst | 2 +- doc/src/fix_drag.rst | 4 +- doc/src/fix_drude_transform.rst | 2 +- doc/src/fix_dt_reset.rst | 4 +- doc/src/fix_efield.rst | 9 +- doc/src/fix_ehex.rst | 4 +- doc/src/fix_electron_stopping.rst | 4 +- doc/src/fix_eos_cv.rst | 2 +- doc/src/fix_eos_table.rst | 2 +- doc/src/fix_eos_table_rx.rst | 6 +- doc/src/fix_evaporate.rst | 7 +- doc/src/fix_external.rst | 2 +- doc/src/fix_ffl.rst | 2 +- doc/src/fix_filter_corotate.rst | 2 +- doc/src/fix_flow_gauss.rst | 4 +- doc/src/fix_freeze.rst | 2 +- doc/src/fix_gcmc.rst | 8 +- doc/src/fix_gld.rst | 10 +- doc/src/fix_gle.rst | 4 +- doc/src/fix_gravity.rst | 2 +- doc/src/fix_grem.rst | 2 +- doc/src/fix_halt.rst | 8 +- doc/src/fix_hyper_global.rst | 14 +- doc/src/fix_hyper_local.rst | 20 +-- doc/src/fix_imd.rst | 4 +- doc/src/fix_indent.rst | 14 +- doc/src/fix_ipi.rst | 6 +- doc/src/fix_langevin.rst | 10 +- doc/src/fix_langevin_drude.rst | 10 +- doc/src/fix_langevin_eff.rst | 6 +- doc/src/fix_langevin_spin.rst | 2 +- doc/src/fix_latte.rst | 4 +- doc/src/fix_lb_fluid.rst | 6 +- doc/src/fix_lb_momentum.rst | 4 +- doc/src/fix_lb_pc.rst | 4 +- doc/src/fix_lb_rigid_pc_sphere.rst | 2 +- doc/src/fix_lb_viscous.rst | 2 +- doc/src/fix_manifoldforce.rst | 2 +- doc/src/fix_mdi_engine.rst | 2 +- doc/src/fix_meso_move.rst | 6 +- doc/src/fix_modify.rst | 4 +- doc/src/fix_momentum.rst | 2 +- doc/src/fix_move.rst | 4 +- doc/src/fix_mscg.rst | 4 +- doc/src/fix_msst.rst | 8 +- doc/src/fix_mvv_dpd.rst | 2 +- doc/src/fix_neb.rst | 16 +-- doc/src/fix_nh.rst | 56 ++++---- doc/src/fix_nh_eff.rst | 8 +- doc/src/fix_nh_uef.rst | 10 +- doc/src/fix_nph_asphere.rst | 6 +- doc/src/fix_nph_body.rst | 6 +- doc/src/fix_nph_sphere.rst | 4 +- doc/src/fix_nphug.rst | 18 +-- doc/src/fix_npt_asphere.rst | 8 +- doc/src/fix_npt_body.rst | 8 +- doc/src/fix_npt_cauchy.rst | 56 ++++---- doc/src/fix_npt_sphere.rst | 6 +- doc/src/fix_numdiff.rst | 4 +- doc/src/fix_nve_asphere.rst | 2 +- doc/src/fix_nve_asphere_noforce.rst | 2 +- doc/src/fix_nve_awpmd.rst | 2 +- doc/src/fix_nve_body.rst | 4 +- doc/src/fix_nve_dot.rst | 2 +- doc/src/fix_nve_dotc_langevin.rst | 2 +- doc/src/fix_nve_eff.rst | 2 +- doc/src/fix_nve_line.rst | 4 +- doc/src/fix_nve_manifold_rattle.rst | 2 +- doc/src/fix_nve_noforce.rst | 4 +- doc/src/fix_nve_spin.rst | 2 +- doc/src/fix_nve_tri.rst | 4 +- doc/src/fix_nvk.rst | 2 +- doc/src/fix_nvt_asphere.rst | 2 +- doc/src/fix_nvt_body.rst | 2 +- doc/src/fix_nvt_manifold_rattle.rst | 2 +- doc/src/fix_nvt_sllod_eff.rst | 2 +- doc/src/fix_oneway.rst | 2 +- doc/src/fix_orient.rst | 2 +- doc/src/fix_orient_eco.rst | 2 +- doc/src/fix_pafi.rst | 2 +- doc/src/fix_pair_tracker.rst | 4 +- doc/src/fix_phonon.rst | 14 +- doc/src/fix_pimd.rst | 2 +- doc/src/fix_plumed.rst | 2 +- doc/src/fix_poems.rst | 8 +- doc/src/fix_polarize.rst | 2 +- doc/src/fix_pour.rst | 10 +- doc/src/fix_precession_spin.rst | 2 +- doc/src/fix_press_berendsen.rst | 16 +-- doc/src/fix_propel_self.rst | 2 +- doc/src/fix_property_atom.rst | 6 +- doc/src/fix_python_invoke.rst | 2 +- doc/src/fix_python_move.rst | 2 +- doc/src/fix_qbmsst.rst | 14 +- doc/src/fix_qeq.rst | 14 +- doc/src/fix_qeq_reaxff.rst | 4 +- doc/src/fix_qmmm.rst | 2 +- doc/src/fix_qtb.rst | 2 +- doc/src/fix_reaxff_bonds.rst | 4 +- doc/src/fix_reaxff_species.rst | 8 +- doc/src/fix_recenter.rst | 2 +- doc/src/fix_rhok.rst | 2 +- doc/src/fix_rigid.rst | 34 ++--- doc/src/fix_rigid_meso.rst | 10 +- doc/src/fix_rx.rst | 8 +- doc/src/fix_saed_vtk.rst | 10 +- doc/src/fix_setforce.rst | 10 +- doc/src/fix_shake.rst | 6 +- doc/src/fix_shardlow.rst | 6 +- doc/src/fix_smd.rst | 2 +- doc/src/fix_smd_adjust_dt.rst | 2 +- doc/src/fix_smd_integrate_tlsph.rst | 2 +- doc/src/fix_smd_integrate_ulsph.rst | 2 +- doc/src/fix_smd_move_triangulated_surface.rst | 2 +- doc/src/fix_smd_setvel.rst | 6 +- doc/src/fix_smd_wall_surface.rst | 2 +- doc/src/fix_sph.rst | 2 +- doc/src/fix_sph_stationary.rst | 2 +- doc/src/fix_spring_rg.rst | 4 +- doc/src/fix_srd.rst | 8 +- doc/src/fix_store_state.rst | 2 +- doc/src/fix_temp_berendsen.rst | 2 +- doc/src/fix_temp_csvr.rst | 5 +- doc/src/fix_temp_rescale.rst | 2 +- doc/src/fix_temp_rescale_eff.rst | 2 +- doc/src/fix_tfmc.rst | 4 +- doc/src/fix_tgnh_drude.rst | 20 +-- doc/src/fix_thermal_conductivity.rst | 3 - doc/src/fix_ti_spring.rst | 2 +- doc/src/fix_tmd.rst | 3 + doc/src/fix_ttm.rst | 2 +- doc/src/fix_tune_kspace.rst | 2 +- doc/src/fix_vector.rst | 6 +- doc/src/fix_viscosity.rst | 4 +- doc/src/fix_wall.rst | 24 ++-- doc/src/fix_wall_body_polygon.rst | 6 +- doc/src/fix_wall_body_polyhedron.rst | 6 +- doc/src/fix_wall_ees.rst | 4 +- doc/src/fix_wall_gran.rst | 20 +-- doc/src/fix_wall_gran_region.rst | 14 +- doc/src/fix_wall_piston.rst | 2 +- doc/src/fix_wall_reflect.rst | 6 +- doc/src/fix_wall_reflect_stochastic.rst | 10 +- doc/src/fix_wall_region.rst | 12 +- doc/src/fix_wall_srd.rst | 8 +- doc/src/fix_widom.rst | 2 +- doc/src/group.rst | 6 +- doc/src/group2ndx.rst | 2 +- doc/src/hyper.rst | 4 +- doc/src/if.rst | 2 +- doc/src/improper_harmonic.rst | 6 +- doc/src/improper_style.rst | 4 +- doc/src/info.rst | 6 +- doc/src/kim_commands.rst | 2 +- doc/src/kspace_modify.rst | 30 ++-- doc/src/kspace_style.rst | 12 +- doc/src/lattice.rst | 8 +- doc/src/log.rst | 2 +- doc/src/mdi_engine.rst | 4 +- doc/src/message.rst | 20 +-- doc/src/min_modify.rst | 12 +- doc/src/min_spin.rst | 2 +- doc/src/min_style.rst | 12 +- doc/src/minimize.rst | 10 +- doc/src/molecule.rst | 12 +- doc/src/neb.rst | 12 +- doc/src/neb_spin.rst | 12 +- doc/src/neigh_modify.rst | 8 +- doc/src/neighbor.rst | 2 +- doc/src/next.rst | 6 +- doc/src/package.rst | 28 ++-- doc/src/pair_adp.rst | 4 +- doc/src/pair_agni.rst | 10 +- doc/src/pair_airebo.rst | 10 +- doc/src/pair_atm.rst | 4 +- doc/src/pair_awpmd.rst | 8 +- doc/src/pair_beck.rst | 2 +- doc/src/pair_body_nparticle.rst | 8 +- doc/src/pair_body_rounded_polygon.rst | 6 +- doc/src/pair_body_rounded_polyhedron.rst | 6 +- doc/src/pair_bop.rst | 4 +- doc/src/pair_born.rst | 14 +- doc/src/pair_brownian.rst | 6 +- doc/src/pair_buck.rst | 10 +- doc/src/pair_buck6d_coul_gauss.rst | 2 +- doc/src/pair_buck_long.rst | 16 +-- doc/src/pair_charmm.rst | 6 +- doc/src/pair_class2.rst | 10 +- doc/src/pair_coeff.rst | 2 +- doc/src/pair_colloid.rst | 4 +- doc/src/pair_comb.rst | 16 +-- doc/src/pair_cosine_squared.rst | 6 +- doc/src/pair_coul.rst | 22 +-- doc/src/pair_coul_diel.rst | 4 +- doc/src/pair_coul_shield.rst | 4 +- doc/src/pair_coul_slater.rst | 4 +- doc/src/pair_coul_tt.rst | 4 +- doc/src/pair_cs.rst | 4 +- doc/src/pair_dielectric.rst | 4 +- doc/src/pair_dipole.rst | 16 +-- doc/src/pair_dpd.rst | 14 +- doc/src/pair_dpd_ext.rst | 12 +- doc/src/pair_dpd_fdt.rst | 4 +- doc/src/pair_drip.rst | 2 +- doc/src/pair_dsmc.rst | 4 +- doc/src/pair_e3b.rst | 4 +- doc/src/pair_eam.rst | 14 +- doc/src/pair_edip.rst | 4 +- doc/src/pair_eff.rst | 6 +- doc/src/pair_eim.rst | 2 +- doc/src/pair_exp6_rx.rst | 4 +- doc/src/pair_fep_soft.rst | 8 +- doc/src/pair_gauss.rst | 4 +- doc/src/pair_gayberne.rst | 4 +- doc/src/pair_gran.rst | 8 +- doc/src/pair_granular.rst | 42 +++--- doc/src/pair_gromacs.rst | 7 +- doc/src/pair_gw.rst | 6 +- doc/src/pair_hbond_dreiding.rst | 10 +- doc/src/pair_hdnnp.rst | 2 +- doc/src/pair_hybrid.rst | 14 +- doc/src/pair_ilp_graphene_hbn.rst | 4 +- doc/src/pair_kim.rst | 2 +- doc/src/pair_kolmogorov_crespi_full.rst | 4 +- doc/src/pair_kolmogorov_crespi_z.rst | 4 +- doc/src/pair_lcbop.rst | 6 +- doc/src/pair_lebedeva_z.rst | 4 +- doc/src/pair_line_lj.rst | 8 +- doc/src/pair_list.rst | 4 +- doc/src/pair_lj.rst | 4 +- doc/src/pair_lj96.rst | 7 +- doc/src/pair_lj_cubic.rst | 7 +- doc/src/pair_lj_cut_coul.rst | 14 +- doc/src/pair_lj_cut_tip4p.rst | 8 +- doc/src/pair_lj_expand.rst | 2 +- doc/src/pair_lj_long.rst | 24 ++-- doc/src/pair_lj_relres.rst | 9 +- doc/src/pair_lj_smooth.rst | 7 +- doc/src/pair_lj_smooth_linear.rst | 7 +- doc/src/pair_lj_switch3_coulgauss_long.rst | 4 +- doc/src/pair_local_density.rst | 6 +- doc/src/pair_lubricate.rst | 8 +- doc/src/pair_lubricateU.rst | 10 +- doc/src/pair_mdf.rst | 14 +- doc/src/pair_meam.rst | 6 +- doc/src/pair_meam_spline.rst | 8 +- doc/src/pair_meam_sw_spline.rst | 6 +- doc/src/pair_mesocnt.rst | 4 +- doc/src/pair_mesodpd.rst | 10 +- doc/src/pair_mgpt.rst | 4 +- doc/src/pair_mie.rst | 7 +- doc/src/pair_mliap.rst | 6 +- doc/src/pair_modify.rst | 8 +- doc/src/pair_momb.rst | 2 +- doc/src/pair_morse.rst | 8 +- doc/src/pair_multi_lucy.rst | 6 +- doc/src/pair_multi_lucy_rx.rst | 6 +- doc/src/pair_nb3b_harmonic.rst | 6 +- doc/src/pair_nm.rst | 9 +- doc/src/pair_none.rst | 2 +- doc/src/pair_oxdna.rst | 4 +- doc/src/pair_oxdna2.rst | 6 +- doc/src/pair_oxrna2.rst | 6 +- doc/src/pair_pace.rst | 6 +- doc/src/pair_peri.rst | 4 +- doc/src/pair_polymorphic.rst | 4 +- doc/src/pair_python.rst | 6 +- doc/src/pair_quip.rst | 6 +- doc/src/pair_reaxff.rst | 8 +- doc/src/pair_resquared.rst | 4 +- doc/src/pair_sdk.rst | 2 +- doc/src/pair_sdpd_taitwater_isothermal.rst | 6 +- doc/src/pair_smd_hertz.rst | 2 +- doc/src/pair_smd_tlsph.rst | 2 +- doc/src/pair_smd_triangulated_surface.rst | 2 +- doc/src/pair_smd_ulsph.rst | 2 +- doc/src/pair_smtbq.rst | 20 +-- doc/src/pair_snap.rst | 14 +- doc/src/pair_soft.rst | 2 +- doc/src/pair_sph_heatconduction.rst | 6 +- doc/src/pair_sph_idealgas.rst | 6 +- doc/src/pair_sph_lj.rst | 6 +- doc/src/pair_sph_rhosum.rst | 6 +- doc/src/pair_sph_taitwater.rst | 6 +- doc/src/pair_sph_taitwater_morris.rst | 6 +- doc/src/pair_spin_dipole.rst | 2 +- doc/src/pair_spin_dmi.rst | 2 +- doc/src/pair_spin_exchange.rst | 2 +- doc/src/pair_spin_magelec.rst | 2 +- doc/src/pair_spin_neel.rst | 2 +- doc/src/pair_srp.rst | 6 +- doc/src/pair_style.rst | 2 +- doc/src/pair_sw.rst | 14 +- doc/src/pair_table.rst | 6 +- doc/src/pair_table_rx.rst | 8 +- doc/src/pair_tersoff.rst | 6 +- doc/src/pair_tersoff_mod.rst | 4 +- doc/src/pair_tersoff_zbl.rst | 6 +- doc/src/pair_thole.rst | 6 +- doc/src/pair_tracker.rst | 2 +- doc/src/pair_tri_lj.rst | 6 +- doc/src/pair_ufm.rst | 7 +- doc/src/pair_vashishta.rst | 14 +- doc/src/pair_wf_cut.rst | 2 +- doc/src/pair_write.rst | 8 +- doc/src/pair_yukawa.rst | 2 +- doc/src/pair_yukawa_colloid.rst | 4 +- doc/src/pair_zbl.rst | 2 +- doc/src/pair_zero.rst | 2 +- doc/src/partition.rst | 2 +- doc/src/plugin.rst | 2 +- doc/src/prd.rst | 10 +- doc/src/processors.rst | 8 +- doc/src/python.rst | 8 +- doc/src/read_data.rst | 22 +-- doc/src/read_dump.rst | 32 ++--- doc/src/region.rst | 40 +++--- doc/src/rerun.rst | 14 +- doc/src/run.rst | 8 +- doc/src/run_style.rst | 6 +- doc/src/server.rst | 8 +- doc/src/server_mc.rst | 6 +- doc/src/server_md.rst | 6 +- doc/src/set.rst | 24 ++-- doc/src/shell.rst | 2 +- doc/src/special_bonds.rst | 6 +- doc/src/suffix.rst | 6 +- doc/src/tad.rst | 8 +- doc/src/temper.rst | 2 +- doc/src/temper_grem.rst | 2 +- doc/src/temper_npt.rst | 2 +- doc/src/thermo_modify.rst | 14 +- doc/src/thermo_style.rst | 16 +-- doc/src/third_order.rst | 2 +- doc/src/timer.rst | 2 +- doc/src/timestep.rst | 2 +- doc/src/units.rst | 18 +-- doc/src/variable.rst | 34 ++--- doc/src/velocity.rst | 6 +- doc/src/write_data.rst | 4 +- .../pair_coul_streitz.cpp | 0 .../pair_coul_streitz.h | 0 592 files changed, 2074 insertions(+), 2019 deletions(-) rename src/{EXTRA-PAIR => KSPACE}/pair_coul_streitz.cpp (100%) rename src/{EXTRA-PAIR => KSPACE}/pair_coul_streitz.h (100%) diff --git a/doc/src/Bibliography.rst b/doc/src/Bibliography.rst index a4a1076831..0256552332 100644 --- a/doc/src/Bibliography.rst +++ b/doc/src/Bibliography.rst @@ -191,7 +191,7 @@ Bibliography A.\ Calhoun, M. Pavese, G. Voth, Chem Phys Letters, 262, 415 (1996). **(Campana)** - C.\ Campana and M. H. Muser, *Practical Green's function approach to the simulation of elastic semi-infinite solids*\ , `Phys. Rev. B [74], 075420 (2006) `_ + C.\ Campana and M. H. Muser, *Practical Green's function approach to the simulation of elastic semi-infinite solids*, `Phys. Rev. B [74], 075420 (2006) `_ **(Cao1)** J.\ Cao and B. Berne, J Chem Phys, 99, 2902 (1993). @@ -767,7 +767,7 @@ Bibliography Morris, Fox, Zhu, J Comp Physics, 136, 214-226 (1997). **(Moustafa)** - Sabry G. Moustafa, Andrew J. Schultz, and David A. Kofke, *Very fast averaging of thermal properties of crystals by molecular simulation*\ , `Phys. Rev. E [92], 043303 (2015) `_ + Sabry G. Moustafa, Andrew J. Schultz, and David A. Kofke, *Very fast averaging of thermal properties of crystals by molecular simulation*, `Phys. Rev. E [92], 043303 (2015) `_ **(Muller-Plathe1)** Muller-Plathe, J Chem Phys, 106, 6082 (1997). diff --git a/doc/src/Commands_category.rst b/doc/src/Commands_category.rst index da40ada999..4a08d040b7 100644 --- a/doc/src/Commands_category.rst +++ b/doc/src/Commands_category.rst @@ -2,7 +2,7 @@ Commands by category ==================== This page lists most of the LAMMPS commands, grouped by category. The -:doc:`General commands ` doc page lists all general commands +:doc:`General commands ` page lists all general commands alphabetically. Style options for entries like fix, compute, pair etc. have their own pages where they are listed alphabetically. diff --git a/doc/src/Commands_input.rst b/doc/src/Commands_input.rst index 8fc658a215..3313474686 100644 --- a/doc/src/Commands_input.rst +++ b/doc/src/Commands_input.rst @@ -50,6 +50,6 @@ values are not desired, the :doc:`processors ` and tell LAMMPS how to map processors to the simulation box. Many input script errors are detected by LAMMPS and an ERROR or -WARNING message is printed. The :doc:`Errors ` doc page gives +WARNING message is printed. The :doc:`Errors ` page gives more information on what errors mean. The documentation for each command lists restrictions on how the command can be used. diff --git a/doc/src/Commands_parse.rst b/doc/src/Commands_parse.rst index 563b18a4c2..efc3c5030d 100644 --- a/doc/src/Commands_parse.rst +++ b/doc/src/Commands_parse.rst @@ -47,7 +47,7 @@ LAMMPS: named "x" followed by an "x" character. How the variable is converted to a text string depends on what style - of variable it is; see the :doc:`variable ` doc page for + of variable it is; see the :doc:`variable ` page for details. It can be a variable that stores multiple text strings, and return one of them. The returned text string can be multiple "words" (space separated) which will then be interpreted as multiple diff --git a/doc/src/Errors_messages.rst b/doc/src/Errors_messages.rst index 3bbee1dc36..a26857ebf5 100644 --- a/doc/src/Errors_messages.rst +++ b/doc/src/Errors_messages.rst @@ -570,10 +570,10 @@ Doc page with :doc:`WARNING messages ` See the region prism command for details. *Can only use -plog with multiple partitions* - Self-explanatory. See doc page discussion of command-line switches. + Self-explanatory. See page discussion of command-line switches. *Can only use -pscreen with multiple partitions* - Self-explanatory. See doc page discussion of command-line switches. + Self-explanatory. See page discussion of command-line switches. *Can only use Kokkos supported regions with Kokkos package* Self-explanatory. @@ -1154,7 +1154,7 @@ Doc page with :doc:`WARNING messages ` Self-explanatory. *Cannot use -reorder after -partition* - Self-explanatory. See doc page discussion of command-line switches. + 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 @@ -2347,14 +2347,14 @@ Doc page with :doc:`WARNING messages ` *Compute used in variable between runs is not current* Computes cannot be invoked by a variable in between runs. Thus they must have been evaluated on the last timestep of the previous run in - order for their value(s) to be accessed. See the doc page for the + order for their value(s) to be accessed. See the page for the variable command for more info. *Compute used in variable thermo keyword between runs is not current* Some thermo keywords rely on a compute to calculate their value(s). Computes cannot be invoked by a variable in between runs. Thus they must have been evaluated on the last timestep of the previous run in - order for their value(s) to be accessed. See the doc page for the + order for their value(s) to be accessed. See the page for the variable command for more info. *Compute vcm/chunk does not use chunk/atom compute* @@ -3126,7 +3126,7 @@ Doc page with :doc:`WARNING messages ` *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 doc page for ideas on how to make this work. + variable page for ideas on how to make this work. *Epsilon or sigma reference not set by pair style in PPPMDisp* Self-explanatory. @@ -4535,10 +4535,10 @@ Doc page with :doc:`WARNING messages ` particles. *Incorrect # of floating-point values in Bodies section of data file* - See doc page for body style. + See page for body style. *Incorrect # of integer values in Bodies section of data file* - See doc page for body style. + See page for body style. *Incorrect %s format in data file* A section of the data file being read by fix property/atom does @@ -4573,7 +4573,7 @@ Doc page with :doc:`WARNING messages ` The number of fields per line is not what expected. *Incorrect bonus data format in data file* - See the read_data doc page for a description of how various kinds of + See the read_data page for a description of how various kinds of bonus data must be formatted for certain atom styles. *Incorrect boundaries with slab Ewald* @@ -4641,7 +4641,7 @@ Doc page with :doc:`WARNING messages ` Incorrect number of words per line in the potential file. *Incorrect integer value in Bodies section of data file* - See doc page for body style. + See page for body style. *Incorrect multiplicity arg for dihedral coefficients* Self-explanatory. Check the input script or data file. @@ -5996,7 +5996,7 @@ Doc page with :doc:`WARNING messages ` Self-explanatory. *Needed bonus data not in data file* - Some atom styles require bonus data. See the read_data doc page for + Some atom styles require bonus data. See the read_data page for details. *Needed molecular topology not in data file* @@ -6198,7 +6198,7 @@ keyword to allow for additional bonds to be formed *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 ` doc page for more info. + 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. @@ -6593,7 +6593,7 @@ keyword to allow for additional bonds to be formed *Pair style bop requires comm ghost cutoff at least 3x larger than %g* Use the communicate ghost command to set this. See the pair bop - doc page for more details. + page for more details. *Pair style born/coul/long requires atom attribute q* An atom style that defines this attribute must be used. @@ -6913,7 +6913,7 @@ keyword to allow for additional bonds to be formed *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 doc page for ideas on how to make this work. + 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. @@ -6921,7 +6921,7 @@ keyword to allow for additional bonds to be formed *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 doc page for ideas on how to make this work. + 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 @@ -8408,7 +8408,7 @@ keyword to allow for additional bonds to be formed *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 doc page for ideas on how to make this work. + 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 806dec024b..d7a97c1507 100644 --- a/doc/src/Errors_warnings.rst +++ b/doc/src/Errors_warnings.rst @@ -213,7 +213,7 @@ Doc page with :doc:`ERROR messages ` in unexpected behavior. *Fix bond/swap will ignore defined angles* - See the doc page for fix bond/swap for more info on this + See the page for fix bond/swap for more info on this restriction. *Fix deposit near setting < possible overlap separation %g* diff --git a/doc/src/Examples.rst b/doc/src/Examples.rst index 043820c5dd..649be52ab7 100644 --- a/doc/src/Examples.rst +++ b/doc/src/Examples.rst @@ -174,10 +174,10 @@ web site. If you uncomment the :doc:`dump image ` line(s) in the input script a series of JPG images will be produced by the run (assuming you built LAMMPS with JPG support; see the -:doc:`Build_settings ` doc page for details). These can +:doc:`Build_settings ` page for details). These can be viewed individually or turned into a movie or animated by tools like ImageMagick or QuickTime or various Windows-based tools. See the -:doc:`dump image ` doc page for more details. E.g. this +:doc:`dump image ` page for more details. E.g. this Imagemagick command would create a GIF file suitable for viewing in a browser. diff --git a/doc/src/Howto_barostat.rst b/doc/src/Howto_barostat.rst index 87dab8dd95..0c25e2c53c 100644 --- a/doc/src/Howto_barostat.rst +++ b/doc/src/Howto_barostat.rst @@ -50,7 +50,7 @@ a temperature or pressure compute to a barostatting fix. Thermodynamic output, which can be setup via the :doc:`thermo_style ` command, often includes pressure -values. As explained on the doc page for the +values. As explained on the page for the :doc:`thermo_style ` command, the default pressure is setup by the thermo command itself. It is NOT the pressure associated with any barostatting fix you have defined or with any compute you diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 9bffe5d4c9..172ba3da3a 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -49,7 +49,7 @@ command's documentation for the formula it computes. COMPASS is a general force field for atomistic simulation of common organic molecules, inorganic small molecules, and polymers which was developed using ab initio and empirical parameterization techniques. -See the :doc:`Tools ` doc page for the msi2lmp tool for creating +See the :doc:`Tools ` page for the msi2lmp tool for creating LAMMPS template input and data files from BIOVIA's Materials Studio files. Please note that the msi2lmp tool is very old and largely unmaintained, so it does not support all features of Materials Studio diff --git a/doc/src/Howto_body.rst b/doc/src/Howto_body.rst index 0c0a930221..cc02e3d52f 100644 --- a/doc/src/Howto_body.rst +++ b/doc/src/Howto_body.rst @@ -10,7 +10,7 @@ deformable objects, etc. Note that other kinds of finite-size spherical and aspherical particles are also supported by LAMMPS, such as spheres, ellipsoids, line segments, and triangles, but they are simpler entities than body particles. See the :doc:`Howto spherical -` doc page for a general overview of all these +` page for a general overview of all these particle types. Body particles are used via the :doc:`atom_style body ` @@ -170,14 +170,14 @@ with this body style to compute body/body and body/non-body interactions. The *rounded/polygon* body style represents body particles as a 2d polygon with a variable number of N vertices. This style can only be used for 2d models; see the :doc:`boundary ` command. See the -"pair_style body/rounded/polygon" doc page for a diagram of two +"pair_style body/rounded/polygon" page for a diagram of two squares with rounded circles at the vertices. Special cases for N = 1 (circle) and N = 2 (rod with rounded ends) can also be specified. One use of this body style is for 2d discrete element models, as described in :ref:`Fraige `. -Similar to body style *nparticle*\ , the atom_style body command for +Similar to body style *nparticle*, the atom_style body command for this body style takes two additional arguments: .. parsed-literal:: @@ -284,7 +284,7 @@ The *rounded/polyhedron* body style represents body particles as a 3d polyhedron with a variable number of N vertices, E edges and F faces. This style can only be used for 3d models; see the :doc:`boundary ` command. See the "pair_style -body/rounded/polygon" doc page for a diagram of a two 2d squares with +body/rounded/polygon" page for a diagram of a two 2d squares with rounded circles at the vertices. A 3d cube with rounded spheres at the 8 vertices and 12 rounded edges would be similar. Special cases for N = 1 (sphere) and N = 2 (rod with rounded ends) can also be @@ -293,7 +293,7 @@ specified. This body style is for 3d discrete element models, as described in :ref:`Wang `. -Similar to body style *rounded/polygon*\ , the atom_style body command +Similar to body style *rounded/polygon*, the atom_style body command for this body style takes two additional arguments: .. parsed-literal:: diff --git a/doc/src/Howto_chunk.rst b/doc/src/Howto_chunk.rst index c0a7792448..858e8241d1 100644 --- a/doc/src/Howto_chunk.rst +++ b/doc/src/Howto_chunk.rst @@ -51,7 +51,7 @@ scales the floating point value to spread it across multiple integers. Spatial bins can be of various kinds, e.g. 1d bins = slabs, 2d bins = pencils, 3d bins = boxes, spherical bins, cylindrical bins. -This compute also calculates the number of chunks *Nchunk*\ , which is +This compute also calculates the number of chunks *Nchunk*, which is used by other commands to tally per-chunk data. *Nchunk* can be a static value or change over time (e.g. the number of clusters). The chunk ID for an individual atom can also be static (e.g. a molecule diff --git a/doc/src/Howto_client_server.rst b/doc/src/Howto_client_server.rst index c22e1ca3ab..7e21b78dfd 100644 --- a/doc/src/Howto_client_server.rst +++ b/doc/src/Howto_client_server.rst @@ -119,7 +119,7 @@ server code. Another code could be substituted for either. The examples below show launching both codes from the same window (or batch script), using the "&" character to launch the first code in the -background. For all modes except *mpi/one*\ , you could also launch the +background. For all modes except *mpi/one*, you could also launch the codes in separate windows on your desktop machine. It does not matter whether you launch the client or server first. @@ -132,7 +132,7 @@ mpirun, even if one or both of them runs on a single processor. This is so that MPI can figure out how to connect both MPI processes together to exchange MPI messages between them. -For message exchange in *file*\ , *zmq*\ , or *mpi/two* modes: +For message exchange in *file*, *zmq*, or *mpi/two* modes: .. code-block:: bash diff --git a/doc/src/Howto_coreshell.rst b/doc/src/Howto_coreshell.rst index 0c1fc924ac..bffee0ca01 100644 --- a/doc/src/Howto_coreshell.rst +++ b/doc/src/Howto_coreshell.rst @@ -5,7 +5,7 @@ The adiabatic core-shell model by :ref:`Mitchell and Fincham ` to a system. In order to mimic the electron shell of an ion, a satellite particle is attached to it. This way the ions are split into a core and a shell where the latter is meant to react to the -electrostatic environment inducing polarizability. See the :doc:`Howto polarizable ` doc page for a discussion of all +electrostatic environment inducing polarizability. See the :doc:`Howto polarizable ` page for a discussion of all the polarizable models available in LAMMPS. Technically, shells are attached to the cores by a spring force f = @@ -78,7 +78,7 @@ satellite particle if desired. Since the core/shell model permits distances of r = 0.0 between the core and shell, a pair style with a "cs" suffix needs to be used to implement a valid long-range Coulombic correction. Several such pair -styles are provided in the CORESHELL package. See :doc:`this doc page ` for details. All of the core/shell enabled pair +styles are provided in the CORESHELL package. See :doc:`this page ` for details. All of the core/shell enabled pair styles require the use of a long-range Coulombic solver, as specified by the :doc:`kspace_style ` command. Either the PPPM or Ewald solvers can be used. diff --git a/doc/src/Howto_couple.rst b/doc/src/Howto_couple.rst index 36ba2a526e..31cafd1f94 100644 --- a/doc/src/Howto_couple.rst +++ b/doc/src/Howto_couple.rst @@ -42,7 +42,7 @@ context of your application. stand-alone code could communicate with LAMMPS through files that the command writes and reads. - See the :doc:`Modify command ` doc page for info on how + See the :doc:`Modify command ` page for info on how to add a new command to LAMMPS. .. spacer diff --git a/doc/src/Howto_drude2.rst b/doc/src/Howto_drude2.rst index 46d400c9e8..589e9d7b9a 100644 --- a/doc/src/Howto_drude2.rst +++ b/doc/src/Howto_drude2.rst @@ -91,7 +91,7 @@ DRUDE package) to convert a non-polarizable data file (here This will automatically insert the new atoms and bonds. The masses and charges of DCs and DPs are computed -from *phenol.dff*\ , as well as the DC-DP bond constants. The file +from *phenol.dff*, as well as the DC-DP bond constants. The file *phenol.dff* contains the polarizabilities of the atom types and the mass of the Drude particles, for instance: @@ -106,7 +106,7 @@ and the mass of the Drude particles, for instance: The hydrogen atoms are absent from this file, so they will be treated as non-polarizable atoms. In the non-polarizable data file -*data.102494.lmp*\ , atom names corresponding to the atom type numbers +*data.102494.lmp*, atom names corresponding to the atom type numbers have to be specified as comments at the end of lines of the *Masses* section. You probably need to edit it to add these names. It should look like @@ -125,7 +125,7 @@ look like **Basic input file** -The atom style should be set to (or derive from) *full*\ , so that you +The atom style should be set to (or derive from) *full*, so that you can define atomic charges and molecular bonds, angles, dihedrals... The *polarizer* tool also outputs certain lines related to the input @@ -143,7 +143,7 @@ and N for non-polarizable atoms. Here the atom types 1 to 3 (C and O atoms) are DC, atom types 4 and 5 (H atoms) are non-polarizable and the atom types 6 to 8 are the newly created DPs. -By recognizing the fix *drude*\ , LAMMPS will find and store matching +By recognizing the fix *drude*, LAMMPS will find and store matching DC-DP pairs and will treat DP as equivalent to their DC in the *special bonds* relations. It may be necessary to extend the space for storing such special relations. In this case extra space should @@ -340,11 +340,11 @@ For the *thole* pair style the coefficients are The special neighbors have charge-charge and charge-dipole interactions screened by the *coul* factors of the *special_bonds* command (0.0, 0.0, and 0.5 in the example above). Without using the -pair_style *thole*\ , dipole-dipole interactions are screened by the -same factor. By using the pair_style *thole*\ , dipole-dipole +pair_style *thole*, dipole-dipole interactions are screened by the +same factor. By using the pair_style *thole*, dipole-dipole interactions are screened by Thole's function, whatever their special relationship (except within each DC-DP pair of course). Consider for -example 1-2 neighbors: using the pair_style *thole*\ , their dipoles +example 1-2 neighbors: using the pair_style *thole*, their dipoles will see each other (despite the *coul* factor being 0.) and the interactions between these dipoles will be damped by Thole's function. @@ -384,7 +384,7 @@ For our phenol example, the groups would be defined as group CORES type 1 2 3 # DCs group DRUDES type 6 7 8 # DPs -Note that with the fixes *drude/transform*\ , it is not required to +Note that with the fixes *drude/transform*, it is not required to specify *comm_modify vel yes* because the fixes do it anyway (several times and for the forces also). diff --git a/doc/src/Howto_github.rst b/doc/src/Howto_github.rst index 311d716f18..0bb931fccd 100644 --- a/doc/src/Howto_github.rst +++ b/doc/src/Howto_github.rst @@ -140,8 +140,8 @@ After everything is done, add the files to the branch and commit them: flag) will automatically include **all** modified **and** new files and that is rarely the behavior you want. It can easily lead to accidentally adding unrelated and unwanted changes into the - repository. Instead it is preferable to explicitly use *git add*\ , - *git rm*\ , *git mv* for adding, removing, renaming individual files, + repository. Instead it is preferable to explicitly use *git add*, + *git rm*, *git mv* for adding, removing, renaming individual files, respectively, and then *git commit* to finalize the commit. Carefully check all pending changes with *git status* before committing them. If you find doing this on the command line too diff --git a/doc/src/Howto_kappa.rst b/doc/src/Howto_kappa.rst index 08697ecc84..ca9a418d5e 100644 --- a/doc/src/Howto_kappa.rst +++ b/doc/src/Howto_kappa.rst @@ -4,7 +4,7 @@ Calculate thermal conductivity The thermal conductivity kappa of a material can be measured in at least 4 ways using various options in LAMMPS. See the examples/KAPPA directory for scripts that implement the 4 methods discussed here for -a simple Lennard-Jones fluid model. Also, see the :doc:`Howto viscosity ` doc page for an analogous discussion +a simple Lennard-Jones fluid model. Also, see the :doc:`Howto viscosity ` page for an analogous discussion for viscosity. The thermal conductivity tensor kappa is a measure of the propensity @@ -58,7 +58,7 @@ between hot and cold regions of the simulation box. The :doc:`compute heat/flux ` command can calculate the needed heat flux and describes how to implement the Green_Kubo formalism using additional LAMMPS commands, such as the :doc:`fix ave/correlate ` command to calculate the needed -auto-correlation. See the doc page for the :doc:`compute heat/flux ` command for an example input script +auto-correlation. See the page for the :doc:`compute heat/flux ` command for an example input script that calculates the thermal conductivity of solid Ar via the GK formalism. diff --git a/doc/src/Howto_manifold.rst b/doc/src/Howto_manifold.rst index f09e3017be..8c2cbadc42 100644 --- a/doc/src/Howto_manifold.rst +++ b/doc/src/Howto_manifold.rst @@ -3,7 +3,7 @@ Manifolds (surfaces) **Overview:** -This doc page is not about a LAMMPS input script command, but about +This page is not about a LAMMPS input script command, but about manifolds, which are generalized surfaces, as defined and used by the MANIFOLD package, to track particle motion on the manifolds. See the src/MANIFOLD/README file for more details about the package diff --git a/doc/src/Howto_mdi.rst b/doc/src/Howto_mdi.rst index 7cfcd01a50..12c4cfa527 100644 --- a/doc/src/Howto_mdi.rst +++ b/doc/src/Howto_mdi.rst @@ -3,7 +3,7 @@ Using LAMMPS with the MDI library for code coupling .. note:: - This Howto doc page will eventually replace the + This Howto page will eventually replace the :doc:`Howto client/server ` doc page. Client/server coupling of two codes is where one code is the "client" @@ -120,7 +120,7 @@ input script will continue. After finishing execution of the input script, the instance of LAMMPS will be destroyed. LAMMPS supports the full set of MD-appropriate engine commands defined -by the MDI library. See the :doc:`mdi/engine ` doc page for +by the MDI library. See the :doc:`mdi/engine ` page for a list of these. If those commands are not sufficient for a user-developed driver to use diff --git a/doc/src/Howto_output.rst b/doc/src/Howto_output.rst index 61afce17ae..d17b865bbd 100644 --- a/doc/src/Howto_output.rst +++ b/doc/src/Howto_output.rst @@ -268,7 +268,7 @@ Computes that generate values to output Every :doc:`compute ` in LAMMPS produces either global or per-atom or local values. The values can be scalars or vectors or arrays of data. These values can be output using the other commands -described in this section. The doc page for each compute command +described in this section. The page for each compute command describes what it produces. Computes that produce per-atom or local values have the word "atom" or "local" in their style name. Computes without the word "atom" or "local" produce global values. @@ -281,7 +281,7 @@ Fixes that generate values to output Some :doc:`fixes ` in LAMMPS produces either global or per-atom or local values which can be accessed by other commands. The values can be scalars or vectors or arrays of data. These values can be output -using the other commands described in this section. The doc page for +using the other commands described in this section. The page for each fix command tells whether it produces any output quantities and describes them. diff --git a/doc/src/Howto_replica.rst b/doc/src/Howto_replica.rst index e34f3523f0..d286762e01 100644 --- a/doc/src/Howto_replica.rst +++ b/doc/src/Howto_replica.rst @@ -27,7 +27,7 @@ replicas are coupled together by springs to model a system of ring-polymers whic can represent the quantum nature of atom cores. These commands can only be used if LAMMPS was built with the REPLICA -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. In all these cases, you must run with one or more processors per diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index 7bddb1c89d..fbeb1f7785 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -28,7 +28,7 @@ can be invoked via the *dpd/tstat* pair style: :doc:`Fix nvt ` only thermostats the translational velocity of particles. :doc:`Fix nvt/sllod ` also does this, except that it subtracts out a velocity bias due to a deforming box and -integrates the SLLOD equations of motion. See the :doc:`Howto nemd ` doc page for further details. :doc:`Fix nvt/sphere ` and :doc:`fix nvt/asphere ` thermostat not only translation +integrates the SLLOD equations of motion. See the :doc:`Howto nemd ` page for further details. :doc:`Fix nvt/sphere ` and :doc:`fix nvt/asphere ` thermostat not only translation velocities but also rotational velocities for spherical and aspherical particles. @@ -88,7 +88,7 @@ Below is a list of some custom temperature computes that can be used like that: Thermodynamic output, which can be setup via the :doc:`thermo_style ` command, often includes temperature -values. As explained on the doc page for the +values. As explained on the page for the :doc:`thermo_style ` command, the default temperature is setup by the thermo command itself. It is NOT the temperature associated with any thermostatting fix you have defined or with any diff --git a/doc/src/Howto_triclinic.rst b/doc/src/Howto_triclinic.rst index 13383f44df..5e952709c9 100644 --- a/doc/src/Howto_triclinic.rst +++ b/doc/src/Howto_triclinic.rst @@ -23,21 +23,21 @@ origin given by **a** = (xhi-xlo,0,0); **b** = (xy,yhi-ylo,0); **c** = and are called "tilt factors" because they are the amount of displacement applied to faces of an originally orthogonal box to transform it into the parallelepiped. In LAMMPS the triclinic -simulation box edge vectors **a**\ , **b**\ , and **c** cannot be arbitrary +simulation box edge vectors **a**, **b**, and **c** cannot be arbitrary vectors. As indicated, **a** must lie on the positive x axis. **b** must lie in the xy plane, with strictly positive y component. **c** may have any orientation with strictly positive z component. The requirement -that **a**\ , **b**\ , and **c** have strictly positive x, y, and z components, -respectively, ensures that **a**\ , **b**\ , and **c** form a complete +that **a**, **b**, and **c** have strictly positive x, y, and z components, +respectively, ensures that **a**, **b**, and **c** form a complete right-handed basis. These restrictions impose no loss of generality, since it is possible to rotate/invert any set of 3 crystal basis vectors so that they conform to the restrictions. -For example, assume that the 3 vectors **A**\ ,\ **B**\ ,\ **C** are the edge +For example, assume that the 3 vectors **A**,\ **B**,\ **C** are the edge vectors of a general parallelepiped, where there is no restriction on -**A**\ ,\ **B**\ ,\ **C** other than they form a complete right-handed basis i.e. -**A** x **B** . **C** > 0. The equivalent LAMMPS **a**\ ,\ **b**\ ,\ **c** are a linear -rotation of **A**\ , **B**\ , and **C** and can be computed as follows: +**A**,\ **B**,\ **C** other than they form a complete right-handed basis i.e. +**A** x **B** . **C** > 0. The equivalent LAMMPS **a**,\ **b**,\ **c** are a linear +rotation of **A**, **B**, and **C** and can be computed as follows: .. math:: @@ -57,9 +57,9 @@ rotation of **A**\ , **B**\ , and **C** and can be computed as follows: where A = \| **A** \| indicates the scalar length of **A**\ . The hat symbol (\^) indicates the corresponding unit vector. :math:`\beta` and :math:`\gamma` are angles between the vectors described below. Note that by construction, -**a**\ , **b**\ , and **c** have strictly positive x, y, and z components, respectively. +**a**, **b**, and **c** have strictly positive x, y, and z components, respectively. If it should happen that -**A**\ , **B**\ , and **C** form a left-handed basis, then the above equations +**A**, **B**, and **C** form a left-handed basis, then the above equations are not valid for **c**\ . In this case, it is necessary to first apply an inversion. This can be achieved by interchanging two basis vectors or by changing the sign of one of them. @@ -95,7 +95,7 @@ for details. The 9 parameters (xlo,xhi,ylo,yhi,zlo,zhi,xy,xz,yz) are defined at the time the simulation box is created. This happens in one of 3 ways. If the :doc:`create_box ` command is used with a region of -style *prism*\ , then a triclinic box is setup. See the +style *prism*, then a triclinic box is setup. See the :doc:`region ` command for details. If the :doc:`read_data ` command is used to define the simulation box, and the header of the data file contains a line with the "xy xz @@ -135,7 +135,7 @@ example), then configurations with tilt = ..., -15, -5, 5, 15, 25, ... are geometrically all equivalent. If the box tilt exceeds this limit during a dynamics run (e.g. via the :doc:`fix deform ` command), then the box is "flipped" to an equivalent shape with a tilt -factor within the bounds, so the run can continue. See the :doc:`fix deform ` doc page for further details. +factor within the bounds, so the run can continue. See the :doc:`fix deform ` page for further details. One exception to this rule is if the first dimension in the tilt factor (x for xy) is non-periodic. In that case, the limits on the @@ -160,10 +160,10 @@ For extreme values of tilt, LAMMPS may also lose atoms and generate an error. Triclinic crystal structures are often defined using three lattice -constants *a*\ , *b*\ , and *c*\ , and three angles :math:`\alpha`, +constants *a*, *b*, and *c*, and three angles :math:`\alpha`, :math:`\beta`, and :math:`\gamma`. Note that in this nomenclature, the a, b, and c lattice constants are the scalar lengths of the edge -vectors **a**\ , **b**\ , and **c** defined above. The relationship +vectors **a**, **b**, and **c** defined above. The relationship between these 6 quantities (a, b, c, :math:`\alpha`, :math:`\beta`, :math:`\gamma`) and the LAMMPS box sizes (lx,ly,lz) = (xhi-xlo,yhi-ylo,zhi-zlo) and tilt factors (xy,xz,yz) is as follows: @@ -188,10 +188,10 @@ The inverse relationship can be written as follows: {\rm yz} = & \frac{b*c \cos{\alpha} - {\rm xy}*{\rm xz}}{\rm ly} \\ {\rm lz}^2 = & c^2 - {\rm xz}^2 - {\rm yz}^2 \\ -The values of *a*\ , *b*\ , *c* , :math:`\alpha` , :math:`\beta`, and +The values of *a*, *b*, *c*, :math:`\alpha` , :math:`\beta`, and :math:`\gamma` can be printed out or accessed by computes using the :doc:`thermo_style custom ` keywords -*cella*\ , *cellb*\ , *cellc*\ , *cellalpha*\ , *cellbeta*\ , *cellgamma*\ , +*cella*, *cellb*, *cellc*, *cellalpha*, *cellbeta*, *cellgamma*, respectively. As discussed on the :doc:`dump ` command doc page, when the BOX diff --git a/doc/src/Howto_viscosity.rst b/doc/src/Howto_viscosity.rst index cfe9497665..5cabf63de3 100644 --- a/doc/src/Howto_viscosity.rst +++ b/doc/src/Howto_viscosity.rst @@ -42,7 +42,7 @@ command, which determines grad(Vstream) in the equation above. E.g. the derivative in the y-direction of the Vx component of fluid motion or grad(Vstream) = dVx/dy. The Pxy off-diagonal component of the pressure or stress tensor, as calculated by the :doc:`compute pressure ` command, can also be monitored, which -is the J term in the equation above. See the :doc:`Howto nemd ` doc page for details on NEMD simulations. +is the J term in the equation above. See the :doc:`Howto nemd ` page for details on NEMD simulations. The third method is to perform a reverse non-equilibrium MD simulation using the :doc:`fix viscosity ` command which implements diff --git a/doc/src/Howto_viz.rst b/doc/src/Howto_viz.rst index 2eb009c185..5a313615ef 100644 --- a/doc/src/Howto_viz.rst +++ b/doc/src/Howto_viz.rst @@ -13,7 +13,7 @@ by several popular visualization tools. The :doc:`dump image ` and : output internally rendered images and convert a sequence of them to a movie during the MD run. Several programs included with LAMMPS as auxiliary tools can convert between LAMMPS format files and other -formats. See the :doc:`Tools ` doc page for details. +formats. See the :doc:`Tools ` page for details. A Python-based toolkit distributed by our group can read native LAMMPS dump files, including custom dump files with additional columns of diff --git a/doc/src/Howto_walls.rst b/doc/src/Howto_walls.rst index 6e3e22a3f0..a77f116fd4 100644 --- a/doc/src/Howto_walls.rst +++ b/doc/src/Howto_walls.rst @@ -53,7 +53,7 @@ granular particles; all the other commands create smooth walls. * :doc:`fix wall/region ` - use region surface as wall * :doc:`fix wall/gran ` - flat or curved walls with :doc:`pair_style granular ` potential -The *lj93*\ , *lj126*\ , *colloid*\ , *harmonic*\ , and *morse* styles all +The *lj93*, *lj126*, *colloid*, *harmonic*, and *morse* styles all allow the flat walls to move with a constant velocity, or oscillate in time. The :doc:`fix wall/region ` command offers the most generality, since the region surface is treated as a wall, and diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index d034ccb443..84981e1496 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -32,7 +32,7 @@ Here are suggestions on how to perform these tasks: are simple programs that will build simple molecular systems, such as linear bead-spring polymer chains. The moltemplate program is a true molecular builder that will generate complex molecular models. See - the :doc:`Tools ` doc page for details on tools packaged with + the :doc:`Tools ` page for details on tools packaged with LAMMPS. The `Pre/post processing page `_ of the LAMMPS website describes a variety of third party tools for this task. Furthermore, some LAMMPS internal commands allow to reconstruct, or selectively add @@ -49,7 +49,7 @@ Here are suggestions on how to perform these tasks: * **Simulation analysis:** If you want to perform analysis on-the-fly as your simulation runs, see the :doc:`compute ` and :doc:`fix ` doc pages, which list commands that can be used in a - LAMMPS input script. Also see the :doc:`Modify ` doc page for + LAMMPS input script. Also see the :doc:`Modify ` page for info on how to add your own analysis code or algorithms to LAMMPS. For post-processing, LAMMPS output such as :doc:`dump file snapshots ` can be converted into formats used by other MD or post-processing codes. To some degree, that conversion can be done @@ -61,7 +61,7 @@ Here are suggestions on how to perform these tasks: LAMMPS will do these conversions. Scripts provided in the tools/python directory can extract and massage data in dump files to make it easier to import into other programs. See the - :doc:`Tools ` doc page for details on these various options. + :doc:`Tools ` page for details on these various options. * **Visualization:** LAMMPS can produce NETPBM, JPG or PNG snapshot images on-the-fly via its :doc:`dump image ` command and pass them to an external program, `FFmpeg `_ to generate @@ -71,7 +71,7 @@ Here are suggestions on how to perform these tasks: LAMMPS website for visualization packages that can process LAMMPS output data. * **Plotting:** See the next bullet about Pizza.py as well as the - :doc:`Python ` doc page for examples of plotting LAMMPS + :doc:`Python ` page for examples of plotting LAMMPS output. Scripts provided with the *python* tool in the tools directory will extract and massage data in log and dump files to make it easier to analyze and plot. See the :doc:`Tools ` doc page diff --git a/doc/src/Intro_overview.rst b/doc/src/Intro_overview.rst index 8ab85a0d99..930c7a6a16 100644 --- a/doc/src/Intro_overview.rst +++ b/doc/src/Intro_overview.rst @@ -25,7 +25,7 @@ the website for details. All versions can be downloaded from the LAMMPS is designed to be easy to modify or extend with new capabilities, such as new force fields, atom types, boundary -conditions, or diagnostics. See the :doc:`Modify ` doc page for +conditions, or diagnostics. See the :doc:`Modify ` page for more details. In the most general sense, LAMMPS integrates Newton's equations of diff --git a/doc/src/Modify_body.rst b/doc/src/Modify_body.rst index b923416bdc..3435b673e3 100644 --- a/doc/src/Modify_body.rst +++ b/doc/src/Modify_body.rst @@ -6,7 +6,7 @@ Body particles can represent complex entities, such as surface meshes of discrete points, collections of sub-particles, deformable objects, etc. -See the :doc:`Howto body ` doc page for an overview of using +See the :doc:`Howto body ` page for an overview of using body particles and the various body styles LAMMPS supports. New styles can be created to add new kinds of body particles to LAMMPS. diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst index bcd368c3a3..caf31a9196 100644 --- a/doc/src/Modify_contribute.rst +++ b/doc/src/Modify_contribute.rst @@ -62,7 +62,7 @@ them open-source, i.e. we can release them under the terms of the GPL a LGPL (version 2.1) distribution that we make available to developers on request only and with files that are authorized for that kind of distribution removed (e.g. interface to FFTW). See the -:doc:`LAMMPS license ` doc page for details. +:doc:`LAMMPS license ` page for details. .. note:: @@ -80,7 +80,7 @@ distribution removed (e.g. interface to FFTW). See the .. _lws: https://www.lammps.org -The previous sections of this doc page describe how to add new "style" +The previous sections of this page describe how to add new "style" files of various kinds to LAMMPS. Packages are simply collections of one or more new class files which are invoked as a new style within a LAMMPS input script. If designed correctly, these additions typically @@ -107,7 +107,7 @@ packages in the src directory for examples. If you are uncertain, please ask. your contribution(s) to be added to main LAMMPS code or one of its standard packages, it needs to be written in a style compatible with other LAMMPS source files. This means: 2-character indentation per - level, **no tabs**\ , no lines over 100 characters. I/O is done via + level, **no tabs**, no lines over 100 characters. I/O is done via the C-style stdio library (mixing of stdio and iostreams is generally discouraged), class header files should not import any system headers outside of , STL containers should be avoided in headers, @@ -203,11 +203,11 @@ packages in the src directory for examples. If you are uncertain, please ask. pdf" in the doc folder. As appropriate, the text files can include inline mathematical expression or figures (see doc/JPG for examples). Additional PDF files with further details (see doc/PDF for examples) - may also be included. The doc page should also include literature + may also be included. The page should also include literature citations as appropriate; see the bottom of doc/fix_nh.rst for examples and the earlier part of the same file for how to format the cite itself. Citation labels must be unique across all .rst files. - The "Restrictions" section of the doc page should indicate if your + The "Restrictions" section of the page should indicate if your command is only available if LAMMPS is built with the appropriate FOO package. See other package doc files for examples of how to do this. Please run at least "make html" and "make spelling" diff --git a/doc/src/Modify_fix.rst b/doc/src/Modify_fix.rst index 556c858735..f065664c6a 100644 --- a/doc/src/Modify_fix.rst +++ b/doc/src/Modify_fix.rst @@ -129,7 +129,7 @@ derived class. See fix.h for details. Typically, only a small fraction of these methods are defined for a particular fix. Setmask is mandatory, as it determines when the fix will be invoked during the timestep. Fixes that perform time -integration (\ *nve*\ , *nvt*\ , *npt*\ ) implement initial_integrate() and +integration (\ *nve*, *nvt*, *npt*\ ) implement initial_integrate() and final_integrate() to perform velocity Verlet updates. Fixes that constrain forces implement post_force(). diff --git a/doc/src/Packages.rst b/doc/src/Packages.rst index 31ac02df3c..933294a9f7 100644 --- a/doc/src/Packages.rst +++ b/doc/src/Packages.rst @@ -7,7 +7,7 @@ specific set of features. For example, force fields for molecular systems or rigid-body constraints are in packages. You can see the list of all packages and "make" commands to manage them by typing "make package" from within the src directory of the LAMMPS -distribution. The :doc:`Build package ` doc page gives +distribution. The :doc:`Build package ` page gives general info on how to install and un-install packages as part of the LAMMPS build process. diff --git a/doc/src/Python_call.rst b/doc/src/Python_call.rst index 3a09678539..796adfe1c0 100644 --- a/doc/src/Python_call.rst +++ b/doc/src/Python_call.rst @@ -43,7 +43,7 @@ complex loop with branching logic, than can be created using the simple looping and branching logic enabled by the :doc:`next ` and :doc:`if ` commands. -See the :doc:`python ` doc page and the :doc:`variable ` +See the :doc:`python ` page and the :doc:`variable ` doc page for its python-style variables for more info, including examples of Python code you can write for both pure Python operations and callbacks to LAMMPS. diff --git a/doc/src/Python_objects.rst b/doc/src/Python_objects.rst index 4c8161b8bd..4a1496632e 100644 --- a/doc/src/Python_objects.rst +++ b/doc/src/Python_objects.rst @@ -20,7 +20,7 @@ computes, fixes, or variables in LAMMPS using the :py:mod:`lammps` module. global vector or array, a single double value from the vector or array is returned, indexed by I (vector) or I and J (array). I,J are zero-based indices. - See the :doc:`Howto output ` doc page for a discussion of + See the :doc:`Howto output ` page for a discussion of global, per-atom, and local data, and of scalar, vector, and array data types. See the doc pages for individual :doc:`computes ` and :doc:`fixes ` for a description of what they calculate and diff --git a/doc/src/Python_trouble.rst b/doc/src/Python_trouble.rst index b94a043a6a..aae96d6701 100644 --- a/doc/src/Python_trouble.rst +++ b/doc/src/Python_trouble.rst @@ -41,4 +41,4 @@ first importing from the ``lammps`` module: >>> CDLL("liblammps.so") If an error occurs, carefully go through the steps in :ref:`python_install_guides` and on the -:doc:`Build_basics ` doc page about building a shared library. +:doc:`Build_basics ` page about building a shared library. diff --git a/doc/src/Run_basics.rst b/doc/src/Run_basics.rst index 35d5f829a0..3d57633df2 100644 --- a/doc/src/Run_basics.rst +++ b/doc/src/Run_basics.rst @@ -42,7 +42,7 @@ single processor. In theory you should get identical answers on any number of processors and on any machine. In practice, numerical round-off due to using floating-point math can cause slight differences and an eventual divergence of molecular dynamics trajectories. See the -:doc:`Errors common ` doc page for discussion of this. +:doc:`Errors common ` page for discussion of this. LAMMPS can run as large a problem as will fit in the physical memory of one or more processors. If you run out of memory, you must run on more diff --git a/doc/src/Run_options.rst b/doc/src/Run_options.rst index f8c6925dba..c4004c87e0 100644 --- a/doc/src/Run_options.rst +++ b/doc/src/Run_options.rst @@ -365,7 +365,7 @@ to insure that a specific Kspace processor (in the second partition) is matched up with a specific set of processors in the first partition. See the :doc:`General tips ` page for more details. -If the keyword *nth* is used with a setting *N*\ , then it means every +If the keyword *nth* is used with a setting *N*, then it means every Nth processor will be moved to the end of the ranking. This is useful when using the :doc:`run_style verlet/split ` command with 2 partitions via the -partition command-line switch. The first set of @@ -397,7 +397,7 @@ so that the processors in each partition will be See the "processors" command for how to insure processors from each partition could then be grouped optimally for quad-core nodes. -If the keyword is *custom*\ , then a file that specifies a permutation +If the keyword is *custom*, then a file that specifies a permutation of the processor ranks is also specified. The format of the reorder file is as follows. Any number of initial blank or comment lines (starting with a "#" character) can be present. These should be @@ -464,7 +464,7 @@ The syntax following restartfile (or remap), namely datafile keyword value ... is identical to the arguments of the :doc:`write_data ` -command. See its doc page for details. This includes its +command. See its page for details. This includes its optional keyword/value settings. ---------- @@ -505,11 +505,11 @@ The syntax following restartfile (or remap), namely group-ID dumpstyle dumpfile arg1 arg2 ... is identical to the arguments of the :doc:`write_dump ` -command. See its doc page for details. This includes what per-atom +command. See its page for details. This includes what per-atom fields are written to the dump file and optional dump_modify settings, including ones that affect how parallel dump files are written, e.g. the *nfile* and *fileper* keywords. See the -:doc:`dump_modify ` doc page for details. +:doc:`dump_modify ` page for details. ---------- @@ -537,7 +537,7 @@ partition screen files file.N. **-suffix style args** Use variants of various styles if they exist. The specified style can -be *gpu*\ , *intel*\ , *kk*\ , *omp*\ , *opt*\ , or *hybrid*\ . These +be *gpu*, *intel*, *kk*, *omp*, *opt*, or *hybrid*\ . These refer to optional packages that LAMMPS can be built with, as described in :doc:`Accelerate performance `. The "gpu" style corresponds to the GPU package, the "intel" style to the INTEL package, the "kk" diff --git a/doc/src/Run_output.rst b/doc/src/Run_output.rst index d7d92dc5ee..8adfd4b293 100644 --- a/doc/src/Run_output.rst +++ b/doc/src/Run_output.rst @@ -152,7 +152,7 @@ information is provided about the line search and statistics on how many iterations and force-evaluations the minimizer required. Multiple force evaluations are typically done at each iteration to perform a 1d line minimization in the search direction. See the -:doc:`minimize ` doc page for more details. +:doc:`minimize ` page for more details. ---------- diff --git a/doc/src/Speed_gpu.rst b/doc/src/Speed_gpu.rst index 3b6bb8845b..656ce08bbc 100644 --- a/doc/src/Speed_gpu.rst +++ b/doc/src/Speed_gpu.rst @@ -71,7 +71,7 @@ by AMD. **Building LAMMPS with the GPU package:** -See the :ref:`Build extras ` doc page for +See the :ref:`Build extras ` page for instructions. **Run with the GPU package from the command line:** @@ -118,7 +118,7 @@ automatic selection of the number of GPUs to use. Using the "-pk" switch explicitly allows for setting of the number of GPUs/node to use and additional options. Its syntax is the same as the "package gpu" command. See the :doc:`package ` -command doc page for details, including the default values used for +command page for details, including the default values used for all its options if it is not specified. Note that the default for the :doc:`package gpu ` command is to @@ -182,7 +182,7 @@ deterministic results. calculations can be dynamically balanced across the CPU cores and GPUs. GPU-specific settings can be made which can be optimized for different hardware. See the :doc:`package ` command - doc page for details. + page for details. * As described by the :doc:`package gpu ` command, GPU accelerated pair styles can perform computations asynchronously with CPU computations. The "Pair" time reported by LAMMPS will be the diff --git a/doc/src/Speed_intel.rst b/doc/src/Speed_intel.rst index 20371b4256..6526f836b2 100644 --- a/doc/src/Speed_intel.rst +++ b/doc/src/Speed_intel.rst @@ -103,7 +103,7 @@ Quick Start for Experienced Users """"""""""""""""""""""""""""""""" LAMMPS should be built with the INTEL package installed. -Simulations should be run with 1 MPI task per physical *core*\ , +Simulations should be run with 1 MPI task per physical *core*, not *hardware thread*\ . * Edit src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi as necessary. @@ -205,7 +205,7 @@ this information can normally be obtained with: Building LAMMPS with the INTEL package """"""""""""""""""""""""""""""""""""""""""" -See the :ref:`Build extras ` doc page for +See the :ref:`Build extras ` page for instructions. Some additional details are covered here. For building with make, several example Makefiles for building with diff --git a/doc/src/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst index c24c22e926..400db9585c 100644 --- a/doc/src/Speed_kokkos.rst +++ b/doc/src/Speed_kokkos.rst @@ -67,7 +67,7 @@ produce an executable compatible with a specific hardware. Building LAMMPS with the KOKKOS package """"""""""""""""""""""""""""""""""""""" -See the :ref:`Build extras ` doc page for instructions. +See the :ref:`Build extras ` page for instructions. Running LAMMPS with the KOKKOS package """""""""""""""""""""""""""""""""""""" @@ -217,7 +217,7 @@ threads/task as Nt. The product of these two values should be N, i.e. be best for many-body potentials. For simpler pair-wise potentials, it may be faster to use a "full" neighbor list with Newton flag to "off". Use the "-pk kokkos" :doc:`command-line switch ` to change - the default :doc:`package kokkos ` options. See its doc page for + the default :doc:`package kokkos ` options. See its page for details and default settings. Experimenting with its options can provide a speed-up for specific calculations. For example: @@ -279,7 +279,7 @@ one or more nodes, each with two GPUs: setting the neighbor binsize equal to twice the CPU default value will give speedup, which is the default when running on GPUs. Use the "-pk kokkos" :doc:`command-line switch ` to change the default - :doc:`package kokkos ` options. See its doc page for details and + :doc:`package kokkos ` options. See its page for details and default settings. Experimenting with its options can provide a speed-up for specific calculations. For example: diff --git a/doc/src/Speed_omp.rst b/doc/src/Speed_omp.rst index 060944e81b..3d9cbe19e0 100644 --- a/doc/src/Speed_omp.rst +++ b/doc/src/Speed_omp.rst @@ -18,7 +18,7 @@ launched by each MPI task on the local node (using shared memory). Building LAMMPS with the OPENMP package """"""""""""""""""""""""""""""""""""""""" -See the :ref:`Build extras ` doc page for +See the :ref:`Build extras ` page for instructions. Run with the OPENMP package from the command line @@ -50,7 +50,7 @@ threads per MPI task via the OMP_NUM_THREADS environment variable. You can also use the "-pk omp Nt" :doc:`command-line switch `, to explicitly set Nt = # of OpenMP threads per MPI task to use, as well as additional options. Its syntax is the -same as the :doc:`package omp ` command whose doc page gives +same as the :doc:`package omp ` command whose page gives details, including the default values used if it is not specified. It also gives more details on how to set the number of threads via the OMP_NUM_THREADS environment variable. @@ -70,7 +70,7 @@ Use the :doc:`suffix omp ` command, or you can explicitly add an You must also use the :doc:`package omp ` command to enable the OPENMP package. When you do this you also specify how many threads -per MPI task to use. The command doc page explains other options and +per MPI task to use. The command page explains other options and how to set the number of threads via the OMP_NUM_THREADS environment variable. diff --git a/doc/src/Speed_opt.rst b/doc/src/Speed_opt.rst index 338c4f2030..e115393017 100644 --- a/doc/src/Speed_opt.rst +++ b/doc/src/Speed_opt.rst @@ -15,7 +15,7 @@ Any hardware. Any compiler. Building LAMMPS with the OPT package """""""""""""""""""""""""""""""""""" -See the :ref:`Build extras ` doc page for instructions. +See the :ref:`Build extras ` page for instructions. Run with the OPT package from the command line """""""""""""""""""""""""""""""""""""""""""""" diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index e7cd87aa78..1165ff5a82 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -363,7 +363,7 @@ michele.ceriotti at gmail.com, to interface to a variety of molecular dynamics codes. See the tools/i-pi/manual.pdf file for an overview of i-PI, and the -:doc:`fix ipi ` doc page for further details on running PIMD +:doc:`fix ipi ` page for further details on running PIMD calculations with LAMMPS. ---------- diff --git a/doc/src/accel_styles.rst b/doc/src/accel_styles.rst index bd7d88f9d7..27a798d731 100644 --- a/doc/src/accel_styles.rst +++ b/doc/src/accel_styles.rst @@ -1,4 +1,4 @@ -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -7,11 +7,11 @@ produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, INTEL, KOKKOS, OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. diff --git a/doc/src/angle_charmm.rst b/doc/src/angle_charmm.rst index d411599eaf..0da31e54e7 100644 --- a/doc/src/angle_charmm.rst +++ b/doc/src/angle_charmm.rst @@ -56,7 +56,7 @@ radian\^2. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -65,13 +65,13 @@ produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, INTEL, KOKKOS, OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See :doc:`Speed packages ` doc page for more +See :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- diff --git a/doc/src/angle_cosine_delta.rst b/doc/src/angle_cosine_delta.rst index 280e6ea2c4..b417b7a4a2 100644 --- a/doc/src/angle_cosine_delta.rst +++ b/doc/src/angle_cosine_delta.rst @@ -54,7 +54,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc page +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_cosine_periodic.rst b/doc/src/angle_cosine_periodic.rst index 4983745618..1eb5240011 100644 --- a/doc/src/angle_cosine_periodic.rst +++ b/doc/src/angle_cosine_periodic.rst @@ -58,7 +58,7 @@ Restrictions """""""""""" This angle style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc page +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/angle_hybrid.rst b/doc/src/angle_hybrid.rst index 1a562b0118..cf8ea1a3fb 100644 --- a/doc/src/angle_hybrid.rst +++ b/doc/src/angle_hybrid.rst @@ -58,7 +58,7 @@ specifying additional BondBond (and BondAngle) coefficients either via the input script or in the data file. I.e. *class2* must be added to each line after the angle type. For lines in the BondBond (or BondAngle) section of the data file for angle types that are not -*class2*\ , you must use an angle style of *skip* as a placeholder, e.g. +*class2*, you must use an angle style of *skip* as a placeholder, e.g. .. parsed-literal:: diff --git a/doc/src/angle_sdk.rst b/doc/src/angle_sdk.rst index fe0cd3968b..50f4a5b360 100644 --- a/doc/src/angle_sdk.rst +++ b/doc/src/angle_sdk.rst @@ -37,7 +37,7 @@ where :math:`\theta_0` is the equilibrium value of the angle and *lj/sdk* pair style between the atoms 1 and 3. This angle potential is intended for coarse grained MD simulations with the CMM parameterization using the :doc:`pair_style lj/sdk `. Relative to the -pair_style *lj/sdk*\ , however, the energy is shifted by +pair_style *lj/sdk*, however, the energy is shifted by :math:`\epsilon`, to avoid sudden jumps. Note that the usual 1/2 factor is included in :math:`K`. diff --git a/doc/src/angle_style.rst b/doc/src/angle_style.rst index 540d15fee2..0715625d45 100644 --- a/doc/src/angle_style.rst +++ b/doc/src/angle_style.rst @@ -66,7 +66,7 @@ specified by the associated :doc:`angle_coeff ` command. There are also additional accelerated pair styles included in the LAMMPS distribution for faster performance on CPUs, GPUs, and KNLs. -The individual style names on the :ref:`Commands angle ` doc page are followed by one or more +The individual style names on the :ref:`Commands angle ` page are followed by one or more of (g,i,k,o,t) to indicate which accelerated styles exist. * :doc:`none ` - turn off angle interactions @@ -103,7 +103,7 @@ Angle styles can only be set for atom_styles that allow angles to be defined. Most angle styles are part of the MOLECULE package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual bond potentials tell if it is part of a package. Related commands diff --git a/doc/src/atc_control_thermal.rst b/doc/src/atc_control_thermal.rst index d6d6c25405..7a17701c5c 100644 --- a/doc/src/atc_control_thermal.rst +++ b/doc/src/atc_control_thermal.rst @@ -66,7 +66,7 @@ Restrictions Only for be used with the specific controllers *thermal* or *momentum*. They are ignored if a lumped solution is requested. -*control thermal* is only for be used with specific transfers: thermal (*rescale*\ , *hoover*\ , *flux*\ ), *two_temperature* (*flux*\ ). +*control thermal* is only for be used with specific transfers: thermal (*rescale*, *hoover*, *flux*\ ), *two_temperature* (*flux*\ ). *rescale* not valid with time filtering activated *correction_max_iterations* is only for use with *thermal* physics using diff --git a/doc/src/atom_modify.rst b/doc/src/atom_modify.rst index c142fb6519..2f01877ac7 100644 --- a/doc/src/atom_modify.rst +++ b/doc/src/atom_modify.rst @@ -40,7 +40,7 @@ command. The *id* and *map* keywords must be specified before a simulation box is defined; other keywords can be specified any time. The *id* keyword determines whether non-zero atom IDs can be assigned -to each atom. If the value is *yes*\ , which is the default, IDs are +to each atom. If the value is *yes*, which is the default, IDs are assigned, whether you use the :doc:`create atoms ` or :doc:`read_data ` or :doc:`read_restart ` commands to initialize atoms. If the value is *no* the IDs for all diff --git a/doc/src/atom_style.rst b/doc/src/atom_style.rst index 4d880077d1..bade8c2f79 100644 --- a/doc/src/atom_style.rst +++ b/doc/src/atom_style.rst @@ -61,7 +61,7 @@ command. Restrictions section. Once a style is assigned, it cannot be changed, so use a style general -enough to encompass all attributes. E.g. with style *bond*\ , angular +enough to encompass all attributes. E.g. with style *bond*, angular terms cannot be used or added later to the model. It is OK to use a style more general than needed, though it may be slightly inefficient. @@ -136,13 +136,13 @@ quantities. It is possible to add some attributes, such as a molecule ID, to atom styles that do not have them via the :doc:`fix property/atom ` command. This command also allows new custom attributes consisting of extra integer or - floating-point values to be added to atoms. See the :doc:`fix property/atom ` doc page for examples of cases + floating-point values to be added to atoms. See the :doc:`fix property/atom ` page for examples of cases where this is useful and details on how to initialize, access, and output the custom values. -All of the above styles define point particles, except the *sphere*\ , -*ellipsoid*\ , *electron*\ , *peri*\ , *wavepacket*\ , *line*\ , *tri*\ , and -*body* styles, which define finite-size particles. See the :doc:`Howto spherical ` doc page for an overview of using +All of the above styles define point particles, except the *sphere*, +*ellipsoid*, *electron*, *peri*, *wavepacket*, *line*, *tri*, and +*body* styles, which define finite-size particles. See the :doc:`Howto spherical ` page for an overview of using finite-size particle models with LAMMPS. All of the point-particle styles assign mass to particles on a @@ -236,7 +236,7 @@ individual physical bodies from penetrating each other. For the *spin* style, a magnetic spin is associated to each atom. Those spins have a norm (their magnetic moment) and a direction. -The *wavepacket* style is similar to *electron*\ , but the electrons may +The *wavepacket* style is similar to *electron*, but the electrons may consist of several Gaussian wave packets, summed up with coefficients cs= (cs_re,cs_im). Each of the wave packets is treated as a separate particle in LAMMPS, wave packets belonging to the same electron must @@ -256,7 +256,7 @@ command. The template stores one or more molecules with a single copy of the topology info (bonds,angles,etc) of each. Individual atoms only store a template index and template atom to identify which molecule and which atom-within-the-molecule they represent. Using the -*template* style instead of the *bond*\ , *angle*\ , *molecular* styles +*template* style instead of the *bond*, *angle*, *molecular* styles can save memory for systems comprised of a large number of small molecules, all of a single type (or small number of types). See the paper by Grime and Voth, in :ref:`(Grime) `, for examples of how this @@ -283,7 +283,7 @@ the *bstyle* argument. Body particles can represent complex entities, such as surface meshes of discrete points, collections of sub-particles, deformable objects, etc. -The :doc:`Howto body ` doc page describes the body styles +The :doc:`Howto body ` page describes the body styles LAMMPS currently supports, and provides more details as to the kind of body particles they represent. For all styles, each body particle stores moments of inertia and a quaternion 4-vector, so that its @@ -332,14 +332,14 @@ styles. The accelerated styles are part of the KOKKOS package. They are only enabled if LAMMPS was built with those packages. See the :doc:`Build -package ` doc page for more info. +package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. Restrictions @@ -350,9 +350,9 @@ This command cannot be used after the simulation box is defined by a Many of the styles listed above are only enabled if LAMMPS was built with a specific package, as listed below. See the :doc:`Build package -` doc page for more info. +` page for more info. -The *angle*\ , *bond*\ , *full*\ , *molecular*\ , and *template* styles are +The *angle*, *bond*, *full*, *molecular*, and *template* styles are part of the MOLECULE package. The *line* and *tri* styles are part of the ASPHERE package. @@ -370,7 +370,7 @@ The *electron* style is part of the EFF package for :doc:`electronic force field The *dpd* style is part of the DPD-REACT package for dissipative particle dynamics (DPD). -The *edpd*\ , *mdpd*\ , and *tdpd* styles are part of the DPD-MESO package +The *edpd*, *mdpd*, and *tdpd* styles are part of the DPD-MESO package for energy-conserving dissipative particle dynamics (eDPD), many-body dissipative particle dynamics (mDPD), and transport dissipative particle dynamics (tDPD), respectively. diff --git a/doc/src/balance.rst b/doc/src/balance.rst index 5d42fabb21..b3ac360ca2 100644 --- a/doc/src/balance.rst +++ b/doc/src/balance.rst @@ -11,7 +11,7 @@ Syntax balance thresh style args ... keyword args ... * thresh = imbalance threshold that must be exceeded to perform a re-balance -* one style/arg pair can be used (or multiple for *x*\ ,\ *y*\ ,\ *z*\ ) +* one style/arg pair can be used (or multiple for *x*,\ *y*,\ *z*\ ) * style = *x* or *y* or *z* or *shift* or *rcb* .. parsed-literal:: @@ -170,10 +170,10 @@ fractions of the box length) are also printed. ---------- The method used to perform a load balance is specified by one of the -listed styles (or more in the case of *x*\ ,\ *y*\ ,\ *z*\ ), which are +listed styles (or more in the case of *x*,\ *y*,\ *z*\ ), which are described in detail below. There are 2 kinds of styles. -The *x*\ , *y*\ , *z*\ , and *shift* styles are "grid" methods which +The *x*, *y*, *z*, and *shift* styles are "grid" methods which produce a logical 3d grid of processors. They operate by changing the cutting planes (or lines) between processors in 3d (or 2d), to adjust the volume (area in 2d) assigned to each processor, as in the @@ -222,7 +222,7 @@ from scratch. ---------- -The *x*\ , *y*\ , and *z* styles invoke a "grid" method for balancing, as +The *x*, *y*, and *z* styles invoke a "grid" method for balancing, as described above. Note that any or all of these 3 styles can be specified together, one after the other, but they cannot be used with any other style. This style adjusts the position of cutting planes @@ -263,7 +263,7 @@ once. You should normally only list dimensions where you expect there to be a density variation in the particles. Balancing proceeds by adjusting the cutting planes in each of the -dimensions listed in *dimstr*\ , one dimension at a time. For a single +dimensions listed in *dimstr*, one dimension at a time. For a single dimension, the balancing operation (described below) is iterated on up to *Niter* times. After each dimension finishes, the imbalance factor is re-computed, and the balancing operation halts if the *stopthresh* @@ -428,8 +428,8 @@ weights. It assigns the same weight to each particle owned by a processor based on the total computational time spent by that processor. See details below on what time window is used. It uses the same timing information as is used for the :doc:`MPI task timing -breakdown `, namely, for sections *Pair*\ , *Bond*\ , -*Kspace*\ , and *Neigh*\ . The time spent in those portions of the +breakdown `, namely, for sections *Pair*, *Bond*, +*Kspace*, and *Neigh*\ . The time spent in those portions of the timestep are measured for each MPI rank, summed, then divided by the number of particles owned by that processor. I.e. the weight is an effective CPU time/particle averaged over the particles on that @@ -455,7 +455,7 @@ are for the entire previous run. For the *fix balance* command the timing data is for only the timesteps since the last balancing operation was performed. If timing information for the required sections is not available, e.g. at the beginning of a run, or when the -:doc:`timer ` command is set to either *loop* or *off*\ , a warning +:doc:`timer ` command is set to either *loop* or *off*, a warning is issued. In this case no weights are computed. .. note:: diff --git a/doc/src/bond_class2.rst b/doc/src/bond_class2.rst index aea503738f..559e031229 100644 --- a/doc/src/bond_class2.rst +++ b/doc/src/bond_class2.rst @@ -55,7 +55,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the CLASS2 -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/bond_fene.rst b/doc/src/bond_fene.rst index 0c6a37ca62..108f538628 100644 --- a/doc/src/bond_fene.rst +++ b/doc/src/bond_fene.rst @@ -58,7 +58,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. You typically should specify :doc:`special_bonds fene ` diff --git a/doc/src/bond_fene_expand.rst b/doc/src/bond_fene_expand.rst index 1be06561e9..8e04da6146 100644 --- a/doc/src/bond_fene_expand.rst +++ b/doc/src/bond_fene_expand.rst @@ -60,7 +60,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. You typically should specify :doc:`special_bonds fene ` diff --git a/doc/src/bond_gromos.rst b/doc/src/bond_gromos.rst index d4eb958ebe..16b5cb0f36 100644 --- a/doc/src/bond_gromos.rst +++ b/doc/src/bond_gromos.rst @@ -51,7 +51,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/bond_harmonic.rst b/doc/src/bond_harmonic.rst index e3320f2e19..a76cc54746 100644 --- a/doc/src/bond_harmonic.rst +++ b/doc/src/bond_harmonic.rst @@ -53,7 +53,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/bond_hybrid.rst b/doc/src/bond_hybrid.rst index 0da93ccade..1ffd4a1c98 100644 --- a/doc/src/bond_hybrid.rst +++ b/doc/src/bond_hybrid.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Unlike other bond styles, the hybrid bond style does not store bond diff --git a/doc/src/bond_morse.rst b/doc/src/bond_morse.rst index f096624ba0..4aa76a6712 100644 --- a/doc/src/bond_morse.rst +++ b/doc/src/bond_morse.rst @@ -52,7 +52,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/bond_nonlinear.rst b/doc/src/bond_nonlinear.rst index 77271502ea..91bd03421a 100644 --- a/doc/src/bond_nonlinear.rst +++ b/doc/src/bond_nonlinear.rst @@ -51,8 +51,8 @@ or :doc:`read_restart ` commands: Restrictions """""""""""" -This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +This bond style can only be used if LAMMPS was built with the EXTRA-MOLECULE +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/bond_oxdna.rst b/doc/src/bond_oxdna.rst index 3b35f92d89..f863c0e98f 100644 --- a/doc/src/bond_oxdna.rst +++ b/doc/src/bond_oxdna.rst @@ -39,7 +39,7 @@ Examples Description """"""""""" -The *oxdna/fene* , *oxdna2/fene* and *oxrna2/fene* bond styles use the potential +The *oxdna/fene*, *oxdna2/fene*, and *oxrna2/fene* bond styles use the potential .. math:: @@ -118,7 +118,7 @@ Restrictions This bond style can only be used if LAMMPS was built with the CG-DNA package and the MOLECULE and ASPHERE package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/bond_quartic.rst b/doc/src/bond_quartic.rst index 8c5b363e54..89c33607ac 100644 --- a/doc/src/bond_quartic.rst +++ b/doc/src/bond_quartic.rst @@ -96,7 +96,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. The *quartic* style requires that :doc:`special_bonds ` diff --git a/doc/src/bond_style.rst b/doc/src/bond_style.rst index e302ea792d..177dc8cc05 100644 --- a/doc/src/bond_style.rst +++ b/doc/src/bond_style.rst @@ -111,7 +111,7 @@ Bond styles can only be set for atom styles that allow bonds to be defined. Most bond styles are part of the MOLECULE package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual bond potentials tell if it is part of a package. Related commands diff --git a/doc/src/bond_table.rst b/doc/src/bond_table.rst index fedb50355d..898503b951 100644 --- a/doc/src/bond_table.rst +++ b/doc/src/bond_table.rst @@ -143,7 +143,7 @@ Restrictions """""""""""" This bond style can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/boundary.rst b/doc/src/boundary.rst index aa68357e1d..d6458e7c39 100644 --- a/doc/src/boundary.rst +++ b/doc/src/boundary.rst @@ -10,7 +10,7 @@ Syntax boundary x y z -* x,y,z = *p* or *s* or *f* or *m*\ , one or two letters +* x,y,z = *p* or *s* or *f* or *m*, one or two letters .. parsed-literal:: @@ -45,17 +45,17 @@ the other end. A periodic dimension can change in size due to constant pressure boundary conditions or box deformation (see the :doc:`fix npt ` and :doc:`fix deform ` commands). The *p* style must be applied to both faces of a dimension. -The styles *f*\ , *s*\ , and *m* mean the box is non-periodic, so that +The styles *f*, *s*, and *m* mean the box is non-periodic, so that particles do not interact across the boundary and do not move from one side of the box to the other. -For style *f*\ , the position of the face is fixed. If an atom moves +For style *f*, the position of the face is fixed. If an atom moves outside the face it will be deleted on the next timestep that reneighboring occurs. This will typically generate an error unless you have set the :doc:`thermo_modify lost ` option to allow for lost atoms. -For style *s*\ , the position of the face is set so as to encompass the +For style *s*, the position of the face is set so as to encompass the atoms in that dimension (shrink-wrapping), no matter how far they move. Note that when the difference between the current box dimensions and the shrink-wrap box dimensions is large, this can lead to lost @@ -67,7 +67,7 @@ This is best addressed by setting initial box dimensions to match the shrink-wrapped dimensions more closely, by using *m* style boundaries (see below). -For style *m*\ , shrink-wrapping occurs, but is bounded by the value +For style *m*, shrink-wrapping occurs, but is bounded by the value specified in the data or restart file or set by the :doc:`create_box ` command. For example, if the upper z face has a value of 50.0 in the data file, the face will always be @@ -85,7 +85,7 @@ and xhi faces of the box are planes tilting in the +y direction as y increases. These tilted planes are shrink-wrapped around the atoms to determine the x extent of the box. -See the :doc:`Howto triclinic ` doc page for a +See the :doc:`Howto triclinic ` page for a geometric description of triclinic boxes, as defined by LAMMPS, and how to transform these parameters to and from other commonly used triclinic representations. diff --git a/doc/src/box.rst b/doc/src/box.rst index c5937df75c..b9c586b6f7 100644 --- a/doc/src/box.rst +++ b/doc/src/box.rst @@ -34,15 +34,15 @@ For triclinic (non-orthogonal) simulation boxes, the *tilt* keyword allows simulation domains to be created with arbitrary tilt factors, e.g. via the :doc:`create_box ` or :doc:`read_data ` commands. Tilt factors determine how -skewed the triclinic box is; see the :doc:`Howto triclinic ` doc page for a discussion of triclinic +skewed the triclinic box is; see the :doc:`Howto triclinic ` page for a discussion of triclinic boxes in LAMMPS. LAMMPS normally requires that no tilt factor can skew the box more than half the distance of the parallel box length, which is the first dimension in the tilt factor (x for xz). If *tilt* is set to -*small*\ , which is the default, then an error will be +*small*, which is the default, then an error will be generated if a box is created which exceeds this limit. If *tilt* -is set to *large*\ , then no limit is enforced. You can create +is set to *large*, then no limit is enforced. You can create a box with any tilt factors you wish. Note that if a simulation box has a large tilt factor, LAMMPS will run diff --git a/doc/src/change_box.rst b/doc/src/change_box.rst index 328326a83a..f63949bcd8 100644 --- a/doc/src/change_box.rst +++ b/doc/src/change_box.rst @@ -16,7 +16,7 @@ Syntax .. parsed-literal:: parameter = *x* or *y* or *z* or *xy* or *xz* or *yz* or *boundary* or *ortho* or *triclinic* or *set* or *remap* - *x*\ , *y*\ , *z* args = style value(s) + *x*, *y*, *z* args = style value(s) style = *final* or *delta* or *scale* or *volume* *final* values = lo hi lo hi = box boundaries after displacement (distance units) @@ -25,14 +25,14 @@ Syntax *scale* values = factor factor = multiplicative factor for change in box length after displacement *volume* value = none = adjust this dim to preserve volume of system - *xy*\ , *xz*\ , *yz* args = style value + *xy*, *xz*, *yz* args = style value style = *final* or *delta* *final* value = tilt tilt = tilt factor after displacement (distance units) *delta* value = dtilt dtilt = change in tilt factor after displacement (distance units) *boundary* args = x y z - x,y,z = *p* or *s* or *f* or *m*\ , one or two letters + x,y,z = *p* or *s* or *f* or *m*, one or two letters *p* is periodic *f* is non-periodic and fixed *s* is non-periodic and shrink-wrapped @@ -82,7 +82,7 @@ The :doc:`create_box `, :doc:`read data `, and simulation box is orthogonal or triclinic and their doc pages explain the meaning of the xy,xz,yz tilt factors. -See the :doc:`Howto triclinic ` doc page for a +See the :doc:`Howto triclinic ` page for a geometric description of triclinic boxes, as defined by LAMMPS, and how to transform these parameters to and from other commonly used triclinic representations. @@ -179,18 +179,18 @@ new owning processors. ---------- -For the *x*\ , *y*\ , and *z* parameters, this is the meaning of their +For the *x*, *y*, and *z* parameters, this is the meaning of their styles and values. -For style *final*\ , the final lo and hi box boundaries of a dimension +For style *final*, the final lo and hi box boundaries of a dimension are specified. The values can be in lattice or box distance units. See the discussion of the units keyword below. -For style *delta*\ , plus or minus changes in the lo/hi box boundaries +For style *delta*, plus or minus changes in the lo/hi box boundaries of a dimension are specified. The values can be in lattice or box distance units. See the discussion of the units keyword below. -For style *scale*\ , a multiplicative factor to apply to the box length +For style *scale*, a multiplicative factor to apply to the box length of a dimension is specified. For example, if the initial box length is 10, and the factor is 1.1, then the final box length will be 11. A factor less than 1.0 means compression. @@ -199,7 +199,7 @@ The *volume* style changes the specified dimension in such a way that the overall box volume remains constant with respect to the operation performed by the preceding keyword. The *volume* style can only be used following a keyword that changed the volume, which is any of the -*x*\ , *y*\ , *z* keywords. If the preceding keyword "key" had a *volume* +*x*, *y*, *z* keywords. If the preceding keyword "key" had a *volume* style, then both it and the current keyword apply to the keyword preceding "key". I.e. this sequence of keywords is allowed: @@ -249,15 +249,15 @@ compressed around its mid point. ---------- -For the *xy*\ , *xz*\ , and *yz* parameters, this is the meaning of their +For the *xy*, *xz*, and *yz* parameters, this is the meaning of their styles and values. Note that changing the tilt factors of a triclinic box does not change its volume. -For style *final*\ , the final tilt factor is specified. The value +For style *final*, the final tilt factor is specified. The value can be in lattice or box distance units. See the discussion of the units keyword below. -For style *delta*\ , a plus or minus change in the tilt factor is +For style *delta*, a plus or minus change in the tilt factor is specified. The value can be in lattice or box distance units. See the discussion of the units keyword below. @@ -281,10 +281,10 @@ and upper face of the box. Two letters assigns the first style to the lower face and the second style to the upper face. The style *p* means the box is periodic; the other styles mean -non-periodic. For style *f*\ , the position of the face is fixed. For -style *s*\ , the position of the face is set so as to encompass the +non-periodic. For style *f*, the position of the face is fixed. For +style *s*, the position of the face is set so as to encompass the atoms in that dimension (shrink-wrapping), no matter how far they -move. For style *m*\ , shrink-wrapping occurs, but is bounded by the +move. For style *m*, shrink-wrapping occurs, but is bounded by the current box edge in that dimension, so that the box will become no smaller. See the :doc:`boundary ` command for more explanation of these style options. diff --git a/doc/src/comm_modify.rst b/doc/src/comm_modify.rst index 27b370c941..914509b14d 100644 --- a/doc/src/comm_modify.rst +++ b/doc/src/comm_modify.rst @@ -80,7 +80,7 @@ with the *multi* neighbor style. The *multi/old* communication mode is comparabl with both the *multi* and *multi/old* neighbor styles. The *cutoff* keyword allows you to extend the ghost cutoff distance -for communication mode *single*\ , which is the distance from the borders +for communication mode *single*, which is the distance from the borders of a processor's sub-domain at which ghost atoms are acquired from other processors. By default the ghost cutoff = neighbor cutoff = pairwise force cutoff + neighbor skin. See the :doc:`neighbor ` command @@ -96,7 +96,7 @@ style present and no *comm_modify cutoff* command used. Otherwise a warning is printed, if this bond based estimate is larger than the communication cutoff used. -The *cutoff/multi* option is equivalent to *cutoff*\ , but applies to +The *cutoff/multi* option is equivalent to *cutoff*, but applies to communication mode *multi* instead. Since the communication cutoffs are determined per atom collections, a collection specifier is needed and cutoff for one or multiple collections can be extended. Also ranges of @@ -132,9 +132,9 @@ different processors, or when the interaction straddles a periodic boundary. The appropriate ghost cutoff depends on the :doc:`newton bond ` -setting. For newton bond *off*\ , the distance needs to be the furthest +setting. For newton bond *off*, the distance needs to be the furthest distance between any two atoms in the bond, angle, etc. E.g. the -distance between 1-4 atoms in a dihedral. For newton bond *on*\ , the +distance between 1-4 atoms in a dihedral. For newton bond *on*, the distance between the central atom in the bond, angle, etc and any other atom is sufficient. E.g. the distance between 2-4 atoms in a dihedral. @@ -173,7 +173,7 @@ The *vel* keyword enables velocity information to be communicated with ghost particles. Depending on the :doc:`atom_style `, velocity info includes the translational velocity, angular velocity, and angular momentum of a particle. If the *vel* option is set to -*yes*\ , then ghost atoms store these quantities; if *no* then they do +*yes*, then ghost atoms store these quantities; if *no* then they do not. The *yes* setting is needed by some pair styles which require the velocity state of both the I and J particles to compute a pairwise I,J interaction, as well as by some compute and fix commands. diff --git a/doc/src/compute.rst b/doc/src/compute.rst index 7a89c6cc87..71d3bada76 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -35,7 +35,7 @@ information about a previous state of the system. Defining a compute does not perform a computation. Instead computes are invoked by other LAMMPS commands as needed, e.g. to calculate a temperature needed for a thermostat fix or to generate thermodynamic or dump file output. -See the :doc:`Howto output ` doc page for a summary of +See the :doc:`Howto output ` page for a summary of various LAMMPS output options, many of which involve computes. The ID of a compute can only contain alphanumeric characters and @@ -59,7 +59,7 @@ style produce global quantities. Note that a single compute can produce either global or per-atom or local quantities, but not both global and per-atom. It can produce local quantities in tandem with global or per-atom quantities. The -compute doc page will explain. +compute page will explain. Global, per-atom, and local quantities each come in three kinds: a single scalar value, a vector of values, or a 2d array of values. The @@ -119,7 +119,7 @@ values by the number of atoms in the system, depending on the "thermo_modify norm" setting. It will not normalize intensive values. If a compute value is accessed in another way, e.g. by a :doc:`variable `, you may want to know whether it is an -intensive or extensive value. See the doc page for individual +intensive or extensive value. See the page for individual computes for further info. ---------- @@ -153,19 +153,19 @@ via the :doc:`compute_modify ` command. Computes can be deleted with the :doc:`uncompute ` command. Code for new computes can be added to LAMMPS; see the -:doc:`Modify ` doc page for details. The results of their +:doc:`Modify ` page for details. The results of their calculations accessed in the various ways described above. ---------- -Each compute style has its own doc page which describes its arguments +Each compute style has its own page which describes its arguments and what it does. Here is an alphabetic list of compute styles available in LAMMPS. They are also listed in more compact form on the :doc:`Commands compute ` doc page. There are also additional accelerated compute styles included in the LAMMPS distribution for faster performance on CPUs, GPUs, and KNLs. -The individual style names on the :doc:`Commands compute ` doc page are followed by one or more of +The individual style names on the :doc:`Commands compute ` page are followed by one or more of (g,i,k,o,t) to indicate which accelerated styles exist. * :doc:`ackland/atom ` - determines the local lattice structure based on the Ackland formulation diff --git a/doc/src/compute_ackland_atom.rst b/doc/src/compute_ackland_atom.rst index b4d4268244..0dc6630980 100644 --- a/doc/src/compute_ackland_atom.rst +++ b/doc/src/compute_ackland_atom.rst @@ -63,14 +63,14 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The per-atom vector values will be unitless since they are the integers defined above. diff --git a/doc/src/compute_adf.rst b/doc/src/compute_adf.rst index 6ec5c5bc10..31351a547c 100644 --- a/doc/src/compute_adf.rst +++ b/doc/src/compute_adf.rst @@ -62,7 +62,7 @@ neighbor atom in each requested ADF. command, and means those pairwise interactions do not appear in the neighbor list. Because this fix uses a neighbor list, it also means those pairs will not be included in the ADF. This does not apply when - using long-range coulomb interactions (\ *coul/long*\ , *coul/msm*\ , + using long-range coulomb interactions (\ *coul/long*, *coul/msm*, *coul/wolf* or similar. One way to get around this would be to set special_bond scaling factors to very tiny numbers that are not exactly zero (e.g. 1.0e-50). Another workaround is to write a dump file, and @@ -81,7 +81,7 @@ neighbor atom in each requested ADF. cannot be performed, and LAMMPS will give an error message. The *skin* value is what is specified with the :doc:`neighbor ` command. -The *itypeN*\ ,\ *jtypeN*\ ,\ *ktypeN* settings can be specified in one of two +The *itypeN*,\ *jtypeN*,\ *ktypeN* settings can be specified in one of two ways. An explicit numeric value can be used, as in the first example above. Or a wild-card asterisk can be used to specify a range of atom types as in the second example above. @@ -92,10 +92,10 @@ all types from 1 to N. A leading asterisk means all types from 1 to n (inclusive). A middle asterisk means all types from m to n (inclusive). -If *itypeN*\ , *jtypeN*\ , and *ktypeN* are single values, as in the first example +If *itypeN*, *jtypeN*, and *ktypeN* are single values, as in the first example above, this means that the ADF is computed where atoms of type *itypeN* are the central atom, and neighbor atoms of type *jtypeN* and *ktypeN* -are forming the angle. If any of *itypeN*\ , *jtypeN*\ , or *ktypeN* +are forming the angle. If any of *itypeN*, *jtypeN*, or *ktypeN* represent a range of values via the wild-card asterisk, as in the second example above, this means that the ADF is computed where atoms of any of the range of types represented @@ -103,7 +103,7 @@ by *itypeN* are the central atom, and the angle is formed by two neighbors, one neighbor in the range of types represented by *jtypeN* and another neighbor in the range of types represented by *ktypeN*\ . -If no *itypeN*\ , *jtypeN*\ , *ktypeN* settings are specified, then +If no *itypeN*, *jtypeN*, *ktypeN* settings are specified, then LAMMPS will generate a single ADF for all atoms in the group. The inner cutoff is set to zero and the outer cutoff is set to the force cutoff. If no pair_style is specified, there is no @@ -135,7 +135,7 @@ Each unique angle satisfying the above criteria is counted only once, regardless of whether either or both of the neighbor atoms making up the angle appear in both the J and K lists. It is OK if a particular angle is included in more than -one individual histogram, due to the way the *itypeN*\ , *jtypeN*\ , *ktypeN* +one individual histogram, due to the way the *itypeN*, *jtypeN*, *ktypeN* arguments are specified. The first ADF value for a bin is calculated from the histogram count by @@ -177,13 +177,13 @@ Output info """"""""""" This compute calculates a global array with the number of rows = -*Nbins*\ , and the number of columns = 1 + 2\*Ntriples, where Ntriples is the +*Nbins*, and the number of columns = 1 + 2\*Ntriples, where Ntriples is the number of I,J,K triples specified. The first column has the bin coordinate (angle-related ordinate at midpoint of bin). Each subsequent column has -the two ADF values for a specific set of (\ *itypeN*\ ,\ *jtypeN*\ ,\ *ktypeN*\ ) +the two ADF values for a specific set of (\ *itypeN*,\ *jtypeN*,\ *ktypeN*\ ) interactions, as described above. These values can be used by any command that uses a global values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values calculated by this compute are all "intensive". @@ -191,7 +191,7 @@ The array values calculated by this compute are all "intensive". The first column of array values is the angle-related ordinate, either the angle in degrees or radians, or the cosine of the angle. Each subsequent pair of columns gives the first and second kinds of ADF -for a specific set of (\ *itypeN*\ ,\ *jtypeN*\ ,\ *ktypeN*\ ). The values +for a specific set of (\ *itypeN*,\ *jtypeN*,\ *ktypeN*\ ). The values in the first ADF column are normalized numbers >= 0.0, whose integral w.r.t. the ordinate is 1, i.e. the first ADF is a normalized probability distribution. @@ -204,6 +204,9 @@ angles per atom satisfying the ADF criteria. Restrictions """""""""""" +This compute is part of the EXTRA-COMPUTE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. + The ADF is not computed for neighbors outside the force cutoff, since processors (in parallel) don't know about atom coordinates for atoms further away than that distance. If you want an ADF for larger diff --git a/doc/src/compute_angle.rst b/doc/src/compute_angle.rst index f3e5ee93c0..93677b4953 100644 --- a/doc/src/compute_angle.rst +++ b/doc/src/compute_angle.rst @@ -38,7 +38,7 @@ Output info This compute calculates a global vector of length N where N is the number of sub_styles defined by the :doc:`angle_style hybrid ` command, which can be accessed by indices 1-N. These values can be used by any command that uses global scalar -or vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values are "extensive" and will be in energy diff --git a/doc/src/compute_angle_local.rst b/doc/src/compute_angle_local.rst index 169ef4f238..688bfbeecb 100644 --- a/doc/src/compute_angle_local.rst +++ b/doc/src/compute_angle_local.rst @@ -128,7 +128,7 @@ array is the number of angles. If a single value is specified, a local vector is produced. If two or more values are specified, a local array is produced where the number of columns = the number of values. The vector or array can be accessed by any command that uses -local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output for *theta* will be in degrees. The output for *eng* will diff --git a/doc/src/compute_angmom_chunk.rst b/doc/src/compute_angmom_chunk.rst index da27cb3d19..10678c4e47 100644 --- a/doc/src/compute_angmom_chunk.rst +++ b/doc/src/compute_angmom_chunk.rst @@ -75,7 +75,7 @@ This compute calculates a global array where the number of rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The number of columns = 3 for the 3 xyz components of the angular momentum for each chunk. These values can be accessed by any command that uses global array -values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in diff --git a/doc/src/compute_basal_atom.rst b/doc/src/compute_basal_atom.rst index e1b04d48c4..3a74379acb 100644 --- a/doc/src/compute_basal_atom.rst +++ b/doc/src/compute_basal_atom.rst @@ -59,7 +59,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The output of this compute will be meaningless unless the atoms are on (or near) hcp lattice sites, since the calculation assumes a diff --git a/doc/src/compute_body_local.rst b/doc/src/compute_body_local.rst index e0369049cb..662838b08f 100644 --- a/doc/src/compute_body_local.rst +++ b/doc/src/compute_body_local.rst @@ -36,7 +36,7 @@ Define a computation that calculates properties of individual body sub-particles. The number of datums generated, aggregated across all processors, equals the number of body sub-particles plus the number of non-body particles in the system, modified by the group parameter as -explained below. See the :doc:`Howto body ` doc page for +explained below. See the :doc:`Howto body ` page for more details on using body particles. The local data stored by this command is generated by looping over all @@ -52,7 +52,7 @@ For both body particles and non-body particles, the *type* keyword will store the type of the particle. The *integer* keywords mean different things for body and non-body -particles. If the atom is not a body particle, only its *x*\ , *y*\ , *z* +particles. If the atom is not a body particle, only its *x*, *y*, *z* coordinates can be referenced, using the *integer* keywords 1,2,3. Note that this means that if you want to access more fields than this for body particles, then you cannot include non-body particles in the @@ -84,7 +84,7 @@ is specified, a local vector is produced. If two or more keywords are specified, a local array is produced where the number of columns = the number of keywords. The vector or array can be accessed by any command that uses local values from a compute as input. See the -:doc:`Howto output ` doc page for an overview of LAMMPS +:doc:`Howto output ` page for an overview of LAMMPS output options. The :doc:`units ` for output values depend on the body style. diff --git a/doc/src/compute_bond.rst b/doc/src/compute_bond.rst index 00b99d1f9f..ddca97420d 100644 --- a/doc/src/compute_bond.rst +++ b/doc/src/compute_bond.rst @@ -38,7 +38,7 @@ Output info This compute calculates a global vector of length N where N is the number of sub_styles defined by the :doc:`bond_style hybrid ` command, which can be accessed by indices 1-N. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values are "extensive" and will be in energy diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index 5264a86634..8bdde70dd9 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -21,7 +21,7 @@ Syntax *engpot* = bond potential energy *force* = bond force - *fx*\ ,\ *fy*\ ,\ *fz* = components of bond force + *fx*,\ *fy*,\ *fz* = components of bond force *engvib* = bond kinetic energy of vibration *engrot* = bond kinetic energy of rotation *engtrans* = bond kinetic energy of translation @@ -70,7 +70,7 @@ based on the current separation of the pair of atoms in the bond. The value *force* is the magnitude of the force acting between the pair of atoms in the bond. -The values *fx*\ , *fy*\ , and *fz* are the xyz components of +The values *fx*, *fy*, and *fz* are the xyz components of *force* between the pair of atoms in the bond. The remaining properties are all computed for motion of the two atoms @@ -178,13 +178,13 @@ array is the number of bonds. If a single value is specified, a local vector is produced. If two or more values are specified, a local array is produced where the number of columns = the number of values. The vector or array can be accessed by any command that uses local -values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output for *dist* will be in distance :doc:`units `. The output for *velvib* will be in velocity :doc:`units `. The output for *omega* will be in velocity/distance :doc:`units `. The -output for *engtrans*\ , *engvib*\ , *engrot*\ , and *engpot* will be in +output for *engtrans*, *engvib*, *engrot*, and *engpot* will be in energy :doc:`units `. The output for *force* will be in force :doc:`units `. diff --git a/doc/src/compute_centro_atom.rst b/doc/src/compute_centro_atom.rst index b250634b5c..3d32b75459 100644 --- a/doc/src/compute_centro_atom.rst +++ b/doc/src/compute_centro_atom.rst @@ -76,7 +76,7 @@ positive parameter. If the atom does not have :math:`N` neighbors (within the potential cutoff), then its centro-symmetry parameter is set to 0.0. -If the keyword *axes* has the setting *yes*\ , then this compute also +If the keyword *axes* has the setting *yes*, then this compute also estimates three symmetry axes for each atom's local neighborhood. The first two of these are the vectors joining the two pairs of neighbor atoms with smallest contributions to the centrosymmetry parameter, @@ -106,10 +106,10 @@ Output info By default, this compute calculates the centrosymmetry value for each atom as a per-atom vector, which can be accessed by any command that -uses per-atom values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. -If the *axes* keyword setting is *yes*\ , then a per-atom array is +If the *axes* keyword setting is *yes*, then a per-atom array is calculated. The first column is the centrosymmetry parameter. The next three columns are the x, y, and z components of the first symmetry axis, followed by the second, and third symmetry axes in diff --git a/doc/src/compute_chunk_atom.rst b/doc/src/compute_chunk_atom.rst index a650c8fb0a..42a5ca9301 100644 --- a/doc/src/compute_chunk_atom.rst +++ b/doc/src/compute_chunk_atom.rst @@ -108,7 +108,7 @@ can simply be accessed by any command that uses per-atom values from a compute as input, as discussed on the :doc:`Howto output ` doc page. -See the :doc:`Howto chunk ` doc page for an overview of how +See the :doc:`Howto chunk ` page for an overview of how this compute can be used with a variety of other commands to tabulate properties of a simulation. The page gives several examples of input script commands that can be used to calculate interesting properties. @@ -130,7 +130,7 @@ those chunks, or not assigned to any chunk. There are many options for specifying for how and when *Nchunk* is calculated, and how and when chunk IDs are assigned to atoms. The -details depend on the chunk *style* and its *args*\ , as well as +details depend on the chunk *style* and its *args*, as well as optional keyword settings. They can also depend on whether a :doc:`fix ave/chunk ` command is using this compute, since that command requires *Nchunk* to remain static across windows of timesteps it specifies, while it accumulates per-chunk averages. @@ -153,13 +153,13 @@ size changes. This also depends on the setting of the *units* keyword; e.g. for *reduced* units the number of chunks may not change even if the box size does. -The *bin/1d*\ , *bin/2d*\ , and *bin/3d* styles define bins as 1d layers -(slabs), 2d pencils, or 3d boxes. The *dim*\ , *origin*\ , and *delta* +The *bin/1d*, *bin/2d*, and *bin/3d* styles define bins as 1d layers +(slabs), 2d pencils, or 3d boxes. The *dim*, *origin*, and *delta* settings are specified 1, 2, or 3 times. For 2d or 3d bins, there is no restriction on specifying dim = x before dim = y or z, or dim = y before dim = z. Bins in a particular *dim* have a bin size in that dimension given by *delta*\ . In each dimension, bins are defined -relative to a specified *origin*\ , which may be the lower/upper edge of +relative to a specified *origin*, which may be the lower/upper edge of the simulation box (in that dimension), or its center point, or a specified coordinate value. Starting at the origin, sufficient bins are created in both directions to completely span the simulation box @@ -168,7 +168,7 @@ or the bounds specified by the optional *bounds* keyword. For orthogonal simulation boxes, the bins are layers, pencils, or boxes aligned with the xyz coordinate axes. For triclinic (non-orthogonal) simulation boxes, the bin faces are parallel to the -tilted faces of the simulation box. See the :doc:`Howto triclinic ` doc page for a discussion of the +tilted faces of the simulation box. See the :doc:`Howto triclinic ` page for a discussion of the geometry of triclinic boxes in LAMMPS. As described there, a tilted simulation box has edge vectors a,b,c. In that nomenclature, bins in the x dimension have faces with normals in the "b" cross "c" @@ -188,7 +188,7 @@ means there will be 10 layers from 0.0 to 1.0, regardless of the current size or shape of the simulation box. The *bin/sphere* style defines a set of spherical shell bins around -the origin (\ *xorig*\ ,\ *yorig*\ ,\ *zorig*\ ), using *nsbin* bins with radii +the origin (\ *xorig*,\ *yorig*,\ *zorig*\ ), using *nsbin* bins with radii equally spaced between *srmin* and *srmax*\ . This is effectively a 1d vector of bins. For example, if *srmin* = 1.0 and *srmax* = 10.0 and *nsbin* = 9, then the first bin spans 1.0 < r < 2.0, and the last bin @@ -199,12 +199,12 @@ transform them into ellipsoidal shells. The *bin/cylinder* style defines bins for a cylinder oriented along the axis *dim* with the axis coordinates in the other two radial -dimensions at (\ *c1*\ ,\ *c2*\ ). For dim = x, c1/c2 = y/z; for dim = y, +dimensions at (\ *c1*,\ *c2*\ ). For dim = x, c1/c2 = y/z; for dim = y, c1/c2 = x/z; for dim = z, c1/c2 = x/y. This is effectively a 2d array of bins. The first dimension is along the cylinder axis, the second dimension is radially outward from the cylinder axis. The bin size and positions along the cylinder axis are specified by the *origin* -and *delta* values, the same as for the *bin/1d*\ , *bin/2d*\ , and +and *delta* values, the same as for the *bin/1d*, *bin/2d*, and *bin/3d* styles. There are *ncbin* concentric circle bins in the radial direction from the cylinder axis with radii equally spaced between *crmin* and *crmax*\ . For example, if *crmin* = 1.0 and @@ -216,12 +216,12 @@ 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 +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 +third dimension. For *bin/sphere*, the bin with smallest radii is chunk 1 and the bni with largest radii is chunk Nchunk = *ncbin*\ . For -*bin/cylinder*\ , the numbering varies most rapidly in the dimension +*bin/cylinder*, the numbering varies most rapidly in the dimension along the cylinder axis and most slowly in the radial direction. Each time this compute is invoked, each atom is mapped to a bin based @@ -254,7 +254,7 @@ only the first time that *Nchunk* is calculated. Note that atoms with a molecule ID = 0, which may be non-molecular solvent atoms, have an out-of-range chunk ID. These atoms are -discarded (not assigned to any chunk) or assigned to *Nchunk*\ , +discarded (not assigned to any chunk) or assigned to *Nchunk*, depending on the value of the *discard* keyword. ---------- @@ -304,14 +304,14 @@ explained below, the *nchunk* keyword can be set to *once* which means If a :doc:`fix ave/chunk ` command uses this compute, it can also turn off the re-calculation of *Nchunk* for one or more windows of timesteps. The extent of the windows, during which Nchunk -is held constant, are determined by the *Nevery*\ , *Nrepeat*\ , *Nfreq* +is held constant, are determined by the *Nevery*, *Nrepeat*, *Nfreq* values and the *ave* keyword setting that are used by the :doc:`fix ave/chunk ` command. -Specifically, if *ave* = *one*\ , then for each span of *Nfreq* +Specifically, if *ave* = *one*, then for each span of *Nfreq* timesteps, *Nchunk* is held constant between the first timestep when averaging is done (within the Nfreq-length window), and the last timestep when averaging is done (multiple of Nfreq). If *ave* = -*running* or *window*\ , then *Nchunk* is held constant forever, +*running* or *window*, then *Nchunk* is held constant forever, starting on the first timestep when the :doc:`fix ave/chunk ` command invokes this compute. Note that multiple :doc:`fix ave/chunk ` commands can use @@ -336,9 +336,9 @@ The *nchunk* keyword applies to all chunk styles. It specifies how often *Nchunk* is recalculated, which in turn can affect the chunk IDs assigned to individual atoms. -If *nchunk* is set to *once*\ , then *Nchunk* is only calculated once, +If *nchunk* is set to *once*, then *Nchunk* is only calculated once, the first time this compute is invoked. If *nchunk* is set to -*every*\ , then *Nchunk* is re-calculated every time the compute is +*every*, then *Nchunk* is re-calculated every time the compute is invoked. Note that, as described above, the use of this compute by the :doc:`fix ave/chunk ` command can override the *every* setting. @@ -358,12 +358,12 @@ any atom. The *limit* keyword is used by all chunk styles except the can be tailored using the *bound* keyword (described below) which effectively limits the size of *Nchunk*\ . -If *limit* is set to *Nc* = 0, then no limit is imposed on *Nchunk*\ , -though the *compress* keyword can still be used to reduce *Nchunk*\ , as +If *limit* is set to *Nc* = 0, then no limit is imposed on *Nchunk*, +though the *compress* keyword can still be used to reduce *Nchunk*, as described below. If *Nc* > 0, then the effect of the *limit* keyword depends on whether -the *compress* keyword is also used with a setting of *yes*\ , and +the *compress* keyword is also used with a setting of *yes*, and whether the *compress* keyword is specified before the *limit* keyword or after. @@ -371,11 +371,11 @@ In all cases, *Nchunk* is first calculated in the usual way for each chunk style, as described above. First, here is what occurs if *compress yes* is not set. If *limit* -is set to *Nc max*\ , then *Nchunk* is reset to the smaller of *Nchunk* -and *Nc*\ . If *limit* is set to *Nc exact*\ , then *Nchunk* is reset to -*Nc*\ , whether the original *Nchunk* was larger or smaller than *Nc*\ . +is set to *Nc max*, then *Nchunk* is reset to the smaller of *Nchunk* +and *Nc*\ . If *limit* is set to *Nc exact*, then *Nchunk* is reset to +*Nc*, whether the original *Nchunk* was larger or smaller than *Nc*\ . If *Nchunk* shrank due to the *limit* setting, then atom chunk IDs > -*Nchunk* will be reset to 0 or *Nchunk*\ , depending on the setting of +*Nchunk* will be reset to 0 or *Nchunk*, depending on the setting of the *discard* keyword. If *Nchunk* grew, there will simply be some chunks with no atoms assigned to them. @@ -384,21 +384,21 @@ If *compress yes* is set, and the *compress* keyword comes before the described below, which resets *Nchunk*\ . The *limit* keyword is then applied to the new *Nchunk* value, exactly as described in the preceding paragraph. Note that in this case, all atoms will end up -with chunk IDs <= *Nc*\ , but their original values (e.g. molecule ID or -compute/fix/variable) may have been > *Nc*\ , because of the compression +with chunk IDs <= *Nc*, but their original values (e.g. molecule ID or +compute/fix/variable) may have been > *Nc*, because of the compression operation. If *compress yes* is set, and the *compress* keyword comes after the *limit* keyword, then the *limit* value of *Nc* is applied first to -the uncompressed value of *Nchunk*\ , but only if *Nc* < *Nchunk* +the uncompressed value of *Nchunk*, but only if *Nc* < *Nchunk* (whether *Nc max* or *Nc exact* is used). This effectively means all -atoms with chunk IDs > *Nc* have their chunk IDs reset to 0 or *Nc*\ , +atoms with chunk IDs > *Nc* have their chunk IDs reset to 0 or *Nc*, depending on the setting of the *discard* keyword. The compression operation is then performed, which may shrink *Nchunk* further. If the new *Nchunk* < *Nc* and *limit* = *Nc exact* is specified, then -*Nchunk* is reset to *Nc*\ , which results in extra chunks with no atoms +*Nchunk* is reset to *Nc*, which results in extra chunks with no atoms assigned to them. Note that in this case, all atoms will end up with -chunk IDs <= *Nc*\ , and their original values (e.g. molecule ID or +chunk IDs <= *Nc*, and their original values (e.g. molecule ID or compute/fix/variable value) will also have been <= *Nc*\ . ---------- @@ -413,7 +413,7 @@ time windows (discussed above), the chunk ID's assigned to atoms on the first step of the time window will persist until the end of the time window. -If the setting is *every*\ , which is the default, then chunk IDs are +If the setting is *every*, which is the default, then chunk IDs are re-calculated on any timestep this compute is invoked. .. note:: @@ -435,18 +435,18 @@ set of IDs, where every chunk has one or more atoms assigned to it. Two possible use cases are as follows. If a large simulation box is mostly empty space, then the *binning* style may produce many bins -with no atoms. If *compress* is set to *yes*\ , only bins with atoms +with no atoms. If *compress* is set to *yes*, only bins with atoms will be contribute to *Nchunk*\ . Likewise, the *molecule* or *compute/fix/variable* styles may produce large *Nchunk* values. For example, the :doc:`compute cluster/atom ` command assigns every atom an atom ID for one of the atoms it is clustered with. For a million-atom system with 5 clusters, there would only be 5 unique chunk IDs, but the largest chunk ID might be 1 million, -resulting in *Nchunk* = 1 million. If *compress* is set to *yes*\ , +resulting in *Nchunk* = 1 million. If *compress* is set to *yes*, *Nchunk* will be reset to 5. -If *compress* is set to *no*\ , which is the default, no compression is -done. If it is set to *yes*\ , all chunk IDs with no atoms are removed +If *compress* is set to *no*, which is the default, no compression is +done. If it is set to *yes*, all chunk IDs with no atoms are removed from the list of chunk IDs, and the list is sorted. The remaining chunk IDs are renumbered from 1 to *Nchunk* where *Nchunk* is the new length of the list. The chunk IDs assigned to each atom reflect @@ -498,23 +498,23 @@ return chunk IDs that are invalid for the previously calculated *Nchunk*\ . All the chunk styles except the *binning* styles, must use *discard* -set to either *yes* or *no*\ . If *discard* is set to *yes*\ , which is +set to either *yes* or *no*\ . If *discard* is set to *yes*, which is the default, then every "discard" atom has its chunk ID set to 0. If -*discard* is set to *no*\ , every "discard" atom has its chunk ID set to +*discard* is set to *no*, every "discard" atom has its chunk ID set to *Nchunk*\ . I.e. it becomes part of the last chunk. The *binning* styles use the *discard* keyword to decide whether to discard atoms outside the spatial domain covered by bins, or to assign them to the bin they are nearest to. -For the *bin/1d*\ , *bin/2d*\ , *bin/3d* styles the details are as -follows. If *discard* is set to *yes*\ , an out-of-domain atom will -have its chunk ID set to 0. If *discard* is set to *no*\ , the atom +For the *bin/1d*, *bin/2d*, *bin/3d* styles the details are as +follows. If *discard* is set to *yes*, an out-of-domain atom will +have its chunk ID set to 0. If *discard* is set to *no*, the atom will have its chunk ID set to the first or last bin in that dimension. -If *discard* is set to *mixed*\ , which is the default, it will only +If *discard* is set to *mixed*, which is the default, it will only have its chunk ID set to the first or last bin if bins extend to the simulation box boundary in that dimension. This is the case if the -*bound* keyword settings are *lower* and *upper*\ , which is the +*bound* keyword settings are *lower* and *upper*, which is the default. If the *bound* keyword settings are numeric values, then the atom will have its chunk ID set to 0 if it is outside the bounds of any bin. Note that in this case, it is possible that the first or @@ -524,24 +524,24 @@ is only set to 0 if it is outside the first or last bin, not if it is simply outside the numeric *bounds* setting. For the *bin/sphere* style the details are as follows. If *discard* -is set to *yes*\ , an out-of-domain atom will have its chunk ID set to -0. If *discard* is set to *no* or *mixed*\ , the atom will have its +is set to *yes*, an out-of-domain atom will have its chunk ID set to +0. If *discard* is set to *no* or *mixed*, the atom will have its chunk ID set to the first or last bin, i.e. the innermost or outermost spherical shell. If the distance of the atom from the origin is less -than *rmin*\ , it will be assigned to the first bin. If the distance of -the atom from the origin is greater than *rmax*\ , it will be assigned +than *rmin*, it will be assigned to the first bin. If the distance of +the atom from the origin is greater than *rmax*, it will be assigned to the last bin. For the *bin/cylinder* style the details are as follows. If *discard* -is set to *yes*\ , an out-of-domain atom will have its chunk ID set to -0. If *discard* is set to *no*\ , the atom will have its chunk ID set +is set to *yes*, an out-of-domain atom will have its chunk ID set to +0. If *discard* is set to *no*, the atom will have its chunk ID set to the first or last bin in both the radial and axis dimensions. If -*discard* is set to *mixed*\ , which is the default, the radial +*discard* is set to *mixed*, which is the default, the radial dimension is treated the same as for *discard* = no. But for the axis dimension, it will only have its chunk ID set to the first or last bin if bins extend to the simulation box boundary in the axis dimension. This is the case if the *bound* keyword settings are -*lower* and *upper*\ , which is the default. If the *bound* keyword +*lower* and *upper*, which is the default. If the *bound* keyword settings are numeric values, then the atom will have its chunk ID set to 0 if it is outside the bounds of any bin. Note that in this case, it is possible that the first or last bin extends beyond the numeric @@ -550,22 +550,22 @@ the case, the chunk ID of the atom is only set to 0 if it is outside the first or last bin, not if it is simply outside the numeric *bounds* setting. -If *discard* is set to *no* or *mixed*\ , the atom will have its +If *discard* is set to *no* or *mixed*, the atom will have its chunk ID set to the first or last bin, i.e. the innermost or outermost spherical shell. If the distance of the atom from the origin is less -than *rmin*\ , it will be assigned to the first bin. If the distance of -the atom from the origin is greater than *rmax*\ , it will be assigned +than *rmin*, it will be assigned to the first bin. If the distance of +the atom from the origin is greater than *rmax*, it will be assigned to the last bin. ---------- -The *bound* keyword only applies to the *bin/1d*\ , *bin/2d*\ , *bin/3d* +The *bound* keyword only applies to the *bin/1d*, *bin/2d*, *bin/3d* styles and to the axis dimension of the *bin/cylinder* style; otherwise it is ignored. It can be used one or more times to limit the extent of bin coverage in a specified dimension, i.e. to only bin a portion of the box. If the *lo* setting is *lower* or the *hi* -setting is *upper*\ , the bin extent in that direction extends to the -box boundary. If a numeric value is used for *lo* and/or *hi*\ , then +setting is *upper*, the bin extent in that direction extends to the +box boundary. If a numeric value is used for *lo* and/or *hi*, then the bin extent in the *lo* or *hi* direction extends only to that value, which is assumed to be inside (or at least near) the simulation box boundaries, though LAMMPS does not check for this. Note that @@ -573,7 +573,7 @@ using the *bound* keyword typically reduces the total number of bins and thus the number of chunks *Nchunk*\ . The *pbc* keyword only applies to the *bin/sphere* and *bin/cylinder* -styles. If set to *yes*\ , the distance an atom is from the sphere +styles. If set to *yes*, the distance an atom is from the sphere origin or cylinder axis is calculated in a minimum image sense with respect to periodic dimensions, when determining which bin the atom is in. I.e. if x is a periodic dimension and the distance between the @@ -582,18 +582,18 @@ simulation box length in x, then a box length is subtracted to give a distance < 0.5 \* simulation box length. This allosws the sphere or cylinder center to be near a box edge, and atoms on the other side of the periodic box will still be close to the center point/axis. Note -that with a setting of *yes*\ , the outer sphere or cylinder radius must +that with a setting of *yes*, the outer sphere or cylinder radius must also be <= 0.5 \* simulation box length in any periodic dimension except for the cylinder axis dimension, or an error is generated. The *units* keyword only applies to the *binning* styles; otherwise it -is ignored. For the *bin/1d*\ , *bin/2d*\ , *bin/3d* styles, it +is ignored. For the *bin/1d*, *bin/2d*, *bin/3d* styles, it determines the meaning of the distance units used for the bin sizes *delta* and for *origin* and *bounds* values if they are coordinate values. For the *bin/sphere* style it determines the meaning of the -distance units used for *xorig*\ ,\ *yorig*\ ,\ *zorig* and the radii *srmin* +distance units used for *xorig*,\ *yorig*,\ *zorig* and the radii *srmin* and *srmax*\ . For the *bin/cylinder* style it determines the meaning -of the distance units used for *delta*\ ,\ *c1*\ ,\ *c2* and the radii *crmin* +of the distance units used for *delta*,\ *c1*,\ *c2* and the radii *crmin* and *crmax*\ . For orthogonal simulation boxes, any of the 3 options may @@ -627,7 +627,7 @@ This compute calculates a per-atom vector (the chunk ID), which can be accessed by any command that uses per-atom values from a compute as input. It also calculates a global scalar (the number of chunks), which can be similarly accessed everywhere outside of a per-atom context. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values are unitless chunk IDs, ranging from 1 to @@ -637,7 +637,7 @@ belonging to a chunk. The scalar contains the value of *Nchunk*. Restrictions """""""""""" -Even if the *nchunk* keyword is set to *once*\ , the chunk IDs assigned +Even if the *nchunk* keyword is set to *once*, the chunk IDs assigned to each atom are not stored in a restart files. This means you cannot expect those assignments to persist in a restarted simulation. Instead you must re-specify this command and assign atoms to chunks when diff --git a/doc/src/compute_chunk_spread_atom.rst b/doc/src/compute_chunk_spread_atom.rst index 9e6489f828..1fd260ab2c 100644 --- a/doc/src/compute_chunk_spread_atom.rst +++ b/doc/src/compute_chunk_spread_atom.rst @@ -193,7 +193,7 @@ Output info This compute calculates a per-atom vector or array, which can be accessed by any command that uses per-atom values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output is a per-atom vector if a single input value is specified, diff --git a/doc/src/compute_cluster_atom.rst b/doc/src/compute_cluster_atom.rst index ab47aed9b3..f82b2affa5 100644 --- a/doc/src/compute_cluster_atom.rst +++ b/doc/src/compute_cluster_atom.rst @@ -89,7 +89,7 @@ style computes. command, and means those pairwise interactions do not appear in the neighbor list. Because this fix uses the neighbor list, it also means those pairs will not be included when computing the clusters. This - does not apply when using long-range coulomb (\ *coul/long*\ , *coul/msm*\ , + does not apply when using long-range coulomb (\ *coul/long*, *coul/msm*, *coul/wolf* or similar. One way to get around this would be to set special_bond scaling factors to very tiny numbers that are not exactly zero (e.g. 1.0e-50). Another workaround is to write a dump file, and @@ -111,14 +111,16 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be an ID > 0, as explained above. Restrictions """""""""""" - none + +These computes are part of the EXTRA-COMPUTE package. They are only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" @@ -128,6 +130,5 @@ Related commands Default """"""" - The default for fragment/atom is single no. diff --git a/doc/src/compute_cna_atom.rst b/doc/src/compute_cna_atom.rst index 41d7113b60..756a9d932c 100644 --- a/doc/src/compute_cna_atom.rst +++ b/doc/src/compute_cna_atom.rst @@ -84,7 +84,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be a number from 0 to 5, as explained diff --git a/doc/src/compute_cnp_atom.rst b/doc/src/compute_cnp_atom.rst index 30f045a67b..59c45107b3 100644 --- a/doc/src/compute_cnp_atom.rst +++ b/doc/src/compute_cnp_atom.rst @@ -43,7 +43,7 @@ This parameter is computed using the following formula from Q_{i} = \frac{1}{n_i}\sum_{j = 1}^{n_i} \left | \sum_{k = 1}^{n_{ij}} \vec{R}_{ik} + \vec{R}_{jk} \right | ^{2} where the index *j* goes over the :math:`n_i` nearest neighbors of atom -*i*\ , and the index *k* goes over the :math:`n_{ij}` common nearest neighbors +*i*, and the index *k* goes over the :math:`n_{ij}` common nearest neighbors between atom *i* and atom *j*\ . :math:`\vec{R}_{ik}` and :math:`\vec{R}_{jk}` are the vectors connecting atom *k* to atoms *i* and *j*\ . The quantity in the double sum is computed @@ -91,7 +91,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be real positive numbers. Some typical CNP @@ -111,7 +111,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_contact_atom.rst b/doc/src/compute_contact_atom.rst index f22a78c63c..20dcbfae29 100644 --- a/doc/src/compute_contact_atom.rst +++ b/doc/src/compute_contact_atom.rst @@ -39,7 +39,7 @@ Output info This compute calculates a per-atom vector, whose values can be accessed by any command that uses per-atom values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be a number >= 0.0, as explained @@ -48,6 +48,10 @@ above. Restrictions """""""""""" +This compute is part of the GRANULAR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. + This compute requires that atoms store a radius as defined by the :doc:`atom_style sphere ` command. diff --git a/doc/src/compute_coord_atom.rst b/doc/src/compute_coord_atom.rst index f3c6f818af..bff2a8a8af 100644 --- a/doc/src/compute_coord_atom.rst +++ b/doc/src/compute_coord_atom.rst @@ -73,7 +73,7 @@ from 1 to N. A leading asterisk means all types from 1 to n (inclusive). The *orientorder* cstyle calculates the number of "connected" neighbor -atoms J around each central atom I. For this *cstyle*\ , connected is +atoms J around each central atom I. For this *cstyle*, connected is defined by the orientational order parameter calculated by the :doc:`compute orientorder/atom ` command. This *cstyle* thus allows one to apply the ten Wolde's criterion to @@ -85,7 +85,7 @@ calculate components of the *Ybar_lm* vector for each atoms, as described in its documentation. Note that orientorder/atom compute defines its own criteria for identifying neighboring atoms. If the scalar product (*Ybar_lm(i)*,*Ybar_lm(j)*), calculated by the -orientorder/atom compute is larger than the specified *threshold*\ , +orientorder/atom compute is larger than the specified *threshold*, then I and J are connected, and the coordination value of I is incremented by one. diff --git a/doc/src/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst index 2439bd5a1b..3847a4de66 100644 --- a/doc/src/compute_damage_atom.rst +++ b/doc/src/compute_damage_atom.rst @@ -45,7 +45,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values are unitless numbers (damage) >= 0.0. @@ -54,7 +54,7 @@ Restrictions """""""""""" This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_dihedral.rst b/doc/src/compute_dihedral.rst index 0bbcb370b5..d4198dde3c 100644 --- a/doc/src/compute_dihedral.rst +++ b/doc/src/compute_dihedral.rst @@ -37,7 +37,7 @@ Output info This compute calculates a global vector of length N where N is the number of sub_styles defined by the :doc:`dihedral_style hybrid ` command. which can be accessed by indices 1-N. These values can be used by any command that uses global scalar -or vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values are "extensive" and will be in energy diff --git a/doc/src/compute_dihedral_local.rst b/doc/src/compute_dihedral_local.rst index 75c0e69790..82d3c3ab72 100644 --- a/doc/src/compute_dihedral_local.rst +++ b/doc/src/compute_dihedral_local.rst @@ -122,7 +122,7 @@ array is the number of dihedrals. If a single value is specified, a local vector is produced. If two or more values are specified, a local array is produced where the number of columns = the number of values. The vector or array can be accessed by any command that uses -local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output for *phi* will be in degrees. diff --git a/doc/src/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst index 85b5770c64..0e3159ffe7 100644 --- a/doc/src/compute_dilatation_atom.rst +++ b/doc/src/compute_dilatation_atom.rst @@ -48,7 +48,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values are unitless numbers (theta) >= 0.0. @@ -57,7 +57,7 @@ Restrictions """""""""""" This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_dipole.rst b/doc/src/compute_dipole.rst index c0e17f27d3..243efc0576 100644 --- a/doc/src/compute_dipole.rst +++ b/doc/src/compute_dipole.rst @@ -12,7 +12,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * dipole = style name of this compute command -* charge-correction = *mass* or *geometry*\ , use COM or geometric center for charged chunk correction (optional) +* charge-correction = *mass* or *geometry*, use COM or geometric center for charged chunk correction (optional) Examples """""""" @@ -51,7 +51,7 @@ Output info This compute calculations a global scalar containing the magnitude of the computed dipole moment and a global vector of length 3 with the -dipole vector. See the :doc:`Howto output ` doc page for +dipole vector. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The computed values are "intensive". The array values will be in diff --git a/doc/src/compute_dipole_chunk.rst b/doc/src/compute_dipole_chunk.rst index 4207d3d180..fc1e8d7709 100644 --- a/doc/src/compute_dipole_chunk.rst +++ b/doc/src/compute_dipole_chunk.rst @@ -13,7 +13,7 @@ Syntax * ID, group-ID are documented in :doc:`compute ` command * dipole/chunk = style name of this compute command * chunkID = ID of :doc:`compute chunk/atom ` command -* charge-correction = *mass* or *geometry*\ , use COM or geometric center for charged chunk correction (optional) +* charge-correction = *mass* or *geometry*, use COM or geometric center for charged chunk correction (optional) Examples """""""" @@ -84,7 +84,7 @@ chunk/atom ` command. The number of columns = 4 for the x,y,z dipole vector components and the total dipole of each chunk. These values can be accessed by any command that uses global array values from a compute as input. See the :doc:`Howto output -` doc page for an overview of LAMMPS output options. +` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in dipole units, i.e. charge units times distance :doc:`units `. diff --git a/doc/src/compute_dpd.rst b/doc/src/compute_dpd.rst index 72cae28c22..bc6e1d2321 100644 --- a/doc/src/compute_dpd.rst +++ b/doc/src/compute_dpd.rst @@ -52,7 +52,7 @@ Output info This compute calculates a global vector of length 5 (:math:`U^{cond}`, :math:`U^{mech}`, :math:`U^{chem}`, :math:`\theta_{avg}`, :math:`N`), which can be accessed by indices 1-5. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values will be in energy and temperature :doc:`units `. @@ -61,7 +61,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/compute_dpd_atom.rst b/doc/src/compute_dpd_atom.rst index 6abbce10f0..6104c4a273 100644 --- a/doc/src/compute_dpd_atom.rst +++ b/doc/src/compute_dpd_atom.rst @@ -40,7 +40,7 @@ This compute calculates a per-particle array with 4 columns (:math:`u^{cond}`, :math:`u^{mech}`, :math:`u^{chem}`, :math:`\theta`), which can be accessed by indices 1-4 by any command that uses per-particle values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle array values will be in energy (:math:`u^{cond}`, @@ -51,7 +51,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/compute_edpd_temp_atom.rst b/doc/src/compute_edpd_temp_atom.rst index 920bda1a87..3568a6364f 100644 --- a/doc/src/compute_edpd_temp_atom.rst +++ b/doc/src/compute_edpd_temp_atom.rst @@ -36,7 +36,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See the -:doc:`Howto output ` doc page for an overview of LAMMPS +:doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in temperature :doc:`units `. @@ -45,7 +45,7 @@ Restrictions """""""""""" This compute is part of the DPD-MESO package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_efield_atom.rst b/doc/src/compute_efield_atom.rst index 04f3e4dc37..a3d2cb888d 100644 --- a/doc/src/compute_efield_atom.rst +++ b/doc/src/compute_efield_atom.rst @@ -52,7 +52,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in electric field :doc:`units `. diff --git a/doc/src/compute_entropy_atom.rst b/doc/src/compute_entropy_atom.rst index 0ca07815d3..e3d585dfde 100644 --- a/doc/src/compute_entropy_atom.rst +++ b/doc/src/compute_entropy_atom.rst @@ -67,7 +67,7 @@ is a parameter to control the smoothing. The input parameters are *sigma* the smoothing parameter :math:`\sigma`, and the *cutoff* for the calculation of g(r). -If the keyword *avg* has the setting *yes*\ , then this compute also +If the keyword *avg* has the setting *yes*, then this compute also averages the parameter over the neighbors of atom i according to: .. math:: @@ -114,7 +114,7 @@ Output info By default, this compute calculates the pair entropy value for each atom as a per-atom vector, which can be accessed by any command that -uses per-atom values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The pair entropy values have units of the Boltzmann constant. They are @@ -125,7 +125,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_erotate_asphere.rst b/doc/src/compute_erotate_asphere.rst index 0210279560..2b4edc8017 100644 --- a/doc/src/compute_erotate_asphere.rst +++ b/doc/src/compute_erotate_asphere.rst @@ -45,7 +45,7 @@ Output info This compute calculates a global scalar (the KE). This value can be used by any command that uses a global scalar value from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "extensive". The diff --git a/doc/src/compute_erotate_rigid.rst b/doc/src/compute_erotate_rigid.rst index b5b594f781..acbcf5cb0c 100644 --- a/doc/src/compute_erotate_rigid.rst +++ b/doc/src/compute_erotate_rigid.rst @@ -43,7 +43,7 @@ Output info This compute calculates a global scalar (the summed rotational energy of all the rigid bodies). This value can be used by any command that -uses a global scalar value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses a global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "extensive". The @@ -53,7 +53,7 @@ Restrictions """""""""""" This compute is part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_erotate_sphere.rst b/doc/src/compute_erotate_sphere.rst index c10d13c318..6890f18212 100644 --- a/doc/src/compute_erotate_sphere.rst +++ b/doc/src/compute_erotate_sphere.rst @@ -40,7 +40,7 @@ Output info This compute calculates a global scalar (the KE). This value can be used by any command that uses a global scalar value from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "extensive". The diff --git a/doc/src/compute_erotate_sphere_atom.rst b/doc/src/compute_erotate_sphere_atom.rst index b12669ed0c..76025b36f7 100644 --- a/doc/src/compute_erotate_sphere_atom.rst +++ b/doc/src/compute_erotate_sphere_atom.rst @@ -44,7 +44,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_event_displace.rst b/doc/src/compute_event_displace.rst index a147ca0d7d..6cf04e83ba 100644 --- a/doc/src/compute_event_displace.rst +++ b/doc/src/compute_event_displace.rst @@ -48,7 +48,7 @@ Output info This compute calculates a global scalar (the flag). This value can be used by any command that uses a global scalar value from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_fep.rst b/doc/src/compute_fep.rst index 5427538a73..5275716c45 100644 --- a/doc/src/compute_fep.rst +++ b/doc/src/compute_fep.rst @@ -269,7 +269,7 @@ activated via the :doc:`pair_modify ` command. If the perturbation is small, the tail contribution to the energy difference between the reference and perturbed systems should be negligible. -If the keyword *volume* = *yes*\ , then the Boltzmann term is multiplied +If the keyword *volume* = *yes*, then the Boltzmann term is multiplied by the volume so that correct ensemble averaging can be performed over trajectories during which the volume fluctuates or changes :ref:`(Allen and Tildesley) `: @@ -295,7 +295,7 @@ unperturbed parameters. The energies include kspace terms if these are used in the simulation. These output results can be used by any command that uses a global -scalar or vector from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +scalar or vector from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. For example, the computed values can be averaged using :doc:`fix ave/time `. The values calculated by this compute are "extensive". @@ -304,7 +304,7 @@ Restrictions """""""""""" This compute is distributed as the FEP package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" @@ -315,7 +315,7 @@ Related commands Default """"""" -The option defaults are *tail* = *no*\ , *volume* = *no*\ . +The option defaults are *tail* = *no*, *volume* = *no*\ . ---------- diff --git a/doc/src/compute_global_atom.rst b/doc/src/compute_global_atom.rst index 1c8ff6c85e..1ee4abdde0 100644 --- a/doc/src/compute_global_atom.rst +++ b/doc/src/compute_global_atom.rst @@ -146,7 +146,7 @@ to effectively specify multiple values. If *index* begins with "f\_", a fix ID must follow which has been previously defined in the input script. The Fix must generate -per-atom quantities. See the individual :doc:`fix ` doc page for +per-atom quantities. See the individual :doc:`fix ` page for details. Note that some fixes only produce their values on certain timesteps, which must be compatible with when compute global/atom references the values, else an error results. If no bracketed integer @@ -213,7 +213,7 @@ vector. If multiple inputs are specified, this compute produces a per-atom array values, where the number of columns is equal to the number of inputs specified. These values can be used by any command that uses per-atom vector or array values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector or array values will be in whatever units the diff --git a/doc/src/compute_group_group.rst b/doc/src/compute_group_group.rst index b22689d4b3..d361bc806d 100644 --- a/doc/src/compute_group_group.rst +++ b/doc/src/compute_group_group.rst @@ -39,7 +39,7 @@ Define a computation that calculates the total energy and force interaction between two groups of atoms: the compute group and the specified group2. The two groups can be the same. -If the *pair* keyword is set to *yes*\ , which is the default, then the +If the *pair* keyword is set to *yes*, which is the default, then the the interaction energy will include a pair component which is defined as the pairwise energy between all pairs of atoms where one atom in the pair is in the first group and the other is in the second group. @@ -60,7 +60,7 @@ force. For the *inter* setting, the two atoms must be in different molecules. For the *intra* setting, the two atoms must be in the same molecule. -If the *kspace* keyword is set to *yes*\ , which is not the default, and +If the *kspace* keyword is set to *yes*, which is not the default, and if a :doc:`kspace_style ` is defined, then the interaction energy will include a Kspace component which is the long-range Coulombic energy between all the atoms in the first group and all the @@ -73,7 +73,7 @@ charge of the unit cell is zero. However, one can assume the net charge of the system is neutralized by a uniform background plasma, and a correction to the system energy can be applied to reduce artifacts. For more information see :ref:`(Bogusz) `. If the -*boundary* keyword is set to *yes*\ , which is the default, and *kspace* +*boundary* keyword is set to *yes*, which is the default, and *kspace* contributions are included, then this energy correction term will be added to the total group-group energy. This correction term does not affect the force calculation and will be zero if one or both of the @@ -108,7 +108,7 @@ frequently. neighbor list. Because this compute uses a neighbor list, it also means those pairs will not be included in the group/group interaction. This does not apply when using long-range coulomb interactions - (\ *coul/long*\ , *coul/msm*\ , *coul/wolf* or similar. One way to get + (\ *coul/long*, *coul/msm*, *coul/wolf* or similar. One way to get around this would be to set special_bond scaling factors to very tiny numbers that are not exactly zero (e.g. 1.0e-50). Another workaround is to write a dump file, and use the :doc:`rerun ` command to @@ -134,7 +134,7 @@ Output info This compute calculates a global scalar (the energy) and a global vector of length 3 (force), which can be accessed by indices 1-3. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. Both the scalar and vector values calculated by this compute are diff --git a/doc/src/compute_gyration.rst b/doc/src/compute_gyration.rst index da0b14abe8..18c46f4772 100644 --- a/doc/src/compute_gyration.rst +++ b/doc/src/compute_gyration.rst @@ -62,7 +62,7 @@ Output info This compute calculates a global scalar (:math:`R_g`) and a global vector of length 6 (:math:`{R_g}^2` tensor), which can be accessed by indices 1-6. These values can be used by any command that uses a global scalar value or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar and vector values calculated by this compute are diff --git a/doc/src/compute_gyration_chunk.rst b/doc/src/compute_gyration_chunk.rst index eaa048c111..0255d4f95a 100644 --- a/doc/src/compute_gyration_chunk.rst +++ b/doc/src/compute_gyration_chunk.rst @@ -101,7 +101,7 @@ number of rows in the array = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. If the *tensor* keyword is specified, the global array has 6 columns. The vector or array can be accessed by any command that uses global values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. All the vector or array values calculated by this compute are diff --git a/doc/src/compute_gyration_shape.rst b/doc/src/compute_gyration_shape.rst index b2b22df9ef..8eee14e787 100644 --- a/doc/src/compute_gyration_shape.rst +++ b/doc/src/compute_gyration_shape.rst @@ -70,7 +70,7 @@ This compute calculates a global vector of length 6, which can be accessed by indices 1-6. The first three values are the eigenvalues of the gyration tensor followed by the asphericity, the acylindricity and the relative shape anisotropy. The computed values can be used by any command -that uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +that uses global vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values calculated by this compute are @@ -81,7 +81,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_gyration_shape_chunk.rst b/doc/src/compute_gyration_shape_chunk.rst index fd0b08cae6..f9d9df8db0 100644 --- a/doc/src/compute_gyration_shape_chunk.rst +++ b/doc/src/compute_gyration_shape_chunk.rst @@ -71,7 +71,7 @@ This compute calculates a global array with six columns, which can be accessed by indices 1-6. The first three columns are the eigenvalues of the gyration tensor followed by the asphericity, the acylindricity and the relative shape anisotropy. The computed values can be used by any command -that uses global array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +that uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array calculated by this compute is @@ -82,7 +82,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_heat_flux.rst b/doc/src/compute_heat_flux.rst index 3e8469617f..94d6f09700 100644 --- a/doc/src/compute_heat_flux.rst +++ b/doc/src/compute_heat_flux.rst @@ -41,7 +41,7 @@ which can add or subtract heat from groups of atoms. The compute takes three arguments which are IDs of other :doc:`computes `. One calculates per-atom kinetic energy -(\ *ke-ID*\ ), one calculates per-atom potential energy (\ *pe-ID)*\ , and the +(\ *ke-ID*\ ), one calculates per-atom potential energy (\ *pe-ID)*, and the third calculates per-atom stress (\ *stress-ID*\ ). .. note:: @@ -131,7 +131,7 @@ of just the convective portion of the flux, i.e. the first term in the equation for :math:`\mathbf{J}`. Each component can be accessed by indices 1-6. These values can be used by any command that -uses global vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses global vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values calculated by this compute are "extensive", meaning diff --git a/doc/src/compute_hexorder_atom.rst b/doc/src/compute_hexorder_atom.rst index a8e70245df..8b8bc3f4d0 100644 --- a/doc/src/compute_hexorder_atom.rst +++ b/doc/src/compute_hexorder_atom.rst @@ -48,7 +48,7 @@ is formed by the bond vector :math:`r_{ij}` and the *x* axis. :math:`\theta` is calculated only using the *x* and *y* components, whereas the distance from the central atom is calculated using all three -*x*\ , *y*\ , and *z* components of the bond vector. +*x*, *y*, and *z* components of the bond vector. Neighbor atoms not in the group are included in the order parameter of atoms in the group. @@ -110,7 +110,9 @@ page for an overview of LAMMPS output options. Restrictions """""""""""" - none + +This compute is part of the EXTRA-COMPUTE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_hma.rst b/doc/src/compute_hma.rst index 575740a2d5..e9c3133ebb 100644 --- a/doc/src/compute_hma.rst +++ b/doc/src/compute_hma.rst @@ -161,7 +161,7 @@ Output info This compute calculates a global vector that includes the n properties requested as arguments to the command (the potential energy, pressure and/or heat capacity). The elements of the vector can be accessed by indices 1-n by any -command that uses global vector values as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. +command that uses global vector values as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values calculated by this compute are "extensive". The scalar value will be in energy :doc:`units `. @@ -170,7 +170,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is enabled only -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Usage restricted to canonical (NVT) ensemble simulation only. @@ -192,5 +192,5 @@ none .. _hma-Moustafa: -**(Moustafa)** Sabry G. Moustafa, Andrew J. Schultz, and David A. Kofke, *Very fast averaging of thermal properties of crystals by molecular simulation*\ , +**(Moustafa)** Sabry G. Moustafa, Andrew J. Schultz, and David A. Kofke, *Very fast averaging of thermal properties of crystals by molecular simulation*, `Phys. Rev. E [92], 043303 (2015) `_ diff --git a/doc/src/compute_improper.rst b/doc/src/compute_improper.rst index 3eb008c3b2..2d6684b240 100644 --- a/doc/src/compute_improper.rst +++ b/doc/src/compute_improper.rst @@ -37,7 +37,7 @@ Output info This compute calculates a global vector of length N where N is the number of sub_styles defined by the :doc:`improper_style hybrid ` command. which can be accessed by indices 1-N. These values can be used by any command that uses global scalar -or vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +or vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector values are "extensive" and will be in energy diff --git a/doc/src/compute_improper_local.rst b/doc/src/compute_improper_local.rst index 4c4af36149..3a849bf20c 100644 --- a/doc/src/compute_improper_local.rst +++ b/doc/src/compute_improper_local.rst @@ -69,7 +69,7 @@ array is the number of impropers. If a single keyword is specified, a local vector is produced. If two or more keywords are specified, a local array is produced where the number of columns = the number of keywords. The vector or array can be accessed by any command that -uses local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output for *chi* will be in degrees. diff --git a/doc/src/compute_inertia_chunk.rst b/doc/src/compute_inertia_chunk.rst index 638a0baec8..42f5725d92 100644 --- a/doc/src/compute_inertia_chunk.rst +++ b/doc/src/compute_inertia_chunk.rst @@ -74,7 +74,7 @@ This compute calculates a global array where the number of rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The number of columns = 6 for the 6 components of the inertia tensor for each chunk, ordered as listed above. These values can be accessed by any command that -uses global array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses global array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in diff --git a/doc/src/compute_ke_atom.rst b/doc/src/compute_ke_atom.rst index 8828ee4e3f..277b6ea6d6 100644 --- a/doc/src/compute_ke_atom.rst +++ b/doc/src/compute_ke_atom.rst @@ -37,7 +37,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_ke_atom_eff.rst b/doc/src/compute_ke_atom_eff.rst index e364b20f31..4587632818 100644 --- a/doc/src/compute_ke_atom_eff.rst +++ b/doc/src/compute_ke_atom_eff.rst @@ -65,7 +65,7 @@ Output info This compute calculates a scalar quantity for each atom, which can be accessed by any command that uses per-atom computes as input. See the -:doc:`Howto output ` doc page for an overview of LAMMPS +:doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in energy :doc:`units `. @@ -74,7 +74,7 @@ Restrictions """""""""""" This compute is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_ke_eff.rst b/doc/src/compute_ke_eff.rst index 6028099d07..233352ba7a 100644 --- a/doc/src/compute_ke_eff.rst +++ b/doc/src/compute_ke_eff.rst @@ -69,7 +69,7 @@ Output info This compute calculates a global scalar (the KE). This value can be used by any command that uses a global scalar value from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "extensive". The @@ -79,7 +79,7 @@ Restrictions """""""""""" This compute is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_ke_rigid.rst b/doc/src/compute_ke_rigid.rst index c8bd663da7..680b1a60fc 100644 --- a/doc/src/compute_ke_rigid.rst +++ b/doc/src/compute_ke_rigid.rst @@ -42,7 +42,7 @@ Output info This compute calculates a global scalar (the summed KE of all the rigid bodies). This value can be used by any command that uses a -global scalar value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +global scalar value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "extensive". The @@ -52,7 +52,7 @@ Restrictions """""""""""" This compute is part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_mesont.rst b/doc/src/compute_mesont.rst index c449a0a175..c396a33dbc 100644 --- a/doc/src/compute_mesont.rst +++ b/doc/src/compute_mesont.rst @@ -36,7 +36,7 @@ Output info These computes calculate per-node (per-atom) vectors, which can be accessed by any command that uses per-atom values from a compute as input, and global -scalars. See the :doc:`Howto output ` doc page for an overview of +scalars. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The computed values are provided in energy :doc:`units `. diff --git a/doc/src/compute_mliap.rst b/doc/src/compute_mliap.rst index 86dfe5a856..350f4c800c 100644 --- a/doc/src/compute_mliap.rst +++ b/doc/src/compute_mliap.rst @@ -169,7 +169,7 @@ This compute is part of the ML-IAP package. It is only enabled if LAMMPS was built with that package. In addition, building LAMMPS with the ML-IAP package requires building LAMMPS with the ML-SNAP package. The *mliappy* model also requires building LAMMPS with the PYTHON -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/compute_modify.rst b/doc/src/compute_modify.rst index 3b8f613744..a68f3c14e1 100644 --- a/doc/src/compute_modify.rst +++ b/doc/src/compute_modify.rst @@ -18,10 +18,10 @@ Syntax *extra/dof* value = N N = # of extra degrees of freedom to subtract - *extra* syntax is identical to *extra/dof*\ , will be disabled at some point + *extra* syntax is identical to *extra/dof*, will be disabled at some point *dynamic/dof* value = *yes* or *no* yes/no = do or do not re-compute the number of degrees of freedom (DOF) contributing to the temperature - *dynamic* syntax is identical to *dynamic/dof*\ , will be disabled at some point + *dynamic* syntax is identical to *dynamic/dof*, will be disabled at some point Examples """""""" diff --git a/doc/src/compute_momentum.rst b/doc/src/compute_momentum.rst index 266e4b5e18..c86901933b 100644 --- a/doc/src/compute_momentum.rst +++ b/doc/src/compute_momentum.rst @@ -34,7 +34,7 @@ Output info This compute calculates a global vector (the summed momentum) of length 3. This value can be used by any command that uses a global -vector value from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector value from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector value calculated by this compute is "extensive". The vector @@ -44,7 +44,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_msd_chunk.rst b/doc/src/compute_msd_chunk.rst index ee2c4612d7..ed13a32b7c 100644 --- a/doc/src/compute_msd_chunk.rst +++ b/doc/src/compute_msd_chunk.rst @@ -112,7 +112,7 @@ This compute calculates a global array where the number of rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The number of columns = 4 for dx,dy,dz and the total displacement. These values can be accessed by any command that uses global array values from a compute -as input. See the :doc:`Howto output ` doc page for an +as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in diff --git a/doc/src/compute_msd_nongauss.rst b/doc/src/compute_msd_nongauss.rst index 63d8deb2cd..70f4505d7f 100644 --- a/doc/src/compute_msd_nongauss.rst +++ b/doc/src/compute_msd_nongauss.rst @@ -56,7 +56,7 @@ If the *com* option is set to *yes* then the effect of any drift in the center-of-mass of the group of atoms is subtracted out before the displacement of each atom is calculated. -See the :doc:`compute msd ` doc page for further important +See the :doc:`compute msd ` page for further important NOTEs, which also apply to this compute. Output info @@ -74,8 +74,8 @@ the third is dimensionless. Restrictions """""""""""" -This compute is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This compute is part of the EXTRA-COMPUTE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_omega_chunk.rst b/doc/src/compute_omega_chunk.rst index d0af88b1a4..90baf9e2b3 100644 --- a/doc/src/compute_omega_chunk.rst +++ b/doc/src/compute_omega_chunk.rst @@ -75,7 +75,7 @@ This compute calculates a global array where the number of rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The number of columns = 3 for the 3 xyz components of the angular velocity for each chunk. These values can be accessed by any command that uses global array -values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in diff --git a/doc/src/compute_orientorder_atom.rst b/doc/src/compute_orientorder_atom.rst index af4e6a21e8..2efea311a0 100644 --- a/doc/src/compute_orientorder_atom.rst +++ b/doc/src/compute_orientorder_atom.rst @@ -181,7 +181,9 @@ page for an overview of LAMMPS output options. Restrictions """""""""""" - none + +This compute is part of the EXTRA-COMPUTE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_pair.rst b/doc/src/compute_pair.rst index abfd1ebed4..b43c4bd6d7 100644 --- a/doc/src/compute_pair.rst +++ b/doc/src/compute_pair.rst @@ -50,11 +50,11 @@ two parts: *evdwl* and *ecoul* such that *epair* = *evdwl* + *ecoul*\ . If the pair style calculates Coulombic interactions, their energy will be tallied in *ecoul*\ . Everything else (whether it is a Lennard-Jones style van der Waals interaction or not) is tallied in *evdwl*\ . If -*evalue* is blank or specified as *epair*\ , then *epair* is stored +*evalue* is blank or specified as *epair*, then *epair* is stored as a global scalar by this compute. This is useful when using :doc:`pair_style hybrid ` if you want to know the portion of the total energy contributed by one sub-style. If *evalue* is -specified as *evdwl* or *ecoul*\ , then just that portion of the energy +specified as *evdwl* or *ecoul*, then just that portion of the energy is stored as a global scalar. .. note:: @@ -66,7 +66,7 @@ is stored as a global scalar. Some pair styles tally additional quantities, e.g. a breakdown of potential energy into 14 components is tallied by the :doc:`pair_style reaxff ` command. These values (1 or more) -are stored as a global vector by this compute. See the doc page for +are stored as a global vector by this compute. See the page for :doc:`individual pair styles ` for info on these values. Output info @@ -84,7 +84,7 @@ The scalar and vector values calculated by this compute are The scalar value will be in energy :doc:`units `. The vector values will typically also be in energy :doc:`units `, but see -the doc page for the pair style for details. +the page for the pair style for details. Restrictions """""""""""" @@ -98,4 +98,4 @@ Related commands Default """"""" -The keyword defaults are *evalue* = *epair*\ , nsub = 0. +The keyword defaults are *evalue* = *epair*, nsub = 0. diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index e269aaadfe..f464c7cec6 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -20,7 +20,7 @@ Syntax *dist* = pairwise distance *eng* = pairwise energy *force* = pairwise force - *fx*\ ,\ *fy*\ ,\ *fz* = components of pairwise force + *fx*,\ *fy*,\ *fz* = components of pairwise force *pN* = pair style specific quantities for allowed N values * zero or more keyword/arg pairs may be appended @@ -61,20 +61,20 @@ The value *eng* is the interaction energy for the pair of atoms. The value *force* is the force acting between the pair of atoms, which is positive for a repulsive force and negative for an attractive -force. The values *fx*\ , *fy*\ , and *fz* are the xyz components of +force. The values *fx*, *fy*, and *fz* are the xyz components of *force* on atom I. A pair style may define additional pairwise quantities which can be -accessed as *p1* to *pN*\ , where N is defined by the pair style. Most +accessed as *p1* to *pN*, where N is defined by the pair style. Most pair styles do not define any additional quantities, so N = 0. An example of ones that do are the :doc:`granular pair styles ` which calculate the tangential force between two particles and return its components and magnitude acting on atom I for N = 1,2,3,4. See individual pair styles for details. -When using *pN* with pair style *hybrid*\ , the output will be the Nth +When using *pN* with pair style *hybrid*, the output will be the Nth quantity from the sub-style that computes the pairwise interaction -(based on atom types). If that sub-style does not define a *pN*\ , +(based on atom types). If that sub-style does not define a *pN*, the output will be 0.0. The maximum allowed N is the maximum number of quantities provided by any sub-style. @@ -90,12 +90,12 @@ is not computed for the specific pairwise interaction (based on atom types), then the output will be 0.0. The value *dist* will be in distance :doc:`units `. The value -*eng* will be in energy :doc:`units `. The values *force*\ , *fx*\ , -*fy*\ , and *fz* will be in force :doc:`units `. The values *pN* +*eng* will be in energy :doc:`units `. The values *force*, *fx*, +*fy*, and *fz* will be in force :doc:`units `. The values *pN* will be in whatever units the pair style defines. The optional *cutoff* keyword determines how the force cutoff distance -for an interaction is determined. For the default setting of *type*\ , +for an interaction is determined. For the default setting of *type*, the pairwise cutoff defined by the :doc:`pair_style ` command for the types of the two atoms is used. For the *radius* setting, the sum of the radii of the two particles is used as a @@ -147,12 +147,12 @@ array is the number of pairs. If a single keyword is specified, a local vector is produced. If two or more keywords are specified, a local array is produced where the number of columns = the number of keywords. The vector or array can be accessed by any command that -uses local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +uses local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The output for *dist* will be in distance :doc:`units `. The output for *eng* will be in energy :doc:`units `. The output for -*force*\ , *fx*\ , *fy*\ , and *fz* will be in force :doc:`units `. +*force*, *fx*, *fy*, and *fz* will be in force :doc:`units `. The output for *pN* will be in whatever units the pair style defines. Restrictions diff --git a/doc/src/compute_pe_atom.rst b/doc/src/compute_pe_atom.rst index 91aaaf867c..ab6db9c786 100644 --- a/doc/src/compute_pe_atom.rst +++ b/doc/src/compute_pe_atom.rst @@ -89,7 +89,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in energy :doc:`units `. diff --git a/doc/src/compute_plasticity_atom.rst b/doc/src/compute_plasticity_atom.rst index b78f706afd..6861dd7cfc 100644 --- a/doc/src/compute_plasticity_atom.rst +++ b/doc/src/compute_plasticity_atom.rst @@ -43,7 +43,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values are unitless numbers (lambda) >= 0.0. @@ -52,7 +52,7 @@ Restrictions """""""""""" This compute is part of the PERI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_pressure.rst b/doc/src/compute_pressure.rst index 3c98208261..6d76713b41 100644 --- a/doc/src/compute_pressure.rst +++ b/doc/src/compute_pressure.rst @@ -124,7 +124,7 @@ This compute calculates a global scalar (the pressure) and a global vector of length 6 (pressure tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or vector values from a compute as input. See the :doc:`Howto output -` doc page for an overview of LAMMPS output options. +` page for an overview of LAMMPS output options. The ordering of values in the symmetric pressure tensor is as follows: pxx, pyy, pzz, pxy, pxz, pyz. diff --git a/doc/src/compute_pressure_cylinder.rst b/doc/src/compute_pressure_cylinder.rst index cc94c339c8..a008254540 100644 --- a/doc/src/compute_pressure_cylinder.rst +++ b/doc/src/compute_pressure_cylinder.rst @@ -68,7 +68,7 @@ the configurational terms only; the kinetic contribution is not included and may be calculated from the number density output by P_kin=density\*k\*T. This compute is part of the EXTRA-COMPUTE package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_pressure_uef.rst b/doc/src/compute_pressure_uef.rst index 1e32c4d9b4..2e53961d00 100644 --- a/doc/src/compute_pressure_uef.rst +++ b/doc/src/compute_pressure_uef.rst @@ -42,7 +42,7 @@ Restrictions """""""""""" This fix is part of the UEF package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This command can only be used when :doc:`fix nvt/uef ` or :doc:`fix npt/uef ` is active. diff --git a/doc/src/compute_property_atom.rst b/doc/src/compute_property_atom.rst index 32cda56659..333f31d013 100644 --- a/doc/src/compute_property_atom.rst +++ b/doc/src/compute_property_atom.rst @@ -130,25 +130,25 @@ quantities that are not defined for a particular particle in the group The additional quantities only accessible via this command, and not directly via the :doc:`dump custom ` command, are as follows. -*Shapex*\ , *shapey*\ , and *shapez* are defined for ellipsoidal particles +*Shapex*, *shapey*, and *shapez* are defined for ellipsoidal particles and define the 3d shape of each particle. -*Quatw*\ , *quati*\ , *quatj*\ , and *quatk* are defined for ellipsoidal +*Quatw*, *quati*, *quatj*, and *quatk* are defined for ellipsoidal particles and body particles and store the 4-vector quaternion representing the orientation of each particle. See the :doc:`set ` command for an explanation of the quaternion vector. -*End1x*\ , *end1y*\ , *end1z*\ , *end2x*\ , *end2y*\ , *end2z*\ , are +*End1x*, *end1y*, *end1z*, *end2x*, *end2y*, *end2z*, are defined for line segment particles and define the end points of each line segment. -*Corner1x*\ , *corner1y*\ , *corner1z*\ , *corner2x*\ , *corner2y*\ , -*corner2z*\ , *corner3x*\ , *corner3y*\ , *corner3z*\ , are defined for +*Corner1x*, *corner1y*, *corner1z*, *corner2x*, *corner2y*, +*corner2z*, *corner3x*, *corner3y*, *corner3z*, are defined for triangular particles and define the corner points of each triangle. *Nbonds* is available for all molecular atom styles and refers to the number of explicit bonds assigned to an atom. Note that if the -:doc:`newton bond ` command is set to *on*\ , which is the +:doc:`newton bond ` command is set to *on*, which is the default, then every bond in the system is assigned to only one of the two atoms in the bond. Thus a bond between atoms I,J may be tallied for either atom I or atom J. If :doc:`newton bond off ` is @@ -169,7 +169,7 @@ per-atom vector is produced. If two or more inputs are specified, a per-atom array is produced where the number of columns = the number of inputs. The vector or array can be accessed by any command that uses per-atom values from a compute as input. See the :doc:`Howto output -` doc page for an overview of LAMMPS output options. +` page for an overview of LAMMPS output options. The vector or array values will be in whatever :doc:`units ` the corresponding attribute is in, e.g. velocity units for vx, charge diff --git a/doc/src/compute_property_chunk.rst b/doc/src/compute_property_chunk.rst index 246ab09120..48b3641e84 100644 --- a/doc/src/compute_property_chunk.rst +++ b/doc/src/compute_property_chunk.rst @@ -67,14 +67,14 @@ then be 415 for the third chunk. The *coordN* attributes can only be used if a *binning* style was used in the :doc:`compute chunk/atom ` command referenced -by chunkID. For *bin/1d*\ , *bin/2d*\ , and *bin/3d* styles the attribute +by chunkID. For *bin/1d*, *bin/2d*, and *bin/3d* styles the attribute is the center point of the bin in the corresponding dimension. Style *bin/1d* only defines a *coord1* attribute. Style *bin/2d* adds a *coord2* attribute. Style *bin/3d* adds a *coord3* attribute. -Note that if the value of the *units* keyword used in the :doc:`compute chunk/atom command ` is *box* or *lattice*\ , the +Note that if the value of the *units* keyword used in the :doc:`compute chunk/atom command ` is *box* or *lattice*, the *coordN* attributes will be in distance :doc:`units `. If the -value of the *units* keyword is *reduced*\ , the *coordN* attributes +value of the *units* keyword is *reduced*, the *coordN* attributes will be in unitless reduced units (0-1). The simplest way to output the results of the compute property/chunk @@ -102,7 +102,7 @@ single input is specified, a global vector is produced. If two or more inputs are specified, a global array is produced where the number of columns = the number of inputs. The vector or array can be accessed by any command that uses global values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector or array values are "intensive". The values will be diff --git a/doc/src/compute_property_local.rst b/doc/src/compute_property_local.rst index dd92334266..357f46b70d 100644 --- a/doc/src/compute_property_local.rst +++ b/doc/src/compute_property_local.rst @@ -72,17 +72,17 @@ property/local command. If the inputs are pair attributes, the local data is generated by looping over the pairwise neighbor list. Info about an individual pairwise interaction will only be included if both atoms in the pair -are in the specified compute group. For *natom1* and *natom2*\ , all +are in the specified compute group. For *natom1* and *natom2*, all atom pairs in the neighbor list are considered (out to the neighbor cutoff = force cutoff + :doc:`neighbor skin `). For *patom1* -and *patom2*\ , the distance between the atoms must be less than the +and *patom2*, the distance between the atoms must be less than the force cutoff distance for that pair to be included, as defined by the :doc:`pair_style ` and :doc:`pair_coeff ` commands. The optional *cutoff* keyword determines how the force cutoff distance for an interaction is determined for the *patom1* and *patom2* -attributes. For the default setting of *type*\ , the pairwise cutoff +attributes. For the default setting of *type*, the pairwise cutoff defined by the :doc:`pair_style ` command for the types of the two atoms is used. For the *radius* setting, the sum of the radii of the two particles is used as a cutoff. For example, this is @@ -113,10 +113,10 @@ same for local vectors or arrays generated by other compute commands. For example, output from the :doc:`compute bond/local ` command can be combined with bond atom indices from this command and output by the :doc:`dump local ` command in a consistent way. -The *natom1* and *natom2*\ , or *patom1* and *patom2* attributes refer +The *natom1* and *natom2*, or *patom1* and *patom2* attributes refer to the atom IDs of the 2 atoms in each pairwise interaction computed by the :doc:`pair_style ` command. The *ntype1* and -*ntype2*\ , or *ptype1* and *ptype2* attributes refer to the atom types +*ntype2*, or *ptype1* and *ptype2* attributes refer to the atom types of the 2 atoms in each pairwise interaction. .. note:: @@ -149,7 +149,7 @@ the array is the number of bonds, angles, etc. If a single input is specified, a local vector is produced. If two or more inputs are specified, a local array is produced where the number of columns = the number of inputs. The vector or array can be accessed by any command -that uses local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +that uses local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector or array values will be integers that correspond to the diff --git a/doc/src/compute_ptm_atom.rst b/doc/src/compute_ptm_atom.rst index e271131987..3e209d1dc5 100644 --- a/doc/src/compute_ptm_atom.rst +++ b/doc/src/compute_ptm_atom.rst @@ -89,7 +89,7 @@ Output info This compute calculates a per-atom array, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. Results are stored in the per-atom array in the following order: @@ -113,7 +113,7 @@ Restrictions """""""""""" This fix is part of the PTM package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_rdf.rst b/doc/src/compute_rdf.rst index a9e6674816..85366eab2a 100644 --- a/doc/src/compute_rdf.rst +++ b/doc/src/compute_rdf.rst @@ -55,7 +55,7 @@ shell of distances in 3d and a thin ring of distances in 2d. command, and means those pairwise interactions do not appear in the neighbor list. Because this fix uses a neighbor list, it also means those pairs will not be included in the RDF. This does not apply when - using long-range coulomb interactions (\ *coul/long*\ , *coul/msm*\ , + using long-range coulomb interactions (\ *coul/long*, *coul/msm*, *coul/wolf* or similar. One way to get around this would be to set special_bond scaling factors to very tiny numbers that are not exactly zero (e.g. 1.0e-50). Another workaround is to write a dump file, and @@ -94,7 +94,7 @@ The *itypeN* and *jtypeN* arguments are optional. These arguments must come in pairs. If no pairs are listed, then a single histogram is computed for g(r) between all atom types. If one or more pairs are listed, then a separate histogram is generated for each -*itype*\ ,\ *jtype* pair. +*itype*,\ *jtype* pair. The *itypeN* and *jtypeN* settings can be specified in one of two ways. An explicit numeric value can be used, as in the fourth example @@ -156,13 +156,13 @@ Output info """"""""""" This compute calculates a global array with the number of rows = -*Nbins*\ , and the number of columns = 1 + 2\*Npairs, where Npairs is the +*Nbins*, and the number of columns = 1 + 2\*Npairs, where Npairs is the number of I,J pairings specified. The first column has the bin coordinate (center of the bin), Each successive set of 2 columns has the g(r) and coord(r) values for a specific set of *itypeN* versus *jtypeN* interactions, as described above. These values can be used by any command that uses a global values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values calculated by this compute are all "intensive". @@ -186,7 +186,7 @@ your model. The definition of g(r) used by LAMMPS is only appropriate for characterizing atoms that are uniformly distributed throughout the simulation cell. In such cases, the coordination number is still correct and meaningful. As an example, if a large simulation cell -contains only one atom of type *itypeN* and one of *jtypeN*\ , then g(r) +contains only one atom of type *itypeN* and one of *jtypeN*, then g(r) will register an arbitrarily large spike at whatever distance they happen to be at, and zero everywhere else. Coord(r) will show a step change from zero to one at the location of the spike in g(r). diff --git a/doc/src/compute_reduce.rst b/doc/src/compute_reduce.rst index 660ef87042..1793830e0a 100644 --- a/doc/src/compute_reduce.rst +++ b/doc/src/compute_reduce.rst @@ -74,7 +74,7 @@ or *max* options find the minimum or maximum value across all vector values. The *ave* setting adds the vector values into a global total, then divides by the number of values in the vector. The *sumsq* option sums the square of the values in the vector into a global -total. The *avesq* setting does the same as *sumsq*\ , then divides the +total. The *avesq* setting does the same as *sumsq*, then divides the sum of squares by the number of values. The last two options can be useful for calculating the variance of some quantity, e.g. variance = sumsq - ave\^2. @@ -126,7 +126,7 @@ an input value from that compute. If a value begins with "c\_", a compute ID must follow which has been previously defined in the input script. Computes can generate per-atom or local quantities. See the individual -:doc:`compute ` doc page for details. If no bracketed integer +:doc:`compute ` page for details. If no bracketed integer is appended, the vector calculated by the compute is used. If a bracketed integer is appended, the Ith column of the array calculated by the compute is used. Users can also write code for their own @@ -136,7 +136,7 @@ to effectively specify multiple values. If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script. Fixes can generate per-atom -or local quantities. See the individual :doc:`fix ` doc page for +or local quantities. See the individual :doc:`fix ` page for details. Note that some fixes only produce their values on certain timesteps, which must be compatible with when compute reduce references the values, else an error results. If no bracketed integer diff --git a/doc/src/compute_reduce_chunk.rst b/doc/src/compute_reduce_chunk.rst index 342c6ceb05..256ff15920 100644 --- a/doc/src/compute_reduce_chunk.rst +++ b/doc/src/compute_reduce_chunk.rst @@ -169,7 +169,7 @@ in the array is the number of inputs provided. The length of the vector or the number of vector elements or array rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The vector or array can be accessed by any command that uses global values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom values for the vector or each column of the array will be diff --git a/doc/src/compute_rigid_local.rst b/doc/src/compute_rigid_local.rst index f7bb6d6166..574f3343be 100644 --- a/doc/src/compute_rigid_local.rst +++ b/doc/src/compute_rigid_local.rst @@ -61,7 +61,7 @@ command and its variants. The ID of the :doc:`fix rigid/small ` comm be specified as *rigidID*\ . The :doc:`fix rigid ` command is typically used to define a handful of (potentially very large) rigid bodies. It outputs similar per-body information as this command -directly from the fix as global data; see the :doc:`fix rigid ` doc page for details +directly from the fix as global data; see the :doc:`fix rigid ` page for details The local data stored by this command is generated by looping over all the atoms owned on a processor. If the atom is not in the specified @@ -107,43 +107,43 @@ rigid bodies. The *mass* attribute is the total mass of the rigid body. There are two options for outputting the coordinates of the center of -mass (COM) of the body. The *x*\ , *y*\ , *z* attributes write the COM +mass (COM) of the body. The *x*, *y*, *z* attributes write the COM "unscaled", in the appropriate distance :doc:`units ` (Angstroms, -sigma, etc). Use *xu*\ , *yu*\ , *zu* if you want the COM "unwrapped" by +sigma, etc). Use *xu*, *yu*, *zu* if you want the COM "unwrapped" by the image flags for each body. Unwrapped means that if the body COM has passed through a periodic boundary one or more times, the value is generated what the COM coordinate would be if it had not been wrapped back into the periodic box. -The image flags for the body can be generated directly using the *ix*\ , -*iy*\ , *iz* attributes. For periodic dimensions, they specify which +The image flags for the body can be generated directly using the *ix*, +*iy*, *iz* attributes. For periodic dimensions, they specify which image of the simulation box the COM is considered to be in. An image of 0 means it is inside the box as defined. A value of 2 means add 2 box lengths to get the true value. A value of -1 means subtract 1 box length to get the true value. LAMMPS updates these flags as the rigid body COMs cross periodic boundaries during the simulation. -The *vx*\ , *vy*\ , *vz*\ , *fx*\ , *fy*\ , *fz* attributes are components of +The *vx*, *vy*, *vz*, *fx*, *fy*, *fz* attributes are components of the COM velocity and force on the COM of the body. -The *omegax*\ , *omegay*\ , and *omegaz* attributes are the angular +The *omegax*, *omegay*, and *omegaz* attributes are the angular velocity components of the body around its COM. -The *angmomx*\ , *angmomy*\ , and *angmomz* attributes are the angular +The *angmomx*, *angmomy*, and *angmomz* attributes are the angular momentum components of the body around its COM. -The *quatw*\ , *quati*\ , *quatj*\ , and *quatk* attributes are the +The *quatw*, *quati*, *quatj*, and *quatk* attributes are the components of the 4-vector quaternion representing the orientation of the rigid body. See the :doc:`set ` command for an explanation of the quaternion vector. -The *angmomx*\ , *angmomy*\ , and *angmomz* attributes are the angular +The *angmomx*, *angmomy*, and *angmomz* attributes are the angular momentum components of the body around its COM. -The *tqx*\ , *tqy*\ , *tqz* attributes are components of the torque acting +The *tqx*, *tqy*, *tqz* attributes are components of the torque acting on the body around its COM. -The *inertiax*\ , *inertiay*\ , *inertiaz* attributes are components of +The *inertiax*, *inertiay*, *inertiaz* attributes are components of diagonalized inertia tensor for the body, i.e the 3 moments of inertia for the body around its principal axes, as computed internally by LAMMPS. @@ -160,7 +160,7 @@ specified, a local vector is produced. If two or more keywords are specified, a local array is produced where the number of columns = the number of keywords. The vector or array can be accessed by any command that uses local values from a compute as input. See the -:doc:`Howto output ` doc page for an overview of LAMMPS +:doc:`Howto output ` page for an overview of LAMMPS output options. The vector or array values will be in whatever :doc:`units ` the @@ -181,7 +181,7 @@ Restrictions """""""""""" This compute is part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_saed.rst b/doc/src/compute_saed.rst index 989fe63d3d..37ee302f8f 100644 --- a/doc/src/compute_saed.rst +++ b/doc/src/compute_saed.rst @@ -90,7 +90,7 @@ unless small spacing parameters <0.05 Angstrom\^(-1) are implemented. Meshes with manual spacing do not require a periodic boundary. The limits of the reciprocal lattice mesh are determined by the use of -the *Kmax*\ , *Zone*\ , and *dR_Ewald* parameters. The rectilinear mesh +the *Kmax*, *Zone*, and *dR_Ewald* parameters. The rectilinear mesh created about the origin of reciprocal space is terminated at the boundary of a sphere of radius *Kmax* centered at the origin. If *Zone* parameters z1=z2=z3=0 are used, diffraction intensities are @@ -246,7 +246,7 @@ Restrictions """""""""""" This compute is part of the DIFFRACTION package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The compute_saed command does not work for triclinic cells. diff --git a/doc/src/compute_slice.rst b/doc/src/compute_slice.rst index 2d558b871f..9b4e7df626 100644 --- a/doc/src/compute_slice.rst +++ b/doc/src/compute_slice.rst @@ -44,9 +44,9 @@ quantities; they cannot be per-atom or local quantities. group specified with this command is ignored. The values extracted from the input vector(s) are determined by the -*Nstart*\ , *Nstop*\ , and *Nskip* parameters. The elements of an input +*Nstart*, *Nstop*, and *Nskip* parameters. The elements of an input vector of length N are indexed from 1 to N. Starting at element -*Nstart*\ , every Mth element is extracted, where M = *Nskip*\ , until +*Nstart*, every Mth element is extracted, where M = *Nskip*, until element *Nstop* is reached. The extracted quantities are stored as a vector, which is typically shorter than the input vector. @@ -65,7 +65,7 @@ used. Users can also write code for their own compute styles and :doc:`add them If a value begins with "f\_", a fix ID must follow which has been previously defined in the input script and which generates a global -vector or array. See the individual :doc:`fix ` doc page for +vector or array. See the individual :doc:`fix ` page for details. Note that some fixes only produce their values on certain timesteps, which must be compatible with when compute slice references the values, else an error results. If no bracketed integer is @@ -97,7 +97,7 @@ specified or a global array with N columns where N is the number of inputs. The length of the vector or the number of rows in the array is equal to the number of values extracted from each input vector. These values can be used by any command that uses global vector or -array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector or array values calculated by this compute are simply diff --git a/doc/src/compute_smd_contact_radius.rst b/doc/src/compute_smd_contact_radius.rst index d310de826a..25f346625c 100644 --- a/doc/src/compute_smd_contact_radius.rst +++ b/doc/src/compute_smd_contact_radius.rst @@ -40,7 +40,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector values will be in distance :doc:`units `. @@ -49,7 +49,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_smd_damage.rst b/doc/src/compute_smd_damage.rst index e11fce1e9e..10070eaf0e 100644 --- a/doc/src/compute_smd_damage.rst +++ b/doc/src/compute_smd_damage.rst @@ -32,7 +32,7 @@ See `this PDF guide `_ to use Smooth Mach Dynamics This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values are dimensionless an in the range of zero to one. diff --git a/doc/src/compute_smd_hourglass_error.rst b/doc/src/compute_smd_hourglass_error.rst index c3664997f9..aee87592aa 100644 --- a/doc/src/compute_smd_hourglass_error.rst +++ b/doc/src/compute_smd_hourglass_error.rst @@ -41,7 +41,7 @@ Mach Dynamics in LAMMPS. This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector values will are dimensionless. See @@ -51,7 +51,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with tlsph pair style. diff --git a/doc/src/compute_smd_internal_energy.rst b/doc/src/compute_smd_internal_energy.rst index f596b0ce54..535384e38b 100644 --- a/doc/src/compute_smd_internal_energy.rst +++ b/doc/src/compute_smd_internal_energy.rst @@ -34,7 +34,7 @@ Output Info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector values will be given in :doc:`units ` of energy. @@ -43,7 +43,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact via the updated Lagrangian or total Lagrangian SPH pair styles. diff --git a/doc/src/compute_smd_plastic_strain.rst b/doc/src/compute_smd_plastic_strain.rst index 018b999716..17614df548 100644 --- a/doc/src/compute_smd_plastic_strain.rst +++ b/doc/src/compute_smd_plastic_strain.rst @@ -34,7 +34,7 @@ Mach Dynamics in LAMMPS. This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values will be given dimensionless. See :doc:`units `. @@ -43,7 +43,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact via the updated Lagrangian or total Lagrangian SPH pair styles. diff --git a/doc/src/compute_smd_plastic_strain_rate.rst b/doc/src/compute_smd_plastic_strain_rate.rst index 4edb7c2ae5..dc78b627ef 100644 --- a/doc/src/compute_smd_plastic_strain_rate.rst +++ b/doc/src/compute_smd_plastic_strain_rate.rst @@ -34,7 +34,7 @@ Mach Dynamics in LAMMPS. This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values will be given in :doc:`units ` of one over time. @@ -43,7 +43,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact via the updated Lagrangian or total Lagrangian SPH pair styles. diff --git a/doc/src/compute_smd_rho.rst b/doc/src/compute_smd_rho.rst index 672fe225f0..0adbc9db34 100644 --- a/doc/src/compute_smd_rho.rst +++ b/doc/src/compute_smd_rho.rst @@ -36,7 +36,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values will be in :doc:`units ` of mass over volume. @@ -45,7 +45,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_smd_tlsph_defgrad.rst b/doc/src/compute_smd_tlsph_defgrad.rst index a8c2e80a12..813bd32507 100644 --- a/doc/src/compute_smd_tlsph_defgrad.rst +++ b/doc/src/compute_smd_tlsph_defgrad.rst @@ -48,7 +48,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. TThis compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. TThis compute can only be used for particles which interact via the total Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_tlsph_dt.rst b/doc/src/compute_smd_tlsph_dt.rst index 6c6ad54187..44b2311898 100644 --- a/doc/src/compute_smd_tlsph_dt.rst +++ b/doc/src/compute_smd_tlsph_dt.rst @@ -40,7 +40,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values will be given in :doc:`units ` of time. @@ -49,7 +49,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles interacting with the Total-Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_tlsph_num_neighs.rst b/doc/src/compute_smd_tlsph_num_neighs.rst index 1a42373717..bc76ec260f 100644 --- a/doc/src/compute_smd_tlsph_num_neighs.rst +++ b/doc/src/compute_smd_tlsph_num_neighs.rst @@ -35,7 +35,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values are dimensionless. See :doc:`units `. @@ -44,7 +44,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with the Total-Lagrangian pair style. diff --git a/doc/src/compute_smd_tlsph_shape.rst b/doc/src/compute_smd_tlsph_shape.rst index 33bd02d894..aefedb64eb 100644 --- a/doc/src/compute_smd_tlsph_shape.rst +++ b/doc/src/compute_smd_tlsph_shape.rst @@ -36,7 +36,7 @@ Output info This compute calculates a per-particle vector of vectors, which can be accessed by any command that uses per-particle values from a compute -as input. See the :doc:`Howto output ` doc page for an +as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector has 7 entries. The first three entries @@ -51,7 +51,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with the Total-Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_tlsph_strain.rst b/doc/src/compute_smd_tlsph_strain.rst index a05dbab8d7..3ecb509e9f 100644 --- a/doc/src/compute_smd_tlsph_strain.rst +++ b/doc/src/compute_smd_tlsph_strain.rst @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with the Total-Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_tlsph_strain_rate.rst b/doc/src/compute_smd_tlsph_strain_rate.rst index f75db80d94..41251d7095 100644 --- a/doc/src/compute_smd_tlsph_strain_rate.rst +++ b/doc/src/compute_smd_tlsph_strain_rate.rst @@ -46,7 +46,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with Total-Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_tlsph_stress.rst b/doc/src/compute_smd_tlsph_stress.rst index 0a194bea3d..11cec3bda8 100644 --- a/doc/src/compute_smd_tlsph_stress.rst +++ b/doc/src/compute_smd_tlsph_stress.rst @@ -48,7 +48,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This quantity will be computed only for particles which interact with the Total-Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_triangle_vertices.rst b/doc/src/compute_smd_triangle_vertices.rst index 0f2f1cdd45..9f478b7262 100644 --- a/doc/src/compute_smd_triangle_vertices.rst +++ b/doc/src/compute_smd_triangle_vertices.rst @@ -34,7 +34,7 @@ Output info This compute returns a per-particle vector of vectors, which can be accessed by any command that uses per-particle values from a compute -as input. See the :doc:`Howto output ` doc page for an +as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector has nine entries, (x1/y1/z1), (x2/y2/z2), and @@ -54,7 +54,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_smd_ulsph_effm.rst b/doc/src/compute_smd_ulsph_effm.rst index 388969f4ae..4b4959fbe1 100644 --- a/doc/src/compute_smd_ulsph_effm.rst +++ b/doc/src/compute_smd_ulsph_effm.rst @@ -34,7 +34,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector contains the current effective per atom shear @@ -45,7 +45,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact with the updated Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_ulsph_num_neighs.rst b/doc/src/compute_smd_ulsph_num_neighs.rst index b356b8adaa..c446c477c0 100644 --- a/doc/src/compute_smd_ulsph_num_neighs.rst +++ b/doc/src/compute_smd_ulsph_num_neighs.rst @@ -35,7 +35,7 @@ Output info This compute returns a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle values will be given dimensionless, see :doc:`units `. @@ -44,7 +44,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact with the updated Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_ulsph_strain.rst b/doc/src/compute_smd_ulsph_strain.rst index 5a3617fd24..31defe4b32 100644 --- a/doc/src/compute_smd_ulsph_strain.rst +++ b/doc/src/compute_smd_ulsph_strain.rst @@ -34,7 +34,7 @@ Output info This compute calculates a per-particle tensor, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector has 6 entries, corresponding to the xx, yy, @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact with the updated Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_ulsph_strain_rate.rst b/doc/src/compute_smd_ulsph_strain_rate.rst index 4fe5d53936..0a2ca91081 100644 --- a/doc/src/compute_smd_ulsph_strain_rate.rst +++ b/doc/src/compute_smd_ulsph_strain_rate.rst @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact with the updated Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_ulsph_stress.rst b/doc/src/compute_smd_ulsph_stress.rst index 392b72e0fd..a993a08c06 100644 --- a/doc/src/compute_smd_ulsph_stress.rst +++ b/doc/src/compute_smd_ulsph_stress.rst @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. This compute can +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute can only be used for particles which interact with the updated Lagrangian SPH pair style. diff --git a/doc/src/compute_smd_vol.rst b/doc/src/compute_smd_vol.rst index 862ed15a3e..f09c48e0ed 100644 --- a/doc/src/compute_smd_vol.rst +++ b/doc/src/compute_smd_vol.rst @@ -34,7 +34,7 @@ Output info This compute calculates a per-particle vector, which can be accessed by any command that uses per-particle values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-particle vector values will be given in :doc:`units ` of @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_sna_atom.rst b/doc/src/compute_sna_atom.rst index 4165c4e47a..f156133521 100644 --- a/doc/src/compute_sna_atom.rst +++ b/doc/src/compute_sna_atom.rst @@ -161,7 +161,7 @@ components summed separately for each LAMMPS atom type: -\sum_{i' \in I} \frac{\partial {B^{i'}_{j_1,j_2,j} }}{\partial {\bf r}_i} -The sum is over all atoms *i'* of atom type *I*\ . For each atom *i*\ , +The sum is over all atoms *i'* of atom type *I*\ . For each atom *i*, this compute evaluates the above expression for each direction, each atom type, and each bispectrum component. See section below on output for a detailed explanation. @@ -174,12 +174,12 @@ derivatives: -{\bf r}_i \otimes \sum_{i' \in I} \frac{\partial {B^{i'}_{j_1,j_2,j}}}{\partial {\bf r}_i} Again, the sum is over all atoms *i'* of atom type *I*\ . For each atom -*i*\ , this compute evaluates the above expression for each of the six +*i*, this compute evaluates the above expression for each of the six virial components, each atom type, and each bispectrum component. See section below on output for a detailed explanation. Compute *snap* calculates a global array containing information related -to all three of the above per-atom computes *sna/atom*\ , *snad/atom*\ , +to all three of the above per-atom computes *sna/atom*, *snad/atom*, and *snav/atom*\ . The first row of the array contains the summation of *sna/atom* over all atoms, but broken out by type. The last six rows of the array contain the summation of *snav/atom* over all atoms, broken @@ -225,7 +225,7 @@ ordered in which they are listed. The keyword *switchflag* can be used to turn off the switching function :math:`f_c(r)`. -The keyword *bzeroflag* determines whether or not *B0*\ , the bispectrum +The keyword *bzeroflag* determines whether or not *B0*, the bispectrum components of an atom with no neighbors, are subtracted from the calculated bispectrum components. This optional keyword normally only affects compute *sna/atom*\ . However, when *quadraticflag* is on, it @@ -318,7 +318,7 @@ Output info Compute *sna/atom* calculates a per-atom array, each column corresponding to a particular bispectrum component. The total number of columns and the identity of the bispectrum component contained in each -column depend of the value of *twojmax*\ , as described by the following +column depend of the value of *twojmax*, as described by the following piece of python code: .. parsed-literal:: @@ -339,15 +339,15 @@ For even twojmax = 2(*m*\ -1), :math:`K = m(m+1)(2m+1)/6`, the *m*\ -th pyramida Compute *snad/atom* evaluates a per-atom array. The columns are arranged into *ntypes* blocks, listed in order of atom type *I*\ . Each block -contains three sub-blocks corresponding to the *x*\ , *y*\ , and *z* +contains three sub-blocks corresponding to the *x*, *y*, and *z* components of the atom position. Each of these sub-blocks contains *K* columns for the *K* bispectrum components, the same as for compute *sna/atom* Compute *snav/atom* evaluates a per-atom array. The columns are arranged into *ntypes* blocks, listed in order of atom type *I*\ . Each block -contains six sub-blocks corresponding to the *xx*\ , *yy*\ , *zz*\ , -*yz*\ , *xz*\ , and *xy* components of the virial tensor in Voigt +contains six sub-blocks corresponding to the *xx*, *yy*, *zz*, +*yz*, *xz*, and *xy* components of the virial tensor in Voigt notation. Each of these sub-blocks contains *K* columns for the *K* bispectrum components, the same as for compute *sna/atom* @@ -363,7 +363,7 @@ appear in the following order: * 6 rows: *snav/atom* quantities summed for all atoms of type *I* For example, if *K* =30 and ntypes=1, the number of columns in the -per-atom arrays generated by *sna/atom*\ , *snad/atom*\ , and +per-atom arrays generated by *sna/atom*, *snad/atom*, and *snav/atom* are 30, 90, and 180, respectively. With *quadratic* value=1, the numbers of columns are 930, 2790, and 5580, respectively. The number of columns in the global array generated by *snap* are 31, and @@ -372,11 +372,11 @@ is the total number of atoms. If the *quadratic* keyword value is set to 1, then additional columns are generated, corresponding to the products of all distinct pairs of -bispectrum components. If the number of bispectrum components is *K*\ , +bispectrum components. If the number of bispectrum components is *K*, then the number of distinct pairs is *K*\ (\ *K*\ +1)/2. For compute *sna/atom* these columns are appended to existing *K* columns. The ordering of quadratic terms is upper-triangular, (1,1),(1,2)...(1,\ *K*\ -),(2,1)...(\ *K*\ -1,\ *K*\ -1),(\ *K*\ -1,\ *K*\ ),(\ *K*\ ,\ *K*\ ). +),(2,1)...(\ *K*\ -1,\ *K*\ -1),(\ *K*\ -1,\ *K*\ ),(\ *K*,\ *K*\ ). For computes *snad/atom* and *snav/atom* each set of *K*\ (\ *K*\ +1)/2 additional columns is inserted directly after each of sub-block of linear terms i.e. linear and quadratic terms are contiguous. So the @@ -402,7 +402,7 @@ Restrictions These computes are part of the ML-SNAP package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_sph_e_atom.rst b/doc/src/compute_sph_e_atom.rst index a0410825aa..5e6706fa27 100644 --- a/doc/src/compute_sph_e_atom.rst +++ b/doc/src/compute_sph_e_atom.rst @@ -41,7 +41,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in energy :doc:`units `. @@ -50,7 +50,7 @@ Restrictions """""""""""" This compute is part of the SPH package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_sph_rho_atom.rst b/doc/src/compute_sph_rho_atom.rst index a7aad3c6fa..7fcec0c9da 100644 --- a/doc/src/compute_sph_rho_atom.rst +++ b/doc/src/compute_sph_rho_atom.rst @@ -40,7 +40,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in mass/volume :doc:`units `. @@ -49,7 +49,7 @@ Restrictions """""""""""" This compute is part of the SPH package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_sph_t_atom.rst b/doc/src/compute_sph_t_atom.rst index d09a20c963..702d81027d 100644 --- a/doc/src/compute_sph_t_atom.rst +++ b/doc/src/compute_sph_t_atom.rst @@ -45,7 +45,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See -the :doc:`Howto output ` doc page for an overview of +the :doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in temperature :doc:`units `. @@ -54,7 +54,7 @@ Restrictions """""""""""" This compute is part of the SPH package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_spin.rst b/doc/src/compute_spin.rst index aaf9d8cc74..6694da000b 100644 --- a/doc/src/compute_spin.rst +++ b/doc/src/compute_spin.rst @@ -65,7 +65,7 @@ Restrictions """""""""""" The *spin* compute is part of the SPIN package. This compute is only -enabled if LAMMPS was built with this package. See the :doc:`Build package ` doc page for more info. The atom_style +enabled if LAMMPS was built with this package. See the :doc:`Build package ` page for more info. The atom_style has to be "spin" for this compute to be valid. **Related commands:** diff --git a/doc/src/compute_stress_atom.rst b/doc/src/compute_stress_atom.rst index 0f90f9bafe..cdb464a9d0 100644 --- a/doc/src/compute_stress_atom.rst +++ b/doc/src/compute_stress_atom.rst @@ -213,7 +213,7 @@ which can be accessed by indices 1-6 by any command that uses per-atom values from a compute as input. Compute *centroid/stress/atom* produces a per-atom array with 9 columns, but otherwise can be used in an identical manner to compute *stress/atom*. See the :doc:`Howto -output ` doc page for an overview of LAMMPS output +output ` page for an overview of LAMMPS output options. The ordering of the 6 columns for *stress/atom* is as follows: xx, yy, diff --git a/doc/src/compute_stress_mop.rst b/doc/src/compute_stress_mop.rst index f02d279414..bcc1a87e5f 100644 --- a/doc/src/compute_stress_mop.rst +++ b/doc/src/compute_stress_mop.rst @@ -45,8 +45,8 @@ Description Compute *stress/mop* and compute *stress/mop/profile* define computations that calculate components of the local stress tensor using the method of planes :ref:`(Todd) `. Specifically in compute *stress/mop* calculates 3 -components are computed in directions *dir*\ ,\ *x*\ ; *dir*\ ,\ *y*\ ; and -*dir*\ ,\ *z*\ ; where *dir* is the direction normal to the plane, while +components are computed in directions *dir*,\ *x*\ ; *dir*,\ *y*\ ; and +*dir*,\ *z*\ ; where *dir* is the direction normal to the plane, while in compute *stress/mop/profile* the profile of the stress is computed. Contrary to methods based on histograms of atomic stress (i.e. using diff --git a/doc/src/compute_tally.rst b/doc/src/compute_tally.rst index 8aca53bb3c..313b54645c 100644 --- a/doc/src/compute_tally.rst +++ b/doc/src/compute_tally.rst @@ -54,7 +54,7 @@ Except for *heat/flux/virial/tally*, the two groups can be the same. This is similar to :doc:`compute group/group ` only that the data is accumulated directly during the non-bonded force computation. The -computes *force/tally*\ , *pe/tally*\ , *stress/tally*\ , and +computes *force/tally*, *pe/tally*, *stress/tally*, and *heat/flux/tally* are primarily provided as example how to program additional, more sophisticated computes using the tally callback mechanism. Compute *pe/mol/tally* is one such style, that can @@ -180,7 +180,7 @@ Restrictions """""""""""" This compute is part of the TALLY package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Not all pair styles can be evaluated in a pairwise mode as required by this compute. For example, 3-body and other many-body potentials, diff --git a/doc/src/compute_tdpd_cc_atom.rst b/doc/src/compute_tdpd_cc_atom.rst index 4c32fc448c..d12cca7591 100644 --- a/doc/src/compute_tdpd_cc_atom.rst +++ b/doc/src/compute_tdpd_cc_atom.rst @@ -37,7 +37,7 @@ Output info This compute calculates a per-atom vector, which can be accessed by any command that uses per-atom values from a compute as input. See the -:doc:`Howto output ` doc page for an overview of LAMMPS +:doc:`Howto output ` page for an overview of LAMMPS output options. The per-atom vector values will be in the units of chemical species @@ -47,7 +47,7 @@ Restrictions """""""""""" This compute is part of the DPD-MESO package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_temp.rst b/doc/src/compute_temp.rst index a82046367e..3163de2272 100644 --- a/doc/src/compute_temp.rst +++ b/doc/src/compute_temp.rst @@ -63,7 +63,7 @@ LAMMPS starts up, as if this command were in the input script: See the "thermo_style" command for more details. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -79,7 +79,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_asphere.rst b/doc/src/compute_temp_asphere.rst index ef04cad327..815a42f76c 100644 --- a/doc/src/compute_temp_asphere.rst +++ b/doc/src/compute_temp_asphere.rst @@ -99,7 +99,7 @@ computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -129,7 +129,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The @@ -142,7 +142,7 @@ Restrictions """""""""""" This compute is part of the ASPHERE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute requires that atoms store angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/compute_temp_body.rst b/doc/src/compute_temp_body.rst index f334c1e11b..72d74d0c4a 100644 --- a/doc/src/compute_temp_body.rst +++ b/doc/src/compute_temp_body.rst @@ -79,7 +79,7 @@ computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -109,7 +109,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The @@ -122,7 +122,7 @@ Restrictions """""""""""" This compute is part of the BODY package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This compute requires that atoms store angular momentum and a quaternion as defined by the :doc:`atom_style body ` diff --git a/doc/src/compute_temp_chunk.rst b/doc/src/compute_temp_chunk.rst index f1c34b42fa..1bd5ecbb40 100644 --- a/doc/src/compute_temp_chunk.rst +++ b/doc/src/compute_temp_chunk.rst @@ -172,7 +172,7 @@ allows calculation of the global or per-chunk temperature using only the thermal temperature of atoms in each chunk after the translational kinetic energy components have been altered in a prescribed way, e.g. to remove a velocity profile. It also applies to the calculation -of the other per-chunk values, such as *kecom* or *internal*\ , which +of the other per-chunk values, such as *kecom* or *internal*, which involve the center-of-mass velocity of each chunk, which is calculated after the velocity bias is removed from each atom. Note that the temperature compute will apply its bias globally to the entire system, @@ -207,7 +207,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. This compute also optionally calculates a global array, if one or more diff --git a/doc/src/compute_temp_com.rst b/doc/src/compute_temp_com.rst index 07ae9ad648..d233029ea0 100644 --- a/doc/src/compute_temp_com.rst +++ b/doc/src/compute_temp_com.rst @@ -63,7 +63,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -73,7 +73,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_cs.rst b/doc/src/compute_temp_cs.rst index 6b9f0a7e83..8a7fd0a3a5 100644 --- a/doc/src/compute_temp_cs.rst +++ b/doc/src/compute_temp_cs.rst @@ -30,7 +30,7 @@ Define a computation that calculates the temperature of a system based on the center-of-mass velocity of atom pairs that are bonded to each other. This compute is designed to be used with the adiabatic core/shell model of :ref:`(Mitchell and Finchham) `. See -the :doc:`Howto coreshell ` doc page for an overview of +the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. Specifically, this compute enables correct temperature calculation and thermostatting of core/shell pairs where it is desirable for the internal degrees of @@ -81,7 +81,7 @@ Thermostatting fixes that work in this way include :doc:`fix nvt `, :doc The internal energy of core/shell pairs can be calculated by the :doc:`compute temp/chunk ` command, if chunks are -defined as core/shell pairs. See the :doc:`Howto coreshell ` doc page doc page for more discussion +defined as core/shell pairs. See the :doc:`Howto coreshell ` page doc page for more discussion on how to do this. Output info diff --git a/doc/src/compute_temp_deform.rst b/doc/src/compute_temp_deform.rst index 026064000c..bc4d1ae3f3 100644 --- a/doc/src/compute_temp_deform.rst +++ b/doc/src/compute_temp_deform.rst @@ -104,7 +104,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -114,7 +114,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_deform_eff.rst b/doc/src/compute_temp_deform_eff.rst index bff5fb3bfb..b03aa00702 100644 --- a/doc/src/compute_temp_deform_eff.rst +++ b/doc/src/compute_temp_deform_eff.rst @@ -49,7 +49,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The @@ -62,7 +62,7 @@ Restrictions """""""""""" This compute is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_temp_drude.rst b/doc/src/compute_temp_drude.rst index 7b92198cb9..c2a0479cae 100644 --- a/doc/src/compute_temp_drude.rst +++ b/doc/src/compute_temp_drude.rst @@ -60,7 +60,7 @@ are 6. kinetic energy of the dipoles (energy units) These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. Both the scalar value and the first two values of the vector diff --git a/doc/src/compute_temp_eff.rst b/doc/src/compute_temp_eff.rst index 7bd0559090..ba139dd547 100644 --- a/doc/src/compute_temp_eff.rst +++ b/doc/src/compute_temp_eff.rst @@ -74,7 +74,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -90,7 +90,7 @@ Restrictions """""""""""" This compute is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_temp_partial.rst b/doc/src/compute_temp_partial.rst index fc3bfc5c88..471f3bcfd4 100644 --- a/doc/src/compute_temp_partial.rst +++ b/doc/src/compute_temp_partial.rst @@ -63,7 +63,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -79,7 +79,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_profile.rst b/doc/src/compute_temp_profile.rst index 0fa8ce5807..b70206781f 100644 --- a/doc/src/compute_temp_profile.rst +++ b/doc/src/compute_temp_profile.rst @@ -54,14 +54,14 @@ flow, e.g. via a profile-unbiased thermostat (PUT) as described in that computes a temperature, e.g. :doc:`thermo_modify `, :doc:`fix temp/rescale `, :doc:`fix npt `, etc. -The *xflag*\ , *yflag*\ , *zflag* settings determine which components of +The *xflag*, *yflag*, *zflag* settings determine which components of average velocity are subtracted out. -The *binstyle* setting and its *Nx*\ , *Ny*\ , *Nz* arguments determine +The *binstyle* setting and its *Nx*, *Ny*, *Nz* arguments determine how bins are setup to perform spatial averaging. "Bins" can be 1d slabs, 2d pencils, or 3d bricks depending on which *binstyle* is used. The simulation box is partitioned conceptually into *Nx* by *Ny* by -*Nz* bins. Depending on the *binstyle*\ , you may only specify one or +*Nz* bins. Depending on the *binstyle*, you may only specify one or two of these values; the others are effectively set to 1 (no binning in that dimension). For non-orthogonal (triclinic) simulation boxes, the bins are "tilted" slabs or pencils or bricks that are parallel to @@ -122,13 +122,13 @@ needed, the subtracted degrees-of-freedom can be altered using the .. note:: - When using the *out* keyword with a value of *bin*\ , the + When using the *out* keyword with a value of *bin*, the calculated temperature for each bin does not include the degrees-of-freedom adjustment described in the preceding paragraph, for fixes that constrain molecular motion. It does include the adjustment due to the *extra* option, which is applied to each bin. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. Using this compute in conjunction with a thermostatting fix, as explained there, will effectively implement a @@ -139,7 +139,7 @@ Output info This compute calculates a global scalar (the temperature). Depending on the setting of the *out* keyword, it also calculates a global -vector or array. For *out* = *tensor*\ , it calculates a vector of +vector or array. For *out* = *tensor*, it calculates a vector of length 6 (KE tensor), which can be accessed by indices 1-6. For *out* = *bin* it calculates a global array which has 2 columns and N rows, where N is the number of bins. The first column contains the number @@ -152,7 +152,7 @@ indices ix,iy,iz = 2,3,4 would map to row M = (iz-1)\*10\*10 + (iy-1)\*10 indices are numbered from 1 to 10 in each dimension. These values can be used by any command that uses global scalar or -vector or array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector or array values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_ramp.rst b/doc/src/compute_temp_ramp.rst index 078ac66002..9cda8bef30 100644 --- a/doc/src/compute_temp_ramp.rst +++ b/doc/src/compute_temp_ramp.rst @@ -84,7 +84,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -94,7 +94,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_region.rst b/doc/src/compute_temp_region.rst index 5bf80c8f09..86ae03be9b 100644 --- a/doc/src/compute_temp_region.rst +++ b/doc/src/compute_temp_region.rst @@ -77,7 +77,7 @@ If needed the number of subtracted degrees-of-freedom can be set explicitly using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -87,7 +87,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_region_eff.rst b/doc/src/compute_temp_region_eff.rst index 84baf00aaa..d6623ec02d 100644 --- a/doc/src/compute_temp_region_eff.rst +++ b/doc/src/compute_temp_region_eff.rst @@ -41,7 +41,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The @@ -54,7 +54,7 @@ Restrictions """""""""""" This compute is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_temp_rotate.rst b/doc/src/compute_temp_rotate.rst index b4adea43bf..a0e2cb14ac 100644 --- a/doc/src/compute_temp_rotate.rst +++ b/doc/src/compute_temp_rotate.rst @@ -62,7 +62,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -72,7 +72,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The @@ -85,7 +85,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_temp_sphere.rst b/doc/src/compute_temp_sphere.rst index b39bad80c0..b752719741 100644 --- a/doc/src/compute_temp_sphere.rst +++ b/doc/src/compute_temp_sphere.rst @@ -86,7 +86,7 @@ computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -116,7 +116,7 @@ Output info This compute calculates a global scalar (the temperature) and a global vector of length 6 (KE tensor), which can be accessed by indices 1-6. These values can be used by any command that uses global scalar or -vector values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +vector values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The diff --git a/doc/src/compute_temp_uef.rst b/doc/src/compute_temp_uef.rst index 18fc4a9fdf..782b5b9acb 100644 --- a/doc/src/compute_temp_uef.rst +++ b/doc/src/compute_temp_uef.rst @@ -39,7 +39,7 @@ Restrictions """""""""""" This fix is part of the UEF package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This command can only be used when :doc:`fix nvt/uef ` or :doc:`fix npt/uef ` is active. diff --git a/doc/src/compute_ti.rst b/doc/src/compute_ti.rst index 4a2f9cca21..e377042dcf 100644 --- a/doc/src/compute_ti.rst +++ b/doc/src/compute_ti.rst @@ -42,7 +42,7 @@ Description """"""""""" Define a computation that calculates the derivative of the interaction -potential with respect to *lambda*\ , the coupling parameter used in a +potential with respect to *lambda*, the coupling parameter used in a thermodynamic integration. This derivative can be used to infer a free energy difference resulting from an alchemical simulation, as described in :ref:`Eike `. @@ -128,8 +128,8 @@ The scalar value will be in energy :doc:`units `. Restrictions """""""""""" -This compute is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +This compute is part of the EXTRA-COMPUTE package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/compute_vcm_chunk.rst b/doc/src/compute_vcm_chunk.rst index fd874998ab..190947b087 100644 --- a/doc/src/compute_vcm_chunk.rst +++ b/doc/src/compute_vcm_chunk.rst @@ -64,7 +64,7 @@ This compute calculates a global array where the number of rows = the number of chunks *Nchunk* as calculated by the specified :doc:`compute chunk/atom ` command. The number of columns = 3 for the x,y,z center-of-mass velocity coordinates of each chunk. These values can be accessed by any command that uses global array -values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The array values are "intensive". The array values will be in diff --git a/doc/src/compute_viscosity_cos.rst b/doc/src/compute_viscosity_cos.rst index 880b1ff3d3..d08217a590 100644 --- a/doc/src/compute_viscosity_cos.rst +++ b/doc/src/compute_viscosity_cos.rst @@ -108,7 +108,7 @@ atoms that include these constraints will be computed correctly. If needed, the subtracted degrees-of-freedom can be altered using the *extra* option of the :doc:`compute_modify ` command. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -124,7 +124,7 @@ and the 7-th is the cosine-shaped velocity amplitude :math:`V`, which can be used to calculate the reciprocal viscosity, as shown in the example. These values can be used by any command that uses global scalar or vector values from a compute as input. -See the :doc:`Howto output ` doc page for an overview of LAMMPS output options. +See the :doc:`Howto output ` page for an overview of LAMMPS output options. The scalar value calculated by this compute is "intensive". The first 6 elements of vector values are "extensive", diff --git a/doc/src/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst index 8998115841..a84590ff02 100644 --- a/doc/src/compute_voronoi_atom.rst +++ b/doc/src/compute_voronoi_atom.rst @@ -134,7 +134,7 @@ Voronoi cell. The 3 columns are the atom ID of the atom that owns the cell, the atom ID of the atom in the neighboring cell (or zero if the face is external), and the area of the face. The array can be accessed by any command that uses local values from a compute as -input. See the :doc:`Howto output ` doc page for an +input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. More specifically, the array can be accessed by a :doc:`dump local ` command to write a file containing all the Voronoi neighbors in a system: @@ -196,7 +196,7 @@ columns. In regular dynamic tessellation mode the first column is the Voronoi volume, the second is the neighbor count, as described above (read above for the output data in case the *occupation* keyword is specified). These values can be accessed by any command that uses -per-atom values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +per-atom values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. If the *peratom* keyword is set to "no", the per-atom array is still created, but it is not accessible. @@ -216,7 +216,7 @@ Voronoi cell. quantity. This effect can be eliminated by using the *peratom* keyword to turn off the production of the per-atom quantities. For the default value *yes* both quantities are produced. For the value - *no*\ , only the local array is produced. + *no*, only the local array is produced. The Voronoi cell volume will be in distance :doc:`units ` cubed. The Voronoi face area will be in distance :doc:`units ` squared. @@ -225,7 +225,7 @@ Restrictions """""""""""" This compute is part of the VORONOI package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. It also requires you have a copy of the Voro++ library built and installed on your system. See instructions on obtaining and diff --git a/doc/src/compute_xrd.rst b/doc/src/compute_xrd.rst index a0684109ea..480bee6150 100644 --- a/doc/src/compute_xrd.rst +++ b/doc/src/compute_xrd.rst @@ -224,7 +224,7 @@ Restrictions """""""""""" This compute is part of the DIFFRACTION package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The compute_xrd command does not work for triclinic cells. diff --git a/doc/src/create_atoms.rst b/doc/src/create_atoms.rst index 26da54573a..d10498baf2 100644 --- a/doc/src/create_atoms.rst +++ b/doc/src/create_atoms.rst @@ -80,7 +80,7 @@ with units = box or the *random* style. For the remainder of this doc page, a created atom or molecule is referred to as a "particle". If created particles are individual atoms, they are assigned the -specified atom *type*\ , though this can be altered via the *basis* +specified atom *type*, though this can be altered via the *basis* keyword as discussed below. If molecules are being created, the type of each atom in the created molecule is specified in the file read by the :doc:`molecule ` command, and those values are added to @@ -116,7 +116,7 @@ positions. For the *random* style, N particles are added to the system at randomly generated coordinates, which can be useful for generating an amorphous system. The particles are created one by one using the -specified random number *seed*\ , resulting in the same set of particles +specified random number *seed*, resulting in the same set of particles coordinates, independent of how many processors are being used in the simulation. If the *region-ID* argument is specified as NULL, then the created particles will be anywhere in the simulation box. If a @@ -159,7 +159,7 @@ used to remove overlapping atoms or molecules. However, you can first use the :doc:`change_box ` command to temporarily expand the box, then add atoms via create_atoms, then finally use change_box command again if needed to re-shrink-wrap the - new atoms. See the :doc:`change_box ` doc page for an + new atoms. See the :doc:`change_box ` page for an example of how to do this, using the create_atoms *single* style to insert a new atom outside the current simulation box. @@ -227,9 +227,9 @@ fashion. Which lattice sites are selected will change with the number of processors used. The *remap* keyword only applies to the *single* style. If it is set -to *yes*\ , then if the specified position is outside the simulation +to *yes*, then if the specified position is outside the simulation box, it will mapped back into the box, assuming the relevant -dimensions are periodic. If it is set to *no*\ , no remapping is done +dimensions are periodic. If it is set to *no*, no remapping is done and no particle is created if its position is outside the box. The *var* and *set* keywords can be used together to provide a @@ -288,7 +288,7 @@ determined by the rotation vector (Rx,Ry,Rz) that goes through the insertion point. The specified *theta* determines the angle of rotation around that axis. Note that the direction of rotation for the atoms around the rotation axis is consistent with the right-hand -rule: if your right-hand's thumb points along *R*\ , then your fingers +rule: if your right-hand's thumb points along *R*, then your fingers wrap around the axis in the direction of rotation. The *units* keyword determines the meaning of the distance units used diff --git a/doc/src/create_bonds.rst b/doc/src/create_bonds.rst index 056b60c7aa..664d870cb0 100644 --- a/doc/src/create_bonds.rst +++ b/doc/src/create_bonds.rst @@ -105,7 +105,7 @@ data file for a complex system of molecules. The *many* style will create bonds between pairs of atoms I,J where I is in one of the two specified groups, and J is in the other. The two groups can be the same, e.g. group "all". The created bonds will be -of bond type *btype*\ , where *btype* must be a value between 1 and the +of bond type *btype*, where *btype* must be a value between 1 and the number of bond types defined. For a bond to be created, an I,J pair of atoms must be a distance D @@ -156,7 +156,7 @@ two atoms with IDs *batom1* and *batom2*\ . *Btype* must be a value between 1 and the number of bond types defined. The *single/angle* style creates a single angle of type *atype* -between three atoms with IDs *aatom1*\ , *aatom2*\ , and *aatom3*\ . The +between three atoms with IDs *aatom1*, *aatom2*, and *aatom3*\ . The ordering of the atoms is the same as in the *Angles* section of a data file read by the :doc:`read_data ` command. I.e. the 3 atoms are ordered linearly within the angle; the central atom is *aatom2*\ . @@ -164,14 +164,14 @@ ordered linearly within the angle; the central atom is *aatom2*\ . defined. The *single/dihedral* style creates a single dihedral of type *dtype* -between four atoms with IDs *datom1*\ , *datom2*\ , *datom3*\ , and *datom4*\ . The +between four atoms with IDs *datom1*, *datom2*, *datom3*, and *datom4*\ . The ordering of the atoms is the same as in the *Dihedrals* section of a data file read by the :doc:`read_data ` command. I.e. the 4 atoms are ordered linearly within the dihedral. *dtype* must be a value between 1 and the number of dihedral types defined. The *single/improper* style creates a single improper of type *itype* -between four atoms with IDs *iatom1*\ , *iatom2*\ , *iatom3*\ , and *iatom4*\ . The +between four atoms with IDs *iatom1*, *iatom2*, *iatom3*, and *iatom4*\ . The ordering of the atoms is the same as in the *Impropers* section of a data file read by the :doc:`read_data ` command. I.e. the 4 atoms are ordered linearly within the improper. *itype* must be a value between 1 and diff --git a/doc/src/create_box.rst b/doc/src/create_box.rst index 9b7b5a1a65..aa01be43cd 100644 --- a/doc/src/create_box.rst +++ b/doc/src/create_box.rst @@ -49,11 +49,11 @@ changed by the :doc:`balance ` or :doc:`fix balance ` comm The argument N is the number of atom types that will be used in the simulation. -If the region is not of style *prism*\ , then LAMMPS encloses the region +If the region is not of style *prism*, then LAMMPS encloses the region (block, sphere, etc) with an axis-aligned orthogonal bounding box which becomes the simulation domain. -If the region is of style *prism*\ , LAMMPS creates a non-orthogonal +If the region is of style *prism*, LAMMPS creates a non-orthogonal simulation domain shaped as a parallelepiped with triclinic symmetry. As defined by the :doc:`region prism ` command, the parallelepiped has its "origin" at (xlo,ylo,zlo) and is defined by 3 @@ -76,7 +76,7 @@ factors that exceed these limits, you can use the :doc:`box tilt ` command, with a setting of *large*\ ; a setting of *small* is the default. -See the :doc:`Howto triclinic ` doc page for a +See the :doc:`Howto triclinic ` page for a geometric description of triclinic boxes, as defined by LAMMPS, and how to transform these parameters to and from other commonly used triclinic representations. diff --git a/doc/src/delete_atoms.rst b/doc/src/delete_atoms.rst index 127518535f..d47743071b 100644 --- a/doc/src/delete_atoms.rst +++ b/doc/src/delete_atoms.rst @@ -52,9 +52,9 @@ Delete the specified atoms. This command can be used to carve out voids from a block of material or to delete created atoms that are too close to each other (e.g. at a grain boundary). -For style *group*\ , all atoms belonging to the group are deleted. +For style *group*, all atoms belonging to the group are deleted. -For style *region*\ , all atoms in the region volume are deleted. +For style *region*, all atoms in the region volume are deleted. Additional atoms can be deleted if they are in a molecule for which one or more atoms were deleted within the region; see the *mol* keyword discussion below. @@ -83,7 +83,7 @@ randomly. There is no guarantee that the exact fraction of atoms will be deleted, or that the same atoms will be deleted when running on different numbers of processors. -If the *compress* keyword is set to *yes*\ , then after atoms are +If the *compress* keyword is set to *yes*, then after atoms are deleted, then atom IDs are re-assigned so that they run from 1 to the number of atoms in the system. Note that this is not done for molecular systems (see the :doc:`atom_style ` command), @@ -117,7 +117,7 @@ atoms. Note that simply deleting interactions due to dangling bonds (e.g. at a surface) may result in a inaccurate or invalid model for the remaining atoms. -It the *mol* keyword is set to *yes*\ , then for every atom that is +It the *mol* keyword is set to *yes*, then for every atom that is deleted, all other atoms in the same molecule (with the same molecule ID) will also be deleted. This is not done for atoms with molecule ID = 0, since such an ID is assumed to flag isolated atoms that are not diff --git a/doc/src/delete_bonds.rst b/doc/src/delete_bonds.rst index ffb06e55b2..5603214b2f 100644 --- a/doc/src/delete_bonds.rst +++ b/doc/src/delete_bonds.rst @@ -52,7 +52,7 @@ For all styles, by default, an interaction is only turned off (or on) if all the atoms involved are in the specified group. See the *any* keyword to change the behavior. -Several of the styles (\ *atom*\ , *bond*\ , *angle*\ , *dihedral*\ , +Several of the styles (\ *atom*, *bond*, *angle*, *dihedral*, *improper*\ ) take a *type* as an argument. The specified *type* should be an integer from 0 to N, where N is the number of relevant types (atom types, bond types, etc). A value of 0 is only relevant for @@ -73,11 +73,11 @@ Style *atom* is the same as style *multi* except that in addition, one or more of the atoms involved in the bond, angle, dihedral, or improper interaction must also be of the specified atom type. -For style *bond*\ , only bonds are candidates for turn-off, and the bond -must also be of the specified type. Styles *angle*\ , *dihedral*\ , and +For style *bond*, only bonds are candidates for turn-off, and the bond +must also be of the specified type. Styles *angle*, *dihedral*, and *improper* are treated similarly. -For style *bond*\ , you can set the type to 0 to delete bonds that have +For style *bond*, you can set the type to 0 to delete bonds that have been previously broken by a bond-breaking potential (which sets the bond type to 0 when a bond is broken); e.g. see the :doc:`bond_style quartic ` command. @@ -108,7 +108,7 @@ keyword is used). The *undo* keyword inverts the delete_bonds command so that the specified bonds, angles, etc are turned on if they are currently turned off. This means a negative value is toggled to positive. For -example, for style *angle*\ , if *type* is specified as 2, then all +example, for style *angle*, if *type* is specified as 2, then all angles with current type = -2, are reset to type = 2. Note that the :doc:`fix shake ` command also sets bond and angle types negative, so this option should not be used on those interactions. diff --git a/doc/src/dihedral_charmm.rst b/doc/src/dihedral_charmm.rst index 9588cf8272..cc792693a2 100644 --- a/doc/src/dihedral_charmm.rst +++ b/doc/src/dihedral_charmm.rst @@ -107,7 +107,7 @@ i.e. within the outer cutoff specified for the pair style. The :doc:`pair_style lj/charmmfsw/coul/long ` commands. Use the *charmm* style with the older :doc:`pair_style ` commands that have just "charmm" in their style name. See the -discussion on the :doc:`CHARMM pair_style ` doc page for +discussion on the :doc:`CHARMM pair_style ` page for details. Note that for AMBER force fields, which use pair styles with "lj/cut", diff --git a/doc/src/dihedral_helix.rst b/doc/src/dihedral_helix.rst index 89258cff35..cd5bed7cd2 100644 --- a/doc/src/dihedral_helix.rst +++ b/doc/src/dihedral_helix.rst @@ -59,7 +59,7 @@ Restrictions """""""""""" This dihedral style can only be used if LAMMPS was built with the -MOLECULE package. See the :doc:`Build package ` doc page +EXTRA-MOLECULE package. See the :doc:`Build package ` doc page for more info. Related commands diff --git a/doc/src/dihedral_hybrid.rst b/doc/src/dihedral_hybrid.rst index c0a803755d..add0d4d282 100644 --- a/doc/src/dihedral_hybrid.rst +++ b/doc/src/dihedral_hybrid.rst @@ -58,7 +58,7 @@ for specifying additional AngleTorsion (and EndBondTorsion, etc) coefficients either via the input script or in the data file. I.e. *class2* must be added to each line after the dihedral type. For lines in the AngleTorsion (or EndBondTorsion, etc) section of the data -file for dihedral types that are not *class2*\ , you must use an +file for dihedral types that are not *class2*, you must use an dihedral style of *skip* as a placeholder, e.g. .. parsed-literal:: diff --git a/doc/src/dihedral_style.rst b/doc/src/dihedral_style.rst index 4301824b40..f037d95226 100644 --- a/doc/src/dihedral_style.rst +++ b/doc/src/dihedral_style.rst @@ -93,7 +93,7 @@ command. There are also additional accelerated pair styles included in the LAMMPS distribution for faster performance on CPUs, GPUs, and KNLs. -The individual style names on the :ref:`Commands dihedral ` doc page are followed by one or +The individual style names on the :ref:`Commands dihedral ` page are followed by one or more of (g,i,k,o,t) to indicate which accelerated styles exist. * :doc:`none ` - turn off dihedral interactions @@ -124,7 +124,7 @@ Dihedral styles can only be set for atom styles that allow dihedrals to be defined. Most dihedral styles are part of the MOLECULE package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual dihedral potentials tell if it is part of a package. Related commands diff --git a/doc/src/dimension.rst b/doc/src/dimension.rst index be711815a6..d22d3f19fa 100644 --- a/doc/src/dimension.rst +++ b/doc/src/dimension.rst @@ -28,7 +28,7 @@ prior to setting up a simulation box via the :doc:`create_box ` or :doc:`read_data ` commands. Restart files also store this setting. -See the discussion on the :doc:`Howto 2d ` doc page for +See the discussion on the :doc:`Howto 2d ` page for additional instructions on how to run 2d simulations. .. note:: diff --git a/doc/src/displace_atoms.rst b/doc/src/displace_atoms.rst index efc6f9230b..9916126dad 100644 --- a/doc/src/displace_atoms.rst +++ b/doc/src/displace_atoms.rst @@ -93,7 +93,7 @@ The *rotate* style rotates each atom in the group by the angle *theta* around a rotation axis *R* = (Rx,Ry,Rz) that goes through a point *P* = (Px,Py,Pz). The direction of rotation for the atoms around the rotation axis is consistent with the right-hand rule: if your -right-hand thumb points along *R*\ , then your fingers wrap around the +right-hand thumb points along *R*, then your fingers wrap around the axis in the direction of positive theta. If the defined :doc:`atom_style ` assigns an orientation to diff --git a/doc/src/dump.rst b/doc/src/dump.rst index a5f11a792a..5bdf38fd4e 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -52,7 +52,7 @@ Syntax *cfg/gz* args = same as *custom* args, see below *cfg/zstd* args = same as *custom* args, see below *cfg/mpiio* args = same as *custom* args, see below - *custom*\ , *custom/gz*\ , *custom/zstd* , *custom/mpiio* args = see below + *custom*, *custom/gz*, *custom/zstd*, *custom/mpiio* args = see below *custom/adios* args = same as *custom* args, discussed on :doc:`dump custom/adios ` doc page *dcd* args = none *h5md* args = discussed on :doc:`dump h5md ` doc page @@ -185,12 +185,12 @@ or multiple smaller files). parallel, because data for a single snapshot is collected from multiple processors, each of which owns a subset of the atoms. -For the *atom*\ , *custom*\ , *cfg*\ , and *local* styles, sorting is off by -default. For the *dcd*\ , *xtc*\ , *xyz*\ , and *molfile* styles, sorting by +For the *atom*, *custom*, *cfg*, and *local* styles, sorting is off by +default. For the *dcd*, *xtc*, *xyz*, and *molfile* styles, sorting by atom ID is on by default. See the :doc:`dump_modify ` doc page for details. -The *atom/gz*\ , *cfg/gz*\ , *custom/gz*\ , *local/gz*, and *xyz/gz* styles are identical +The *atom/gz*, *cfg/gz*, *custom/gz*, *local/gz*, and *xyz/gz* styles are identical in command syntax to the corresponding styles without "gz", however, they generate compressed files using the zlib library. Thus the filename suffix ".gz" is mandatory. This is an alternative approach to writing @@ -201,13 +201,13 @@ For the remainder of this doc page, you should thus consider the *atom* and *atom/gz* styles (etc) to be inter-changeable, with the exception of the required filename suffix. -Similarly, the *atom/zstd*\ , *cfg/zstd*\ , *custom/zstd*\ , *local/zstd*, +Similarly, the *atom/zstd*, *cfg/zstd*, *custom/zstd*, *local/zstd*, and *xyz/zstd* styles are identical to the gz styles, but use the Zstd compression library instead and require the ".zst" suffix. See the -:doc:`dump_modify ` doc page for details on how to control +:doc:`dump_modify ` page for details on how to control the compression level in both variants. -As explained below, the *atom/mpiio*\ , *cfg/mpiio*\ , *custom/mpiio*\ , and +As explained below, the *atom/mpiio*, *cfg/mpiio*, *custom/mpiio*, and *xyz/mpiio* styles are identical in command syntax and in the format of the dump files they create, to the corresponding styles without "mpiio", except the single dump file they produce is written in @@ -227,13 +227,13 @@ file and in what format. Settings made via the :doc:`dump_modify ` command can also alter the format of individual values and the file itself. -The *atom*\ , *local*\ , and *custom* styles create files in a simple text +The *atom*, *local*, and *custom* styles create files in a simple text format that is self-explanatory when viewing a dump file. Some of the LAMMPS post-processing tools described on the :doc:`Tools ` doc page, including `Pizza.py `_, work with this format, as does the :doc:`rerun ` command. -For post-processing purposes the *atom*\ , *local*\ , and *custom* text +For post-processing purposes the *atom*, *local*, and *custom* text files are self-describing in the following sense. The dimensions of the simulation box are included in each snapshot. @@ -272,7 +272,7 @@ This bounding box is convenient for many visualization programs. The meaning of the 6 character flags for "xx yy zz" is the same as above. Note that the first two numbers on each line are now xlo_bound instead -of xlo, etc, since they represent a bounding box. See the :doc:`Howto triclinic ` doc page for a geometric description +of xlo, etc, since they represent a bounding box. See the :doc:`Howto triclinic ` page for a geometric description of triclinic boxes, as defined by LAMMPS, simple formulas for how the 6 bounding box extents (xlo_bound,xhi_bound,etc) are calculated from the triclinic parameters, and how to transform those parameters to and @@ -283,7 +283,7 @@ the per-atom lines that follow. For example, the descriptors would be "id type xs ys zs" for the default *atom* style, and would be the atom attributes you specify in the dump command for the *custom* style. -For style *atom*\ , atom coordinates are written to the file, along with +For style *atom*, atom coordinates are written to the file, along with the atom ID and atom type. By default, atom coords are written in a scaled format (from 0 to 1). I.e. an x value of 0.25 means the atom is at a location 1/4 of the distance from xlo to xhi of the box @@ -295,13 +295,13 @@ Style *custom* allows you to specify a list of atom attributes to be written to the dump file for each atom. Possible attributes are listed above and will appear in the order specified. You cannot specify a quantity that is not defined for a particular simulation - -such as *q* for atom style *bond*\ , since that atom style does not +such as *q* for atom style *bond*, since that atom style does not assign charges. Dumps occur at the very end of a timestep, so atom attributes will include effects due to fixes that are applied during the timestep. An explanation of the possible dump custom attributes is given below. -For style *local*\ , local output generated by :doc:`computes ` +For style *local*, local output generated by :doc:`computes ` and :doc:`fixes ` is used to generate lines of output that is written to the dump file. This local data is typically calculated by each processor based on the atoms it owns, but there may be zero or @@ -326,7 +326,7 @@ explicitly in the file). Any remaining attributes will be stored as want to use the :doc:`dump_modify element ` command with CFG-formatted files, to associate element names with atom types, so that AtomEye can render atoms appropriately. When unwrapped -coordinates *xsu*\ , *ysu*\ , and *zsu* are requested, the nominal AtomEye +coordinates *xsu*, *ysu*, and *zsu* are requested, the nominal AtomEye periodic cell dimensions are expanded by a large factor UNWRAPEXPAND = 10.0, which ensures atoms that are displayed correctly for up to UNWRAPEXPAND/2 periodic boundary crossings in any direction. Beyond @@ -374,7 +374,7 @@ from using the (numerical) atom type to an element name (or some other label). This will help many visualization programs to guess bonds and colors. -Note that *atom*\ , *custom*\ , *dcd*\ , *xtc*\ , and *xyz* style dump files +Note that *atom*, *custom*, *dcd*, *xtc*, and *xyz* style dump files can be read directly by `VMD `_, a popular molecular viewing program. @@ -417,7 +417,7 @@ with the processor ID from 0 to P-1. For example, tmp.dump.% becomes tmp.dump.0, tmp.dump.1, ... tmp.dump.P-1, etc. This creates smaller files and can be a fast mode of output on parallel machines that support parallel I/O for output. This option is not available for the -*dcd*\ , *xtc*\ , and *xyz* styles. +*dcd*, *xtc*, and *xyz* styles. By default, P = the number of processors meaning one file per processor, but P can be set to a smaller value via the *nfile* or @@ -428,7 +428,7 @@ when running on large numbers of processors. Note that using the "\*" and "%" characters together can produce a large number of small dump files! -For the *atom/mpiio*\ , *cfg/mpiio*\ , *custom/mpiio*\ , and *xyz/mpiio* +For the *atom/mpiio*, *cfg/mpiio*, *custom/mpiio*, and *xyz/mpiio* styles, a single dump file is written in parallel via the MPI-IO library, which is part of the MPI standard for versions 2.0 and above. Using MPI-IO requires two steps. First, build LAMMPS with its MPIIO @@ -474,7 +474,7 @@ styles. ---------- Note that in the discussion which follows, for styles which can -reference values from a compute or fix, like the *custom*\ , *cfg*\ , or +reference values from a compute or fix, like the *custom*, *cfg*, or *local* styles, the bracketed index I can be specified using a wildcard asterisk with the index to effectively specify multiple values. This takes the form "\*" or "\*n" or "n\*" or "m\*n". If N = the @@ -557,8 +557,8 @@ the distance and energy of each bond: This section explains the atom attributes that can be specified as part of the *custom* and *cfg* styles. -The *id*\ , *mol*\ , *proc*\ , *procp1*\ , *type*\ , *element*\ , *mass*\ , *vx*\ , -*vy*\ , *vz*\ , *fx*\ , *fy*\ , *fz*\ , *q* attributes are self-explanatory. +The *id*, *mol*, *proc*, *procp1*, *type*, *element*, *mass*, *vx*, +*vy*, *vz*, *fx*, *fy*, *fz*, *q* attributes are self-explanatory. *Id* is the atom ID. *Mol* is the molecule ID, included in the data file for molecular systems. *Proc* is the ID of the processor (0 to @@ -568,31 +568,31 @@ for coloring atoms in a visualization program. *Type* is the atom type (1 to Ntypes). *Element* is typically the chemical name of an element, which you must assign to each type via the :doc:`dump_modify element ` command. More generally, it can be any string you wish to associated with an atom type. *Mass* is the atom -mass. *Vx*\ , *vy*\ , *vz*\ , *fx*\ , *fy*\ , *fz*\ , and *q* are components of +mass. *Vx*, *vy*, *vz*, *fx*, *fy*, *fz*, and *q* are components of atom velocity and force and atomic charge. -There are several options for outputting atom coordinates. The *x*\ , -*y*\ , *z* attributes write atom coordinates "unscaled", in the +There are several options for outputting atom coordinates. The *x*, +*y*, *z* attributes write atom coordinates "unscaled", in the appropriate distance :doc:`units ` (Angstroms, sigma, etc). Use -*xs*\ , *ys*\ , *zs* if you want the coordinates "scaled" to the box size, +*xs*, *ys*, *zs* if you want the coordinates "scaled" to the box size, so that each value is 0.0 to 1.0. If the simulation box is triclinic (tilted), then all atom coords will still be between 0.0 and 1.0. I.e. actual unscaled (x,y,z) = xs\*A + ys\*B + zs\*C, where (A,B,C) are the non-orthogonal vectors of the simulation box edges, as discussed on the :doc:`Howto triclinic ` doc page. -Use *xu*\ , *yu*\ , *zu* if you want the coordinates "unwrapped" by the +Use *xu*, *yu*, *zu* if you want the coordinates "unwrapped" by the image flags for each atom. Unwrapped means that if the atom has passed through a periodic boundary one or more times, the value is printed for what the coordinate would be if it had not been wrapped -back into the periodic box. Note that using *xu*\ , *yu*\ , *zu* means +back into the periodic box. Note that using *xu*, *yu*, *zu* means that the coordinate values may be far outside the box bounds printed -with the snapshot. Using *xsu*\ , *ysu*\ , *zsu* is similar to using -*xu*\ , *yu*\ , *zu*\ , except that the unwrapped coordinates are scaled by +with the snapshot. Using *xsu*, *ysu*, *zsu* is similar to using +*xu*, *yu*, *zu*, except that the unwrapped coordinates are scaled by the box size. Atoms that have passed through a periodic boundary will have the corresponding coordinate increased or decreased by 1.0. -The image flags can be printed directly using the *ix*\ , *iy*\ , *iz* +The image flags can be printed directly using the *ix*, *iy*, *iz* attributes. For periodic dimensions, they specify which image of the simulation box the atom is considered to be in. An image of 0 means it is inside the box as defined. A value of 2 means add 2 box lengths @@ -600,7 +600,7 @@ to get the true value. A value of -1 means subtract 1 box length to get the true value. LAMMPS updates these flags as atoms cross periodic boundaries during the simulation. -The *mux*\ , *muy*\ , *muz* attributes are specific to dipolar systems +The *mux*, *muy*, *muz* attributes are specific to dipolar systems defined with an atom style of *dipole*\ . They give the orientation of the atom's point dipole moment. The *mu* attribute gives the magnitude of the atom's dipole moment. @@ -609,15 +609,15 @@ The *radius* and *diameter* attributes are specific to spherical particles that have a finite size, such as those defined with an atom style of *sphere*\ . -The *omegax*\ , *omegay*\ , and *omegaz* attributes are specific to +The *omegax*, *omegay*, and *omegaz* attributes are specific to finite-size spherical particles that have an angular velocity. Only certain atom styles, such as *sphere* define this quantity. -The *angmomx*\ , *angmomy*\ , and *angmomz* attributes are specific to +The *angmomx*, *angmomy*, and *angmomz* attributes are specific to finite-size aspherical particles that have an angular momentum. Only the *ellipsoid* atom style defines this quantity. -The *tqx*\ , *tqy*\ , *tqz* attributes are for finite-size particles that +The *tqx*, *tqy*, *tqz* attributes are for finite-size particles that can sustain a rotational torque due to interactions with other particles. @@ -673,7 +673,7 @@ The *d_name* and *i_name* attributes allow to output custom per atom floating point or integer properties that are managed by :doc:`fix property/atom `. -See the :doc:`Modify ` doc page for information on how to add +See the :doc:`Modify ` page for information on how to add new compute and fix styles to LAMMPS to calculate per-atom quantities which could then be output into dump files. @@ -684,20 +684,20 @@ Restrictions To write gzipped dump files, you must either compile LAMMPS with the -DLAMMPS_GZIP option or use the styles from the COMPRESS package. -See the :doc:`Build settings ` doc page for details. +See the :doc:`Build settings ` page for details. -The *atom/gz*\ , *cfg/gz*\ , *custom/gz*\ , and *xyz/gz* styles are part of +The *atom/gz*, *cfg/gz*, *custom/gz*, and *xyz/gz* styles are part of the COMPRESS package. They are only enabled if LAMMPS was built with -that package. See the :doc:`Build package ` doc page for +that package. See the :doc:`Build package ` page for more info. -The *atom/mpiio*\ , *cfg/mpiio*\ , *custom/mpiio*\ , and *xyz/mpiio* styles +The *atom/mpiio*, *cfg/mpiio*, *custom/mpiio*, and *xyz/mpiio* styles are part of the MPIIO package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The *xtc* style is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/dump_adios.rst b/doc/src/dump_adios.rst index 74c8dae189..71ab6a07d9 100644 --- a/doc/src/dump_adios.rst +++ b/doc/src/dump_adios.rst @@ -66,7 +66,7 @@ its size is changing every step. The *atom/adios* and *custom/adios* dump styles are part of the ADIOS package. They are only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. ---------- diff --git a/doc/src/dump_cfg_uef.rst b/doc/src/dump_cfg_uef.rst index 9e33291880..7e95d8f30d 100644 --- a/doc/src/dump_cfg_uef.rst +++ b/doc/src/dump_cfg_uef.rst @@ -43,7 +43,7 @@ Restrictions """""""""""" This fix is part of the UEF package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This command can only be used when :doc:`fix nvt/uef ` or :doc:`fix npt/uef ` is active. diff --git a/doc/src/dump_h5md.rst b/doc/src/dump_h5md.rst index 2f66e2863b..202d5fb89d 100644 --- a/doc/src/dump_h5md.rst +++ b/doc/src/dump_h5md.rst @@ -32,7 +32,7 @@ Syntax Note that at least one element must be specified and image may only be present if position is specified first. -For the elements *position*\ , *velocity*\ , *force* and *species*\ , a +For the elements *position*, *velocity*, *force* and *species*, a sub-interval may be specified to write the data only every N_element iterations of the dump (i.e. every N\*N_element time steps). This is specified by this option directly following the element declaration: @@ -66,7 +66,7 @@ another particle group must specify *create_group yes*. .. _h5md: http://nongnu.org/h5md/ -Each data element is written every N\*N_element steps. For *image*\ , no +Each data element is written every N\*N_element steps. For *image*, no sub-interval is needed as it must be present at the same interval as *position*\ . *image* must be given after *position* in any case. The box information (edges in each dimension) is stored at the same @@ -107,8 +107,8 @@ note above). Only orthogonal domains are currently supported. This is a limitation of the present dump h5md command and not of H5MD itself. The *h5md* dump style is part of the H5MD package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. It also requires -(i) building the ch5md library provided with LAMMPS (See the :doc:`Build package ` doc page for more info.) and (ii) having +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. It also requires +(i) building the ch5md library provided with LAMMPS (See the :doc:`Build package ` page for more info.) and (ii) having the `HDF5 `_ library installed (C bindings are sufficient) on your system. The library ch5md is compiled with the h5cc wrapper provided by the HDF5 library. diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 3923d5c2dc..f54b69321b 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -153,7 +153,7 @@ framerate can be set using the :doc:`dump_modify ` command. To write out JPEG and PNG format files, you must build LAMMPS with support for the corresponding JPEG or PNG library. To convert images into movies, LAMMPS has to be compiled with the -DLAMMPS_FFMPEG -flag. See the :doc:`Build settings ` doc page for +flag. See the :doc:`Build settings ` page for details. .. note:: @@ -261,7 +261,7 @@ The *atom* keyword allow you to turn off the drawing of all atoms, if the specified value is *no*\ . Note that this will not turn off the drawing of particles that are represented as lines, triangles, or bodies, as discussed below. These particles can be drawn separately -if the *line*\ , *tri*\ , or *body* keywords are used. +if the *line*, *tri*, or *body* keywords are used. The *adiam* keyword allows you to override the *diameter* setting to set a single numeric *size*\ . All atoms will be drawn with that @@ -318,7 +318,7 @@ The *line* keyword can be used when :doc:`atom_style line ` is used to define particles as line segments, and will draw them as lines. If this keyword is not used, such particles will be drawn as spheres, the same as if they were regular atoms. The only setting -currently allowed for the *color* value is *type*\ , which will color +currently allowed for the *color* value is *type*, which will color the lines according to the atom type of the particle. By default the mapping of types to colors is as follows: @@ -345,7 +345,7 @@ or edges (3 lines) or both, depending on the setting for *tflag*\ . If edges are drawn, the *width* setting determines the diameters of the line segments. If this keyword is not used, triangle particles will be drawn as spheres, the same as if they were regular atoms. The only -setting currently allowed for the *color* value is *type*\ , which will +setting currently allowed for the *color* value is *type*, which will color the triangles according to the atom type of the particle. By default the mapping of types to colors is as follows: @@ -367,7 +367,7 @@ is used to define body particles with internal state body style. If this keyword is not used, such particles will be drawn as spheres, the same as if they were regular atoms. -The :doc:`Howto body ` doc page describes the body styles +The :doc:`Howto body ` page describes the body styles LAMMPS currently supports, and provides more details as to the kind of body particles they represent and how they are drawn by this dump image command. For all the body styles, individual atoms can be @@ -375,10 +375,10 @@ either a body particle or a usual point (non-body) particle. Non-body particles will be drawn the same way they would be as a regular atom. The *bflag1* and *bflag2* settings are numerical values which are passed to the body style to affect how the drawing of a body particle -is done. See the :doc:`Howto body ` doc page for a +is done. See the :doc:`Howto body ` page for a description of what these parameters mean for each body style. -The only setting currently allowed for the *color* value is *type*\ , +The only setting currently allowed for the *color* value is *type*, which will color the body particles according to the atom type of the particle. By default the mapping of types to colors is as follows: @@ -399,10 +399,10 @@ objects to be drawn. The *fflag1* and *fflag2* settings are numerical values which are passed to the fix to affect how the drawing of its objects is done. -See the individual fix doc page for a description of what these +See the individual fix page for a description of what these parameters mean for a particular fix. -The only setting currently allowed for the *color* value is *type*\ , +The only setting currently allowed for the *color* value is *type*, which will color the fix objects according to their type. By default the mapping of types to colors is as follows: @@ -423,11 +423,11 @@ i.e. the number of pixels in each direction. ---------- -The *view*\ , *center*\ , *up*\ , and *zoom* values determine how +The *view*, *center*, *up*, and *zoom* values determine how 3d simulation space is mapped to the 2d plane of the image. Basically they control how the simulation box appears in the image. -All of the *view*\ , *center*\ , *up*\ , and *zoom* values can be +All of the *view*, *center*, *up*, and *zoom* values can be specified as numeric quantities, whose meaning is explained below. Any of them can also be specified as an :doc:`equal-style variable `, by using v_name as the value, where "name" is @@ -447,13 +447,13 @@ specified via variables, then the variable values should be in degrees. The *center* keyword determines the point in simulation space that -will be at the center of the image. *Cx*\ , *Cy*\ , and *Cz* are +will be at the center of the image. *Cx*, *Cy*, and *Cz* are specified as fractions of the box dimensions, so that (0.5,0.5,0.5) is the center of the simulation box. These values do not have to be between 0.0 and 1.0, if you want the simulation box to be offset from the center of the image. Note, however, that if you choose strange -values for *Cx*\ , *Cy*\ , or *Cz* you may get a blank image. Internally, -*Cx*\ , *Cy*\ , and *Cz* are converted into a point in simulation space. +values for *Cx*, *Cy*, or *Cz* you may get a blank image. Internally, +*Cx*, *Cy*, and *Cz* are converted into a point in simulation space. If *flag* is set to "s" for static, then this conversion is done once, at the time the dump command is issued. If *flag* is set to "d" for dynamic then the conversion is performed every time a new image is @@ -607,7 +607,7 @@ Play the movie: ---------- -See the :doc:`Modify ` doc page for information on how to add +See the :doc:`Modify ` page for information on how to add new compute and fix styles to LAMMPS to calculate per-atom quantities which could then be output into dump files. @@ -626,7 +626,7 @@ building LAMMPS and have the FFmpeg executable available on the machine where LAMMPS is being run. Typically it's name is lowercase, i.e. ffmpeg. -See the :doc:`Build settings ` doc page for details. +See the :doc:`Build settings ` page for details. Note that since FFmpeg is run as an external program via a pipe, LAMMPS has limited control over its execution and no knowledge about diff --git a/doc/src/dump_modify.rst b/doc/src/dump_modify.rst index a66c571dea..5fea976e70 100644 --- a/doc/src/dump_modify.rst +++ b/doc/src/dump_modify.rst @@ -152,8 +152,8 @@ Description Modify the parameters of a previously defined dump command. Not all parameters are relevant to all dump styles. -As explained on the :doc:`dump ` doc page, the *atom/mpiio*\ , -*custom/mpiio*\ , and *xyz/mpiio* dump styles are identical in command +As explained on the :doc:`dump ` doc page, the *atom/mpiio*, +*custom/mpiio*, and *xyz/mpiio* dump styles are identical in command syntax and in the format of the dump files they create, to the corresponding styles without "mpiio", except the single dump file they produce is written in parallel via the MPI-IO library. Thus if a @@ -170,9 +170,9 @@ description gives details. The *append* keyword applies to all dump styles except *cfg* and *xtc* and *dcd*\ . It also applies only to text output files, not to binary -or gzipped or image/movie files. If specified as *yes*\ , then dump +or gzipped or image/movie files. If specified as *yes*, then dump snapshots are appended to the end of an existing dump file. If -specified as *no*\ , then a new dump file will be created which will +specified as *no*, then a new dump file will be created which will overwrite an existing file with the same name. ---------- @@ -180,7 +180,7 @@ overwrite an existing file with the same name. The *at* keyword only applies to the *netcdf* dump style. It can only be used if the *append yes* keyword is also used. The *N* argument is the index of which frame to append to. A negative value can be -specified for *N*\ , which means a frame counted from the end of the +specified for *N*, which means a frame counted from the end of the file. The *at* keyword can only be used if the dump_modify command is before the first command that causes dump snapshots to be output, e.g. a :doc:`run ` or :doc:`minimize ` command. Once the @@ -188,13 +188,13 @@ dump file has been opened, this keyword has no further effect. ---------- -The *buffer* keyword applies only to dump styles *atom*\ , *cfg*\ , -*custom*\ , *local*\ , and *xyz*\ . It also applies only to text output -files, not to binary or gzipped files. If specified as *yes*\ , which +The *buffer* keyword applies only to dump styles *atom*, *cfg*, +*custom*, *local*, and *xyz*\ . It also applies only to text output +files, not to binary or gzipped files. If specified as *yes*, which is the default, then each processor writes its output into an internal text buffer, which is then sent to the processor(s) which perform file writes, and written by those processors(s) as one large chunk of text. -If specified as *no*\ , each processor sends its per-atom data in binary +If specified as *no*, each processor sends its per-atom data in binary format to the processor(s) which perform file wirtes, and those processor(s) format and write it line by line into the output file. @@ -213,16 +213,16 @@ during an equilibration phase. ---------- -The *element* keyword applies only to the dump *cfg*\ , *xyz*\ , and +The *element* keyword applies only to the dump *cfg*, *xyz*, and *image* styles. It associates element names (e.g. H, C, Fe) with LAMMPS atom types. See the list of element names at the bottom of this page. -In the case of dump *cfg*\ , this allows the `AtomEye `_ +In the case of dump *cfg*, this allows the `AtomEye `_ visualization package to read the dump file and render atoms with the appropriate size and color. -In the case of dump *image*\ , the output images will follow the same +In the case of dump *image*, the output images will follow the same `AtomEye `_ convention. An element name is specified for each atom type (1 to Ntype) in the simulation. The same element name can be given to multiple atom types. @@ -298,7 +298,7 @@ the very first timestep after the dump command is invoked. This will always occur if the current timestep is a multiple of N, the frequency specified in the :doc:`dump ` command, including timestep 0. But if this is not the case, a dump snapshot will only be written if the -setting of this keyword is *yes*\ . If it is *no*\ , which is the +setting of this keyword is *yes*\ . If it is *no*, which is the default, then it will not be written. ---------- @@ -312,7 +312,7 @@ performed with dump style *xtc*\ . ---------- The *format* keyword can be used to change the default numeric format output -by the text-based dump styles: *atom*\ , *local*\ , *custom*\ , *cfg*\ , and +by the text-based dump styles: *atom*, *local*, *custom*, *cfg*, and *xyz* styles, and their MPIIO variants. Only the *line* or *none* options can be used with the *atom* and *xyz* styles. @@ -381,7 +381,7 @@ The *fileper* keyword is documented below with the *nfile* keyword. ---------- The *image* keyword applies only to the dump *atom* style. If the -image value is *yes*\ , 3 flags are appended to each atom's coords which +image value is *yes*, 3 flags are appended to each atom's coords which are the absolute box image of the atom in each dimension. For example, an x image flag of -2 with a normalized coord of 0.5 means the atom is in the center of the box, but has passed through the box @@ -423,7 +423,7 @@ files produced, even if you run for 1000s of steps. The *nfile* or *fileper* keywords can be used in conjunction with the "%" wildcard character in the specified dump file name, for all dump -styles except the *dcd*\ , *image*\ , *movie*\ , *xtc*\ , and *xyz* styles +styles except the *dcd*, *image*, *movie*, *xtc*, and *xyz* styles (for which "%" is not allowed). As explained on the :doc:`dump ` command doc page, the "%" character causes the dump file to be written in pieces, one piece for each of P processors. By default P = the @@ -461,7 +461,7 @@ slightly outside the simulation box. This is because periodic boundary conditions are enforced only on timesteps when neighbor lists are rebuilt, which will not typically coincide with the timesteps dump snapshots are written. If the setting of this keyword is set to -*yes*\ , then all atoms will be remapped to the periodic box before the +*yes*, then all atoms will be remapped to the periodic box before the snapshot is written, then restored to their original position. If it is set to *no* they will not be. The *no* setting is the default because it requires no extra computation. @@ -475,8 +475,8 @@ nanometer accuracy, e.g. for N = 1000, the coordinates are written to ---------- -The *refresh* keyword only applies to the dump *custom*\ , *cfg*\ , -*image*\ , and *movie* styles. It allows an "incremental" dump file to +The *refresh* keyword only applies to the dump *custom*, *cfg*, +*image*, and *movie* styles. It allows an "incremental" dump file to be written, by refreshing a compute that is used as a threshold for determining which atoms are included in a dump snapshot. The specified *c_ID* gives the ID of the compute. It is prefixed by "c\_" @@ -544,8 +544,8 @@ simply do nothing. ---------- -The *region* keyword only applies to the dump *custom*\ , *cfg*\ , -*image*\ , and *movie* styles. If specified, only atoms in the region +The *region* keyword only applies to the dump *custom*, *cfg*, +*image*, and *movie* styles. If specified, only atoms in the region will be written to the dump file or included in the image/movie. Only one region can be applied as a filter (the last one specified). See the :doc:`region ` command for more details. Note that a region @@ -590,7 +590,7 @@ order. The dump *local* style cannot be sorted by atom ID, since there are typically multiple lines of output per atom. Some dump styles, such -as *dcd* and *xtc*\ , require sorting by atom ID to format the output +as *dcd* and *xtc*, require sorting by atom ID to format the output file correctly. If multiple processors are writing the dump file, via the "%" wildcard in the dump filename, then sorting cannot be performed. @@ -610,8 +610,8 @@ identical to the values specified by :doc:`thermo_style `. ---------- -The *thresh* keyword only applies to the dump *custom*\ , *cfg*\ , -*image*\ , and *movie* styles. Multiple thresholds can be specified. +The *thresh* keyword only applies to the dump *custom*, *cfg*, +*image*, and *movie* styles. Multiple thresholds can be specified. Specifying *none* turns off all threshold criteria. If thresholds are specified, only atoms whose attributes meet all the threshold criteria are written to the dump file or included in the image. The possible @@ -626,7 +626,7 @@ produce continuous numeric values or effective Boolean 0/1 values which may be useful for the comparison operator. Boolean values can be generated by variable formulas that use comparison or Boolean math operators or special functions like gmask() and rmask() and grmask(). -See the :doc:`variable ` command doc page for details. +See the :doc:`variable ` command page for details. The specified value must be a simple numeric value or the word LAST. If LAST is used, it refers to the value of the attribute the last time @@ -670,9 +670,9 @@ threshold criterion is met. Otherwise it is not met. ---------- -The *time* keyword only applies to the dump *atom*\ , *custom*\ , and -*local* styles (and their COMPRESS package versions *atom/gz*\ , -*custom/gz* and *local/gz*\ ). If set to *yes*\ , each frame will will +The *time* keyword only applies to the dump *atom*, *custom*, and +*local* styles (and their COMPRESS package versions *atom/gz*, +*custom/gz* and *local/gz*\ ). If set to *yes*, each frame will will contain two extra lines before the "ITEM: TIMESTEP" entry: .. parsed-literal:: @@ -688,9 +688,9 @@ The default setting is *no*\ . ---------- -The *units* keyword only applies to the dump *atom*\ , *custom*\ , and -*local* styles (and their COMPRESS package versions *atom/gz*\ , -*custom/gz* and *local/gz*\ ). If set to *yes*\ , each individual dump +The *units* keyword only applies to the dump *atom*, *custom*, and +*local* styles (and their COMPRESS package versions *atom/gz*, +*custom/gz* and *local/gz*\ ). If set to *yes*, each individual dump file will contain two extra lines at the very beginning with: .. parsed-literal:: @@ -706,7 +706,7 @@ The default setting is *no*\ . ---------- The *unwrap* keyword only applies to the dump *dcd* and *xtc* styles. -If set to *yes*\ , coordinates will be written "unwrapped" by the image +If set to *yes*, coordinates will be written "unwrapped" by the image flags for each atom. Unwrapped means that if the atom has passed through a periodic boundary one or more times, the value is printed for what the coordinate would be if it had not been wrapped back into the @@ -723,7 +723,7 @@ images. Some of the keywords only affect the :doc:`dump movie ` sty ---------- The *acolor* keyword can be used with the :doc:`dump image ` -command, when its atom color setting is *type*\ , to set the color that +command, when its atom color setting is *type*, to set the color that atoms of each type will be drawn in the image. The specified *type* should be an integer from 1 to Ntypes = the @@ -747,7 +747,7 @@ of the specified atom types. ---------- The *adiam* keyword can be used with the :doc:`dump image ` -command, when its atom diameter setting is *type*\ , to set the size +command, when its atom diameter setting is *type*, to set the size that atoms of each type will be drawn in the image. The specified *type* should be an integer from 1 to Ntypes. As with the *acolor* keyword, a wildcard asterisk can be used as part of the *type* @@ -776,7 +776,7 @@ There are many possible options for the color map, enabled by the *amap* keyword. Here are the details. The *lo* and *hi* settings determine the range of values allowed for -the atom attribute. If numeric values are used for *lo* and/or *hi*\ , +the atom attribute. If numeric values are used for *lo* and/or *hi*, then values that are lower/higher than that value are set to the value. I.e. the range is static. If *lo* is specified as *min* or *hi* as *max* then the range is dynamic, and the lower and/or @@ -847,7 +847,7 @@ for the color map. Here is how the entries are used to determine the color of an individual atom, given the value X of its atom attribute. The entries are scanned from first to last. The first time that *lo* <= X <= -*hi*\ , X is assigned the color associated with that entry. You can +*hi*, X is assigned the color associated with that entry. You can think of the last entry as assigning a default color (since it will always be matched by X), and the earlier entries as colors that override the default. Also note that no interpolation of a color RGB @@ -894,7 +894,7 @@ name defined by the dump_modify color option. ---------- The *bcolor* keyword can be used with the :doc:`dump image ` -command, with its *bond* keyword, when its color setting is *type*\ , to +command, with its *bond* keyword, when its color setting is *type*, to set the color that bonds of each type will be drawn in the image. The specified *type* should be an integer from 1 to Nbondtypes = the @@ -918,7 +918,7 @@ of the specified bond types. ---------- The *bdiam* keyword can be used with the :doc:`dump image ` -command, with its *bond* keyword, when its diam setting is *type*\ , to +command, with its *bond* keyword, when its diam setting is *type*, to set the diameter that bonds of each type will be drawn in the image. The specified *type* should be an integer from 1 to Nbondtypes. As with the *bcolor* keyword, a wildcard asterisk can be used as part of @@ -1024,7 +1024,7 @@ Default The option defaults are * append = no -* buffer = yes for dump styles *atom*\ , *custom*\ , *loca*\ , and *xyz* +* buffer = yes for dump styles *atom*, *custom*, *loca*, and *xyz* * element = "C" for every atom type * every = whatever it was set to via the :doc:`dump ` command * fileper = # of processors @@ -1040,8 +1040,8 @@ The option defaults are * precision = 1000 * region = none * scale = yes -* sort = off for dump styles *atom*\ , *custom*\ , *cfg*\ , and *local* -* sort = id for dump styles *dcd*\ , *xtc*\ , and *xyz* +* sort = off for dump styles *atom*, *custom*, *cfg*, and *local* +* sort = id for dump styles *dcd*, *xtc*, and *xyz* * thresh = none * units = no * unwrap = no diff --git a/doc/src/dump_molfile.rst b/doc/src/dump_molfile.rst index aa8e04b22c..c1f0b48fe6 100644 --- a/doc/src/dump_molfile.rst +++ b/doc/src/dump_molfile.rst @@ -93,7 +93,7 @@ Restrictions """""""""""" The *molfile* dump style is part of the MOLFILE package. It is -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Molfile plugins provide a consistent programming interface to read and write file formats commonly used in molecular simulations. The diff --git a/doc/src/dump_netcdf.rst b/doc/src/dump_netcdf.rst index c14ec02871..d53a0a3b12 100644 --- a/doc/src/dump_netcdf.rst +++ b/doc/src/dump_netcdf.rst @@ -70,7 +70,7 @@ Restrictions The *netcdf* and *netcdf/mpiio* dump styles are part of the NETCDF package. They are only enabled if LAMMPS was built with -that package. See the :doc:`Build package ` doc page for +that package. See the :doc:`Build package ` page for more info. The *netcdf* and *netcdf/mpiio* dump styles currently cannot dump diff --git a/doc/src/dump_vtk.rst b/doc/src/dump_vtk.rst index 8eea1def94..8eec479292 100644 --- a/doc/src/dump_vtk.rst +++ b/doc/src/dump_vtk.rst @@ -70,7 +70,7 @@ determine the kind of output. of which owns a subset of the atoms. For the *vtk* style, sorting is off by default. See the -:doc:`dump_modify ` doc page for details. +:doc:`dump_modify ` page for details. ---------- @@ -88,7 +88,7 @@ hexahedrons in either legacy .vtk or .vtu XML format. Style *vtk* allows you to specify a list of atom attributes to be written to the dump file for each atom. The list of possible attributes is the same as for the :doc:`dump_style custom ` command; see -its doc page for a listing and an explanation of each attribute. +its page for a listing and an explanation of each attribute. .. note:: @@ -163,7 +163,7 @@ Restrictions The *vtk* style does not support writing of gzipped dump files. The *vtk* dump style is part of the VTK package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. To use this dump style, you also must link to the VTK library. See the info in lib/vtk/README and insure the Makefile.lammps file in that diff --git a/doc/src/dynamical_matrix.rst b/doc/src/dynamical_matrix.rst index 8d17f0aa1e..37b9e5b4a5 100644 --- a/doc/src/dynamical_matrix.rst +++ b/doc/src/dynamical_matrix.rst @@ -65,7 +65,7 @@ for large systems. This command is part of the PHONON package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 07a663c789..81c0c87320 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -34,7 +34,7 @@ positions and velocities due to time integration, controlling temperature, applying constraint forces to atoms, enforcing boundary conditions, computing diagnostics, etc. There are hundreds of fixes defined in LAMMPS and new ones can be added; see the -:doc:`Modify ` doc page for details. +:doc:`Modify ` page for details. Fixes perform their operations at different stages of the timestep. If 2 or more fixes operate at the same stage of the timestep, they are @@ -65,7 +65,7 @@ was. Note that this operation also wipes out any additional changes made to the old fix via the :doc:`fix_modify ` command. The :doc:`fix modify ` command allows settings for some -fixes to be reset. See the doc page for individual fixes for details. +fixes to be reset. See the page for individual fixes for details. Some fixes store an internal "state" which is written to binary restart files via the :doc:`restart ` or @@ -90,7 +90,7 @@ more per atoms. Note that a single fix can produce either global or per-atom or local quantities (or none at all), but not both global and per-atom. It can produce local quantities in tandem with global or per-atom quantities. -The fix doc page will explain. +The fix page will explain. Global, per-atom, and local quantities each come in three kinds: a single scalar value, a vector of values, or a 2d array of values. The @@ -136,7 +136,7 @@ In LAMMPS, the values generated by a fix can be used in several ways: command. Or the per-atom values can be referenced in an :doc:`atom-style variable `. * Local values can be reduced by the :doc:`compute reduce ` command, or histogrammed by the :doc:`fix ave/histo ` command. -See the :doc:`Howto output ` doc page for a summary of +See the :doc:`Howto output ` page for a summary of various LAMMPS output options, many of which involve fixes. The results of fixes that calculate global quantities can be either @@ -149,12 +149,12 @@ values by the number of atoms in the system, depending on the "thermo_modify norm" setting. It will not normalize intensive values. If a fix value is accessed in another way, e.g. by a :doc:`variable `, you may want to know whether it is an -intensive or extensive value. See the doc page for individual fixes +intensive or extensive value. See the page for individual fixes for further info. ---------- -Each fix style has its own doc page which describes its arguments and +Each fix style has its own page which describes its arguments and what it does, as listed below. Here is an alphabetic list of fix styles available in LAMMPS. They are also listed in more compact form on the :doc:`Commands fix ` doc page. @@ -407,7 +407,7 @@ Restrictions """""""""""" Some fix styles are part of specific packages. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual fixes tell if it is part of a package. Related commands diff --git a/doc/src/fix_adapt.rst b/doc/src/fix_adapt.rst index 58d86f8472..b7151334db 100644 --- a/doc/src/fix_adapt.rst +++ b/doc/src/fix_adapt.rst @@ -85,19 +85,19 @@ variable that is time-dependent. Depending on the value of the *reset* keyword, attributes changed by this fix will or will not be reset back to their original values at -the end of a simulation. Even if *reset* is specified as *yes*\ , a +the end of a simulation. Even if *reset* is specified as *yes*, a restart file written during a simulation will contain the modified settings. -If the *scale* keyword is set to *no*\ , which is the default, then +If the *scale* keyword is set to *no*, which is the default, then the value of the altered parameter will be whatever the variable -generates. If the *scale* keyword is set to *yes*\ , then the value +generates. If the *scale* keyword is set to *yes*, then the value of the altered parameter will be the initial value of that parameter multiplied by whatever the variable generates. I.e. the variable is now a "scale factor" applied in (presumably) a time-varying fashion to the parameter. -Note that whether scale is *no* or *yes*\ , internally, the parameters +Note that whether scale is *no* or *yes*, internally, the parameters themselves are actually altered by this fix. Make sure you use the *reset yes* option if you want the parameters to be restored to their initial values after the run. diff --git a/doc/src/fix_adapt_fep.rst b/doc/src/fix_adapt_fep.rst index 0f669eade3..affb893117 100644 --- a/doc/src/fix_adapt_fep.rst +++ b/doc/src/fix_adapt_fep.rst @@ -84,13 +84,13 @@ variable that is time-dependent. Depending on the value of the *reset* keyword, attributes changed by this fix will or will not be reset back to their original values at -the end of a simulation. Even if *reset* is specified as *yes*\ , a +the end of a simulation. Even if *reset* is specified as *yes*, a restart file written during a simulation will contain the modified settings. -If the *scale* keyword is set to *no*\ , then the value the parameter is +If the *scale* keyword is set to *no*, then the value the parameter is set to will be whatever the variable generates. If the *scale* -keyword is set to *yes*\ , then the value of the altered parameter will +keyword is set to *yes*, then the value of the altered parameter will be the initial value of that parameter multiplied by whatever the variable generates. I.e. the variable is now a "scale factor" applied in (presumably) a time-varying fashion to the parameter. Internally, @@ -98,7 +98,7 @@ the parameters themselves are actually altered; make sure you use the *reset yes* option if you want the parameters to be restored to their initial values after the run. -If the *after* keyword is set to *yes*\ , then the parameters are +If the *after* keyword is set to *yes*, then the parameters are changed one timestep after the multiple of N. In this manner, if a fix such as "fix ave/time" is used to calculate averages at every N timesteps, all the contributions to the average will be obtained with diff --git a/doc/src/fix_addforce.rst b/doc/src/fix_addforce.rst index 0137066ff7..15f433f520 100644 --- a/doc/src/fix_addforce.rst +++ b/doc/src/fix_addforce.rst @@ -48,8 +48,8 @@ atoms in a simulation, such as for a simulation of Poiseuille flow in a channel. Any of the 3 quantities defining the force components can be specified -as an equal-style or atom-style :doc:`variable `, namely *fx*\ , -*fy*\ , *fz*\ . If the value is a variable, it should be specified as +as an equal-style or atom-style :doc:`variable `, namely *fx*, +*fy*, *fz*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value(s) used to determine the force component. @@ -98,7 +98,7 @@ one or more variables, and you are performing energy minimization via the "minimize" command. The keyword specifies the name of an atom-style :doc:`variable ` which is used to compute the energy of each atom as function of its position. Like variables used -for *fx*\ , *fy*\ , *fz*\ , the energy variable is specified as v_name, +for *fx*, *fy*, *fz*, the energy variable is specified as v_name, where name is the variable name. Note that when the *energy* keyword is used during an energy diff --git a/doc/src/fix_addtorque.rst b/doc/src/fix_addtorque.rst index e03ed2b160..4e1ca12228 100644 --- a/doc/src/fix_addtorque.rst +++ b/doc/src/fix_addtorque.rst @@ -37,8 +37,8 @@ the group such that: This command can be used to drive a group of atoms into rotation. Any of the 3 quantities defining the torque components can be specified -as an equal-style :doc:`variable `, namely *Tx*\ , -*Ty*\ , *Tz*\ . If the value is a variable, it should be specified as +as an equal-style :doc:`variable `, namely *Tx*, +*Ty*, *Tz*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to determine the torque component. @@ -101,7 +101,7 @@ Restrictions This fix is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_append_atoms.rst b/doc/src/fix_append_atoms.rst index 754183b55b..c175fa429f 100644 --- a/doc/src/fix_append_atoms.rst +++ b/doc/src/fix_append_atoms.rst @@ -31,7 +31,7 @@ Syntax seed = random number seed for langevin kicks extent = extent of thermostatted region (distance units) *random* args = xmax ymax zmax seed - *xmax*\ , *ymax*\ , *zmax* = maximum displacement in particular direction (distance units) + *xmax*, *ymax*, *zmax* = maximum displacement in particular direction (distance units) *seed* = random number seed for random displacement *units* value = *lattice* or *box* *lattice* = the wall position is defined in lattice units @@ -99,7 +99,7 @@ Restrictions """""""""""" This fix style is part of the SHOCK package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The boundary on which atoms are added with append/atoms must be shrink/minimum. The opposite boundary may be any boundary type other diff --git a/doc/src/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst index a2d365dbe2..eb56572db7 100644 --- a/doc/src/fix_atom_swap.rst +++ b/doc/src/fix_atom_swap.rst @@ -66,7 +66,7 @@ The *types* keyword is required. At least two atom types must be specified. The *ke* keyword can be set to *no* to turn off kinetic energy -conservation for swaps. The default is *yes*\ , which means that swapped +conservation for swaps. The default is *yes*, which means that swapped atoms have their velocities scaled by the ratio of the masses of the swapped atom types. This ensures that the kinetic energy of each atom is the same after the swap as it was before the swap, even though the @@ -75,12 +75,12 @@ atom masses have changed. The *semi-grand* keyword can be set to *yes* to switch to the semi-grand canonical ensemble as discussed in :ref:`(Sadigh) `. This means that the total number of each particle type does not need to be -conserved. The default is *no*\ , which means that the only kind of swap +conserved. The default is *no*, which means that the only kind of swap allowed exchanges an atom of one type with an atom of a different given type. In other words, the relative mole fractions of the swapped atoms remains constant. Whereas in the semi-grand canonical ensemble, the composition of the system can change. Note that when using -*semi-grand*\ , atoms in the fix group whose type is not listed +*semi-grand*, atoms in the fix group whose type is not listed in the *types* keyword are ineligible for attempted conversion. An attempt is made to switch the selected atom (if eligible) to one of the other listed types @@ -111,7 +111,7 @@ If not using *semi-grand* this fix checks to ensure all atoms of the given types have the same atomic charge. LAMMPS does not enforce this in general, but it is needed for this fix to simplify the swapping procedure. Successful swaps will swap the atom type and charge -of the swapped atoms. Conversely, when using *semi-grand*\ , it is assumed that all the atom +of the swapped atoms. Conversely, when using *semi-grand*, it is assumed that all the atom types involved in switches have the same charge. Otherwise, charge would not be conserved. As a consequence, no checks on atomic charges are performed, and successful switches update the atom type but not the diff --git a/doc/src/fix_ave_atom.rst b/doc/src/fix_ave_atom.rst index e506b62cfa..7719dfa7e1 100644 --- a/doc/src/fix_ave_atom.rst +++ b/doc/src/fix_ave_atom.rst @@ -89,7 +89,7 @@ command creates a per-atom array with 6 columns: ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be used in order to contribute to the average. The final averaged quantities are generated on timesteps that are a multiple of *Nfreq*\ . The average is over *Nrepeat* @@ -136,7 +136,7 @@ appended, the per-atom vector calculated by the fix is used. If a bracketed term containing an index I is appended, the Ith column of the per-atom array calculated by the fix is used. Note that some fixes only produce their values on certain timesteps, which must be -compatible with *Nevery*\ , else an error will result. Users can also +compatible with *Nevery*, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. See the discussion above for how I can be specified with a wildcard asterisk to effectively specify multiple values. diff --git a/doc/src/fix_ave_chunk.rst b/doc/src/fix_ave_chunk.rst index ce7fcd1fca..6d5e0b0380 100644 --- a/doc/src/fix_ave_chunk.rst +++ b/doc/src/fix_ave_chunk.rst @@ -102,7 +102,7 @@ a file. In LAMMPS, chunks are collections of atoms defined by a :doc:`compute chunk/atom ` command, which assigns each atom to a single chunk (or no chunk). The ID for this command is specified as chunkID. For example, a single chunk could be the atoms in a -molecule or atoms in a spatial bin. See the :doc:`compute chunk/atom ` doc page and the :doc:`Howto chunk ` doc page for details of how chunks can be +molecule or atoms in a spatial bin. See the :doc:`compute chunk/atom ` page and the :doc:`Howto chunk ` page for details of how chunks can be defined and examples of how they can be used to measure properties of a system. @@ -168,7 +168,7 @@ case, a per-atom array with 3 columns: ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be accessed and contribute to the average. The final averaged quantities are generated on timesteps that are a multiples of *Nfreq*\ . The average is over *Nrepeat* @@ -199,14 +199,14 @@ discussed below. remain constant for the duration of the simulation. This fix forces the chunk/atom compute specified by chunkID to hold *Nchunk* constant for the appropriate time windows, by not allowing it to re-calculate - *Nchunk*\ , which can also affect how it assigns chunk IDs to atoms. + *Nchunk*, which can also affect how it assigns chunk IDs to atoms. This is particularly important to understand if the chunks defined by the :doc:`compute chunk/atom ` command are spatial - bins. If its *units* keyword is set to *box* or *lattice*\ , then the + bins. If its *units* keyword is set to *box* or *lattice*, then the number of bins *Nchunk* and size of each bin will be fixed over the *Nfreq* time window, which can affect which atoms are discarded if the simulation box size changes. If its *units* keyword is set to - *reduced*\ , then the number of bins *Nchunk* will still be fixed, but + *reduced*, then the number of bins *Nchunk* will still be fixed, but the size of each bin can vary at each timestep if the simulation box size changes, e.g. for an NPT simulation. @@ -221,7 +221,7 @@ The *density/number* value means the number density is computed for each chunk, i.e. number/volume. The *density/mass* value means the mass density is computed for each chunk, i.e. total-mass/volume. The output values are in units of 1/volume or density (mass/volume). See -the :doc:`units ` command doc page for the definition of density +the :doc:`units ` command page for the definition of density for each choice of units, e.g. gram/cm\^3. If the chunks defined by the :doc:`compute chunk/atom ` command are spatial bins, the volume is the bin volume. Otherwise it is the volume of the @@ -280,7 +280,7 @@ appended, the per-atom vector calculated by the fix is used. If a bracketed integer is appended, the Ith column of the per-atom array calculated by the fix is used. Note that some fixes only produce their values on certain timesteps, which must be compatible with -*Nevery*\ , else an error results. Users can also write code for their +*Nevery*, else an error results. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. See the discussion above for how I can be specified with a wildcard asterisk to effectively specify multiple values. @@ -300,7 +300,7 @@ and its outputs. The *norm* keyword affects how averaging is done for the per-chunk values that are output every *Nfreq* timesteps. -It the *norm* setting is *all*\ , which is the default, a chunk value is +It the *norm* setting is *all*, which is the default, a chunk value is summed over all atoms in all *Nrepeat* samples, as is the count of atoms in the chunk. The averaged output value for the chunk on the *Nfreq* timesteps is Total-sum / Total-count. In other words it is an @@ -311,7 +311,7 @@ the final *Nfreq* timestep. For the *temp* values, degrees of freedom and kinetic energy are summed separately across the entire *Nfreq* timescale, and the output value is calculated by dividing those two sums. -If the *norm* setting is *sample*\ , the chunk value is summed over +If the *norm* setting is *sample*, the chunk value is summed over atoms for each sample, as is the count, and an "average sample value" is computed for each sample, i.e. Sample-sum / Sample-count. The output value for the chunk on the *Nfreq* timesteps is the average of @@ -322,7 +322,7 @@ values, the volume (bin volume or system volume) used in the per-sample normalization will be the current volume at each sampling step. -If the *norm* setting is *none*\ , a similar computation as for the +If the *norm* setting is *none*, a similar computation as for the *sample* setting is done, except the individual "average sample values" are "summed sample values". A summed sample value is simply the chunk value summed over atoms in the sample, without dividing by @@ -335,15 +335,15 @@ normalization will be the current volume at each sampling step. The *ave* keyword determines how the per-chunk values produced every *Nfreq* steps are averaged with values produced on previous steps that -were multiples of *Nfreq*\ , before they are accessed by another output +were multiples of *Nfreq*, before they are accessed by another output command or written to a file. -If the *ave* setting is *one*\ , which is the default, then the chunk +If the *ave* setting is *one*, which is the default, then the chunk values produced on timesteps that are multiples of *Nfreq* are independent of each other; they are output as-is without further averaging. -If the *ave* setting is *running*\ , then the chunk values produced on +If the *ave* setting is *running*, then the chunk values produced on timesteps that are multiples of *Nfreq* are summed and averaged in a cumulative sense before being output. Each output chunk value is thus the average of the chunk value produced on that timestep with all @@ -352,7 +352,7 @@ the fix is defined; it can only be restarted by deleting the fix via the :doc:`unfix ` command, or re-defining the fix by re-specifying it. -If the *ave* setting is *window*\ , then the chunk values produced on +If the *ave* setting is *window*, then the chunk values produced on timesteps that are multiples of *Nfreq* are summed and averaged within a moving "window" of time, so that the last M values for the same chunk are used to produce the output. E.g. if M = 3 and Nfreq = 1000, @@ -440,18 +440,18 @@ chunk ID of 3 may correspond to an original chunk ID or molecule ID of 415. The OrigID column will list 415 for the third chunk. The CoordN columns only appear if a *binning* style was used in the -:doc:`compute chunk/atom ` command. For *bin/1d*\ , -*bin/2d*\ , and *bin/3d* styles the column values are the center point +:doc:`compute chunk/atom ` command. For *bin/1d*, +*bin/2d*, and *bin/3d* styles the column values are the center point of the bin in the corresponding dimension. Just Coord1 is used for -*bin/1d*\ , Coord2 is added for *bin/2d*\ , Coord3 is added for *bin/3d*\ . -For *bin/sphere*\ , just Coord1 is used, and it is the radial -coordinate. For *bin/cylinder*\ , Coord1 and Coord2 are used. Coord1 +*bin/1d*, Coord2 is added for *bin/2d*, Coord3 is added for *bin/3d*\ . +For *bin/sphere*, just Coord1 is used, and it is the radial +coordinate. For *bin/cylinder*, Coord1 and Coord2 are used. Coord1 is the radial coordinate (away from the cylinder axis), and coord2 is the coordinate along the cylinder axis. -Note that if the value of the *units* keyword used in the :doc:`compute chunk/atom command ` is *box* or *lattice*\ , the +Note that if the value of the *units* keyword used in the :doc:`compute chunk/atom command ` is *box* or *lattice*, the coordinate values will be in distance :doc:`units `. If the -value of the *units* keyword is *reduced*\ , the coordinate values will +value of the *units* keyword is *reduced*, the coordinate values will be in unitless reduced units (0-1). This is not true for the Coord1 value of style *bin/sphere* or *bin/cylinder* which both represent radial dimensions. Those values are always in distance :doc:`units `. diff --git a/doc/src/fix_ave_correlate.rst b/doc/src/fix_ave_correlate.rst index 58aff114af..23086d465f 100644 --- a/doc/src/fix_ave_correlate.rst +++ b/doc/src/fix_ave_correlate.rst @@ -130,7 +130,7 @@ values. ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be used to calculate correlation data. The input values are sampled every *Nevery* timesteps. The correlation data for the preceding samples is computed on timesteps @@ -194,7 +194,7 @@ be specified with a wildcard asterisk to effectively specify multiple values. Note that some fixes only produce their values on certain timesteps, -which must be compatible with *Nevery*\ , else an error will result. +which must be compatible with *Nevery*, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. If a value begins with "v\_", a variable name must follow which has @@ -237,14 +237,14 @@ pair Vi(t)\*Vj(t+delta) is always the one sampled at the later time. The *ave* keyword determines what happens to the accumulation of correlation samples every *Nfreq* timesteps. If the *ave* setting is -*one*\ , then the accumulation is restarted or zeroed every *Nfreq* +*one*, then the accumulation is restarted or zeroed every *Nfreq* timesteps. Thus the outputs on successive *Nfreq* timesteps are essentially independent of each other. The exception is that the Cij(0) = Vi(T)\*Vj(T) value at a timestep T, where T is a multiple of -*Nfreq*\ , contributes to the correlation output both at time T and at +*Nfreq*, contributes to the correlation output both at time T and at time T+Nfreq. -If the *ave* setting is *running*\ , then the accumulation is never +If the *ave* setting is *running*, then the accumulation is never zeroed. Thus the output of correlation data at any timestep is the average over samples accumulated every *Nevery* steps since the fix was defined. it can only be restarted by deleting the fix via the @@ -263,7 +263,7 @@ the size of the time window or other unit conversions. The *file* keyword allows a filename to be specified. Every *Nfreq* steps, an array of correlation data is written to the file. The -number of rows is *Nrepeat*\ , as described above. The number of +number of rows is *Nrepeat*, as described above. The number of columns is the Npair+2, also as described above. Thus the file ends up to be a series of these array sections. @@ -327,19 +327,19 @@ samples contributing to the correlation average, as described above. The remaining Npair columns are for I,J pairs of the N input values, as determined by the *type* keyword, as described above. -* For *type* = *auto*\ , the Npair = N columns are ordered: C11, C22, ..., +* For *type* = *auto*, the Npair = N columns are ordered: C11, C22, ..., CNN. -* For *type* = *upper*\ , the Npair = N\*(N-1)/2 columns are ordered: C12, +* For *type* = *upper*, the Npair = N\*(N-1)/2 columns are ordered: C12, C13, ..., C1N, C23, ..., C2N, C34, ..., CN-1N. -* For *type* = *lower*\ , the Npair = N\*(N-1)/2 columns are ordered: C21, +* For *type* = *lower*, the Npair = N\*(N-1)/2 columns are ordered: C21, C31, C32, C41, C42, C43, ..., CN1, CN2, ..., CNN-1. -* For *type* = *auto/upper*\ , the Npair = N\*(N+1)/2 columns are ordered: +* For *type* = *auto/upper*, the Npair = N\*(N+1)/2 columns are ordered: C11, C12, C13, ..., C1N, C22, C23, ..., C2N, C33, C34, ..., CN-1N, CNN. -* For *type* = *auto/lower*\ , the Npair = N\*(N+1)/2 columns are ordered: +* For *type* = *auto/lower*, the Npair = N\*(N+1)/2 columns are ordered: C11, C21, C22, C31, C32, C33, C41, ..., C44, CN1, CN2, ..., CNN-1, CNN. -* For *type* = *full*\ , the Npair = N\^2 columns are ordered: C11, C12, +* For *type* = *full*, the Npair = N\^2 columns are ordered: C11, C12, ..., C1N, C21, C22, ..., C2N, C31, ..., C3N, ..., CN1, ..., CNN-1, CNN. diff --git a/doc/src/fix_ave_correlate_long.rst b/doc/src/fix_ave_correlate_long.rst index e3e118744a..a69d8f5695 100644 --- a/doc/src/fix_ave_correlate_long.rst +++ b/doc/src/fix_ave_correlate_long.rst @@ -78,18 +78,18 @@ specified values may represent calculations performed by computes and fixes which store their own "group" definitions. Each listed value can be the result of a compute or fix or the -evaluation of an equal-style variable. See the :doc:`fix ave/correlate ` doc page for details. +evaluation of an equal-style variable. See the :doc:`fix ave/correlate ` page for details. The *Nevery* and *Nfreq* arguments specify on what timesteps the input values will be used to calculate correlation data, and the frequency with which the time correlation functions will be output to a file. Note that there is no *Nrepeat* argument, unlike the :doc:`fix ave/correlate ` command. -The optional keywords *ncorr*\ , *nlen*\ , and *ncount* are unique to this +The optional keywords *ncorr*, *nlen*, and *ncount* are unique to this command and determine the number of correlation points calculated and the memory and CPU overhead used by this calculation. *Nlen* and *ncount* determine the amount of averaging done at longer correlation -times. The default values *nlen=16*\ , *ncount=2* ensure that the +times. The default values *nlen=16*, *ncount=2* ensure that the systematic error of the multiple-tau correlator is always below the level of the statistical error of a typical simulation (which depends on the ensemble size and the simulation length). @@ -128,7 +128,7 @@ Restrictions """""""""""" This compute is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst index 3a2857f383..05c63a6faf 100644 --- a/doc/src/fix_ave_histo.rst +++ b/doc/src/fix_ave_histo.rst @@ -100,7 +100,7 @@ component) or can be the result of a :doc:`compute ` or atom-style :doc:`variable `. The set of input values can be either all global, all per-atom, or all local quantities. Inputs of different kinds (e.g. global and per-atom) cannot be mixed. Atom -attributes are per-atom vector values. See the doc page for +attributes are per-atom vector values. See the page for individual "compute" and "fix" commands to see what kinds of quantities they generate. See the optional *kind* keyword below for how to force the fix ave/histo command to disambiguate if necessary. @@ -153,7 +153,7 @@ the first vector. ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be used in order to contribute to the histogram. The final histogram is generated on timesteps that are multiple of *Nfreq*\ . It is averaged over *Nrepeat* histograms, @@ -210,7 +210,7 @@ be specified with a wildcard asterisk to effectively specify multiple values. Note that some fixes only produce their values on certain timesteps, -which must be compatible with *Nevery*\ , else an error will result. +which must be compatible with *Nevery*, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. If a value begins with "v\_", a variable name must follow which has @@ -223,7 +223,7 @@ atom-style variables can be used, which produce a global or per-atom vector respectively. The vector-style variable must be used without a bracketed term. See the :doc:`variable ` command for details. -Note that variables of style *equal*\ , *vector*\ , and *atom* define a +Note that variables of style *equal*, *vector*, and *atom* define a formula which can reference individual atom properties or thermodynamic keywords, or they can invoke other computes, fixes, or variables when they are evaluated, so this is a very general means of @@ -233,9 +233,9 @@ specifying quantities to histogram. Additional optional keywords also affect the operation of this fix. -If the *mode* keyword is set to *scalar*\ , then all input values must +If the *mode* keyword is set to *scalar*, then all input values must be global scalars, or elements of global vectors. If the *mode* -keyword is set to *vector*\ , then all input values must be global or +keyword is set to *vector*, then all input values must be global or per-atom or local vectors, or columns of global or per-atom or local arrays. @@ -263,14 +263,14 @@ values > *hi* are counted in the last bin (Nbins+2). Values between The *ave* keyword determines how the histogram produced every *Nfreq* steps are averaged with histograms produced on previous steps that -were multiples of *Nfreq*\ , before they are accessed by another output +were multiples of *Nfreq*, before they are accessed by another output command or written to a file. -If the *ave* setting is *one*\ , then the histograms produced on +If the *ave* setting is *one*, then the histograms produced on timesteps that are multiples of *Nfreq* are independent of each other; they are output as-is without further averaging. -If the *ave* setting is *running*\ , then the histograms produced on +If the *ave* setting is *running*, then the histograms produced on timesteps that are multiples of *Nfreq* are summed and averaged in a cumulative sense before being output. Each bin value in the histogram is thus the average of the bin value produced on that timestep with @@ -279,7 +279,7 @@ when the fix is defined; it can only be restarted by deleting the fix via the :doc:`unfix ` command, or by re-defining the fix by re-specifying it. -If the *ave* setting is *window*\ , then the histograms produced on +If the *ave* setting is *window*, then the histograms produced on timesteps that are multiples of *Nfreq* are summed within a moving "window" of time, so that the last M histograms are used to produce the output. E.g. if M = 3 and Nfreq = 1000, then the output on step diff --git a/doc/src/fix_ave_time.rst b/doc/src/fix_ave_time.rst index ad1aca233c..dfa385ea46 100644 --- a/doc/src/fix_ave_time.rst +++ b/doc/src/fix_ave_time.rst @@ -136,7 +136,7 @@ with 3 columns, each of length 50: ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be used in order to contribute to the average. The final averaged quantities are generated on timesteps that are a multiple of *Nfreq*\ . The average is over *Nrepeat* @@ -185,7 +185,7 @@ for how I can be specified with a wildcard asterisk to effectively specify multiple values. Note that some fixes only produce their values on certain timesteps, -which must be compatible with *Nevery*\ , else an error will result. +which must be compatible with *Nevery*, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. If a value begins with "v\_", a variable name must follow which has @@ -207,23 +207,23 @@ quantities to time average. Additional optional keywords also affect the operation of this fix. -If the *mode* keyword is set to *scalar*\ , then all input values must +If the *mode* keyword is set to *scalar*, then all input values must be global scalars, or elements of global vectors. If the *mode* -keyword is set to *vector*\ , then all input values must be global +keyword is set to *vector*, then all input values must be global vectors, or columns of global arrays. They can also be global arrays, which are converted into a series of global vectors (one per column), as explained above. The *ave* keyword determines how the values produced every *Nfreq* steps are averaged with values produced on previous steps that were -multiples of *Nfreq*\ , before they are accessed by another output +multiples of *Nfreq*, before they are accessed by another output command or written to a file. -If the *ave* setting is *one*\ , then the values produced on timesteps +If the *ave* setting is *one*, then the values produced on timesteps that are multiples of *Nfreq* are independent of each other; they are output as-is without further averaging. -If the *ave* setting is *running*\ , then the values produced on +If the *ave* setting is *running*, then the values produced on timesteps that are multiples of *Nfreq* are summed and averaged in a cumulative sense before being output. Each output value is thus the average of the value produced on that timestep with all preceding @@ -231,7 +231,7 @@ values. This running average begins when the fix is defined; it can only be restarted by deleting the fix via the :doc:`unfix ` command, or by re-defining the fix by re-specifying it. -If the *ave* setting is *window*\ , then the values produced on +If the *ave* setting is *window*, then the values produced on timesteps that are multiples of *Nfreq* are summed and averaged within a moving "window" of time, so that the last M values are used to produce the output. E.g. if M = 3 and Nfreq = 1000, then the output @@ -332,7 +332,7 @@ element are "intensive" or "extensive". If the fix produces an array, then all elements in the array must be the same, either "intensive" or "extensive". If a compute or fix provides the value being time averaged, then the compute or fix determines whether the value is -intensive or extensive; see the doc page for that compute or fix for +intensive or extensive; see the page for that compute or fix for further info. Values produced by a variable are treated as intensive. No parameter of this fix can be used with the *start/stop* keywords of diff --git a/doc/src/fix_aveforce.rst b/doc/src/fix_aveforce.rst index 36e1e28ea6..414fa497ed 100644 --- a/doc/src/fix_aveforce.rst +++ b/doc/src/fix_aveforce.rst @@ -54,7 +54,7 @@ same as specifying a 0.0 value, since that sets all forces to the same average value without adding in any additional force. Any of the 3 quantities defining the force components can be specified -as an equal-style :doc:`variable `, namely *fx*\ , *fy*\ , *fz*\ . +as an equal-style :doc:`variable `, namely *fx*, *fy*, *fz*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to determine the average diff --git a/doc/src/fix_balance.rst b/doc/src/fix_balance.rst index 8bab8ebefc..b0f070e5e4 100644 --- a/doc/src/fix_balance.rst +++ b/doc/src/fix_balance.rst @@ -222,7 +222,7 @@ once. You should normally only list dimensions where you expect there to be a density variation in the particles. Balancing proceeds by adjusting the cutting planes in each of the -dimensions listed in *dimstr*\ , one dimension at a time. For a single +dimensions listed in *dimstr*, one dimension at a time. For a single dimension, the balancing operation (described below) is iterated on up to *Niter* times. After each dimension finishes, the imbalance factor is re-computed, and the balancing operation halts if the *stopthresh* diff --git a/doc/src/fix_bocs.rst b/doc/src/fix_bocs.rst index c6c7ed41aa..566bf8e68d 100644 --- a/doc/src/fix_bocs.rst +++ b/doc/src/fix_bocs.rst @@ -41,10 +41,10 @@ The first half of the command mimics a standard fix npt command: fix 1 all bocs temp Tstart Tstop Tcoupl cgiso Pstart Pstop Pdamp -The two differences are replacing *npt* with *bocs*\ , and replacing +The two differences are replacing *npt* with *bocs*, and replacing *iso*\ /\ *aniso*\ /\ *etc* with *cgiso*\ . The rest of the command details what form you would like to use for -the pressure correction equation. The choices are: *analytic*\ , *linear_spline*, +the pressure correction equation. The choices are: *analytic*, *linear_spline*, or *cubic_spline*. With either spline method, the only argument that needs to follow it @@ -58,7 +58,7 @@ as a function of volume. The file must be formatted so each line has: Note both the COMMA and the SPACE separating the volume's value and its corresponding pressure correction. The volumes in the file must be uniformly spaced. Both the volumes and the pressure corrections -should be provided in the proper units, e.g. if you are using *units real*\ , +should be provided in the proper units, e.g. if you are using *units real*, the volumes should all be in cubic angstroms, and the pressure corrections should all be in atmospheres. Furthermore, the table should start/end at a volume considerably smaller/larger than you expect your system to sample @@ -72,7 +72,7 @@ With the *analytic* option, the arguments are as follows: ... analytic V_avg N_particles N_coeff Coeff_1 Coeff_2 ... Coeff_N Note that *V_avg* and *Coeff_i* should all be in the proper units, e.g. if you -are using *units real*\ , *V_avg* should be in cubic angstroms, and the +are using *units real*, *V_avg* should be in cubic angstroms, and the coefficients should all be in atmospheres \* cubic angstroms. ---------- @@ -125,7 +125,7 @@ XXXX_press, where XXXX is the ID given to the fix bocs command (in the example, the ID of the fix bocs command is 1 ). This fix is part of the BOCS package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Further information """"""""""""""""""" diff --git a/doc/src/fix_bond_break.rst b/doc/src/fix_bond_break.rst index 4f2e2840ab..9538fa8ef3 100644 --- a/doc/src/fix_bond_break.rst +++ b/doc/src/fix_bond_break.rst @@ -51,7 +51,7 @@ interactions from timestep to timestep as atoms move. A check for possible bond breakage is performed every *Nevery* timesteps. If two bonded atoms I,J are further than a distance *Rmax* -of each other, if the bond is of type *bondtype*\ , and if both I and J +of each other, if the bond is of type *bondtype*, and if both I and J are in the specified fix group, then I,J is labeled as a "possible" bond to break. diff --git a/doc/src/fix_bond_create.rst b/doc/src/fix_bond_create.rst index 34f0d19f8d..c286482f81 100644 --- a/doc/src/fix_bond_create.rst +++ b/doc/src/fix_bond_create.rst @@ -64,7 +64,7 @@ context, a bond means an interaction between a pair of atoms computed by the :doc:`bond_style ` command. Once the bond is created it will be permanently in place. Optionally, the creation of a bond can also create angle, dihedral, and improper interactions that bond -is part of. See the discussion of the *atype*\ , *dtype*\ , and *itype* +is part of. See the discussion of the *atype*, *dtype*, and *itype* keywords below. This is different than a :doc:`pairwise ` bond-order @@ -75,7 +75,7 @@ interactions from timestep to timestep as atoms move. A check for possible new bonds is performed every *Nevery* timesteps. If two atoms I,J are within a distance *Rmin* of each other, if I is -of atom type *itype*\ , if J is of atom type *jtype*\ , if both I and J +of atom type *itype*, if J is of atom type *jtype*, if both I and J are in the specified fix group, if a bond does not already exist between I and J, and if both I and J meet their respective *maxbond* requirement (explained below), then I,J is labeled as a "possible" @@ -133,7 +133,7 @@ When a bond is created, data structures within LAMMPS that store bond topology are updated to reflect the creation. If the bond is part of new 3-body (angle) or 4-body (dihedral, improper) interactions, you can choose to create new angles, dihedrals, impropers as well, using -the *atype*\ , *dtype*\ , and *itype* keywords. All of these changes +the *atype*, *dtype*, and *itype* keywords. All of these changes typically affect pairwise interactions between atoms that are now part of new bonds, angles, etc. @@ -147,7 +147,7 @@ of new bonds, angles, etc. If the *atype* keyword is used and if an angle potential is defined via the :doc:`angle_style ` command, then any new 3-body interactions inferred by the creation of a bond will create new angles -of type *angletype*\ , with parameters assigned by the corresponding +of type *angletype*, with parameters assigned by the corresponding :doc:`angle_coeff ` command. Likewise, the *dtype* and *itype* keywords will create new dihedrals and impropers of type *dihedraltype* and *impropertype*\ . @@ -183,7 +183,7 @@ of type *angletype*\ , with parameters assigned by the corresponding .. note:: - Even if you do not use the *atype*\ , *dtype*\ , or *itype* + Even if you do not use the *atype*, *dtype*, or *itype* keywords, the list of topological neighbors is updated for atoms affected by the new bond. This in turn affects which neighbors are considered for pairwise interactions, using the weighting rules set by diff --git a/doc/src/fix_bond_react.rst b/doc/src/fix_bond_react.rst index baf7985ef5..a48675dcf2 100644 --- a/doc/src/fix_bond_react.rst +++ b/doc/src/fix_bond_react.rst @@ -424,7 +424,7 @@ The constraint of type 'angle' has the following syntax: angle *ID1* *ID2* *ID3* *amin* *amax* -where 'angle' is the required keyword, *ID1*\ , *ID2* and *ID3* are +where 'angle' is the required keyword, *ID1*, *ID2* and *ID3* are pre-reaction atom IDs (or molecule-fragment IDs, see below), and these three atoms must form an angle between *amin* and *amax* for the reaction to occur (where *ID2* is the central atom). Angles must be @@ -437,7 +437,7 @@ The constraint of type 'dihedral' has the following syntax: dihedral *ID1* *ID2* *ID3* *ID4* *amin* *amax* *amin2* *amax2* -where 'dihedral' is the required keyword, and *ID1*\ , *ID2*\ , *ID3* +where 'dihedral' is the required keyword, and *ID1*, *ID2*, *ID3* and *ID4* are pre-reaction atom IDs (or molecule-fragment IDs, see below). Dihedral angles are calculated in the interval (-180,180]. Refer to the :doc:`dihedral style ` documentation for @@ -669,7 +669,7 @@ Restrictions This fix is part of the REACTION package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 248c4cc8e9..71bb122c90 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -67,7 +67,7 @@ initial swap. For each monomer A1, its neighbors are examined to find a possible B1 monomer. Both A1 and B1 must be in the fix group, their separation -must be less than the specified *cutoff*\ , and the molecule IDs of A1 +must be less than the specified *cutoff*, and the molecule IDs of A1 and B1 must be the same (see below). If a suitable partner is found, the energy change due to swapping the 2 bonds is computed. This includes changes in pairwise, bond, and angle energies due to the @@ -117,7 +117,7 @@ ends of a chain swap with each other. This fix computes a temperature each time it is invoked for use by the Boltzmann criterion. To do this, the fix creates its own compute of -style *temp*\ , as if this command had been issued: +style *temp*, as if this command had been issued: .. code-block:: LAMMPS diff --git a/doc/src/fix_box_relax.rst b/doc/src/fix_box_relax.rst index 7a9abdfe26..5827fe3732 100644 --- a/doc/src/fix_box_relax.rst +++ b/doc/src/fix_box_relax.rst @@ -53,7 +53,7 @@ pressure typically allows the box to expand. ---------- The external pressure tensor is specified using one or more of the -*iso*\ , *aniso*\ , *tri*\ , *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , *yz*\ , and *couple* +*iso*, *aniso*, *tri*, *x*, *y*, *z*, *xy*, *xz*, *yz*, and *couple* keywords. These keywords give you the ability to specify all 6 components of an external stress tensor, and to couple various of these components together so that the dimensions they represent are @@ -66,25 +66,25 @@ specify whether the simulation box is orthogonal or non-orthogonal (triclinic) and explain the meaning of the xy,xz,yz tilt factors. The target pressures *Ptarget* for each of the 6 components of the -stress tensor can be specified independently via the *x*\ , *y*\ , *z*\ , -*xy*\ , *xz*\ , *yz* keywords, which correspond to the 6 simulation box +stress tensor can be specified independently via the *x*, *y*, *z*, +*xy*, *xz*, *yz* keywords, which correspond to the 6 simulation box dimensions. For example, if the *y* keyword is used, the y-box length will change during the minimization. If the *xy* keyword is used, the xy tilt factor will change. A box dimension will not change if that component is not specified. -Note that in order to use the *xy*\ , *xz*\ , or *yz* keywords, the +Note that in order to use the *xy*, *xz*, or *yz* keywords, the simulation box must be triclinic, even if its initial tilt factors are 0.0. When the size of the simulation box changes, all atoms are re-scaled to new positions, unless the keyword *dilate* is specified with a -value of *partial*\ , in which case only the atoms in the fix group are +value of *partial*, in which case only the atoms in the fix group are re-scaled. This can be useful for leaving the coordinates of atoms in a solid substrate unchanged and controlling the pressure of a surrounding fluid. -The *scaleyz*\ , *scalexz*\ , and *scalexy* keywords control whether or +The *scaleyz*, *scalexz*, and *scalexy* keywords control whether or not the corresponding tilt factors are scaled with the associated box dimensions when relaxing triclinic periodic cells. The default values *yes* will turn on scaling, which corresponds to adjusting the @@ -99,7 +99,7 @@ The *fixedpoint* keyword specifies the fixed point for cell relaxation. By default, it is the center of the box. Whatever point is chosen will not move during the simulation. For example, if the lower periodic boundaries pass through (0,0,0), and this point is provided -to *fixedpoint*\ , then the lower periodic boundaries will remain at +to *fixedpoint*, then the lower periodic boundaries will remain at (0,0,0), while the upper periodic boundaries will move twice as far. In all cases, the particle positions at each iteration are unaffected by the chosen value, except that all particles are @@ -107,7 +107,7 @@ displaced by the same amount, different on each iteration. .. note:: - Applying an external pressure to tilt dimensions *xy*\ , *xz*\ , *yz* + Applying an external pressure to tilt dimensions *xy*, *xz*, *yz* can sometimes result in arbitrarily large values of the tilt factors, i.e. a dramatically deformed simulation box. This typically indicates that there is something badly wrong with how the simulation was @@ -149,7 +149,7 @@ simply ignored. ---------- -The *iso*\ , *aniso*\ , and *tri* keywords are simply shortcuts that are +The *iso*, *aniso*, and *tri* keywords are simply shortcuts that are equivalent to specifying several other keywords together. The keyword *iso* means couple all 3 diagonal components together when @@ -164,8 +164,8 @@ these 4 keywords: z Ptarget couple xyz -The keyword *aniso* means *x*\ , *y*\ , and *z* dimensions are controlled -independently using the *Pxx*\ , *Pyy*\ , and *Pzz* components of the +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the stress tensor as the driving forces, and the specified scalar external pressure. Using "aniso Ptarget" is the same as specifying these 4 keywords: @@ -177,7 +177,7 @@ keywords: z Ptarget couple none -The keyword *tri* means *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , and *yz* dimensions +The keyword *tri* means *x*, *y*, *z*, *xy*, *xz*, and *yz* dimensions are controlled independently using their individual stress components as the driving forces, and the specified scalar pressure as the external normal stress. Using "tri Ptarget" is the same as specifying @@ -246,7 +246,7 @@ minimization steps, the reference dimensions are set to those of the current simulation domain. Note that resetting the reference dimensions changes the objective function and gradients, which sometimes causes the minimization to fail. This can be resolved by -changing the value of *nreset*\ , or simply continuing the minimization +changing the value of *nreset*, or simply continuing the minimization from a restart file. .. note:: @@ -362,8 +362,8 @@ Restrictions """""""""""" Only dimensions that are available can be adjusted by this fix. -Non-periodic dimensions are not available. *z*\ , *xz*\ , and *yz*\ , are -not available for 2D simulations. *xy*\ , *xz*\ , and *yz* are only +Non-periodic dimensions are not available. *z*, *xz*, and *yz*, are +not available for 2D simulations. *xy*, *xz*, and *yz* are only available if the simulation domain is non-orthogonal. The :doc:`create_box `, :doc:`read data `, and :doc:`read_restart ` commands specify whether the @@ -371,10 +371,10 @@ simulation box is orthogonal or non-orthogonal (triclinic) and explain the meaning of the xy,xz,yz tilt factors. The *scaleyz yes* and *scalexz yes* keyword/value pairs can not be used -for 2D simulations. *scaleyz yes*\ , *scalexz yes*\ , and *scalexy yes* options +for 2D simulations. *scaleyz yes*, *scalexz yes*, and *scalexy yes* options can only be used if the second dimension in the keyword is periodic, and if the tilt factor is not coupled to the barostat via keywords -*tri*\ , *yz*\ , *xz*\ , and *xy*\ . +*tri*, *yz*, *xz*, and *xy*\ . Related commands """""""""""""""" diff --git a/doc/src/fix_charge_regulation.rst b/doc/src/fix_charge_regulation.rst index 06c1d92b79..9ff28b6ac3 100644 --- a/doc/src/fix_charge_regulation.rst +++ b/doc/src/fix_charge_regulation.rst @@ -227,7 +227,7 @@ Restrictions This fix is part of the MC package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. The :doc:`atom_style `, used must contain the charge property, for example, the style could be *charge* or *full*. Only diff --git a/doc/src/fix_client_md.rst b/doc/src/fix_client_md.rst index 3bcc6bdaa5..a688d38e25 100644 --- a/doc/src/fix_client_md.rst +++ b/doc/src/fix_client_md.rst @@ -27,7 +27,7 @@ This fix style enables LAMMPS to run as a "client" code and communicate each timestep with a separate "server" code to perform an MD simulation together. -The :doc:`Howto client/server ` doc page gives an +The :doc:`Howto client/server ` page gives an overview of client/server coupling of LAMMPS with another code where one code is the "client" and sends request messages to a "server" code. The server responds to each request with a reply message. This @@ -101,7 +101,7 @@ Restrictions This fix is part of the MESSAGE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. A script that uses this command must also use the :doc:`message ` command to setup and shut down the messaging diff --git a/doc/src/fix_cmap.rst b/doc/src/fix_cmap.rst index e6e8d0c627..6475e538a2 100644 --- a/doc/src/fix_cmap.rst +++ b/doc/src/fix_cmap.rst @@ -73,7 +73,7 @@ remaining 5 columns are the atom IDs of the atoms in the two 4-atom dihedrals that overlap to create the CMAP 5-body interaction. Note that the "crossterm" and "CMAP" keywords for the header and body sections match those specified in the read_data command following the -data file name; see the :doc:`read_data ` doc page for +data file name; see the :doc:`read_data ` page for more details. A data file containing CMAP cross-terms can be generated from a PDB @@ -147,7 +147,7 @@ To function as expected this fix command must be issued *before* a :doc:`read_restart ` command. This fix can only be used if LAMMPS was built with the MOLECULE -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/fix_colvars.rst b/doc/src/fix_colvars.rst index 6de30a3d84..21b235cb6b 100644 --- a/doc/src/fix_colvars.rst +++ b/doc/src/fix_colvars.rst @@ -80,7 +80,7 @@ that will be used in the colvars module. The *unwrap* keyword controls whether wrapped or unwrapped coordinates are passed to the colvars library for calculation of the collective -variables and the resulting forces. The default is *yes*\ , i.e. to use +variables and the resulting forces. The default is *yes*, i.e. to use the image flags to reconstruct the absolute atom positions. Setting this to *no* will use the current local coordinates that are wrapped back into the simulation cell at each re-neighboring instead. @@ -124,7 +124,7 @@ Restrictions This fix is part of the COLVARS package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. There can only be one colvars fix active at a time. Since the interface communicates only the minimum amount of information and colvars module diff --git a/doc/src/fix_controller.rst b/doc/src/fix_controller.rst index 0b7332cdd7..0ff38ae010 100644 --- a/doc/src/fix_controller.rst +++ b/doc/src/fix_controller.rst @@ -127,17 +127,17 @@ When choosing the values of the four constants, it is best to first pick a value and sign for :math:`\alpha` that is consistent with the magnitudes and signs of *pvar* and *cvar*\ . The magnitude of :math:`K_p` should then be tested over a large positive range keeping :math:`K_i = K_d =0`. -A good value for :math:`K_p` will produce a fast response in *pvar*\ , +A good value for :math:`K_p` will produce a fast response in *pvar*, without overshooting the *setpoint*\ . For many applications, proportional feedback is sufficient, and so :math:`K_i` = K_d =0` can be used. In cases where there is a substantial lag time in the response of *pvar* to a change -in *cvar*\ , this can be counteracted by increasing :math:`K_d`. In situations -where *pvar* plateaus without reaching *setpoint*\ , this can be +in *cvar*, this can be counteracted by increasing :math:`K_d`. In situations +where *pvar* plateaus without reaching *setpoint*, this can be counteracted by increasing :math:`K_i`. In the language of Charles Dickens, :math:`K_p` represents the error of the present, :math:`K_i` the error of the past, and :math:`K_d` the error yet to come. -Because this fix updates *cvar*\ , but does not initialize its value, +Because this fix updates *cvar*, but does not initialize its value, the initial value is that assigned by the user in the input script via the :doc:`internal-style variable ` command. This value is used (by the other LAMMPS command that used the variable) until this @@ -162,7 +162,7 @@ used. Users can also write code for their own compute styles and :doc:`add them If *pvar* begins with "f\_", a fix ID must follow which has been previously defined in the input script and which generates a global -scalar or vector. See the individual :doc:`fix ` doc page for +scalar or vector. See the individual :doc:`fix ` page for details. Note that some fixes only produce their values on certain timesteps, which must be compatible with when fix controller references the values, or else an error results. If no bracketed integer @@ -215,7 +215,9 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" - none + +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_deform.rst b/doc/src/fix_deform.rst index 90192c6c00..a21a3a6044 100644 --- a/doc/src/fix_deform.rst +++ b/doc/src/fix_deform.rst @@ -21,7 +21,7 @@ Syntax .. parsed-literal:: parameter = *x* or *y* or *z* or *xy* or *xz* or *yz* - *x*\ , *y*\ , *z* args = style value(s) + *x*, *y*, *z* args = style value(s) style = *final* or *delta* or *scale* or *vel* or *erate* or *trate* or *volume* or *wiggle* or *variable* *final* values = lo hi lo hi = box boundaries at end of run (distance units) @@ -43,7 +43,7 @@ Syntax *variable* values = v_name1 v_name2 v_name1 = variable with name1 for box length change as function of time v_name2 = variable with name2 for change rate as function of time - *xy*\ , *xz*\ , *yz* args = style value + *xy*, *xz*, *yz* args = style value style = *final* or *delta* or *vel* or *erate* or *trate* or *wiggle* *final* value = tilt tilt = tilt factor at end of run (distance units) @@ -102,8 +102,8 @@ of a continuously strained system. See the :doc:`fix nvt/sllod ` that simulation of a continuously extended system (extensional flow) can be modeled using the :ref:`UEF package ` and its :doc:`fix commands `. -For the *x*\ , *y*\ , *z* parameters, the associated dimension cannot be -shrink-wrapped. For the *xy*\ , *yz*\ , *xz* parameters, the associated +For the *x*, *y*, *z* parameters, the associated dimension cannot be +shrink-wrapped. For the *xy*, *yz*, *xz* parameters, the associated second dimension cannot be shrink-wrapped. Dimensions not varied by this command can be periodic or non-periodic. Dimensions corresponding to unspecified parameters can also be controlled by a :doc:`fix npt ` or :doc:`fix nph ` command. @@ -127,29 +127,29 @@ and final values. ---------- -For the *x*\ , *y*\ , and *z* parameters, this is the meaning of their +For the *x*, *y*, and *z* parameters, this is the meaning of their styles and values. -The *final*\ , *delta*\ , *scale*\ , *vel*\ , and *erate* styles all change +The *final*, *delta*, *scale*, *vel*, and *erate* styles all change the specified dimension of the box via "constant displacement" which is effectively a "constant engineering strain rate". This means the box dimension changes linearly with time from its initial to final value. -For style *final*\ , the final lo and hi box boundaries of a dimension +For style *final*, the final lo and hi box boundaries of a dimension are specified. The values can be in lattice or box distance units. See the discussion of the units keyword below. -For style *delta*\ , plus or minus changes in the lo/hi box boundaries +For style *delta*, plus or minus changes in the lo/hi box boundaries of a dimension are specified. The values can be in lattice or box distance units. See the discussion of the units keyword below. -For style *scale*\ , a multiplicative factor to apply to the box length +For style *scale*, a multiplicative factor to apply to the box length of a dimension is specified. For example, if the initial box length is 10, and the factor is 1.1, then the final box length will be 11. A factor less than 1.0 means compression. -For style *vel*\ , a velocity at which the box length changes is +For style *vel*, a velocity at which the box length changes is specified in units of distance/time. This is effectively a "constant engineering strain rate", where rate = V/L0 and L0 is the initial box length. The distance can be in lattice or box distance units. See @@ -207,7 +207,7 @@ triple every picosecond. R = ln(0.99) means the box length will shrink by 1% of its current length every picosecond. Note that for a "true" rate the change is continuous and based on the current length, so running with R = ln(2) for 10 picoseconds does not expand the box -length by a factor of 11 as it would with *erate*\ , but by a factor of +length by a factor of 11 as it would with *erate*, but by a factor of 1024 since the box length will double every picosecond. Note that to change the volume (or cross-sectional area) of the @@ -288,30 +288,30 @@ assume that the current timestep = 0. variable rate equal "2*PI*v_A/v_Tp * cos(2*PI * step*dt/v_Tp)" fix 2 all deform 1 x variable v_displace v_rate remap v -For the *scale*\ , *vel*\ , *erate*\ , *trate*\ , *volume*\ , *wiggle*\ , and +For the *scale*, *vel*, *erate*, *trate*, *volume*, *wiggle*, and *variable* styles, the box length is expanded or compressed around its mid point. ---------- -For the *xy*\ , *xz*\ , and *yz* parameters, this is the meaning of their +For the *xy*, *xz*, and *yz* parameters, this is the meaning of their styles and values. Note that changing the tilt factors of a triclinic box does not change its volume. -The *final*\ , *delta*\ , *vel*\ , and *erate* styles all change the shear +The *final*, *delta*, *vel*, and *erate* styles all change the shear strain at a "constant engineering shear strain rate". This means the tilt factor changes linearly with time from its initial to final value. -For style *final*\ , the final tilt factor is specified. The value +For style *final*, the final tilt factor is specified. The value can be in lattice or box distance units. See the discussion of the units keyword below. -For style *delta*\ , a plus or minus change in the tilt factor is +For style *delta*, a plus or minus change in the tilt factor is specified. The value can be in lattice or box distance units. See the discussion of the units keyword below. -For style *vel*\ , a velocity at which the tilt factor changes is +For style *vel*, a velocity at which the tilt factor changes is specified in units of distance/time. This is effectively an "engineering shear strain rate", where rate = V/L0 and L0 is the initial box length perpendicular to the direction of shear. The @@ -449,7 +449,7 @@ example), then configurations with tilt = ..., -15, -5, 5, 15, 25, ... are all equivalent. To obey this constraint and allow for large shear deformations to be -applied via the *xy*\ , *xz*\ , or *yz* parameters, the following +applied via the *xy*, *xz*, or *yz* parameters, the following algorithm is used. If *prd* is the associated parallel box length (10 in the example above), then if the tilt factor exceeds the accepted range of -5 to 5 during the simulation, then the box is flipped to the @@ -476,13 +476,13 @@ Each time the box size or shape is changed, the *remap* keyword determines whether atom positions are remapped to the new box. If *remap* is set to *x* (the default), atoms in the fix group are remapped; otherwise they are not. Note that their velocities are not -changed, just their positions are altered. If *remap* is set to *v*\ , +changed, just their positions are altered. If *remap* is set to *v*, then any atom in the fix group that crosses a periodic boundary will have a delta added to its velocity equal to the difference in velocities between the lo and hi boundaries. Note that this velocity difference can include tilt components, e.g. a delta in the x velocity when an atom crosses the y periodic boundary. If *remap* is set to -*none*\ , then neither of these remappings take place. +*none*, then neither of these remappings take place. Conceptually, setting *remap* to *x* forces the atoms to deform via an affine transformation that exactly matches the box deformation. This @@ -529,20 +529,20 @@ box without explicit remapping of their coordinates. .. note:: If a :doc:`fix rigid ` is defined for rigid bodies, and - *remap* is set to *x*\ , then the center-of-mass coordinates of rigid + *remap* is set to *x*, then the center-of-mass coordinates of rigid bodies will be remapped to the changing simulation box. This will be done regardless of whether atoms in the rigid bodies are in the fix deform group or not. The velocity of the centers of mass are not - remapped even if *remap* is set to *v*\ , since :doc:`fix nvt/sllod ` does not currently do anything special + remapped even if *remap* is set to *v*, since :doc:`fix nvt/sllod ` does not currently do anything special for rigid particles. If you wish to perform a NEMD simulation of rigid particles, you can either thermostat them independently or include a background fluid and thermostat the fluid via :doc:`fix nvt/sllod `. The *flip* keyword allows the tilt factors for a triclinic box to exceed half the distance of the parallel box length, as discussed -above. If the *flip* value is set to *yes*\ , the bound is enforced by +above. If the *flip* value is set to *yes*, the bound is enforced by flipping the box when it is exceeded. If the *flip* value is set to -*no*\ , the tilt will continue to change without flipping. Note that if +*no*, the tilt will continue to change without flipping. Note that if you apply large deformations, this means the box shape can tilt dramatically LAMMPS will run less efficiently, due to the large volume of communication needed to acquire ghost atoms around a processor's @@ -557,8 +557,8 @@ in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacing. Note that the units choice also affects the *vel* style parameters since it is defined in terms of distance/time. Also note that the units keyword -does not affect the *variable* style. You should use the *xlat*\ , -*ylat*\ , *zlat* keywords of the :doc:`thermo_style ` +does not affect the *variable* style. You should use the *xlat*, +*ylat*, *zlat* keywords of the :doc:`thermo_style ` command if you want to include lattice spacings in a variable formula. ---------- diff --git a/doc/src/fix_deposit.rst b/doc/src/fix_deposit.rst index 42975eb0b2..ad3c37b24c 100644 --- a/doc/src/fix_deposit.rst +++ b/doc/src/fix_deposit.rst @@ -220,7 +220,7 @@ ignored if the *global* or *local* keywords are used, since those options choose a z-coordinate for insertion independently. The vx, vy, and vz components of velocity for the inserted particle -are set using the values specified for the *vx*\ , *vy*\ , and *vz* +are set using the values specified for the *vx*, *vy*, and *vz* keywords. Note that normally, new particles should be a assigned a negative vertical velocity so that they move towards the surface. For molecules, the same velocity is given to every particle (no rotation @@ -296,9 +296,6 @@ of this fix can be used with the *start/stop* keywords of the Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. - The specified insertion region cannot be a "dynamic" region, as defined by the :doc:`region ` command. diff --git a/doc/src/fix_dpd_energy.rst b/doc/src/fix_dpd_energy.rst index a1e8ef2faf..d6e8dd7230 100644 --- a/doc/src/fix_dpd_energy.rst +++ b/doc/src/fix_dpd_energy.rst @@ -32,7 +32,7 @@ the group at each timestep. It must be used in conjunction with a deterministic integrator (e.g. :doc:`fix nve `) that updates the particle positions and velocities. -For fix *dpd/energy*\ , the particle internal temperature is related to +For fix *dpd/energy*, the particle internal temperature is related to the particle internal energy through a mesoparticle equation of state. An additional fix must be specified that defines the equation of state for each particle, e.g. :doc:`fix eos/cv `. @@ -41,9 +41,9 @@ This fix must be used with the :doc:`pair_style dpd/fdt/energy ` com Note that numerous variants of DPD can be specified by choosing an appropriate combination of the integrator and :doc:`pair_style dpd/fdt/energy ` command. DPD under isoenergetic conditions -can be specified by using fix *dpd/energy*\ , fix *nve* and pair_style +can be specified by using fix *dpd/energy*, fix *nve* and pair_style *dpd/fdt/energy*\ . DPD under isoenthalpic conditions can -be specified by using fix *dpd/energy*\ , fix *nph* and pair_style +be specified by using fix *dpd/energy*, fix *nph* and pair_style *dpd/fdt/energy*\ . Examples of each DPD variant are provided in the examples/PACKAGES/dpd-react directory. @@ -57,7 +57,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This fix must be used with an additional fix that specifies time integration, e.g. :doc:`fix nve `. diff --git a/doc/src/fix_dpd_source.rst b/doc/src/fix_dpd_source.rst index 5e1b92ae66..ef1a70c3d4 100644 --- a/doc/src/fix_dpd_source.rst +++ b/doc/src/fix_dpd_source.rst @@ -78,7 +78,7 @@ Restrictions """""""""""" This fix is part of the DPD-MESO package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Fix *edpd/source* must be used with the :doc:`pair_style edpd ` command. Fix *tdpd/source* must be used with the :doc:`pair_style tdpd ` command. diff --git a/doc/src/fix_drag.rst b/doc/src/fix_drag.rst index 6bf9b909c6..3bfc5420de 100644 --- a/doc/src/fix_drag.rst +++ b/doc/src/fix_drag.rst @@ -57,7 +57,9 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" - none + +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_drude_transform.rst b/doc/src/fix_drude_transform.rst index 9943ea0710..bd63a411be 100644 --- a/doc/src/fix_drude_transform.rst +++ b/doc/src/fix_drude_transform.rst @@ -152,7 +152,7 @@ temperatures of cores and Drude particles, in center-of-mass and relative coordinates, are calculated using :doc:`compute temp/drude ` In addition, if you want to use a barostat to simulate a system at -constant pressure, only one of the Nose-Hoover fixes must be *npt*\ , +constant pressure, only one of the Nose-Hoover fixes must be *npt*, the other one should be *nvt*\ . You must add a *compute temp/com* and a *fix_modify* command so that the temperature of the *npt* fix be just that of its group (the Drude cores) but the pressure be the overall diff --git a/doc/src/fix_dt_reset.rst b/doc/src/fix_dt_reset.rst index a413f8f60d..c3aa431e18 100644 --- a/doc/src/fix_dt_reset.rst +++ b/doc/src/fix_dt_reset.rst @@ -59,7 +59,7 @@ displace *Xmax* on the next integration step, as a function of its current velocity and force. Since performing this calculation exactly would require the solution to a quartic equation, a cheaper estimate is generated. The estimate is conservative in that the atom's -displacement is guaranteed not to exceed *Xmax*\ , though it may be +displacement is guaranteed not to exceed *Xmax*, though it may be smaller. In addition if the *emax* keyword is used, the specified *Emax* value @@ -72,7 +72,7 @@ across all atoms is computed. Then the *Tmin* and *Tmax* bounds are applied, if specified. If one (or both) is specified as NULL, it is not applied. -When the :doc:`run style ` is *respa*\ , this fix resets the +When the :doc:`run style ` is *respa*, this fix resets the outer loop (largest) timestep, which is the same timestep that the :doc:`timestep ` command sets. diff --git a/doc/src/fix_efield.rst b/doc/src/fix_efield.rst index 86dcda9bc5..7d958e0afe 100644 --- a/doc/src/fix_efield.rst +++ b/doc/src/fix_efield.rst @@ -42,7 +42,7 @@ external electric field. For charges, any of the 3 quantities defining the E-field components can be specified as an equal-style or atom-style -:doc:`variable `, namely *ex*\ , *ey*\ , *ez*\ . If the value is a +:doc:`variable `, namely *ex*, *ey*, *ez*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to determine the E-field component. @@ -100,8 +100,8 @@ minimize the orientation of dipoles in an applied electric field. The *energy* keyword specifies the name of an atom-style :doc:`variable ` which is used to compute the energy of each -atom as function of its position. Like variables used for *ex*\ , -*ey*\ , *ez*\ , the energy variable is specified as v_name, where name +atom as function of its position. Like variables used for *ex*, +*ey*, *ez*, the energy variable is specified as v_name, where name is the variable name. Note that when the *energy* keyword is used during an energy @@ -169,8 +169,7 @@ the iteration count during the minimization. Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +None Related commands """""""""""""""" diff --git a/doc/src/fix_ehex.rst b/doc/src/fix_ehex.rst index 2065ec5033..186ed7065e 100644 --- a/doc/src/fix_ehex.rst +++ b/doc/src/fix_ehex.rst @@ -92,7 +92,7 @@ The thermostatting force is given by where :math:`m_i` is the mass and :math:`k(\mathbf r_i)` maps the particle position to the respective reservoir. The quantity :math:`F_{\Gamma_{k(\mathbf r_i)}}` corresponds to the input parameter -*F*\ , which is the energy flux into the reservoir. Furthermore, +*F*, which is the energy flux into the reservoir. Furthermore, :math:`K_{\Gamma_{k(\mathbf r_i)}}` and :math:`v_{\Gamma_{k(\mathbf r_i)}}` denote the non-translational kinetic energy and the center of mass velocity of that reservoir. The thermostatting force does not affect @@ -176,7 +176,7 @@ Restrictions """""""""""" This fix is part of the RIGID package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_electron_stopping.rst b/doc/src/fix_electron_stopping.rst index d2bc65608d..fa0fc763f5 100644 --- a/doc/src/fix_electron_stopping.rst +++ b/doc/src/fix_electron_stopping.rst @@ -92,7 +92,7 @@ its velocity and :math:`S_e` is the stopping power of the ion. atomic subsystems with the two-temperature model (:doc:`fix_ttm `). At low velocities the electronic stopping is negligible. The electronic -friction is not applied to atoms whose kinetic energy is smaller than *Ecut*\ , +friction is not applied to atoms whose kinetic energy is smaller than *Ecut*, or smaller than the lowest energy value given in the table in *file*\ . Electronic stopping should be applied only when a projectile reaches bulk material. This fix scans neighbor list and excludes atoms with fewer than @@ -133,7 +133,7 @@ For example: 750 100 150 If an atom which would have electronic stopping applied to it has a -kinetic energy higher than the largest energy given in *file*\ , LAMMPS +kinetic energy higher than the largest energy given in *file*, LAMMPS will exit with an error message. The stopping power depends on the energy of the ion and the target diff --git a/doc/src/fix_eos_cv.rst b/doc/src/fix_eos_cv.rst index 57f8c914ab..c43b5461b1 100644 --- a/doc/src/fix_eos_cv.rst +++ b/doc/src/fix_eos_cv.rst @@ -44,7 +44,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/fix_eos_table.rst b/doc/src/fix_eos_table.rst index 06310e9685..bfb8ec2c3c 100644 --- a/doc/src/fix_eos_table.rst +++ b/doc/src/fix_eos_table.rst @@ -103,7 +103,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/fix_eos_table_rx.rst b/doc/src/fix_eos_table_rx.rst index eadac5d56c..2e91b7dd88 100644 --- a/doc/src/fix_eos_table_rx.rst +++ b/doc/src/fix_eos_table_rx.rst @@ -48,9 +48,9 @@ computed according to the following relation: U_{i} = \displaystyle\sum_{j=1}^{m} c_{i,j}(u_{j} + \Delta H_{f,j}) + \frac{3k_{b}T}{2} + Nk_{b}T \\ where *m* is the number of species, :math:`c_{i,j}` is the -concentration of species *j* in particle *i*\ , :math:`u_j` is the +concentration of species *j* in particle *i*, :math:`u_j` is the internal energy of species j, :math:`\Delta H_{f,j} is the heat of -formation of species *j*\ , N is the number of molecules represented +formation of species *j*, N is the number of molecules represented by the coarse-grained particle, :math:`k_b` is the Boltzmann constant, and *T* is the temperature of the system. Additionally, it is possible to modify the concentration-dependent particle internal @@ -178,7 +178,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/fix_evaporate.rst b/doc/src/fix_evaporate.rst index 5eae16b196..4fa888273c 100644 --- a/doc/src/fix_evaporate.rst +++ b/doc/src/fix_evaporate.rst @@ -41,14 +41,14 @@ fix group and within the specified region are counted. M of these are chosen at random and deleted. If there are less than M eligible particles, then all of them are deleted. -If the setting for the *molecule* keyword is *no*\ , then only single +If the setting for the *molecule* keyword is *no*, then only single atoms are deleted. In this case, you should insure you do not delete only a portion of a molecule (only some of its atoms), or LAMMPS will soon generate an error when it tries to find those atoms. LAMMPS will warn you if any of the atoms eligible for deletion have a non-zero molecule ID, but does not check for this at the time of deletion. -If the setting for the *molecule* keyword is *yes*\ , then when an atom +If the setting for the *molecule* keyword is *yes*, then when an atom is chosen for deletion, the entire molecule it is part of is deleted. The count of deleted atoms is incremented by the number of atoms in the molecule, which may make it exceed *M*\ . If the molecule ID of the @@ -89,8 +89,7 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +None Related commands """""""""""""""" diff --git a/doc/src/fix_external.rst b/doc/src/fix_external.rst index 938b798ddf..d251eb65e9 100644 --- a/doc/src/fix_external.rst +++ b/doc/src/fix_external.rst @@ -46,7 +46,7 @@ If mode is *pf/callback* then the fix will make a callback every The external program computes forces on atoms by setting values in an array owned by the fix. The fix then adds these forces to each atom in the group, once every *Napply* steps, similar to the way the :doc:`fix addforce ` command works. Note that if *Ncall* > -*Napply*\ , the force values produced by one callback will persist, and +*Napply*, the force values produced by one callback will persist, and be used multiple times to update atom forces. The callback function "foo" is invoked by the fix as: diff --git a/doc/src/fix_ffl.rst b/doc/src/fix_ffl.rst index 02bcaa710d..6058b0ed3e 100644 --- a/doc/src/fix_ffl.rst +++ b/doc/src/fix_ffl.rst @@ -111,7 +111,7 @@ In order to perform constant-pressure simulations please use equations of motion. This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_filter_corotate.rst b/doc/src/fix_filter_corotate.rst index 6bfcad27e8..c0a2216be3 100644 --- a/doc/src/fix_filter_corotate.rst +++ b/doc/src/fix_filter_corotate.rst @@ -73,7 +73,7 @@ Restrictions """""""""""" This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Currently, it does not support :doc:`molecule templates `. diff --git a/doc/src/fix_flow_gauss.rst b/doc/src/fix_flow_gauss.rst index ce114fdfcd..3697142a37 100644 --- a/doc/src/fix_flow_gauss.rst +++ b/doc/src/fix_flow_gauss.rst @@ -81,7 +81,7 @@ above, see the examples/PACKAGES/flow_gauss directory. velocities of the group-ID atoms are coupled to the velocities of other atoms in the simulation, the flux will not be conserved. For example, in a simulation with fluid atoms and harmonically constrained - wall atoms, if a single thermostat is applied to group *all*\ , the + wall atoms, if a single thermostat is applied to group *all*, the fluid atom velocities will be coupled to the wall atom velocities, and the flux will not be conserved. This issue can be avoided by thermostatting the fluid and wall groups separately. @@ -160,7 +160,7 @@ Restrictions This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_freeze.rst b/doc/src/fix_freeze.rst index a7370c7f44..ce79ce3caf 100644 --- a/doc/src/fix_freeze.rst +++ b/doc/src/fix_freeze.rst @@ -59,7 +59,7 @@ Restrictions """""""""""" This fix is part of the GRANULAR package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. There can only be a single freeze fix defined. This is because other the :doc:`granular pair styles ` treat frozen particles diff --git a/doc/src/fix_gcmc.rst b/doc/src/fix_gcmc.rst index e360fab86e..9955390454 100644 --- a/doc/src/fix_gcmc.rst +++ b/doc/src/fix_gcmc.rst @@ -24,7 +24,7 @@ Syntax .. parsed-literal:: - keyword = *mol*\ , *region*\ , *maxangle*\ , *pressure*\ , *fugacity_coeff*, *full_energy*, *charge*\ , *group*\ , *grouptype*\ , *intra_energy*, *tfac_insert*, or *overlap_cutoff* + keyword = *mol*, *region*, *maxangle*, *pressure*, *fugacity_coeff*, *full_energy*, *charge*, *group*, *grouptype*, *intra_energy*, *tfac_insert*, or *overlap_cutoff* *mol* value = template-ID template-ID = ID of molecule template specified in a separate :doc:`molecule ` command *mcmoves* values = Patomtrans Pmoltrans Pmolrotate @@ -208,8 +208,8 @@ their bonds or angles constrained via SHAKE, use the *shake* keyword, specifying as its value the ID of a separate :doc:`fix shake ` command which also appears in your input script. Optionally, users may specify the relative amounts of different MC -moves using the *mcmoves* keyword. The values *Patomtrans*\ , -*Pmoltrans*\ , *Pmolrotate* specify the average proportion of +moves using the *mcmoves* keyword. The values *Patomtrans*, +*Pmoltrans*, *Pmolrotate* specify the average proportion of atom translations, molecule translations, and molecule rotations, respectively. The values must be non-negative integers or real numbers, with at least one non-zero value. For example, (10,30,0) @@ -272,7 +272,7 @@ styles except *lj* it is defined as the thermal de Broglie wavelength \Lambda = \sqrt{ \frac{h^2}{2 \pi m k T}} where *h* is Planck's constant, and *m* is the mass of the exchanged atom -or molecule. For unit style *lj*\ , :math:`\Lambda` is simply set to +or molecule. For unit style *lj*, :math:`\Lambda` is simply set to unity. Note that prior to March 2017, :math:`\Lambda` for unit style *lj* was calculated using the above formula with *h* set to the rather specific value of 0.18292026. Chemical potential under the old definition can diff --git a/doc/src/fix_gld.rst b/doc/src/fix_gld.rst index c47e30a880..d0fd6a4c9e 100644 --- a/doc/src/fix_gld.rst +++ b/doc/src/fix_gld.rst @@ -81,7 +81,7 @@ correlated random forces as specified in the third term of the force. Presently, the Prony series coefficients are limited to being greater than or equal to zero, and the time constants are limited to being greater than zero. To this end, the value of series MUST be set to -*pprony*\ , for now. Future updates will allow for negative coefficients +*pprony*, for now. Future updates will allow for negative coefficients and other representations of the memory kernel. It is with these updates in mind that the series option was included. @@ -107,7 +107,7 @@ The keyword/value option pairs are used in the following ways. The keyword *frozen* can be used to specify how the extended variables associated with the GLD memory kernel are initialized. Specifying no (the default), the initial values are drawn at random from an -equilibrium distribution at *Tstart*\ , consistent with the +equilibrium distribution at *Tstart*, consistent with the Fluctuation-Dissipation Theorem. Specifying yes, initializes the extended variables to zero. @@ -116,7 +116,7 @@ thermostat. Because the random forces on different atoms are independent, they do not sum exactly to zero. As a result, this fix applies a small random force to the entire system, and the center-of-mass of the system undergoes a slow random walk. If the -keyword *zero* is set to *yes*\ , the total random force is set exactly +keyword *zero* is set to *yes*, the total random force is set exactly to zero by subtracting off an equal part of it from each atom in the group. As a result, the center-of-mass of a system with zero initial momentum will not drift over time. @@ -146,8 +146,8 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_gle.rst b/doc/src/fix_gle.rst index c7d46c09fa..a42fddf7f5 100644 --- a/doc/src/fix_gle.rst +++ b/doc/src/fix_gle.rst @@ -63,7 +63,7 @@ un-correlated Gaussian random forces. The A matrix couples the physical and makes it possible to obtain effectively a history-dependent noise and friction kernel. -The drift matrix should be given as an external file *Afile*\ , +The drift matrix should be given as an external file *Afile*, as a (Ns+1 x Ns+1) matrix in inverse time units. Matrices that are optimal for a given application and the system of choice can be obtained from :ref:`(GLE4MD) `. @@ -143,7 +143,7 @@ In order to perform constant-pressure simulations please use equations of motion. This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_gravity.rst b/doc/src/fix_gravity.rst index bd585b1312..7b0f7669ed 100644 --- a/doc/src/fix_gravity.rst +++ b/doc/src/fix_gravity.rst @@ -77,7 +77,7 @@ Style *vector* imposes an acceleration in the vector direction given by (x,y,z). Only the direction of the vector is important; it's length is ignored. For 2d systems, the *z* component is ignored. -Any of the quantities *magnitude*\ , *angle*\ , *phi*\ , *theta*\ , *x*\ , *y*\ , +Any of the quantities *magnitude*, *angle*, *phi*, *theta*, *x*, *y*, *z* which define the gravitational magnitude and direction, can be specified as an equal-style :doc:`variable `. If the value is a variable, it should be specified as v_name, where name is the diff --git a/doc/src/fix_grem.rst b/doc/src/fix_grem.rst index 8716fc8cd5..3e3ec02994 100644 --- a/doc/src/fix_grem.rst +++ b/doc/src/fix_grem.rst @@ -101,7 +101,7 @@ Restrictions """""""""""" This fix is part of the REPLICA package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_halt.rst b/doc/src/fix_halt.rst index 06f068bb7d..d7f7f75515 100644 --- a/doc/src/fix_halt.rst +++ b/doc/src/fix_halt.rst @@ -54,7 +54,7 @@ dynamics or minimization iterations, as specified by the :doc:`run The specified group-ID is ignored by this fix. The specified *attribute* can be one of the options listed above, namely -*bondmax*, *tlimit*\ , *diskfree*\ , or an :doc:`equal-style variable +*bondmax*, *tlimit*, *diskfree*, or an :doc:`equal-style variable ` referenced as *v_name*, where "name" is the name of a variable that has been defined previously in the input script. @@ -138,16 +138,16 @@ The specified *avalue* must be a numeric value. ---------- The optional *error* keyword determines how the current run is halted. -If its value is *hard*\ , then LAMMPS will stop with an error message. +If its value is *hard*, then LAMMPS will stop with an error message. -If its value is *soft*\ , LAMMPS will exit the current run, but continue +If its value is *soft*, LAMMPS will exit the current run, but continue to execute subsequent commands in the input script. However, additional :doc:`run ` or :doc:`minimize ` commands will be skipped. For example, this allows a script to output the current state of the system, e.g. via a :doc:`write_dump ` or :doc:`write_restart ` command. -If its value is *continue*\ , the behavior is the same as for *soft*\ , +If its value is *continue*, the behavior is the same as for *soft*, except subsequent :doc:`run ` or :doc:`minimize ` commands are executed. This allows your script to remedy the condition that triggered the halt, if necessary. Note that you may wish use the diff --git a/doc/src/fix_hyper_global.rst b/doc/src/fix_hyper_global.rst index 0b46616c5e..c8643b3b86 100644 --- a/doc/src/fix_hyper_global.rst +++ b/doc/src/fix_hyper_global.rst @@ -46,7 +46,7 @@ This can lead to a dramatic speed-up in the rate at which events occurs, without altering their relative frequencies, thus leading to an overall increase in the elapsed real time of the simulation as compared to running for the same number of timesteps with normal MD. -See the :doc:`hyper ` doc page for a more general discussion of +See the :doc:`hyper ` page for a more general discussion of hyperdynamics and citations that explain both GHD and LHD. The equations and logic used by this fix and described here to perform @@ -56,8 +56,8 @@ Fichthorn as described in :ref:`(Miron) `. In LAMMPS we use a simplified version of bond-boost GHD where a single bond in the system is biased at any one timestep. -Bonds are defined between each pair of atoms *ij*\ , whose :math:`R^0_{ij}` -distance is less than *cutbond*\ , when the system is in a quenched state +Bonds are defined between each pair of atoms *ij*, whose :math:`R^0_{ij}` +distance is less than *cutbond*, when the system is in a quenched state (minimum) energy. Note that these are not "bonds" in a covalent sense. A bond is simply any pair of atoms that meet the distance criterion. *Cutbond* is an argument to this fix; it is discussed @@ -70,7 +70,7 @@ The current strain of bond *ij* (when running dynamics) is defined as E_{ij} = \frac{R_{ij} - R^0_{ij}}{R^0_{ij}} -where :math:`R_{ij}` is the current distance between atoms *i* and *j*\ , +where :math:`R_{ij}` is the current distance between atoms *i* and *j*, and :math:`R^0_{ij}` is the equilibrium distance in the quenched state. The bias energy :math:`V_{ij}` of any bond between atoms *i* and *j* @@ -136,7 +136,7 @@ Note that in GHD, the boost factor varies from timestep to timestep. Likewise, which bond has :math:`E^{max}` strain and thus which pair of atoms the bias potential is added to, will also vary from timestep to timestep. This is in contrast to local hyperdynamics (LHD) where the boost -factor is an input parameter; see the :doc:`fix hyper/local ` doc page for details. +factor is an input parameter; see the :doc:`fix hyper/local ` page for details. ---------- @@ -192,7 +192,7 @@ beta term in the exponential factor that determines how much boost is achieved as a function of the bias potential. In general, the lower the value of *Tequil* and the higher the value -of *Vmax*\ , the more time boost will be achievable by the GHD +of *Vmax*, the more time boost will be achievable by the GHD algorithm. ---------- @@ -264,7 +264,7 @@ Restrictions """""""""""" This command can only be used if LAMMPS was built with the REPLICA -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/fix_hyper_local.rst b/doc/src/fix_hyper_local.rst index 90238e0b4a..22de3bc3ca 100644 --- a/doc/src/fix_hyper_local.rst +++ b/doc/src/fix_hyper_local.rst @@ -61,7 +61,7 @@ This can lead to a dramatic speed-up in the rate at which events occurs, without altering their relative frequencies, thus leading to an overall increase in the elapsed real time of the simulation as compared to running for the same number of timesteps with normal MD. -See the :doc:`hyper ` doc page for a more general discussion of +See the :doc:`hyper ` page for a more general discussion of hyperdynamics and citations that explain both GHD and LHD. The equations and logic used by this fix and described here to perform @@ -139,7 +139,7 @@ to this fix. running constant-temperature (NVT) dynamics. LAMMPS does not check that this is done. -Note that if *ij*\ == *kl*\ , then bond *ij* is a biased bond on that +Note that if *ij*\ == *kl*, then bond *ij* is a biased bond on that timestep, otherwise it is not. But regardless, the boost factor :math:`B_{ij}` can be thought of an estimate of time boost currently being applied within a local region centered on bond *ij*. For LHD, @@ -162,15 +162,15 @@ Note that in LHD, the boost factor :math:`B_{target}` is specified by the user. This is in contrast to global hyperdynamics (GHD) where the boost factor varies each timestep and is computed as a function of :math:`V_{max}`, :math:`E_{max}`, and :math:`T_{equil}`; see the -:doc:`fix hyper/global ` doc page for details. +:doc:`fix hyper/global ` page for details. ---------- Here is additional information on the input parameters for LHD. -Note that the *cutbond*\ , *qfactor*\ , and *Tequil* arguments have the +Note that the *cutbond*, *qfactor*, and *Tequil* arguments have the same meaning as for GHD. The *Vmax* argument is slightly different. -The *Dcut*\ , *alpha*\ , and *Btarget* parameters are unique to LHD. +The *Dcut*, *alpha*, and *Btarget* parameters are unique to LHD. The *cutbond* argument is the cutoff distance for defining bonds between pairs of nearby atoms. A pair of I,J atoms in their @@ -310,7 +310,7 @@ Here is additional information on the optional keywords for this fix. The *bound* keyword turns on min/max bounds for bias coefficients :math:`C_{ij}` for all bonds. :math:`C_{ij}` is a prefactor for each bond on the bias potential of maximum strength :math:`V^{max}`. Depending on the -choice of *alpha* and *Btarget* and *Vmax*\ , the boostostatting can cause +choice of *alpha* and *Btarget* and *Vmax*, the boostostatting can cause individual :math:`C_{ij}` values to fluctuate. If the fluctuations are too large :math:`C_{ij} \cdot V^{max}` can exceed low barrier heights and induce bad event dynamics. Bounding the :math:`C_{ij}` values is a way to prevent @@ -326,7 +326,7 @@ The *reset* keyword allow *Vmax* to be adjusted dynamically depending on the average value of all :math:`C_{ij}` prefactors. This can be useful if you are unsure what value of *Vmax* will match the *Btarget* boost for the system. The :math:`C_{ij}` values will then adjust in aggregate (up or down) -so that :math:`C_{ij} \cdot V^{max}` produces a boost of *Btarget*\ , but this +so that :math:`C_{ij} \cdot V^{max}` produces a boost of *Btarget*, but this may conflict with the *bound* keyword settings. By using *bound* and *reset* together, :math:`V^{max}` itself can be reset, and desired bounds still applied to the :math:`C_{ij}` values. @@ -354,7 +354,7 @@ The *check/bias* keyword turns on extra computation and communication to check if any biased bonds are closer than *Dcut* to each other, which should not be the case if LHD is operating correctly. Thus it is a debugging check. The *Nevery* setting determines how often the -check is made. The *error*\ , *warn*\ , or *ignore* setting determines +check is made. The *error*, *warn*, or *ignore* setting determines what is done if the count of too-close bonds is not zero. Either the code will exit, or issue a warning, or silently tally the count. The count can be output as vector value 17, as described below. If this @@ -447,13 +447,13 @@ next event occurs they may move further than *Dcut* away from the sub-box boundary. Value 19 is the furthest (from the sub-box) any ghost atom in the neighbor list with maxstrain < *qfactor* was accessed during the run. Value 20 is the same except that the ghost -atom's maxstrain may be >= *qfactor*\ , which may mean it is about to +atom's maxstrain may be >= *qfactor*, which may mean it is about to participate in an event. Value 21 is a count of how many ghost atoms could not be found on reneighbor steps, presumably because they moved too far away due to their participation in an event (which will likely be detected at the next quench). -Typical values for 19 and 20 should be slightly larger than *Dcut*\ , +Typical values for 19 and 20 should be slightly larger than *Dcut*, which accounts for ghost atoms initially at a *Dcut* distance moving thermally before the next event takes place. diff --git a/doc/src/fix_imd.rst b/doc/src/fix_imd.rst index 5bb4075873..004bc0b614 100644 --- a/doc/src/fix_imd.rst +++ b/doc/src/fix_imd.rst @@ -78,7 +78,7 @@ fixes would be active at the same time, each needs to use a different port number. The *nowait* keyword controls the behavior of the fix when no IMD -client is connected. With the default setting of *off*\ , LAMMPS will +client is connected. With the default setting of *off*, LAMMPS will wait until a connection is made before continuing with the execution. Setting *nowait* to *on* will have the LAMMPS code be ready to connect to a client, but continue with the simulation. This can for @@ -150,7 +150,7 @@ Restrictions """""""""""" This fix is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. When used in combination with VMD, a topology or coordinate file has to be loaded, which matches (in number and ordering of atoms) the diff --git a/doc/src/fix_indent.rst b/doc/src/fix_indent.rst index e9dab5141f..bb4b450c94 100644 --- a/doc/src/fix_indent.rst +++ b/doc/src/fix_indent.rst @@ -96,9 +96,9 @@ the plane's current position will feel no force. Vice versa if *side* is specified as *hi*\ . Any of the 4 quantities defining a spherical indenter's geometry can -be specified as an equal-style :doc:`variable `, namely *x*\ , -*y*\ , *z*\ , or *R*\ . Similarly, for a cylindrical indenter, any of *c1*\ , -*c2*\ , or *R*\ , can be a variable. For a planar indenter, *pos* can be +be specified as an equal-style :doc:`variable `, namely *x*, +*y*, *z*, or *R*\ . Similarly, for a cylindrical indenter, any of *c1*, +*c2*, or *R*, can be a variable. For a planar indenter, *pos* can be a variable. If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to define the @@ -139,10 +139,10 @@ rate. variable rate equal 1.0 variable r equal "v_r0 + step*dt*v_rate" -If the *side* keyword is specified as *out*\ , which is the default, +If the *side* keyword is specified as *out*, which is the default, then particles outside the indenter are pushed away from its outer surface, as described above. This only applies to spherical or -cylindrical indenters. If the *side* keyword is specified as *in*\ , +cylindrical indenters. If the *side* keyword is specified as *in*, the action of the indenter is reversed. Particles inside the indenter are pushed away from its inner surface. In other words, the indenter is now a containing wall that traps the particles inside it. If the @@ -160,7 +160,7 @@ cylindrical indenter is scaled by the x lattice spacing. Note that the units keyword only affects indenter geometry parameters specified directly with numbers, not those specified as variables. In -the latter case, you should use the *xlat*\ , *ylat*\ , *zlat* keywords of +the latter case, you should use the *xlat*, *ylat*, *zlat* keywords of the :doc:`thermo_style ` command if you want to include lattice spacings in a variable formula. @@ -168,7 +168,7 @@ The force constant *K* is not affected by the *units* keyword. It is always in force/distance\^2 units where force and distance are defined by the :doc:`units ` command. If you wish K to be scaled by the lattice spacing, you can define K with a variable whose formula -contains *xlat*\ , *ylat*\ , *zlat* keywords of the +contains *xlat*, *ylat*, *zlat* keywords of the :doc:`thermo_style ` command, e.g. .. code-block:: LAMMPS diff --git a/doc/src/fix_ipi.rst b/doc/src/fix_ipi.rst index f8ea49c845..bd4b4d84e8 100644 --- a/doc/src/fix_ipi.rst +++ b/doc/src/fix_ipi.rst @@ -14,8 +14,8 @@ Syntax * ipi = style name of this fix command * address = internet address (FQDN or IP), or UNIX socket name * port = port number (ignored for UNIX sockets) -* optional keyword = *unix*\ , if present uses a unix socket -* optional keyword = *reset*\ , if present reset electrostatics at each call +* optional keyword = *unix*, if present uses a unix socket +* optional keyword = *reset*, if present reset electrostatics at each call Examples """""""" @@ -86,7 +86,7 @@ i-PI. This fix is part of the MISC package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Because of the use of UNIX domain sockets, this fix will only work in a UNIX environment. diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index 918573fc6b..c8be9afc31 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -112,7 +112,7 @@ thermostatting takes place; see the description below. fix - e.g. by :doc:`fix nvt ` or :doc:`fix temp/rescale ` commands. -See the :doc:`Howto thermostat ` doc page for +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -239,7 +239,7 @@ thermostat. Because the random forces on different atoms are independent, they do not sum exactly to zero. As a result, this fix applies a small random force to the entire system, and the center-of-mass of the system undergoes a slow random walk. If the -keyword *zero* is set to *yes*\ , the total random force is set exactly +keyword *zero* is set to *yes*, the total random force is set exactly to zero by subtracting off an equal part of it from each atom in the group. As a result, the center-of-mass of a system with zero initial momentum will not drift over time. @@ -252,7 +252,7 @@ limit of the integrator), while still producing the correct Boltzmann distribution of atom positions. The current implementation provides the user with the option to output -the velocity in one of two forms: *vfull* or *vhalf*\ , which replaces +the velocity in one of two forms: *vfull* or *vhalf*, which replaces the outdated option *yes*\ . The *gjf* option *vfull* outputs the on-site velocity given in :ref:`Gronbech-Jensen/Farago `; this velocity is shown to be systematically lower @@ -291,8 +291,8 @@ this fix and by the compute should be the same. The cumulative energy change in the system imposed by this fix is included in the :doc:`thermodynamic output ` keywords -*ecouple* and *econserve*\ , but only if the *tally* keyword to set to -*yes*\ . See the :doc:`thermo_style ` doc page for +*ecouple* and *econserve*, but only if the *tally* keyword to set to +*yes*\ . See the :doc:`thermo_style ` page for details. This fix computes a global scalar which can be accessed by various diff --git a/doc/src/fix_langevin_drude.rst b/doc/src/fix_langevin_drude.rst index 77e59a0848..3486723a67 100644 --- a/doc/src/fix_langevin_drude.rst +++ b/doc/src/fix_langevin_drude.rst @@ -100,7 +100,7 @@ transform: f = \frac m {M'}\, F' + f' This fix also thermostats non-polarizable atoms in the group at -temperature *Tcom*\ , as if they had a massless Drude partner. The +temperature *Tcom*, as if they had a massless Drude partner. The Drude particles themselves need not be in the group. The center of mass and the dipole are thermostatted iff the core atom is in the group. @@ -122,7 +122,7 @@ from them before thermostatting takes place; see the description below. Likewise, this fix should not normally be used on atoms that also have their temperature controlled by another fix - e.g. by :doc:`fix nvt ` or :doc:`fix temp/rescale ` commands. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -207,7 +207,7 @@ thermostat on centers of mass. Because the random forces on different centers of mass are independent, they do not sum exactly to zero. As a result, this fix applies a small random force to the entire system, and the momentum of the total center of mass of the system undergoes a -slow random walk. If the keyword *zero* is set to *yes*\ , the total +slow random walk. If the keyword *zero* is set to *yes*, the total random force on the centers of mass is set exactly to zero by subtracting off an equal part of it from each center of mass in the group. As a result, the total center of mass of a system with zero @@ -239,7 +239,7 @@ Comments: * *zero yes* avoids a drift of the center of mass of the system, but is a bit slower. * Use two different random seeds to avoid unphysical correlations. -* Temperature is controlled by the fix *langevin/drude*\ , so the +* Temperature is controlled by the fix *langevin/drude*, so the time-integration fixes do not thermostat. Don't forget to time-integrate both cores and Drude particles. * Pressure is time-integrated only once by using *nve* for Drude @@ -251,7 +251,7 @@ Comments: fix *npt* and :doc:`fix drude/transform `, the *fix_modify* command is not required here, because the fix *nph* computes the global pressure even if its group is *ATOMS*\ . This is - what we want. If we thermostatted *ATOMS* using *npt*\ , the pressure + what we want. If we thermostatted *ATOMS* using *npt*, the pressure should be the global one, but the temperature should be only that of the cores. That's why the command *fix_modify* should be called in that case. diff --git a/doc/src/fix_langevin_eff.rst b/doc/src/fix_langevin_eff.rst index 383980b232..506b5052d5 100644 --- a/doc/src/fix_langevin_eff.rst +++ b/doc/src/fix_langevin_eff.rst @@ -83,8 +83,8 @@ this fix and by the compute should be the same. The cumulative energy change in the system imposed by this fix is included in the :doc:`thermodynamic output ` keywords -*ecouple* and *econserve*\ , but only if the *tally* keyword to set to -*yes*\ . See the :doc:`thermo_style ` doc page for +*ecouple* and *econserve*, but only if the *tally* keyword to set to +*yes*\ . See the :doc:`thermo_style ` page for details. This fix computes a global scalar which can be accessed by various @@ -105,7 +105,7 @@ Restrictions none This fix is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_langevin_spin.rst b/doc/src/fix_langevin_spin.rst index c73968df48..0926881eef 100644 --- a/doc/src/fix_langevin_spin.rst +++ b/doc/src/fix_langevin_spin.rst @@ -85,7 +85,7 @@ Restrictions """""""""""" The *langevin/spin* fix is part of the SPIN package. This style is -only enabled if LAMMPS was built with this package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with this package. See the :doc:`Build package ` page for more info. The numerical integration has to be performed with *fix nve/spin* when *fix langevin/spin* is enabled. diff --git a/doc/src/fix_latte.rst b/doc/src/fix_latte.rst index 58a8ddbe20..f75d44e3a4 100644 --- a/doc/src/fix_latte.rst +++ b/doc/src/fix_latte.rst @@ -153,7 +153,7 @@ Restrictions This fix is part of the LATTE package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. You must use metal units, as set by the :doc:`units ` command to use this fix. @@ -171,7 +171,7 @@ doing 99% or more of the work to compute quantum-accurate forces. NEB calculations can be done using this fix using multiple replicas and running LAMMPS in parallel. However, each replica must be run on a single MPI task. For details, see the :doc:`neb ` - command doc page and the :doc:`-partition command-line switch ` + command page and the :doc:`-partition command-line switch ` Related commands """""""""""""""" diff --git a/doc/src/fix_lb_fluid.rst b/doc/src/fix_lb_fluid.rst index 127e846589..21d5d0cb84 100644 --- a/doc/src/fix_lb_fluid.rst +++ b/doc/src/fix_lb_fluid.rst @@ -210,7 +210,7 @@ By default, :math:`\frac{\tau}{dt} = \frac{3\eta dt}{\rho dx^2}` is approximately equal to 1. However, the user has the option of specifying their own values for :math:`dm_{LB}`, and :math:`dx_{LB}`, by using -the optional keywords *dm*\ , and *dx* respectively. +the optional keywords *dm*, and *dx* respectively. .. note:: @@ -224,7 +224,7 @@ the optional keywords *dm*\ , and *dx* respectively. :math:`dx_{LB}` is used, this will automatically be satisfied. Physical parameters describing the fluid are specified through -*viscosity*\ , *density*\ , and *a0*\ . If the force coupling constant is +*viscosity*, *density*, and *a0*\ . If the force coupling constant is set the default way, the surface area associated with the MD particles is specified using the *setArea* keyword. If the user chooses to specify a value for the force coupling constant, this is set using the @@ -342,7 +342,7 @@ Restrictions """""""""""" This fix is part of the LATBOLTZ package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix can only be used with an orthogonal simulation domain. diff --git a/doc/src/fix_lb_momentum.rst b/doc/src/fix_lb_momentum.rst index 5a01e1916e..f967c1300a 100644 --- a/doc/src/fix_lb_momentum.rst +++ b/doc/src/fix_lb_momentum.rst @@ -46,7 +46,7 @@ and the fluid velocities at each lattice site. This fix only considers the linear momentum of the system. By default, the subtraction is performed for each dimension. This can -be changed by specifying the keyword *linear*\ , along with a set of +be changed by specifying the keyword *linear*, along with a set of three flags set to 0/1 in order to exclude/ include the corresponding dimension. @@ -67,7 +67,7 @@ Can only be used if a lattice-Boltzmann fluid has been created via the command. This fix is part of the LATBOLTZ package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_lb_pc.rst b/doc/src/fix_lb_pc.rst index 6ba28ec309..6ba3e72482 100644 --- a/doc/src/fix_lb_pc.rst +++ b/doc/src/fix_lb_pc.rst @@ -24,7 +24,7 @@ Description """"""""""" Update the positions and velocities of the individual particles -described by *group-ID*\ , experiencing velocity-dependent hydrodynamic +described by *group-ID*, experiencing velocity-dependent hydrodynamic forces, using the integration algorithm described in :ref:`Mackay et al. `. This integration algorithm should only be used if a user-specified value for the force-coupling constant used in :doc:`fix lb/fluid ` has been set; do not use this integration algorithm if the force coupling constant has been set by default. @@ -42,7 +42,7 @@ Restrictions """""""""""" This fix is part of the LATBOLTZ package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Can only be used if a lattice-Boltzmann fluid has been created via the :doc:`fix lb/fluid ` command, and must come after this diff --git a/doc/src/fix_lb_rigid_pc_sphere.rst b/doc/src/fix_lb_rigid_pc_sphere.rst index 5ee32c29f0..16e00ba12f 100644 --- a/doc/src/fix_lb_rigid_pc_sphere.rst +++ b/doc/src/fix_lb_rigid_pc_sphere.rst @@ -141,7 +141,7 @@ Restrictions This fix is part of the LATBOLTZ package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Can only be used if a lattice-Boltzmann fluid has been created via the :doc:`fix lb/fluid ` command, and must come after this diff --git a/doc/src/fix_lb_viscous.rst b/doc/src/fix_lb_viscous.rst index 5bd6889808..cd3712aac4 100644 --- a/doc/src/fix_lb_viscous.rst +++ b/doc/src/fix_lb_viscous.rst @@ -72,7 +72,7 @@ Restrictions """""""""""" This fix is part of the LATBOLTZ package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Can only be used if a lattice-Boltzmann fluid has been created via the :doc:`fix lb/fluid ` command, and must come after this diff --git a/doc/src/fix_manifoldforce.rst b/doc/src/fix_manifoldforce.rst index 964fc1ad1f..2d72743707 100644 --- a/doc/src/fix_manifoldforce.rst +++ b/doc/src/fix_manifoldforce.rst @@ -49,7 +49,7 @@ Restrictions """""""""""" This fix is part of the MANIFOLD package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Only use this with *min_style hftn* or *min_style quickmin*. If not, the constraints will not be satisfied very well at all. A warning is diff --git a/doc/src/fix_mdi_engine.rst b/doc/src/fix_mdi_engine.rst index ca667bfe3b..51a4545fd8 100644 --- a/doc/src/fix_mdi_engine.rst +++ b/doc/src/fix_mdi_engine.rst @@ -46,7 +46,7 @@ Restrictions This command is part of the MDI package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_meso_move.rst b/doc/src/fix_meso_move.rst index 6b290382a3..7b3609a8c7 100644 --- a/doc/src/fix_meso_move.rst +++ b/doc/src/fix_meso_move.rst @@ -125,7 +125,7 @@ notation as where *X0* = (x0,y0,z0) is their position at the time the fix is specified, *A* is the specified amplitude vector with components -(Ax,Ay,Az), *omega* is 2 PI / *period*\ , and *delta* is the time +(Ax,Ay,Az), *omega* is 2 PI / *period*, and *delta* is the time elapsed since the fix was specified. This style also sets the velocity of each particle to the time derivative of this expression. If any of the amplitude components is specified as NULL, then the @@ -150,7 +150,7 @@ The *rotate* style rotates particles around a rotation axis *R* = (Rx,Ry,Rz) that goes through a point *P* = (Px,Py,Pz). The *period* of the rotation is also specified. The direction of rotation for the particles around the rotation axis is consistent with the right-hand -rule: if your right-hand thumb points along *R*\ , then your fingers wrap +rule: if your right-hand thumb points along *R*, then your fingers wrap around the axis in the direction of rotation. This style also sets the velocity of each particle to (omega cross @@ -240,7 +240,7 @@ Restrictions This fix is part of the DPD-SMOOTH package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This fix requires that atoms store density and internal energy as defined by the :doc:`atom_style sph ` command. diff --git a/doc/src/fix_modify.rst b/doc/src/fix_modify.rst index a6bac6ac44..47080fcd58 100644 --- a/doc/src/fix_modify.rst +++ b/doc/src/fix_modify.rst @@ -85,7 +85,7 @@ appropriate fix. For most fixes that support the *energy* keyword, the default setting is *no*. For a few it is *yes*, when a user would expect - that to be the case. The doc page of each fix gives the default. + that to be the case. The page of each fix gives the default. The *virial* keyword can be used with fixes that support it, which is explained at the bottom of their doc page. *Virial yes* will add a @@ -110,7 +110,7 @@ option to include or exclude the contribution from fixes. For most fixes that support the *virial* keyword, the default setting is *no*. For a few it is *yes*, when a user would expect - that to be the case. The doc page of each fix gives the default. + that to be the case. The page of each fix gives the default. For fixes that set or modify forces, it may be possible to select at which :doc:`r-RESPA ` level the fix operates via the *respa* diff --git a/doc/src/fix_momentum.rst b/doc/src/fix_momentum.rst index 71b50ddcdb..7d00a4c67b 100644 --- a/doc/src/fix_momentum.rst +++ b/doc/src/fix_momentum.rst @@ -99,7 +99,7 @@ Restrictions Fix momentum/chunk is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands diff --git a/doc/src/fix_move.rst b/doc/src/fix_move.rst index 7ede1f3050..5d3a9de47f 100644 --- a/doc/src/fix_move.rst +++ b/doc/src/fix_move.rst @@ -118,7 +118,7 @@ notation as where *X0* = (x0,y0,z0) is their position at the time the fix is specified, *A* is the specified amplitude vector with components -(Ax,Ay,Az), *omega* is 2 PI / *period*\ , and *delta* is the time +(Ax,Ay,Az), *omega* is 2 PI / *period*, and *delta* is the time elapsed since the fix was specified. This style also sets the velocity of each atom to the time derivative of this expression. If any of the amplitude components is specified as NULL, then the @@ -143,7 +143,7 @@ The *rotate* style rotates atoms around a rotation axis *R* = (Rx,Ry,Rz) that goes through a point *P* = (Px,Py,Pz). The *period* of the rotation is also specified. The direction of rotation for the atoms around the rotation axis is consistent with the right-hand rule: -if your right-hand thumb points along *R*\ , then your fingers wrap +if your right-hand thumb points along *R*, then your fingers wrap around the axis in the direction of rotation. This style also sets the velocity of each atom to (omega cross Rperp) diff --git a/doc/src/fix_mscg.rst b/doc/src/fix_mscg.rst index fe32acdbd5..5e9bc520b5 100644 --- a/doc/src/fix_mscg.rst +++ b/doc/src/fix_mscg.rst @@ -93,8 +93,8 @@ for more info. ---------- The *range* keyword specifies which MS-CG library functionality should -be invoked. If *on*\ , the step 4 range finder functionality is invoked. -*off*\ , the step 5 force matching functionality is invoked. +be invoked. If *on*, the step 4 range finder functionality is invoked. +*off*, the step 5 force matching functionality is invoked. If the *name* keyword is used, string names are defined to associate with the integer atom types in LAMMPS. *Ntype* names must be diff --git a/doc/src/fix_msst.rst b/doc/src/fix_msst.rst index e3996776a1..9502fe21b8 100644 --- a/doc/src/fix_msst.rst +++ b/doc/src/fix_msst.rst @@ -71,7 +71,7 @@ kinetic energy at the start of the simulation. Setting this parameter to a non-zero value may assist in compression at the start of simulations where it is slow to occur. -If keywords *e0*\ , *p0*\ ,or *v0* are not supplied, these quantities will +If keywords *e0*, *p0*,or *v0* are not supplied, these quantities will be calculated on the first step, after the energy specified by *tscale* is removed. The value of *e0* is not used in the dynamical equations, but is used in calculating the deviation from the Hugoniot. @@ -112,7 +112,7 @@ new computes are the fix-ID + "_MSST_temp" or "MSST_press" or The *dftb* keyword is to allow this fix to be used when LAMMPS is being driven by DFTB+, a density-functional tight-binding code. If the -keyword *dftb* is used with a value of *yes*\ , then the MSST equations +keyword *dftb* is used with a value of *yes*, then the MSST equations are altered to account for the electron entropy contribution to the Hugonio relations and total energy. See :ref:`(Reed2) ` and :ref:`(Goldman) ` for details on this contribution. In this case, @@ -152,7 +152,7 @@ integration of the dynamic equations. The global vector contains four values in the following order. The vector values output by this fix are "intensive". -[\ *dhugoniot*\ , *drayleigh*\ , *lagrangian_speed*, +[\ *dhugoniot*, *drayleigh*, *lagrangian_speed*, *lagrangian_position*] 1. *dhugoniot* is the departure from the Hugoniot (temperature units). @@ -177,7 +177,7 @@ Restrictions This fix style is part of the SHOCK package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. All cell dimensions must be periodic. This fix can not be used with a triclinic cell. The MSST fix has been tested only for the group-ID diff --git a/doc/src/fix_mvv_dpd.rst b/doc/src/fix_mvv_dpd.rst index 429c1c3bb7..efabab2183 100644 --- a/doc/src/fix_mvv_dpd.rst +++ b/doc/src/fix_mvv_dpd.rst @@ -91,7 +91,7 @@ Restrictions """""""""""" This fix is part of the DPD-MESO package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_neb.rst b/doc/src/fix_neb.rst index 848369d3ea..222e1d5fbf 100644 --- a/doc/src/fix_neb.rst +++ b/doc/src/fix_neb.rst @@ -96,7 +96,7 @@ and the relaxation procedure is continued to a new converged MEP. ---------- The keyword *parallel* specifies how the parallel nudging force is -computed. With a value of *neigh*\ , the parallel nudging force is +computed. With a value of *neigh*, the parallel nudging force is computed as in :ref:`(Henkelman1) ` by connecting each intermediate replica with the previous and the next image: @@ -107,7 +107,7 @@ intermediate replica with the previous and the next image: Note that in this case the specified *Kspring* is in force/distance units. -With a value of *ideal*\ , the spring force is computed as suggested in +With a value of *ideal*, the spring force is computed as suggested in ref`(WeinanE) ` .. parsed-literal:: @@ -151,7 +151,7 @@ force is added. By default, no additional forces act on the first and last replicas during the NEB relaxation, so these replicas simply relax toward their -respective local minima. By using the key word *end*\ , additional +respective local minima. By using the key word *end*, additional forces can be applied to the first and/or last replicas, to enable them to relax toward a MEP while constraining their energy E to the target energy ETarget. @@ -166,8 +166,8 @@ If ETarget>E, the interatomic force Fi for the specified replica becomes: The "spring" constant on the difference in energies is the specified *Kspring3* value. -When *estyle* is specified as *first*\ , the force is applied to the -first replica. When *estyle* is specified as *last*\ , the force is +When *estyle* is specified as *first*, the force is applied to the +first replica. When *estyle* is specified as *last*, the force is applied to the last replica. Note that the *end* keyword can be used twice to add forces to both the first and last replicas. @@ -175,13 +175,13 @@ For both these *estyle* settings, the target energy *ETarget* is set to the initial energy of the replica (at the start of the NEB calculation). -If the *estyle* is specified as *last/efirst* or *last/efirst/middle*\ , +If the *estyle* is specified as *last/efirst* or *last/efirst/middle*, force is applied to the last replica, but the target energy *ETarget* is continuously set to the energy of the first replica, as it evolves during the NEB relaxation. The difference between these two *estyle* options is as follows. When -*estyle* is specified as *last/efirst*\ , no change is made to the +*estyle* is specified as *last/efirst*, no change is made to the inter-replica force applied to the intermediate replicas (neither first or last). If the initial path is too far from the MEP, an intermediate replica may relax "faster" and reach a lower energy than @@ -195,7 +195,7 @@ than the first replica. This should effectively prevent the intermediate replicas from over-relaxing. After converging a NEB calculation using an *estyle* of -*last/efirst/middle*\ , you should check that all intermediate replicas +*last/efirst/middle*, you should check that all intermediate replicas have a larger energy than the first replica. If this is not the case, the path is probably not a MEP. diff --git a/doc/src/fix_nh.rst b/doc/src/fix_nh.rst index f40ce0c463..46b343fdce 100644 --- a/doc/src/fix_nh.rst +++ b/doc/src/fix_nh.rst @@ -104,7 +104,7 @@ addition to basic thermostatting and barostatting, these fixes can also create a chain of thermostats coupled to the particle thermostat, and another chain of thermostats coupled to the barostat variables. The barostat can be coupled to the overall box volume, or -to individual dimensions, including the *xy*\ , *xz* and *yz* tilt +to individual dimensions, including the *xy*, *xz* and *yz* tilt dimensions. The external pressure of the barostat can be specified as either a scalar pressure (isobaric ensemble) or as components of a symmetric stress tensor (constant stress ensemble). When used @@ -124,7 +124,7 @@ integrators derived by Tuckerman et al in :ref:`(Tuckerman) `. The thermostat parameters for fix styles *nvt* and *npt* are specified using the *temp* keyword. Other thermostat-related keywords are -*tchain*\ , *tloop* and *drag*\ , which are discussed below. +*tchain*, *tloop* and *drag*, which are discussed below. The thermostat is applied to only the translational degrees of freedom for the particles. The translational degrees of freedom can also have @@ -156,15 +156,15 @@ by the velocity/position update portion of the integration. ---------- The barostat parameters for fix styles *npt* and *nph* is specified -using one or more of the *iso*\ , *aniso*\ , *tri*\ , *x*\ , *y*\ , *z*\ , *xy*\ , -*xz*\ , *yz*\ , and *couple* keywords. These keywords give you the +using one or more of the *iso*, *aniso*, *tri*, *x*, *y*, *z*, *xy*, +*xz*, *yz*, and *couple* keywords. These keywords give you the ability to specify all 6 components of an external stress tensor, and to couple various of these components together so that the dimensions they represent are varied together during a constant-pressure simulation. -Other barostat-related keywords are *pchain*\ , *mtk*\ , *ploop*\ , -*nreset*\ , *drag*\ , and *dilate*\ , which are discussed below. +Other barostat-related keywords are *pchain*, *mtk*, *ploop*, +*nreset*, *drag*, and *dilate*, which are discussed below. Orthogonal simulation boxes have 3 adjustable dimensions (x,y,z). Triclinic (non-orthogonal) simulation boxes have 6 adjustable @@ -173,7 +173,7 @@ specify whether the simulation box is orthogonal or non-orthogonal (triclinic) and explain the meaning of the xy,xz,yz tilt factors. The target pressures for each of the 6 components of the stress tensor -can be specified independently via the *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , *yz* +can be specified independently via the *x*, *y*, *z*, *xy*, *xz*, *yz* keywords, which correspond to the 6 simulation box dimensions. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . @@ -184,7 +184,7 @@ the *xy* keyword is used, the xy tilt factor will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -Note that in order to use the *xy*\ , *xz*\ , or *yz* keywords, the +Note that in order to use the *xy*, *xz*, or *yz* keywords, the simulation box must be triclinic, even if its initial tilt factors are 0.0. @@ -253,13 +253,13 @@ things: the instantaneous stress will be computed as an average of the corresponding diagonal components, and the coupled box dimensions will be changed together in lockstep, meaning coupled dimensions will be dilated or contracted by the same percentage every timestep. The -*Pstart*\ , *Pstop*\ , *Pdamp* parameters for any coupled dimensions must +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must be identical. *Couple xyz* can be used for a 2d simulation; the *z* dimension is simply ignored. ---------- -The *iso*\ , *aniso*\ , and *tri* keywords are simply shortcuts that are +The *iso*, *aniso*, and *tri* keywords are simply shortcuts that are equivalent to specifying several other keywords together. The keyword *iso* means couple all 3 diagonal components together when @@ -274,8 +274,8 @@ specifying these 4 keywords: z Pstart Pstop Pdamp couple xyz -The keyword *aniso* means *x*\ , *y*\ , and *z* dimensions are controlled -independently using the *Pxx*\ , *Pyy*\ , and *Pzz* components of the +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the stress tensor as the driving forces, and the specified scalar external pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying these 4 keywords: @@ -287,7 +287,7 @@ these 4 keywords: z Pstart Pstop Pdamp couple none -The keyword *tri* means *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , and *yz* dimensions +The keyword *tri* means *x*, *y*, *z*, *xy*, *xz*, and *yz* dimensions are controlled independently using their individual stress components as the driving forces, and the specified scalar pressure as the external normal stress. Using "tri Pstart Pstop Pdamp" is the same as @@ -352,7 +352,7 @@ specified values of the external stress tensor. A value of *nstep* means that every *nstep* timesteps, the reference dimensions are set to those of the current simulation domain. -The *scaleyz*\ , *scalexz*\ , and *scalexy* keywords control whether or +The *scaleyz*, *scalexz*, and *scalexy* keywords control whether or not the corresponding tilt factors are scaled with the associated box dimensions when barostatting triclinic periodic cells. The default values *yes* will turn on scaling, which corresponds to adjusting the @@ -365,9 +365,9 @@ scale keywords to *no*\ . The *flip* keyword allows the tilt factors for a triclinic box to exceed half the distance of the parallel box length, as discussed -below. If the *flip* value is set to *yes*\ , the bound is enforced by +below. If the *flip* value is set to *yes*, the bound is enforced by flipping the box when it is exceeded. If the *flip* value is set to -*no*\ , the tilt will continue to change without flipping. Note that if +*no*, the tilt will continue to change without flipping. Note that if applied stress induces large deformations (e.g. in a liquid), this means the box shape can tilt dramatically and LAMMPS will run less efficiently, due to the large volume of communication needed to @@ -379,7 +379,7 @@ The *fixedpoint* keyword specifies the fixed point for barostat volume changes. By default, it is the center of the box. Whatever point is chosen will not move during the simulation. For example, if the lower periodic boundaries pass through (0,0,0), and this point is provided -to *fixedpoint*\ , then the lower periodic boundaries will remain at +to *fixedpoint*, then the lower periodic boundaries will remain at (0,0,0), while the upper periodic boundaries will move twice as far. In all cases, the particle trajectories are unaffected by the chosen value, except for a time-dependent constant translation of @@ -402,7 +402,7 @@ at only a small additional computational cost. .. note:: - Using a barostat coupled to tilt dimensions *xy*\ , *xz*\ , *yz* can + Using a barostat coupled to tilt dimensions *xy*, *xz*, *yz* can sometimes result in arbitrarily large values of the tilt dimensions, i.e. a dramatically deformed simulation box. LAMMPS allows the tilt factors to grow a small amount beyond the normal limit of half the box @@ -410,7 +410,7 @@ at only a small additional computational cost. an equivalent periodic cell. See the discussion of the *flip* keyword above, to allow this bound to be exceeded, if desired. -The flip operation is described in more detail in the doc page for +The flip operation is described in more detail in the page for :doc:`fix deform `. Both the barostat dynamics and the atom trajectories are unaffected by this operation. However, if a tilt factor is incremented by a large amount (1.5 times the box length) on @@ -504,7 +504,7 @@ thermal degrees of freedom, and the bias is added back in. These fixes can be used with either the *verlet* or *respa* :doc:`integrators `. When using one of the barostat fixes -with *respa*\ , LAMMPS uses an integrator constructed +with *respa*, LAMMPS uses an integrator constructed according to the following factorization of the Liouville propagator (for two rRESPA levels): @@ -557,7 +557,7 @@ of the underlying non-Hamiltonian equations of motion. The fix npt and fix nph commands can be used with rigid bodies or mixtures of rigid bodies and non-rigid particles (e.g. solvent). But there are also :doc:`fix rigid/npt ` and :doc:`fix rigid/nph ` commands, which are typically a more natural -choice. See the doc page for those commands for more discussion of +choice. See the page for those commands for more discussion of the various ways to do this. ---------- @@ -599,7 +599,7 @@ compute temperature on a subset of atoms. The cumulative energy change in the system imposed by these fixes, via either thermostatting and/or barostatting, is included in the :doc:`thermodynamic output ` keywords *ecouple* and -*econserve*. See the :doc:`thermo_style ` doc page for +*econserve*. See the :doc:`thermo_style ` page for details. These fixes compute a global scalar which can be accessed by various @@ -613,7 +613,7 @@ vector values are "intensive". The vector stores internal Nose/Hoover thermostat and barostat variables. The number and meaning of the vector values depends on -which fix is used and the settings for keywords *tchain* and *pchain*\ , +which fix is used and the settings for keywords *tchain* and *pchain*, which specify the number of Nose/Hoover chains for the thermostat and barostat. If no thermostatting is done, then *tchain* is 0. If no barostatting is done, then *pchain* is 0. In the following list, @@ -653,10 +653,10 @@ These fixes are not invoked during :doc:`energy minimization `. Restrictions """""""""""" -*X*\ , *y*\ , *z* cannot be barostatted if the associated dimension is not -periodic. *Xy*\ , *xz*\ , and *yz* can only be barostatted if the +*X*, *y*, *z* cannot be barostatted if the associated dimension is not +periodic. *Xy*, *xz*, and *yz* can only be barostatted if the simulation domain is triclinic and the second dimension in the keyword -(\ *y* dimension in *xy*\ ) is periodic. *Z*\ , *xz*\ , and *yz*\ , cannot be +(\ *y* dimension in *xy*\ ) is periodic. *Z*, *xz*, and *yz*, cannot be barostatted for 2D simulations. The :doc:`create_box `, :doc:`read data `, and :doc:`read_restart ` commands specify whether the simulation box is orthogonal or @@ -668,10 +668,10 @@ make the external T = 0.0 at some timestep during the simulation which is not allowed in the Nose/Hoover formulation. The *scaleyz yes* and *scalexz yes* keyword/value pairs can not be used -for 2D simulations. *scaleyz yes*\ , *scalexz yes*\ , and *scalexy yes* options +for 2D simulations. *scaleyz yes*, *scalexz yes*, and *scalexy yes* options can only be used if the second dimension in the keyword is periodic, and if the tilt factor is not coupled to the barostat via keywords -*tri*\ , *yz*\ , *xz*\ , and *xy*\ . +*tri*, *yz*, *xz*, and *xy*\ . These fixes can be used with dynamic groups as defined by the :doc:`group ` command. Likewise they can be used with groups to diff --git a/doc/src/fix_nh_eff.rst b/doc/src/fix_nh_eff.rst index 2dbd5aa85e..11990d365b 100644 --- a/doc/src/fix_nh_eff.rst +++ b/doc/src/fix_nh_eff.rst @@ -68,7 +68,7 @@ domain dimensions (barostatting). In addition to basic thermostatting and barostatting, these fixes can also create a chain of thermostats coupled to the particle thermostat, and another chain of thermostats coupled to the barostat variables. The barostat can be coupled to the -overall box volume, or to individual dimensions, including the *xy*\ , +overall box volume, or to individual dimensions, including the *xy*, *xz* and *yz* tilt dimensions. The external pressure of the barostat can be specified as either a scalar pressure (isobaric ensemble) or as components of a symmetric stress tensor (constant stress ensemble). @@ -110,16 +110,16 @@ to the temperature or kinetic energy from the electron radial velocity. Restart, fix_modify, output, run start/stop, minimize info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -See the doc page for the :doc:`fix nvt, npt, and nph ` commands +See the page for the :doc:`fix nvt, npt, and nph ` commands for details. Restrictions """""""""""" This fix is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. -Other restriction discussed on the doc page for the :doc:`fix nvt, npt, and nph ` commands also apply. +Other restriction discussed on the page for the :doc:`fix nvt, npt, and nph ` commands also apply. .. note:: diff --git a/doc/src/fix_nh_uef.rst b/doc/src/fix_nh_uef.rst index e33b2a639d..b51e232a3c 100644 --- a/doc/src/fix_nh_uef.rst +++ b/doc/src/fix_nh_uef.rst @@ -16,7 +16,7 @@ Syntax * ID, group-ID are documented in :doc:`fix ` command * style_name = *nvt/uef* or *npt/uef* -* *Tstart*\ , *Tstop*\ , and *Tdamp* are documented in the :doc:`fix npt ` command +* *Tstart*, *Tstop*, and *Tdamp* are documented in the :doc:`fix npt ` command * *edot_x* and *edot_y* are the strain rates in the x and y directions (1/(time units)) * one or more keyword/value pairs may be appended @@ -27,7 +27,7 @@ Syntax sets the external dimensions used to calculate the scalar pressure *strain* values = e_x e_y = initial strain usually not needed, but may be needed to resume a run with a data file. - *iso*\ , *x*\ , *y*\ , *z*\ , *tchain*\ , *pchain*\ , *tloop*\ , *ploop*\ , *mtk* keywords + *iso*, *x*, *y*, *z*, *tchain*, *pchain*, *tloop*, *ploop*, *mtk* keywords documented by the :doc:`fix npt ` command Examples @@ -111,7 +111,7 @@ pressure using this fix. The first method involves using the *ext* keyword along with the *iso* pressure style. With this method, the pressure is controlled by scaling the simulation box isotropically to achieve the average pressure only in the directions specified by -*ext*\ . For example, if the *ext* value is set to *xy*\ , the average +*ext*\ . For example, if the *ext* value is set to *xy*, the average pressure (Pxx+Pyy)/2 will be controlled. This example command will control the total hydrostatic pressure under @@ -130,7 +130,7 @@ drawing with uniaxial tension: fix f2 all npt/uef temp 0.7 0.7 0.5 iso 1 1 5 erate -0.5 -0.5 ext xy The second method for pressure control involves setting the normal -stresses using the *x*\ , *y* , and/or *z* keywords. When using this +stresses using the *x*, *y*, and/or *z* keywords. When using this method, the same pressure must be specified via *Pstart* and *Pstop* for all dimensions controlled. Any choice of pressure conditions that would cause LAMMPS to compute a deviatoric stress are not permissible @@ -200,7 +200,7 @@ Restrictions """""""""""" This fix is part of the UEF package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Due to requirements of the boundary conditions, when the *strain* keyword is set to zero (or unset), the initial simulation box must be diff --git a/doc/src/fix_nph_asphere.rst b/doc/src/fix_nph_asphere.rst index 011630a534..a1028efacc 100644 --- a/doc/src/fix_nph_asphere.rst +++ b/doc/src/fix_nph_asphere.rst @@ -41,7 +41,7 @@ point particles and only updates their position and velocity. Additional parameters affecting the barostat are specified by keywords and values documented with the :doc:`fix nph ` command. See, -for example, discussion of the *aniso*\ , and *dilate* keywords. +for example, discussion of the *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -50,7 +50,7 @@ NPH integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. @@ -120,7 +120,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/fix_nph_body.rst b/doc/src/fix_nph_body.rst index 4c91d28588..1b740a5ae2 100644 --- a/doc/src/fix_nph_body.rst +++ b/doc/src/fix_nph_body.rst @@ -38,7 +38,7 @@ point particles and only updates their position and velocity. Additional parameters affecting the barostat are specified by keywords and values documented with the :doc:`fix nph ` command. See, -for example, discussion of the *aniso*\ , and *dilate* keywords. +for example, discussion of the *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -47,7 +47,7 @@ NPH integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. @@ -117,7 +117,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style body ` diff --git a/doc/src/fix_nph_sphere.rst b/doc/src/fix_nph_sphere.rst index 6062faa50e..2ef85953e5 100644 --- a/doc/src/fix_nph_sphere.rst +++ b/doc/src/fix_nph_sphere.rst @@ -54,7 +54,7 @@ moment of inertia, as used in the time integration. Additional parameters affecting the barostat are specified by keywords and values documented with the :doc:`fix nph ` command. See, -for example, discussion of the *aniso*\ , and *dilate* keywords. +for example, discussion of the *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -63,7 +63,7 @@ NPH integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. diff --git a/doc/src/fix_nphug.rst b/doc/src/fix_nphug.rst index 776b3e4849..b45cfe964f 100644 --- a/doc/src/fix_nphug.rst +++ b/doc/src/fix_nphug.rst @@ -63,8 +63,8 @@ jump conditions for steady shocks. The compression can be performed either -hydrostatically (using keyword *iso*\ , *aniso*\ , or *tri*\ ) or uniaxially -(using keywords *x*\ , *y*\ , or *z*\ ). In the hydrostatic case, +hydrostatically (using keyword *iso*, *aniso*, or *tri*\ ) or uniaxially +(using keywords *x*, *y*, or *z*\ ). In the hydrostatic case, the cell dimensions change dynamically so that the average axial stress in all three directions converges towards the specified target value. In the uniaxial case, the chosen cell dimension changes dynamically @@ -74,10 +74,10 @@ other two cell dimensions are kept fixed (zero lateral strain). This leads to the following additional restrictions on the keywords: -* One and only one of the following keywords should be used: *iso*\ , *aniso*\ , *tri*\ , *x*\ , *y*\ , *z* +* One and only one of the following keywords should be used: *iso*, *aniso*, *tri*, *x*, *y*, *z* * The specified initial and final target pressures must be the same. -* The keywords *xy*\ , *xz*\ , *yz* may not be used. -* The only admissible value for the couple keyword is *xyz*\ , which has the same effect as keyword *iso* +* The keywords *xy*, *xz*, *yz* may not be used. +* The only admissible value for the couple keyword is *xyz*, which has the same effect as keyword *iso* * The *temp* keyword must be used to specify the time constant for kinetic energy relaxation, but initial and final target temperature values are ignored. Essentially, a Hugoniostat simulation is an NPT simulation in which the @@ -100,8 +100,8 @@ When the system reaches a stable equilibrium, the value of :math:`\Delta` should fluctuate about zero. The values of :math:`E_0`, :math:`V_0`, and :math:`P_0` are the instantaneous values at the start of -the simulation. These can be overridden using the fix_modify keywords *e0*\ , -*v0*\ , and *p0* described below. +the simulation. These can be overridden using the fix_modify keywords *e0*, +*v0*, and *p0* described below. ---------- @@ -159,7 +159,7 @@ as well as the state of all the thermostat and barostat variables to script that reads a restart file, so that the operation of the fix continues in an uninterrupted fashion. -The :doc:`fix_modify ` *e0*\ , *v0* and *p0* keywords can be +The :doc:`fix_modify ` *e0*, *v0* and *p0* keywords can be used to define the values of :math:`E_0`, :math:`V_0`, and :math:`P_0`. Note the the values for *e0* and *v0* are extensive, and so must correspond to the total energy and volume of the entire system, not @@ -205,7 +205,7 @@ Restrictions This fix style is part of the SHOCK package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. All the usual restrictions for :doc:`fix npt ` apply, plus the additional ones mentioned above. diff --git a/doc/src/fix_npt_asphere.rst b/doc/src/fix_npt_asphere.rst index f65ecd8d19..28edb59f8d 100644 --- a/doc/src/fix_npt_asphere.rst +++ b/doc/src/fix_npt_asphere.rst @@ -48,8 +48,8 @@ can also have a bias velocity removed from them before thermostatting takes place; see the description below. Additional parameters affecting the thermostat and barostat are -specified by keywords and values documented with the :doc:`fix npt ` command. See, for example, discussion of the *temp*\ , -*iso*\ , *aniso*\ , and *dilate* keywords. +specified by keywords and values documented with the :doc:`fix npt ` command. See, for example, discussion of the *temp*, +*iso*, *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -58,7 +58,7 @@ NPT integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. @@ -143,7 +143,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/fix_npt_body.rst b/doc/src/fix_npt_body.rst index af0a0fb252..d44870a4fb 100644 --- a/doc/src/fix_npt_body.rst +++ b/doc/src/fix_npt_body.rst @@ -46,8 +46,8 @@ takes place; see the description below. Additional parameters affecting the thermostat and barostat are specified by keywords and values documented with the :doc:`fix npt -` command. See, for example, discussion of the *temp*\ , -*iso*\ , *aniso*\ , and *dilate* keywords. +` command. See, for example, discussion of the *temp*, +*iso*, *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -56,7 +56,7 @@ NPT integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. @@ -141,7 +141,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style body ` diff --git a/doc/src/fix_npt_cauchy.rst b/doc/src/fix_npt_cauchy.rst index 01bf34927c..13b5b7bf70 100644 --- a/doc/src/fix_npt_cauchy.rst +++ b/doc/src/fix_npt_cauchy.rst @@ -73,7 +73,7 @@ addition to basic thermostatting and barostatting, this fix can also create a chain of thermostats coupled to the particle thermostat, and another chain of thermostats coupled to the barostat variables. The barostat can be coupled to the overall box volume, or -to individual dimensions, including the *xy*\ , *xz* and *yz* tilt +to individual dimensions, including the *xy*, *xz* and *yz* tilt dimensions. The external pressure of the barostat can be specified as either a scalar pressure (isobaric ensemble) or as components of a symmetric stress tensor (constant stress ensemble). When used @@ -92,7 +92,7 @@ integrators derived by Tuckerman et al in :ref:`(Tuckerman) `. ---------- The thermostat parameters are specified using the *temp* keyword. -Other thermostat-related keywords are *tchain*\ , *tloop* and *drag*\ , +Other thermostat-related keywords are *tchain*, *tloop* and *drag*, which are discussed below. The thermostat is applied to only the translational degrees of freedom @@ -118,15 +118,15 @@ by the velocity/position update portion of the integration. ---------- -The barostat parameters are specified using one or more of the *iso*\ , -*aniso*\ , *tri*\ , *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , *yz*\ , and *couple* keywords. +The barostat parameters are specified using one or more of the *iso*, +*aniso*, *tri*, *x*, *y*, *z*, *xy*, *xz*, *yz*, and *couple* keywords. These keywords give you the ability to specify all 6 components of an external stress tensor, and to couple various of these components together so that the dimensions they represent are varied together during a constant-pressure simulation. -Other barostat-related keywords are *pchain*\ , *mtk*\ , *ploop*\ , -*nreset*\ , *drag*\ , and *dilate*\ , which are discussed below. +Other barostat-related keywords are *pchain*, *mtk*, *ploop*, +*nreset*, *drag*, and *dilate*, which are discussed below. Orthogonal simulation boxes have 3 adjustable dimensions (x,y,z). Triclinic (non-orthogonal) simulation boxes have 6 adjustable @@ -135,7 +135,7 @@ specify whether the simulation box is orthogonal or non-orthogonal (triclinic) and explain the meaning of the xy,xz,yz tilt factors. The target pressures for each of the 6 components of the stress tensor -can be specified independently via the *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , *yz* +can be specified independently via the *x*, *y*, *z*, *xy*, *xz*, *yz* keywords, which correspond to the 6 simulation box dimensions. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . @@ -146,7 +146,7 @@ the *xy* keyword is used, the xy tilt factor will change. A box dimension will not change if that component is not specified, although you have the option to change that dimension via the :doc:`fix deform ` command. -Note that in order to use the *xy*\ , *xz*\ , or *yz* keywords, the +Note that in order to use the *xy*, *xz*, or *yz* keywords, the simulation box must be triclinic, even if its initial tilt factors are 0.0. @@ -193,13 +193,13 @@ things: the instantaneous stress will be computed as an average of the corresponding diagonal components, and the coupled box dimensions will be changed together in lockstep, meaning coupled dimensions will be dilated or contracted by the same percentage every timestep. The -*Pstart*\ , *Pstop*\ , *Pdamp* parameters for any coupled dimensions must +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must be identical. *Couple xyz* can be used for a 2d simulation; the *z* dimension is simply ignored. ---------- -The *iso*\ , *aniso*\ , and *tri* keywords are simply shortcuts that are +The *iso*, *aniso*, and *tri* keywords are simply shortcuts that are equivalent to specifying several other keywords together. The keyword *iso* means couple all 3 diagonal components together when @@ -214,8 +214,8 @@ specifying these 4 keywords: z Pstart Pstop Pdamp couple xyz -The keyword *aniso* means *x*\ , *y*\ , and *z* dimensions are controlled -independently using the *Pxx*\ , *Pyy*\ , and *Pzz* components of the +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the stress tensor as the driving forces, and the specified scalar external pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying these 4 keywords: @@ -227,7 +227,7 @@ these 4 keywords: z Pstart Pstop Pdamp couple none -The keyword *tri* means *x*\ , *y*\ , *z*\ , *xy*\ , *xz*\ , and *yz* dimensions +The keyword *tri* means *x*, *y*, *z*, *xy*, *xz*, and *yz* dimensions are controlled independently using their individual stress components as the driving forces, and the specified scalar pressure as the external normal stress. Using "tri Pstart Pstop Pdamp" is the same as @@ -292,7 +292,7 @@ specified values of the external stress tensor. A value of *nstep* means that every *nstep* timesteps, the reference dimensions are set to those of the current simulation domain. -The *scaleyz*\ , *scalexz*\ , and *scalexy* keywords control whether or +The *scaleyz*, *scalexz*, and *scalexy* keywords control whether or not the corresponding tilt factors are scaled with the associated box dimensions when barostatting triclinic periodic cells. The default values *yes* will turn on scaling, which corresponds to adjusting the @@ -305,9 +305,9 @@ scale keywords to *no*\ . The *flip* keyword allows the tilt factors for a triclinic box to exceed half the distance of the parallel box length, as discussed -below. If the *flip* value is set to *yes*\ , the bound is enforced by +below. If the *flip* value is set to *yes*, the bound is enforced by flipping the box when it is exceeded. If the *flip* value is set to -*no*\ , the tilt will continue to change without flipping. Note that if +*no*, the tilt will continue to change without flipping. Note that if applied stress induces large deformations (e.g. in a liquid), this means the box shape can tilt dramatically and LAMMPS will run less efficiently, due to the large volume of communication needed to @@ -319,7 +319,7 @@ The *fixedpoint* keyword specifies the fixed point for barostat volume changes. By default, it is the center of the box. Whatever point is chosen will not move during the simulation. For example, if the lower periodic boundaries pass through (0,0,0), and this point is provided -to *fixedpoint*\ , then the lower periodic boundaries will remain at +to *fixedpoint*, then the lower periodic boundaries will remain at (0,0,0), while the upper periodic boundaries will move twice as far. In all cases, the particle trajectories are unaffected by the chosen value, except for a time-dependent constant translation of @@ -329,7 +329,7 @@ positions. .. note:: - Using a barostat coupled to tilt dimensions *xy*\ , *xz*\ , *yz* can + Using a barostat coupled to tilt dimensions *xy*, *xz*, *yz* can sometimes result in arbitrarily large values of the tilt dimensions, i.e. a dramatically deformed simulation box. LAMMPS allows the tilt factors to grow a small amount beyond the normal limit of half the box @@ -337,7 +337,7 @@ positions. an equivalent periodic cell. See the discussion of the *flip* keyword above, to allow this bound to be exceeded, if desired. -The flip operation is described in more detail in the doc page for +The flip operation is described in more detail in the page for :doc:`fix deform `. Both the barostat dynamics and the atom trajectories are unaffected by this operation. However, if a tilt factor is incremented by a large amount (1.5 times the box length) on @@ -418,7 +418,7 @@ thermal degrees of freedom, and the bias is added back in. This fix can be used with either the *verlet* or *respa* :doc:`integrators `. When using this fix -with *respa*\ , LAMMPS uses an integrator constructed +with *respa*, LAMMPS uses an integrator constructed according to the following factorization of the Liouville propagator (for two rRESPA levels): @@ -500,7 +500,7 @@ compute temperature on a subset of atoms. The cumulative energy change in the system imposed by this fix, due to thermostatting and/or barostatting, is included in the :doc:`thermodynamic output ` keywords *ecouple* and -*econserve*. See the :doc:`thermo_style ` doc page for +*econserve*. See the :doc:`thermo_style ` page for details. This fix computes a global scalar which can be accessed by various @@ -514,7 +514,7 @@ values are "intensive". The vector stores internal Nose/Hoover thermostat and barostat variables. The number and meaning of the vector values depends on -which fix is used and the settings for keywords *tchain* and *pchain*\ , +which fix is used and the settings for keywords *tchain* and *pchain*, which specify the number of Nose/Hoover chains for the thermostat and barostat. If no thermostatting is done, then *tchain* is 0. If no barostatting is done, then *pchain* is 0. In the following list, @@ -555,12 +555,12 @@ Restrictions """""""""""" This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. -*X*\ , *y*\ , *z* cannot be barostatted if the associated dimension is not -periodic. *Xy*\ , *xz*\ , and *yz* can only be barostatted if the +*X*, *y*, *z* cannot be barostatted if the associated dimension is not +periodic. *Xy*, *xz*, and *yz* can only be barostatted if the simulation domain is triclinic and the second dimension in the keyword -(\ *y* dimension in *xy*\ ) is periodic. *Z*\ , *xz*\ , and *yz*\ , cannot be +(\ *y* dimension in *xy*\ ) is periodic. *Z*, *xz*, and *yz*, cannot be barostatted for 2D simulations. The :doc:`create_box `, :doc:`read data `, and :doc:`read_restart ` commands specify whether the simulation box is orthogonal or @@ -572,10 +572,10 @@ make the external T = 0.0 at some timestep during the simulation which is not allowed in the Nose/Hoover formulation. The *scaleyz yes* and *scalexz yes* keyword/value pairs can not be used -for 2D simulations. *scaleyz yes*\ , *scalexz yes*\ , and *scalexy yes* options +for 2D simulations. *scaleyz yes*, *scalexz yes*, and *scalexy yes* options can only be used if the second dimension in the keyword is periodic, and if the tilt factor is not coupled to the barostat via keywords -*tri*\ , *yz*\ , *xz*\ , and *xy*\ . +*tri*, *yz*, *xz*, and *xy*\ . The *alpha* keyword modifies the barostat as per Miller et al. (Miller)_"#nc-Miller" so that the Cauchy stress is controlled. diff --git a/doc/src/fix_npt_sphere.rst b/doc/src/fix_npt_sphere.rst index dd78cebbf1..75e4c9a4ec 100644 --- a/doc/src/fix_npt_sphere.rst +++ b/doc/src/fix_npt_sphere.rst @@ -61,8 +61,8 @@ The only difference between discs and spheres in this context is their moment of inertia, as used in the time integration. Additional parameters affecting the thermostat and barostat are -specified by keywords and values documented with the :doc:`fix npt ` command. See, for example, discussion of the *temp*\ , -*iso*\ , *aniso*\ , and *dilate* keywords. +specified by keywords and values documented with the :doc:`fix npt ` command. See, for example, discussion of the *temp*, +*iso*, *aniso*, and *dilate* keywords. The particles in the fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the @@ -71,7 +71,7 @@ NPT integration. Regardless of what particles are in the fix group, a global pressure is computed for all particles. Similarly, when the size of the simulation box is changed, all particles are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the particles in the fix group are re-scaled. The latter can be useful for leaving the coordinates of particles in a solid substrate unchanged and controlling the pressure of a surrounding fluid. diff --git a/doc/src/fix_numdiff.rst b/doc/src/fix_numdiff.rst index 22c1c59748..b0686f471f 100644 --- a/doc/src/fix_numdiff.rst +++ b/doc/src/fix_numdiff.rst @@ -101,7 +101,9 @@ minimization `. Restrictions """""""""""" - none + +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_asphere.rst b/doc/src/fix_nve_asphere.rst index c49de34d0b..fbba2bc8dd 100644 --- a/doc/src/fix_nve_asphere.rst +++ b/doc/src/fix_nve_asphere.rst @@ -54,7 +54,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/fix_nve_asphere_noforce.rst b/doc/src/fix_nve_asphere_noforce.rst index 6bc4b98c7f..7d904bef1c 100644 --- a/doc/src/fix_nve_asphere_noforce.rst +++ b/doc/src/fix_nve_asphere_noforce.rst @@ -48,7 +48,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/fix_nve_awpmd.rst b/doc/src/fix_nve_awpmd.rst index a294cebd73..c716a94a84 100644 --- a/doc/src/fix_nve_awpmd.rst +++ b/doc/src/fix_nve_awpmd.rst @@ -46,7 +46,7 @@ Restrictions """""""""""" This fix is part of the AWPMD package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_body.rst b/doc/src/fix_nve_body.rst index 7a763e7d42..45beee0659 100644 --- a/doc/src/fix_nve_body.rst +++ b/doc/src/fix_nve_body.rst @@ -26,7 +26,7 @@ Description Perform constant NVE integration to update position, velocity, orientation, and angular velocity for body particles in the group each timestep. V is volume; E is energy. This creates a system trajectory -consistent with the microcanonical ensemble. See the :doc:`Howto body ` doc page for more details on using body +consistent with the microcanonical ensemble. See the :doc:`Howto body ` page for more details on using body particles. This fix differs from the :doc:`fix nve ` command, which @@ -45,7 +45,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style body ` diff --git a/doc/src/fix_nve_dot.rst b/doc/src/fix_nve_dot.rst index 26af6efb4b..0a99e11452 100644 --- a/doc/src/fix_nve_dot.rst +++ b/doc/src/fix_nve_dot.rst @@ -47,7 +47,7 @@ Restrictions These pair styles can only be used if LAMMPS was built with the :ref:`CG-DNA ` package and the MOLECULE and ASPHERE package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_dotc_langevin.rst b/doc/src/fix_nve_dotc_langevin.rst index 944767ff51..c2835aaccd 100644 --- a/doc/src/fix_nve_dotc_langevin.rst +++ b/doc/src/fix_nve_dotc_langevin.rst @@ -131,7 +131,7 @@ Restrictions These pair styles can only be used if LAMMPS was built with the :ref:`CG-DNA ` package and the MOLECULE and ASPHERE package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_eff.rst b/doc/src/fix_nve_eff.rst index 87e64a9661..60bece43d0 100644 --- a/doc/src/fix_nve_eff.rst +++ b/doc/src/fix_nve_eff.rst @@ -43,7 +43,7 @@ Restrictions """""""""""" This fix is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_line.rst b/doc/src/fix_nve_line.rst index b65c543529..5bb6fd4213 100644 --- a/doc/src/fix_nve_line.rst +++ b/doc/src/fix_nve_line.rst @@ -26,7 +26,7 @@ Description Perform constant NVE integration to update position, velocity, orientation, and angular velocity for line segment particles in the group each timestep. V is volume; E is energy. This creates a system -trajectory consistent with the microcanonical ensemble. See :doc:`Howto spherical ` doc page for an overview of using line +trajectory consistent with the microcanonical ensemble. See :doc:`Howto spherical ` page for an overview of using line segment particles. This fix differs from the :doc:`fix nve ` command, which @@ -45,7 +45,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that particles be line segments as defined by the :doc:`atom_style line ` command. diff --git a/doc/src/fix_nve_manifold_rattle.rst b/doc/src/fix_nve_manifold_rattle.rst index e0c0c10b4a..a9bf07de60 100644 --- a/doc/src/fix_nve_manifold_rattle.rst +++ b/doc/src/fix_nve_manifold_rattle.rst @@ -84,7 +84,7 @@ Restrictions """""""""""" This fix is part of the MANIFOLD package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. ---------- diff --git a/doc/src/fix_nve_noforce.rst b/doc/src/fix_nve_noforce.rst index 167da24475..ee02f795a1 100644 --- a/doc/src/fix_nve_noforce.rst +++ b/doc/src/fix_nve_noforce.rst @@ -48,7 +48,9 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" - none + +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nve_spin.rst b/doc/src/fix_nve_spin.rst index 143ddb2426..e35647aef4 100644 --- a/doc/src/fix_nve_spin.rst +++ b/doc/src/fix_nve_spin.rst @@ -58,7 +58,7 @@ Restrictions """""""""""" This fix style can only be used if LAMMPS was built with the SPIN -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. To use the spin algorithm, it is necessary to define a map with diff --git a/doc/src/fix_nve_tri.rst b/doc/src/fix_nve_tri.rst index ad4376e8ec..b511d9b318 100644 --- a/doc/src/fix_nve_tri.rst +++ b/doc/src/fix_nve_tri.rst @@ -27,7 +27,7 @@ Perform constant NVE integration to update position, velocity, orientation, and angular momentum for triangular particles in the group each timestep. V is volume; E is energy. This creates a system trajectory consistent with the microcanonical ensemble. See the -:doc:`Howto spherical ` doc page for an overview of +:doc:`Howto spherical ` page for an overview of using triangular particles. This fix differs from the :doc:`fix nve ` command, which @@ -46,7 +46,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that particles be triangles as defined by the :doc:`atom_style tri ` command. diff --git a/doc/src/fix_nvk.rst b/doc/src/fix_nvk.rst index 30f5a0e004..0d83a4b1be 100644 --- a/doc/src/fix_nvk.rst +++ b/doc/src/fix_nvk.rst @@ -58,7 +58,7 @@ This fix has not yet been implemented to work with the RESPA integrator. This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_nvt_asphere.rst b/doc/src/fix_nvt_asphere.rst index 98e8a5b495..00f4588f7f 100644 --- a/doc/src/fix_nvt_asphere.rst +++ b/doc/src/fix_nvt_asphere.rst @@ -121,7 +121,7 @@ Restrictions """""""""""" This fix is part of the ASPHERE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style ellipsoid ` diff --git a/doc/src/fix_nvt_body.rst b/doc/src/fix_nvt_body.rst index 02b7d0c66c..28ad3e7857 100644 --- a/doc/src/fix_nvt_body.rst +++ b/doc/src/fix_nvt_body.rst @@ -118,7 +118,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. This fix requires that atoms store torque and angular momentum and a quaternion as defined by the :doc:`atom_style body ` diff --git a/doc/src/fix_nvt_manifold_rattle.rst b/doc/src/fix_nvt_manifold_rattle.rst index 3815138064..fe889bda79 100644 --- a/doc/src/fix_nvt_manifold_rattle.rst +++ b/doc/src/fix_nvt_manifold_rattle.rst @@ -64,7 +64,7 @@ Restrictions """""""""""" This fix is part of the MANIFOLD package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. ---------- diff --git a/doc/src/fix_nvt_sllod_eff.rst b/doc/src/fix_nvt_sllod_eff.rst index 328ff7d4e5..7500735054 100644 --- a/doc/src/fix_nvt_sllod_eff.rst +++ b/doc/src/fix_nvt_sllod_eff.rst @@ -70,7 +70,7 @@ Restrictions """""""""""" This fix is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This fix works best without Nose-Hoover chain thermostats, i.e. using tchain = 1. Setting tchain to larger values can result in poor diff --git a/doc/src/fix_oneway.rst b/doc/src/fix_oneway.rst index e899703fc1..f54cc42ed0 100644 --- a/doc/src/fix_oneway.rst +++ b/doc/src/fix_oneway.rst @@ -52,7 +52,7 @@ Restrictions """""""""""" This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_orient.rst b/doc/src/fix_orient.rst index 02fda71a0a..68522209b7 100644 --- a/doc/src/fix_orient.rst +++ b/doc/src/fix_orient.rst @@ -179,7 +179,7 @@ Restrictions These fixes are part of the ORIENT package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. These fixes should only be used with fcc or bcc lattices. diff --git a/doc/src/fix_orient_eco.rst b/doc/src/fix_orient_eco.rst index b58cf2dd8e..b2fc71f1f7 100644 --- a/doc/src/fix_orient_eco.rst +++ b/doc/src/fix_orient_eco.rst @@ -124,7 +124,7 @@ Restrictions This fix is part of the ORIENT package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands diff --git a/doc/src/fix_pafi.rst b/doc/src/fix_pafi.rst index 4c38123dd3..c8830316a2 100644 --- a/doc/src/fix_pafi.rst +++ b/doc/src/fix_pafi.rst @@ -85,7 +85,7 @@ Restrictions """""""""""" This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Default diff --git a/doc/src/fix_pair_tracker.rst b/doc/src/fix_pair_tracker.rst index 6e544b1c80..5c2ecf5774 100644 --- a/doc/src/fix_pair_tracker.rst +++ b/doc/src/fix_pair_tracker.rst @@ -99,7 +99,7 @@ the array is the number of recorded, lost interactions. If a single input is specified, a local vector is produced. If two or more inputs are specified, a local array is produced where the number of columns = the number of inputs. The vector or array can be accessed by any command -that uses local values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +that uses local values from a compute as input. See the :doc:`Howto output ` page for an overview of LAMMPS output options. The vector or array values will be doubles that correspond to the @@ -111,7 +111,7 @@ Restrictions Must be used in conjunction with :doc:`pair style tracker `. This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_phonon.rst b/doc/src/fix_phonon.rst index e151d8a671..d1b19173ce 100644 --- a/doc/src/fix_phonon.rst +++ b/doc/src/fix_phonon.rst @@ -138,7 +138,7 @@ code, `latgen `_, can be employed to generate the compatible map file for various crystals. In case one simulates a non-periodic system, where the whole simulation -box is treated as a unit cell, one can set *map_file* as *GAMMA*\ , so +box is treated as a unit cell, one can set *map_file* as *GAMMA*, so that the mapping info will be generated internally and a file is not needed. In this case, the dynamical matrix at only the gamma-point will/can be evaluated. Please keep in mind that fix-phonon is designed @@ -182,9 +182,9 @@ temperature of the system should not exceed the melting temperature to keep the system in its solid state. This fix is part of the PHONON package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. -This fix requires LAMMPS be built with an FFT library. See the :doc:`Build settings ` doc page for details. +This fix requires LAMMPS be built with an FFT library. See the :doc:`Build settings ` page for details. Related commands """""""""""""""" @@ -204,19 +204,19 @@ the :doc:`dimension ` command, and nasr = 20. **(Campana)** C. Campana and M. H. Muser, *Practical Green's function approach to the -simulation of elastic semi-infinite solids*\ , `Phys. Rev. B [74], 075420 (2006) `_ +simulation of elastic semi-infinite solids*, `Phys. Rev. B [74], 075420 (2006) `_ .. _Kong: **(Kong)** L.T. Kong, G. Bartels, C. Campana, C. Denniston, and Martin H. Muser, *Implementation of Green's -function molecular dynamics: An extension to LAMMPS*\ , `Computer Physics Communications [180](6):1004-1010 (2009). `_ +function molecular dynamics: An extension to LAMMPS*, `Computer Physics Communications [180](6):1004-1010 (2009). `_ L.T. Kong, C. Denniston, and Martin H. Muser, *An improved version of the Green's function molecular dynamics -method*\ , `Computer Physics Communications [182](2):540-541 (2011). `_ +method*, `Computer Physics Communications [182](2):540-541 (2011). `_ .. _Kong2011: **(Kong2011)** L.T. Kong, *Phonon dispersion measured directly from -molecular dynamics simulations*\ , `Computer Physics Communications [182](10):2201-2207, (2011). `_ +molecular dynamics simulations*, `Computer Physics Communications [182](10):2201-2207, (2011). `_ diff --git a/doc/src/fix_pimd.rst b/doc/src/fix_pimd.rst index 60e0847eab..9735284280 100644 --- a/doc/src/fix_pimd.rst +++ b/doc/src/fix_pimd.rst @@ -154,7 +154,7 @@ Restrictions This fix is part of the REPLICA package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. A PIMD simulation can be initialized with a single data file read via the :doc:`read_data ` command. However, this means all diff --git a/doc/src/fix_plumed.rst b/doc/src/fix_plumed.rst index fda37ff64e..c562ecc81d 100644 --- a/doc/src/fix_plumed.rst +++ b/doc/src/fix_plumed.rst @@ -115,7 +115,7 @@ Restrictions This fix is part of the PLUMED package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. There can only be one fix plumed command active at a time. diff --git a/doc/src/fix_poems.rst b/doc/src/fix_poems.rst index b782b7809e..7ecb4eef7d 100644 --- a/doc/src/fix_poems.rst +++ b/doc/src/fix_poems.rst @@ -57,14 +57,14 @@ Each body must have a non-degenerate inertia tensor, which means if must contain at least 3 non-collinear atoms. Which atoms are in which bodies can be defined via several options. -For option *group*\ , each of the listed groups is treated as a rigid +For option *group*, each of the listed groups is treated as a rigid body. Note that only atoms that are also in the fix group are included in each rigid body. -For option *molecule*\ , each set of atoms in the group with a different +For option *molecule*, each set of atoms in the group with a different molecule ID is treated as a rigid body. -For option *file*\ , sets of atoms are read from the specified file and +For option *file*, sets of atoms are read from the specified file and each set is treated as a rigid body. Each line of the file specifies a rigid body in the following format: @@ -136,7 +136,7 @@ Restrictions This fix is part of the :ref:`POEMS ` package. It is only enabled if LAMMPS was built with that package, which also requires the POEMS library be built and linked with LAMMPS. See the :doc:`Build -package ` doc page for more info. +package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_polarize.rst b/doc/src/fix_polarize.rst index bebed3aba0..e130d3010d 100644 --- a/doc/src/fix_polarize.rst +++ b/doc/src/fix_polarize.rst @@ -88,7 +88,7 @@ Restrictions These fixes are part of the DIELECTRIC package. It is only enabled if LAMMPS was built with that package, which requires that also the KSPACE package is installed. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands diff --git a/doc/src/fix_pour.rst b/doc/src/fix_pour.rst index 7757191482..742648ac76 100644 --- a/doc/src/fix_pour.rst +++ b/doc/src/fix_pour.rst @@ -158,10 +158,10 @@ many timesteps until the desired # of particles has been inserted. All other keywords are optional with defaults as shown below. The *diam* option is only used when inserting atoms and specifies the -diameters of inserted particles. There are 3 styles: *one*\ , *range*\ , -or *poly*\ . For *one*\ , all particles will have diameter *D*\ . For -*range*\ , the diameter of each particle will be chosen randomly and -uniformly between the specified *Dlo* and *Dhi* bounds. For *poly*\ , a +diameters of inserted particles. There are 3 styles: *one*, *range*, +or *poly*\ . For *one*, all particles will have diameter *D*\ . For +*range*, the diameter of each particle will be chosen randomly and +uniformly between the specified *Dlo* and *Dhi* bounds. For *poly*, a series of *Npoly* diameters is specified. For each diameter a percentage value from 0.0 to 1.0 is also specified. The *Npoly* percentages must sum to 1.0. For the example shown above with "diam 2 @@ -252,7 +252,7 @@ Restrictions """""""""""" This fix is part of the GRANULAR package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. For 3d simulations, a gravity fix in the -z direction must be defined for use in conjunction with this fix. For 2d simulations, gravity diff --git a/doc/src/fix_precession_spin.rst b/doc/src/fix_precession_spin.rst index 6a563bc32f..36a10c8ce6 100644 --- a/doc/src/fix_precession_spin.rst +++ b/doc/src/fix_precession_spin.rst @@ -175,7 +175,7 @@ Restrictions The *precession/spin* style is part of the SPIN package. This style is only enabled if LAMMPS was built with this package, and if the atom_style "spin" was declared. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_press_berendsen.rst b/doc/src/fix_press_berendsen.rst index eb7adafc57..6d92a00178 100644 --- a/doc/src/fix_press_berendsen.rst +++ b/doc/src/fix_press_berendsen.rst @@ -46,7 +46,7 @@ timestep. Regardless of what atoms are in the fix group, a global pressure is computed for all atoms. Similarly, when the size of the simulation box is changed, all atoms are re-scaled to new positions, unless the -keyword *dilate* is specified with a value of *partial*\ , in which case +keyword *dilate* is specified with a value of *partial*, in which case only the atoms in the fix group are re-scaled. The latter can be useful for leaving the coordinates of atoms in a solid substrate unchanged and controlling the pressure of a surrounding fluid. @@ -61,13 +61,13 @@ unchanged and controlling the pressure of a surrounding fluid. atoms. This fix can be used in conjunction with thermostatting fixes to control the temperature, such as :doc:`fix nvt ` or :doc:`fix langevin ` or :doc:`fix temp/berendsen `. -See the :doc:`Howto baroostat ` doc page for a +See the :doc:`Howto baroostat ` page for a discussion of different ways to perform barostatting. ---------- -The barostat is specified using one or more of the *iso*\ , *aniso*\ , -*x*\ , *y*\ , *z*\ , and *couple* keywords. These keywords give you the +The barostat is specified using one or more of the *iso*, *aniso*, +*x*, *y*, *z*, and *couple* keywords. These keywords give you the ability to specify the 3 diagonal components of an external stress tensor, and to couple various of these components together so that the dimensions they represent are varied together during a @@ -77,7 +77,7 @@ constant-pressure simulation. Unlike the :doc:`fix npt ` and general pressure tensor. The target pressures for each of the 3 diagonal components of the -stress tensor can be specified independently via the *x*\ , *y*\ , *z*\ , +stress tensor can be specified independently via the *x*, *y*, *z*, keywords, which correspond to the 3 simulation box dimensions. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . @@ -131,7 +131,7 @@ things: the instantaneous stress will be computed as an average of the corresponding diagonal components, and the coupled box dimensions will be changed together in lockstep, meaning coupled dimensions will be dilated or contracted by the same percentage every timestep. The -*Pstart*\ , *Pstop*\ , *Pdamp* parameters for any coupled dimensions must +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must be identical. *Couple xyz* can be used for a 2d simulation; the *z* dimension is simply ignored. @@ -152,8 +152,8 @@ specifying these 4 keywords: z Pstart Pstop Pdamp couple xyz -The keyword *aniso* means *x*\ , *y*\ , and *z* dimensions are controlled -independently using the *Pxx*\ , *Pyy*\ , and *Pzz* components of the +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the stress tensor as the driving forces, and the specified scalar external pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying these 4 keywords: diff --git a/doc/src/fix_propel_self.rst b/doc/src/fix_propel_self.rst index a086cb442b..863d43b6f2 100644 --- a/doc/src/fix_propel_self.rst +++ b/doc/src/fix_propel_self.rst @@ -146,7 +146,7 @@ Restrictions """""""""""" With keyword *dipole*, this fix only works when the DIPOLE package is enabled. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. This fix is part of the BROWNIAN package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package ` diff --git a/doc/src/fix_property_atom.rst b/doc/src/fix_property_atom.rst index 0768c59ac8..8ac19af25d 100644 --- a/doc/src/fix_property_atom.rst +++ b/doc/src/fix_property_atom.rst @@ -56,7 +56,7 @@ is read. This fix will augment the set of properties with new custom ones. This can be useful in several scenarios. If the atom style does not define molecule IDs, per-atom charge, -or per-atom mass, they can be added using the *mol*\ , *q* or *rmass* +or per-atom mass, they can be added using the *mol*, *q* or *rmass* keywords. This can be useful, e.g, to define "molecules" to use as rigid bodies with the :doc:`fix rigid ` command, or just to carry around an extra flag with the atoms (stored as a molecule ID) @@ -80,7 +80,7 @@ and second, it may define additional properties that are not needed such as bond lists, which has some overhead when there are no bonds. In the future, we may add additional per-atom properties similar to -*mol*\ , *q* or *rmass*\ , which "turn-on" specific properties defined +*mol*, *q* or *rmass*, which "turn-on" specific properties defined by some atom styles, so they can be used by atom styles that do not define them. @@ -108,7 +108,7 @@ new properties are also defined for the ghost atoms. .. admonition:: Properties on ghost atoms :class: note - If you use this command with the *mol*\ , *q* or *rmass* vectors, + If you use this command with the *mol*, *q* or *rmass* vectors, then you most likely want to set *ghost* yes, since these properties are stored with ghost atoms if you use an :doc:`atom_style ` that defines them, and many LAMMPS operations that use molecule IDs or diff --git a/doc/src/fix_python_invoke.rst b/doc/src/fix_python_invoke.rst index 94bad11f00..c82fb91a27 100644 --- a/doc/src/fix_python_invoke.rst +++ b/doc/src/fix_python_invoke.rst @@ -70,7 +70,7 @@ Restrictions """""""""""" This fix is part of the PYTHON package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Building LAMMPS with the PYTHON package will link LAMMPS with the Python library on your system. Settings to enable this are in the diff --git a/doc/src/fix_python_move.rst b/doc/src/fix_python_move.rst index 15014ef4fe..b338dcbfac 100644 --- a/doc/src/fix_python_move.rst +++ b/doc/src/fix_python_move.rst @@ -95,7 +95,7 @@ Restrictions """""""""""" This pair style is part of the PYTHON package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_qbmsst.rst b/doc/src/fix_qbmsst.rst index abf8ed1aae..5428eeb637 100644 --- a/doc/src/fix_qbmsst.rst +++ b/doc/src/fix_qbmsst.rst @@ -100,10 +100,10 @@ command :doc:`fix qtb ` at constant temperature *T_init* could be used before applying this command to introduce self-consistent quantum nuclear effects into the initial state. -The parameters *q*\ , *mu*\ , *e0*\ , *p0*\ , *v0* and *tscale* are described -in the command :doc:`fix msst `. The values of *e0*\ , *p0*\ , or +The parameters *q*, *mu*, *e0*, *p0*, *v0* and *tscale* are described +in the command :doc:`fix msst `. The values of *e0*, *p0*, or *v0* will be calculated on the first step if not specified. The -parameter of *damp*\ , *f_max*, and *N_f* are described in the command +parameter of *damp*, *f_max*, and *N_f* are described in the command :doc:`fix qtb `. The *fix qbmsst* command couples the shock system to a quantum thermal @@ -152,8 +152,8 @@ Because the state of the random number generator is not written to "exactly" in an uninterrupted fashion. However, in a statistical sense, a restarted simulation should produce similar behaviors of the system as if it is not interrupted. To achieve such a restart, one -should write explicitly the same value for *q*\ , *mu*\ , *damp*\ , -*f_max*, *N_f*, *eta*\ , and *beta* and set *tscale* = 0 if the system +should write explicitly the same value for *q*, *mu*, *damp*, +*f_max*, *N_f*, *eta*, and *beta* and set *tscale* = 0 if the system is compressed during the first run. The cumulative energy change in the system imposed by this fix is @@ -177,7 +177,7 @@ integration of the dynamic equations. The global vector contains five values in the following order. The vector values output by this fix are "intensive". -[\ *dhugoniot*\ , *drayleigh*\ , *lagrangian_speed*, *lagrangian_position*, +[\ *dhugoniot*, *drayleigh*, *lagrangian_speed*, *lagrangian_position*, *quantum_temperature*] 1. *dhugoniot* is the departure from the Hugoniot (temperature units). @@ -210,7 +210,7 @@ Restrictions This fix style is part of the QTB package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. All cell dimensions must be periodic. This fix can not be used with a triclinic cell. The QBMSST fix has been tested only for the group-ID diff --git a/doc/src/fix_qeq.rst b/doc/src/fix_qeq.rst index 113692da9b..eab35391b5 100644 --- a/doc/src/fix_qeq.rst +++ b/doc/src/fix_qeq.rst @@ -94,7 +94,7 @@ on the current atom configuration), then remove the fix via the `. The :doc:`fix qeq/reaxff ` command can be used to perform charge equilibration with the :doc:`ReaxFF force field `, although fix qeq/shielded yields the same - results as fix qeq/reaxff if *Nevery*\ , *cutoff*\ , and *tolerance* + results as fix qeq/reaxff if *Nevery*, *cutoff*, and *tolerance* are the same. Eventually the fix qeq/reaxff command will be deprecated. @@ -151,7 +151,7 @@ the shielded Coulomb is given by equation (13) of the :ref:`ReaxFF force field ` paper. The shielding accounts for charge overlap between charged particles at small separation. This style is the same as :doc:`fix qeq/reaxff `, and can be used with -:doc:`pair_style reaxff `. Only the *chi*\ , *eta*\ , and +:doc:`pair_style reaxff `. Only the *chi*, *eta*, and *gamma* parameters from the *qfile* file are used. When using the string *reaxff* as filename, these parameters are extracted directly from an active *reaxff* pair style. This style solves partial charges on atoms @@ -163,7 +163,7 @@ charge densities centered around atoms via the Slater 1\ *s* orbital, so that the interaction between a pair of charged particles is the product of two Slater 1\ *s* orbitals. The expression for the Slater 1\ *s* orbital is given under equation (6) of the :ref:`Streitz-Mintmire -` paper. Only the *chi*\ , *eta*\ , *zeta*\ , and *qcore* +` paper. Only the *chi*, *eta*, *zeta*, and *qcore* parameters from the *qfile* file are used. When using the string *coul/streitz* as filename, these parameters are extracted directly from an active *coul/streitz* pair style. This style solves partial charges @@ -186,16 +186,16 @@ minimization algorithm to solve for equilibrium charges. Keyword *qdamp* can be used to change the damping factor, while keyword *qstep* can be used to change the time step size. -Note that *qeq/point*\ , *qeq/shielded*\ , and *qeq/slater* describe +Note that *qeq/point*, *qeq/shielded*, and *qeq/slater* describe different charge models, whereas the matrix inversion method and the extended Lagrangian method (\ *qeq/dynamic* and *qeq/fire*\ ) are different solvers. -Note that *qeq/point*\ , *qeq/dynamic* and *qeq/fire* styles all +Note that *qeq/point*, *qeq/dynamic* and *qeq/fire* styles all describe charges as point charges that interact through 1/r relationship, but solve partial charges on atoms using different solvers. These three styles should yield comparable results if the QEq -parameters and *Nevery*\ , *cutoff*\ , and *tolerance* are the same. +parameters and *Nevery*, *cutoff*, and *tolerance* are the same. Style *qeq/point* is typically faster, *qeq/dynamic* scales better on larger sizes, and *qeq/fire* is faster than *qeq/dynamic*\ . @@ -228,7 +228,7 @@ Restrictions These fixes are part of the QEQ package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. The qeq fixes are not compatible with the GPU and USER-INTEL packages. diff --git a/doc/src/fix_qeq_reaxff.rst b/doc/src/fix_qeq_reaxff.rst index 96a20d4ca6..ada9e22ed7 100644 --- a/doc/src/fix_qeq_reaxff.rst +++ b/doc/src/fix_qeq_reaxff.rst @@ -57,7 +57,7 @@ with their neighbors. It requires some parameters for each atom type. If the *params* setting above is the word "reaxff", then these are extracted from the :doc:`pair_style reaxff ` command and the ReaxFF force field file it reads in. If a file name is specified -for *params*\ , then the parameters are taken from the specified file +for *params*, then the parameters are taken from the specified file and the file must contain one line for each atom type. The latter form must be used when performing QeQ with a non-ReaxFF potential. Each line should be formatted as follows: @@ -110,7 +110,7 @@ Restrictions This fix is part of the REAXFF package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This fix does not correctly handle interactions involving multiple periodic images of the same atom. Hence, it should not be used for diff --git a/doc/src/fix_qmmm.rst b/doc/src/fix_qmmm.rst index acbafccded..a62bd5ab1e 100644 --- a/doc/src/fix_qmmm.rst +++ b/doc/src/fix_qmmm.rst @@ -56,7 +56,7 @@ Restrictions This fix is part of the QMMM package. It is only enabled if LAMMPS was built with that package. It also requires building a -library provided with LAMMPS. See the :doc:`Build package ` doc page for more info. +library provided with LAMMPS. See the :doc:`Build package ` page for more info. The fix is only functional when LAMMPS is built as a library and linked with a compatible QM program and a QM/MM front end into a QM/MM diff --git a/doc/src/fix_qtb.rst b/doc/src/fix_qtb.rst index 6ea3e97f9a..e6975748c4 100644 --- a/doc/src/fix_qtb.rst +++ b/doc/src/fix_qtb.rst @@ -163,7 +163,7 @@ Restrictions This fix style is part of the QTB package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. ---------- diff --git a/doc/src/fix_reaxff_bonds.rst b/doc/src/fix_reaxff_bonds.rst index 5dd4df7765..15b2eb6da9 100644 --- a/doc/src/fix_reaxff_bonds.rst +++ b/doc/src/fix_reaxff_bonds.rst @@ -31,7 +31,7 @@ Description Write out the bond information computed by the ReaxFF potential specified by :doc:`pair_style reaxff ` in the exact same format as the original stand-alone ReaxFF code of Adri van Duin. The bond information -is written to *filename* on timesteps that are multiples of *Nevery*\ , +is written to *filename* on timesteps that are multiples of *Nevery*, including timestep 0. For time-averaged chemical species analysis, please see the :doc:`fix reaxff/species ` command. @@ -78,7 +78,7 @@ Restrictions The fix reaxff/bonds command requires that the :doc:`pair_style reaxff ` is invoked. This fix is part of the REAXFF package. It is only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. To write gzipped bond files, you must compile LAMMPS with the diff --git a/doc/src/fix_reaxff_species.rst b/doc/src/fix_reaxff_species.rst index bca9c2c726..434e18d8a5 100644 --- a/doc/src/fix_reaxff_species.rst +++ b/doc/src/fix_reaxff_species.rst @@ -87,15 +87,15 @@ chemical formula, total charge, and center-of-mass xyz positions of this molecule. The xyz positions are in fractional coordinates relative to the box dimensions. -For the keyword *position*\ , the *filepos* is the name of the output +For the keyword *position*, the *filepos* is the name of the output file. It can contain the wildcard character "\*". If the "\*" -character appears in *filepos*\ , then one file per snapshot is written +character appears in *filepos*, then one file per snapshot is written at *posfreq* and the "\*" character is replaced with the timestep value. For example, AuO.pos.\* becomes AuO.pos.0, AuO.pos.1000, etc. ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the bond-order values are sampled to get the average bond order. The species analysis is performed using the average bond-order on timesteps that are a multiple of *Nfreq*\ . The average is over @@ -148,7 +148,7 @@ Restrictions The "fix reaxff/species" requires that :doc:`pair_style reaxff ` is used. This fix is part of the REAXFF package. It is only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more info. +package. See the :doc:`Build package ` page for more info. To write gzipped species files, you must compile LAMMPS with the -DLAMMPS_GZIP option. diff --git a/doc/src/fix_recenter.rst b/doc/src/fix_recenter.rst index 583b4d46c5..a6243e693f 100644 --- a/doc/src/fix_recenter.rst +++ b/doc/src/fix_recenter.rst @@ -58,7 +58,7 @@ example, the COM could be computed on a protein to keep it in the center of the simulation box. But the entire system (protein + water) could be shifted. -If the *units* keyword is set to *box*\ , then the distance units of +If the *units* keyword is set to *box*, then the distance units of x,y,z are defined by the :doc:`units ` command - e.g. Angstroms for *real* units. A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been diff --git a/doc/src/fix_rhok.rst b/doc/src/fix_rhok.rst index f48b562ca8..9d6114328f 100644 --- a/doc/src/fix_rhok.rst +++ b/doc/src/fix_rhok.rst @@ -72,7 +72,7 @@ Restrictions This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_rigid.rst b/doc/src/fix_rigid.rst index 43750d59a1..5b367a48a4 100644 --- a/doc/src/fix_rigid.rst +++ b/doc/src/fix_rigid.rst @@ -253,7 +253,7 @@ differences may accumulate to produce divergent trajectories. they effect any computation of per-atom forces or torques. If the keyword *reinit* is set to *yes* (the default), the rigid body data structures will be recreated at the beginning of each *run* command; - if the keyword *reinit* is set to *no*\ , the rigid body data structures + if the keyword *reinit* is set to *no*, the rigid body data structures will be built only at the very first *run* command and maintained for as long as the rigid fix is defined. For example, you might think you could displace the atoms in a body or add a large velocity to each atom @@ -275,7 +275,7 @@ via several options. .. note:: With the *rigid/small* styles, which require that *bodystyle* be - specified as *molecule* or *custom*\ , you can define a system that has + specified as *molecule* or *custom*, you can define a system that has no rigid bodies initially. This is useful when you are using the *mol* keyword in conjunction with another fix that is adding rigid bodies on-the-fly as molecules, such as :doc:`fix deposit ` @@ -284,7 +284,7 @@ via several options. For bodystyle *single* the entire fix group of atoms is treated as one rigid body. This option is only allowed for the *rigid* styles. -For bodystyle *molecule*\ , atoms are grouped into rigid bodies by their +For bodystyle *molecule*, atoms are grouped into rigid bodies by their respective molecule IDs: each set of atoms in the fix group with the same molecule ID is treated as a different rigid body. This option is allowed for both the *rigid* and *rigid/small* styles. Note that @@ -300,7 +300,7 @@ of atoms that form rigid bodies. An integer vector defined by the :doc:`fix property/atom ` command can be used. Or an :doc:`atom-style or atomfile-style variable ` can be used; the floating-point value produced by the variable is rounded to an -integer. As with bodystyle *molecule*\ , each set of atoms in the fix +integer. As with bodystyle *molecule*, each set of atoms in the fix groups with the same integer value is treated as a different rigid body. Since fix property/atom vectors and atom-style variables produce values for all atoms, you should be careful to use a fix group @@ -388,7 +388,7 @@ body. ---------- -The *rigid*\ , *rigid/nve*\ , *rigid/small*\ , and *rigid/small/nve* styles +The *rigid*, *rigid/nve*, *rigid/small*, and *rigid/small/nve* styles perform constant NVE time integration. They are referred to below as the 4 NVE rigid styles. The only difference is that the *rigid* and *rigid/small* styles use an integration technique based on Richardson @@ -404,14 +404,14 @@ of the rigid bodies. They are referred to below as the 2 NVT rigid styles. The rigid-body algorithm used by *rigid/nvt* is described in the paper by :ref:`Kamberaj `. -The *rigid/npt*\ , *rigid/nph*\ , *rigid/npt/small*\ , and *rigid/nph/small* +The *rigid/npt*, *rigid/nph*, *rigid/npt/small*, and *rigid/nph/small* styles perform constant NPT or NPH integration using a Nose/Hoover barostat with chains. They are referred to below as the 4 NPT and NPH rigid styles. For the NPT case, the same Nose/Hoover thermostat is also used as with *rigid/nvt* and *rigid/nvt/small*\ . -The barostat parameters are specified using one or more of the *iso*\ , -*aniso*\ , *x*\ , *y*\ , *z* and *couple* keywords. These keywords give you +The barostat parameters are specified using one or more of the *iso*, +*aniso*, *x*, *y*, *z* and *couple* keywords. These keywords give you the ability to specify 3 diagonal components of the external stress tensor, and to couple these components together so that the dimensions they represent are varied together during a constant-pressure @@ -420,12 +420,12 @@ defined in :doc:`fix npt/nph ` .. note:: - Currently the *rigid/npt*\ , *rigid/nph*\ , *rigid/npt/small*\ , and + Currently the *rigid/npt*, *rigid/nph*, *rigid/npt/small*, and *rigid/nph/small* styles do not support triclinic (non-orthogonal) boxes. The target pressures for each of the 6 components of the stress tensor -can be specified independently via the *x*\ , *y*\ , *z* keywords, which +can be specified independently via the *x*, *y*, *z* keywords, which correspond to the 3 simulation box dimensions. For each component, the external pressure or tensor component at each timestep is a ramped value during the run from *Pstart* to *Pstop*\ . If a target pressure is @@ -465,7 +465,7 @@ things: the instantaneous stress will be computed as an average of the corresponding diagonal components, and the coupled box dimensions will be changed together in lockstep, meaning coupled dimensions will be dilated or contracted by the same percentage every timestep. The -*Pstart*\ , *Pstop*\ , *Pdamp* parameters for any coupled dimensions must +*Pstart*, *Pstop*, *Pdamp* parameters for any coupled dimensions must be identical. *Couple xyz* can be used for a 2d simulation; the *z* dimension is simply ignored. @@ -484,8 +484,8 @@ specifying these 4 keywords: z Pstart Pstop Pdamp couple xyz -The keyword *aniso* means *x*\ , *y*\ , and *z* dimensions are controlled -independently using the *Pxx*\ , *Pyy*\ , and *Pzz* components of the +The keyword *aniso* means *x*, *y*, and *z* dimensions are controlled +independently using the *Pxx*, *Pyy*, and *Pzz* components of the stress tensor as the driving forces, and the specified scalar external pressure. Using "aniso Pstart Pstop Pdamp" is the same as specifying these 4 keywords: @@ -517,8 +517,8 @@ discussed below. The *langevin* keyword applies a Langevin thermostat to the constant NVE time integration performed by any of the 4 NVE rigid styles: -*rigid*\ , *rigid/nve*\ , *rigid/small*\ , *rigid/small/nve*\ . It cannot be -used with the 2 NVT rigid styles: *rigid/nvt*\ , *rigid/small/nvt*\ . The +*rigid*, *rigid/nve*, *rigid/small*, *rigid/small/nve*\ . It cannot be +used with the 2 NVT rigid styles: *rigid/nvt*, *rigid/small/nvt*\ . The desired temperature at each timestep is a ramped value during the run from *Tstart* to *Tstop*\ . The *Tdamp* parameter is specified in time units and determines how rapidly the temperature is relaxed. For @@ -531,7 +531,7 @@ The way that Langevin thermostatting operates is explained on the :doc:`fix lang damp the rotational motion without thermostatting, you can set *Tstart* and *Tstop* to 0.0, which means only the viscous drag term in the Langevin thermostat will be applied. See the discussion on the -:doc:`fix viscous ` doc page for details. +:doc:`fix viscous ` page for details. .. note:: @@ -851,7 +851,7 @@ Restrictions """""""""""" These fixes are all part of the RIGID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Assigning a temperature via the :doc:`velocity create ` command to a system with :doc:`rigid bodies ` may not have diff --git a/doc/src/fix_rigid_meso.rst b/doc/src/fix_rigid_meso.rst index 32ad4aa6c6..0883897aae 100644 --- a/doc/src/fix_rigid_meso.rst +++ b/doc/src/fix_rigid_meso.rst @@ -104,7 +104,7 @@ internal energy and extrapolated velocity are also updated. they effect any computation of per-particle forces or torques. If the keyword *reinit* is set to *yes* (the default), the rigid body data structures will be recreated at the beginning of each *run* command; - if the keyword *reinit* is set to *no*\ , the rigid body data structures + if the keyword *reinit* is set to *no*, the rigid body data structures will be built only at the very first *run* command and maintained for as long as the rigid fix is defined. For example, you might think you could displace the particles in a body or add a large velocity to each particle @@ -126,7 +126,7 @@ defined via several options. For bodystyle *single* the entire fix group of particles is treated as one rigid body. -For bodystyle *molecule*\ , particles are grouped into rigid bodies by their +For bodystyle *molecule*, particles are grouped into rigid bodies by their respective molecule IDs: each set of particles in the fix group with the same molecule ID is treated as a different rigid body. Note that particles with a molecule ID = 0 will be treated as a single rigid body. For a @@ -141,13 +141,13 @@ of particles that form rigid bodies. An integer vector defined by the :doc:`fix property/atom ` command can be used. Or an :doc:`atom-style or atomfile-style variable ` can be used; the floating-point value produced by the variable is rounded to an -integer. As with bodystyle *molecule*\ , each set of particles in the fix +integer. As with bodystyle *molecule*, each set of particles in the fix groups with the same integer value is treated as a different rigid body. Since fix property/atom vectors and atom-style variables produce values for all particles, you should be careful to use a fix group that only includes particles you want to be part of rigid bodies. -For bodystyle *group*\ , each of the listed groups is treated as a +For bodystyle *group*, each of the listed groups is treated as a separate rigid body. Only particles that are also in the fix group are included in each rigid body. @@ -346,7 +346,7 @@ Restrictions This fix is part of the DPD-SMOOTH package and also depends on the RIGID package. It is only enabled if LAMMPS was built with both packages. See -the :doc:`Build package ` doc page for more info. +the :doc:`Build package ` page for more info. This fix requires that atoms store density and internal energy as defined by the :doc:`atom_style sph ` command. diff --git a/doc/src/fix_rx.rst b/doc/src/fix_rx.rst index c3406df5d0..4028a4e7e1 100644 --- a/doc/src/fix_rx.rst +++ b/doc/src/fix_rx.rst @@ -62,7 +62,7 @@ in concentration of a given species as a function of time are then constructed based on the *n* reaction rate equations. The ODE systems are solved over the full DPD timestep *dt* using either a fourth -order Runge-Kutta *rk4* method with a fixed step-size *h*\ , specified +order Runge-Kutta *rk4* method with a fixed step-size *h*, specified by the *lammps_rk4* keyword, or a fourth order Runge-Kutta-Fehlberg (rkf45) method with an adaptive step-size for *h*\ . The number of ODE steps per DPD timestep for the rk4 method is optionally specified immediately after the rk4 @@ -182,8 +182,8 @@ through its stoichiometric coefficient and a species tag. Reactant species are specified on the left-hand side of the equation and product species are specified on the right-hand side of the equation. After specifying the reactant and product species, the final three -arguments of each line represent the Arrhenius parameter *A*\ , the -temperature exponent *n*\ , and the activation energy *Ea*\ . +arguments of each line represent the Arrhenius parameter *A*, the +temperature exponent *n*, and the activation energy *Ea*\ . Note that the species tags that are defined in the reaction equations are used by the :doc:`fix eos/table/rx ` command to @@ -207,7 +207,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This command also requires use of the :doc:`atom_style dpd ` command. diff --git a/doc/src/fix_saed_vtk.rst b/doc/src/fix_saed_vtk.rst index 9dd8fb8641..a9e8f154e6 100644 --- a/doc/src/fix_saed_vtk.rst +++ b/doc/src/fix_saed_vtk.rst @@ -72,7 +72,7 @@ values, e.g. ---------- -The *Nevery*\ , *Nrepeat*\ , and *Nfreq* arguments specify on what +The *Nevery*, *Nrepeat*, and *Nfreq* arguments specify on what timesteps the input values will be used in order to contribute to the average. The final averaged quantities are generated on timesteps that are a multiple of *Nfreq*\ . The average is over *Nrepeat* @@ -126,14 +126,14 @@ Additional optional keywords also affect the operation of this fix. The *ave* keyword determines how the values produced every *Nfreq* steps are averaged with values produced on previous steps that were -multiples of *Nfreq*\ , before they are accessed by another output +multiples of *Nfreq*, before they are accessed by another output command or written to a file. -If the *ave* setting is *one*\ , then the values produced on timesteps +If the *ave* setting is *one*, then the values produced on timesteps that are multiples of *Nfreq* are independent of each other; they are output as-is without further averaging. -If the *ave* setting is *running*\ , then the values produced on +If the *ave* setting is *running*, then the values produced on timesteps that are multiples of *Nfreq* are summed and averaged in a cumulative sense before being output. Each output value is thus the average of the value produced on that timestep with all preceding @@ -141,7 +141,7 @@ values. This running average begins when the fix is defined; it can only be restarted by deleting the fix via the :doc:`unfix ` command, or by re-defining the fix by re-specifying it. -If the *ave* setting is *window*\ , then the values produced on +If the *ave* setting is *window*, then the values produced on timesteps that are multiples of *Nfreq* are summed and averaged within a moving "window" of time, so that the last M values are used to produce the output. E.g. if M = 3 and Nfreq = 1000, then the output diff --git a/doc/src/fix_setforce.rst b/doc/src/fix_setforce.rst index 406826e5b9..fd1eb70c4a 100644 --- a/doc/src/fix_setforce.rst +++ b/doc/src/fix_setforce.rst @@ -54,8 +54,8 @@ Any of the fx,fy,fz values can be specified as NULL which means do not alter the force component in that dimension. Any of the 3 quantities defining the force components can be specified -as an equal-style or atom-style :doc:`variable `, namely *fx*\ , -*fy*\ , *fz*\ . If the value is a variable, it should be specified as +as an equal-style or atom-style :doc:`variable `, namely *fx*, +*fy*, *fz*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to determine the force component. @@ -89,7 +89,7 @@ precession vectors instead of the forces. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -101,13 +101,13 @@ region must be used. See the region :doc:`region ` command for more information. These accelerated styles are part of the r Kokkos package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- diff --git a/doc/src/fix_shake.rst b/doc/src/fix_shake.rst index 8e8f3e0988..f0c847cb5e 100644 --- a/doc/src/fix_shake.rst +++ b/doc/src/fix_shake.rst @@ -71,8 +71,8 @@ required in order to eliminate velocity components along the bonds In order to formulate individual constraints for SHAKE and RATTLE, focus on a single molecule whose bonds are constrained. Let Ri and Vi -be the position and velocity of atom *i* at time *n*\ , for -*i* =1,...,\ *N*\ , where *N* is the number of sites of our reference +be the position and velocity of atom *i* at time *n*, for +*i* =1,...,\ *N*, where *N* is the number of sites of our reference molecule. The distance vector between sites *i* and *j* is given by .. math:: @@ -213,7 +213,7 @@ Restrictions These fixes are part of the RIGID package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. For computational efficiency, there can only be one shake or rattle fix defined in a simulation. diff --git a/doc/src/fix_shardlow.rst b/doc/src/fix_shardlow.rst index 9f60df7e75..94e4b557f5 100644 --- a/doc/src/fix_shardlow.rst +++ b/doc/src/fix_shardlow.rst @@ -42,9 +42,9 @@ necessary). Note that numerous variants of DPD can be specified by choosing an appropriate combination of the integrator and :doc:`pair_style dpd/fdt ` command. DPD under isothermal conditions can -be specified by using fix *shardlow*\ , fix *nve* and pair_style +be specified by using fix *shardlow*, fix *nve* and pair_style *dpd/fdt*\ . DPD under isoenergetic conditions can be specified by -using fix *shardlow*\ , fix *nve* and pair_style *dpd/fdt/energy*\ . DPD +using fix *shardlow*, fix *nve* and pair_style *dpd/fdt/energy*\ . DPD under isobaric conditions can be specified by using fix shardlow, fix *nph* and pair_style *dpd/fdt*\ . DPD under isoenthalpic conditions can be specified by using fix shardlow, fix *nph* and pair_style @@ -61,7 +61,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This fix is currently limited to orthogonal simulation cell geometries. diff --git a/doc/src/fix_smd.rst b/doc/src/fix_smd.rst index f59a852be6..93554a4510 100644 --- a/doc/src/fix_smd.rst +++ b/doc/src/fix_smd.rst @@ -145,7 +145,7 @@ Restrictions """""""""""" This fix is part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_adjust_dt.rst b/doc/src/fix_smd_adjust_dt.rst index c1dc008c55..0f1be7ed24 100644 --- a/doc/src/fix_smd_adjust_dt.rst +++ b/doc/src/fix_smd_adjust_dt.rst @@ -55,7 +55,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_integrate_tlsph.rst b/doc/src/fix_smd_integrate_tlsph.rst index 4f19b98c49..c4f5e61c7e 100644 --- a/doc/src/fix_smd_integrate_tlsph.rst +++ b/doc/src/fix_smd_integrate_tlsph.rst @@ -51,7 +51,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_integrate_ulsph.rst b/doc/src/fix_smd_integrate_ulsph.rst index d6bcdd68a5..8f2e0b2b88 100644 --- a/doc/src/fix_smd_integrate_ulsph.rst +++ b/doc/src/fix_smd_integrate_ulsph.rst @@ -59,7 +59,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_move_triangulated_surface.rst b/doc/src/fix_smd_move_triangulated_surface.rst index 2da904400a..76f7240007 100644 --- a/doc/src/fix_smd_move_triangulated_surface.rst +++ b/doc/src/fix_smd_move_triangulated_surface.rst @@ -73,7 +73,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_setvel.rst b/doc/src/fix_smd_setvel.rst index bc475914df..9dcc3c636c 100644 --- a/doc/src/fix_smd_setvel.rst +++ b/doc/src/fix_smd_setvel.rst @@ -42,8 +42,8 @@ alter the velocity component in that dimension. This fix is indented to be used together with a time integration fix. Any of the 3 quantities defining the velocity components can be specified -as an equal-style or atom-style :doc:`variable `, namely *vx*\ , -*vy*\ , *vz*\ . If the value is a variable, it should be specified as +as an equal-style or atom-style :doc:`variable `, namely *vx*, +*vy*, *vz*\ . If the value is a variable, it should be specified as v_name, where name is the variable name. In this case, the variable will be evaluated each timestep, and its value used to determine the force component. @@ -82,7 +82,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_smd_wall_surface.rst b/doc/src/fix_smd_wall_surface.rst index 040cfa7483..192ab7a518 100644 --- a/doc/src/fix_smd_wall_surface.rst +++ b/doc/src/fix_smd_wall_surface.rst @@ -60,7 +60,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The molecule ID given to the particles created by this fix have to be equal to or larger than 65535. diff --git a/doc/src/fix_sph.rst b/doc/src/fix_sph.rst index 624209660c..1133142f05 100644 --- a/doc/src/fix_sph.rst +++ b/doc/src/fix_sph.rst @@ -45,7 +45,7 @@ Restrictions """""""""""" This fix is part of the SPH package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_sph_stationary.rst b/doc/src/fix_sph_stationary.rst index a239ce478e..4496a10eca 100644 --- a/doc/src/fix_sph_stationary.rst +++ b/doc/src/fix_sph_stationary.rst @@ -45,7 +45,7 @@ Restrictions """""""""""" This fix is part of the SPH package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_spring_rg.rst b/doc/src/fix_spring_rg.rst index 21035f9def..aba35c8134 100644 --- a/doc/src/fix_spring_rg.rst +++ b/doc/src/fix_spring_rg.rst @@ -83,7 +83,9 @@ integrator the fix is adding its forces. Default is the outermost level. Restrictions """""""""""" - none + +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_srd.rst b/doc/src/fix_srd.rst index 4ff260f575..872bee181c 100644 --- a/doc/src/fix_srd.rst +++ b/doc/src/fix_srd.rst @@ -185,7 +185,7 @@ needed. The *radius* keyword scales the effective size of big particles. If big particles will overlap as they undergo dynamics, then this keyword can be used to scale down their effective collision radius by an -amount *rfactor*\ , so that SRD particle will only collide with one big +amount *rfactor*, so that SRD particle will only collide with one big particle at a time. For example, in a Lennard-Jones system at a temperature of 1.0 (in reduced LJ units), the minimum separation between two big particles is as small as about 0.88 sigma. Thus an @@ -267,15 +267,15 @@ vector. The specified random number *shiftseed* is used to generate these vectors. This operation sufficiently randomizes which SRD particles are in the same bin, even if :math:`lambda` is small. -If the *shift* flag is set to *no*\ , then no shifting is performed, but +If the *shift* flag is set to *no*, then no shifting is performed, but bin data will be communicated if bins overlap processor boundaries. An error will be generated if :math:`\lambda < 0.6` of the SRD bin size. -If the *shift* flag is set to *possible*\ , then shifting is performed +If the *shift* flag is set to *possible*, then shifting is performed only if :math:`\lambda < 0.6` of the SRD bin size. A warning is generated to let you know this is occurring. If the *shift* flag is set to *yes* then shifting is performed regardless of the magnitude of :math:`\lambda`. Note that the *shiftseed* is not used if the *shift* -flag is set to *no*\ , but must still be specified. +flag is set to *no*, but must still be specified. Note that shifting of SRD coordinates requires extra communication, hence it should not normally be enabled unless required. diff --git a/doc/src/fix_store_state.rst b/doc/src/fix_store_state.rst index 3841ef6359..829a25b517 100644 --- a/doc/src/fix_store_state.rst +++ b/doc/src/fix_store_state.rst @@ -94,7 +94,7 @@ steps. The list of possible attributes is the same as that used by the :doc:`dump custom ` command, which describes their meaning. -If the *com* keyword is set to *yes* then the *xu*\ , *yu*\ , and *zu* +If the *com* keyword is set to *yes* then the *xu*, *yu*, and *zu* inputs store the position of each atom relative to the center-of-mass of the group of atoms, instead of storing the absolute position. diff --git a/doc/src/fix_temp_berendsen.rst b/doc/src/fix_temp_berendsen.rst index 59f4de64a9..89fc2392f4 100644 --- a/doc/src/fix_temp_berendsen.rst +++ b/doc/src/fix_temp_berendsen.rst @@ -76,7 +76,7 @@ time. Thus it is easy to specify a time-dependent temperature. be used on atoms that also have their temperature controlled by another fix - e.g. by :doc:`fix nvt ` or :doc:`fix langevin ` commands. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. diff --git a/doc/src/fix_temp_csvr.rst b/doc/src/fix_temp_csvr.rst index 3652635340..81379f346b 100644 --- a/doc/src/fix_temp_csvr.rst +++ b/doc/src/fix_temp_csvr.rst @@ -85,7 +85,7 @@ time. Thus it is easy to specify a time-dependent temperature. normally be used on atoms that also have their temperature controlled by another fix - e.g. by :doc:`fix nvt ` or :doc:`fix langevin ` commands. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. @@ -178,6 +178,9 @@ Restrictions Fix *temp/csld* is not compatible with :doc:`fix shake `. +These fixes are part of the EXTRA-FIX package. They are only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. + These fixes can be used with dynamic groups as defined by the :doc:`group ` command. Likewise it can be used with groups to which atoms are added or deleted over time, e.g. a deposition diff --git a/doc/src/fix_temp_rescale.rst b/doc/src/fix_temp_rescale.rst index 125f74306e..a61773d2a2 100644 --- a/doc/src/fix_temp_rescale.rst +++ b/doc/src/fix_temp_rescale.rst @@ -83,7 +83,7 @@ value. be used on atoms that also have their temperature controlled by another fix - e.g. by :doc:`fix nvt ` or :doc:`fix langevin ` commands. -See the :doc:`Howto thermostat ` doc page for a +See the :doc:`Howto thermostat ` page for a discussion of different ways to compute temperature and perform thermostatting. diff --git a/doc/src/fix_temp_rescale_eff.rst b/doc/src/fix_temp_rescale_eff.rst index 1eaa8cf360..ea3996e9b6 100644 --- a/doc/src/fix_temp_rescale_eff.rst +++ b/doc/src/fix_temp_rescale_eff.rst @@ -67,7 +67,7 @@ Restrictions """""""""""" This fix is part of the EFF package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_tfmc.rst b/doc/src/fix_tfmc.rst index ae8420089a..7eb4d24935 100644 --- a/doc/src/fix_tfmc.rst +++ b/doc/src/fix_tfmc.rst @@ -84,7 +84,7 @@ and the :doc:`simulated time ` as calculated by LAMMPS is meaningless. The critical parameter determining the success of a tfMC simulation is -*Delta*\ , the maximal displacement length of the lightest element in +*Delta*, the maximal displacement length of the lightest element in the system: the larger it is, the longer the effective time scale of the simulation will be (there is an approximately quadratic dependence). However, *Delta* must also be chosen sufficiently small @@ -92,7 +92,7 @@ in order to comply with detailed balance; in general values between 5 and 10 % of the nearest neighbor distance are found to be a good choice. For a more extensive discussion with specific examples, please refer to :ref:`(Bal) `, which also describes how the code calculates -element-specific maximal displacements from *Delta*\ , based on the +element-specific maximal displacements from *Delta*, based on the fourth root of their mass. Because of the uncorrelated movements of the atoms, the center-of-mass diff --git a/doc/src/fix_tgnh_drude.rst b/doc/src/fix_tgnh_drude.rst index 744c7e75f3..7088692353 100644 --- a/doc/src/fix_tgnh_drude.rst +++ b/doc/src/fix_tgnh_drude.rst @@ -139,7 +139,7 @@ The parameter *Tdrude* is the desired temperature for Drude motion at each times Similar to *Tdamp*, the *Tdamp_drude* parameter determines the relaxation speed for Drude motion. Fix group are the only ones whose velocities and positions are updated by the velocity/position update portion of the integration. -Other thermostat-related keywords are *tchain*\ and *tloop*\ , +Other thermostat-related keywords are *tchain*\ and *tloop*, which are detailed in :doc:`fix nvt `. .. note:: @@ -158,13 +158,13 @@ which are detailed in :doc:`fix nvt `. ---------- The barostat parameters for fix style *tgnpt/drude* is specified -using one or more of the *iso*\ , *aniso*\ , *tri*\ , *x*\ , *y*\ , *z*\ , *xy*\ , -*xz*\ , *yz*\ , and *couple* keywords. These keywords give you the +using one or more of the *iso*, *aniso*, *tri*, *x*, *y*, *z*, *xy*, +*xz*, *yz*, and *couple* keywords. These keywords give you the ability to specify all 6 components of an external stress tensor, and to couple various of these components together so that the dimensions they represent are varied together during a constant-pressure -simulation. Other barostat-related keywords are *pchain*\ , *mtk*\ , *ploop*\ , -*nreset*\ , *scalexy*\ , *scaleyz*\ , *scalexz*\ , *flip*\ and *fixedpoint*. +simulation. Other barostat-related keywords are *pchain*, *mtk*, *ploop*, +*nreset*, *scalexy*, *scaleyz*, *scalexz*, *flip*\ and *fixedpoint*. The meaning of barostat parameters are detailed in :doc:`fix npt `. Regardless of what atoms are in the fix group (the only atoms which @@ -244,7 +244,7 @@ compute temperature on a subset of atoms. The cumulative energy change in the system imposed by these fixes, due to thermostatting and/or barostatting, are included in the :doc:`thermodynamic output ` keywords *ecouple* and -*econserve*. See the :doc:`thermo_style ` doc page for +*econserve*. See the :doc:`thermo_style ` page for details. These fixes compute a global scalar which can be accessed by various @@ -275,8 +275,8 @@ DRUDE package. These fixes cannot be used with dynamic groups as defined by the :doc:`group ` command. These fixes cannot be used in 2D simulations. -*X*\ , *y*\ , *z* cannot be barostatted if the associated dimension is not -periodic. *Xy*\ , *xz*\ , and *yz* can only be barostatted if the +*X*, *y*, *z* cannot be barostatted if the associated dimension is not +periodic. *Xy*, *xz*, and *yz* can only be barostatted if the simulation domain is triclinic and the second dimension in the keyword (\ *y* dimension in *xy*\ ) is periodic. The :doc:`create_box `, :doc:`read data `, and :doc:`read_restart ` @@ -288,10 +288,10 @@ For the *temp* keyword, the final *Tstop* cannot be 0.0 since it would make the external T = 0.0 at some timestep during the simulation which is not allowed in the Nose/Hoover formulation. -The *scaleyz yes*\ , *scalexz yes*\ , and *scalexy yes* options +The *scaleyz yes*, *scalexz yes*, and *scalexy yes* options can only be used if the second dimension in the keyword is periodic, and if the tilt factor is not coupled to the barostat via keywords -*tri*\ , *yz*\ , *xz*\ , and *xy*\ . +*tri*, *yz*, *xz*, and *xy*\ . Related commands """""""""""""""" diff --git a/doc/src/fix_thermal_conductivity.rst b/doc/src/fix_thermal_conductivity.rst index 96dbc43540..0652810267 100644 --- a/doc/src/fix_thermal_conductivity.rst +++ b/doc/src/fix_thermal_conductivity.rst @@ -129,9 +129,6 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. - Swaps conserve both momentum and kinetic energy, even if the masses of the swapped atoms are not equal. Thus you should not need to thermostat the system. If you do use a thermostat, you may want to diff --git a/doc/src/fix_ti_spring.rst b/doc/src/fix_ti_spring.rst index e7758350f7..d519f36157 100644 --- a/doc/src/fix_ti_spring.rst +++ b/doc/src/fix_ti_spring.rst @@ -172,7 +172,7 @@ Restrictions This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Default """"""" diff --git a/doc/src/fix_tmd.rst b/doc/src/fix_tmd.rst index 9c9d77820d..b4595d24cd 100644 --- a/doc/src/fix_tmd.rst +++ b/doc/src/fix_tmd.rst @@ -105,6 +105,9 @@ This fix is not invoked during :doc:`energy minimization `. Restrictions """""""""""" +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. + All TMD fixes must be listed in the input script after all integrator fixes (nve, nvt, npt) are applied. This ensures that atoms are moved before their positions are corrected to comply with the constraint. diff --git a/doc/src/fix_ttm.rst b/doc/src/fix_ttm.rst index 92a884ee58..ee416304c4 100644 --- a/doc/src/fix_ttm.rst +++ b/doc/src/fix_ttm.rst @@ -324,7 +324,7 @@ Restrictions Fix *ttm* and *ttm/mod* are part of the EXTRA-FIX package. They are only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. These fixes can only be used for 3d simulations and orthogonal simulation boxes. You must also use periodic diff --git a/doc/src/fix_tune_kspace.rst b/doc/src/fix_tune_kspace.rst index 744db9dcf3..6a3cba16e4 100644 --- a/doc/src/fix_tune_kspace.rst +++ b/doc/src/fix_tune_kspace.rst @@ -81,7 +81,7 @@ Restrictions """""""""""" This fix is part of the KSPACE package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Do not set "neigh_modify once yes" or else this fix will never be called. Reneighboring is required. diff --git a/doc/src/fix_vector.rst b/doc/src/fix_vector.rst index b2c05b1af7..f4eee41269 100644 --- a/doc/src/fix_vector.rst +++ b/doc/src/fix_vector.rst @@ -75,7 +75,7 @@ be used, since they produce per-atom values. The *Nevery* argument specifies on what timesteps the input values will be used in order to be stored. Only timesteps that are a -multiple of *Nevery*\ , including timestep 0, will contribute values. +multiple of *Nevery*, including timestep 0, will contribute values. Note that if you perform multiple runs, using the "pre no" option of the :doc:`run ` command to avoid initialization on subsequent runs, @@ -107,7 +107,7 @@ bracketed term is appended, the Ith element of the global vector calculated by the fix is used. Note that some fixes only produce their values on certain timesteps, -which must be compatible with *Nevery*\ , else an error will result. +which must be compatible with *Nevery*, else an error will result. Users can also write code for their own fix styles and :doc:`add them to LAMMPS `. If a value begins with "v\_", a variable name must follow which has @@ -144,7 +144,7 @@ the vector are "intensive" or "extensive". If the fix produces an array, then all elements in the array must be the same, either "intensive" or "extensive". If a compute or fix provides the value stored, then the compute or fix determines whether the value is -intensive or extensive; see the doc page for that compute or fix for +intensive or extensive; see the page for that compute or fix for further info. Values produced by a variable are treated as intensive. This fix can allocate storage for stored values accumulated over diff --git a/doc/src/fix_viscosity.rst b/doc/src/fix_viscosity.rst index d238c099b5..e077af19f4 100644 --- a/doc/src/fix_viscosity.rst +++ b/doc/src/fix_viscosity.rst @@ -134,8 +134,8 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS +was built with that package. See the :doc:`Build package ` page for more info. Swaps conserve both momentum and kinetic energy, even if the masses of the swapped atoms are not equal. Thus you should not need to diff --git a/doc/src/fix_wall.rst b/doc/src/fix_wall.rst index 2a2aba777d..bcbead8824 100644 --- a/doc/src/fix_wall.rst +++ b/doc/src/fix_wall.rst @@ -103,7 +103,7 @@ wall that interacts with the atoms in the group by generating a force on the atom in a direction perpendicular to the wall. The energy of wall-particle interactions depends on the style. -For style *wall/lj93*\ , the energy E is given by the 9/3 potential: +For style *wall/lj93*, the energy E is given by the 9/3 potential: .. math:: @@ -111,7 +111,7 @@ For style *wall/lj93*\ , the energy E is given by the 9/3 potential: \left(\frac{\sigma}{r}\right)^3 \right] \qquad r < r_c -For style *wall/lj126*\ , the energy E is given by the 12/6 potential: +For style *wall/lj126*, the energy E is given by the 12/6 potential: .. math:: @@ -119,7 +119,7 @@ For style *wall/lj126*\ , the energy E is given by the 12/6 potential: \left(\frac{\sigma}{r}\right)^6 \right] \qquad r < r_c -For style *wall/lj1043*\ , the energy E is given by the 10/4/3 potential: +For style *wall/lj1043*, the energy E is given by the 10/4/3 potential: .. math:: @@ -128,7 +128,7 @@ For style *wall/lj1043*\ , the energy E is given by the 10/4/3 potential: \frac{\sqrt(2)\sigma^3}{3\left(r+\left(0.61/\sqrt(2)\right)\sigma\right)^3}\right] \qquad r < r_c -For style *wall/colloid*\ , the energy E is given by an integrated form +For style *wall/colloid*, the energy E is given by an integrated form of the :doc:`pair_style colloid ` potential: .. math:: @@ -138,14 +138,14 @@ of the :doc:`pair_style colloid ` potential: & \left. - \frac{1}{6} \left(\frac{2R(D+R) + D(D+2R) \left[ \ln D - \ln (D+2R) \right]}{D(D+2R)} \right) \right] \qquad r < r_c -For style *wall/harmonic*\ , the energy E is given by a harmonic spring +For style *wall/harmonic*, the energy E is given by a harmonic spring potential: .. math:: E = \epsilon \quad (r - r_c)^2 \qquad r < r_c -For style *wall/morse*\ , the energy E is given by a Morse potential: +For style *wall/morse*, the energy E is given by a Morse potential: .. math:: @@ -153,13 +153,13 @@ For style *wall/morse*\ , the energy E is given by a Morse potential: \qquad r < r_c In all cases, *r* is the distance from the particle to the wall at -position *coord*\ , and :math:`r_c` is the *cutoff* distance at which the +position *coord*, and :math:`r_c` is the *cutoff* distance at which the particle and wall no longer interact. The energy of the wall potential is shifted so that the wall-particle interaction energy is 0.0 at the cutoff distance. -Up to 6 walls or faces can be specified in a single command: *xlo*\ , -*xhi*\ , *ylo*\ , *yhi*\ , *zlo*\ , *zhi*\ . A *lo* face interacts with +Up to 6 walls or faces can be specified in a single command: *xlo*, +*xhi*, *ylo*, *yhi*, *zlo*, *zhi*\ . A *lo* face interacts with particles near the lower side of the simulation box in that dimension. A *hi* face interacts with particles near the upper side of the simulation box in that dimension. @@ -267,13 +267,13 @@ The *fld* keyword can be used with a *yes* setting to invoke the wall constraint before pairwise interactions are computed. This allows an implicit FLD model using :doc:`pair_style lubricateU ` to include the wall force in its calculations. If the setting is -*no*\ , wall forces are imposed after pairwise interactions, in the +*no*, wall forces are imposed after pairwise interactions, in the usual manner. The *pbc* keyword can be used with a *yes* setting to allow walls to be specified in a periodic dimension. See the :doc:`boundary ` command for options on simulation box -boundaries. The default for *pbc* is *no*\ , which means the system +boundaries. The default for *pbc* is *no*, which means the system must be non-periodic when using a wall. But you may wish to use a periodic box. E.g. to allow some particles to interact with the wall via the fix group-ID, and others to pass through it and wrap around a @@ -306,7 +306,7 @@ sigma) could be varied with additional variable definitions. The *ramp(lo,hi)* function adjusts the wall position linearly from *lo* to *hi* over the course of a run. The *vdisplace(c0,velocity)* function does -something similar using the equation *position = c0 + velocity\*delta*\ , +something similar using the equation *position = c0 + velocity\*delta*, where *delta* is the elapsed time. The *swiggle(c0,A,period)* function causes the wall position to diff --git a/doc/src/fix_wall_body_polygon.rst b/doc/src/fix_wall_body_polygon.rst index 079bd633ea..ac0a58f55c 100644 --- a/doc/src/fix_wall_body_polygon.rst +++ b/doc/src/fix_wall_body_polygon.rst @@ -51,7 +51,7 @@ particles in the group interact with the wall when they are close enough to touch it. The nature of the interaction between the wall and the polygon particles is the same as that between the polygon particles themselves, which is similar to a Hookean potential. See -the :doc:`Howto body ` doc page for more details on using +the :doc:`Howto body ` page for more details on using body particles. The parameters *k_n*, *c_n*, *c_t* have the same meaning and units as @@ -83,7 +83,7 @@ is set according to this equation: position = coord + A - A cos (omega \* delta) where *coord* is the specified initial position of the wall, *A* is -the *amplitude*\ , *omega* is 2 PI / *period*\ , and *delta* is the time +the *amplitude*, *omega* is 2 PI / *period*, and *delta* is the time elapsed since the fix was specified. The velocity of the wall is set to the derivative of this expression. @@ -100,7 +100,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Any dimension (xy) that has a wall must be non-periodic. diff --git a/doc/src/fix_wall_body_polyhedron.rst b/doc/src/fix_wall_body_polyhedron.rst index ad6540de1d..9930c10f74 100644 --- a/doc/src/fix_wall_body_polyhedron.rst +++ b/doc/src/fix_wall_body_polyhedron.rst @@ -50,7 +50,7 @@ All particles in the group interact with the wall when they are close enough to touch it. The nature of the interaction between the wall and the polygon particles is the same as that between the polygon particles themselves, which is similar to a Hookean potential. See -the :doc:`Howto body ` doc page for more details on using +the :doc:`Howto body ` page for more details on using body particles. The parameters *k_n*, *c_n*, *c_t* have the same meaning and units as @@ -79,7 +79,7 @@ is set according to this equation: position = coord + A - A cos (omega \* delta) where *coord* is the specified initial position of the wall, *A* is -the *amplitude*\ , *omega* is 2 PI / *period*\ , and *delta* is the time +the *amplitude*, *omega* is 2 PI / *period*, and *delta* is the time elapsed since the fix was specified. The velocity of the wall is set to the derivative of this expression. @@ -96,7 +96,7 @@ Restrictions """""""""""" This fix is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Any dimension (xyz) that has a wall must be non-periodic. diff --git a/doc/src/fix_wall_ees.rst b/doc/src/fix_wall_ees.rst index a2aab975ca..13a7935d0d 100644 --- a/doc/src/fix_wall_ees.rst +++ b/doc/src/fix_wall_ees.rst @@ -73,7 +73,7 @@ energy of wall-particle interactions E is given by: Introduced by Babadi and Ejtehadi in :ref:`(Babadi) `. Here, *r* is the distance from the particle to the -wall at position *coord*\ , and Rc is the *cutoff* distance at which +wall at position *coord*, and Rc is the *cutoff* distance at which the particle and wall no longer interact. Also, :math:`\sigma_n` is the distance between center of ellipsoid and the nearest point of its surface to the wall as shown below. @@ -162,7 +162,7 @@ Restrictions These fixes are part of the EXTRA-FIX package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. These fixes requires that atoms be ellipsoids as defined by the :doc:`atom_style ellipsoid ` command. diff --git a/doc/src/fix_wall_gran.rst b/doc/src/fix_wall_gran.rst index 57bec679e4..cf8b659df0 100644 --- a/doc/src/fix_wall_gran.rst +++ b/doc/src/fix_wall_gran.rst @@ -22,7 +22,7 @@ Syntax .. parsed-literal:: - For *hooke*\ , *hooke/history*\ , and *hertz/history*\ , *fstyle_params* are: + For *hooke*, *hooke/history*, and *hertz/history*, *fstyle_params* are: Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) @@ -33,7 +33,7 @@ Syntax .. parsed-literal:: - For *granular*\ , *fstyle_params* are set using the same syntax as for the *pair_coeff* command of :doc:`pair_style granular ` + For *granular*, *fstyle_params* are set using the same syntax as for the *pair_coeff* command of :doc:`pair_style granular ` * wallstyle = *xplane* or *yplane* or *zplane* or *zcylinder* * args = list of arguments for a particular style @@ -85,7 +85,7 @@ The nature of the wall/particle interactions are determined by the *fstyle* setting. It can be any of the styles defined by the :doc:`pair_style gran/\* ` or the more general :doc:`pair_style granular ` commands. Currently the -options are *hooke*\ , *hooke/history*\ , or *hertz/history* for the +options are *hooke*, *hooke/history*, or *hertz/history* for the former, and *granular* with all the possible options of the associated *pair_coeff* command for the latter. The equation for the force between the wall and particles touching it is the same as the @@ -96,12 +96,12 @@ Specifically, delta = radius - r = overlap of particle with wall, m_eff = mass of particle, and the effective radius of contact = RiRj/Ri+Rj is set to the radius of the particle. -The parameters *Kn*\ , *Kt*\ , *gamma_n*, *gamma_t*, *xmu*, *dampflag*, +The parameters *Kn*, *Kt*, *gamma_n*, *gamma_t*, *xmu*, *dampflag*, and the optional keyword *limit_damping* have the same meaning and units as those specified with the :doc:`pair_style gran/\* ` commands. This means a NULL can be used for either *Kt* or *gamma_t* as described on that page. If a -NULL is used for *Kt*\ , then a default value is used where *Kt* = 2/7 +NULL is used for *Kt*, then a default value is used where *Kt* = 2/7 *Kn*\ . If a NULL is used for *gamma_t*, then a default value is used where *gamma_t* = 1/2 *gamma_n*. @@ -117,7 +117,7 @@ material. .. note:: - As discussed on the doc page for :doc:`pair_style gran/\* `, + As discussed on the page for :doc:`pair_style gran/\* `, versions of LAMMPS before 9Jan09 used a different equation for Hertzian interactions. This means Hertizian wall/particle interactions have also changed. They now include a @@ -131,7 +131,7 @@ material. Kt, gamma_n, and gamma_s should be set sqrt(2.0) larger than they were previously. -The effective mass *m_eff* in the formulas listed on the :doc:`pair_style granular ` doc page is the mass of the particle for +The effective mass *m_eff* in the formulas listed on the :doc:`pair_style granular ` page is the mass of the particle for particle/wall interactions (mass of wall is infinite). If the particle is part of a rigid body, its mass is replaced by the mass of the rigid body in those formulas. This is determined by searching for @@ -163,13 +163,13 @@ is set according to this equation: position = coord + A - A cos (omega \* delta) where *coord* is the specified initial position of the wall, *A* is -the *amplitude*\ , *omega* is 2 PI / *period*\ , and *delta* is the time +the *amplitude*, *omega* is 2 PI / *period*, and *delta* is the time elapsed since the fix was specified. The velocity of the wall is set to the derivative of this expression. For the *shear* keyword, the wall moves continuously in the specified dimension with velocity *vshear*\ . The dimension must be tangential to -walls with a planar *wallstyle*\ , e.g. in the *y* or *z* directions for +walls with a planar *wallstyle*, e.g. in the *y* or *z* directions for an *xplane* wall. For *zcylinder* walls, a dimension of *z* means the cylinder is moving in the z-direction along it's axis. A dimension of *x* or *y* means the cylinder is spinning around the z-axis, either in @@ -225,7 +225,7 @@ Restrictions """""""""""" This fix is part of the GRANULAR package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Any dimension (xyz) that has a granular wall must be non-periodic. diff --git a/doc/src/fix_wall_gran_region.rst b/doc/src/fix_wall_gran_region.rst index 35995fedf0..95634238aa 100644 --- a/doc/src/fix_wall_gran_region.rst +++ b/doc/src/fix_wall_gran_region.rst @@ -22,7 +22,7 @@ Syntax .. parsed-literal:: - For *hooke*\ , *hooke/history*\ , and *hertz/history*\ , *fstyle_params* are: + For *hooke*, *hooke/history*, and *hertz/history*, *fstyle_params* are: Kn = elastic constant for normal particle repulsion (force/distance units or pressure units - see discussion below) Kt = elastic constant for tangential contact (force/distance units or pressure units - see discussion below) gamma_n = damping coefficient for collisions in normal direction (1/time units or 1/time-distance units - see discussion below) @@ -32,7 +32,7 @@ Syntax .. parsed-literal:: - For *granular*\ , *fstyle_params* are set using the same syntax as for the *pair_coeff* command of :doc:`pair_style granular ` + For *granular*, *fstyle_params* are set using the same syntax as for the *pair_coeff* command of :doc:`pair_style granular ` * wallstyle = region (see :doc:`fix wall/gran ` for options for other kinds of walls) * region-ID = region whose boundary will act as wall @@ -106,7 +106,7 @@ or combinations of primitive shapes specified via the *union* or construct particle containers with complex shapes. Regions can also move dynamically via the :doc:`region ` command -keywords (move) and *rotate*\ , or change their shape by use of variables +keywords (move) and *rotate*, or change their shape by use of variables as inputs to the :doc:`region ` command. If such a region is used with this fix, then the region surface will move in time in the corresponding manner. @@ -163,7 +163,7 @@ The nature of the wall/particle interactions are determined by the *fstyle* setting. It can be any of the styles defined by the :doc:`pair_style gran/\* ` or the more general :doc:`pair_style granular ` commands. Currently the -options are *hooke*\ , *hooke/history*\ , or *hertz/history* for the +options are *hooke*, *hooke/history*, or *hertz/history* for the former, and *granular* with all the possible options of the associated *pair_coeff* command for the latter. The equation for the force between the wall and particles touching it is the same as the @@ -181,12 +181,12 @@ radius - r = overlap of particle with wall, m_eff = mass of particle, and the effective radius of contact is just the radius of the particle. -The parameters *Kn*\ , *Kt*\ , *gamma_n*, *gamma_t*, *xmu*, *dampflag*, +The parameters *Kn*, *Kt*, *gamma_n*, *gamma_t*, *xmu*, *dampflag*, and the optional keyword *limit_damping* have the same meaning and units as those specified with the :doc:`pair_style gran/\* ` commands. This means a NULL can be used for either *Kt* or *gamma_t* as described on that page. If a -NULL is used for *Kt*\ , then a default value is used where *Kt* = 2/7 +NULL is used for *Kt*, then a default value is used where *Kt* = 2/7 *Kn*\ . If a NULL is used for *gamma_t*, then a default value is used where *gamma_t* = 1/2 *gamma_n*. @@ -265,7 +265,7 @@ Restrictions """""""""""" This fix is part of the GRANULAR package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_wall_piston.rst b/doc/src/fix_wall_piston.rst index 00cad094eb..af3dece2f5 100644 --- a/doc/src/fix_wall_piston.rst +++ b/doc/src/fix_wall_piston.rst @@ -103,7 +103,7 @@ Restrictions """""""""""" This fix style is part of the SHOCK package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The face that has the wall/piston must be boundary type 's' (shrink-wrapped). The opposing face can be diff --git a/doc/src/fix_wall_reflect.rst b/doc/src/fix_wall_reflect.rst index 4f014cc628..8bb895280c 100644 --- a/doc/src/fix_wall_reflect.rst +++ b/doc/src/fix_wall_reflect.rst @@ -62,8 +62,8 @@ divides the corresponding timestep asymmetrically, energy conservation is only satisfied to O(dt), rather than to O(dt\^2) as it would be for velocity-Verlet integration without reflective walls. -Up to 6 walls or faces can be specified in a single command: *xlo*\ , -*xhi*\ , *ylo*\ , *yhi*\ , *zlo*\ , *zhi*\ . A *lo* face reflects particles +Up to 6 walls or faces can be specified in a single command: *xlo*, +*xhi*, *ylo*, *yhi*, *zlo*, *zhi*\ . A *lo* face reflects particles that move to a coordinate less than the wall position, back in the *hi* direction. A *hi* face reflects particles that move to a coordinate higher than the wall position, back in the *lo* direction. @@ -117,7 +117,7 @@ in a time-dependent fashion using equal-style The *ramp(lo,hi)* function adjusts the wall position linearly from *lo* to *hi* over the course of a run. The *vdisplace(c0,velocity)* function does -something similar using the equation *position = c0 + velocity\*delta*\ , +something similar using the equation *position = c0 + velocity\*delta*, where *delta* is the elapsed time. The *swiggle(c0,A,period)* function causes the wall position to diff --git a/doc/src/fix_wall_reflect_stochastic.rst b/doc/src/fix_wall_reflect_stochastic.rst index e03e8db5bc..64e3d759c1 100644 --- a/doc/src/fix_wall_reflect_stochastic.rst +++ b/doc/src/fix_wall_reflect_stochastic.rst @@ -66,25 +66,25 @@ particle is treated stochastically. The randomness can come from many sources: thermal motion of the wall atoms, surface roughness, etc. Three stochastic reflection models are currently implemented. -For rstyle *diffusive*\ , particles are reflected diffusively. Their +For rstyle *diffusive*, particles are reflected diffusively. Their velocity distribution corresponds to an equilibrium distribution of particles at the wall temperature. No accommodation coefficients are specified. -For rstyle *maxwell*\ , particle reflection is Maxwellian which means +For rstyle *maxwell*, particle reflection is Maxwellian which means partially diffusive and partially specular (:ref:`Maxwell `). A single accommodation coeff is specified which must be between 0.0 and 1.0 inclusive. It determines the fraction of the collision which is diffusive versus specular. An accommodation coefficient of 1.0 is fully diffusive; a coefficient of 0.0 is fully specular. -For rstyle *cll*\ , particle collisions are computed by the +For rstyle *cll*, particle collisions are computed by the Cercignani/Lampis model. See :ref:`CL ` and :ref:`To ` for details. Three accommodations coefficient are specified. Each must be between 0.0 and 1.0 inclusive. Two are velocity accommodation coefficients; one is a normal kinetic energy accommodation. The normal coeff is the one corresponding to the normal of the wall itself. For example if -the wall is *ylo* or *yhi*\ , *accomx* and *accomz* are the tangential +the wall is *ylo* or *yhi*, *accomx* and *accomz* are the tangential velocity accommodation coefficients, and *accomy* is the normal kinetic energy accommodation coefficient. @@ -107,7 +107,7 @@ command. The wall velocity must lie on the same plane as the wall itself. This fix is part of the EXTRA-FIX package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/fix_wall_region.rst b/doc/src/fix_wall_region.rst index 3803d4b74b..f79a9d6da0 100644 --- a/doc/src/fix_wall_region.rst +++ b/doc/src/fix_wall_region.rst @@ -127,7 +127,7 @@ region surface will move over time in the corresponding manner. The energy of wall-particle interactions depends on the specified style. -For style *lj93*\ , the energy E is given by the 9/3 potential: +For style *lj93*, the energy E is given by the 9/3 potential: .. math:: @@ -135,7 +135,7 @@ For style *lj93*\ , the energy E is given by the 9/3 potential: \left(\frac{\sigma}{r}\right)^3 \right] \qquad r < r_c -For style *lj126*\ , the energy E is given by the 12/6 potential: +For style *lj126*, the energy E is given by the 12/6 potential: .. math:: @@ -143,7 +143,7 @@ For style *lj126*\ , the energy E is given by the 12/6 potential: \left(\frac{\sigma}{r}\right)^6 \right] \qquad r < r_c -For style *wall/lj1043*\ , the energy E is given by the 10/4/3 potential: +For style *wall/lj1043*, the energy E is given by the 10/4/3 potential: .. math:: @@ -152,7 +152,7 @@ For style *wall/lj1043*\ , the energy E is given by the 10/4/3 potential: \frac{\sqrt(2)\sigma^3}{3\left(r+\left(0.61/\sqrt(2)\right)\sigma\right)^3}\right] \qquad r < r_c -For style *colloid*\ , the energy E is given by an integrated form of +For style *colloid*, the energy E is given by an integrated form of the :doc:`pair_style colloid ` potential: .. math:: @@ -162,14 +162,14 @@ the :doc:`pair_style colloid ` potential: & \left. - \frac{1}{6} \left(\frac{2R(D+R) + D(D+2R) \left[ \ln D - \ln (D+2R) \right]}{D(D+2R)} \right) \right] \qquad r < r_c -For style *wall/harmonic*\ , the energy E is given by a harmonic spring +For style *wall/harmonic*, the energy E is given by a harmonic spring potential (the distance parameter is ignored): .. math:: E = \epsilon \quad (r - r_c)^2 \qquad r < r_c -For style *wall/morse*\ , the energy E is given by the Morse potential: +For style *wall/morse*, the energy E is given by the Morse potential: .. math:: diff --git a/doc/src/fix_wall_srd.rst b/doc/src/fix_wall_srd.rst index 72e7c771b7..6363995988 100644 --- a/doc/src/fix_wall_srd.rst +++ b/doc/src/fix_wall_srd.rst @@ -17,11 +17,11 @@ Syntax .. parsed-literal:: - *xlo*\ ,\ *ylo*\ ,\ *zlo* arg = EDGE or constant or variable + *xlo*,\ *ylo*,\ *zlo* arg = EDGE or constant or variable EDGE = current lo edge of simulation box constant = number like 0.0 or -30.0 (distance units) variable = :doc:`equal-style variable ` like v_x or v_wiggle - *xhi*\ ,\ *yhi*\ ,\ *zhi* arg = EDGE or constant or variable + *xhi*,\ *yhi*,\ *zhi* arg = EDGE or constant or variable EDGE = current hi edge of simulation box constant = number like 50.0 or 100.3 (distance units) variable = :doc:`equal-style variable ` like v_x or v_wiggle @@ -72,8 +72,8 @@ tangential direction for the SRD velocity is chosen randomly. This collision style imparts both a normal and tangential force to the wall. -Up to 6 walls or faces can be specified in a single command: *xlo*\ , -*xhi*\ , *ylo*\ , *yhi*\ , *zlo*\ , *zhi*\ . A *lo* face reflects particles +Up to 6 walls or faces can be specified in a single command: *xlo*, +*xhi*, *ylo*, *yhi*, *zlo*, *zhi*\ . A *lo* face reflects particles that move to a coordinate less than the wall position, back in the *hi* direction. A *hi* face reflects particles that move to a coordinate higher than the wall position, back in the *lo* direction. diff --git a/doc/src/fix_widom.rst b/doc/src/fix_widom.rst index 8ec5a1308d..34b9ae44f6 100644 --- a/doc/src/fix_widom.rst +++ b/doc/src/fix_widom.rst @@ -21,7 +21,7 @@ Syntax .. parsed-literal:: - keyword = *mol*\ , *region*\ , *full_energy*, *charge*\ , *intra_energy* + keyword = *mol*, *region*, *full_energy*, *charge*, *intra_energy* *mol* value = template-ID template-ID = ID of molecule template specified in a separate :doc:`molecule ` command *region* value = region-ID diff --git a/doc/src/group.rst b/doc/src/group.rst index 3ce885bdc5..aedf1d39bc 100644 --- a/doc/src/group.rst +++ b/doc/src/group.rst @@ -113,7 +113,7 @@ Note that this is a static one-time assignment. The atoms remain assigned (or not assigned) to the group even in they later move out of the region volume. -The *type*\ , *id*\ , and *molecule* styles put all atoms with the +The *type*, *id*, and *molecule* styles put all atoms with the specified atom types, atom IDs, or molecule IDs into the group. These 3 styles can use arguments specified in one of two formats. @@ -181,7 +181,7 @@ pe/atom compute was actually invoked during the run. Printing the thermodynamic info for compute 2 insures that this is the case, since it sums the pe/atom compute values (in the reduce compute) to output them to the screen. See the "Variable Accuracy" section of the -:doc:`variable ` doc page for more details on insuring that +:doc:`variable ` page for more details on insuring that variables are current when they are evaluated between runs. The *include* style with its arg *molecule* adds atoms to a group that @@ -236,7 +236,7 @@ per-atom property. The per-atom property is evaluated and atoms whose values are 0.0 are removed from the dynamic group. The assignment of atoms to a dynamic group is done at the beginning of -each run and on every timestep that is a multiple of *N*\ , which is the +each run and on every timestep that is a multiple of *N*, which is the argument for the *every* keyword (N = 1 is the default). For an energy minimization, via the :doc:`minimize ` command, an assignment is made at the beginning of the minimization, but not diff --git a/doc/src/group2ndx.rst b/doc/src/group2ndx.rst index 31b46ce2ce..7d66db367b 100644 --- a/doc/src/group2ndx.rst +++ b/doc/src/group2ndx.rst @@ -58,7 +58,7 @@ This command requires that atoms have atom IDs, since this is the information that is written to the index file. These commands are part of the COLVARS package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/hyper.rst b/doc/src/hyper.rst index 5b2c931b1f..9266a95523 100644 --- a/doc/src/hyper.rst +++ b/doc/src/hyper.rst @@ -72,7 +72,7 @@ the system and runs dynamics on each independently with a normal unbiased potential until an event occurs in one of the replicas. The time between events is reduced by a factor of Nr replicas. For both methods, per CPU second, more physical time elapses and more events -occur. See the :doc:`prd ` doc page for more info about PRD. +occur. See the :doc:`prd ` page for more info about PRD. An HD run has several stages, which are repeated each time an event occurs, as explained below. The logic for an HD run is as follows: @@ -148,7 +148,7 @@ the specified *dump-ID* to output a snapshot each time an event is detected. It can be specified multiple times with different *dump-ID* values, as in the example above. These snapshots will be for the quenched state of the system on a timestep that is a multiple of -*Nevent*\ , i.e. a timestep after the event has occurred. Note that any +*Nevent*, i.e. a timestep after the event has occurred. Note that any dump command in the input script will also output snapshots at whatever timestep interval it defines via its *N* argument; see the :doc:`dump ` command for details. This means if you only want a diff --git a/doc/src/if.rst b/doc/src/if.rst index e779ec5a04..08ec6f2c3e 100644 --- a/doc/src/if.rst +++ b/doc/src/if.rst @@ -68,7 +68,7 @@ above. If a command itself requires a quoted argument (e.g. a :doc:`print ` command), then double and single quotes can be used and nested in the usual manner, as in the examples above and below. - The :doc:`Commands parse ` doc page has more details on + The :doc:`Commands parse ` page has more details on using quotes in arguments. Only one of level of nesting is allowed, but that should be sufficient for most use cases. diff --git a/doc/src/improper_harmonic.rst b/doc/src/improper_harmonic.rst index 41d533eebe..42cd3b75c5 100644 --- a/doc/src/improper_harmonic.rst +++ b/doc/src/improper_harmonic.rst @@ -64,7 +64,7 @@ radian\^2. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -74,14 +74,14 @@ produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, INTEL, KOKKOS, OPENMP and OPT packages, respectively. They are only enabled if LAMMPS was built with those packages. See the :doc:`Build package -` doc page for more info. +` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- diff --git a/doc/src/improper_style.rst b/doc/src/improper_style.rst index 0667b8f5b9..ca7c31a923 100644 --- a/doc/src/improper_style.rst +++ b/doc/src/improper_style.rst @@ -70,7 +70,7 @@ command. There are also additional accelerated pair styles included in the LAMMPS distribution for faster performance on CPUs, GPUs, and KNLs. -The individual style names on the :ref:`Commands improper ` doc page are followed by one or +The individual style names on the :ref:`Commands improper ` page are followed by one or more of (g,i,k,o,t) to indicate which accelerated styles exist. * :doc:`none ` - turn off improper interactions @@ -99,7 +99,7 @@ Improper styles can only be set for atom_style choices that allow impropers to be defined. Most improper styles are part of the MOLECULE package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual improper potentials tell if it is part of a package. Related commands diff --git a/doc/src/info.rst b/doc/src/info.rst index b3eb6d7000..853e5020fc 100644 --- a/doc/src/info.rst +++ b/doc/src/info.rst @@ -10,9 +10,9 @@ Syntax info args -* args = one or more of the following keywords: *out*\ , *all*\ , *system*\ , *memory*\ , *communication*\ , *computes*\ , *dumps*\ , *fixes*\ , *groups*\ , *regions*\ , *variables*\ , *coeffs*\ , *styles*\ , *time*\ , *accelerator*\ , or *configuration* -* *out* values = *screen*\ , *log*\ , *append* filename, *overwrite* filename -* *styles* values = *all*\ , *angle*\ , *atom*\ , *bond*\ , *compute*\ , *command*\ , *dump*\ , *dihedral*\ , *fix*\ , *improper*\ , *integrate*\ , *kspace*\ , *minimize*\ , *pair*\ , *region* +* args = one or more of the following keywords: *out*, *all*, *system*, *memory*, *communication*, *computes*, *dumps*, *fixes*, *groups*, *regions*, *variables*, *coeffs*, *styles*, *time*, *accelerator*, or *configuration* +* *out* values = *screen*, *log*, *append* filename, *overwrite* filename +* *styles* values = *all*, *angle*, *atom*, *bond*, *compute*, *command*, *dump*, *dihedral*, *fix*, *improper*, *integrate*, *kspace*, *minimize*, *pair*, *region* Examples """""""" diff --git a/doc/src/kim_commands.rst b/doc/src/kim_commands.rst index fc00a574d2..1be907888c 100644 --- a/doc/src/kim_commands.rst +++ b/doc/src/kim_commands.rst @@ -476,7 +476,7 @@ performed. The second required argument *query_function* is the name of the query function to be called (e.g. *get_lattice_constant_cubic*\ ). All following :doc:`arguments ` are parameters handed over to the web query in -the format *keyword=value*\ , where *value* is always an array of one or more +the format *keyword=value*, where *value* is always an array of one or more comma-separated items in brackets. The list of supported keywords and the type and format of their values depend on the query function used. The current list of query functions is available on the OpenKIM webpage at diff --git a/doc/src/kspace_modify.rst b/doc/src/kspace_modify.rst index afe3a8c381..5d603782c0 100644 --- a/doc/src/kspace_modify.rst +++ b/doc/src/kspace_modify.rst @@ -75,7 +75,7 @@ relevant to all kspace styles. The *collective* keyword applies only to PPPM. It is set to *no* by default, except on IBM BlueGene machines. If this option is set to -*yes*\ , LAMMPS will use MPI collective operations to remap data for +*yes*, LAMMPS will use MPI collective operations to remap data for 3d-FFT operations instead of the default point-to-point communication. This is faster on IBM BlueGene machines, and may also be faster on other machines if they have an efficient implementation of MPI @@ -131,11 +131,11 @@ always used for MSM. ---------- The *disp/auto* option controls whether the pppm/disp is allowed to -generate PPPM parameters automatically. If set to *no*\ , parameters have -to be specified using the *gewald/disp*\ , *mesh/disp*\ , +generate PPPM parameters automatically. If set to *no*, parameters have +to be specified using the *gewald/disp*, *mesh/disp*, *force/disp/real* or *force/disp/kspace* keywords, or the code will stop with an error message. When this option is set to -*yes*\ , the error message will not appear and the simulation will start. +*yes*, the error message will not appear and the simulation will start. For a typical application, using the automatic parameter generation will provide simulations that are either inaccurate or slow. Using this option is thus not recommended. For guidelines on how to obtain good @@ -165,8 +165,8 @@ calculated by the long-range solver and is thus specified in force units. A negative value for the accuracy setting means to use the relative accuracy parameter. The accuracy setting is used in conjunction with the pairwise cutoff to determine the number of -K-space vectors for style *ewald*\ , the FFT grid size for style -*pppm*\ , or the real space grid size for style *msm*\ . +K-space vectors for style *ewald*, the FFT grid size for style +*pppm*, or the real space grid size for style *msm*\ . ---------- @@ -223,7 +223,7 @@ The *minorder* keyword allows LAMMPS to reduce the *order* setting if necessary to keep the communication of ghost grid point limited to exchanges between nearest-neighbor processors. See the discussion of the *overlap* keyword for details. If the *overlap* keyword is set to -*yes*\ , which is the default, this is never needed. If it set to *no* +*yes*, which is the default, this is never needed. If it set to *no* and overlap occurs, then LAMMPS will reduce the order setting, one step at a time, until the ghost grid overlap only extends to nearest neighbor processors. The *minorder* keyword limits how small the @@ -237,13 +237,13 @@ MSM. ---------- The *mix/disp* keyword selects the mixing rule for the dispersion -coefficients. With *pair*\ , the dispersion coefficients of unlike +coefficients. With *pair*, the dispersion coefficients of unlike types are computed as indicated with :doc:`pair_modify `. -With *geom*\ , geometric mixing is enforced on the dispersion +With *geom*, geometric mixing is enforced on the dispersion coefficients in the kspace coefficients. When using the arithmetic mixing rule, this will speed-up the simulations but introduces some error in the force computations, as shown in :ref:`(Wennberg) `. -With *none*\ , it is assumed that no mixing rule is +With *none*, it is assumed that no mixing rule is applicable. Splitting of the dispersion coefficients will be performed as described in :ref:`(Isele-Holder) `. @@ -398,8 +398,8 @@ boundaries can be set using :doc:`boundary ` (the slab approximation in not needed). The *slab* keyword is not currently supported by Ewald or PPPM when using a triclinic simulation cell. The slab correction has also been extended to point dipole interactions -:ref:`(Klapp) ` in :doc:`kspace_style ` *ewald/disp*\ , -*ewald/dipole*\ , and *pppm/dipole*\ . +:ref:`(Klapp) ` in :doc:`kspace_style ` *ewald/disp*, +*ewald/dipole*, and *pppm/dipole*\ . .. note:: @@ -419,10 +419,10 @@ optimal performance and accuracy in the results is obtained when these values are different. The *disp/auto* option controls whether the pppm/disp is allowed to -generate PPPM parameters automatically. If set to *no*\ , parameters -have to be specified using the *gewald/disp*\ , *mesh/disp*\ , +generate PPPM parameters automatically. If set to *no*, parameters +have to be specified using the *gewald/disp*, *mesh/disp*, *force/disp/real* or *force/disp/kspace* keywords, or the code will -stop with an error message. When this option is set to *yes*\ , the +stop with an error message. When this option is set to *yes*, the error message will not appear and the simulation will start. For a typical application, using the automatic parameter generation will provide simulations that are either inaccurate or slow. Using this diff --git a/doc/src/kspace_style.rst b/doc/src/kspace_style.rst index dc72915b35..055f0b02b2 100644 --- a/doc/src/kspace_style.rst +++ b/doc/src/kspace_style.rst @@ -408,7 +408,7 @@ relative RMS error. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -431,9 +431,9 @@ on the CPU when using OpenMP and FFTW3. These accelerated styles are part of the GPU, INTEL, KOKKOS, OPENMP, and OPT packages respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -445,19 +445,19 @@ Note that the long-range electrostatic solvers in LAMMPS assume conducting metal (tinfoil) boundary conditions for both charge and dipole interactions. Vacuum boundary conditions are not currently supported. -The *ewald/disp*\ , *ewald*\ , *pppm*\ , and *msm* styles support +The *ewald/disp*, *ewald*, *pppm*, and *msm* styles support non-orthogonal (triclinic symmetry) simulation boxes. However, triclinic simulation cells may not yet be supported by all suffix versions of these styles. Most of the base kspace styles are part of the KSPACE package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build -package ` doc page for more info. +package ` page for more info. The *msm/dielectric* and *pppm/dielectric* kspace styles are part of the DIELECTRIC package. They are only enabled if LAMMPS was built with that package **and** the KSPACE package. See the :doc:`Build package -` doc page for more info. +` page for more info. For MSM, a simulation must be 3d and one can use any combination of periodic, non-periodic, or shrink-wrapped boundaries (specified using diff --git a/doc/src/lattice.rst b/doc/src/lattice.rst index b87ddaaf70..a03036de1c 100644 --- a/doc/src/lattice.rst +++ b/doc/src/lattice.rst @@ -30,7 +30,7 @@ Syntax i,j,k = integer lattice directions *spacing* values = dx dy dz dx,dy,dz = lattice spacings in the x,y,z box directions - *a1*\ ,\ *a2*\ ,\ *a3* values = x y z + *a1*,\ *a2*,\ *a3* values = x y z x,y,z = primitive vector components that define unit cell *basis* values = x y z x,y,z = fractional coords of a basis atom (0 <= x,y,z < 1) @@ -102,7 +102,7 @@ default, a "lattice none 1.0" is defined, which means the lattice spacing is the same as one distance unit, as defined by the :doc:`units ` command. -Lattices of style *sc*\ , *fcc*\ , *bcc*\ , and *diamond* are 3d lattices +Lattices of style *sc*, *fcc*, *bcc*, and *diamond* are 3d lattices that define a cubic unit cell with edge length = 1.0. This means a1 = 1 0 0, a2 = 0 1 0, and a3 = 0 0 1. Style *hcp* has a1 = 1 0 0, a2 = 0 sqrt(3) 0, and a3 = 0 0 sqrt(8/3). The placement of the basis atoms @@ -147,14 +147,14 @@ lattice of the desired size and distance units in the simulation box. The meaning of the *scale* argument depends on the :doc:`units ` being used in your simulation. -For all unit styles except *lj*\ , the scale argument is specified in +For all unit styles except *lj*, the scale argument is specified in the distance units defined by the unit style. For example, in *real* or *metal* units, if the unit cell is a unit cube with edge length 1.0, specifying scale = 3.52 would create a cubic lattice with a spacing of 3.52 Angstroms. In *cgs* units, the spacing would be 3.52 cm. -For unit style *lj*\ , the scale argument is the Lennard-Jones reduced +For unit style *lj*, the scale argument is the Lennard-Jones reduced density, typically written as rho\*. LAMMPS converts this value into the multiplicative factor via the formula "factor\^dim = rho/rho\*", where rho = N/V with V = the volume of the lattice unit cell and N = diff --git a/doc/src/log.rst b/doc/src/log.rst index 2632f34b68..5d4036dc06 100644 --- a/doc/src/log.rst +++ b/doc/src/log.rst @@ -26,7 +26,7 @@ Description This command closes the current LAMMPS log file, opens a new file with the specified name, and begins logging information to it. If the -specified file name is *none*\ , then no new log file is opened. If the +specified file name is *none*, then no new log file is opened. If the optional keyword *append* is specified, then output will be appended to an existing log file, instead of overwriting it. diff --git a/doc/src/mdi_engine.rst b/doc/src/mdi_engine.rst index d26a1f8cd3..e06f571922 100644 --- a/doc/src/mdi_engine.rst +++ b/doc/src/mdi_engine.rst @@ -21,7 +21,7 @@ More specifically, this command causes LAMMPS to begin using the `MDI Library `_ to run as an MDI engine (server), responding to commands made by an external MDI driver code (client). See the :doc:`Howto mdi -` doc page for more information about how LAMMPS can work +` page for more information about how LAMMPS can work as both an MDI driver or engine. General information about launching codes that communicate using the @@ -75,7 +75,7 @@ Restrictions This command is part of the MDI package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/message.rst b/doc/src/message.rst index 718a68f994..83ce965e91 100644 --- a/doc/src/message.rst +++ b/doc/src/message.rst @@ -50,7 +50,7 @@ Description Establish a messaging protocol between LAMMPS and another code for the purpose of client/server coupling. -The :doc:`Howto client/server ` doc page gives an +The :doc:`Howto client/server ` page gives an overview of client/server coupling of LAMMPS with another code where one code is the "client" and sends request messages to a "server" code. The server responds to each request with a reply message. This @@ -73,10 +73,10 @@ are: * md = run dynamics with another code * mc = perform Monte Carlo moves with another code -For protocol *md*\ , LAMMPS can be either a client or server. See the -:doc:`server md ` doc page for details on the protocol. +For protocol *md*, LAMMPS can be either a client or server. See the +:doc:`server md ` page for details on the protocol. -For protocol *mc*\ , LAMMPS can be the server. See the :doc:`server mc ` doc page for details on the protocol. +For protocol *mc*, LAMMPS can be the server. See the :doc:`server mc ` page for details on the protocol. ---------- @@ -84,13 +84,13 @@ The *mode* argument specifies how messages are exchanged between the client and server codes. Both codes must use the same mode and use consistent parameters. -For mode *file*\ , the 2 codes communicate via binary files. They must +For mode *file*, the 2 codes communicate via binary files. They must use the same filename, which is actually a file prefix. Several files with that prefix will be created and deleted as a simulation runs. The filename can include a path. Both codes must be able to access the path/file in a common filesystem. -For mode *zmq*\ , the 2 codes communicate via a socket on the server +For mode *zmq*, the 2 codes communicate via a socket on the server code's machine. Support for socket messaging is provided by the open-source `ZeroMQ library `_, which must be installed on your system. The client specifies an IP address (IPv4 @@ -130,7 +130,7 @@ what the client specifies. Additional explanation is needed here about how to use the *zmq* mode on a parallel machine, e.g. a cluster with many nodes. -For mode *mpi/one*\ , the 2 codes communicate via MPI and are launched +For mode *mpi/one*, the 2 codes communicate via MPI and are launched by the same mpirun command, e.g. with this syntax for OpenMPI: .. code-block:: bash @@ -139,10 +139,10 @@ by the same mpirun command, e.g. with this syntax for OpenMPI: mpirun -np 2 othercode args : -np 4 lmp_mpi -mpicolor 1 -in in.server # LAMMPS is server Note the use of the "-mpicolor color" command-line argument with -LAMMPS. See the :doc:`command-line args ` doc page for +LAMMPS. See the :doc:`command-line args ` page for further explanation. -For mode *mpi/two*\ , the 2 codes communicate via MPI, but are launched +For mode *mpi/two*, the 2 codes communicate via MPI, but are launched be 2 separate mpirun commands. The specified *filename* argument is a file the 2 MPI processes will use to exchange info so that an MPI inter-communicator can be established to enable the 2 codes to send @@ -191,7 +191,7 @@ Restrictions """""""""""" This command is part of the MESSAGE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/min_modify.rst b/doc/src/min_modify.rst index 731d2ace62..6b416a9b6a 100644 --- a/doc/src/min_modify.rst +++ b/doc/src/min_modify.rst @@ -81,8 +81,8 @@ energy after) and that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. -The choice of a norm can be modified for the min styles *cg*\ , *sd*\ -, *quickmin*\ , *fire*\ , *fire/old*\ , *spin*\ , *spin/cg* and +The choice of a norm can be modified for the min styles *cg*, *sd*\ +, *quickmin*, *fire*, *fire/old*, *spin*, *spin/cg* and *spin/lbfgs* using the *norm* keyword. The default *two* norm computes the 2-norm (Euclidean length) of the global force vector: @@ -104,7 +104,7 @@ all atoms in the system: || \vec{F} ||_{inf} = {\rm max}\left(|F_1^1|, |F_1^2|, |F_1^3| \cdots, |F_N^1|, |F_N^2|, |F_N^3|\right) -For the min styles *spin*\ , *spin/cg* and *spin/lbfgs*\ , the force +For the min styles *spin*, *spin/cg* and *spin/lbfgs*, the force norm is replaced by the spin-torque norm. Keywords *alpha_damp* and *discrete_factor* only make sense when @@ -138,8 +138,8 @@ minimization is 4fs. Note that parameter defaults has been chosen to be reliable in most cases, but one should consider adjusting :doc:`timestep ` and *tmax* to optimize the minimization for large or complex systems. Other -parameters of the *fire* minimization can be tuned (\ *tmin*\ , -*delaystep*\ , *dtgrow*\ , *dtshrink*\ , *alpha0*\ , and +parameters of the *fire* minimization can be tuned (\ *tmin*, +*delaystep*, *dtgrow*, *dtshrink*, *alpha0*, and *alphashrink*\ ). Please refer to the references describing the :doc:`min_style ` *fire*. An additional stopping criteria *vdfmax* is used by *fire* in order to avoid @@ -176,7 +176,7 @@ Default The option defaults are dmax = 0.1, line = quadratic and norm = two. -For the *spin*\ , *spin/cg* and *spin/lbfgs* styles, the option +For the *spin*, *spin/cg* and *spin/lbfgs* styles, the option defaults are alpha_damp = 1.0, discrete_factor = 10.0, line = spin_none, and norm = euclidean. diff --git a/doc/src/min_spin.rst b/doc/src/min_spin.rst index 46fd08b838..4aef3e0fe2 100644 --- a/doc/src/min_spin.rst +++ b/doc/src/min_spin.rst @@ -81,7 +81,7 @@ The :doc:`min_modify ` command can be used to activate the line search procedure, and to modify the discretization factor *discrete_factor*. -For more information about styles *spin/cg* and *spin/lbfgs*\ , +For more information about styles *spin/cg* and *spin/lbfgs*, see their implementation reported in :ref:`(Ivanov) `. .. note:: diff --git a/doc/src/min_style.rst b/doc/src/min_style.rst index caf2ebd7b2..03a6073994 100644 --- a/doc/src/min_style.rst +++ b/doc/src/min_style.rst @@ -42,7 +42,7 @@ of the energy is not formed directly, but approximated in each conjugate search direction by a finite difference directional derivative. When close to an energy minimum, the algorithm behaves like a Newton method and exhibits a quadratic convergence rate to high -accuracy. In most cases the behavior of *hftn* is similar to *cg*\ , +accuracy. In most cases the behavior of *hftn* is similar to *cg*, but it offers an alternative if *cg* seems to perform poorly. This style is not affected by the :doc:`min_modify ` command. @@ -88,14 +88,14 @@ Style *spin/lbfgs* uses an orthogonal spin optimization (OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno (LBFGS) approach to minimize spin configurations. -See the :doc:`min/spin ` doc page for more information about -the *spin*\ , *spin/cg* and *spin/lbfgs* styles. +See the :doc:`min/spin ` page for more information about +the *spin*, *spin/cg* and *spin/lbfgs* styles. -Either the *quickmin*\ , *fire* and *fire/old* styles are useful in the +Either the *quickmin*, *fire* and *fire/old* styles are useful in the context of nudged elastic band (NEB) calculations via the :doc:`neb ` command. -Either the *spin*\ , *spin/cg* and *spin/lbfgs* styles are useful in +Either the *spin*, *spin/cg* and *spin/lbfgs* styles are useful in the context of magnetic geodesic nudged elastic band (GNEB) calculations via the :doc:`neb/spin ` command. @@ -110,7 +110,7 @@ calculations via the :doc:`neb/spin ` command. .. note:: - The *quickmin*\ , *fire*\ , *fire/old*\ , *hftn*\ , and *cg/kk* styles do not yet + The *quickmin*, *fire*, *fire/old*, *hftn*, and *cg/kk* styles do not yet support the use of the :doc:`fix box/relax ` command or minimizations involving the electron radius in :doc:`eFF ` models. diff --git a/doc/src/minimize.rst b/doc/src/minimize.rst index a9f60fe8f6..14bc4d0d21 100644 --- a/doc/src/minimize.rst +++ b/doc/src/minimize.rst @@ -57,7 +57,7 @@ coordinates of other atoms fixed by applying :doc:`fix setforce ` to the other atoms. See a fuller discussion of using fixes while minimizing below. -The :doc:`minimization styles ` *cg*\ , *sd*\ , and *hftn* +The :doc:`minimization styles ` *cg*, *sd*, and *hftn* involves an outer iteration loop which sets the search direction along which atom coordinates are changed. An inner iteration is then performed using a line search algorithm. The line search typically @@ -68,7 +68,7 @@ be more robust than previous line searches we have tried. The backtracking method is described in Nocedal and Wright's Numerical Optimization (Procedure 3.1 on p 41). -The :doc:`minimization styles ` *quickmin*\ , *fire* and +The :doc:`minimization styles ` *quickmin*, *fire* and *fire/old* perform damped dynamics using an Euler integration step. Thus they require a :doc:`timestep ` be defined. @@ -118,12 +118,12 @@ The minimization procedure stops if any of several criteria are met: .. note:: - the :doc:`minimization style ` *spin*\ , - *spin/cg*\ , and *spin/lbfgs* replace + the :doc:`minimization style ` *spin*, + *spin/cg*, and *spin/lbfgs* replace the force tolerance *ftol* by a torque tolerance. The minimization procedure stops if the 2-norm (length) of the torque vector on atom (defined as the cross product between the - atomic spin and its precession vectors omega) is less than *ftol*\ , + atomic spin and its precession vectors omega) is less than *ftol*, or if any of the other criteria are met. Torque have the same units as the energy. .. note:: diff --git a/doc/src/molecule.rst b/doc/src/molecule.rst index b86983766d..f380d82c7d 100644 --- a/doc/src/molecule.rst +++ b/doc/src/molecule.rst @@ -79,7 +79,7 @@ make it easy to use the same molecule file in different molecule templates or in different simulations. You can specify the same file multiple times with different optional keywords. -The *offset*\ , *toff*\ , *boff*\ , *aoff*\ , *doff*\ , *ioff* keywords +The *offset*, *toff*, *boff*, *aoff*, *doff*, *ioff* keywords add the specified offset values to the atom types, bond types, angle types, dihedral types, and/or improper types as they are read from the molecule file. E.g. if *toff* = 2, and the file uses atom types @@ -150,7 +150,7 @@ appear if the value(s) are different than the default. * Xc Yc Zc *com* = coordinates of center-of-mass of molecule * Ixx Iyy Izz Ixy Ixz Iyz *inertia* = 6 components of inertia tensor of molecule -For *mass*\ , *com*\ , and *inertia*\ , the default is for LAMMPS to +For *mass*, *com*, and *inertia*, the default is for LAMMPS to calculate this quantity itself if needed, assuming the molecules consists of a set of point particles or finite-size particles (with a non-zero diameter) that do not overlap. If finite-size particles in @@ -349,7 +349,7 @@ the doc pages for individual styles for details. N1, N2, N3 are the number of 1-2, 1-3, 1-4 neighbors respectively of this atom within the topology of the molecule. See the -:doc:`special_bonds ` doc page for more discussion of +:doc:`special_bonds ` page for more discussion of 1-2, 1-3, 1-4 neighbors. If this section appears, the Special Bonds section must also appear. @@ -390,7 +390,7 @@ This section is only needed when molecules created using the template will be constrained by SHAKE via the "fix shake" command. The other two Shake sections must also appear in the file, following this one. -The meaning of the flag for each atom is as follows. See the :doc:`fix shake ` doc page for a further description of SHAKE +The meaning of the flag for each atom is as follows. See the :doc:`fix shake ` page for a further description of SHAKE clusters. * 0 = not part of a SHAKE cluster @@ -432,7 +432,7 @@ and b,c = IDs of other two atoms bonded to the central atom. If flag = 4, a,b,c,d are listed, where a = ID of central atom, and b,c,d = IDs of other three atoms bonded to the central atom. -See the :doc:`fix shake ` doc page for a further description +See the :doc:`fix shake ` page for a further description of SHAKE clusters. ---------- @@ -477,7 +477,7 @@ the second non-central atom (value c in the Shake Atoms section), and c = bondtype of the bond between the central atom and the third non-central atom (value d in the Shake Atoms section). -See the :doc:`fix shake ` doc page for a further description +See the :doc:`fix shake ` page for a further description of SHAKE clusters. ---------- diff --git a/doc/src/neb.rst b/doc/src/neb.rst index fdccdf3d9f..69a0877f3a 100644 --- a/doc/src/neb.rst +++ b/doc/src/neb.rst @@ -114,7 +114,7 @@ closer to the MEP and read them in. ---------- -For a *file-style* setting of *final*\ , a filename is specified which +For a *file-style* setting of *final*, a filename is specified which contains atomic coordinates for zero or more atoms, in the format described below. For each atom that appears in the file, the new coordinates are assigned to that atom in the final replica. Each @@ -143,7 +143,7 @@ case. interpolation is outside the periodic box, the atom will be wrapped back into the box when the NEB calculation begins. -For a *file-style* setting of *each*\ , a filename is specified which is +For a *file-style* setting of *each*, a filename is specified which is assumed to be unique to each replica. This can be done by using a variable in the filename, e.g. @@ -162,7 +162,7 @@ as described below, and for any atom that appears in the file, assign the specified coordinates to its atom. The various files do not need to contain the same set of atoms. -For a *file-style* setting of *none*\ , no filename is specified. Each +For a *file-style* setting of *none*, no filename is specified. Each replica is assumed to already be in its initial configuration at the time the neb command is issued. This allows each replica to define its own configuration by reading a replica-specific data or restart or @@ -185,13 +185,13 @@ that a long calculation can be restarted if needed. A NEB calculation proceeds in two stages, each of which is a minimization procedure, performed via damped dynamics. To enable this, you must first define a damped dynamics -:doc:`min_style `, such as *quickmin* or *fire*\ . The *cg*\ , -*sd*\ , and *hftn* styles cannot be used, since they perform iterative +:doc:`min_style `, such as *quickmin* or *fire*\ . The *cg*, +*sd*, and *hftn* styles cannot be used, since they perform iterative line searches in their inner loop, which cannot be easily synchronized across multiple replicas. The minimizer tolerances for energy and force are set by *etol* and -*ftol*\ , the same as for the :doc:`minimize ` command. +*ftol*, the same as for the :doc:`minimize ` command. A non-zero *etol* means that the NEB calculation will terminate if the energy criterion is met by every replica. The energies being compared diff --git a/doc/src/neb_spin.rst b/doc/src/neb_spin.rst index 10b08f674b..9f714096dc 100644 --- a/doc/src/neb_spin.rst +++ b/doc/src/neb_spin.rst @@ -114,7 +114,7 @@ closer to the MEP and read them in. ---------- -For a *file-style* setting of *final*\ , a filename is specified which +For a *file-style* setting of *final*, a filename is specified which contains atomic and spin coordinates for zero or more atoms, in the format described below. For each atom that appears in the file, the new coordinates are @@ -168,12 +168,12 @@ opposite directions, an arbitrary rotation vector belonging to the plane perpendicular to initial and final spins is chosen. In this case, a warning message is displayed. -For a *file-style* setting of *each*\ , a filename is specified which is +For a *file-style* setting of *each*, a filename is specified which is assumed to be unique to each replica. See the :doc:`neb ` documentation page for more information about this option. -For a *file-style* setting of *none*\ , no filename is specified. Each +For a *file-style* setting of *none*, no filename is specified. Each replica is assumed to already be in its initial configuration at the time the neb command is issued. This allows each replica to define its own configuration by reading a replica-specific data or restart or @@ -196,14 +196,14 @@ that a long calculation can be restarted if needed. A NEB calculation proceeds in two stages, each of which is a minimization procedure. To enable this, you must first define a -:doc:`min_style `, using either the *spin*\ , -*spin/cg*\ , or *spin/lbfgs* style (see +:doc:`min_style `, using either the *spin*, +*spin/cg*, or *spin/lbfgs* style (see :doc:`min_spin ` for more information). The other styles cannot be used, since they relax the lattice degrees of freedom instead of the spins. The minimizer tolerances for energy and force are set by *etol* and -*ttol*\ , the same as for the :doc:`minimize ` command. +*ttol*, the same as for the :doc:`minimize ` command. A non-zero *etol* means that the GNEB calculation will terminate if the energy criterion is met by every replica. The energies being compared diff --git a/doc/src/neigh_modify.rst b/doc/src/neigh_modify.rst index 25c2c2ac77..d6fa12f713 100644 --- a/doc/src/neigh_modify.rst +++ b/doc/src/neigh_modify.rst @@ -75,13 +75,13 @@ pairwise neighbor lists. Depending on what pair interactions and other commands are defined, a simulation may require one or more neighbor lists. -The *every*\ , *delay*\ , *check*\ , and *once* options affect how often +The *every*, *delay*, *check*, and *once* options affect how often lists are built as a simulation runs. The *delay* setting means never build new lists until at least N steps after the previous build. The *every* setting means build lists every M steps (after the delay has -passed). If the *check* setting is *no*\ , the lists are built on the +passed). If the *check* setting is *no*, the lists are built on the first step that satisfies the *delay* and *every* settings. If the -*check* setting is *yes*\ , then the *every* and *delay* settings +*check* setting is *yes*, then the *every* and *delay* settings determine when a build may possibly be performed, but an actual build only occurs if some atom has moved more than half the skin distance (specified in the :doc:`neighbor ` command) since the last @@ -112,7 +112,7 @@ pairwise cutoff is so short that atoms that are part of the same interaction are not communicated as ghost atoms. This is an unusual model (e.g. no pair interactions at all) and the problem can be fixed by use of the :doc:`comm_modify cutoff ` command. Note -that to save time, the default *cluster* setting is *no*\ , so that this +that to save time, the default *cluster* setting is *no*, so that this check is not performed. The *include* option limits the building of pairwise neighbor lists to diff --git a/doc/src/neighbor.rst b/doc/src/neighbor.rst index 1b10ec8998..0cfedfc090 100644 --- a/doc/src/neighbor.rst +++ b/doc/src/neighbor.rst @@ -87,7 +87,7 @@ stored in the list. When a run is finished, counts of the number of neighbors stored in the pairwise list and the number of times neighbor lists were built -are printed to the screen and log file. See the :doc:`Run output ` doc page for details. +are printed to the screen and log file. See the :doc:`Run output ` page for details. Restrictions """""""""""" diff --git a/doc/src/next.rst b/doc/src/next.rst index 2b578a43f5..46d39660eb 100644 --- a/doc/src/next.rst +++ b/doc/src/next.rst @@ -37,8 +37,8 @@ be used in an input script command as $a or $z. If it is multiple letters, it can be used as ${myTemp}. If multiple variables are used as arguments to the *next* command, -then all must be of the same variable style: *index*\ , *loop*\ , *file*\ , -*universe*\ , or *uloop*\ . An exception is that *universe*\ - and +then all must be of the same variable style: *index*, *loop*, *file*, +*universe*, or *uloop*\ . An exception is that *universe*\ - and *uloop*\ -style variables can be mixed in the same *next* command. All the variables specified with the next command are incremented by @@ -93,7 +93,7 @@ directories run1 through run8. next d jump in.polymer -If the variable "d" were of style *universe*\ , and the same in.polymer +If the variable "d" were of style *universe*, and the same in.polymer input script were run on 3 partitions of processors, then the first 3 simulations would begin, one on each set of processors. Whichever partition finished first, it would assign variable "d" the fourth value diff --git a/doc/src/package.rst b/doc/src/package.rst index 54cf74f5be..cbff28cee3 100644 --- a/doc/src/package.rst +++ b/doc/src/package.rst @@ -166,7 +166,7 @@ intel", or "package omp" command with default settings. set, either to default values or to specified settings. I.e. settings from previous invocations do not persist across multiple invocations. -See the :doc:`Speed packages ` doc page for more details +See the :doc:`Speed packages ` page for more details about using the various accelerator packages for speeding up LAMMPS simulations. @@ -192,8 +192,8 @@ Optional keyword/value pairs can also be specified. Each has a default value as listed below. The *neigh* keyword specifies where neighbor lists for pair style -computation will be built. If *neigh* is *yes*\ , which is the default, -neighbor list building is performed on the GPU. If *neigh* is *no*\ , +computation will be built. If *neigh* is *yes*, which is the default, +neighbor list building is performed on the GPU. If *neigh* is *no*, neighbor list building is performed on the CPU. GPU neighbor list building currently cannot be used with a triclinic box. GPU neighbor lists are not compatible with commands that are not GPU-enabled. When @@ -202,7 +202,7 @@ built on the CPU. In these cases, it will typically be more efficient to only use CPU neighbor list builds. The *newton* keyword sets the Newton flags for pairwise (not bonded) -interactions to *off* or *on*\ , the same as the :doc:`newton ` +interactions to *off* or *on*, the same as the :doc:`newton ` command allows. Currently, only an *off* value is allowed, since all the GPU package pair styles require this setting. This means more computation is done, but less communication. In the future a value of @@ -288,7 +288,7 @@ The *Nthreads* value for the *omp* keyword sets the number of OpenMP threads allocated for each MPI task. This setting controls OpenMP parallelism only for routines run on the CPUs. For more details on setting the number of OpenMP threads, see the discussion of the -*Nthreads* setting on this doc page for the "package omp" command. +*Nthreads* setting on this page for the "package omp" command. The meaning of *Nthreads* is exactly the same for the GPU, INTEL, and GPU packages. @@ -350,14 +350,14 @@ The *Nthreads* value for the *omp* keyword sets the number of OpenMP threads allocated for each MPI task. This setting controls OpenMP parallelism only for routines run on the CPUs. For more details on setting the number of OpenMP threads, see the discussion of the -*Nthreads* setting on this doc page for the "package omp" command. +*Nthreads* setting on this page for the "package omp" command. The meaning of *Nthreads* is exactly the same for the GPU, INTEL, and GPU packages. The *mode* keyword determines the precision mode to use for computing pair style forces, either on the CPU or on the co-processor, when using a INTEL supported :doc:`pair style `. It -can take a value of *single*\ , *mixed* which is the default, or +can take a value of *single*, *mixed* which is the default, or *double*\ . *Single* means single precision is used for the entire force calculation. *Mixed* means forces between a pair of atoms are computed in single precision, but accumulated and stored in double @@ -451,11 +451,11 @@ often faster, just as it is for non-accelerated pair styles. Similarly, the *neigh/qeq* keyword determines how neighbor lists are built for :doc:`fix qeq/reaxff/kk `. -If the *neigh/thread* keyword is set to *off*\ , then the KOKKOS package +If the *neigh/thread* keyword is set to *off*, then the KOKKOS package threads only over atoms. However, for small systems, this may not expose -enough parallelism to keep a GPU busy. When this keyword is set to *on*\ , +enough parallelism to keep a GPU busy. When this keyword is set to *on*, the KOKKOS package threads over both atoms and neighbors of atoms. When -using *neigh/thread* *on*\ , a full neighbor list must also be used. Using +using *neigh/thread* *on*, a full neighbor list must also be used. Using *neigh/thread* *on* may be slower for large systems, so this this option is turned on by default only when there are 16K atoms or less owned by an MPI rank and when using a full neighbor list. Not all KOKKOS-enabled @@ -464,7 +464,7 @@ simple pair-wise potentials such as Lennard-Jones do support threading over both atoms and neighbors. The *newton* keyword sets the Newton flags for pairwise and bonded -interactions to *off* or *on*\ , the same as the :doc:`newton ` +interactions to *off* or *on*, the same as the :doc:`newton ` command allows. The default for GPUs is *off* because this will almost always give better performance for the KOKKOS package. This means more computation is done, but less communication. However, when running on @@ -531,7 +531,7 @@ performing the exchange pack/unpack on the host CPU can give speedup since it reduces the number of CUDA kernel launches. The *gpu/aware* keyword chooses whether GPU-aware MPI will be used. When -this keyword is set to *on*\ , buffers in GPU memory are passed directly +this keyword is set to *on*, buffers in GPU memory are passed directly through MPI send/receive calls. This reduces overhead of first copying the data to the host CPU. However GPU-aware MPI is not supported on all systems, which can lead to segmentation faults and would require using a @@ -539,7 +539,7 @@ value of *off*\ . If LAMMPS can safely detect that GPU-aware MPI is not available (currently only possible with OpenMPI v2.0.0 or later), then the *gpu/aware* keyword is automatically set to *off* by default. When the *gpu/aware* keyword is set to *off* while any of the *comm* -keywords are set to *device*\ , the value for these *comm* keywords will +keywords are set to *device*, the value for these *comm* keywords will be automatically changed to *no*\ . This setting has no effect if not running on GPUs or if using only one MPI rank. GPU-aware MPI is available for OpenMPI 1.8 (or later versions), Mvapich2 1.9 (or later) when the @@ -643,7 +643,7 @@ with the GPU package. See the :doc:`Build package ` doc page for more info. The intel style of this command can only be invoked if LAMMPS was -built with the INTEL package. See the :doc:`Build package ` doc page for more info. +built with the INTEL package. See the :doc:`Build package ` page for more info. The kk style of this command can only be invoked if LAMMPS was built with the KOKKOS package. See the :doc:`Build package ` diff --git a/doc/src/pair_adp.rst b/doc/src/pair_adp.rst index abc8cb3c4c..87493724b0 100644 --- a/doc/src/pair_adp.rst +++ b/doc/src/pair_adp.rst @@ -72,7 +72,7 @@ where :math:`N` is the number of LAMMPS atom types: * filename * :math:`N` element names = mapping of extended *setfl* elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways to +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, the potentials/AlCu.adp file, included in the @@ -156,7 +156,7 @@ an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_agni.rst b/doc/src/pair_agni.rst index 2e4d95760f..8e91e57b72 100644 --- a/doc/src/pair_agni.rst +++ b/doc/src/pair_agni.rst @@ -57,7 +57,7 @@ pair_coeff command, where :math:`N` is the number of LAMMPS atom types: * filename * :math:`N` element names = mapping of AGNI elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the force field file. An AGNI force field is fully specified by the filename which contains the @@ -74,13 +74,13 @@ the same arguments and should produce the same results, except for round-off and precision issues. The accelerated style is part of the OPENMP. They are only enabled -if LAMMPS was built with those packages. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. You can specify the accelerated style explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -97,7 +97,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -113,7 +113,7 @@ It should work with damped dynamics based minimizers like *fire* or integration of the forces as discussed in :ref:`(Botu3) `. This pair style is part of the MISC package. It is only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. The AGNI force field files provided with LAMMPS (see the diff --git a/doc/src/pair_airebo.rst b/doc/src/pair_airebo.rst index d631d0a3d0..28d7811f06 100644 --- a/doc/src/pair_airebo.rst +++ b/doc/src/pair_airebo.rst @@ -122,7 +122,7 @@ would be 10.2 Angstroms. By default, the longer-ranged interaction is smoothly switched off between 2.16 and 3.0 :math:`\sigma`. By specifying *cutoff_min* in addition -to *cutoff*\ , the switching can be configured to take place between +to *cutoff*, the switching can be configured to take place between *cutoff_min* and *cutoff*\ . *cutoff_min* can only be specified if all optional arguments are given. @@ -131,7 +131,7 @@ various dihedral angle preferences in hydrocarbon configurations. ---------- -Only a single pair_coeff command is used with the *airebo*\ , *airebo* +Only a single pair_coeff command is used with the *airebo*, *airebo* or *rebo* style which specifies an AIREBO, REBO, or AIREBO-M potential file with parameters for C and H. Note that as of LAMMPS version 15 May 2019 the *rebo* style in LAMMPS uses its own potential @@ -142,7 +142,7 @@ where N is the number of LAMMPS atom types: * filename * :math:`N` element names = mapping of AIREBO elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, if your LAMMPS simulation has 4 atom types and you want @@ -211,13 +211,13 @@ script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner* , *middle*, *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" These pair styles are part of the MANYBODY package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair potentials require the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_atm.rst b/doc/src/pair_atm.rst index 0bdfecd517..18c66961fb 100644 --- a/doc/src/pair_atm.rst +++ b/doc/src/pair_atm.rst @@ -155,7 +155,7 @@ re-specified in the restart input script. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner* , *middle* , *outer* keywords. +*inner*, *middle*, and *outer* keywords. ---------- @@ -163,7 +163,7 @@ Restrictions """""""""""" This pair style is part of the MANYBODY package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_awpmd.rst b/doc/src/pair_awpmd.rst index 919656a8f5..604baceb8a 100644 --- a/doc/src/pair_awpmd.rst +++ b/doc/src/pair_awpmd.rst @@ -52,7 +52,7 @@ Rc is the cutoff. The pair_style command allows for several optional keywords to be specified. -The *hartree*\ , *dproduct*\ , and *uhf* keywords specify the form of the +The *hartree*, *dproduct*, and *uhf* keywords specify the form of the initial trial wave function for the system. If the *hartree* keyword is used, then a Hartree multielectron trial wave function is used. If the *dproduct* keyword is used, then a trial function which is a @@ -60,7 +60,7 @@ product of two determinants for each spin type is used. If the *uhf* keyword is used, then an unrestricted Hartree-Fock trial wave function is used. -The *free*\ , *pbc*\ , and *fix* keywords specify a width constraint on +The *free*, *pbc*, and *fix* keywords specify a width constraint on the electron wave packets. If the *free* keyword is specified, then there is no constraint. If the *pbc* keyword is used and *Plen* is specified as -1, then the maximum width is half the shortest box length. If *Plen* @@ -91,7 +91,7 @@ commands, or by mixing as described below: * cutoff (distance units) -For *awpmd/cut*\ , the cutoff coefficient is optional. If it is not +For *awpmd/cut*, the cutoff coefficient is optional. If it is not used (as in some of the examples above), the default global value specified in the pair_style command is used. @@ -108,7 +108,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_beck.rst b/doc/src/pair_beck.rst index 44bc317138..d220e0abdd 100644 --- a/doc/src/pair_beck.rst +++ b/doc/src/pair_beck.rst @@ -78,7 +78,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_body_nparticle.rst b/doc/src/pair_body_nparticle.rst index 963f9f4b50..24d5beeb3d 100644 --- a/doc/src/pair_body_nparticle.rst +++ b/doc/src/pair_body_nparticle.rst @@ -31,7 +31,7 @@ for more details on using body particles. This pair style is designed for use with the "nparticle" body style, which is specified as an argument to the "atom-style body" command. -See the :doc:`Howto body ` doc page for more details about +See the :doc:`Howto body ` page for more details about the body styles LAMMPS supports. The "nparticle" style treats a body particle as a rigid body composed of N sub-particles. @@ -74,7 +74,7 @@ interaction, using the standard formula where :math:`R_c` is the cutoff. As explained above, an interaction involving one or two body sub-particles may be computed even for :math:`r > R_c`. -For style *body*\ , the following coefficients must be defined for each +For style *body*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the :doc:`read_data ` or :doc:`read_restart ` @@ -104,7 +104,7 @@ This pair style does not write its information to :doc:`binary restart files ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -112,7 +112,7 @@ Restrictions """""""""""" This style is part of the BODY package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Defining particles to be bodies so they participate in body/body or body/particle interactions requires the use of the :doc:`atom_style body ` command. diff --git a/doc/src/pair_body_rounded_polygon.rst b/doc/src/pair_body_rounded_polygon.rst index 6301bf23b1..6757d9d60e 100644 --- a/doc/src/pair_body_rounded_polygon.rst +++ b/doc/src/pair_body_rounded_polygon.rst @@ -34,7 +34,7 @@ Style *body/rounded/polygon* is for use with 2d models of body particles of style *rounded/polygon*\ . It calculates pairwise body/body interactions which can include body particles modeled as 1-vertex circular disks with a specified diameter. See the -:doc:`Howto body ` doc page for more details on using body +:doc:`Howto body ` page for more details on using body rounded/polygon particles. This pairwise interaction between rounded polygons is described in @@ -127,13 +127,13 @@ pair_coeff commands in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" These pair styles are part of the BODY package. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_body_rounded_polyhedron.rst b/doc/src/pair_body_rounded_polyhedron.rst index 3ef4fb7ca2..f2f7c1676a 100644 --- a/doc/src/pair_body_rounded_polyhedron.rst +++ b/doc/src/pair_body_rounded_polyhedron.rst @@ -34,7 +34,7 @@ Style *body/rounded/polygon* is for use with 3d models of body particles of style *rounded/polyhedron*\ . It calculates pairwise body/body interactions which can include body particles modeled as 1-vertex spheres with a specified diameter. See the -:doc:`Howto body ` doc page for more details on using body +:doc:`Howto body ` page for more details on using body rounded/polyhedron particles. This pairwise interaction between the rounded polyhedra is described @@ -122,13 +122,13 @@ commands in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" These pair styles are part of the BODY package. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_bop.rst b/doc/src/pair_bop.rst index f566d41e2c..42b9c54406 100644 --- a/doc/src/pair_bop.rst +++ b/doc/src/pair_bop.rst @@ -372,7 +372,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -380,7 +380,7 @@ Restrictions """""""""""" These pair styles are part of the MANYBODY package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair potentials require the :doc:`newtion ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_born.rst b/doc/src/pair_born.rst index 65be948f82..555e78eecd 100644 --- a/doc/src/pair_born.rst +++ b/doc/src/pair_born.rst @@ -147,7 +147,7 @@ The second coefficient, rho, must be greater than zero. The last coefficient is optional. If not specified, the global A,C,D cutoff specified in the pair_style command is used. -For *born/coul/long*\ , *born/coul/wolf* and *born/coul/dsf* no +For *born/coul/long*, *born/coul/wolf* and *born/coul/dsf* no Coulombic cutoff can be specified for an individual I,J type pair. All type pairs use the same global Coulombic cutoff specified in the pair_style command. @@ -179,8 +179,8 @@ Thess styles writes thei information to binary :doc:`restart ` files, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*\ , -*middle*\ , *outer* keywords. +These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*, +*middle*, *outer* keywords. ---------- @@ -188,7 +188,13 @@ Restrictions """""""""""" The *born/coul/long* style is part of the KSPACE package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. + +The *born/coul/dsf* and *born/coul/wolf* pair styles are part of the +EXTRA-PAIR package. They are only enabled if LAMMPS was built with +that package. See the :doc:`Build package ` page +for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_brownian.rst b/doc/src/pair_brownian.rst index 43c17c9087..780a181a69 100644 --- a/doc/src/pair_brownian.rst +++ b/doc/src/pair_brownian.rst @@ -50,7 +50,7 @@ spherical particles. These pair styles are designed to be used with either the :doc:`pair_style lubricate ` or :doc:`pair_style lubricateU ` commands to provide thermostatting when dissipative lubrication forces are acting. Thus the parameters -*mu*\ , *flaglog*\ , *flagfld*\ , *cutinner*\ , and *cutoff* should be +*mu*, *flaglog*, *flagfld*, *cutinner*, and *cutoff* should be specified consistent with the settings in the lubrication pair styles. For details, refer to either of the lubrication pair styles. @@ -104,7 +104,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -112,7 +112,7 @@ Restrictions """""""""""" These styles are part of the COLLOID package. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Only spherical monodisperse particles are allowed for pair_style brownian. diff --git a/doc/src/pair_buck.rst b/doc/src/pair_buck.rst index 5f255ece39..eb88d09fd0 100644 --- a/doc/src/pair_buck.rst +++ b/doc/src/pair_buck.rst @@ -100,7 +100,7 @@ where :math:`\rho` is an ionic-pair dependent length parameter, and The styles with *coul/cut* or *coul/long* or *coul/msm* add a Coulombic term as described for the :doc:`lj/cut ` pair styles. -For *buck/coul/long* and *buc/coul/msm*\ , an additional damping factor +For *buck/coul/long* and *buc/coul/msm*, an additional damping factor is applied to the Coulombic term so it can be used in conjunction with the :doc:`kspace_style ` command and its *ewald* or *pppm* or *msm* option. The Coulombic cutoff specified for this style means @@ -145,7 +145,7 @@ A,C and Coulombic cutoffs are used. If only one cutoff is specified, it is used as the cutoff for both A,C and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the A,C and Coulombic cutoffs for this type pair. You cannot specify -2 cutoffs for style *buck*\ , since it has no Coulombic terms. +2 cutoffs for style *buck*, since it has no Coulombic terms. For *buck/coul/long* only the LJ cutoff can be specified since a Coulombic cutoff cannot be specified for an individual I,J type pair. All type pairs use the same global Coulombic cutoff specified in the @@ -177,14 +177,14 @@ pair interaction. These styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*\ , -*middle*\ , *outer* keywords. +These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" The *buck/coul/long* style is part of the KSPACE package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_buck6d_coul_gauss.rst b/doc/src/pair_buck6d_coul_gauss.rst index 740ed0292f..be23f11416 100644 --- a/doc/src/pair_buck6d_coul_gauss.rst +++ b/doc/src/pair_buck6d_coul_gauss.rst @@ -136,7 +136,7 @@ Restrictions """""""""""" These styles are part of the MOFFF package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_buck_long.rst b/doc/src/pair_buck_long.rst index 0e19873500..82dd41ff6f 100644 --- a/doc/src/pair_buck_long.rst +++ b/doc/src/pair_buck_long.rst @@ -64,22 +64,22 @@ settings. The :ref:`Ismail ` paper has more details on when it is appropriate to include long-range 1/r\^6 interactions, using this potential. -If *flag_buck* is set to *long*\ , no cutoff is used on the Buckingham +If *flag_buck* is set to *long*, no cutoff is used on the Buckingham 1/r\^6 dispersion term. The long-range portion can be calculated by using the :doc:`kspace_style ewald/disp or pppm/disp ` commands. The specified Buckingham cutoff then determines which portion of the Buckingham interactions are computed directly by the pair potential versus which part is computed in reciprocal space via -the Kspace style. If *flag_buck* is set to *cut*\ , the Buckingham +the Kspace style. If *flag_buck* is set to *cut*, the Buckingham interactions are simply cutoff, as with :doc:`pair_style buck `. -If *flag_coul* is set to *long*\ , no cutoff is used on the Coulombic +If *flag_coul* is set to *long*, no cutoff is used on the Coulombic interactions. The long-range portion can calculated by using any of several :doc:`kspace_style ` command options such as *pppm* or *ewald*\ . Note that if *flag_buck* is also set to long, then the *ewald/disp* or *pppm/disp* Kspace style needs to be used to perform the long-range calculations for both the Buckingham and -Coulombic interactions. If *flag_coul* is set to *off*\ , Coulombic +Coulombic interactions. If *flag_coul* is set to *off*, Coulombic interactions are not computed. The following coefficients must be defined for each pair of atoms @@ -102,9 +102,9 @@ are used. If only one cutoff is specified, it is used as the cutoff for both Buckingham and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the Buckingham and Coulombic cutoffs for this type pair. Note that if you are using -*flag_buck* set to *long*\ , you cannot specify a Buckingham cutoff for +*flag_buck* set to *long*, you cannot specify a Buckingham cutoff for an atom type pair, since only one global Buckingham cutoff is allowed. -Similarly, if you are using *flag_coul* set to *long*\ , you cannot +Similarly, if you are using *flag_coul* set to *long*, you cannot specify a Coulombic cutoff for an atom type pair, since only one global Coulombic cutoff is allowed. @@ -135,7 +135,7 @@ the long-range Coulombic and dispersion interactions. This pair style write its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style supports the use of the *inner*\ , *middle*\ , and *outer* +This pair style supports the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. See the :doc:`run_style ` command for @@ -147,7 +147,7 @@ Restrictions """""""""""" This style is part of the KSPACE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_charmm.rst b/doc/src/pair_charmm.rst index b3d2a2b878..d45ef58060 100644 --- a/doc/src/pair_charmm.rst +++ b/doc/src/pair_charmm.rst @@ -169,7 +169,7 @@ where S(r) is the energy switching function mentioned above for the functional forms of the force switching and force shifting functions used in the *charmmfsw* and *charmmfsh* styles. -When using the *lj/charmm/coul/charmm styles*\ , both the LJ and +When using the *lj/charmm/coul/charmm styles*, both the LJ and Coulombic terms require an inner and outer cutoff. They can be the same for both formulas or different depending on whether 2 or 4 arguments are used in the pair_style command. For the @@ -193,7 +193,7 @@ biomolecule (no explicit water molecules). Styles *lj/charmm/coul/long* and *lj/charmm/coul/msm* compute the same formulas as style *lj/charmm/coul/charmm* and style *lj/charmmfsw/coul/long* computes the same formulas as style -*lj/charmmfsw/coul/charmmfsh*\ , except that an additional damping +*lj/charmmfsw/coul/charmmfsh*, except that an additional damping factor is applied to the Coulombic term, so it can be used in conjunction with the :doc:`kspace_style ` command and its *ewald* or *pppm* or *msm* option. Only one Coulombic cutoff is @@ -260,7 +260,7 @@ pair_coeff commands do not need to be specified in an input script that reads a restart file. The *lj/charmm/coul/long* and *lj/charmmfsw/coul/long* pair styles -support the use of the *inner*\ , *middle*\ , and *outer* keywords of the +support the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. The other styles only support the *pair* keyword of diff --git a/doc/src/pair_class2.rst b/doc/src/pair_class2.rst index f88663d36b..8c6f90efa8 100644 --- a/doc/src/pair_class2.rst +++ b/doc/src/pair_class2.rst @@ -100,7 +100,7 @@ class 2 and Coulombic cutoffs are used. If only one cutoff is specified, it is used as the cutoff for both class 2 and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the class 2 and Coulombic cutoffs for this type pair. -You cannot specify 2 cutoffs for style *lj/class2*\ , since it has no +You cannot specify 2 cutoffs for style *lj/class2*, since it has no Coulombic terms. For *lj/class2/coul/long* only the class 2 cutoff can be specified @@ -120,10 +120,10 @@ for mixing the cutoff distance. ---------- -A version of these styles with a soft core, *lj/cut/soft*\ , suitable for use in +A version of these styles with a soft core, *lj/cut/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. The version with soft core is -only available if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only available if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. ---------- @@ -158,7 +158,7 @@ All of the lj/class2 pair styles write their information to :doc:`binary restart not need to be specified in an input script that reads a restart file. Only the *lj/class2* and *lj/class2/coul/long* pair styles support the use of the -*inner*\ , *middle*\ , and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be +*inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. The other styles only support the *pair* keyword of run_style respa. See the :doc:`run_style ` command for details. @@ -167,7 +167,7 @@ Restrictions """""""""""" These styles are part of the CLASS2 package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coeff.rst b/doc/src/pair_coeff.rst index ea62d839ab..147b9177ec 100644 --- a/doc/src/pair_coeff.rst +++ b/doc/src/pair_coeff.rst @@ -78,7 +78,7 @@ not set explicitly by a pair_coeff command, the values are inferred from the I,I and J,J settings by mixing rules; see the :doc:`pair_modify ` command for a discussion. Details on this option as it pertains to individual potentials are described on -the doc page for the potential. +the page for the potential. Many pair styles, typically for many-body potentials, use tabulated potential files as input, when specifying the pair_coeff command. diff --git a/doc/src/pair_colloid.rst b/doc/src/pair_colloid.rst index 040bea2487..9e68e65778 100644 --- a/doc/src/pair_colloid.rst +++ b/doc/src/pair_colloid.rst @@ -187,7 +187,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -195,7 +195,7 @@ Restrictions """""""""""" This style is part of the COLLOID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Normally, this pair style should be used with finite-size particles which have a diameter, e.g. see the :doc:`atom_style sphere ` command. However, this is not a requirement, diff --git a/doc/src/pair_comb.rst b/doc/src/pair_comb.rst index 2e164d46fc..aff28cd892 100644 --- a/doc/src/pair_comb.rst +++ b/doc/src/pair_comb.rst @@ -52,7 +52,7 @@ total energy :math:`E_T` of a system of atoms is given by where :math:`E_i^{self}` is the self-energy of atom *i* (including atomic ionization energies and electron affinities), :math:`E_{ij}^{short}` is the bond-order potential between atoms *i* and -*j*\ , :math:`E_{ij}^{Coul}` is the Coulomb interactions, +*j*, :math:`E_{ij}^{Coul}` is the Coulomb interactions, :math:`E^{polar}` is the polarization term for organic systems (style *comb3* only), :math:`E^{vdW}` is the van der Waals energy (style *comb3* only), :math:`E^{barr}` is a charge barrier function, and @@ -93,10 +93,10 @@ This can be used when a *comb* potential is used as part of the *hybrid* pair style. The NULL values are placeholders for atom types that will be used with other potentials. -For style *comb*\ , the provided potential file *ffield.comb* contains +For style *comb*, the provided potential file *ffield.comb* contains all currently-available second generation COMB parameterizations: for Si, Cu, Hf, Ti, O, their oxides and Zr, Zn and U metals. For style -*comb3*\ , the potential file *ffield.comb3* contains all +*comb3*, the potential file *ffield.comb3* contains all currently-available third generation COMB parameterizations: O, Cu, N, C, H, Ti, Zn and Zr. The status of the optimization of the compounds, for example Cu2O, TiN and hydrocarbons, are given in the @@ -126,8 +126,8 @@ following table: * M = Only optimized for dimer molecule * P = in progress, but have it from mixing rule -For style *comb3*\ , in addition to ffield.comb3, a special parameter -file, *lib.comb3*\ , that is exclusively used for C/O/H systems, will be +For style *comb3*, in addition to ffield.comb3, a special parameter +file, *lib.comb3*, that is exclusively used for C/O/H systems, will be automatically loaded if carbon atom is detected in LAMMPS input structure. This file must be in your working directory or in the directories listed in the environment variable ``LAMMPS_POTENTIALS``, as @@ -139,7 +139,7 @@ has not yet been implemented, it can only set polar_off at present. .. note:: - You can not use potential file *ffield.comb* with style *comb3*\ , + You can not use potential file *ffield.comb* with style *comb3*, nor file *ffield.comb3* with style *comb*\ . ---------- @@ -164,7 +164,7 @@ restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -172,7 +172,7 @@ Restrictions """""""""""" These pair styles are part of the MANYBODY package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair styles requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_cosine_squared.rst b/doc/src/pair_cosine_squared.rst index 185bffff99..f68df419a4 100644 --- a/doc/src/pair_cosine_squared.rst +++ b/doc/src/pair_cosine_squared.rst @@ -93,14 +93,14 @@ Mixing, shift, table, tail correction, restart, rRESPA info Mixing is not supported for this style. -The *shift*\ , *table* and *tail* options are not relevant for this style. +The *shift*, *table* and *tail* options are not relevant for this style. This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -108,7 +108,7 @@ Restrictions """""""""""" The *cosine/squared* style is part of the EXTRA-PAIR package. It is only -enabled if LAMMPS is build with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS is build with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coul.rst b/doc/src/pair_coul.rst index b8303622aa..990458887d 100644 --- a/doc/src/pair_coul.rst +++ b/doc/src/pair_coul.rst @@ -283,7 +283,7 @@ Coulombic solver (Ewald or PPPM). atom. For example, if the atom ID of an O atom in a TIP4P water molecule is 500, then its 2 H atoms must have IDs 501 and 502. -See the :doc:`Howto tip4p ` doc page for more information +See the :doc:`Howto tip4p ` page for more information on how to use the TIP4P pair styles and lists of parameters to set. Note that the neighbor list cutoff for Coulomb interactions is effectively extended by a distance 2\*qdist when using the TIP4P pair @@ -311,14 +311,14 @@ commands, or by mixing as described below: * cutoff (distance units) -For *coul/cut* and *coul/debye*\ , the cutoff coefficient is optional. +For *coul/cut* and *coul/debye* the cutoff coefficient is optional. If it is not used (as in some of the examples above), the default global value specified in the pair_style command is used. -For *coul/long* and *coul/msm* no cutoff can be specified for an -individual I,J type pair via the pair_coeff command. All type pairs -use the same global Coulomb cutoff specified in the pair_style -command. +For *coul/cut/global*, *coul/long* and *coul/msm* no cutoff can be +specified for an individual I,J type pair via the pair_coeff command. +All type pairs use the same global Coulomb cutoff specified in the +pair_style command. ---------- @@ -349,17 +349,17 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" -The *coul/long*\ , *coul/msm* and *tip4p/long* styles are part of the -KSPACE package. They are only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more -info. +The *coul/cut/global*, *coul/long*, *coul/msm*, *coul/streitz*, and *tip4p/long* styles +are part of the KSPACE package. They are only enabled if LAMMPS was built +with that package. See the :doc:`Build package ` doc page +for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coul_diel.rst b/doc/src/pair_coul_diel.rst index 573329a1bb..7dc245f449 100644 --- a/doc/src/pair_coul_diel.rst +++ b/doc/src/pair_coul_diel.rst @@ -90,13 +90,13 @@ pressure. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" This style is part of the EXTRA-PAIR package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coul_shield.rst b/doc/src/pair_coul_shield.rst index 0ca656092e..a7f99500f5 100644 --- a/doc/src/pair_coul_shield.rst +++ b/doc/src/pair_coul_shield.rst @@ -77,14 +77,14 @@ pressure. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coul_slater.rst b/doc/src/pair_coul_slater.rst index f3dab4c778..443de4262b 100644 --- a/doc/src/pair_coul_slater.rst +++ b/doc/src/pair_coul_slater.rst @@ -93,7 +93,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" @@ -101,7 +101,7 @@ Restrictions The *coul/slater/long* style requires the long-range solvers included in the KSPACE package. These styles are part of the EXTRA-PAIR package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_coul_tt.rst b/doc/src/pair_coul_tt.rst index d1465ef147..f6c3a1f6f2 100644 --- a/doc/src/pair_coul_tt.rst +++ b/doc/src/pair_coul_tt.rst @@ -70,7 +70,7 @@ interactions between the (non-polarizable part of the) charge of a core, The :math:`b_{ij}` and :math:`c_{ij}` are equal to :math:`b_{ji}` and :math:`c_{ji}` in the case of core-core interactions. -For pair_style *coul/tt*\ , the following coefficients must be defined for +For pair_style *coul/tt*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the example above. @@ -97,7 +97,7 @@ Restrictions These pair styles are part of the DRUDE package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair_style should currently not be used with the :doc:`charmm dihedral style ` if the latter has non-zero 1-4 weighting diff --git a/doc/src/pair_cs.rst b/doc/src/pair_cs.rst index f41d840216..ef40eb310f 100644 --- a/doc/src/pair_cs.rst +++ b/doc/src/pair_cs.rst @@ -115,7 +115,7 @@ Description These pair styles are designed to be used with the adiabatic core/shell model of :ref:`(Mitchell and Finchham) `. See -the :doc:`Howto coreshell ` doc page for an overview of +the :doc:`Howto coreshell ` page for an overview of the model as implemented in LAMMPS. All the styles are identical to the corresponding pair style without @@ -181,7 +181,7 @@ Restrictions """""""""""" These pair styles are part of the CORESHELL package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_dielectric.rst b/doc/src/pair_dielectric.rst index 1af26a0921..c1f28c2089 100644 --- a/doc/src/pair_dielectric.rst +++ b/doc/src/pair_dielectric.rst @@ -105,13 +105,13 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" These styles are part of the DIELECTRIC package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_dipole.rst b/doc/src/pair_dipole.rst index 7645966229..372ea26794 100644 --- a/doc/src/pair_dipole.rst +++ b/doc/src/pair_dipole.rst @@ -242,19 +242,19 @@ dipole-charge, and charge-charge interactions are all supported, along with the standard 12/6 Lennard-Jones interactions. LJ interactions can be cutoff or long-ranged. -For style *lj/long/dipole/long*\ , if *flag_lj* is set to *long*\ , no +For style *lj/long/dipole/long*, if *flag_lj* is set to *long*, no cutoff is used on the LJ 1/r\^6 dispersion term. The long-range portion is calculated by using the :doc:`kspace_style ewald_disp ` command. The specified LJ cutoff then determines which portion of the LJ interactions are computed directly by the pair potential versus which part is computed in reciprocal -space via the Kspace style. If *flag_lj* is set to *cut*\ , the LJ -interactions are simply cutoff, as with :doc:`pair_style lj/cut `. If *flag_lj* is set to *off*\ , LJ interactions +space via the Kspace style. If *flag_lj* is set to *cut*, the LJ +interactions are simply cutoff, as with :doc:`pair_style lj/cut `. If *flag_lj* is set to *off*, LJ interactions are not computed at all. -If *flag_coul* is set to *long*\ , no cutoff is used on the Coulombic or +If *flag_coul* is set to *long*, no cutoff is used on the Coulombic or dipole interactions. The long-range portion is calculated by using *ewald_disp* of the :doc:`kspace_style ` command. If -*flag_coul* is set to *off*\ , Coulombic and dipole interactions are not +*flag_coul* is set to *off*, Coulombic and dipole interactions are not computed at all. Atoms with dipole moments should be integrated using the :doc:`fix nve/sphere update dipole ` or the :doc:`fix nvt/sphere update dipole ` command to rotate the @@ -320,15 +320,15 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" -The *lj/cut/dipole/cut*\ , *lj/cut/dipole/long*\ , *lj/long/dipole/long*, +The *lj/cut/dipole/cut*, *lj/cut/dipole/long*, *lj/long/dipole/long*, and lj/sf/dipole/sf* styles are part of the DIPOLE package. They are only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Using dipole pair styles with *electron* :doc:`units ` is not currently supported. diff --git a/doc/src/pair_dpd.rst b/doc/src/pair_dpd.rst index aa8323379a..8a8b35e50a 100644 --- a/doc/src/pair_dpd.rst +++ b/doc/src/pair_dpd.rst @@ -57,7 +57,7 @@ Nose Hoover as implemented by :doc:`fix nvt `. To use *dpd/tstat* as a thermostat for another pair style, use the :doc:`pair_style hybrid/overlay ` command to compute both the desired pair interaction and the thermostat for each pair of particles. -For style *dpd*\ , the force on atom I due to atom J is given as a sum +For style *dpd*, the force on atom I due to atom J is given as a sum of 3 terms .. math:: @@ -79,18 +79,18 @@ is set equal to :math:`\sqrt{2 k_B T \gamma}`, where :math:`k_B` is the Boltzmann constant and T is the temperature parameter in the pair_style command. -For style *dpd/tstat*\ , the force on atom I due to atom J is the same +For style *dpd/tstat*, the force on atom I due to atom J is the same as the above equation, except that the conservative Fc term is dropped. Also, during the run, T is set each timestep to a ramped value from Tstart to Tstop. -For style *dpd*\ , the pairwise energy associated with style *dpd* is +For style *dpd*, the pairwise energy associated with style *dpd* is only due to the conservative force term Fc, and is shifted to be zero at the cutoff distance Rc. The pairwise virial is calculated using all 3 terms. For style *dpd/tstat* there is no pairwise energy, but the last two terms of the formula make a contribution to the virial. -For style *dpd*\ , the following coefficients must be defined for each +For style *dpd*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the :doc:`read_data ` or :doc:`read_restart ` @@ -105,7 +105,7 @@ cutoff is used. Note that sigma is set equal to sqrt(2 T gamma), where T is the temperature set by the :doc:`pair_style ` command so it does not need to be specified. -For style *dpd/tstat*\ , the coefficients defined for each pair of +For style *dpd/tstat*, the coefficients defined for each pair of atoms types via the :doc:`pair_coeff ` command is the same, except that A is not included. @@ -165,7 +165,7 @@ if the original simulation had continued past the restart time. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. The *dpd/tstat* style can ramp its target temperature over multiple runs, using the *start* and *stop* keywords of the :doc:`run ` @@ -179,7 +179,7 @@ Restrictions These styles are part of the DPD-BASIC package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. The default frequency for rebuilding neighbor lists is every 10 steps (see the :doc:`neigh_modify ` command). This may be too diff --git a/doc/src/pair_dpd_ext.rst b/doc/src/pair_dpd_ext.rst index 0523a19e0b..7512f8e688 100644 --- a/doc/src/pair_dpd_ext.rst +++ b/doc/src/pair_dpd_ext.rst @@ -49,7 +49,7 @@ style, use the :doc:`pair_style hybrid/overlay ` command to compute both the desired pair interaction and the thermostat for each pair of particles. -For the style *dpd/ext*\ , the force on atom I due to atom J is given as +For the style *dpd/ext*, the force on atom I due to atom J is given as a sum of 3 terms .. math:: @@ -78,12 +78,12 @@ unit matrix, :math:`\sigma_{\alpha} = \sqrt{2 k T \gamma_{\alpha}}`, where :math:`k` is the Boltzmann constant and :math:`T` is the temperature in the pair\_style command. -For the style *dpd/ext/tstat*\ , the force on atom I due to atom J is +For the style *dpd/ext/tstat*, the force on atom I due to atom J is the same as the above equation, except that the conservative :math:`\mathbf{f}^C` term is dropped. Also, during the run, T is set each timestep to a ramped value from Tstart to Tstop. -For the style *dpd/ext*\ , the pairwise energy associated with style +For the style *dpd/ext*, the pairwise energy associated with style *dpd/ext* is only due to the conservative force term :math:`\mathbf{f}^C`, and is shifted to be zero at the cutoff distance :math:`r_c`. The pairwise virial is calculated using all three @@ -95,7 +95,7 @@ same as the above equation, except that the conservative :math:`\mathbf{f}^C` term is dropped. Also, during the run, T is set each timestep to a ramped value from Tstart to Tstop. -For the style *dpd/ext*\ , the pairwise energy associated with style +For the style *dpd/ext*, the pairwise energy associated with style *dpd/ext* is only due to the conservative force term :math:`\mathbf{f}^C`, and is shifted to be zero at the cutoff distance :math:`r_c`. The pairwise virial is calculated using all three @@ -157,7 +157,7 @@ energy and pressure. The pair styles can only be used via the pair keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , and *outer*\ keywords. +*inner*, *middle*, and *outer*\ keywords. The style *dpd/ext/tstat* can ramp its target temperature over multiple runs, using the start and stop keywords of the :doc:`run ` @@ -171,7 +171,7 @@ Restrictions These styles are part of the DPD-BASIC package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. The default frequency for rebuilding neighbor lists is every 10 steps (see the :doc:`neigh_modify ` command). This may be too diff --git a/doc/src/pair_dpd_fdt.rst b/doc/src/pair_dpd_fdt.rst index 8767c5b99e..25fe2581db 100644 --- a/doc/src/pair_dpd_fdt.rst +++ b/doc/src/pair_dpd_fdt.rst @@ -77,7 +77,7 @@ following functional form: Note that alternative definitions of the weighting function exist, but would have to be implemented as a separate pair style command. -For style *dpd/fdt*\ , the fluctuation-dissipation theorem defines :math:`\gamma` +For style *dpd/fdt*, the fluctuation-dissipation theorem defines :math:`\gamma` to be set equal to :math:`\sigma^2/(2 T)`, where T is the set point temperature specified as a pair style parameter in the above examples. The following coefficients must be defined for each pair of atoms types @@ -163,7 +163,7 @@ Restrictions """""""""""" These commands are part of the DPD-REACT package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Pair styles *dpd/fdt* and *dpd/fdt/energy* require use of the :doc:`comm_modify vel yes ` option so that velocities are diff --git a/doc/src/pair_drip.rst b/doc/src/pair_drip.rst index 39a5e8bbef..f7b01eee25 100644 --- a/doc/src/pair_drip.rst +++ b/doc/src/pair_drip.rst @@ -119,7 +119,7 @@ Restrictions This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_dsmc.rst b/doc/src/pair_dsmc.rst index d7542ea801..b0a508b054 100644 --- a/doc/src/pair_dsmc.rst +++ b/doc/src/pair_dsmc.rst @@ -131,7 +131,7 @@ continued past the restart time. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -139,7 +139,7 @@ Restrictions """""""""""" This style is part of the MC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_e3b.rst b/doc/src/pair_e3b.rst index 9aeebfc020..b75fb8450c 100644 --- a/doc/src/pair_e3b.rst +++ b/doc/src/pair_e3b.rst @@ -98,7 +98,7 @@ The *preset 2015* option should be used with the :doc:`TIP4P/2005 water model ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_eam.rst b/doc/src/pair_eam.rst index a8b67e7f41..fd05d7189e 100644 --- a/doc/src/pair_eam.rst +++ b/doc/src/pair_eam.rst @@ -145,7 +145,7 @@ provides EAM potentials that can be used directly in LAMMPS with the ---------- -For style *eam*\ , potential values are read from a file that is in the +For style *eam*, potential values are read from a file that is in the DYNAMO single-element *funcfl* format. If the DYNAMO file was created by a Fortran program, it cannot have "D" values in it for exponents. C only recognizes "e" or "E" for scientific notation. @@ -225,7 +225,7 @@ above, *setfl* files contain explicit tabulated values for alloy interactions. Thus they allow more generality than *funcfl* files for modeling alloys. -For style *eam/alloy*\ , potential values are read from a file that is +For style *eam/alloy*, potential values are read from a file that is in the DYNAMO multi-element *setfl* format, except that element names (Ni, Cu, etc) are added to one of the lines in the file. If the DYNAMO file was created by a Fortran program, it cannot have "D" @@ -372,7 +372,7 @@ require that; the user can tabulate any functional form desired in the FS potential files. For style *eam/fs* and *eam/he* the form of the pair_coeff command is exactly -the same as for style *eam/alloy*\ , e.g. +the same as for style *eam/alloy*, e.g. .. code-block:: LAMMPS @@ -383,13 +383,13 @@ the number of LAMMPS atom types. See the :doc:`pair_coeff ` doc page for alternate ways to specify the path for the potential file. The N values determine the mapping of LAMMPS atom types to EAM elements in the file, as described above for style *eam/alloy*\ . As -with *eam/alloy*\ , if a mapping value is NULL, the mapping is not +with *eam/alloy*, if a mapping value is NULL, the mapping is not performed. This can be used when an *eam/fs* or *eam/he* potential is used as part of a *hybrid* pair style. The NULL values are used as placeholders for atom types that will be used with other potentials. FS EAM and HE EAM files include more information than the DYNAMO *setfl* -format files read by *eam/alloy*\ , in that i,j density functionals for +format files read by *eam/alloy*, in that i,j density functionals for all pairs of elements are included as needed by the Finnis/Sinclair formulation of the EAM. @@ -465,7 +465,7 @@ an input script that reads a restart file. The eam pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -473,7 +473,7 @@ Restrictions """""""""""" All of these styles are part of the MANYBODY package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_edip.rst b/doc/src/pair_edip.rst index b57ba3d162..6b6bfbb11b 100644 --- a/doc/src/pair_edip.rst +++ b/doc/src/pair_edip.rst @@ -69,7 +69,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of EDIP elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine a file Si.edip has EDIP values for Si. @@ -142,7 +142,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_eff.rst b/doc/src/pair_eff.rst index ceb571a58d..b104b01b40 100644 --- a/doc/src/pair_eff.rst +++ b/doc/src/pair_eff.rst @@ -141,7 +141,7 @@ commands, or by mixing as described below: * cutoff (distance units) -For *eff/cut*\ , the cutoff coefficient is optional. If it is not used +For *eff/cut*, the cutoff coefficient is optional. If it is not used (as in some of the examples above), the default global value specified in the pair_style command is used. @@ -283,7 +283,7 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -292,7 +292,7 @@ Restrictions These pair styles will only be enabled if LAMMPS is built with the EFF package. It will only be enabled if LAMMPS was built with -that package. See the :doc:`Build package ` doc page for +that package. See the :doc:`Build package ` page for more info. These pair styles require that particles store electron attributes diff --git a/doc/src/pair_eim.rst b/doc/src/pair_eim.rst index 8360dbab64..c84bce9d53 100644 --- a/doc/src/pair_eim.rst +++ b/doc/src/pair_eim.rst @@ -105,7 +105,7 @@ command, where N is the number of LAMMPS atom types: * EIM potential file * N element names = mapping of EIM elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example like one of those above, suppose you want to model a diff --git a/doc/src/pair_exp6_rx.rst b/doc/src/pair_exp6_rx.rst index e9550c2152..55395bcd0d 100644 --- a/doc/src/pair_exp6_rx.rst +++ b/doc/src/pair_exp6_rx.rst @@ -71,7 +71,7 @@ to be the internal chemical energy (uChem). The fourth argument specifies the type of scaling that will be used to scale the EXP-6 parameters as reactions occur. Currently, there -are three scaling options: *exponent*\ , *polynomial* and *none*\ . +are three scaling options: *exponent*, *polynomial* and *none*\ . Exponent scaling requires two additional arguments for scaling the :math:`R_m` and :math:`\epsilon` parameters, respectively. The scaling factor @@ -179,7 +179,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_fep_soft.rst b/doc/src/pair_fep_soft.rst index 6f8954a0a7..400ad0cc4a 100644 --- a/doc/src/pair_fep_soft.rst +++ b/doc/src/pair_fep_soft.rst @@ -259,7 +259,7 @@ LJ and Coulombic cutoffs specified in the pair_style command are used. If only one cutoff is specified, it is used as the cutoff for both LJ and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the LJ and Coulombic cutoffs for this -type pair. You cannot specify 2 cutoffs for style *lj/cut/soft*\ , +type pair. You cannot specify 2 cutoffs for style *lj/cut/soft*, since it has no Coulombic terms. For the *coul/cut/soft* and *coul/long/soft* only lambda and the optional cutoff2 are to be specified. @@ -290,7 +290,7 @@ activation parameter lambda is introduced as an argument of the the :doc:`pair_coeff ` command, after :math:`\epsilon` and :math:`\sigma` and before the optional cutoffs. -The *coul/cut/soft*\ , *coul/long/soft* and *tip4p/long/soft* sub-styles are +The *coul/cut/soft*, *coul/long/soft* and *tip4p/long/soft* sub-styles are designed to be combined with other pair potentials via the :doc:`pair_style hybrid/overlay ` command. This is because they have no repulsive core. Hence, if used by themselves, there will be no repulsion to keep two @@ -304,7 +304,7 @@ the second coefficient. .. note:: When using the soft-core Coulomb potentials with long-range solvers (\ - *coul/long/soft*\ , *lj/cut/coul/long/soft*\ , etc.) in a free energy + *coul/long/soft*, *lj/cut/coul/long/soft*, etc.) in a free energy calculation in which sites holding electrostatic charges are being created or annihilated (using :doc:`fix adapt/fep ` and :doc:`compute fep `) it is important to adapt both the :math:`\lambda` activation @@ -417,7 +417,7 @@ The pair styles with soft core are only enabled if LAMMPS was built with the FEP package. The *long* versions also require the KSPACE package to be installed. The soft *tip4p* versions also require the MOLECULE package to be installed. These styles are only enabled if LAMMPS was built with those -packages. See the :doc:`Build package ` doc page for more +packages. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_gauss.rst b/doc/src/pair_gauss.rst index 71b8df6e3a..4eb45a416b 100644 --- a/doc/src/pair_gauss.rst +++ b/doc/src/pair_gauss.rst @@ -143,7 +143,7 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. The *gauss* pair style tallies an "occupancy" count of how many Gaussian-well sites have an atom within the distance at which the force is a maximum @@ -165,7 +165,7 @@ Restrictions The *gauss* and *gauss/cut* styles are part of the EXTRA-PAIR package. They are only enabled if LAMMPS is build with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. The *gauss* style does not apply :doc:`special_bonds ` factors. When using this pair style on a system that has bonds, the diff --git a/doc/src/pair_gayberne.rst b/doc/src/pair_gayberne.rst index 448f3a26de..09bc3706c2 100644 --- a/doc/src/pair_gayberne.rst +++ b/doc/src/pair_gayberne.rst @@ -178,7 +178,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -186,7 +186,7 @@ Restrictions """""""""""" The *gayberne* style is part of the ASPHERE package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair styles require that atoms store torque and a quaternion to represent their orientation, as defined by the diff --git a/doc/src/pair_gran.rst b/doc/src/pair_gran.rst index fbcacb5c76..c4024a391a 100644 --- a/doc/src/pair_gran.rst +++ b/doc/src/pair_gran.rst @@ -101,7 +101,7 @@ damping force. The tangential force also has 2 terms: a shear force and a damping force. The shear force is a "history" effect that accounts for the tangential displacement between the particles for the duration of the time they are in contact. This term is included in -pair styles *hooke/history* and *hertz/history*\ , but is not included +pair styles *hooke/history* and *hertz/history*, but is not included in pair style *hooke*\ . The tangential damping force term is included in all three pair styles if *dampflag* is set to 1; it is not included if *dampflag* is set to 0. @@ -240,7 +240,7 @@ specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these @@ -254,7 +254,7 @@ normal direction (along the line joining the 2 sphere centers). The last 3 (8-10) the components of the relative velocity in the tangential direction. -These extra quantities can be accessed by the :doc:`compute pair/local ` command, as *p1*\ , *p2*\ , ..., +These extra quantities can be accessed by the :doc:`compute pair/local ` command, as *p1*, *p2*, ..., *p10*\ . ---------- @@ -263,7 +263,7 @@ Restrictions """""""""""" All the granular pair styles are part of the GRANULAR package. It is -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair styles require that atoms store torque and angular velocity (omega) as defined by the :doc:`atom_style `. They also diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index dea862b62d..b7f9da9f8b 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -99,8 +99,8 @@ Where :math:`\delta_{ij} = R_i + R_j - \|\mathbf{r}_{ij}\|` is the particle overlap, :math:`R_i, R_j` are the particle radii, :math:`\mathbf{r}_{ij} = \mathbf{r}_i - \mathbf{r}_j` is the vector separating the two particle centers (note the i-j ordering so that :math:`F_{ne}` is positive for repulsion), and :math:`\mathbf{n} = \frac{\mathbf{r}_{ij}}{\|\mathbf{r}_{ij}\|}`. Therefore, -for *hooke*\ , the units of the spring constant :math:`k_n` are -*force*\ /\ *distance*\ , or equivalently *mass*\ /*time\^2*. +for *hooke*, the units of the spring constant :math:`k_n` are +*force*\ /\ *distance*, or equivalently *mass*\ /*time\^2*. For the *hertz* model, the normal component of force is given by: @@ -109,7 +109,7 @@ For the *hertz* model, the normal component of force is given by: \mathbf{F}_{ne, Hertz} = k_n R_{eff}^{1/2}\delta_{ij}^{3/2} \mathbf{n} Here, :math:`R_{eff} = \frac{R_i R_j}{R_i + R_j}` is the effective -radius, denoted for simplicity as *R* from here on. For *hertz*\ , the +radius, denoted for simplicity as *R* from here on. For *hertz*, the units of the spring constant :math:`k_n` are *force*\ /\ *length*\ \^2, or equivalently *pressure*\ . @@ -188,7 +188,7 @@ for the damping model currently supported are: If the *damping* keyword is not specified, the *viscoelastic* model is used by default. -For *damping velocity*\ , the normal damping is simply equal to the +For *damping velocity*, the normal damping is simply equal to the user-specified damping coefficient in the *normal* model: .. math:: @@ -219,8 +219,8 @@ damping is given by: \eta_n = \eta_{n0}\ a m_{eff} Here, *a* is the contact radius, given by :math:`a =\sqrt{R\delta}` -for all models except *jkr*\ , for which it is given implicitly according -to :math:`\delta = a^2/R - 2\sqrt{\pi \gamma a/E}`. For *damping viscoelastic*\ , +for all models except *jkr*, for which it is given implicitly according +to :math:`\delta = a^2/R - 2\sqrt{\pi \gamma a/E}`. For *damping viscoelastic*, :math:`\eta_{n0}` is in units of 1/(\ *time*\ \*\ *distance*\ ). The *tsuji* model is based on the work of :ref:`(Tsuji et al) `. Here, the damping coefficient specified as part of @@ -302,14 +302,14 @@ The direction of the applied force is :math:`\mathbf{t} = \mathbf{v_{t,rel}}/\|\ The normal force value :math:`F_{n0}` used to compute the critical force depends on the form of the contact model. For non-cohesive models -(\ *hertz*\ , *hertz/material*\ , *hooke*\ ), it is given by the magnitude of +(\ *hertz*, *hertz/material*, *hooke*\ ), it is given by the magnitude of the normal force: .. math:: F_{n0} = \|\mathbf{F}_n\| -For cohesive models such as *jkr* and *dmt*\ , the critical force is +For cohesive models such as *jkr* and *dmt*, the critical force is adjusted so that the critical tangential force approaches :math:`\mu_t F_{pulloff}`, see :ref:`Marshall `, equation 43, and :ref:`Thornton `. For both models, :math:`F_{n0}` takes the form: @@ -318,7 +318,7 @@ form: F_{n0} = \|\mathbf{F}_{ne} + 2 F_{pulloff}\| -Where :math:`F_{pulloff} = 3\pi \gamma R` for *jkr*\ , and +Where :math:`F_{pulloff} = 3\pi \gamma R` for *jkr*, and :math:`F_{pulloff} = 4\pi \gamma R` for *dmt*\ . The remaining tangential options all use accumulated tangential @@ -392,7 +392,7 @@ overlap region) to induce a torque on each particle according to: \mathbf{\tau}_j = -(R_j - 0.5 \delta) \mathbf{n} \times \mathbf{F}_t -For *tangential mindlin*\ , the :ref:`Mindlin ` no-slip solution +For *tangential mindlin*, the :ref:`Mindlin ` no-slip solution is used which differs from the *linear_history* option by an additional factor of :math:`a`, the radius of the contact region. The tangential force is given by: @@ -402,7 +402,7 @@ of :math:`a`, the radius of the contact region. The tangential force is given by Here, :math:`a` is the radius of the contact region, given by :math:`a =\sqrt{R\delta}` -for all normal contact models, except for *jkr*\ , where it is given +for all normal contact models, except for *jkr*, where it is given implicitly by :math:`\delta = a^2/R - 2\sqrt{\pi \gamma a/E}`, see discussion above. To match the Mindlin solution, one should set :math:`k_t = 8G_{eff}`, where :math:`G_{eff}` is the effective shear modulus given by: @@ -415,7 +415,7 @@ where :math:`G` is the shear modulus, related to Young's modulus :math:`E` and Poisson's ratio :math:`\nu` by :math:`G = E/(2(1+\nu))`. This can also be achieved by specifying *NULL* for :math:`k_t`, in which case a normal contact model that specifies material parameters :math:`E` and -:math:`\nu` is required (e.g. *hertz/material*\ , *dmt* or *jkr*\ ). In this +:math:`\nu` is required (e.g. *hertz/material*, *dmt* or *jkr*\ ). In this case, mixing of the shear modulus for different particle types *i* and *j* is done according to the formula above. @@ -455,7 +455,7 @@ the critical force: The same rules as those described for *mindlin* apply regarding the tangential stiffness and mixing of the shear modulus for different particle types. -The *mindlin_rescale* option uses the same form as *mindlin*\ , but the +The *mindlin_rescale* option uses the same form as *mindlin*, but the magnitude of the tangential displacement is re-scaled as the contact unloads, i.e. if :math:`a < a_{t_{n-1}}`: @@ -504,7 +504,7 @@ pure rolling motion of particles. The options currently supported are: If the *rolling* keyword is not specified, the model defaults to *none*\ . -For *rolling sds*\ , rolling friction is computed via a +For *rolling sds*, rolling friction is computed via a spring-dashpot-slider, using a 'pseudo-force' formulation, as detailed by :ref:`Luding `. Unlike the formulation in :ref:`Marshall `, this allows for the required adjustment of @@ -564,7 +564,7 @@ supported are: If the *twisting* keyword is not specified, the model defaults to *none*\ . -For both *twisting sds* and *twisting marshall*\ , a history-dependent +For both *twisting sds* and *twisting marshall*, a history-dependent spring-dashpot-slider is used to compute the twisting torque. Because twisting displacement is a scalar, there is no need to adjust for changes in the frame of reference due to rotations of the particle @@ -591,7 +591,7 @@ if the twisting torque exceeds this critical value: \xi_{twist} = \frac{1}{k_{twist}} (\mu_{twist} F_{n,0}sgn(\Omega_{twist}) - \gamma_{twist}\Omega_{twist}) -For *twisting sds*\ , the coefficients :math:`k_{twist}, \gamma_{twist}` +For *twisting sds*, the coefficients :math:`k_{twist}, \gamma_{twist}` and :math:`\mu_{twist}` are simply the user input parameters that follow the *twisting sds* keywords in the *pair_coeff* command. @@ -684,7 +684,7 @@ interactions is set to :math:`\mu_1`, and friction coefficient for type for type1-type2 interactions is computed as :math:`\sqrt{\mu_1\mu_2}` (unless explicitly specified to a different value by a *pair_coeff 1 2 ...* command). The exception to this is elastic modulus, only -applicable to *hertz/material*\ , *dmt* and *jkr* normal contact +applicable to *hertz/material*, *dmt* and *jkr* normal contact models. In that case, the effective elastic modulus is computed as: .. math:: @@ -709,7 +709,7 @@ specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these @@ -725,7 +725,7 @@ about the vector connecting the two particle centers. The last 3 (10-12) are the components of the vector connecting the centers of the two particles (x_I - x_J). -These extra quantities can be accessed by the :doc:`compute pair/local ` command, as *p1*\ , *p2*\ , ..., +These extra quantities can be accessed by the :doc:`compute pair/local ` command, as *p1*, *p2*, ..., *p12*\ . ---------- @@ -734,7 +734,7 @@ Restrictions """""""""""" All the granular pair styles are part of the GRANULAR package. It is -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair styles require that atoms store torque and angular velocity (omega) as defined by the :doc:`atom_style `. They also @@ -759,7 +759,7 @@ Related commands Default """"""" -For the *pair_coeff* settings: *damping viscoelastic*\ , *rolling none*\ , +For the *pair_coeff* settings: *damping viscoelastic*, *rolling none*, *twisting none*\ . References diff --git a/doc/src/pair_gromacs.rst b/doc/src/pair_gromacs.rst index 88cb4ce880..ed24b481f9 100644 --- a/doc/src/pair_gromacs.rst +++ b/doc/src/pair_gromacs.rst @@ -140,13 +140,16 @@ not need to be specified in an input script that reads a restart file. All of the GROMACS pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not -support the *inner*\ , *middle*\ , *outer* keywords. +support the *inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" - none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_gw.rst b/doc/src/pair_gw.rst index d0a7e69b00..6945356ecd 100644 --- a/doc/src/pair_gw.rst +++ b/doc/src/pair_gw.rst @@ -51,7 +51,7 @@ command, where N is the number of LAMMPS atom types: * filename * N element names = mapping of GW elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine a file SiC.gw has Gao-Weber values for Si and C. @@ -96,7 +96,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -104,7 +104,7 @@ Restrictions """""""""""" This pair style is part of the MANYBODY package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_hbond_dreiding.rst b/doc/src/pair_hbond_dreiding.rst index 5e7183a348..f9b2a010fd 100644 --- a/doc/src/pair_hbond_dreiding.rst +++ b/doc/src/pair_hbond_dreiding.rst @@ -88,7 +88,7 @@ potential for the Donor-Acceptor interactions. :ref:`(Liu) ` showed that the Morse form gives improved results for Dendrimer simulations, when n = 2. -See the :doc:`Howto bioFF ` doc page for more information +See the :doc:`Howto bioFF ` page for more information on the DREIDING force field. .. note:: @@ -170,11 +170,11 @@ A single hydrogen atom type K can be specified, or a wild-card asterisk can be used in place of or in conjunction with the K arguments to select multiple types as hydrogen atoms. This takes the form "\*" or "\*n" or "n\*" or "m\*n". See the :doc:`pair_coeff ` -command doc page for details. +command page for details. -If the donor flag is *i*\ , then the atom of type I in the pair_coeff +If the donor flag is *i*, then the atom of type I in the pair_coeff command is treated as the donor, and J is the acceptor. If the donor -flag is *j*\ , then the atom of type J in the pair_coeff command is +flag is *j*, then the atom of type J in the pair_coeff command is treated as the donor and I is the donor. This option is required because the :doc:`pair_coeff ` command requires that I <= J. @@ -219,7 +219,7 @@ re-specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. These pair styles tally a count of how many hydrogen bonding interactions they calculate each timestep and the hbond energy. These diff --git a/doc/src/pair_hdnnp.rst b/doc/src/pair_hdnnp.rst index ff1739aa9a..1bd3030bf5 100644 --- a/doc/src/pair_hdnnp.rst +++ b/doc/src/pair_hdnnp.rst @@ -182,7 +182,7 @@ Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. This style can only be used via the *pair* keyword of the :doc:`run_style respa -` command. It does not support the *inner*\ , *middle*\ , *outer* +` command. It does not support the *inner*, *middle*, *outer* keywords. Restrictions diff --git a/doc/src/pair_hybrid.rst b/doc/src/pair_hybrid.rst index b9b51e04c0..972c30c36f 100644 --- a/doc/src/pair_hybrid.rst +++ b/doc/src/pair_hybrid.rst @@ -83,7 +83,7 @@ general any combination of pair potentials can be used together in to produce an interaction that is not encoded in any single pair_style file, e.g. adding Coulombic forces between granular particles. -If the *hybrid/scaled* style is used instead of *hybrid/overlay*\ , +If the *hybrid/scaled* style is used instead of *hybrid/overlay*, contributions from sub-styles are weighted by their scale factors, which may be fractional or even negative. Furthermore the scale factors may be variables that may change during a simulation. This enables @@ -288,7 +288,7 @@ command can be used to selectively turn off processing of the compute tally styles, for example, if those pair styles (e.g. many-body styles) do not support this feature. -See the :doc:`pair_modify ` doc page for details on +See the :doc:`pair_modify ` page for details on the specific syntax, requirements and restrictions. ---------- @@ -375,7 +375,7 @@ coefficients to 0.0. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -391,13 +391,13 @@ exist. Otherwise the non-accelerated version will be used. The individual accelerated sub-styles are part of the GPU, KOKKOS, INTEL, OPENMP, and OPT packages, respectively. They are only enabled if LAMMPS was built with those packages. See the :doc:`Build -package ` doc page for more info. +package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -422,7 +422,7 @@ generated, even if the sub-styles support mixing, and I,J pair coefficients must be explicitly defined. See the :doc:`pair_modify ` command for -details of mixing rules. See the See the doc page for the sub-style to +details of mixing rules. See the See the page for the sub-style to see if allows for mixing. The hybrid pair styles supports the :doc:`pair_modify ` @@ -439,7 +439,7 @@ style *hybrid/scaled* also the names of any variables used as scale factors are restored, but not the variables themselves, so those may need to be redefined when continuing from a restart. -These pair styles support the use of the *inner*\ , *middle*\ , and +These pair styles support the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, if their sub-styles do. diff --git a/doc/src/pair_ilp_graphene_hbn.rst b/doc/src/pair_ilp_graphene_hbn.rst index 63357dc926..c188b4011e 100644 --- a/doc/src/pair_ilp_graphene_hbn.rst +++ b/doc/src/pair_ilp_graphene_hbn.rst @@ -77,7 +77,7 @@ calculating the normals. The parameter file (e.g. BNCH.ILP), is intended for use with *metal* :doc:`units `, with energies in meV. Two additional parameters, -*S*\ , and *rcut* are included in the parameter file. *S* is designed to +*S*, and *rcut* are included in the parameter file. *S* is designed to facilitate scaling of energies. *rcut* is designed to build the neighbor list for calculating the normals for each atom pair. @@ -141,7 +141,7 @@ Restrictions This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair style requires the newton setting to be *on* for pair interactions. diff --git a/doc/src/pair_kim.rst b/doc/src/pair_kim.rst index 551a0bc46e..fcc86e0d77 100644 --- a/doc/src/pair_kim.rst +++ b/doc/src/pair_kim.rst @@ -99,7 +99,7 @@ an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_kolmogorov_crespi_full.rst b/doc/src/pair_kolmogorov_crespi_full.rst index 9408148e72..1a33a3f4bb 100644 --- a/doc/src/pair_kolmogorov_crespi_full.rst +++ b/doc/src/pair_kolmogorov_crespi_full.rst @@ -64,7 +64,7 @@ can be found in pair style :doc:`ilp/graphene/hbn `. thus a data file with the "full" atom style is required to use this potential. The parameter file (e.g. CH.KC), is intended for use with *metal* -:doc:`units `, with energies in meV. Two additional parameters, *S*\ , +:doc:`units `, with energies in meV. Two additional parameters, *S*, and *rcut* are included in the parameter file. *S* is designed to facilitate scaling of energies. *rcut* is designed to build the neighbor list for calculating the normals for each atom pair. @@ -121,7 +121,7 @@ Restrictions This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair style requires the newton setting to be *on* for pair interactions. diff --git a/doc/src/pair_kolmogorov_crespi_z.rst b/doc/src/pair_kolmogorov_crespi_z.rst index 60c012c47c..937d868b55 100644 --- a/doc/src/pair_kolmogorov_crespi_z.rst +++ b/doc/src/pair_kolmogorov_crespi_z.rst @@ -48,7 +48,7 @@ each layer should have a separate atom type and interactions should only be computed between atom types of neighboring layers. The parameter file (e.g. CC.KC), is intended for use with metal -:doc:`units `, with energies in meV. An additional parameter, *S*\ , +:doc:`units `, with energies in meV. An additional parameter, *S*, is available to facilitate scaling of energies in accordance with :ref:`(vanWijk) `. @@ -60,7 +60,7 @@ Restrictions This fix is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lcbop.rst b/doc/src/pair_lcbop.rst index c44ad1f8a4..e8a6ccd7a4 100644 --- a/doc/src/pair_lcbop.rst +++ b/doc/src/pair_lcbop.rst @@ -34,7 +34,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of LCBOP elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, if your LAMMPS simulation has 4 atom types and you want @@ -70,14 +70,14 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the MANYBODY package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. This pair potential requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_lebedeva_z.rst b/doc/src/pair_lebedeva_z.rst index 369828784c..5afd0da92c 100644 --- a/doc/src/pair_lebedeva_z.rst +++ b/doc/src/pair_lebedeva_z.rst @@ -44,7 +44,7 @@ that the exponential part of :math:`V_{ij}` (first term) decays sufficiently fas This shift is achieved by the last term in the equation for :math:`V_{ij}` above. The parameter file (e.g. CC.Lebedeva), is intended for use with metal -:doc:`units `, with energies in meV. An additional parameter, *S*\ , +:doc:`units `, with energies in meV. An additional parameter, *S*, is available to facilitate scaling of energies. This potential must be used in combination with hybrid/overlay. @@ -55,7 +55,7 @@ Restrictions This pair style is part of the INTERLAYER package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_line_lj.rst b/doc/src/pair_line_lj.rst index c803d327e2..bfea7d172a 100644 --- a/doc/src/pair_line_lj.rst +++ b/doc/src/pair_line_lj.rst @@ -32,7 +32,7 @@ spherical particles, are calculated as the pairwise sum of N1\*N2 Lennard-Jones interactions. Interactions between a line segment with N spherical particles and a point particle are treated as the pairwise sum of N Lennard-Jones interactions. See the :doc:`pair_style lj/cut -` doc page for the definition of Lennard-Jones interactions. +` page for the definition of Lennard-Jones interactions. The set of non-overlapping spherical sub-particles that represent a line segment are generated in the following manner. Their size is a @@ -76,7 +76,7 @@ the pair of particles to be included in the neighbor list. setting that is consistent with the length of the line segments you are using and the sub-particle cutoff settings. -For style *line/lj*\ , the following coefficients must be defined for +For style *line/lj*, the following coefficients must be defined for each pair of atom types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the :doc:`read_data ` or :doc:`read_restart ` @@ -126,7 +126,7 @@ This pair style does not write its information to :doc:`binary restart files ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -134,7 +134,7 @@ Restrictions """""""""""" This style is part of the ASPHERE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Defining particles to be line segments so they participate in line/line or line/particle interactions requires the use the diff --git a/doc/src/pair_list.rst b/doc/src/pair_list.rst index ea0ac282da..321bf61be9 100644 --- a/doc/src/pair_list.rst +++ b/doc/src/pair_list.rst @@ -125,7 +125,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -143,7 +143,7 @@ atom J (assuming the images are within the cutoff distance), but only with the nearest image. This style is part of the MISC package. It is only enabled if -LAMMPS is build with that package. See the :doc:`Build package ` doc page on for more info. +LAMMPS is build with that package. See the :doc:`Build package ` page on for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj.rst b/doc/src/pair_lj.rst index c42f3ffbb8..939756e550 100644 --- a/doc/src/pair_lj.rst +++ b/doc/src/pair_lj.rst @@ -72,7 +72,7 @@ LJ cutoff specified in the pair_style command are used. ---------- -A version of these styles with a soft core, *lj/cut/soft*\ , suitable +A version of these styles with a soft core, *lj/cut/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. @@ -104,7 +104,7 @@ All of the *lj/cut* pair styles write their information to :doc:`binary restart not need to be specified in an input script that reads a restart file. The *lj/cut* pair styles support the use of the -*inner*\ , *middle*\ , and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be +*inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. The other styles only support the *pair* keyword of run_style respa. See the :doc:`run_style ` command for details. diff --git a/doc/src/pair_lj96.rst b/doc/src/pair_lj96.rst index 3f1172618b..47000fe70a 100644 --- a/doc/src/pair_lj96.rst +++ b/doc/src/pair_lj96.rst @@ -79,7 +79,7 @@ pressure of the pair interaction. This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style supports the use of the *inner*\ , *middle*\ , and *outer* +This pair style supports the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. See the :doc:`run_style ` command for @@ -89,7 +89,10 @@ details. Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_cubic.rst b/doc/src/pair_lj_cubic.rst index e220e6e67c..d6470b26be 100644 --- a/doc/src/pair_lj_cubic.rst +++ b/doc/src/pair_lj_cubic.rst @@ -98,13 +98,16 @@ not need to be specified in an input script that reads a restart file. The lj/cubic pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not -support the *inner*\ , *middle*\ , *outer* keywords. +support the *inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" - none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_cut_coul.rst b/doc/src/pair_lj_cut_coul.rst index 30ea469071..e04da852dd 100644 --- a/doc/src/pair_lj_cut_coul.rst +++ b/doc/src/pair_lj_cut_coul.rst @@ -244,7 +244,7 @@ the pair_style command. ---------- A version of these styles with a soft core, *lj/cut/coul/soft*\ and -*lj/cut/coul/long/soft*\ , suitable for use in free energy calculations, is +*lj/cut/coul/long/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. ---------- @@ -278,7 +278,7 @@ All of the *lj/cut* pair styles write their information to :doc:`binary restart not need to be specified in an input script that reads a restart file. The *lj/cut/coul/long* pair styles support the use of the -*inner*\ , *middle*\ , and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be +*inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. The other styles only support the *pair* keyword of run_style respa. See the :doc:`run_style ` command for details. @@ -288,9 +288,13 @@ See the :doc:`run_style ` command for details. Restrictions """""""""""" -The *lj/cut/coul/long* styles are part of the KSPACE package. -These styles are only enabled if LAMMPS was built with those -packages. See the :doc:`Build package ` doc page for +The *lj/cut/coul/long* and *lj/cut/coul/msm* styles are part of the KSPACE package. + +The *lj/cut/coul/debye*, *lj/cut/coul/dsf*, and *lj/cut/coul/wolf* styles are part +of the EXTRA-PAIR package. + +These styles are only enabled if LAMMPS was built with those respective +packages. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_lj_cut_tip4p.rst b/doc/src/pair_lj_cut_tip4p.rst index 273483c941..7198b60159 100644 --- a/doc/src/pair_lj_cut_tip4p.rst +++ b/doc/src/pair_lj_cut_tip4p.rst @@ -109,7 +109,7 @@ long-range Coulombic solver (Ewald or PPPM). atom. For example, if the atom ID of an O atom in a TIP4P water molecule is 500, then its 2 H atoms must have IDs 501 and 502. -See the :doc:`Howto tip4p ` doc page for more information +See the :doc:`Howto tip4p ` page for more information on how to use the TIP4P pair styles and lists of parameters to set. Note that the neighbor list cutoff for Coulomb interactions is effectively extended by a distance 2\*qdist when using the TIP4P pair @@ -163,7 +163,7 @@ the pair_style command. ---------- -A version of these styles with a soft core, *lj/cut/tip4p/long/soft*\ , suitable +A version of these styles with a soft core, *lj/cut/tip4p/long/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. @@ -199,7 +199,7 @@ All of the *lj/cut* pair styles write their information to :doc:`binary restart not need to be specified in an input script that reads a restart file. The *lj/cut* and *lj/cut/coul/long* pair styles support the use of the -*inner*\ , *middle*\ , and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be +*inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. The other styles only support the *pair* keyword of run_style respa. See the :doc:`run_style ` command for details. @@ -212,7 +212,7 @@ Restrictions The *lj/cut/tip4p/long* styles are part of the KSPACE package. The *lj/cut/tip4p/cut* style is part of the MOLECULE package. These styles are only enabled if LAMMPS was built with those -packages. See the :doc:`Build package ` doc page for +packages. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_lj_expand.rst b/doc/src/pair_lj_expand.rst index 4d619a67e2..dca7a2dd2f 100644 --- a/doc/src/pair_lj_expand.rst +++ b/doc/src/pair_lj_expand.rst @@ -108,7 +108,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_lj_long.rst b/doc/src/pair_lj_long.rst index f190d7b502..f7bdf49189 100644 --- a/doc/src/pair_lj_long.rst +++ b/doc/src/pair_lj_long.rst @@ -113,7 +113,7 @@ massless charge site are specified as pair_style arguments. atom. For example, if the atom ID of an O atom in a TIP4P water molecule is 500, then its 2 H atoms must have IDs 501 and 502. -See the :doc:`Howto tip4p ` doc page for more +See the :doc:`Howto tip4p ` page for more information on how to use the TIP4P pair style. Note that the neighbor list cutoff for Coulomb interactions is effectively extended by a distance 2\*qdist when using the TIP4P pair style, to account for @@ -123,22 +123,22 @@ LJ cutoff >= Coulombic cutoff + 2\*qdist, to shrink the size of the neighbor list. This leads to slightly larger cost for the long-range calculation, so you can test the trade-off for your model. -If *flag_lj* is set to *long*\ , no cutoff is used on the LJ 1/r\^6 +If *flag_lj* is set to *long*, no cutoff is used on the LJ 1/r\^6 dispersion term. The long-range portion can be calculated by using the :doc:`kspace_style ewald/disp or pppm/disp ` commands. The specified LJ cutoff then determines which portion of the LJ interactions are computed directly by the pair potential versus which part is computed in reciprocal space via the Kspace style. If -*flag_lj* is set to *cut*\ , the LJ interactions are simply cutoff, as +*flag_lj* is set to *cut*, the LJ interactions are simply cutoff, as with :doc:`pair_style lj/cut `. -If *flag_coul* is set to *long*\ , no cutoff is used on the Coulombic +If *flag_coul* is set to *long*, no cutoff is used on the Coulombic interactions. The long-range portion can calculated by using any of several :doc:`kspace_style ` command options such as *pppm* or *ewald*\ . Note that if *flag_lj* is also set to long, then the *ewald/disp* or *pppm/disp* Kspace style needs to be used to perform the long-range calculations for both the LJ and Coulombic -interactions. If *flag_coul* is set to *off*\ , Coulombic interactions +interactions. If *flag_coul* is set to *off*, Coulombic interactions are not computed. The following coefficients must be defined for each pair of atoms @@ -163,10 +163,10 @@ and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the LJ and Coulombic cutoffs for this type pair. -Note that if you are using *flag_lj* set to *long*\ , you +Note that if you are using *flag_lj* set to *long*, you cannot specify a LJ cutoff for an atom type pair, since only one global LJ cutoff is allowed. Similarly, if you are using *flag_coul* -set to *long*\ , you cannot specify a Coulombic cutoff for an atom type +set to *long*, you cannot specify a Coulombic cutoff for an atom type pair, since only one global Coulombic cutoff is allowed. For *lj/long/tip4p/long* only the LJ cutoff can be specified @@ -176,10 +176,10 @@ specified in the pair_style command. ---------- -A version of these styles with a soft core, *lj/cut/soft*\ , suitable for use in +A version of these styles with a soft core, *lj/cut/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. The version with soft core is -only available if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only available if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. ---------- @@ -210,8 +210,8 @@ Lennard-Jones portion of the energy and pressure. These pair styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -The pair lj/long/coul/long styles support the use of the *inner*\ , -*middle*\ , and *outer* keywords of the :doc:`run_style respa ` +The pair lj/long/coul/long styles support the use of the *inner*, +*middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. See the :doc:`run_style ` command for details. @@ -222,7 +222,7 @@ Restrictions """""""""""" These styles are part of the KSPACE package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_relres.rst b/doc/src/pair_lj_relres.rst index 20a705d876..df5227ebbb 100644 --- a/doc/src/pair_lj_relres.rst +++ b/doc/src/pair_lj_relres.rst @@ -235,7 +235,7 @@ For atom type pairs :math:`I,\:J` with :math:`I\;!=J`, the :math:`\sigma^{CG}`, :math:`r_{si}`, :math:`r_{so}`, :math:`r_{ci}`, and :math:`r_{co}` parameters for this pair style can be mixed, if not defined explicitly. All parameters are mixed according to the -pair_modify mix option. The default mix value is *geometric*\ , +pair_modify mix option. The default mix value is *geometric*, and it is recommended to use with this *lj/relres* style. See the "pair_modify" command for details. @@ -259,13 +259,16 @@ specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_smooth.rst b/doc/src/pair_lj_smooth.rst index a77eefd023..4799ca3277 100644 --- a/doc/src/pair_lj_smooth.rst +++ b/doc/src/pair_lj_smooth.rst @@ -102,13 +102,16 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_smooth_linear.rst b/doc/src/pair_lj_smooth_linear.rst index b105fc4911..7a3ba7a3d5 100644 --- a/doc/src/pair_lj_smooth_linear.rst +++ b/doc/src/pair_lj_smooth_linear.rst @@ -82,13 +82,16 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" - none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lj_switch3_coulgauss_long.rst b/doc/src/pair_lj_switch3_coulgauss_long.rst index 631addeb57..19ca8df973 100644 --- a/doc/src/pair_lj_switch3_coulgauss_long.rst +++ b/doc/src/pair_lj_switch3_coulgauss_long.rst @@ -130,14 +130,14 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" These styles are part of the YAFF package. They are only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_local_density.rst b/doc/src/pair_local_density.rst index c2bae5ced9..f7e26389c3 100644 --- a/doc/src/pair_local_density.rst +++ b/doc/src/pair_local_density.rst @@ -114,8 +114,8 @@ with the LD expressed as \rho_i = \sum_{j \neq i} b_\beta \varphi(r_{ij}) -where :math:`\alpha` gives the type of atom *i*\ , :math:`\beta` the -type of atom *j*\ , and the coefficients *a* and *b* filter for atom +where :math:`\alpha` gives the type of atom *i*, :math:`\beta` the +type of atom *j*, and the coefficients *a* and *b* filter for atom types as specified by the user. *a* is called the central atom filter as it determines to which atoms the potential applies; :math:`a_{\alpha} = 1` if the LD potential applies to atom type :math:`\alpha` else zero. On the @@ -222,7 +222,7 @@ Restrictions The local/density pair style is a part of the MANYBODY package. It is only enabled if LAMMPS was built with that package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_lubricate.rst b/doc/src/pair_lubricate.rst index e83a16c80b..49872c31f2 100644 --- a/doc/src/pair_lubricate.rst +++ b/doc/src/pair_lubricate.rst @@ -139,8 +139,8 @@ Since lubrication forces are dissipative, it is usually desirable to thermostat the system at a constant temperature. If Brownian motion (at a constant temperature) is desired, it can be set using the :doc:`pair_style brownian ` command. These pair styles -and the brownian style should use consistent parameters for *mu*\ , -*flaglog*\ , *flagfld*\ , *cutinner*\ , *cutoff*\ , *flagHI* and *flagVF*\ . +and the brownian style should use consistent parameters for *mu*, +*flaglog*, *flagfld*, *cutinner*, *cutoff*, *flagHI* and *flagVF*\ . ---------- @@ -185,7 +185,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -193,7 +193,7 @@ Restrictions """""""""""" These styles are part of the COLLOID package. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Only spherical monodisperse particles are allowed for pair_style lubricate. diff --git a/doc/src/pair_lubricateU.rst b/doc/src/pair_lubricateU.rst index a9382556c5..2706291da1 100644 --- a/doc/src/pair_lubricateU.rst +++ b/doc/src/pair_lubricateU.rst @@ -137,15 +137,15 @@ for with the following types of walls: :doc:`wall/lj93 `, volume fraction will be used when walls do not coincide with the box boundary, as well as when walls move and thereby cause a change in the volume fraction. To use these wall styles with pair_style *lubricateU* -or *lubricateU/poly*\ , the *fld yes* option must be specified in the +or *lubricateU/poly*, the *fld yes* option must be specified in the fix wall command. Since lubrication forces are dissipative, it is usually desirable to thermostat the system at a constant temperature. If Brownian motion (at a constant temperature) is desired, it can be set using the :doc:`pair_style brownian ` command. These pair styles -and the brownian style should use consistent parameters for *mu*\ , -*flaglog*\ , *flagfld*\ , *cutinner*\ , *cutoff*\ , *flagHI* and *flagVF*\ . +and the brownian style should use consistent parameters for *mu*, +*flaglog*, *flagfld*, *cutinner*, *cutoff*, *flagHI* and *flagVF*\ . ---------- @@ -186,7 +186,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -194,7 +194,7 @@ Restrictions """""""""""" These styles are part of the COLLOID package. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Currently, these pair styles assume that all other types of forces/torques on the particles have been already been computed when diff --git a/doc/src/pair_mdf.rst b/doc/src/pair_mdf.rst index 1e4ad1f8d6..dc2667dba7 100644 --- a/doc/src/pair_mdf.rst +++ b/doc/src/pair_mdf.rst @@ -53,7 +53,7 @@ Examples Description """"""""""" -The *lj/mdf*\ , *buck/mdf* and *lennard/mdf* compute the standard 12-6 +The *lj/mdf*, *buck/mdf* and *lennard/mdf* compute the standard 12-6 Lennard-Jones and Buckingham potential with the addition of a taper function that ramps the energy and force smoothly to zero between an inner and outer cutoff. @@ -62,7 +62,7 @@ inner and outer cutoff. E_{smooth}(r) = E(r)*f(r) -The tapering, *f(r)*\ , is done by using the Mei, Davenport, Fernando +The tapering, *f(r)*, is done by using the Mei, Davenport, Fernando function :ref:`(Mei) `. .. math:: @@ -82,7 +82,7 @@ outer cutoff radius. ---------- -For the *lj/mdf* pair_style, the potential energy, *E(r)*\ , is the +For the *lj/mdf* pair_style, the potential energy, *E(r)*, is the standard 12-6 Lennard-Jones written in the epsilon/sigma form: .. math:: @@ -104,7 +104,7 @@ described below: ---------- -For the *buck/mdf* pair_style, the potential energy, *E(r)*\ , is the +For the *buck/mdf* pair_style, the potential energy, *E(r)*, is the standard Buckingham potential with three required coefficients. The two cutoffs can be omitted and default to the corresponding global values: @@ -121,7 +121,7 @@ global values: ---------- -For the *lennard/mdf* pair_style, the potential energy, *E(r)*\ , is the +For the *lennard/mdf* pair_style, the potential energy, *E(r)*, is the standard 12-6 Lennard-Jones written in the A/B form: .. math:: @@ -158,8 +158,8 @@ tail corrections to pressure and energy. These styles write their information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*\ , -*middle*\ , *outer* keywords. +These styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the *inner*, +*middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_meam.rst b/doc/src/pair_meam.rst index c55967a756..d091496325 100644 --- a/doc/src/pair_meam.rst +++ b/doc/src/pair_meam.rst @@ -79,7 +79,7 @@ command, where N is the number of LAMMPS atom types: * MEAM parameter file * N element names = mapping of MEAM elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential files. As an example, the potentials/library.meam file has generic MEAM @@ -376,7 +376,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -385,7 +385,7 @@ Restrictions The *meam* style is provided in the MEAM package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. The maximum number of elements, that can be read from the MEAM library file, is determined at compile time. The default is 5. diff --git a/doc/src/pair_meam_spline.rst b/doc/src/pair_meam_spline.rst index e7680ddc15..9f231cb78c 100644 --- a/doc/src/pair_meam_spline.rst +++ b/doc/src/pair_meam_spline.rst @@ -50,7 +50,7 @@ the total energy E is given by where the five functions :math:`\phi, U, \rho, f,` and *g* depend on the chemistry of the atoms in the interaction. In particular, if there are -N different chemistries, there are N different *U*\ , :math:`\rho`, and +N different chemistries, there are N different *U*, :math:`\rho`, and *f* functions, while there are N(N+1)/2 different :math:`\phi` and *g* functions. The new style multicomponent MEAM potential files are indicated by the second line in the file starts with "meam/spline" @@ -81,7 +81,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of spline-based MEAM elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine the Ti.meam.spline file has values for Ti (old style). @@ -132,7 +132,7 @@ and pair_coeff commands in an input script that reads a restart file. The *meam/spline* pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -145,7 +145,7 @@ for pair interactions. This pair style does not support mapping multiple atom types to the same element. This pair style is only enabled if LAMMPS was built with the MANYBODY -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_meam_sw_spline.rst b/doc/src/pair_meam_sw_spline.rst index 79236819b9..686081e854 100644 --- a/doc/src/pair_meam_sw_spline.rst +++ b/doc/src/pair_meam_sw_spline.rst @@ -67,7 +67,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of spline-based MEAM+SW elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine the Ti.meam.sw.spline file has values for Ti. @@ -114,7 +114,7 @@ and pair_coeff commands in an input script that reads a restart file. The *meam/sw/spline* pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not -support the *inner*\ , *middle*\ , *outer* keywords. +support the *inner*, *middle*, *outer* keywords. ---------- @@ -125,7 +125,7 @@ This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. This pair style is only enabled if LAMMPS was built with the MANYBODY -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_mesocnt.rst b/doc/src/pair_mesocnt.rst index ca461aee7a..78a6680b6b 100644 --- a/doc/src/pair_mesocnt.rst +++ b/doc/src/pair_mesocnt.rst @@ -115,7 +115,7 @@ an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -123,7 +123,7 @@ Restrictions """""""""""" This style is part of the MESONT package. It is only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair potential requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_mesodpd.rst b/doc/src/pair_mesodpd.rst index 567c14f0ea..e5cd2643dd 100644 --- a/doc/src/pair_mesodpd.rst +++ b/doc/src/pair_mesodpd.rst @@ -284,13 +284,13 @@ concentration profiles of the two chemical species as Mixing, shift, table, tail correction, restart, rRESPA info """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" -The styles *edpd*\ , *mdpd*\ , *mdpd/rhosum* and *tdpd* do not support +The styles *edpd*, *mdpd*, *mdpd/rhosum* and *tdpd* do not support mixing. Thus, coefficients for all I,J pairs must be specified explicitly. -The styles *edpd*\ , *mdpd*\ , *mdpd/rhosum* and *tdpd* do not support +The styles *edpd*, *mdpd*, *mdpd/rhosum* and *tdpd* do not support the :doc:`pair_modify ` shift, table, and tail options. -The styles *edpd*\ , *mdpd*\ , *mdpd/rhosum* and *tdpd* do not write +The styles *edpd*, *mdpd*, *mdpd/rhosum* and *tdpd* do not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. @@ -298,9 +298,9 @@ that reads a restart file. Restrictions """""""""""" -The pair styles *edpd*\ , *mdpd*\ , *mdpd/rhosum* and *tdpd* are part of +The pair styles *edpd*, *mdpd*, *mdpd/rhosum* and *tdpd* are part of the DPD-MESO package. It is only enabled if LAMMPS was built with -that package. See the :doc:`Build package ` doc page for +that package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_mgpt.rst b/doc/src/pair_mgpt.rst index ea6621a3fd..6ef9f52fac 100644 --- a/doc/src/pair_mgpt.rst +++ b/doc/src/pair_mgpt.rst @@ -161,7 +161,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -169,7 +169,7 @@ Restrictions """""""""""" This pair style is part of the MGPT package and is only enabled -if LAMMPS is built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS is built with that package. See the :doc:`Build package ` page for more info. The MGPT potentials require the :doc:`newtion ` setting to be "on" for pair style interactions. diff --git a/doc/src/pair_mie.rst b/doc/src/pair_mie.rst index e1a34893c9..089f8d3d29 100644 --- a/doc/src/pair_mie.rst +++ b/doc/src/pair_mie.rst @@ -82,7 +82,7 @@ pressure of the pair interaction. This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style supports the use of the *inner*\ , *middle*\ , and *outer* +This pair style supports the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command, meaning the pairwise forces can be partitioned by distance at different levels of the rRESPA hierarchy. See the :doc:`run_style ` command for @@ -92,7 +92,10 @@ details. Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_mliap.rst b/doc/src/pair_mliap.rst index 199f23e1b2..900a2c2e6a 100644 --- a/doc/src/pair_mliap.rst +++ b/doc/src/pair_mliap.rst @@ -156,7 +156,7 @@ contains a few more arguments (e.g., *nmax* and *alpha*). The preparation of SO3 descriptor and model files can be done with the `Pyxtal_FF `_ package. -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for these *model* and *descriptor* files. .. note:: @@ -185,7 +185,7 @@ that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -196,7 +196,7 @@ This pair style is part of the ML-IAP package. It is only enabled if LAMMPS was built with that package. In addition, building LAMMPS with the ML-IAP package requires building LAMMPS with the ML-SNAP package. The *mliappy* model requires building LAMMPS with the PYTHON package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_modify.rst b/doc/src/pair_modify.rst index 9c021e60a4..1a62a4c1a0 100644 --- a/doc/src/pair_modify.rst +++ b/doc/src/pair_modify.rst @@ -82,7 +82,7 @@ as sigma. Note that not all pair styles support mixing and some mix options are not available for certain pair styles. Also, there are additional restrictions when using :doc:`pair style hybrid or hybrid/overlay `. -See the doc page for individual pair styles for those restrictions. Note also that the +See the page for individual pair styles for those restrictions. Note also that the :doc:`pair_coeff ` command also can be used to directly set coefficients for a specific I != J pairing, in which case no mixing is performed. @@ -117,7 +117,7 @@ option. The *table* and *table/disp* keywords apply to pair styles with a long-range Coulombic term or long-range dispersion term respectively; -see the doc page for individual styles to see which potentials support +see the page for individual styles to see which potentials support these options. If N is non-zero, a table of length 2\^N is pre-computed for forces and energies, which can shrink their computational cost by up to a factor of 2. The table is indexed via a @@ -149,11 +149,11 @@ pairwise interactions are computed via table lookup for simulations with "real" units, but some close pairs may be computed directly (non-table) for simulations with "lj" units. -When the *tail* keyword is set to *yes*\ , certain pair styles will +When the *tail* keyword is set to *yes*, certain pair styles will add a long-range VanderWaals tail "correction" to the energy and pressure. These corrections are bookkeeping terms which do not affect dynamics, unless a constant-pressure simulation is being performed. -See the doc page for individual styles to see which support this +See the page for individual styles to see which support this option. These corrections are included in the calculation and printing of thermodynamic quantities (see the :doc:`thermo_style ` command). Their effect will also be included in diff --git a/doc/src/pair_momb.rst b/doc/src/pair_momb.rst index 71dfe84087..982ef86603 100644 --- a/doc/src/pair_momb.rst +++ b/doc/src/pair_momb.rst @@ -57,7 +57,7 @@ Restrictions This style is part of the EXTRA-PAIR package. It is only enabled if LAMMPS is built with that package. See the :doc:`Build package -` doc page on for more info. +` page on for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_morse.rst b/doc/src/pair_morse.rst index b977c58eaa..686dd6e511 100644 --- a/doc/src/pair_morse.rst +++ b/doc/src/pair_morse.rst @@ -85,12 +85,12 @@ the *morse* and *morse/smooth/linear* styles. ---------- -A version of the *morse* style with a soft core, *morse/soft*\ , +A version of the *morse* style with a soft core, *morse/soft*, suitable for use in free energy calculations, is part of the FEP package and is documented with the :doc:`pair_style */soft ` styles. The version with soft core is only available if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. ---------- @@ -119,7 +119,7 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -128,7 +128,7 @@ Restrictions The *morse/smooth/linear* pair style is only enabled if LAMMPS was built with the EXTRA-PAIR package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_multi_lucy.rst b/doc/src/pair_multi_lucy.rst index 8f65d8f438..c8c8551df5 100644 --- a/doc/src/pair_multi_lucy.rst +++ b/doc/src/pair_multi_lucy.rst @@ -11,7 +11,7 @@ Syntax pair_style multi/lucy style N keyword ... * style = *lookup* or *linear* = method of interpolation -* N = use N values in *lookup*\ , *linear* tables +* N = use N values in *lookup*, *linear* tables Examples """""""" @@ -186,7 +186,7 @@ commands do need to be specified in the restart input script. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -194,7 +194,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_multi_lucy_rx.rst b/doc/src/pair_multi_lucy_rx.rst index b39bd02b6d..6cb56360ba 100644 --- a/doc/src/pair_multi_lucy_rx.rst +++ b/doc/src/pair_multi_lucy_rx.rst @@ -14,7 +14,7 @@ Syntax pair_style multi/lucy/rx style N keyword ... * style = *lookup* or *linear* = method of interpolation -* N = use N values in *lookup*\ , *linear* tables +* N = use N values in *lookup*, *linear* tables * weighting = fractional or molecular (optional) Examples @@ -214,7 +214,7 @@ commands do need to be specified in the restart input script. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -226,7 +226,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_nb3b_harmonic.rst b/doc/src/pair_nb3b_harmonic.rst index 853da9d821..203c707ec0 100644 --- a/doc/src/pair_nb3b_harmonic.rst +++ b/doc/src/pair_nb3b_harmonic.rst @@ -30,7 +30,7 @@ energy E of a system of atoms as where :math:`\theta_0` is the equilibrium value of the angle and *K* is a prefactor. Note that the usual 1/2 factor is included in *K*\ . The form -of the potential is identical to that used in angle_style *harmonic*\ , +of the potential is identical to that used in angle_style *harmonic*, but in this case, the atoms do not need to be explicitly bonded. Only a single pair_coeff command is used with this style which @@ -42,7 +42,7 @@ number of LAMMPS atom types: * filename * N element names = mapping of elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine a file SiC.nb3b.harmonic has potential values @@ -100,7 +100,7 @@ Restrictions """""""""""" This pair style can only be used if LAMMPS was built with the MANYBODY -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Related commands diff --git a/doc/src/pair_nm.rst b/doc/src/pair_nm.rst index d38e21fd15..2c356bb4ca 100644 --- a/doc/src/pair_nm.rst +++ b/doc/src/pair_nm.rst @@ -114,7 +114,7 @@ N-M and Coulombic cutoffs specified in the pair_style command are used. If only one cutoff is specified, it is used as the cutoff for both N-M and Coulombic interactions for this type pair. If both coefficients are specified, they are used as the N-M and Coulombic cutoffs for this -type pair. You cannot specify 2 cutoffs for style *nm*\ , since it +type pair. You cannot specify 2 cutoffs for style *nm*, since it has no Coulombic terms. For *nm/cut/coul/long* only the N-M cutoff can be specified since a @@ -147,7 +147,7 @@ to be specified in an input script that reads a restart file. All of the *nm* pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -156,8 +156,9 @@ the :doc:`run_style respa ` command. They do not support the Restrictions """""""""""" -These pair styles are part of the MISC package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +These pair styles are part of the EXTRA-PAIR package. They are only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_none.rst b/doc/src/pair_none.rst index b2f27c355e..3dc87a7815 100644 --- a/doc/src/pair_none.rst +++ b/doc/src/pair_none.rst @@ -30,7 +30,7 @@ skin distance is large enough to acquire atoms needed for computing bonds, angles, etc. A pair style of *none* will also prevent pairwise neighbor lists from -being built. However if the :doc:`neighbor ` style is *bin*\ , +being built. However if the :doc:`neighbor ` style is *bin*, data structures for binning are still allocated. If the neighbor skin distance is small, then these data structures can consume a large amount of memory. So you should either set the neighbor style to diff --git a/doc/src/pair_oxdna.rst b/doc/src/pair_oxdna.rst index 38fb19a8b0..fcc7dc2e49 100644 --- a/doc/src/pair_oxdna.rst +++ b/doc/src/pair_oxdna.rst @@ -63,7 +63,7 @@ Description The *oxdna* pair styles compute the pairwise-additive parts of the oxDNA force field for coarse-grained modelling of DNA. The effective interaction between the nucleotides consists of potentials for the -excluded volume interaction *oxdna/excv*\ , the stacking *oxdna/stk*\ , cross-stacking *oxdna/xstk* +excluded volume interaction *oxdna/excv*, the stacking *oxdna/stk*, cross-stacking *oxdna/xstk* and coaxial stacking interaction *oxdna/coaxstk* as well as the hydrogen-bonding interaction *oxdna/hbond* between complementary pairs of nucleotides on opposite strands. Average sequence or sequence-dependent stacking and base-pairing strengths @@ -120,7 +120,7 @@ Restrictions These pair styles can only be used if LAMMPS was built with the CG-DNA package and the MOLECULE and ASPHERE package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_oxdna2.rst b/doc/src/pair_oxdna2.rst index 3dce3c2d1b..f253c4ae10 100644 --- a/doc/src/pair_oxdna2.rst +++ b/doc/src/pair_oxdna2.rst @@ -72,8 +72,8 @@ Description The *oxdna2* pair styles compute the pairwise-additive parts of the oxDNA force field for coarse-grained modelling of DNA. The effective interaction between the nucleotides consists of potentials for the -excluded volume interaction *oxdna2/excv*\ , the stacking *oxdna2/stk*\ , cross-stacking *oxdna2/xstk* -and coaxial stacking interaction *oxdna2/coaxstk*\ , electrostatic Debye-Hueckel interaction *oxdna2/dh* +excluded volume interaction *oxdna2/excv*, the stacking *oxdna2/stk*, cross-stacking *oxdna2/xstk* +and coaxial stacking interaction *oxdna2/coaxstk*, electrostatic Debye-Hueckel interaction *oxdna2/dh* as well as the hydrogen-bonding interaction *oxdna2/hbond* between complementary pairs of nucleotides on opposite strands. Average sequence or sequence-dependent stacking and base-pairing strengths are supported :ref:`(Sulc) `. Quasi-unique base-pairing between nucleotides can be achieved by using @@ -127,7 +127,7 @@ Restrictions These pair styles can only be used if LAMMPS was built with the CG-DNA package and the MOLECULE and ASPHERE package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_oxrna2.rst b/doc/src/pair_oxrna2.rst index 63a5c9308b..7b8220740c 100644 --- a/doc/src/pair_oxrna2.rst +++ b/doc/src/pair_oxrna2.rst @@ -73,8 +73,8 @@ Description The *oxrna2* pair styles compute the pairwise-additive parts of the oxDNA force field for coarse-grained modelling of DNA. The effective interaction between the nucleotides consists of potentials for the -excluded volume interaction *oxrna2/excv*\ , the stacking *oxrna2/stk*\ , cross-stacking *oxrna2/xstk* -and coaxial stacking interaction *oxrna2/coaxstk*\ , electrostatic Debye-Hueckel interaction *oxrna2/dh* +excluded volume interaction *oxrna2/excv*, the stacking *oxrna2/stk*, cross-stacking *oxrna2/xstk* +and coaxial stacking interaction *oxrna2/coaxstk*, electrostatic Debye-Hueckel interaction *oxrna2/dh* as well as the hydrogen-bonding interaction *oxrna2/hbond* between complementary pairs of nucleotides on opposite strands. Average sequence or sequence-dependent stacking and base-pairing strengths are supported :ref:`(Sulc2) `. Quasi-unique base-pairing between nucleotides can be achieved by using @@ -128,7 +128,7 @@ Restrictions These pair styles can only be used if LAMMPS was built with the CG-DNA package and the MOLECULE and ASPHERE package. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_pace.rst b/doc/src/pair_pace.rst index e737072e7b..ad66febdf5 100644 --- a/doc/src/pair_pace.rst +++ b/doc/src/pair_pace.rst @@ -64,7 +64,7 @@ The pair_style *pace* command may be followed by an optional keyword is used for the calculation of basis functions and derivatives. The default is *recursive*. -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the ACE coefficient file. Mixing, shift, table, tail correction, restart, rRESPA info @@ -84,7 +84,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -93,7 +93,7 @@ Restrictions This pair style is part of the ML-PACE package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_peri.rst b/doc/src/pair_peri.rst index 2a1c7f6aa5..45b406dd61 100644 --- a/doc/src/pair_peri.rst +++ b/doc/src/pair_peri.rst @@ -170,7 +170,7 @@ to be specified in an input script that reads a restart file. These pair styles can only be used via the *pair* keyword of the :doc:`run_style respa ` command. They do not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -178,7 +178,7 @@ Restrictions """""""""""" All of these styles are part of the PERI package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_polymorphic.rst b/doc/src/pair_polymorphic.rst index 3df70a017c..8968c9d7d2 100644 --- a/doc/src/pair_polymorphic.rst +++ b/doc/src/pair_polymorphic.rst @@ -195,7 +195,7 @@ atom types: * filename * N element names = mapping of polymorphic potential elements to atom types -See the pair_coeff doc page for alternate ways to specify the path for +See the pair_coeff page for alternate ways to specify the path for the potential file. Several files for polymorphic potentials are included in the potentials directory of the LAMMPS distribution. They have a "poly" suffix. @@ -317,7 +317,7 @@ atomic structure data file. This pair style is part of the MANYBODY package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair potential requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_python.rst b/doc/src/pair_python.rst index 99b8ebd766..3d087565be 100644 --- a/doc/src/pair_python.rst +++ b/doc/src/pair_python.rst @@ -184,7 +184,7 @@ always **append** to a table file, while pair style table will use the class, the table pair style will still read the old variant unless the table file is first deleted. -After switching the pair style to *table*\ , the potential tables need +After switching the pair style to *table*, the potential tables need to be assigned to the LAMMPS atom types like this: .. code-block:: LAMMPS @@ -215,7 +215,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -223,7 +223,7 @@ Restrictions """""""""""" This pair style is part of the PYTHON package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_quip.rst b/doc/src/pair_quip.rst index 5f520f3d03..c150561cb1 100644 --- a/doc/src/pair_quip.rst +++ b/doc/src/pair_quip.rst @@ -42,7 +42,7 @@ number of LAMMPS atom types: * QUIP initialization string * N atomic numbers = mapping of QUIP elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. A QUIP potential is fully specified by the filename which contains the @@ -70,13 +70,13 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the ML-QUIP package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. QUIP potentials are parameterized in electron-volts and Angstroms and therefore should be used with LAMMPS metal :doc:`units `. diff --git a/doc/src/pair_reaxff.rst b/doc/src/pair_reaxff.rst index 0389742ea5..a3a9c81cb8 100644 --- a/doc/src/pair_reaxff.rst +++ b/doc/src/pair_reaxff.rst @@ -140,7 +140,7 @@ control file. Note: Force field files are different for the original or lg corrected pair styles, using the wrong ffield file generates an error. -Using the optional keyword *enobonds* with the value *yes*\ , the energy +Using the optional keyword *enobonds* with the value *yes*, the energy of atoms with no bonds (i.e. isolated atoms) is included in the total potential energy and the per-atom energy of that atom. If the value *no* is specified then the energy of atoms with no bonds is set to @@ -148,7 +148,7 @@ zero. The latter behavior is usual not desired, as it causes discontinuities in the potential energy when the bonding of an atom drops to zero. -Optional keywords *safezone*\ , *mincap*\ , and *minhbonds* are used +Optional keywords *safezone*, *mincap*, and *minhbonds* are used for allocating reaxff arrays. Increasing these values can avoid memory problems, such as segmentation faults and bondchk failed errors, that could occur under certain conditions. These keywords are not used by @@ -327,7 +327,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -340,7 +340,7 @@ Restrictions This pair style is part of the REAXFF package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. The ReaxFF potential files provided with LAMMPS in the potentials directory are parameterized for *real* :doc:`units `. You can use diff --git a/doc/src/pair_resquared.rst b/doc/src/pair_resquared.rst index 0932730469..8d7b5eca5b 100644 --- a/doc/src/pair_resquared.rst +++ b/doc/src/pair_resquared.rst @@ -191,7 +191,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords of the :doc:`run_style command `. +*inner*, *middle*, *outer* keywords of the :doc:`run_style command `. ---------- @@ -199,7 +199,7 @@ Restrictions """""""""""" This style is part of the ASPHERE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires that atoms be ellipsoids as defined by the :doc:`atom_style ellipsoid ` command. diff --git a/doc/src/pair_sdk.rst b/doc/src/pair_sdk.rst index a89a833998..f389079e15 100644 --- a/doc/src/pair_sdk.rst +++ b/doc/src/pair_sdk.rst @@ -141,7 +141,7 @@ All of the lj/sdk pair styles write their information to :doc:`binary restart fi not need to be specified in an input script that reads a restart file. The lj/sdk and lj/cut/coul/long pair styles do not support -the use of the *inner*\ , *middle*\ , and *outer* keywords of the :doc:`run_style respa ` command. +the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command. ---------- diff --git a/doc/src/pair_sdpd_taitwater_isothermal.rst b/doc/src/pair_sdpd_taitwater_isothermal.rst index 15a4eb5374..7eaab203c9 100644 --- a/doc/src/pair_sdpd_taitwater_isothermal.rst +++ b/doc/src/pair_sdpd_taitwater_isothermal.rst @@ -91,14 +91,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the DPD-SMOOTH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_smd_hertz.rst b/doc/src/pair_smd_hertz.rst index a10edde6b0..deb3f69ec5 100644 --- a/doc/src/pair_smd_hertz.rst +++ b/doc/src/pair_smd_hertz.rst @@ -51,7 +51,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_smd_tlsph.rst b/doc/src/pair_smd_tlsph.rst index cab156167e..3884b0fec3 100644 --- a/doc/src/pair_smd_tlsph.rst +++ b/doc/src/pair_smd_tlsph.rst @@ -66,7 +66,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_smd_triangulated_surface.rst b/doc/src/pair_smd_triangulated_surface.rst index 957ff1ca19..76385ae7fb 100644 --- a/doc/src/pair_smd_triangulated_surface.rst +++ b/doc/src/pair_smd_triangulated_surface.rst @@ -52,7 +52,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_smd_ulsph.rst b/doc/src/pair_smd_ulsph.rst index c69fbf2a43..fd63908e3d 100644 --- a/doc/src/pair_smd_ulsph.rst +++ b/doc/src/pair_smd_ulsph.rst @@ -77,7 +77,7 @@ Restrictions """""""""""" This fix is part of the MACHDYN package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_smtbq.rst b/doc/src/pair_smtbq.rst index 96ccc5c4c7..50b4afaf2d 100644 --- a/doc/src/pair_smtbq.rst +++ b/doc/src/pair_smtbq.rst @@ -94,8 +94,8 @@ ffield.SMTBQ.Syst. The energy band term is given by: \delta Q_i \bigl( 2\frac{n_0}{\eta_i} - \delta Q_i \bigr) \biggr\}^{1/2} \\ \delta Q_i & = | Q_i^{F} | - | Q_i | -where :math:`\eta_i` is the stoichiometry of atom *i*\ , -:math:`\delta Q_i` is the charge delocalization of atom *i*\ , +where :math:`\eta_i` is the stoichiometry of atom *i*, +:math:`\delta Q_i` is the charge delocalization of atom *i*, compared to its formal charge :math:`Q^F_i`. :math:`n_0`, the number of hybridized orbitals, is calculated with to the atomic orbitals shared @@ -161,7 +161,7 @@ For the anion (oxygen) * Name of element (char) and stoichiometry in oxide * Formal charge and mass of element * Principal quantum number of outer orbital n), electronegativity (:math:`\chi^0_i`) and hardness (:math:`J^0_i`) -* Ionic radius parameters : max coordination number (\ *coordBB* = 6 by default), bulk coordination number *(coordB)*\ , surface coordination number *(coordS)* and *rBB, rB and rS* the slater radius for each coordination number. (**note : If you don't want to change the slater radius, use three identical radius values**) +* Ionic radius parameters : max coordination number (\ *coordBB* = 6 by default), bulk coordination number *(coordB)*, surface coordination number *(coordS)* and *rBB, rB and rS* the slater radius for each coordination number. (**note : If you don't want to change the slater radius, use three identical radius values**) * Number of orbital shared by the element in the oxide (:math:`d_i`) * Divider line @@ -169,7 +169,7 @@ For each cations (metal): * Name of element (char) and stoichiometry in oxide * Formal charge and mass of element -* Number of electron in outer orbital *(ne)*\ , electronegativity (:math:`\chi^0_i`), hardness (:math:`J^0_i`) and :math:`r_{Slater}` the slater radius for the cation. +* Number of electron in outer orbital *(ne)*, electronegativity (:math:`\chi^0_i`), hardness (:math:`J^0_i`) and :math:`r_{Slater}` the slater radius for the cation. * Number of orbitals shared by the elements in the oxide (:math:`d_i`) * Divider line @@ -244,7 +244,7 @@ For each cations (metal): :math:`N_{Energy}` time steps. If the value is 'false' then :math:`N_{Energy} = 0`. The file takes into account the possibility to have several QEq groups *g* then it writes: time step, number of atoms - in group *g*\ , electrostatic part of energy, :math:`E_{ES}`, the + in group *g*, electrostatic part of energy, :math:`E_{ES}`, the interaction between oxygen, :math:`E_{OO}`, and short range metal-oxygen interaction, :math:`E_{MO}`. * If you want to print to the file 'Electroneg_component.txt' the @@ -252,9 +252,9 @@ For each cations (metal): Q_i}`) or not: 'true' or 'false' and :math:`N_{Electroneg}`. This option writes to the file every :math:`N_{Electroneg}` time steps. If the value is 'false' then :math:`N_{Electroneg} = 0`. The file - consist of atom number *i*\ , atom type (1 for oxygen and # higher - than 1 for metal), atom position: *x*\ , *y* and *z*\ , atomic charge - of atom *i*\ , electrostatic part of atom *i* electronegativity, + consist of atom number *i*, atom type (1 for oxygen and # higher + than 1 for metal), atom position: *x*, *y* and *z*, atomic charge + of atom *i*, electrostatic part of atom *i* electronegativity, covalent part of atom *i* electronegativity, the hopping integral of atom *i* :math:`(Z\beta^2)_i` and box electronegativity. @@ -277,7 +277,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -285,7 +285,7 @@ Restrictions """""""""""" This pair style is part of the SMTBQ package and is only enabled -if LAMMPS is built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS is built with that package. See the :doc:`Build package ` page for more info. This potential requires using atom type 1 for oxygen and atom type higher than 1 for metal atoms. diff --git a/doc/src/pair_snap.rst b/doc/src/pair_snap.rst index 5638087d78..381250f57b 100644 --- a/doc/src/pair_snap.rst +++ b/doc/src/pair_snap.rst @@ -40,7 +40,7 @@ atom *i* is expressed as a weighted sum over bispectrum components. E^i_{SNAP}(B_1^i,...,B_K^i) = \beta^{\mu_i}_0 + \sum_{k=1}^K \beta_k^{\mu_i} B_k^i -where :math:`B_k^i` is the *k*\ -th bispectrum component of atom *i*\ , +where :math:`B_k^i` is the *k*\ -th bispectrum component of atom *i*, and :math:`\beta_k^{\mu_i}` is the corresponding linear coefficient that depends on :math:`\mu_i`, the SNAP element of atom *i*\ . The number of bispectrum components used and their definitions depend on the value of @@ -90,7 +90,7 @@ elements not in the pair_coeff command, except when using *chemflag* (see below). The name of the SNAP parameter file usually ends in the ".snapparam" extension. It contains a small number of parameters that define the overall form of the SNAP potential. See the :doc:`pair_coeff -` doc page for alternate ways to specify the path for these +` page for alternate ways to specify the path for these files. SNAP potentials are quite commonly combined with one or more other @@ -133,9 +133,9 @@ This line is followed by *ncoeff* coefficients, one per line. The SNAP parameter file can contain blank and comment lines (start with #) anywhere. Each non-blank non-comment line must contain one keyword/value pair. The required keywords are *rcutfac* and -*twojmax*\ . Optional keywords are *rfac0*\ , *rmin0*\ , -*switchflag*\ , *bzeroflag*\ , *quadraticflag*\ , *chemflag*\ , -*bnormflag*\ , *wselfallflag*\ , and *chunksize*\ . +*twojmax*\ . Optional keywords are *rfac0*, *rmin0*, +*switchflag*, *bzeroflag*, *quadraticflag*, *chemflag*, +*bnormflag*, *wselfallflag*, and *chunksize*\ . The default values for these keywords are @@ -225,7 +225,7 @@ that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -238,7 +238,7 @@ Restrictions This style is part of the ML-SNAP package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_soft.rst b/doc/src/pair_soft.rst index cc024cb6dd..7986b1286e 100644 --- a/doc/src/pair_soft.rst +++ b/doc/src/pair_soft.rst @@ -113,7 +113,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_sph_heatconduction.rst b/doc/src/pair_sph_heatconduction.rst index 03e9606750..4716ed54fb 100644 --- a/doc/src/pair_sph_heatconduction.rst +++ b/doc/src/pair_sph_heatconduction.rst @@ -48,14 +48,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_sph_idealgas.rst b/doc/src/pair_sph_idealgas.rst index a62db85133..02949849c4 100644 --- a/doc/src/pair_sph_idealgas.rst +++ b/doc/src/pair_sph_idealgas.rst @@ -57,14 +57,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_sph_lj.rst b/doc/src/pair_sph_lj.rst index ca25dedbbf..b5c02c41ff 100644 --- a/doc/src/pair_sph_lj.rst +++ b/doc/src/pair_sph_lj.rst @@ -52,8 +52,8 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" @@ -62,7 +62,7 @@ As noted above, the Lennard-Jones parameters epsilon and sigma are set to unity. This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_sph_rhosum.rst b/doc/src/pair_sph_rhosum.rst index 42c5c2d222..ecbff98486 100644 --- a/doc/src/pair_sph_rhosum.rst +++ b/doc/src/pair_sph_rhosum.rst @@ -49,14 +49,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_sph_taitwater.rst b/doc/src/pair_sph_taitwater.rst index 88fa65eb90..34eb65f005 100644 --- a/doc/src/pair_sph_taitwater.rst +++ b/doc/src/pair_sph_taitwater.rst @@ -61,14 +61,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_sph_taitwater_morris.rst b/doc/src/pair_sph_taitwater_morris.rst index b9c1710a3d..cd8346364b 100644 --- a/doc/src/pair_sph_taitwater_morris.rst +++ b/doc/src/pair_sph_taitwater_morris.rst @@ -60,14 +60,14 @@ shift, table, and tail options. This style does not write information to :doc:`binary restart files `. Thus, you need to re-specify the pair_style and pair_coeff commands in an input script that reads a restart file. -This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*\ , -*middle*\ , *outer* keywords. +This style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the *inner*, +*middle*, *outer* keywords. Restrictions """""""""""" This pair style is part of the SPH package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_spin_dipole.rst b/doc/src/pair_spin_dipole.rst index d1bbf3b699..c38bba03ae 100644 --- a/doc/src/pair_spin_dipole.rst +++ b/doc/src/pair_spin_dipole.rst @@ -97,7 +97,7 @@ Restrictions The *spin/dipole/cut* and *spin/dipole/long* styles are part of the SPIN package. They are only enabled if LAMMPS was built with that -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. Using dipole/spin pair styles with *electron* :doc:`units ` is not diff --git a/doc/src/pair_spin_dmi.rst b/doc/src/pair_spin_dmi.rst index eb945acc04..3d1498b769 100644 --- a/doc/src/pair_spin_dmi.rst +++ b/doc/src/pair_spin_dmi.rst @@ -81,7 +81,7 @@ Restrictions All the *pair/spin* styles are part of the SPIN package. These styles are only enabled if LAMMPS was built with this package, and if the -atom_style "spin" was declared. See the :doc:`Build package ` doc page for more info. +atom_style "spin" was declared. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_spin_exchange.rst b/doc/src/pair_spin_exchange.rst index 630ec6608e..553af72983 100644 --- a/doc/src/pair_spin_exchange.rst +++ b/doc/src/pair_spin_exchange.rst @@ -196,7 +196,7 @@ Restrictions All the *pair/spin* styles are part of the SPIN package. These styles are only enabled if LAMMPS was built with this package, and if the atom_style "spin" was declared. -See the :doc:`Build package ` doc page for more info. +See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_spin_magelec.rst b/doc/src/pair_spin_magelec.rst index 1860ed4677..b422b6a070 100644 --- a/doc/src/pair_spin_magelec.rst +++ b/doc/src/pair_spin_magelec.rst @@ -60,7 +60,7 @@ Restrictions All the *pair/spin* styles are part of the SPIN package. These styles are only enabled if LAMMPS was built with this package, and if the -atom_style "spin" was declared. See the :doc:`Build package ` doc page for more info. +atom_style "spin" was declared. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_spin_neel.rst b/doc/src/pair_spin_neel.rst index c0df74187d..e5d655f196 100644 --- a/doc/src/pair_spin_neel.rst +++ b/doc/src/pair_spin_neel.rst @@ -80,7 +80,7 @@ Restrictions All the *pair/spin* styles are part of the SPIN package. These styles are only enabled if LAMMPS was built with this package, and if the -atom_style "spin" was declared. See the :doc:`Build package ` doc page for more info. +atom_style "spin" was declared. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_srp.rst b/doc/src/pair_srp.rst index c1e8403022..ea094aa720 100644 --- a/doc/src/pair_srp.rst +++ b/doc/src/pair_srp.rst @@ -91,7 +91,7 @@ is used. .. note:: Pair style srp considers each bond of type *btype* to be a - fictitious "particle" of type *bptype*\ , where *bptype* is either the + fictitious "particle" of type *bptype*, where *bptype* is either the largest atom type in the system, or the type set by the *bptype* flag. Any actual existing particles with this atom type will be deleted at the beginning of a run. This means you must specify the number of @@ -108,7 +108,7 @@ is used. The optional *exclude* keyword determines if forces are computed between first neighbor (directly connected) bonds. For a setting of -*no*\ , first neighbor forces are computed; for *yes* they are not +*no*, first neighbor forces are computed; for *yes* they are not computed. A setting of *no* cannot be used with the *min* option for distance calculation because the minimum distance between directly connected bonds is zero. @@ -143,7 +143,7 @@ specified in the input script when reading a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index 50f49c87c9..7677cd9535 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -358,7 +358,7 @@ This command must be used before any coefficients are set by the :doc:`read_restart ` commands. Some pair styles are part of specific packages. They are only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. The doc pages for +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. The doc pages for individual pair potentials tell if it is part of a package. Related commands diff --git a/doc/src/pair_sw.rst b/doc/src/pair_sw.rst index a4b39be3c9..f207b25863 100644 --- a/doc/src/pair_sw.rst +++ b/doc/src/pair_sw.rst @@ -57,7 +57,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of SW elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine a file SiC.sw has Stillinger-Weber values for @@ -155,11 +155,11 @@ parameters used only for two-body interactions (A, B, p, and q) in entries whose second and third element are different (e.g. SiCSi) are not used for anything and can be set to 0.0 if desired. This is also true for the parameters in :math:`\phi_3` that are -taken from the ij and ik pairs (:math:`\sigma`, *a*\ , :math:`\gamma`) +taken from the ij and ik pairs (:math:`\sigma`, *a*, :math:`\gamma`) ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -168,7 +168,7 @@ produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, INTEL, KOKKOS, OPENMP and OPT packages, respectively. They are only enabled if -LAMMPS was built with those packages. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with those packages. See the :doc:`Build package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the @@ -179,7 +179,7 @@ additional 5 to 10 percent performance improvement when the Stillinger-Weber parameters p and q are set to 4 and 0 respectively. These parameters are common for modeling silicon and water. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -200,7 +200,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -208,7 +208,7 @@ Restrictions """""""""""" This pair style is part of the MANYBODY package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_table.rst b/doc/src/pair_table.rst index 39ed690551..79eb8f5b42 100644 --- a/doc/src/pair_table.rst +++ b/doc/src/pair_table.rst @@ -16,7 +16,7 @@ Syntax pair_style table style N keyword ... * style = *lookup* or *linear* or *spline* or *bitmap* = method of interpolation -* N = use N values in *lookup*\ , *linear*\ , *spline* tables +* N = use N values in *lookup*, *linear*, *spline* tables * N = use 2\^N values in *bitmap* tables * zero or more keywords may be appended * keyword = *ewald* or *pppm* or *msm* or *dispersion* or *tip4p* @@ -47,7 +47,7 @@ cubic splines to the file values and interpolating energy and force values at each of *N* distances. During a simulation, the tables are used to interpolate energy and force values as needed for each pair of particles separated by a distance *R*\ . The interpolation is done in -one of 4 styles: *lookup*\ , *linear*\ , *spline*\ , or *bitmap*\ . +one of 4 styles: *lookup*, *linear*, *spline*, or *bitmap*\ . For the *lookup* style, the distance *R* is used to find the nearest table entry, which is the energy or force. @@ -240,7 +240,7 @@ commands do need to be specified in the restart input script. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_table_rx.rst b/doc/src/pair_table_rx.rst index 1c860b90ad..094107d9ef 100644 --- a/doc/src/pair_table_rx.rst +++ b/doc/src/pair_table_rx.rst @@ -14,7 +14,7 @@ Syntax pair_style table style N ... * style = *lookup* or *linear* or *spline* or *bitmap* = method of interpolation -* N = use N values in *lookup*\ , *linear*\ , *spline* tables +* N = use N values in *lookup*, *linear*, *spline* tables * weighting = fractional or molecular (optional) Examples @@ -47,7 +47,7 @@ The interpolation tables are created by fitting cubic splines to the file values and interpolating energy and force values at each of *N* distances. During a simulation, these tables are used to interpolate energy and force values as needed. The interpolation is done in one -of 4 styles: *lookup*\ , *linear*\ , *spline*\ , or *bitmap*\ . +of 4 styles: *lookup*, *linear*, *spline*, or *bitmap*\ . For the *lookup* style, the distance between 2 atoms is used to find the nearest table entry, which is the energy or force. @@ -221,7 +221,7 @@ commands do need to be specified in the restart input script. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -233,7 +233,7 @@ Restrictions """""""""""" This command is part of the DPD-REACT package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_tersoff.rst b/doc/src/pair_tersoff.rst index 4fa77fc032..ab88806ca6 100644 --- a/doc/src/pair_tersoff.rst +++ b/doc/src/pair_tersoff.rst @@ -90,7 +90,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of Tersoff elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine the SiC.tersoff file has Tersoff values for Si @@ -288,7 +288,7 @@ that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -297,7 +297,7 @@ Restrictions This pair style is part of the MANYBODY package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_tersoff_mod.rst b/doc/src/pair_tersoff_mod.rst index e59005c2b0..8c9605d62c 100644 --- a/doc/src/pair_tersoff_mod.rst +++ b/doc/src/pair_tersoff_mod.rst @@ -189,7 +189,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -197,7 +197,7 @@ Restrictions """""""""""" This pair style is part of the MANYBODY package. It is only enabled -if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_tersoff_zbl.rst b/doc/src/pair_tersoff_zbl.rst index 345ebf3e03..276905163f 100644 --- a/doc/src/pair_tersoff_zbl.rst +++ b/doc/src/pair_tersoff_zbl.rst @@ -101,7 +101,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of Tersoff/ZBL elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine the SiC.tersoff.zbl file has Tersoff/ZBL values @@ -270,7 +270,7 @@ that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -279,7 +279,7 @@ Restrictions This pair style is part of the MANYBODY package. It is only enabled if LAMMPS was built with that package. See the :doc:`Build package -` doc page for more info. +` page for more info. This pair style requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_thole.rst b/doc/src/pair_thole.rst index 68966a3d9b..5a1e72f569 100644 --- a/doc/src/pair_thole.rst +++ b/doc/src/pair_thole.rst @@ -107,7 +107,7 @@ non-polarizable atoms are also subject to these weighting factors. The Drude particles inherit the 1-2, 1-3 and 1-4 neighbor relations from their respective cores. -For pair_style *thole*\ , the following coefficients must be defined for +For pair_style *thole*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the example above. @@ -120,7 +120,7 @@ Thole damping parameter or global cutoff specified in the pair_style command are used. In order to specify a cutoff (third argument) a damp parameter (second argument) must also be specified. -For pair style *lj/cut/thole/long*\ , the following coefficients must be +For pair style *lj/cut/thole/long*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command. @@ -156,7 +156,7 @@ Restrictions """""""""""" These pair styles are part of the DRUDE package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair_style should currently not be used with the :doc:`charmm dihedral style ` if the latter has non-zero 1-4 weighting factors. This is because the *thole* pair style does not know which diff --git a/doc/src/pair_tracker.rst b/doc/src/pair_tracker.rst index 5a85a7f048..d2cee1d879 100644 --- a/doc/src/pair_tracker.rst +++ b/doc/src/pair_tracker.rst @@ -84,7 +84,7 @@ This pair style is currently incompatible with granular pair styles that extend beyond the contact (e.g. JKR and DMT). This fix is part of the MISC package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` doc page for more info. +was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_tri_lj.rst b/doc/src/pair_tri_lj.rst index 5516f60408..d72a061bf3 100644 --- a/doc/src/pair_tri_lj.rst +++ b/doc/src/pair_tri_lj.rst @@ -66,7 +66,7 @@ using only sigma_II values, specific to the triangles's type, this means that any specified sigma_IJ values (for I != J) are effectively ignored. -For style *tri/lj*\ , the following coefficients must be defined for +For style *tri/lj*, the following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples above, or in the data file or restart files read by the :doc:`read_data ` or :doc:`read_restart ` @@ -96,7 +96,7 @@ This pair style does not write its information to :doc:`binary restart files ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -104,7 +104,7 @@ Restrictions """""""""""" This style is part of the ASPHERE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Defining particles to be triangles so they participate in tri/tri or tri/particle interactions requires the use the :doc:`atom_style tri ` command. diff --git a/doc/src/pair_ufm.rst b/doc/src/pair_ufm.rst index 140bb75ee7..22438d559b 100644 --- a/doc/src/pair_ufm.rst +++ b/doc/src/pair_ufm.rst @@ -107,13 +107,16 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/pair_vashishta.rst b/doc/src/pair_vashishta.rst index 9edb77ecbe..d38ac02a96 100644 --- a/doc/src/pair_vashishta.rst +++ b/doc/src/pair_vashishta.rst @@ -93,7 +93,7 @@ where N is the number of LAMMPS atom types: * filename * N element names = mapping of Vashishta elements to atom types -See the :doc:`pair_coeff ` doc page for alternate ways +See the :doc:`pair_coeff ` page for alternate ways to specify the path for the potential file. As an example, imagine a file SiC.vashishta has parameters for @@ -156,13 +156,13 @@ unambiguous, general, and simple to code, LAMMPS uses a slightly confusing method for specifying parameters. All parameters are divided into two classes: two-body and three-body. Two-body and three-body parameters are handled differently, as described below. -The two-body parameters are *H*\ , :math:`\eta`, :math:`\lambda_1`, -*D*\ , :math:`\lambda_4`, *W*, :math:`r_c`, :math:`\gamma`, +The two-body parameters are *H*, :math:`\eta`, :math:`\lambda_1`, +*D*, :math:`\lambda_4`, *W*, :math:`r_c`, :math:`\gamma`, and :math:`r_0`. They appear in the above formulae with two subscripts. The parameters :math:`Z_i` and :math:`Z_j` are also classified as two-body parameters, even -though they only have 1 subscript. The three-body parameters are *B*\ , -*C*\ , :math:`\cos\theta_0`. They appear in the above formulae with +though they only have 1 subscript. The three-body parameters are *B*, +*C*, :math:`\cos\theta_0`. They appear in the above formulae with three subscripts. Two-body and three-body parameters are handled differently, as described below. @@ -210,7 +210,7 @@ script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -218,7 +218,7 @@ Restrictions """""""""""" These pair styles are part of the MANYBODY package. They are only -enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. These pair styles requires the :doc:`newton ` setting to be "on" for pair interactions. diff --git a/doc/src/pair_wf_cut.rst b/doc/src/pair_wf_cut.rst index 6ae1c3e897..8f6e352665 100644 --- a/doc/src/pair_wf_cut.rst +++ b/doc/src/pair_wf_cut.rst @@ -91,7 +91,7 @@ This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style does not support the use of the *inner*\ , *middle*\ , +This pair style does not support the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command. ---------- diff --git a/doc/src/pair_write.rst b/doc/src/pair_write.rst index 340c151226..1d88137255 100644 --- a/doc/src/pair_write.rst +++ b/doc/src/pair_write.rst @@ -44,13 +44,13 @@ will refuse to add a table if the units are not the same. The energy and force values are computed at distances from inner to outer for 2 interacting atoms of type itype and jtype, using the appropriate :doc:`pair_coeff ` coefficients. If the style -is *r*\ , then N distances are used, evenly spaced in r; if the style is -*rsq*\ , N distances are used, evenly spaced in r\^2. +is *r*, then N distances are used, evenly spaced in r; if the style is +*rsq*, N distances are used, evenly spaced in r\^2. -For example, for N = 7, style = *r*\ , inner = 1.0, and outer = 4.0, +For example, for N = 7, style = *r*, inner = 1.0, and outer = 4.0, values are computed at r = 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0. -If the style is *bitmap*\ , then 2\^N values are written to the file in a +If the style is *bitmap*, then 2\^N values are written to the file in a format and order consistent with how they are read in by the :doc:`pair_coeff ` command for pair style *table*\ . For reasonable accuracy in a bitmapped table, choose N >= 12, an *inner* diff --git a/doc/src/pair_yukawa.rst b/doc/src/pair_yukawa.rst index 057adbd60f..2b832f187a 100644 --- a/doc/src/pair_yukawa.rst +++ b/doc/src/pair_yukawa.rst @@ -79,7 +79,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst index 4d21d8e8c3..6611ea04e4 100644 --- a/doc/src/pair_yukawa_colloid.rst +++ b/doc/src/pair_yukawa_colloid.rst @@ -112,7 +112,7 @@ to be specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- @@ -120,7 +120,7 @@ Restrictions """""""""""" This style is part of the COLLOID package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. This pair style requires that atoms be finite-size spheres with a diameter, as defined by the :doc:`atom_style sphere ` diff --git a/doc/src/pair_zbl.rst b/doc/src/pair_zbl.rst index e01cbf45f2..bbf9f6bc29 100644 --- a/doc/src/pair_zbl.rst +++ b/doc/src/pair_zbl.rst @@ -117,7 +117,7 @@ specified in an input script that reads a restart file. This pair style can only be used via the *pair* keyword of the :doc:`run_style respa ` command. It does not support the -*inner*\ , *middle*\ , *outer* keywords. +*inner*, *middle*, *outer* keywords. ---------- diff --git a/doc/src/pair_zero.rst b/doc/src/pair_zero.rst index 416958de1b..062b5204f8 100644 --- a/doc/src/pair_zero.rst +++ b/doc/src/pair_zero.rst @@ -72,7 +72,7 @@ shift, table, and tail options. This pair style writes its information to :doc:`binary restart files `, so pair_style and pair_coeff commands do not need to be specified in an input script that reads a restart file. -This pair style supports the use of the *inner*\ , *middle*\ , +This pair style supports the use of the *inner*, *middle*, and *outer* keywords of the :doc:`run_style respa ` command. ---------- diff --git a/doc/src/partition.rst b/doc/src/partition.rst index e63a4941bb..f05c3fa446 100644 --- a/doc/src/partition.rst +++ b/doc/src/partition.rst @@ -42,7 +42,7 @@ script operate differently on different partitions. It is basically a prefix on any LAMMPS command. The command will only be invoked on the partition(s) specified by the *style* and *N* arguments. -If the *style* is *yes*\ , the command will be invoked on any partition +If the *style* is *yes*, the command will be invoked on any partition which matches the *N* argument. If the *style* is *no* the command will be invoked on all the partitions which do not match the Np argument. diff --git a/doc/src/plugin.rst b/doc/src/plugin.rst index 02228636bc..7995ddc369 100644 --- a/doc/src/plugin.rst +++ b/doc/src/plugin.rst @@ -62,7 +62,7 @@ Restrictions The *plugin* command is part of the PLUGIN package. It is only enabled if LAMMPS was built with that package. -See the :doc:`Build package ` doc page for +See the :doc:`Build package ` page for more info. Plugins are not available on Windows. For the loading of plugins to work the LAMMPS library must be diff --git a/doc/src/prd.rst b/doc/src/prd.rst index d1acaf645e..758aa4f570 100644 --- a/doc/src/prd.rst +++ b/doc/src/prd.rst @@ -30,8 +30,8 @@ Syntax *temp* value = Tdephase Tdephase = target temperature for velocity randomization, used in dephasing *vel* values = loop dist - loop = *all* or *local* or *geom*\ , used in dephasing - dist = *uniform* or *gaussian*\ , used in dephasing + loop = *all* or *local* or *geom*, used in dephasing + dist = *uniform* or *gaussian*, used in dephasing *time* value = *steps* or *clock* *steps* = simulation runs for N timesteps on each replica (default) *clock* = simulation runs for N timesteps across all replicas @@ -72,7 +72,7 @@ reduced by a factor of Nr replicas. HD uses a single replica of the system and accelerates time by biasing the interaction potential in a manner such that each timestep is effectively longer. For both methods, per CPU second, more physical time elapses and more events -occur. See the :doc:`hyper ` doc page for more info about HD. +occur. See the :doc:`hyper ` page for more info about HD. In PRD, each replica runs on a partition of one or more processors. Processor partitions are defined at run-time using the :doc:`-partition command-line switch `. Note that if you have MPI @@ -171,8 +171,8 @@ dynamics have been performed. Note that *N* only includes the dynamics of stages 2 and 3, not the steps taken during dephasing or the minimization iterations of quenching. The specified *N* is interpreted in one of two ways, depending on the *time* keyword. If -the *time* value is *steps*\ , which is the default, then each replica -runs for *N* timesteps. If the *time* value is *clock*\ , then the +the *time* value is *steps*, which is the default, then each replica +runs for *N* timesteps. If the *time* value is *clock*, then the simulation runs until *N* aggregate timesteps across all replicas have elapsed. This aggregate time is the "clock" time defined below, which typically advances nearly M times faster than the timestepping on a diff --git a/doc/src/processors.rst b/doc/src/processors.rst index 899c87f4b0..d717fa9b73 100644 --- a/doc/src/processors.rst +++ b/doc/src/processors.rst @@ -85,7 +85,7 @@ communication costs due to the high surface area of each processor's sub-domain. Also note that if multiple partitions are being used then P is the -number of processors in this partition; see the :doc:`-partition command-line switch ` doc page for details. Also note +number of processors in this partition; see the :doc:`-partition command-line switch ` page for details. Also note that you can prefix the processors command with the :doc:`partition ` command to easily specify different Px,Py,Pz values for different partitions. @@ -140,7 +140,7 @@ For example if *Nc* is 4, then 2x2x1 or 2x1x2 or 1x2x2 sub-sections of the 3d grid will correspond to the cores of each node. This affects both the factorization and mapping steps. -The *Cx*\ , *Cy*\ , *Cz* settings are similar to the *Px*\ , *Py*\ , *Pz* +The *Cx*, *Cy*, *Cz* settings are similar to the *Px*, *Py*, *Pz* settings, only their product should equal *Nc*\ . Any of the 3 parameters can be specified with an asterisk "\*", which means LAMMPS will choose the number of cores in that dimension of the node's @@ -222,7 +222,7 @@ The *cart/reorder* style does the same thing as the *cart* style except it sets the reorder flag to 1, so that MPI can reorder processors if it desires. -The *xyz*\ , *xzy*\ , *yxz*\ , *yzx*\ , *zxy*\ , and *zyx* styles are all +The *xyz*, *xzy*, *yxz*, *yzx*, *zxy*, and *zyx* styles are all similar. If the style is IJK, then it maps the P processors to the grid so that the processor ID in the I direction varies fastest, the processor ID in the J direction varies next fastest, and the processor @@ -275,7 +275,7 @@ regular 3d grid and will use the sender's Px,Py,Pz values as a constraint. The nature of the constraint is determined by the *cstyle* argument. -For a *cstyle* of *multiple*\ , each dimension of the sender's processor +For a *cstyle* of *multiple*, each dimension of the sender's processor grid is required to be an integer multiple of the corresponding dimension in the receiver's processor grid. This is a requirement of the :doc:`run_style verlet/split ` command. diff --git a/doc/src/python.rst b/doc/src/python.rst index a4c3d7097c..aad2f636d3 100644 --- a/doc/src/python.rst +++ b/doc/src/python.rst @@ -185,12 +185,12 @@ output as a string, then the default maximum length of that string is a longer string, the *length* keyword can be specified with its *Nlen* value set to a larger number (the code allocates space for Nlen+1 to include the string terminator). If the Python function generates a -string longer than the default 63 or the specified *Nlen*\ , it will be +string longer than the default 63 or the specified *Nlen*, it will be truncated. ---------- -Either the *file*\ , *here*\ , or *exists* keyword must be used, but only +Either the *file*, *here*, or *exists* keyword must be used, but only one of them. These keywords specify what Python code to load into the Python interpreter. The *file* keyword gives the name of a file, which should end with a ".py" suffix, which contains Python code. The @@ -340,7 +340,7 @@ to the screen and log file. Note that since the LAMMPS print command itself takes a string in quotes as its argument, the Python string must be delimited with a different style of quotes. -The :doc:`Python_head` doc page describes the syntax +The :doc:`Python_head` page describes the syntax for how Python wraps the various functions included in the LAMMPS library interface. @@ -495,7 +495,7 @@ Restrictions """""""""""" This command is part of the PYTHON package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Building LAMMPS with the PYTHON package will link LAMMPS with the Python library on your system. Settings to enable this are in the diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index bd7c480af2..e0cd38416e 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -70,7 +70,7 @@ Also see the explanation of the :doc:`-restart command-line switch file. This command can be used multiple times to add new atoms and their -properties to an existing system by using the *add*\ , *offset*\ , and +properties to an existing system by using the *add*, *offset*, and *shift* keywords. See more details below, which includes the use case for the *extra* keywords. @@ -105,7 +105,7 @@ other side of the fluid. The third set of atoms could be rotated to an opposing direction using the :doc:`displace_atoms ` command, after the third read_data command is used. -The *add*\ , *offset*\ , *shift*\ , *extra*\ , and *group* keywords are +The *add*, *offset*, *shift*, *extra*, and *group* keywords are useful in this context. If a simulation box does not yet exist, the *add* keyword cannot be @@ -249,7 +249,7 @@ a fix that will be used to process a specific portion of the data file. Any header line containing *header-string* and any section with a name containing *section-string* will be passed to the specified fix. See the :doc:`fix property/atom ` command for -an example of a fix that operates in this manner. The doc page for +an example of a fix that operates in this manner. The page for the fix defines the syntax of the header line(s) and section(s) that it reads from the data file. Note that the *header-string* can be specified as NULL, in which case no header lines are passed to the @@ -332,7 +332,7 @@ example), then configurations with tilt = ..., -15, -5, 5, 15, 25, with tilt factors that exceed these limits, you can use the :doc:`box tilt ` command, with a setting of *large*\ ; a setting of *small* is the default. -See the :doc:`Howto triclinic ` doc page for a +See the :doc:`Howto triclinic ` page for a geometric description of triclinic boxes, as defined by LAMMPS, and how to transform these parameters to and from other commonly used triclinic representations. @@ -460,9 +460,9 @@ are point particles. See the discussion of ellipsoidflag and the For :doc:`atom_style template `, the molecular topology (bonds,angles,etc) is contained in the molecule templates read-in by the :doc:`molecule ` command. This means you - cannot set the *bonds*\ , *angles*\ , etc header keywords in the data - file, nor can you define *Bonds*\ , *Angles*\ , etc sections as discussed - below. You can set the *bond types*\ , *angle types*\ , etc header + cannot set the *bonds*, *angles*, etc header keywords in the data + file, nor can you define *Bonds*, *Angles*, etc sections as discussed + below. You can set the *bond types*, *angle types*, etc header keywords, though it is not necessary. If specified, they must match the maximum values defined in any of the template molecules. @@ -491,7 +491,7 @@ For example, these lines: Pair Coeffs # lj/cut will check if the currently-defined :doc:`atom_style ` is -*sphere*\ , and the current :doc:`pair_style ` is *lj/cut*\ . +*sphere*, and the current :doc:`pair_style ` is *lj/cut*\ . If not, LAMMPS will issue a warning to indicate that the data file section likely does not contain the correct number or type of parameters expected for the currently-defined style. @@ -722,8 +722,8 @@ The ellipsoidflag, lineflag, triangleflag, and bodyflag determine whether the particle is a finite-size ellipsoid or line or triangle or body of finite size, or whether the particle is a point particle. Additional attributes must be defined for each ellipsoid, line, -triangle, or body in the corresponding *Ellipsoids*\ , *Lines*\ , -*Triangles*\ , or *Bodies* section. +triangle, or body in the corresponding *Ellipsoids*, *Lines*, +*Triangles*, or *Bodies* section. The *template-index* and *template-atom* are only defined used by :doc:`atom_style template `. In this case the @@ -1051,7 +1051,7 @@ The 3 shape values specify the 3 diameters or aspect ratios of a finite-size ellipsoidal particle, when it is oriented along the 3 coordinate axes. They must all be non-zero values. -The values *quatw*\ , *quati*\ , *quatj*\ , and *quatk* set the orientation +The values *quatw*, *quati*, *quatj*, and *quatk* set the orientation of the atom as a quaternion (4-vector). Note that the shape attributes specify the aspect ratios of an ellipsoidal particle, which is oriented by default with its x-axis along the simulation box's diff --git a/doc/src/read_dump.rst b/doc/src/read_dump.rst index 5a51e9ad7a..c873156a38 100644 --- a/doc/src/read_dump.rst +++ b/doc/src/read_dump.rst @@ -17,11 +17,11 @@ Syntax .. parsed-literal:: field = *x* or *y* or *z* or *vx* or *vy* or *vz* or *q* or *ix* or *iy* or *iz* or *fx* or *fy* or *fz* - *x*\ ,\ *y*\ ,\ *z* = atom coordinates - *vx*\ ,\ *vy*\ ,\ *vz* = velocity components + *x*,\ *y*,\ *z* = atom coordinates + *vx*,\ *vy*,\ *vz* = velocity components *q* = charge - *ix*\ ,\ *iy*\ ,\ *iz* = image flags in each dimension - *fx*\ ,\ *fy*\ ,\ *fz* = force components + *ix*,\ *iy*,\ *iz* = image flags in each dimension + *fx*,\ *fy*,\ *fz* = force components * zero or more keyword/value pairs may be appended * keyword = *nfile* or *box* or *replace* or *purge* or *trim* or *add* or *label* or *scaled* or *wrapped* or *format* @@ -197,11 +197,11 @@ always work perfectly. Per-atom information from the dump file snapshot is then read from the dump file snapshot. This corresponds to the specified *fields* listed in the read_dump command. It is an error to specify a z-dimension -field, namely *z*\ , *vz*\ , or *iz*\ , for a 2d simulation. +field, namely *z*, *vz*, or *iz*, for a 2d simulation. For dump files in *native* format, each column of per-atom data has a text label listed in the file. A matching label for each field must -appear, e.g. the label "vy" for the field *vy*\ . For the *x*\ , *y*\ , *z* +appear, e.g. the label "vy" for the field *vy*\ . For the *x*, *y*, *z* fields any of the following labels are considered a match: .. parsed-literal:: @@ -217,7 +217,7 @@ file, in order, until a match is found. The dump file must also contain atom IDs, with a column label of "id". -If the *add* keyword is specified with a value of *yes* or *keep*\ , as +If the *add* keyword is specified with a value of *yes* or *keep*, as discussed below, the dump file must contain atom types, with a column label of "type". @@ -230,7 +230,7 @@ will then have a label corresponding to the fix-ID rather than "x" or "xs". The *label* keyword can also be used to specify new column labels for fields *id* and *type*\ . -For dump files in *xyz* format, only the *x*\ , *y*\ , and *z* fields are +For dump files in *xyz* format, only the *x*, *y*, and *z* fields are supported. The dump file does not store atom IDs, so these are assigned consecutively to the atoms as they appear in the dump file, starting from 1. Thus you should insure that order of atoms is @@ -238,7 +238,7 @@ consistent from snapshot to snapshot in the XYZ dump file. See the :doc:`dump_modify sort ` command if the XYZ dump file was written by LAMMPS. -For dump files in *molfile* format, the *x*\ , *y*\ , *z*\ , *vx*\ , *vy*\ , and +For dump files in *molfile* format, the *x*, *y*, *z*, *vx*, *vy*, and *vz* fields can be specified. However, not all molfile formats store velocities, or their respective plugins may not support reading of velocities. The molfile dump files do not store atom IDs, so these @@ -277,7 +277,7 @@ current simulation box is unchanged. If the *purge* keyword is specified with a *yes* value, then all current atoms in the system are deleted before any of the operations -invoked by the *replace*\ , *trim*\ , or *add* keywords take place. +invoked by the *replace*, *trim*, or *add* keywords take place. If the *replace* keyword is specified with a *yes* value, then atoms with IDs that are in both the current system and the dump snapshot @@ -330,7 +330,7 @@ atom will be lost if it is outside the simulation box. For *native* format dump files, the 3 xyz image flags for an atom in the dump file are set to the corresponding values appearing in the -dump file if the *ix*\ , *iy*\ , *iz* fields are specified. If not +dump file if the *ix*, *iy*, *iz* fields are specified. If not specified, the image flags for replaced atoms are not changed and image flags for new atoms are set to default values. If coordinates read from the dump file are in unwrapped format (e.g. *xu*\ ) then the @@ -343,13 +343,13 @@ conditions are applied to remap an atom back into the simulation box. If you get a warning about inconsistent image flags after reading in a dump snapshot, it means one or more pairs of bonded atoms - now have inconsistent image flags. As discussed on the :doc:`Errors common ` doc page this may or may not cause problems + now have inconsistent image flags. As discussed on the :doc:`Errors common ` page this may or may not cause problems for subsequent simulations. One way this can happen is if you read image flag fields from the dump file but do not also use the dump file box parameters. LAMMPS knows how to compute unscaled and remapped coordinates for the -snapshot column labels discussed above, e.g. *x*\ , *xs*\ , *xu*\ , *xsu*\ . +snapshot column labels discussed above, e.g. *x*, *xs*, *xu*, *xsu*\ . If another column label is assigned to the *x* or *y* or *z* field via the *label* keyword, e.g. for coordinates output by the :doc:`fix ave/atom ` command, then LAMMPS needs to know whether the coordinate information in the dump file is scaled and/or wrapped. @@ -359,10 +359,10 @@ the value of the *scaled* and *wrapped* keywords is ignored for fields column label to that field. The scaled/unscaled and wrapped/unwrapped setting must be identical -for any of the *x*\ , *y*\ , *z* fields that are specified. Thus you +for any of the *x*, *y*, *z* fields that are specified. Thus you cannot read *xs* and *yu* from the dump file. Also, if the dump file coordinates are scaled and the simulation box is triclinic, then all 3 -of the *x*\ , *y*\ , *z* fields must be specified, since they are all +of the *x*, *y*, *z* fields must be specified, since they are all needed to generate absolute, unscaled coordinates. ---------- @@ -378,7 +378,7 @@ doc page for details. The *molfile* dump file formats are part of the MOLFILE package. They are only enabled if LAMMPS was built with that packages. See the -:doc:`Build package ` doc page for more info. +:doc:`Build package ` page for more info. To write and read adios .bp files, you must compile LAMMPS with the :ref:`ADIOS ` package. diff --git a/doc/src/region.rst b/doc/src/region.rst index 9f2d996b20..d891a69410 100644 --- a/doc/src/region.rst +++ b/doc/src/region.rst @@ -147,24 +147,24 @@ non-zero, then xlo and xhi cannot both be INF, nor can ylo and yhi. define the region so that its intersection with the 2d x-y plane of the simulation has the 2d geometric extent you want. -For style *cone*\ , an axis-aligned cone is defined which is like a +For style *cone*, an axis-aligned cone is defined which is like a *cylinder* except that two different radii (one at each end) can be defined. Either of the radii (but not both) can be 0.0. -For style *cone* and *cylinder*\ , the c1,c2 params are coordinates in +For style *cone* and *cylinder*, the c1,c2 params are coordinates in the 2 other dimensions besides the cylinder axis dimension. For dim = x, c1/c2 = y/z; for dim = y, c1/c2 = x/z; for dim = z, c1/c2 = x/y. Thus the third example above specifies a cylinder with its axis in the y-direction located at x = 2.0 and z = 3.0, with a radius of 5.0, and extending in the y-direction from -5.0 to the upper box boundary. -For style *plane*\ , a plane is defined which contain the point +For style *plane*, a plane is defined which contain the point (px,py,pz) and has a normal vector (nx,ny,nz). The normal vector does not have to be of unit length. The "inside" of the plane is the half-space in the direction of the normal vector; see the discussion of the *side* option below. -For style *prism*\ , a parallelepiped is defined (it's too hard to spell +For style *prism*, a parallelepiped is defined (it's too hard to spell parallelepiped in an input script!). The parallelepiped has its "origin" at (xlo,ylo,zlo) and is defined by 3 edge vectors starting from the origin given by A = (xhi-xlo,0,0); B = (xy,yhi-ylo,0); C = @@ -200,7 +200,7 @@ keywords for the simulation box parameters and timestep and elapsed time. Thus it is easy to specify a time-dependent radius or have a time dependent position of the sphere or cylinder region. -See the :doc:`Howto tricilinc ` doc page for a +See the :doc:`Howto tricilinc ` page for a geometric description of triclinic boxes, as defined by LAMMPS, and how to transform these parameters to and from other commonly used triclinic representations. @@ -239,25 +239,25 @@ A *lattice* value means the distance units are in lattice spacings. The :doc:`lattice ` command must have been previously used to define the lattice spacings which are used as follows: -* For style *block*\ , the lattice spacing in dimension x is applied to +* For style *block*, the lattice spacing in dimension x is applied to xlo and xhi, similarly the spacings in dimensions y,z are applied to ylo/yhi and zlo/zhi. -* For style *cone*\ , the lattice spacing in argument *dim* is applied to +* For style *cone*, the lattice spacing in argument *dim* is applied to lo and hi. The spacings in the two radial dimensions are applied to c1 and c2. The two cone radii are scaled by the lattice spacing in the dimension corresponding to c1. -* For style *cylinder*\ , the lattice spacing in argument *dim* is applied +* For style *cylinder*, the lattice spacing in argument *dim* is applied to lo and hi. The spacings in the two radial dimensions are applied to c1 and c2. The cylinder radius is scaled by the lattice spacing in the dimension corresponding to c1. -* For style *plane*\ , the lattice spacing in dimension x is applied to +* For style *plane*, the lattice spacing in dimension x is applied to px and nx, similarly the spacings in dimensions y,z are applied to py/ny and pz/nz. -* For style *prism*\ , the lattice spacing in dimension x is applied to +* For style *prism*, the lattice spacing in dimension x is applied to xlo and xhi, similarly for ylo/yhi and zlo/zhi. The lattice spacing in dimension x is applied to xy and xz, and the spacing in dimension y to yz. -* For style *sphere*\ , the lattice spacing in dimensions x,y,z are +* For style *sphere*, the lattice spacing in dimensions x,y,z are applied to the sphere center x,y,z. The spacing in dimension x is applied to the sphere radius. @@ -311,7 +311,7 @@ angle is calculated, presumably as a function of time, by a variable specified as v_theta, where theta is the variable name. The variable should generate its result in radians. The direction of rotation for the region around the rotation axis is consistent with the right-hand -rule: if your right-hand thumb points along *R*\ , then your fingers +rule: if your right-hand thumb points along *R*, then your fingers wrap around the axis in the direction of rotation. The *move* and *rotate* keywords can be used together. In this case, @@ -341,25 +341,25 @@ sub-regions that use them. The indices specified as part of the *open* keyword have the following meanings: -For style *block*\ , indices 1-6 correspond to the xlo, xhi, ylo, yhi, +For style *block*, indices 1-6 correspond to the xlo, xhi, ylo, yhi, zlo, zhi surfaces of the block. I.e. 1 is the yz plane at x = xlo, 2 is the yz-plane at x = xhi, 3 is the xz plane at y = ylo, 4 is the xz plane at y = yhi, 5 is the xy plane at z = zlo, 6 is the xy plane at z = zhi). In the second-to-last example above, the region is a box open at both xy planes. -For style *prism*\ , values 1-6 have the same mapping as for style -*block*\ . I.e. in an untilted *prism*\ , *open* indices correspond to +For style *prism*, values 1-6 have the same mapping as for style +*block*\ . I.e. in an untilted *prism*, *open* indices correspond to the xlo, xhi, ylo, yhi, zlo, zhi surfaces. -For style *cylinder*\ , index 1 corresponds to the flat end cap at the +For style *cylinder*, index 1 corresponds to the flat end cap at the low coordinate along the cylinder axis, index 2 corresponds to the high-coordinate flat end cap along the cylinder axis, and index 3 is the curved cylinder surface. For example, a *cylinder* region with *open 1 open 2* keywords will be open at both ends (e.g. a section of pipe), regardless of the cylinder orientation. -For style *cone*\ , the mapping is the same as for style *cylinder*\ . +For style *cone*, the mapping is the same as for style *cylinder*\ . Index 1 is the low-coordinate flat end cap, index 2 is the high-coordinate flat end cap, and index 3 is the curved cone surface. In the last example above, a *cone* region is defined along the z-axis @@ -371,7 +371,7 @@ sub-regions can be defined with the *open* keyword. ---------- -Styles with a *gpu*\ , *intel*\ , *kk*\ , *omp*\ , or *opt* suffix are +Styles with a *gpu*, *intel*, *kk*, *omp*, or *opt* suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available hardware, as discussed on the :doc:`Speed packages ` doc @@ -383,13 +383,13 @@ by Kokkos or no acceleration will occur. Currently, only *block* style regions are supported by Kokkos. These accelerated styles are part of the Kokkos package. They are -only enabled if LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +only enabled if LAMMPS was built with that package. See the :doc:`Build package ` page for more info. You can specify the accelerated styles explicitly in your input script by including their suffix, or you can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- diff --git a/doc/src/rerun.rst b/doc/src/rerun.rst index e9e23afba8..21c6f68643 100644 --- a/doc/src/rerun.rst +++ b/doc/src/rerun.rst @@ -114,11 +114,11 @@ Note that the dump files specified as part of the *dump* keyword can be parallel files, i.e. written as multiple files either per processor and/or per snapshot. If that is the case they will also be read in parallel which can make the rerun command operate dramatically faster -for large systems. See the doc page for the :doc:`read_dump +for large systems. See the page for the :doc:`read_dump ` and :doc:`dump ` commands which describe how to read and write parallel dump files. -The *first*\ , *last*\ , *every*\ , *skip* keywords determine which +The *first*, *last*, *every*, *skip* keywords determine which snapshots are read from the dump file(s). Snapshots are skipped until they have a timestep >= *Nfirst*\ . When a snapshot with a timestep > *Nlast* is encountered, the rerun command finishes. Note that @@ -145,7 +145,7 @@ do for the :doc:`run ` command. They only need to be defined if (a) you are using a :doc:`fix ` command that changes some value over time, and (b) you want the reference point for elapsed time (from start to stop) to be different than the *first* and *last* settings. -See the doc page for individual fixes to see which ones can be used +See the page for individual fixes to see which ones can be used with the *start/stop* keywords. Note that if you define neither of the *start*\ /\ *stop* or *first*\ /\ *last* keywords, then LAMMPS treats the pseudo run as going from 0 to a huge value (effectively infinity). @@ -163,7 +163,7 @@ The *dump* keyword is required and must be the last keyword specified. Its arguments are passed internally to the :doc:`read_dump ` command. The first argument following the *dump* keyword should be the *field1* argument of the :doc:`read_dump ` command. See -the :doc:`read_dump ` doc page for details on the various +the :doc:`read_dump ` page for details on the various options it allows for extracting information from the dump file snapshots, and for using that information to alter the LAMMPS simulation. @@ -192,14 +192,14 @@ angle evaluations, if no pair style is being used. Every time a snapshot is read, the timestep for the simulation is reset, as if the :doc:`reset_timestep ` command were used. This command has some restrictions as to what fixes can be -defined. See its doc page for details. For example, the :doc:`fix deposit ` and :doc:`fix dt/reset ` fixes +defined. See its page for details. For example, the :doc:`fix deposit ` and :doc:`fix dt/reset ` fixes are in this category. They also make no sense to use with a rerun command. If time-averaging fixes like :doc:`fix ave/time ` are used, they are invoked on timesteps that are a function of their -*Nevery*\ , *Nrepeat*\ , and *Nfreq* settings. As an example, see the -:doc:`fix ave/time ` doc page for details. You must +*Nevery*, *Nrepeat*, and *Nfreq* settings. As an example, see the +:doc:`fix ave/time ` page for details. You must insure those settings are consistent with the snapshot timestamps that are read from the dump file(s). If an averaging fix is not invoked on a timestep it expects to be, LAMMPS will flag an error. diff --git a/doc/src/run.rst b/doc/src/run.rst index 6c47721e91..75c3bc93f0 100644 --- a/doc/src/run.rst +++ b/doc/src/run.rst @@ -45,7 +45,7 @@ Description Run or continue dynamics for a specified number of timesteps. -When the :doc:`run style ` is *respa*\ , N refers to outer +When the :doc:`run style ` is *respa*, N refers to outer loop (largest) timesteps. A value of N = 0 is acceptable; only the thermodynamics of the system @@ -64,7 +64,7 @@ completes. The *start* or *stop* keywords can be used if multiple runs are being performed and you want a :doc:`fix ` command that changes some value over time (e.g. temperature) to make the change across the -entire set of runs and not just a single run. See the doc page for +entire set of runs and not just a single run. See the page for individual fixes to see which ones can be used with the *start/stop* keywords. @@ -136,7 +136,7 @@ be useful for invoking a command you have added to LAMMPS that wraps some other code (e.g. as a library) to perform a computation periodically during a long LAMMPS run. See the :doc:`Modify ` doc page for info about how to add new commands to LAMMPS. See the -:doc:`Howto couple ` doc page for ideas about how to +:doc:`Howto couple ` page for ideas about how to couple LAMMPS to other codes. With the *every* option, N total steps are simulated, in shorter runs @@ -203,7 +203,7 @@ Restrictions When not using the *upto* keyword, the number of specified timesteps N must fit in a signed 32-bit integer, so you are limited to slightly -more than 2 billion steps (2\^31) in a single run. When using *upto*\ , +more than 2 billion steps (2\^31) in a single run. When using *upto*, N can be larger than a signed 32-bit integer, however the difference between N and the current timestep must still be no larger than 2\^31 steps. diff --git a/doc/src/run_style.rst b/doc/src/run_style.rst index 3cb5e28597..bcfa3d7b54 100644 --- a/doc/src/run_style.rst +++ b/doc/src/run_style.rst @@ -125,7 +125,7 @@ screen.0 by default; see the :doc:`-plog and -pscreen command-line switches ` doc page for performance +See the :doc:`Speed packages ` page for performance details of the speed-up offered by the *verlet/split* style. One important performance consideration is the assignment of logical processors in the 2 partitions to the physical cores of a parallel @@ -298,7 +298,7 @@ can use the :doc:`-suffix command-line switch ` when you invoke LAMMPS, or you can use the :doc:`suffix ` command in your input script. -See the :doc:`Speed packages ` doc page for more +See the :doc:`Speed packages ` page for more instructions on how to use the accelerated styles effectively. ---------- @@ -308,7 +308,7 @@ Restrictions The *verlet/split* style can only be used if LAMMPS was built with the REPLICA package. Correspondingly the *respa/omp* style is available -only if the OPENMP package was included. See the :doc:`Build package ` doc page for more info. +only if the OPENMP package was included. See the :doc:`Build package ` page for more info. Whenever using rRESPA, the user should experiment with trade-offs in speed and accuracy for their system, and verify that they are diff --git a/doc/src/server.rst b/doc/src/server.rst index f305f314c1..7423653c14 100644 --- a/doc/src/server.rst +++ b/doc/src/server.rst @@ -28,7 +28,7 @@ message back to the client. The specified *protocol* determines the format and content of messages LAMMPS expects to receive and how it responds. -The :doc:`Howto client/server ` doc page gives an +The :doc:`Howto client/server ` page gives an overview of client/server coupling of LAMMPS with another code where one code is the "client" and sends request messages to a "server" code. The server responds to each request with a reply message. This @@ -47,9 +47,9 @@ are: * :doc:`md ` = run dynamics with another code * :doc:`mc ` = perform Monte Carlo moves with another code -For protocol *md*\ , LAMMPS can be either a client (via the :doc:`fix client/md ` command) or server. See the :doc:`server md ` doc page for details on the protocol. +For protocol *md*, LAMMPS can be either a client (via the :doc:`fix client/md ` command) or server. See the :doc:`server md ` page for details on the protocol. -For protocol *mc*\ , LAMMPS can be the server. See the :doc:`server mc ` doc page for details on the protocol. +For protocol *mc*, LAMMPS can be the server. See the :doc:`server mc ` page for details on the protocol. ---------- @@ -57,7 +57,7 @@ Restrictions """""""""""" This command is part of the MESSAGE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. A script that uses this command must also use the :doc:`message ` command to setup the messaging protocol with diff --git a/doc/src/server_mc.rst b/doc/src/server_mc.rst index eae3ead5b4..f5ddf2f468 100644 --- a/doc/src/server_mc.rst +++ b/doc/src/server_mc.rst @@ -27,7 +27,7 @@ expect messages from a separate "client" code that match the *mc* protocol for format and content explained below. For each message LAMMPS receives it will send a message back to the client. -The :doc:`Howto client/server ` doc page gives an +The :doc:`Howto client/server ` page gives an overview of client/server coupling of LAMMPS with another code where one code is the "client" and sends request messages to a "server" code. The server responds to each request with a reply message. This @@ -39,7 +39,7 @@ signals when it is done sending messages to LAMMPS, at which point the loop will exit, and the remainder of the LAMMPS script will be processed. -The :doc:`server ` doc page gives other options for using LAMMPS +The :doc:`server ` page gives other options for using LAMMPS See an example of how this command is used in examples/COUPLE/lammps_mc/in.server. @@ -109,7 +109,7 @@ Restrictions """""""""""" This command is part of the MESSAGE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. A script that uses this command must also use the :doc:`message ` command to setup the messaging protocol with diff --git a/doc/src/server_md.rst b/doc/src/server_md.rst index 86a8225e7a..f9a25a4718 100644 --- a/doc/src/server_md.rst +++ b/doc/src/server_md.rst @@ -27,7 +27,7 @@ expect messages from a separate "client" code that match the *md* protocol for format and content explained below. For each message LAMMPS receives it will send a message back to the client. -The :doc:`Howto client/server ` doc page gives an +The :doc:`Howto client/server ` page gives an overview of client/server coupling of LAMMPS with another code where one code is the "client" and sends request messages to a "server" code. The server responds to each request with a reply message. This @@ -39,7 +39,7 @@ signals when it is done sending messages to LAMMPS, at which point the loop will exit, and the remainder of the LAMMPS script will be processed. -The :doc:`server ` doc page gives other options for using LAMMPS +The :doc:`server ` page gives other options for using LAMMPS in server mode. See an example of how this command is used in examples/message/in.message.server. @@ -148,7 +148,7 @@ Restrictions """""""""""" This command is part of the MESSAGE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/set.rst b/doc/src/set.rst index dd136f867e..e61c288a74 100644 --- a/doc/src/set.rst +++ b/doc/src/set.rst @@ -42,9 +42,9 @@ Syntax seed = random # seed (positive integer) *mol* value = molecule ID value can be an atom-style variable (see below) - *x*\ ,\ *y*\ ,\ *z* value = atom coordinate (distance units) + *x*,\ *y*,\ *z* value = atom coordinate (distance units) value can be an atom-style variable (see below) - *vx*\ ,\ *vy*\ ,\ *vz* value = atom velocity (velocity units) + *vx*,\ *vy*,\ *vz* value = atom velocity (velocity units) value can be an atom-style variable (see below) *charge* value = atomic charge (charge units) value can be an atom-style variable (see below) @@ -175,12 +175,12 @@ style *type* selects all the atoms in a range of types. The style In each of the range cases, the range can be specified as a single numeric value, or a wildcard asterisk can be used to specify a range of values. This takes the form "\*" or "\*n" or "n\*" or "m\*n". For -example, for the style *type*\ , if N = the number of atom types, then +example, for the style *type*, if N = the number of atom types, then an asterisk with no numeric values means all types from 1 to N. A leading asterisk means all types from 1 to n (inclusive). A trailing asterisk means all types from n to N (inclusive). A middle asterisk means all types from m to n (inclusive). For all the styles except -*mol*\ , the lowest value for the wildcard is 1; for *mol* it is 0. +*mol*, the lowest value for the wildcard is 1; for *mol* it is 0. The style *group* selects all the atoms in the specified group. The style *region* selects all the atoms in the specified geometric @@ -250,10 +250,10 @@ Keyword *mol* sets the molecule ID for all selected atoms. The :doc:`atom style ` being used must support the use of molecule IDs. -Keywords *x*\ , *y*\ , *z*\ , and *charge* set the coordinates or -charge of all selected atoms. For *charge*\ , the :doc:`atom style +Keywords *x*, *y*, *z*, and *charge* set the coordinates or +charge of all selected atoms. For *charge*, the :doc:`atom style ` being used must support the use of atomic -charge. Keywords *vx*\ , *vy*\ , and *vz* set the velocities of all +charge. Keywords *vx*, *vy*, and *vz* set the velocities of all selected atoms. Keyword *dipole* uses the specified x,y,z values as components of a @@ -303,7 +303,7 @@ the :doc:`atom_style ` command. Random numbers are used in such a way that the orientation of a particular atom is the same, regardless of how many processors are being used. For 2d systems, only orientations in the xy plane are generated. As with keyword -*quat*\ , for ellipsoidal particles, the 3 shape values must be non-zero +*quat*, for ellipsoidal particles, the 3 shape values must be non-zero for each particle set by this command. This keyword does not allow use of an atom-style variable. @@ -316,7 +316,7 @@ a density, e.g. via the :doc:`read_data ` command. Keyword *shape* sets the size and shape of the selected atoms. The particles must be ellipsoids as defined by the :doc:`atom_style -ellipsoid ` command. The *Sx*\ , *Sy*\ , *Sz* settings +ellipsoid ` command. The *Sx*, *Sy*, *Sz* settings are the 3 diameters of the ellipsoid in each direction. All 3 can be set to the same value, which means the ellipsoid is effectively a sphere. They can also all be set to 0.0 which means the particle will @@ -430,16 +430,16 @@ up analysis of the trajectories if a LAMMPS diagnostic or your own analysis relies on the image flags to unwrap a molecule which straddles the periodic box. -Keywords *bond*\ , *angle*\ , *dihedral*\ , and *improper*\ , set the bond +Keywords *bond*, *angle*, *dihedral*, and *improper*, set the bond type (angle type, etc) of all bonds (angles, etc) of selected atoms to the specified value from 1 to nbondtypes (nangletypes, etc). All atoms in a particular bond (angle, etc) must be selected atoms in order for the change to be made. The value of nbondtype (nangletypes, -etc) was set by the *bond types* (\ *angle types*\ , etc) field in the +etc) was set by the *bond types* (\ *angle types*, etc) field in the header of the data file read by the :doc:`read_data ` command. These keywords do not allow use of an atom-style variable. -Keywords *sph/e*\ , *sph/cv*\ , and *sph/rho* set the energy, heat +Keywords *sph/e*, *sph/cv*, and *sph/rho* set the energy, heat capacity, and density of smoothed particle hydrodynamics (SPH) particles. See `this PDF guide `_ to using SPH in LAMMPS. diff --git a/doc/src/shell.rst b/doc/src/shell.rst index 95f72a27ba..af5c110fee 100644 --- a/doc/src/shell.rst +++ b/doc/src/shell.rst @@ -58,7 +58,7 @@ of the input script. Or you can run a program that pre-processes data for input into LAMMPS. Or you can run a program that post-processes LAMMPS output data. -With the exception of *cd*\ , all commands, including ones invoked via a +With the exception of *cd*, all commands, including ones invoked via a system() call, are executed by only a single processor, so that files/directories are not being manipulated by multiple processors. diff --git a/doc/src/special_bonds.rst b/doc/src/special_bonds.rst index 779056f87a..4b197fbf3a 100644 --- a/doc/src/special_bonds.rst +++ b/doc/src/special_bonds.rst @@ -148,7 +148,7 @@ LJ and Coulombic interactions, which is consistent with a coarse-grained polymer model with :doc:`FENE bonds `. See :ref:`(Kremer) ` for a description of FENE bonds. -The *lj/coul*\ , *lj*\ , and *coul* keywords allow the 3 coefficients to +The *lj/coul*, *lj*, and *coul* keywords allow the 3 coefficients to be set explicitly. The *lj/coul* keyword sets both the LJ and Coulombic coefficients to the same 3 values. The *lj* and *coul* keywords only set either the LJ or Coulombic coefficients. Use both @@ -165,7 +165,7 @@ as an angle, but does not define 2-3-4 as an angle or 1-2-3-4 as a dihedral, then the pairwise interaction between atoms 1 and 3 will always be weighted by 0.5, but different force fields use different rules for weighting the pairwise interaction between atoms 2 and 4. -If the *angle* keyword is specified as *yes*\ , then the pairwise +If the *angle* keyword is specified as *yes*, then the pairwise interaction between atoms 2 and 4 will be unaffected (full weighting of 1.0). If the *angle* keyword is specified as *no* which is the default, then the 2,4 interaction will also be weighted by 0.5. @@ -179,7 +179,7 @@ defines 1-2-3-4 as a dihedral, but does not define 2-3-4-5 as a dihedral, then the pairwise interaction between atoms 1 and 4 will always be weighted by 0.5, but different force fields use different rules for weighting the pairwise interaction between atoms 2 and 5. -If the *dihedral* keyword is specified as *yes*\ , then the pairwise +If the *dihedral* keyword is specified as *yes*, then the pairwise interaction between atoms 2 and 5 will be unaffected (full weighting of 1.0). If the *dihedral* keyword is specified as *no* which is the default, then the 2,5 interaction will also be weighted by 0.5. diff --git a/doc/src/suffix.rst b/doc/src/suffix.rst index 1ece739f55..4789229800 100644 --- a/doc/src/suffix.rst +++ b/doc/src/suffix.rst @@ -32,7 +32,7 @@ This command allows you to use variants of various styles if they exist. In that respect it operates the same as the :doc:`-suffix command-line switch `. It also has options to turn off or back on any suffix setting made via the command line. -The specified style can be *gpu*\ , *intel*\ , *kk*\ , *omp*\ , *opt* or +The specified style can be *gpu*, *intel*, *kk*, *omp*, *opt* or *hybrid*\ . These refer to optional packages that LAMMPS can be built with, as described on the :doc:`Build package ` doc page. The "gpu" style corresponds to the GPU package, the "intel" style to @@ -78,9 +78,9 @@ example, "hybrid intel omp" will use styles from the INTEL package as a first choice and styles from the OPENMP package as a second choice if no INTEL variant is available. -If the specified style is *off*\ , then any previously specified suffix +If the specified style is *off*, then any previously specified suffix is temporarily disabled, whether it was specified by a command-line -switch or a previous suffix command. If the specified style is *on*\ , +switch or a previous suffix command. If the specified style is *on*, a disabled suffix is turned back on. The use of these 2 commands lets your input script use a standard LAMMPS style (i.e. a non-accelerated variant), which can be useful for testing or benchmarking purposes. diff --git a/doc/src/tad.rst b/doc/src/tad.rst index c3cd3b825b..b36ad2e431 100644 --- a/doc/src/tad.rst +++ b/doc/src/tad.rst @@ -160,7 +160,7 @@ events must be generated before one is finally executed. Conversely, if this criterion is too aggressive, high-entropy high-barrier events will be over-sampled, while low-entropy low-barrier events will be under-sampled. If the lowest pre-exponential factor is known fairly -accurately, then it can be used to estimate *tmax*\ , and the value of +accurately, then it can be used to estimate *tmax*, and the value of *delta* can be set to the desired confidence level e.g. *delta* = 0.05 corresponds to 95% confidence. However, for systems where the dynamics are not well characterized (the most common case), it will be @@ -181,7 +181,7 @@ files, and restart files. Event statistics are printed to the screen and master log.lammps file each time an event is executed. The quantities are the timestep, CPU -time, global event number *N*\ , local event number *M*\ , event status, +time, global event number *N*, local event number *M*, event status, energy barrier, time margin, *t_lo* and *delt_lo*. The timestep is the usual LAMMPS timestep, which corresponds to the high-temperature time at which the event was detected, in units of timestep. The CPU @@ -204,7 +204,7 @@ high-temperature time since entering the current basin, scaled by an exponential factor that depends on the hi/lo temperature ratio and the energy barrier for that event. -On lines for executed events, with status *E*\ , the global event number +On lines for executed events, with status *E*, the global event number is incremented by one, the local event number and time margin are reset to zero, while the global event number, energy barrier, and @@ -304,7 +304,7 @@ Default """"""" The option defaults are *min* = 0.1 0.1 40 50, *neb* = 0.01 100 100 -10, *neb_style* = *quickmin*\ , *neb_step* = the same timestep set by +10, *neb_style* = *quickmin*, *neb_step* = the same timestep set by the :doc:`timestep ` command, and *neb_log* = "none". ---------- diff --git a/doc/src/temper.rst b/doc/src/temper.rst index bdc0e426ec..363e0102fc 100644 --- a/doc/src/temper.rst +++ b/doc/src/temper.rst @@ -45,7 +45,7 @@ Each replica's temperature is controlled at a different value by a fix with *fix-ID* that controls temperature. Most thermostat fix styles (with and without included time integration) are supported. The command will print an error message and abort, if the chosen fix is unsupported. -The desired temperature is specified by *temp*\ , which is typically a +The desired temperature is specified by *temp*, which is typically a variable previously set in the input script, so that each partition is assigned a different temperature. See the :doc:`variable ` command for more details. For example: diff --git a/doc/src/temper_grem.rst b/doc/src/temper_grem.rst index f45755da50..312df21254 100644 --- a/doc/src/temper_grem.rst +++ b/doc/src/temper_grem.rst @@ -48,7 +48,7 @@ discussed there in greater detail. Instead of temperature, this command performs replica exchanges in lambda as per the generalized ensemble enforced by :doc:`fix grem -`. The desired lambda is specified by *lambda*\ , which is +`. The desired lambda is specified by *lambda*, which is typically a variable previously set in the input script, so that each partition is assigned a different temperature. See the :doc:`variable ` command for more details. For example: diff --git a/doc/src/temper_npt.rst b/doc/src/temper_npt.rst index 9c5ba242e9..a8f5999dbe 100644 --- a/doc/src/temper_npt.rst +++ b/doc/src/temper_npt.rst @@ -52,7 +52,7 @@ Restrictions """""""""""" This command can only be used if LAMMPS was built with the REPLICA -package. See the :doc:`Build package ` doc page for more +package. See the :doc:`Build package ` page for more info. This command should be used with a fix that maintains the diff --git a/doc/src/thermo_modify.rst b/doc/src/thermo_modify.rst index 1815a7cb76..31de925492 100644 --- a/doc/src/thermo_modify.rst +++ b/doc/src/thermo_modify.rst @@ -59,8 +59,8 @@ simulation box :doc:`boundary ` or if it moves more than a box length outside the simulation domain (or more than a processor sub-domain length) before reneighboring occurs. The latter case is typically due to bad dynamics, e.g. too large a timestep or huge -forces and velocities. If the value is *ignore*\ , LAMMPS does not -check for lost atoms. If the value is *error* or *warn*\ , LAMMPS +forces and velocities. If the value is *ignore*, LAMMPS does not +check for lost atoms. If the value is *error* or *warn*, LAMMPS checks and either issues an error or warning. The code will exit with an error and continue with a warning. A warning will only be issued once, the first time an atom is lost. This can be a useful debugging @@ -117,15 +117,15 @@ The *norm* keyword determines whether various thermodynamic output values are normalized by the number of atoms or not, depending on whether it is set to *yes* or *no*\ . Different unit styles have different defaults for this setting (see below). Even if *norm* is -set to *yes*\ , a value is only normalized if it is an "extensive" +set to *yes*, a value is only normalized if it is an "extensive" quantity, meaning that it scales with the number of atoms in the -system. For the thermo keywords described by the doc page for the +system. For the thermo keywords described by the page for the :doc:`thermo_style ` command, all energy-related keywords are extensive, such as *pe* or *ebond* or *enthalpy*\ . Other keywords such as *temp* or *press* are "intensive" meaning their value is independent (in a statistical sense) of the number of atoms in the system and thus are never normalized. For thermodynamic output values -extracted from fixes and computes in a :doc:`thermo_style custom ` command, the doc page for the individual +extracted from fixes and computes in a :doc:`thermo_style custom ` command, the page for the individual :doc:`fix ` or :doc:`compute ` lists whether the value is "extensive" or "intensive" and thus whether it is normalized. Thermodynamic output values calculated by a variable formula are @@ -174,7 +174,7 @@ settings, reverting all values to their default format. a "%d"-style format identifier in the format string and LAMMPS will convert this to the corresponding 8-byte form when it is applied to those keywords. However, when specifying the *line* option or *format - M string* option for *step* and *natoms*\ , you should specify a format + M string* option for *step* and *natoms*, you should specify a format string appropriate for an 8-byte signed integer, e.g. one with "%ld". The *temp* keyword is used to determine how thermodynamic temperature @@ -222,7 +222,7 @@ Default """"""" The option defaults are lost = error, warn = 100, norm = yes for unit -style of *lj*\ , norm = no for unit style of *real* and *metal*\ , +style of *lj*, norm = no for unit style of *real* and *metal*, flush = no, and temp/press = compute IDs defined by thermo_style. The defaults for the line and format options depend on the thermo diff --git a/doc/src/thermo_style.rst b/doc/src/thermo_style.rst index 8ea487fd0a..a04504b1a6 100644 --- a/doc/src/thermo_style.rst +++ b/doc/src/thermo_style.rst @@ -117,7 +117,7 @@ thermodynamic timestep. Note that the keywords c_ID, f_ID, v_name are references to :doc:`computes `, :doc:`fixes `, and equal-style :doc:`variables ` that have been defined elsewhere in the input script or can even be new styles which users have added -to LAMMPS. See the :doc:`Modify ` doc page for details on the +to LAMMPS. See the :doc:`Modify ` page for details on the latter. Thus the *custom* style provides a flexible means of outputting essentially any desired quantity as a simulation proceeds. @@ -218,16 +218,16 @@ to see which ones contribute and whether their default A long-range tail correction *etail* for the van der Waals pairwise energy will be non-zero only if the :doc:`pair_modify tail ` option is turned on. The *etail* contribution is -included in *evdwl*\ , *epair*\ , *pe*\ , and *etotal*\ , and the +included in *evdwl*, *epair*, *pe*, and *etotal*, and the corresponding tail correction to the pressure is included in *press* -and *pxx*\ , *pyy*\ , etc. +and *pxx*, *pyy*, etc. ---------- Here is more information on other keywords whose meaning may not be clear: -The *step*\ , *elapsed*\ , and *elaplong* keywords refer to timestep +The *step*, *elapsed*, and *elaplong* keywords refer to timestep count. *Step* is the current timestep, or iteration count when a :doc:`minimization ` is being performed. *Elapsed* is the number of timesteps elapsed since the beginning of this run. @@ -318,13 +318,13 @@ to reduce the delay factor to insure no force interactions are missed by atoms moving beyond the neighbor skin distance before a rebuild takes place. -The keywords *cella*\ , *cellb*\ , *cellc*\ , *cellalpha*\ , -*cellbeta*\ , *cellgamma*\ , correspond to the usual crystallographic +The keywords *cella*, *cellb*, *cellc*, *cellalpha*, +*cellbeta*, *cellgamma*, correspond to the usual crystallographic quantities that define the periodic unit cell of a crystal. See the -:doc:`Howto triclinic ` doc page for a geometric +:doc:`Howto triclinic ` page for a geometric description of triclinic periodic cells, including a precise definition of these quantities in terms of the internal LAMMPS cell -dimensions *lx*\ , *ly*\ , *lz*\ , *yz*\ , *xz*\ , *xy*\ . +dimensions *lx*, *ly*, *lz*, *yz*, *xz*, *xy*\ . ---------- diff --git a/doc/src/third_order.rst b/doc/src/third_order.rst index 513d96b9e8..f020511aad 100644 --- a/doc/src/third_order.rst +++ b/doc/src/third_order.rst @@ -56,7 +56,7 @@ The command collects a 9 times the number of atoms in the group on every single so the memory requirements can be very significant for large systems. This command is part of the PHONON package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. +LAMMPS was built with that package. See the :doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/doc/src/timer.rst b/doc/src/timer.rst index eac86656af..a604cc2212 100644 --- a/doc/src/timer.rst +++ b/doc/src/timer.rst @@ -81,7 +81,7 @@ which can be set with the *every* keyword. Default is checking every 10 steps. After the timer timeout has expired all subsequent run or minimize commands in the input script will be skipped. The remaining time or timer status can be accessed with the -:doc:`thermo ` variable *timeremain*\ , which will be +:doc:`thermo ` variable *timeremain*, which will be zero, if the timeout is inactive (default setting), it will be negative, if the timeout time is expired and positive if there is time remaining and in this case the value of the variable are diff --git a/doc/src/timestep.rst b/doc/src/timestep.rst index e512eed1b2..3142509611 100644 --- a/doc/src/timestep.rst +++ b/doc/src/timestep.rst @@ -30,7 +30,7 @@ each choice of units that LAMMPS supports. The default value for the timestep size also depends on the choice of units for the simulation; see the default values below. -When the :doc:`run style ` is *respa*\ , dt is the timestep for +When the :doc:`run style ` is *respa*, dt is the timestep for the outer loop (largest) timestep. Restrictions diff --git a/doc/src/units.rst b/doc/src/units.rst index 3c0f4a220a..da81c17078 100644 --- a/doc/src/units.rst +++ b/doc/src/units.rst @@ -29,7 +29,7 @@ and data file, as well as quantities output to the screen, log file, and dump files. Typically, this command is used at the very beginning of an input script. -For all units except *lj*\ , LAMMPS uses physical constants from +For all units except *lj*, LAMMPS uses physical constants from www.physics.nist.gov. For the definition of Kcal in real units, LAMMPS uses the thermochemical calorie = 4.184 J. @@ -60,7 +60,7 @@ automatic conversion has happened is printed to the screen. ---------- -For style *lj*\ , all quantities are unitless. Without loss of +For style *lj*, all quantities are unitless. Without loss of generality, LAMMPS sets the fundamental quantities mass, :math:`\sigma`, :math:`\epsilon`, and the Boltzmann constant :math:`k_B = 1`. The masses, distances, energies you specify are multiples of these @@ -97,7 +97,7 @@ energy/atom. Temperature is intensive since it is already normalized by the number of atoms, so it is output as-is. This behavior can be changed via the :doc:`thermo_modify norm ` command. -For style *real*\ , these are the units: +For style *real*, these are the units: * mass = grams/mole * distance = Angstroms @@ -114,7 +114,7 @@ For style *real*\ , these are the units: * electric field = volts/Angstrom * density = gram/cm\^dim -For style *metal*\ , these are the units: +For style *metal*, these are the units: * mass = grams/mole * distance = Angstroms @@ -131,7 +131,7 @@ For style *metal*\ , these are the units: * electric field = volts/Angstrom * density = gram/cm\^dim -For style *si*\ , these are the units: +For style *si*, these are the units: * mass = kilograms * distance = meters @@ -148,7 +148,7 @@ For style *si*\ , these are the units: * electric field = volts/meter * density = kilograms/meter\^dim -For style *cgs*\ , these are the units: +For style *cgs*, these are the units: * mass = grams * distance = centimeters @@ -165,7 +165,7 @@ For style *cgs*\ , these are the units: * electric field = statvolt/cm or dyne/esu * density = grams/cm\^dim -For style *electron*\ , these are the units: +For style *electron*, these are the units: * mass = atomic mass units * distance = Bohr @@ -179,7 +179,7 @@ For style *electron*\ , these are the units: * dipole moment = Debye * electric field = volts/cm -For style *micro*\ , these are the units: +For style *micro*, these are the units: * mass = picograms * distance = micrometers @@ -196,7 +196,7 @@ For style *micro*\ , these are the units: * electric field = volt/micrometer * density = picograms/micrometer\^dim -For style *nano*\ , these are the units: +For style *nano*, these are the units: * mass = attograms * distance = nanometers diff --git a/doc/src/variable.rst b/doc/src/variable.rst index f24c262e58..25861ae17b 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -189,7 +189,7 @@ executed. override a corresponding index variable setting in the input script. There are two exceptions to this rule. First, variables of style -*string*\ , *getenv*\ , *internal*\ , *equal*\ , *vector*\ , *atom*\ , and +*string*, *getenv*, *internal*, *equal*, *vector*, *atom*, and *python* ARE redefined each time the command is encountered. This allows these style of variables to be redefined multiple times in an input script. In a loop, this means the formula associated with an @@ -204,14 +204,14 @@ the same thing. ---------- -The :doc:`Commands parse ` doc page explains how +The :doc:`Commands parse ` page explains how occurrences of a variable name in an input script line are replaced by the variable's string. The variable name can be referenced as $x if the name "x" is a single character, or as ${LoopVar} if the name "LoopVar" is one or more characters. -As described below, for variable styles *index*\ , *loop*\ , *file*\ , -*universe*\ , and *uloop*\ , which string is assigned to a variable can be +As described below, for variable styles *index*, *loop*, *file*, +*universe*, and *uloop*, which string is assigned to a variable can be incremented via the :doc:`next ` command. When there are no more strings to assign, the variable is exhausted and a flag is set that causes the next :doc:`jump ` command encountered in the input @@ -439,7 +439,7 @@ compute, fix, or other vector-style variable. For *atom*\ -style variables the formula computes one quantity for each atom whenever it is evaluated. -Note that *equal*\ , *vector*\ , and *atom* variables can produce +Note that *equal*, *vector*, and *atom* variables can produce different values at different stages of the input script or at different times during a run. For example, if an *equal* variable is used in a :doc:`fix print ` command, different values could @@ -451,7 +451,7 @@ of Variables". The next command cannot be used with *equal* or *vector* or *atom* style variables, since there is only one string. -The formula for an *equal*\ , *vector*\ , or *atom* variable can contain a +The formula for an *equal*, *vector*, or *atom* variable can contain a variety of quantities. The syntax for each kind of quantity is simple, but multiple quantities can be nested and combined in various ways to build up formulas of arbitrary complexity. For example, this @@ -527,8 +527,8 @@ Numbers can contain digits, scientific notation (3.0e20,3.0e-20,3.0E20,3.0E-20), and leading minus signs. Constants are set at compile time and cannot be changed. *PI* will -return the number 3.14159265358979323846; *on*\ , *true* or *yes* will -return 1.0; *off*\ , *false* or *no* will return 0.0; *version* will +return the number 3.14159265358979323846; *on*, *true* or *yes* will +return 1.0; *off*, *false* or *no* will return 0.0; *version* will return a numeric version code of the current LAMMPS version (e.g. version 2 Sep 2015 will return the number 20150902). The corresponding value for newer versions of LAMMPS will be larger, for older versions @@ -788,7 +788,7 @@ Group and Region Functions Group functions are specified as keywords followed by one or two parenthesized arguments. The first argument *ID* is the group-ID. The *dim* argument, if it exists, is *x* or *y* or *z*\ . The *dir* -argument, if it exists, is *xmin*\ , *xmax*\ , *ymin*\ , *ymax*\ , *zmin*\ , or +argument, if it exists, is *xmin*, *xmax*, *ymin*, *ymax*, *zmin*, or *zmax*\ . The *dimdim* argument, if it exists, is *xx* or *yy* or *zz* or *xy* or *yz* or *xz*\ . @@ -958,21 +958,21 @@ Example 2: use r-RESPA with inner/outer cutoff, if supported by pair style, othe timestep $(2.0*(1.0+2.0*is_active(pair,respa)) if $(is_active(pair,respa)) then "run_style respa 4 3 2 2 improper 1 inner 2 5.5 7.0 outer 3 kspace 4" else "run_style respa 3 3 2 improper 1 pair 2 kspace 3" -The *is_defined()* function allows to query categories like *compute*\ , -*dump*\ , *fix*\ , *group*\ , *region*\ , and *variable* whether an entry +The *is_defined()* function allows to query categories like *compute*, +*dump*, *fix*, *group*, *region*, and *variable* whether an entry with the provided name or id is defined. The *is_available(category,name)* function allows to query whether a specific optional feature is available, i.e. compiled in. -This currently works for the following categories: *command*\ , -*compute*\ , *fix*\ , *pair_style* and *feature*\ . For all categories +This currently works for the following categories: *command*, +*compute*, *fix*, *pair_style* and *feature*\ . For all categories except *command* and *feature* also appending active suffixes is tried before reporting failure. The *feature* category is used to check the availability of compiled in features such as GZIP support, PNG support, JPEG support, FFMPEG support, and C++ exceptions for error handling. Corresponding values for name are -*gzip*\ , *png*\ , *jpeg*\ , *ffmpeg* and *exceptions*\ . +*gzip*, *png*, *jpeg*, *ffmpeg* and *exceptions*\ . This enables writing input scripts which only dump using a given format if the compiled binary supports it. @@ -1025,7 +1025,7 @@ Compute References Compute references access quantities calculated by a :doc:`compute `. The ID in the reference should be replaced by the ID of a compute defined elsewhere in the input script. As -discussed in the doc page for the :doc:`compute ` command, +discussed in the page for the :doc:`compute ` command, computes can produce global, per-atom, or local values. Only global and per-atom values can be used in a variable. Computes can also produce a scalar, vector, or array. @@ -1086,7 +1086,7 @@ Fix References Fix references access quantities calculated by a :doc:`fix `. The ID in the reference should be replaced by the ID of a fix defined -elsewhere in the input script. As discussed in the doc page for the +elsewhere in the input script. As discussed in the page for the :doc:`fix ` command, fixes can produce global, per-atom, or local values. Only global and per-atom values can be used in a variable. Fixes can also produce a scalar, vector, or array. An equal-style @@ -1198,7 +1198,7 @@ Immediate Evaluation of Variables If you want an equal-style variable to be evaluated immediately, it may be the case that you do not need to define a variable at all. See -the :doc:`Commands parse ` doc page for info on how to +the :doc:`Commands parse ` page for info on how to use "immediate" variables in an input script, specified as $(formula) with parenthesis, where the formula has the same syntax as equal-style variables described on this page. This effectively evaluates a diff --git a/doc/src/velocity.rst b/doc/src/velocity.rst index d8823d6b7e..0c8de5b854 100644 --- a/doc/src/velocity.rst +++ b/doc/src/velocity.rst @@ -115,7 +115,7 @@ body. All temperatures specified in the velocity command are in temperature units; see the :doc:`units ` command. The units of velocities and coordinates depend on whether the *units* keyword is set to *box* or -*lattice*\ , as discussed below. +*lattice*, as discussed below. For all styles, no atoms are assigned z-component velocities if the simulation is 2d; see the :doc:`dimension ` command. @@ -161,12 +161,12 @@ appropriate fix command must be specified before the velocity command is issued. The *bias* keyword with a *yes* setting is used by *create* and -*scale*\ , but only if the *temp* keyword is also used to specify a +*scale*, but only if the *temp* keyword is also used to specify a :doc:`compute ` that calculates temperature in a desired way. If the temperature compute also calculates a velocity bias, the bias is subtracted from atom velocities before the *create* and *scale* operations are performed. After the operations, the bias is -added back to the atom velocities. See the :doc:`Howto thermostat ` doc page for more discussion of +added back to the atom velocities. See the :doc:`Howto thermostat ` page for more discussion of temperature computes with biases. Note that the velocity bias is only applied to atoms in the temperature compute specified with the *temp* keyword. diff --git a/doc/src/write_data.rst b/doc/src/write_data.rst index 0aa26f8bbf..e14d1b7f4c 100644 --- a/doc/src/write_data.rst +++ b/doc/src/write_data.rst @@ -107,7 +107,7 @@ from :doc:`fix property/atom `. The *pair* keyword lets you specify in what format the pair coefficient information is written into the data file. If the value -is specified as *ii*\ , then one line per atom type is written, to +is specified as *ii*, then one line per atom type is written, to specify the coefficients for each of the I=J interactions. This means that no cross-interactions for I != J will be specified in the data file and the pair style will apply its mixing rule, as documented on @@ -116,7 +116,7 @@ behavior can be overridden in the input script after reading the data file, by specifying additional :doc:`pair_coeff ` commands for any desired I,J pairs. -If the value is specified as *ij*\ , then one line of coefficients is +If the value is specified as *ij*, then one line of coefficients is written for all I,J pairs where I <= J. These coefficients will include any specific settings made in the input script up to that point. The presence of these I != J coefficients in the data file diff --git a/src/EXTRA-PAIR/pair_coul_streitz.cpp b/src/KSPACE/pair_coul_streitz.cpp similarity index 100% rename from src/EXTRA-PAIR/pair_coul_streitz.cpp rename to src/KSPACE/pair_coul_streitz.cpp diff --git a/src/EXTRA-PAIR/pair_coul_streitz.h b/src/KSPACE/pair_coul_streitz.h similarity index 100% rename from src/EXTRA-PAIR/pair_coul_streitz.h rename to src/KSPACE/pair_coul_streitz.h From 0513ba2df53fac08189dcb89033c113fee769588 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 20:28:14 -0400 Subject: [PATCH 153/352] spelling --- doc/src/Modify_contribute.rst | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/Modify_contribute.rst b/doc/src/Modify_contribute.rst index caf31a9196..ff39773764 100644 --- a/doc/src/Modify_contribute.rst +++ b/doc/src/Modify_contribute.rst @@ -181,7 +181,7 @@ packages in the src directory for examples. If you are uncertain, please ask. and your name and email address at the top, like other user-contributed LAMMPS source files. They need to create a class that is inside the LAMMPS namespace. To simplify maintenance, we - may ask to adjust the progamming style and formatting style to closer + may ask to adjust the programming style and formatting style to closer match the rest of LAMMPS. We bundle a clang-format configuration file that can help with adjusting the formatting, although this is not a strict requirement. diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 778fa93e84..c866a9409b 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -448,6 +448,7 @@ clo Clovertown cmake CMake +CMakeLists cmap Cmax cmd From 7e6a06b1cc76ed475419baf4073427bff5397185 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 21:04:26 -0400 Subject: [PATCH 154/352] update Pizza.py URLs --- doc/src/Howto_viz.rst | 2 +- doc/src/Python_examples.rst | 4 ++-- doc/src/Tools.rst | 2 +- doc/src/balance.rst | 2 +- doc/src/dump.rst | 2 +- doc/src/dump_image.rst | 4 ++-- doc/src/fix_balance.rst | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/src/Howto_viz.rst b/doc/src/Howto_viz.rst index 2eb009c185..bcad6dddec 100644 --- a/doc/src/Howto_viz.rst +++ b/doc/src/Howto_viz.rst @@ -25,7 +25,7 @@ RasMol visualization programs. Pizza.py has tools that do interactive 3d OpenGL visualization and one that creates SVG images of dump file snapshots. -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza .. _ensight: https://www.ansys.com/products/fluids/ansys-ensight diff --git a/doc/src/Python_examples.rst b/doc/src/Python_examples.rst index 7466b52ba9..fe5fe812c5 100644 --- a/doc/src/Python_examples.rst +++ b/doc/src/Python_examples.rst @@ -35,9 +35,9 @@ visualization package you have installed. Note that for GL, you need to be able to run the Pizza.py GL tool, which is included in the pizza sub-directory. See the Pizza.py doc pages for more info: -* `https://pizza.sandia.gov `_ +* `https://lammps.github.io/pizza `_ -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza Note that for AtomEye, you need version 3, and there is a line in the scripts that specifies the path and name of the executable. See the diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index e7cd87aa78..7eb6515fad 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -15,7 +15,7 @@ Sandia which provides tools for doing setup, analysis, plotting, and visualization for LAMMPS simulations. .. _lws: https://www.lammps.org -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza .. _python: https://www.python.org Additional tools included in the LAMMPS distribution are described on diff --git a/doc/src/balance.rst b/doc/src/balance.rst index 5d42fabb21..f7ae4c6bff 100644 --- a/doc/src/balance.rst +++ b/doc/src/balance.rst @@ -558,7 +558,7 @@ Related commands :doc:`group `, :doc:`processors `, :doc:`fix balance `, :doc:`comm_style ` -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza Default """"""" diff --git a/doc/src/dump.rst b/doc/src/dump.rst index a5f11a792a..b55cde650e 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -230,7 +230,7 @@ individual values and the file itself. The *atom*\ , *local*\ , and *custom* styles create files in a simple text format that is self-explanatory when viewing a dump file. Some of the LAMMPS post-processing tools described on the :doc:`Tools ` doc -page, including `Pizza.py `_, +page, including `Pizza.py `_, work with this format, as does the :doc:`rerun ` command. For post-processing purposes the *atom*\ , *local*\ , and *custom* text diff --git a/doc/src/dump_image.rst b/doc/src/dump_image.rst index 3923d5c2dc..291aeae9c3 100644 --- a/doc/src/dump_image.rst +++ b/doc/src/dump_image.rst @@ -590,8 +590,8 @@ Play the movie: % mplayer foo.mpg % ffplay bar.avi -* c) Use the `Pizza.py `_ - `animate tool `_, +* c) Use the `Pizza.py `_ + `animate tool `_, which works directly on a series of image files. .. code-block:: python diff --git a/doc/src/fix_balance.rst b/doc/src/fix_balance.rst index 8bab8ebefc..772f049461 100644 --- a/doc/src/fix_balance.rst +++ b/doc/src/fix_balance.rst @@ -403,7 +403,7 @@ Related commands :doc:`group `, :doc:`processors `, :doc:`balance `, :doc:`comm_style ` -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza Default """"""" From ef244c3061cd37614b0d6fc6693fddeffb22dfe8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 21:05:33 -0400 Subject: [PATCH 155/352] small updates to the introduction --- doc/src/Intro_features.rst | 23 +++++++++++++++-------- doc/src/Intro_nonfeatures.rst | 2 +- doc/src/Intro_overview.rst | 20 +++++++++++--------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/doc/src/Intro_features.rst b/doc/src/Intro_features.rst index 648c427b11..f1c04bdb23 100644 --- a/doc/src/Intro_features.rst +++ b/doc/src/Intro_features.rst @@ -24,11 +24,15 @@ General features ^^^^^^^^^^^^^^^^ * runs on a single processor or in parallel -* distributed-memory message-passing parallelism (MPI) -* spatial-decomposition of simulation domain for parallelism -* open-source distribution -* highly portable C++ -* optional libraries used: MPI and single-processor FFT +* distributed memory message-passing parallelism (MPI) +* shared memory multi-threading parallelism (OpenMP) +* spatial decomposition of simulation domain for MPI parallelism +* particle decomposition inside of spatial decomposition for OpenMP parallelism +* GPLv2 licensed open-source distribution +* highly portable C++-11 +* modular code with most functionality in optional packages +* only depends on MPI library for basic parallel functionality +* other libraries are optional and only required for specific packages * GPU (CUDA and OpenCL), Intel Xeon Phi, and OpenMP support for many code features * easy to extend with new features and functionality * runs from an input script @@ -68,9 +72,9 @@ Interatomic potentials (force fields) :doc:`improper style `, :doc:`kspace style ` commands) -* pairwise potentials: Lennard-Jones, Buckingham, Morse, Born-Mayer-Huggins, Yukawa, soft, class 2 (COMPASS), hydrogen bond, tabulated +* pairwise potentials: Lennard-Jones, Buckingham, Morse, Born-Mayer-Huggins, Yukawa, soft, class 2 (COMPASS), hydrogen bond, tabulated * charged pairwise potentials: Coulombic, point-dipole -* many-body potentials: EAM, Finnis/Sinclair EAM, modified EAM (MEAM), embedded ion method (EIM), EDIP, ADP, Stillinger-Weber, Tersoff, REBO, AIREBO, ReaxFF, COMB, SNAP, Streitz-Mintmire, 3-body polymorphic +* many-body potentials: EAM, Finnis/Sinclair EAM, modified EAM (MEAM), embedded ion method (EIM), EDIP, ADP, Stillinger-Weber, Tersoff, REBO, AIREBO, ReaxFF, COMB, SNAP, Streitz-Mintmire, 3-body polymorphic * long-range interactions for charge, point-dipoles, and LJ dispersion: Ewald, Wolf, PPPM (similar to particle-mesh Ewald) * polarization models: :doc:`QEq `, :doc:`core/shell model `, :doc:`Drude dipole model ` * charge equilibration (QEq via dynamic, point, shielded, Slater methods) @@ -170,9 +174,12 @@ Multi-replica models ^^^^^^^^^^^^^^^^^^^^ * :doc:`nudged elastic band ` +* :doc:`hyperdynamics ` * :doc:`parallel replica dynamics ` * :doc:`temperature accelerated dynamics ` * :doc:`parallel tempering ` +* :doc:`path-integral MD ` +* multi-walker collective variables with :doc:`Colvars ` and :doc:`Plumed ` .. _prepost: @@ -187,7 +194,7 @@ Pre- and post-processing plotting, and visualization for LAMMPS simulations. Pizza.py is written in `Python `_ and is available for download from `the Pizza.py WWW site `_. -.. _pizza: https://pizza.sandia.gov +.. _pizza: https://lammps.github.io/pizza .. _python: http://www.python.org diff --git a/doc/src/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst index d034ccb443..af406a127e 100644 --- a/doc/src/Intro_nonfeatures.rst +++ b/doc/src/Intro_nonfeatures.rst @@ -77,7 +77,7 @@ Here are suggestions on how to perform these tasks: it easier to analyze and plot. See the :doc:`Tools ` doc page for more discussion of the various tools. * **Pizza.py:** Our group has also written a separate toolkit called - `Pizza.py `_ which can do certain kinds of + `Pizza.py `_ which can do certain kinds of setup, analysis, plotting, and visualization (via OpenGL) for LAMMPS simulations. It thus provides some functionality for several of the above bullets. Pizza.py is written in `Python `_ diff --git a/doc/src/Intro_overview.rst b/doc/src/Intro_overview.rst index 8ab85a0d99..8d8d4eae83 100644 --- a/doc/src/Intro_overview.rst +++ b/doc/src/Intro_overview.rst @@ -18,10 +18,11 @@ supercomputers. .. _mpi: https://en.wikipedia.org/wiki/Message_Passing_Interface .. _lws: https://www.lammps.org -LAMMPS is written in C++. Earlier versions were written in F77 and -F90. See the `History page `_ of -the website for details. All versions can be downloaded from the -`LAMMPS website `_. +LAMMPS is written in C++ and requires a compiler that is at least +compatible with the C++-11 standard. +Earlier versions were written in F77 and F90. See the `History page +`_ of the website for details. All +versions can be downloaded from the `LAMMPS website `_. LAMMPS is designed to be easy to modify or extend with new capabilities, such as new force fields, atom types, boundary @@ -41,8 +42,9 @@ short distances, so that the local density of particles never becomes too large. This is in contrast to methods used for modeling plasma or gravitational bodies (e.g. galaxy formation). -On parallel machines, LAMMPS uses spatial-decomposition techniques to -partition the simulation domain into small sub-domains of equal -computational cost, one of which is assigned to each processor. -Processors communicate and store "ghost" atom information for atoms -that border their sub-domain. +On parallel machines, LAMMPS uses spatial-decomposition techniques with +MPI parallelization to partition the simulation domain into small +sub-domains of equal computational cost, one of which is assigned to +each processor. Processors communicate and store "ghost" atom +information for atoms that border their sub-domain. Multi-threading +parallelization with with particle-decomposition can be used in addition. From 1fa621d02d3e4d9ba83de7fc7c9bdf829b155b62 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 25 Jul 2021 21:18:52 -0400 Subject: [PATCH 156/352] correct quoted screen output --- doc/src/Build_manual.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Build_manual.rst b/doc/src/Build_manual.rst index a2683e773b..bd96a8dafb 100644 --- a/doc/src/Build_manual.rst +++ b/doc/src/Build_manual.rst @@ -204,9 +204,9 @@ be multiple tests run automatically: .. parsed-literal:: - Found 74 packages - Standard package NEWPACKAGE missing in Packages_standard.rst - Standard package NEWPACKAGE missing in Packages_details.rst + Found 88 packages + Package NEWPACKAGE missing in Packages_list.rst + Package NEWPACKAGE missing in Packages_details.rst - A test that only standard, printable ASCII text characters are used. This runs the command ``env LC_ALL=C grep -n '[^ -~]' src/*.rst`` and From cca17feb27c91944ef4a8e4a2ff6e5fa6e61e5f8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 12:31:09 -0400 Subject: [PATCH 157/352] silence compiler warnings, remove dead code --- src/DIELECTRIC/pppm_disp_dielectric.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DIELECTRIC/pppm_disp_dielectric.cpp b/src/DIELECTRIC/pppm_disp_dielectric.cpp index bb00a74922..b6a82296b2 100644 --- a/src/DIELECTRIC/pppm_disp_dielectric.cpp +++ b/src/DIELECTRIC/pppm_disp_dielectric.cpp @@ -647,7 +647,6 @@ void PPPMDispDielectric::fieldforce_c_ad() // convert E-field to force and substract self forces const double qfactor = qqrd2e * scale; - double qtmp = eps[i]*q[i]; s1 = x[i][0]*hx_inv; s2 = x[i][1]*hy_inv; @@ -751,7 +750,7 @@ void PPPMDispDielectric::fieldforce_c_peratom() extended to non-neutral systems (J. Chem. Phys. 131, 094107). ------------------------------------------------------------------------- */ -void PPPMDispDielectric::slabcorr(int eflag) +void PPPMDispDielectric::slabcorr(int /*eflag*/) { // compute local contribution to global dipole moment From fefcd0e2af255056a0dc49a1604e02b9fa92a8c8 Mon Sep 17 00:00:00 2001 From: Mike Brown Date: Mon, 26 Jul 2021 11:22:21 -0700 Subject: [PATCH 158/352] Converting cilk vectorization directives to the openmp standard and changing some more depracated vector intrinsics. Data alignment directives for compiler vectorization are still mostly intel specific. --- src/INTEL/angle_charmm_intel.cpp | 8 + src/INTEL/angle_harmonic_intel.cpp | 8 + src/INTEL/bond_fene_intel.cpp | 8 + src/INTEL/bond_harmonic_intel.cpp | 8 + src/INTEL/dihedral_charmm_intel.cpp | 19 +- src/INTEL/dihedral_fourier_intel.cpp | 8 + src/INTEL/dihedral_harmonic_intel.cpp | 8 + src/INTEL/dihedral_opls_intel.cpp | 8 + src/INTEL/fix_intel.cpp | 32 ++- src/INTEL/fix_nh_intel.cpp | 66 ++++- src/INTEL/fix_nve_asphere_intel.cpp | 24 +- src/INTEL/fix_nve_intel.cpp | 36 ++- src/INTEL/improper_cvff_intel.cpp | 12 + src/INTEL/improper_harmonic_intel.cpp | 8 + src/INTEL/intel_intrinsics.h | 3 +- src/INTEL/intel_intrinsics_airebo.h | 36 +-- src/INTEL/intel_preprocess.h | 200 +++++++++++++++ src/INTEL/intel_simd.h | 239 +++++++++++------- src/INTEL/npair_full_bin_ghost_intel.cpp | 26 +- src/INTEL/npair_intel.cpp | 40 ++- src/INTEL/pair_buck_coul_cut_intel.cpp | 10 +- src/INTEL/pair_buck_coul_long_intel.cpp | 9 +- src/INTEL/pair_buck_intel.cpp | 10 +- src/INTEL/pair_dpd_intel.cpp | 9 +- src/INTEL/pair_eam_intel.cpp | 39 ++- src/INTEL/pair_gayberne_intel.cpp | 15 +- .../pair_lj_charmm_coul_charmm_intel.cpp | 9 +- src/INTEL/pair_lj_charmm_coul_long_intel.cpp | 9 +- src/INTEL/pair_lj_cut_coul_long_intel.cpp | 9 +- src/INTEL/pair_lj_cut_intel.cpp | 8 +- src/INTEL/pair_sw_intel.cpp | 6 +- src/INTEL/pppm_disp_intel.cpp | 214 +++++++++++++++- src/INTEL/pppm_intel.cpp | 58 ++++- 33 files changed, 1013 insertions(+), 189 deletions(-) diff --git a/src/INTEL/angle_charmm_intel.cpp b/src/INTEL/angle_charmm_intel.cpp index 29b7ec208b..26943934be 100644 --- a/src/INTEL/angle_charmm_intel.cpp +++ b/src/INTEL/angle_charmm_intel.cpp @@ -162,7 +162,11 @@ void AngleCharmmIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:seangle, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:seangle, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -246,7 +250,11 @@ void AngleCharmmIntel::eval(const int vflag, // apply force to each of 3 atoms #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/angle_harmonic_intel.cpp b/src/INTEL/angle_harmonic_intel.cpp index a2d8cc7d13..e392730edc 100644 --- a/src/INTEL/angle_harmonic_intel.cpp +++ b/src/INTEL/angle_harmonic_intel.cpp @@ -162,7 +162,11 @@ void AngleHarmonicIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:seangle, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:seangle, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -228,7 +232,11 @@ void AngleHarmonicIntel::eval(const int vflag, // apply force to each of 3 atoms #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/bond_fene_intel.cpp b/src/INTEL/bond_fene_intel.cpp index 44a8c0d3cf..1ab8da68d9 100644 --- a/src/INTEL/bond_fene_intel.cpp +++ b/src/INTEL/bond_fene_intel.cpp @@ -158,7 +158,11 @@ void BondFENEIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sebond, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:sebond, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -215,7 +219,11 @@ void BondFENEIntel::eval(const int vflag, // apply force to each of 2 atoms #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/bond_harmonic_intel.cpp b/src/INTEL/bond_harmonic_intel.cpp index a37ae091a0..35b194f0fa 100644 --- a/src/INTEL/bond_harmonic_intel.cpp +++ b/src/INTEL/bond_harmonic_intel.cpp @@ -155,7 +155,11 @@ void BondHarmonicIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sebond, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:sebond, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -184,7 +188,11 @@ void BondHarmonicIntel::eval(const int vflag, // apply force to each of 2 atoms #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/dihedral_charmm_intel.cpp b/src/INTEL/dihedral_charmm_intel.cpp index a317be00fb..4116d9134f 100644 --- a/src/INTEL/dihedral_charmm_intel.cpp +++ b/src/INTEL/dihedral_charmm_intel.cpp @@ -181,9 +181,16 @@ void DihedralCharmmIntel::eval(const int vflag, } #if defined(LMP_SIMD_COMPILER_TEST) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sedihedral, sevdwl, secoul, sv0, sv1, sv2, \ + sv3, sv4, sv5, spv0, spv1, spv2, spv3, spv4, \ + spv5) +#else #pragma simd reduction(+:sedihedral, sevdwl, secoul, sv0, sv1, sv2, \ - sv3, sv4, sv5, spv0, spv1, spv2, spv3, spv4, spv5) + sv3, sv4, sv5, spv0, spv1, spv2, spv3, spv4, \ + spv5) +#endif + #pragma vector aligned for (int n = nfrom; n < nto; n++) { #endif for (int n = nfrom; n < nto; n += npl) { @@ -329,7 +336,11 @@ void DihedralCharmmIntel::eval(const int vflag, #if defined(LMP_SIMD_COMPILER_TEST) +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i2 < nlocal) { @@ -408,7 +419,11 @@ void DihedralCharmmIntel::eval(const int vflag, // apply force to each of 4 atoms #if defined(LMP_SIMD_COMPILER_TEST) +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/dihedral_fourier_intel.cpp b/src/INTEL/dihedral_fourier_intel.cpp index 4d44ea36d2..d952ac7506 100644 --- a/src/INTEL/dihedral_fourier_intel.cpp +++ b/src/INTEL/dihedral_fourier_intel.cpp @@ -154,7 +154,11 @@ void DihedralFourierIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -304,7 +308,11 @@ void DihedralFourierIntel::eval(const int vflag, } #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/dihedral_harmonic_intel.cpp b/src/INTEL/dihedral_harmonic_intel.cpp index f7009689c7..df9304b6ba 100644 --- a/src/INTEL/dihedral_harmonic_intel.cpp +++ b/src/INTEL/dihedral_harmonic_intel.cpp @@ -154,7 +154,11 @@ void DihedralHarmonicIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -299,7 +303,11 @@ void DihedralHarmonicIntel::eval(const int vflag, } #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/dihedral_opls_intel.cpp b/src/INTEL/dihedral_opls_intel.cpp index ab007dad8c..89f06773d5 100644 --- a/src/INTEL/dihedral_opls_intel.cpp +++ b/src/INTEL/dihedral_opls_intel.cpp @@ -158,7 +158,11 @@ void DihedralOPLSIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:sedihedral, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n ++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -319,7 +323,11 @@ void DihedralOPLSIntel::eval(const int vflag, } #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/fix_intel.cpp b/src/INTEL/fix_intel.cpp index 59eea4961a..d0633d7791 100644 --- a/src/INTEL/fix_intel.cpp +++ b/src/INTEL/fix_intel.cpp @@ -635,19 +635,31 @@ void FixIntel::reduce_results(acc_t * _noalias const f_scalar) if (_nthreads == 4) { acc_t *f_scalar3 = f_scalar2 + f_stride4; acc_t *f_scalar4 = f_scalar3 + f_stride4; - _use_simd_pragma("vector aligned") - _use_simd_pragma("simd") + #if defined(USE_OMP_SIMD) + #pragma omp simd aligned(f_scalar,f_scalar2,f_scalar3,f_scalar4:64) + #elif defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif for (int n = 0; n < o_range; n++) f_scalar[n] += f_scalar2[n] + f_scalar3[n] + f_scalar4[n]; } else if (_nthreads == 2) { - _use_simd_pragma("vector aligned") - _use_simd_pragma("simd") + #if defined(USE_OMP_SIMD) + #pragma omp simd aligned(f_scalar,f_scalar2:64) + #elif defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif for (int n = 0; n < o_range; n++) f_scalar[n] += f_scalar2[n]; } else { acc_t *f_scalar3 = f_scalar2 + f_stride4; - _use_simd_pragma("vector aligned") - _use_simd_pragma("simd") + #if defined(USE_OMP_SIMD) + #pragma omp simd aligned(f_scalar,f_scalar2,f_scalar3:64) + #elif defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif for (int n = 0; n < o_range; n++) f_scalar[n] += f_scalar2[n] + f_scalar3[n]; } @@ -662,8 +674,12 @@ void FixIntel::reduce_results(acc_t * _noalias const f_scalar) acc_t *f_scalar2 = f_scalar + f_stride4; for (int t = 1; t < _nthreads; t++) { - _use_simd_pragma("vector aligned") - _use_simd_pragma("simd") + #if defined(USE_OMP_SIMD) + #pragma omp simd aligned(f_scalar,f_scalar2:64) + #elif defined(LMP_SIMD_COMPILER) + #pragma vector aligned + #pragma simd + #endif for (int n = iifrom; n < iito; n++) f_scalar[n] += f_scalar2[n]; f_scalar2 += f_stride4; diff --git a/src/INTEL/fix_nh_intel.cpp b/src/INTEL/fix_nh_intel.cpp index 5370e3a13f..a4fdecbd96 100644 --- a/src/INTEL/fix_nh_intel.cpp +++ b/src/INTEL/fix_nh_intel.cpp @@ -99,8 +99,12 @@ void FixNHIntel::remap() if (allremap) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { const double d0 = x[i].x - b0; @@ -112,8 +116,12 @@ void FixNHIntel::remap() } } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { if (mask[i] & dilate_group_bit) { @@ -278,8 +286,12 @@ void FixNHIntel::remap() if (allremap) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { x[i].x = h0*x[i].x + h5*x[i].y + h4*x[i].z + nb0; @@ -288,8 +300,12 @@ void FixNHIntel::remap() } } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { if (mask[i] & dilate_group_bit) { @@ -415,8 +431,12 @@ void FixNHIntel::nh_v_press() if (igroup == 0) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { v[i].x *= f0; @@ -425,8 +445,12 @@ void FixNHIntel::nh_v_press() } } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { @@ -448,8 +472,12 @@ void FixNHIntel::nve_v() double * _noalias const v = atom->v[0]; const double * _noalias const f = atom->f[0]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) v[i] += _dtfm[i] * f[i]; @@ -468,15 +496,23 @@ void FixNHIntel::nve_x() if (igroup == 0) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) x[i] += dtv * v[i]; } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { if (_dtfm[i] != 0.0) @@ -500,15 +536,23 @@ void FixNHIntel::nh_v_temp() if (igroup == 0) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) v[i] *= factor_eta; } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { if (_dtfm[i] != 0.0) diff --git a/src/INTEL/fix_nve_asphere_intel.cpp b/src/INTEL/fix_nve_asphere_intel.cpp index 78504c237a..eda8b48a67 100644 --- a/src/INTEL/fix_nve_asphere_intel.cpp +++ b/src/INTEL/fix_nve_asphere_intel.cpp @@ -97,8 +97,12 @@ void FixNVEAsphereIntel::initial_integrate(int /*vflag*/) dtq = 0.5 * dtv; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { v[i] += _dtfm[i] * f[i]; @@ -108,8 +112,12 @@ void FixNVEAsphereIntel::initial_integrate(int /*vflag*/) // update angular momentum by 1/2 step if (igroup == 0) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { double *quat = bonus[ellipsoid[i]].quat; @@ -118,8 +126,12 @@ void FixNVEAsphereIntel::initial_integrate(int /*vflag*/) } } else { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { @@ -143,8 +155,12 @@ void FixNVEAsphereIntel::final_integrate() const double * _noalias const torque = atom->torque[0]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { v[i] += _dtfm[i] * f[i]; diff --git a/src/INTEL/fix_nve_intel.cpp b/src/INTEL/fix_nve_intel.cpp index fb90946da0..9670af65c2 100644 --- a/src/INTEL/fix_nve_intel.cpp +++ b/src/INTEL/fix_nve_intel.cpp @@ -68,8 +68,12 @@ void FixNVEIntel::initial_integrate(int /*vflag*/) if (igroup == 0 && atom->ntypes == 1 && !atom->rmass) { const double dtfm = dtf / atom->mass[1]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { v[i] += dtfm * f[i]; @@ -78,8 +82,12 @@ void FixNVEIntel::initial_integrate(int /*vflag*/) } else if (igroup == 0) { if (neighbor->ago == 0) reset_dt(); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { v[i] += _dtfm[i] * f[i]; @@ -88,8 +96,12 @@ void FixNVEIntel::initial_integrate(int /*vflag*/) } else { if (neighbor->ago == 0) reset_dt(); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { if (_dtfm[i] != 0.0) { @@ -112,16 +124,24 @@ void FixNVEIntel::final_integrate() _nlocal3 = 3 * atom->nlocal; const double dtfm = dtf / atom->mass[1]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) v[i] += dtfm * f[i]; } else if (igroup == 0) { if (neighbor->ago == 0) reset_dt(); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) { v[i] += _dtfm[i] * f[i]; @@ -129,8 +149,12 @@ void FixNVEIntel::final_integrate() } else { if (neighbor->ago == 0) reset_dt(); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int i = 0; i < _nlocal3; i++) v[i] += _dtfm[i] * f[i]; diff --git a/src/INTEL/improper_cvff_intel.cpp b/src/INTEL/improper_cvff_intel.cpp index 62dcde36b9..4d473de7aa 100644 --- a/src/INTEL/improper_cvff_intel.cpp +++ b/src/INTEL/improper_cvff_intel.cpp @@ -165,7 +165,11 @@ void ImproperCvffIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:seimproper, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:seimproper, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -247,7 +251,11 @@ void ImproperCvffIntel::eval(const int vflag, flt_t p, pd; #ifdef LMP_INTEL_USE_SIMDOFF_FIX +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (m == 2) { @@ -319,7 +327,11 @@ void ImproperCvffIntel::eval(const int vflag, // apply force to each of 4 atoms #ifdef LMP_INTEL_USE_SIMDOFF_FIX +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/improper_harmonic_intel.cpp b/src/INTEL/improper_harmonic_intel.cpp index b3d4c342d9..1a637fa1a6 100644 --- a/src/INTEL/improper_harmonic_intel.cpp +++ b/src/INTEL/improper_harmonic_intel.cpp @@ -167,7 +167,11 @@ void ImproperHarmonicIntel::eval(const int vflag, if (VFLAG && vflag) { sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0.0; } +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:seimproper, sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:seimproper, sv0, sv1, sv2, sv3, sv4, sv5) +#endif for (int n = nfrom; n < nto; n++) { #else for (int n = nfrom; n < nto; n += npl) { @@ -276,7 +280,11 @@ void ImproperHarmonicIntel::eval(const int vflag, // apply force to each of 4 atoms #ifdef LMP_INTEL_USE_SIMDOFF +#if defined(USE_OMP_SIMD) + #pragma omp ordered simd +#else #pragma simdoff +#endif #endif { if (NEWTON_BOND || i1 < nlocal) { diff --git a/src/INTEL/intel_intrinsics.h b/src/INTEL/intel_intrinsics.h index 295310283d..567f04c5dc 100644 --- a/src/INTEL/intel_intrinsics.h +++ b/src/INTEL/intel_intrinsics.h @@ -127,7 +127,8 @@ struct vector_ops { } template static fvec gather(const fvec &from, bvec mask, const ivec &idx, const void *base) { - return _mm512_mask_i32logather_pd(from, mask, idx, base, scale); + return _mm512_mask_i32gather_pd(from, mask, _mm512_castsi512_si256(idx), + base, scale); } static fvec blend(const bvec &mask, const fvec &a, const fvec &b) { return _mm512_mask_blend_pd(mask, a, b); diff --git a/src/INTEL/intel_intrinsics_airebo.h b/src/INTEL/intel_intrinsics_airebo.h index ac58ca2438..ea29888ea1 100644 --- a/src/INTEL/intel_intrinsics_airebo.h +++ b/src/INTEL/intel_intrinsics_airebo.h @@ -511,7 +511,8 @@ public: const int scale) { assert(scale == sizeof(FVEC_SCAL_T)); # if FVEC_LEN==8 - return FVEC_SUFFIX(_mm512_i32logather_)(idx.val_, mem, sizeof(FVEC_SCAL_T)); + return FVEC_SUFFIX(_mm512_i32gather_)(_mm512_castsi512_si256(idx.val_), + mem, sizeof(FVEC_SCAL_T)); # else return FVEC_SUFFIX(_mm512_i32gather_)(idx.val_, mem, sizeof(FVEC_SCAL_T)); # endif @@ -522,8 +523,8 @@ public: ) { assert(scale == sizeof(FVEC_SCAL_T)); # if FVEC_LEN==8 - return FVEC_SUFFIX(_mm512_mask_i32logather_)(src.val_, mask.val_, idx.val_, - mem, sizeof(FVEC_SCAL_T)); + return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, + _mm512_castsi512_si256(idx.val_), mem, sizeof(FVEC_SCAL_T)); # else return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, idx.val_, mem, sizeof(FVEC_SCAL_T)); @@ -609,8 +610,8 @@ public: ) { assert(scale == sizeof(FVEC_SCAL_T)); # if FVEC_LEN==8 - return FVEC_SUFFIX(_mm512_mask_i32logather_)(src.val_, mask.val_, idx.val_, - mem, sizeof(FVEC_SCAL_T)); + return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, + _mm512_castsi512_si256(idx.val_), mem, sizeof(FVEC_SCAL_T)); # else return FVEC_SUFFIX(_mm512_mask_i32gather_)(src.val_, mask.val_, idx.val_, mem, sizeof(FVEC_SCAL_T)); @@ -622,8 +623,9 @@ public: ) { assert(scale == sizeof(FVEC_SCAL_T)); # if FVEC_LEN==8 - FVEC_SUFFIX(_mm512_mask_i32loscatter_)(mem, mask.val_, idx.val_, a.val_, - sizeof(FVEC_SCAL_T)); + FVEC_SUFFIX(_mm512_mask_i32scatter_)(mem, mask.val_, + _mm512_castsi512_si256(idx.val_), + a.val_, sizeof(FVEC_SCAL_T)); # else FVEC_SUFFIX(_mm512_mask_i32scatter_)(mem, mask.val_, idx.val_, a.val_, sizeof(FVEC_SCAL_T)); @@ -666,11 +668,11 @@ public: const double * mem, const int scale ) { assert(scale == sizeof(double)); - __m512d lo = _mm512_mask_i32logather_pd(src.lo_, mask.val_, idx.val_, mem, - sizeof(double)); - __m512d hi = _mm512_mask_i32logather_pd(src.hi_, get_bvec_hi(mask.val_), - get_ivec_hi(idx.val_), mem, - sizeof(double)); + __m512d lo = _mm512_mask_i32gather_pd(src.lo_, mask.val_, + _mm512_castsi512_si256(idx.val_), + mem, sizeof(double)); + __m512d hi = _mm512_mask_i32gather_pd(src.hi_, get_bvec_hi(mask.val_), + _mm512_castsi512_si256(get_ivec_hi(idx.val_)), mem, sizeof(double)); return avec16pd(lo, hi); } VEC_INLINE static void mask_i32loscatter( @@ -678,10 +680,12 @@ public: const avec16pd &a, const int scale ) { assert(scale == sizeof(double)); - _mm512_mask_i32loscatter_pd(mem, mask.val_, idx.val_, a.lo_, - sizeof(double)); - _mm512_mask_i32loscatter_pd(mem, get_bvec_hi(mask.val_), - get_ivec_hi(idx.val_), a.hi_, sizeof(double)); + _mm512_mask_i32scatter_pd(mem, mask.val_, + _mm512_castsi512_si256(idx.val_), a.lo_, + sizeof(double)); + _mm512_mask_i32scatter_pd(mem, get_bvec_hi(mask.val_), + _mm512_castsi512_si256(get_ivec_hi(idx.val_)), + a.hi_, sizeof(double)); } #define AVEC2_BINOP(the_sym, the_name) \ diff --git a/src/INTEL/intel_preprocess.h b/src/INTEL/intel_preprocess.h index 0bec9935db..41c91d1578 100644 --- a/src/INTEL/intel_preprocess.h +++ b/src/INTEL/intel_preprocess.h @@ -17,8 +17,13 @@ ------------------------------------------------------------------------- */ #ifdef __INTEL_LLVM_COMPILER +#define USE_OMP_SIMD #define __INTEL_COMPILER __INTEL_LLVM_COMPILER #define __INTEL_COMPILER_BUILD_DATE __INTEL_LLVM_COMPILER +#define _MM_SCALE_1 1 +#define _MM_SCALE_2 2 +#define _MM_SCALE_4 4 +#define _MM_SCALE_8 8 #endif #ifdef __INTEL_COMPILER @@ -332,6 +337,9 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, #endif +// TO BE DEPRECATED +#ifndef USE_OMP_SIMD + #define IP_PRE_fdotr_acc_force_l5(lf, lt, minlocal, nthreads, f_start, \ f_stride, pos, ov0, ov1, ov2, \ ov3, ov4, ov5) \ @@ -526,6 +534,198 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, } \ } +#else + +#define IP_PRE_fdotr_acc_force_l5(lf, lt, minlocal, nthreads, f_start, \ + f_stride, pos, ov0, ov1, ov2, \ + ov3, ov4, ov5) \ +{ \ + acc_t *f_scalar = &f_start[0].x; \ + flt_t *x_scalar = &pos[minlocal].x; \ + int f_stride4 = f_stride * 4; \ + _alignvar(acc_t ovv[16],64); \ + int vwidth; \ + if (sizeof(acc_t) == sizeof(double)) \ + vwidth = INTEL_COMPILE_WIDTH/2; \ + else \ + vwidth = INTEL_COMPILE_WIDTH; \ + if (vwidth < 4) vwidth = 4; \ + _use_simd_pragma("omp simd aligned(ovv:64)") \ + for (int v = 0; v < vwidth; v++) ovv[v] = (acc_t)0.0; \ + int remainder = lt % vwidth; \ + if (lf > lt) remainder = 0; \ + const int v_range = lt - remainder; \ + if (nthreads == 2) { \ + acc_t *f_scalar2 = f_scalar + f_stride4; \ + for (int n = lf; n < v_range; n += vwidth) { \ + _use_simd_pragma("omp simd aligned(f_scalar,f_scalar2,ovv,x_scalar:64)")\ + for (int v = 0; v < vwidth; v++) { \ + f_scalar[n+v] += f_scalar2[n+v]; \ + ovv[v] += f_scalar[n+v] * x_scalar[n+v]; \ + } \ + ov3 += f_scalar[n+1] * x_scalar[n+0]; \ + ov4 += f_scalar[n+2] * x_scalar[n+0]; \ + ov5 += f_scalar[n+2] * x_scalar[n+1]; \ + if (vwidth > 4) { \ + ov3 += f_scalar[n+5] * x_scalar[n+4]; \ + ov4 += f_scalar[n+6] * x_scalar[n+4]; \ + ov5 += f_scalar[n+6] * x_scalar[n+5]; \ + } \ + if (vwidth > 8) { \ + ov3 += f_scalar[n+9] * x_scalar[n+8]; \ + ov3 += f_scalar[n+13] * x_scalar[n+12]; \ + ov4 += f_scalar[n+10] * x_scalar[n+8]; \ + ov4 += f_scalar[n+14] * x_scalar[n+12]; \ + ov5 += f_scalar[n+10] * x_scalar[n+9]; \ + ov5 += f_scalar[n+14] * x_scalar[n+13]; \ + } \ + } \ + _use_simd_pragma("vector aligned") \ + _use_simd_pragma("ivdep") \ + _use_simd_pragma("loop_count min(4) max(INTEL_COMPILE_WIDTH)") \ + for (int n = v_range; n < lt; n++) \ + f_scalar[n] += f_scalar2[n]; \ + } else if (nthreads==4) { \ + acc_t *f_scalar2 = f_scalar + f_stride4; \ + acc_t *f_scalar3 = f_scalar2 + f_stride4; \ + acc_t *f_scalar4 = f_scalar3 + f_stride4; \ + for (int n = lf; n < v_range; n += vwidth) { \ + _use_simd_pragma("omp simd aligned(f_scalar,f_scalar2,f_scalar3,f_scalar4,ovv:64)") \ + for (int v = 0; v < vwidth; v++) { \ + f_scalar[n+v] += f_scalar2[n+v] + f_scalar3[n+v] + \ + f_scalar4[n+v]; \ + ovv[v] += f_scalar[n+v] * x_scalar[n+v]; \ + } \ + ov3 += f_scalar[n+1] * x_scalar[n+0]; \ + ov4 += f_scalar[n+2] * x_scalar[n+0]; \ + ov5 += f_scalar[n+2] * x_scalar[n+1]; \ + if (vwidth > 4) { \ + ov3 += f_scalar[n+5] * x_scalar[n+4]; \ + ov4 += f_scalar[n+6] * x_scalar[n+4]; \ + ov5 += f_scalar[n+6] * x_scalar[n+5]; \ + } \ + if (vwidth > 8) { \ + ov3 += f_scalar[n+9] * x_scalar[n+8]; \ + ov3 += f_scalar[n+13] * x_scalar[n+12]; \ + ov4 += f_scalar[n+10] * x_scalar[n+8]; \ + ov4 += f_scalar[n+14] * x_scalar[n+12]; \ + ov5 += f_scalar[n+10] * x_scalar[n+9]; \ + ov5 += f_scalar[n+14] * x_scalar[n+13]; \ + } \ + } \ + _use_simd_pragma("vector aligned") \ + _use_simd_pragma("ivdep") \ + _use_simd_pragma("loop_count min(4) max(INTEL_COMPILE_WIDTH)") \ + for (int n = v_range; n < lt; n++) \ + f_scalar[n] += f_scalar2[n] + f_scalar3[n] + f_scalar4[n]; \ + } else if (nthreads==1) { \ + for (int n = lf; n < v_range; n += vwidth) { \ + _use_simd_pragma("omp simd aligned(ovv,f_scalar,x_scalar:64)") \ + for (int v = 0; v < vwidth; v++) \ + ovv[v] += f_scalar[n+v] * x_scalar[n+v]; \ + ov3 += f_scalar[n+1] * x_scalar[n+0]; \ + ov4 += f_scalar[n+2] * x_scalar[n+0]; \ + ov5 += f_scalar[n+2] * x_scalar[n+1]; \ + if (vwidth > 4) { \ + ov3 += f_scalar[n+5] * x_scalar[n+4]; \ + ov4 += f_scalar[n+6] * x_scalar[n+4]; \ + ov5 += f_scalar[n+6] * x_scalar[n+5]; \ + } \ + if (vwidth > 8) { \ + ov3 += f_scalar[n+9] * x_scalar[n+8]; \ + ov3 += f_scalar[n+13] * x_scalar[n+12]; \ + ov4 += f_scalar[n+10] * x_scalar[n+8]; \ + ov4 += f_scalar[n+14] * x_scalar[n+12]; \ + ov5 += f_scalar[n+10] * x_scalar[n+9]; \ + ov5 += f_scalar[n+14] * x_scalar[n+13]; \ + } \ + } \ + } else if (nthreads==3) { \ + acc_t *f_scalar2 = f_scalar + f_stride4; \ + acc_t *f_scalar3 = f_scalar2 + f_stride4; \ + for (int n = lf; n < v_range; n += vwidth) { \ + _use_simd_pragma("omp simd aligned(f_scalar,f_scalar2,f_scalar3,ovv,x_scalar:64)") \ + for (int v = 0; v < vwidth; v++) { \ + f_scalar[n+v] += f_scalar2[n+v] + f_scalar3[n+v]; \ + ovv[v] += f_scalar[n+v] * x_scalar[n+v]; \ + } \ + ov3 += f_scalar[n+1] * x_scalar[n+0]; \ + ov4 += f_scalar[n+2] * x_scalar[n+0]; \ + ov5 += f_scalar[n+2] * x_scalar[n+1]; \ + if (vwidth > 4) { \ + ov3 += f_scalar[n+5] * x_scalar[n+4]; \ + ov4 += f_scalar[n+6] * x_scalar[n+4]; \ + ov5 += f_scalar[n+6] * x_scalar[n+5]; \ + } \ + if (vwidth > 8) { \ + ov3 += f_scalar[n+9] * x_scalar[n+8]; \ + ov3 += f_scalar[n+13] * x_scalar[n+12]; \ + ov4 += f_scalar[n+10] * x_scalar[n+8]; \ + ov4 += f_scalar[n+14] * x_scalar[n+12]; \ + ov5 += f_scalar[n+10] * x_scalar[n+9]; \ + ov5 += f_scalar[n+14] * x_scalar[n+13]; \ + } \ + } \ + _use_simd_pragma("vector aligned") \ + _use_simd_pragma("ivdep") \ + _use_simd_pragma("loop_count min(4) max(INTEL_COMPILE_WIDTH)") \ + for (int n = v_range; n < lt; n++) \ + f_scalar[n] += f_scalar2[n] + f_scalar3[n]; \ + } \ + for (int n = v_range; n < lt; n += 4) { \ + _use_simd_pragma("vector aligned") \ + _use_simd_pragma("ivdep") \ + for (int v = 0; v < 4; v++) \ + ovv[v] += f_scalar[n+v] * x_scalar[n+v]; \ + ov3 += f_scalar[n+1] * x_scalar[n+0]; \ + ov4 += f_scalar[n+2] * x_scalar[n+0]; \ + ov5 += f_scalar[n+2] * x_scalar[n+1]; \ + } \ + ov0 += ovv[0]; \ + ov1 += ovv[1]; \ + ov2 += ovv[2]; \ + if (vwidth > 4) { \ + ov0 += ovv[4]; \ + ov1 += ovv[5]; \ + ov2 += ovv[6]; \ + } \ + if (vwidth > 8) { \ + ov0 += ovv[8] + ovv[12]; \ + ov1 += ovv[9] + ovv[13]; \ + ov2 += ovv[10] + ovv[14]; \ + } \ +} + +#define IP_PRE_fdotr_acc_force(nall, minlocal, nthreads, f_start, \ + f_stride, pos, offload, vflag, ov0, ov1, \ + ov2, ov3, ov4, ov5) \ +{ \ + int o_range = (nall - minlocal) * 4; \ + IP_PRE_omp_range_id_align(iifrom, iito, tid, o_range, nthreads, \ + sizeof(acc_t)); \ + \ + acc_t *f_scalar = &f_start[0].x; \ + int f_stride4 = f_stride * 4; \ + int t; \ + if (vflag == VIRIAL_FDOTR) t = 4; else t = 1; \ + acc_t *f_scalar2 = f_scalar + f_stride4 * t; \ + for ( ; t < nthreads; t++) { \ + _use_simd_pragma("omp simd aligned(f_scalar,f_scalar2:64)") \ + for (int n = iifrom; n < iito; n++) \ + f_scalar[n] += f_scalar2[n]; \ + f_scalar2 += f_stride4; \ + } \ + \ + if (vflag == VIRIAL_FDOTR) { \ + int nt_min = MIN(4,nthreads); \ + IP_PRE_fdotr_acc_force_l5(iifrom, iito, minlocal, nt_min, f_start, \ + f_stride, pos, ov0, ov1, ov2, ov3, ov4, \ + ov5); \ + } \ +} + +#endif + #ifdef _LMP_INTEL_OFFLOAD #include diff --git a/src/INTEL/intel_simd.h b/src/INTEL/intel_simd.h index 165455a33d..eb5d9857a5 100644 --- a/src/INTEL/intel_simd.h +++ b/src/INTEL/intel_simd.h @@ -173,7 +173,7 @@ namespace ip_simd { } inline SIMD_double SIMD_gather(const double *p, const SIMD_int &i) { - return _mm512_i32logather_pd(i, p, _MM_SCALE_8); + return _mm512_i32gather_pd(_mm512_castsi512_si256(i), p, _MM_SCALE_8); } inline SIMD_int SIMD_gather(const SIMD_mask &m, const int *p, @@ -190,8 +190,8 @@ namespace ip_simd { inline SIMD_double SIMD_gather(const SIMD_mask &m, const double *p, const SIMD_int &i) { - return _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, p, - _MM_SCALE_8); + return _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), p, _MM_SCALE_8); } template @@ -227,8 +227,8 @@ namespace ip_simd { inline SIMD_double SIMD_gatherz(const SIMD_mask &m, const double *p, const SIMD_int &i) { - return _mm512_mask_i32logather_pd( _mm512_set1_pd(0.0), m, i, p, - _MM_SCALE_8); + return _mm512_mask_i32gather_pd( _mm512_set1_pd(0.0), m, + _mm512_castsi512_si256(i),p, _MM_SCALE_8); } // ------- Store Operations @@ -257,7 +257,8 @@ namespace ip_simd { inline void SIMD_scatter(const SIMD_mask &m, double *p, const SIMD_int &i, const SIMD_double &vec) { - _mm512_mask_i32loscatter_pd(p, m, i, vec, _MM_SCALE_8); + _mm512_mask_i32scatter_pd(p, m, _mm512_castsi512_si256(i), vec, + _MM_SCALE_8); } // ------- Arithmetic Operations @@ -834,23 +835,29 @@ namespace ip_simd { inline void SIMD_atom_gather(const SIMD_mask &m, const double *atom, const SIMD_int &i, SIMD_double &x, SIMD_double &y, SIMD_double &z) { - x = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom, - _MM_SCALE_2); - y = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom+1, - _MM_SCALE_2); - z = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom+2, - _MM_SCALE_2); + x = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom, + _MM_SCALE_2); + y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom+1, + _MM_SCALE_2); + z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom+2, + _MM_SCALE_2); } inline void SIMD_atom_gather(const SIMD_mask &m, const double *atom, const SIMD_int &i, SIMD_double &x, SIMD_double &y, SIMD_double &z, SIMD_int &type) { - x = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom, - _MM_SCALE_2); - y = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom+1, - _MM_SCALE_2); - z = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, atom+2, - _MM_SCALE_2); + x = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom, + _MM_SCALE_2); + y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom+1, + _MM_SCALE_2); + z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), atom+2, + _MM_SCALE_2); type = _mm512_mask_i32gather_epi32(_mm512_undefined_epi32(), m, i, atom+3, _MM_SCALE_2); } @@ -888,10 +895,12 @@ namespace ip_simd { const SIMD_int &joffset, SIMD_double &eng) { SIMD_double jeng; SIMD_conflict_pi_reduce1(rmask, joffset, eng); - jeng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force, _MM_SCALE_2); + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force, _MM_SCALE_2); jeng = jeng + eng; - _mm512_mask_i32loscatter_pd(force, rmask, joffset, jeng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask, _mm512_castsi512_si256(joffset), + jeng, _MM_SCALE_2); } inline void SIMD_jeng_update(const SIMD_mask &rmask, double *force, @@ -899,20 +908,24 @@ namespace ip_simd { SIMD_double engd, jeng; engd = _mm512_cvtps_pd(_mm512_castps512_ps256(eng)); SIMD_conflict_pi_reduce1(rmask, joffset, engd); - jeng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force, _MM_SCALE_2); + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force, _MM_SCALE_2); jeng = jeng + engd; - _mm512_mask_i32loscatter_pd(force, rmask, joffset, jeng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask, _mm512_castsi512_si256(joffset), + jeng, _MM_SCALE_2); SIMD_mask rmask2 = rmask >> 8; engd = _mm512_cvtps_pd(_mm512_castps512_ps256( _mm512_shuffle_f32x4(eng,eng,238))); SIMD_int joffset2 = _mm512_shuffle_i32x4(joffset, joffset, 238); SIMD_conflict_pi_reduce1(rmask2, joffset2, engd); - jeng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask2, joffset2, - force, _MM_SCALE_2); + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + _mm512_castsi512_si256(joffset2), + force, _MM_SCALE_2); jeng = jeng + engd; - _mm512_mask_i32loscatter_pd(force, rmask2, joffset2, jeng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask2, _mm512_castsi512_si256(joffset2), + jeng, _MM_SCALE_2); } inline void SIMD_jeng_update_hi(const SIMD_mask &mask, float *force, @@ -926,10 +939,12 @@ namespace ip_simd { SIMD_double jeng; SIMD_conflict_pi_reduce1(rmask, joffset, eng); - jeng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force, _MM_SCALE_2); + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force, _MM_SCALE_2); jeng = jeng + eng; - _mm512_mask_i32loscatter_pd(force, rmask, joffset, jeng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask, _mm512_castsi512_si256(joffset), + jeng, _MM_SCALE_2); } inline void SIMD_safe_jforce(const SIMD_mask &m, float *force, @@ -956,18 +971,24 @@ namespace ip_simd { SIMD_double &fy, SIMD_double &fz) { SIMD_conflict_pi_reduce3(m, i, fx, fy, fz); SIMD_double jfrc; - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force, - _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force, + _MM_SCALE_2); jfrc = jfrc + fx; - _mm512_mask_i32loscatter_pd(force, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 1, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 1, + _MM_SCALE_2); jfrc = jfrc + fy; - _mm512_mask_i32loscatter_pd(force+1, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 2, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+1, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 2, + _MM_SCALE_2); jfrc = jfrc + fz; - _mm512_mask_i32loscatter_pd(force+2, m, i, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+2, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); } inline void SIMD_safe_jforce(const SIMD_mask &rmask, double *force, @@ -979,40 +1000,54 @@ namespace ip_simd { amzd = _mm512_cvtps_pd(_mm512_castps512_ps256(amz)); SIMD_conflict_pi_reduce3(rmask, joffset, amxd, amyd, amzd); SIMD_double jfrc; - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force, _MM_SCALE_2); jfrc = jfrc + amxd; - _mm512_mask_i32loscatter_pd(force, rmask, joffset, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force + 1, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask, _mm512_castsi512_si256(joffset), + jfrc, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force + 1, _MM_SCALE_2); jfrc = jfrc + amyd; - _mm512_mask_i32loscatter_pd(force+1, rmask, joffset, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask, joffset, - force + 2, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+1, rmask, _mm512_castsi512_si256(joffset), + jfrc, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + _mm512_castsi512_si256(joffset), + force + 2, _MM_SCALE_2); jfrc = jfrc + amzd; - _mm512_mask_i32loscatter_pd(force+2, rmask, joffset, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+2, rmask, _mm512_castsi512_si256(joffset), + jfrc, _MM_SCALE_2); SIMD_mask rmask2 = rmask >> 8; amxd = _mm512_cvtps_pd(_mm512_castps512_ps256( - _mm512_shuffle_f32x4(amx,amx,238))); + _mm512_shuffle_f32x4(amx,amx,238))); amyd = _mm512_cvtps_pd(_mm512_castps512_ps256( - _mm512_shuffle_f32x4(amy,amy,238))); + _mm512_shuffle_f32x4(amy,amy,238))); amzd = _mm512_cvtps_pd(_mm512_castps512_ps256( - _mm512_shuffle_f32x4(amz,amz,238))); + _mm512_shuffle_f32x4(amz,amz,238))); SIMD_int joffset2 = _mm512_shuffle_i32x4(joffset, joffset, 238); SIMD_conflict_pi_reduce3(rmask2, joffset2, amxd, amyd, amzd); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask2, joffset2, - force, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + _mm512_castsi512_si256(joffset2), + force, _MM_SCALE_2); jfrc = jfrc + amxd; - _mm512_mask_i32loscatter_pd(force, rmask2, joffset2, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask2, joffset2, - force + 1, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, rmask2, _mm512_castsi512_si256(joffset2), + jfrc, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + _mm512_castsi512_si256(joffset2), + force + 1, _MM_SCALE_2); jfrc = jfrc + amyd; - _mm512_mask_i32loscatter_pd(force+1, rmask2, joffset2, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), rmask2, joffset2, - force + 2, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+1, rmask2, + _mm512_castsi512_si256(joffset2), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + _mm512_castsi512_si256(joffset2), + force + 2, _MM_SCALE_2); jfrc = jfrc + amzd; - _mm512_mask_i32loscatter_pd(force+2, rmask2, joffset2, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+2, rmask2, + _mm512_castsi512_si256(joffset2), jfrc, + _MM_SCALE_2); } inline void SIMD_jforce_update(const SIMD_mask &m, float *force, @@ -1064,18 +1099,24 @@ namespace ip_simd { const SIMD_int &i, const SIMD_double &fx, const SIMD_double &fy, const SIMD_double &fz) { SIMD_double jfrc; - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force, - _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force, + _MM_SCALE_2); jfrc = jfrc - fx; - _mm512_mask_i32loscatter_pd(force, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 1, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 1, + _MM_SCALE_2); jfrc = jfrc - fy; - _mm512_mask_i32loscatter_pd(force+1, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 2, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+1, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 2, + _MM_SCALE_2); jfrc = jfrc - fz; - _mm512_mask_i32loscatter_pd(force+2, m, i, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+2, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); } inline void SIMD_jforce_update(const SIMD_mask &rmask, @@ -1502,11 +1543,12 @@ namespace ip_simd { fwtmp = SIMD_add(fwtmp, hmask, fwtmp, hevdwl); fjtmp = SIMD_add(fjtmp, hmask, fjtmp, hevdwl); SIMD_conflict_pi_reduce1(hmask, k, hevdwl); - SIMD_double keng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), - hmask, k, force + 3, - _MM_SCALE_2); + SIMD_double keng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), hmask, + _mm512_castsi512_si256(k), + force + 3, _MM_SCALE_2); keng = keng + hevdwl; - _mm512_mask_i32loscatter_pd(force + 3, hmask, k, keng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force + 3, hmask, _mm512_castsi512_si256(k), + keng, _MM_SCALE_2); } } @@ -1523,11 +1565,12 @@ namespace ip_simd { fwtmp = SIMD_add(fwtmp, hmask, fwtmp, hevdwl); fjtmp = SIMD_add(fjtmp, hmask, fjtmp, hevdwl); SIMD_conflict_pi_reduce1(hmask, k, hevdwl); - SIMD_double keng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), - hmask, k, force + 3, - _MM_SCALE_2); + SIMD_double keng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), hmask, + _mm512_castsi512_si256(k), + force + 3, _MM_SCALE_2); keng = keng + hevdwl; - _mm512_mask_i32loscatter_pd(force + 3, hmask, k, keng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force + 3, hmask, _mm512_castsi512_si256(k), + keng, _MM_SCALE_2); } SIMD_mask hmask2 = hmask >> 8; facradd = _mm512_cvtps_pd(_mm512_castps512_ps256( @@ -1539,11 +1582,13 @@ namespace ip_simd { fjtmp2 = SIMD_add(fjtmp2, hmask2, fjtmp2, hevdwl); SIMD_int k2 = _mm512_shuffle_i32x4(k, k, 238); SIMD_conflict_pi_reduce1(hmask2, k2, hevdwl); - SIMD_double keng = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), - hmask2, k2, force + 3, - _MM_SCALE_2); + SIMD_double keng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), + hmask2, + _mm512_castsi512_si256(k2), + force + 3, _MM_SCALE_2); keng = keng + hevdwl; - _mm512_mask_i32loscatter_pd(force + 3, hmask2, k2, keng, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force + 3, hmask2, _mm512_castsi512_si256(k2), + keng, _MM_SCALE_2); } } @@ -1815,24 +1860,32 @@ namespace ip_simd { const int EFLAG, const int eatom, const SIMD_double &fwtmp) { SIMD_double jfrc; - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force, - _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force, + _MM_SCALE_2); jfrc = jfrc + fx; - _mm512_mask_i32loscatter_pd(force, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 1, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 1, + _MM_SCALE_2); jfrc = jfrc + fy; - _mm512_mask_i32loscatter_pd(force+1, m, i, jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, force + 2, - _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+1, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), force + 2, + _MM_SCALE_2); jfrc = jfrc + fz; - _mm512_mask_i32loscatter_pd(force+2, m, i, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+2, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); if (EFLAG) { if (eatom) { - jfrc = _mm512_mask_i32logather_pd(_mm512_undefined_pd(), m, i, - force + 3, _MM_SCALE_2); + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + _mm512_castsi512_si256(i), + force + 3, _MM_SCALE_2); jfrc = jfrc + fwtmp; - _mm512_mask_i32loscatter_pd(force+3, m, i, jfrc, _MM_SCALE_2); + _mm512_mask_i32scatter_pd(force+3, m, _mm512_castsi512_si256(i), jfrc, + _MM_SCALE_2); } } } diff --git a/src/INTEL/npair_full_bin_ghost_intel.cpp b/src/INTEL/npair_full_bin_ghost_intel.cpp index 082f95721f..e96f2c713d 100644 --- a/src/INTEL/npair_full_bin_ghost_intel.cpp +++ b/src/INTEL/npair_full_bin_ghost_intel.cpp @@ -324,7 +324,11 @@ void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, const int bstart = binhead[ibin + binstart[k]]; const int bend = binhead[ibin + binend[k]]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int jj = bstart; jj < bend; jj++) tj[ncount++] = binpacked[jj]; @@ -345,15 +349,23 @@ void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, const int bstart = binhead[ibin + stencil[k]]; const int bend = binhead[ibin + stencil[k] + 1]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int jj = bstart; jj < bend; jj++) tj[ncount++] = binpacked[jj]; } } // if i < nlocal #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int u = 0; u < ncount; u++) { const int j = tj[u]; @@ -425,12 +437,16 @@ void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, int alln = n; n = 0; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #ifdef LMP_INTEL_NBOR_COMPAT #pragma ivdep #else +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif + #pragma vector aligned #endif for (int u = 0; u < alln; u++) { int which; @@ -454,12 +470,16 @@ void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, alln = n2; n2 = maxnbors * 2; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #ifdef LMP_INTEL_NBOR_COMPAT #pragma ivdep #else +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif + #pragma vector aligned #endif for (int u = n2; u < alln; u++) { int which; diff --git a/src/INTEL/npair_intel.cpp b/src/INTEL/npair_intel.cpp index 643ceff8f3..395e50006c 100644 --- a/src/INTEL/npair_intel.cpp +++ b/src/INTEL/npair_intel.cpp @@ -344,14 +344,22 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const int bstart = binhead[ibin + binstart[k]]; const int bend = binhead[ibin + binend[k]]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int jj = bstart; jj < bend; jj++) tj[ncount++] = binpacked[jj]; } #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int u = 0; u < ncount; u++) { const int j = tj[u]; @@ -375,7 +383,11 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, const int bstart = binhead[ibin]; const int bend = binhead[ibin + 1]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int jj = bstart; jj < bend; jj++) { const int j = binpacked[jj]; @@ -533,12 +545,16 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, n = pack_offset; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #ifdef LMP_INTEL_NBOR_COMPAT #pragma ivdep #else +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif + #pragma vector aligned #endif for (int u = n; u < alln; u++) { int which; @@ -566,12 +582,16 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, n2 = pack_offset + maxnbors; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #ifdef LMP_INTEL_NBOR_COMPAT #pragma ivdep #else +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif + #pragma vector aligned #endif for (int u = n2; u < alln; u++) { int which; @@ -737,8 +757,14 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, int jnum = numneigh[i]; if (!THREE) IP_PRE_neighbor_pad(jnum, offload); #if __INTEL_COMPILER+0 > 1499 +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(max:vlmax,vgmax) \ + reduction(min:vlmin, vgmin) +#else + #pragma simd reduction(max:vlmax,vgmax) \ + reduction(min:vlmin, vgmin) +#endif #pragma vector aligned - #pragma simd reduction(max:vlmax,vgmax) reduction(min:vlmin, vgmin) #endif for (int jj = 0; jj < jnum; jj++) { const int j = jlist[jj] & NEIGHMASK; @@ -782,8 +808,12 @@ void NPairIntel::bin_newton(const int offload, NeighList *list, int jnum = numneigh[i]; if (!THREE) IP_PRE_neighbor_pad(jnum, offload); int jj = 0; - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned for (jj = 0; jj < jnum; jj++) { const int which = jlist[jj] >> SBBITS & 3; const int j = jlist[jj] & NEIGHMASK; diff --git a/src/INTEL/pair_buck_coul_cut_intel.cpp b/src/INTEL/pair_buck_coul_cut_intel.cpp index 99905bfaa0..c67450fbc1 100644 --- a/src/INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/INTEL/pair_buck_coul_cut_intel.cpp @@ -248,12 +248,18 @@ void PairBuckCoulCutIntel::eval(const int offload, const int vflag, fxtmp = fytmp = fztmp = (acc_t)0; if (EFLAG) fwtmp = sevdwl = secoul = (acc_t)0; if (NEWTON_PAIR == 0) - if (vflag == VIRIAL_PAIR) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; + if (vflag == VIRIAL_PAIR) + sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ sv0, sv1, sv2, sv3, sv4, sv5) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < jnum; jj++) { flt_t forcecoul, forcebuck, evdwl, ecoul; diff --git a/src/INTEL/pair_buck_coul_long_intel.cpp b/src/INTEL/pair_buck_coul_long_intel.cpp index 1566ec23b6..7c795d5914 100644 --- a/src/INTEL/pair_buck_coul_long_intel.cpp +++ b/src/INTEL/pair_buck_coul_long_intel.cpp @@ -309,9 +309,14 @@ void PairBuckCoulLongIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#else + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#endif #pragma vector aligned - #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, secoul, \ - sv0, sv1, sv2, sv3, sv4, sv5) #endif for (int jj = 0; jj < ej; jj++) { flt_t forcecoul, forcebuck, evdwl, ecoul; diff --git a/src/INTEL/pair_buck_intel.cpp b/src/INTEL/pair_buck_intel.cpp index 26ef13be9a..ddab17765b 100644 --- a/src/INTEL/pair_buck_intel.cpp +++ b/src/INTEL/pair_buck_intel.cpp @@ -230,12 +230,18 @@ void PairBuckIntel::eval(const int offload, const int vflag, fxtmp = fytmp = fztmp = (acc_t)0; if (EFLAG) fwtmp = sevdwl = (acc_t)0; if (NEWTON_PAIR == 0) - if (vflag == VIRIAL_PAIR) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; + if (vflag == VIRIAL_PAIR) + sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ sv0, sv1, sv2, sv3, sv4, sv5) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < jnum; jj++) { diff --git a/src/INTEL/pair_dpd_intel.cpp b/src/INTEL/pair_dpd_intel.cpp index e7514a1f95..a9eb4fe6a4 100644 --- a/src/INTEL/pair_dpd_intel.cpp +++ b/src/INTEL/pair_dpd_intel.cpp @@ -289,9 +289,14 @@ void PairDPDIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ - sv0, sv1, sv2, sv3, sv4, sv5) + sv0, sv1, sv2, sv3, sv4, sv5) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < jnum; jj++) { flt_t forcelj, evdwl; diff --git a/src/INTEL/pair_eam_intel.cpp b/src/INTEL/pair_eam_intel.cpp index dcff8957fd..13dbd60cb3 100644 --- a/src/INTEL/pair_eam_intel.cpp +++ b/src/INTEL/pair_eam_intel.cpp @@ -327,8 +327,12 @@ void PairEAMIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:rhoi) +#else #pragma simd reduction(+:rhoi) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < ej; jj++) { int jtype; @@ -369,23 +373,35 @@ void PairEAMIntel::eval(const int offload, const int vflag, const int rcount = nall; if (nthreads == 2) { double *trho2 = rho + nmax; - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned for (int n = 0; n < rcount; n++) rho[n] += trho2[n]; } else if (nthreads == 4) { double *trho2 = rho + nmax; double *trho3 = trho2 + nmax; double *trho4 = trho3 + nmax; - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned for (int n = 0; n < rcount; n++) rho[n] += trho2[n] + trho3[n] + trho4[n]; } else { double *trhon = rho + nmax; for (int t = 1; t < nthreads; t++) { - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned for (int n = 0; n < rcount; n++) rho[n] += trhon[n]; trhon += nmax; @@ -414,8 +430,12 @@ void PairEAMIntel::eval(const int offload, const int vflag, if (EFLAG) tevdwl = (acc_t)0.0; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:tevdwl) +#else #pragma simd reduction(+:tevdwl) +#endif + #pragma vector aligned #endif for (int ii = iifrom; ii < iito; ++ii) { const int i = ilist[ii]; @@ -510,9 +530,14 @@ void PairEAMIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ - sv0, sv1, sv2, sv3, sv4, sv5) + sv0, sv1, sv2, sv3, sv4, sv5) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < ej; jj++) { int jtype; diff --git a/src/INTEL/pair_gayberne_intel.cpp b/src/INTEL/pair_gayberne_intel.cpp index d7becc7585..c3abf68c12 100644 --- a/src/INTEL/pair_gayberne_intel.cpp +++ b/src/INTEL/pair_gayberne_intel.cpp @@ -449,9 +449,14 @@ void PairGayBerneIntel::eval(const int offload, const int vflag, __assume(packed_j % INTEL_MIC_VECTOR_WIDTH == 0); #endif #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp,fytmp,fztmp,fwtmp,t1tmp,t2tmp, \ + t3tmp,sevdwl,sv0,sv1,sv2,sv3,sv4,sv5) +#else + #pragma simd reduction(+:fxtmp,fytmp,fztmp,fwtmp,t1tmp,t2tmp, \ + t3tmp,sevdwl,sv0,sv1,sv2,sv3,sv4,sv5) +#endif #pragma vector aligned - #pragma simd reduction(+:fxtmp,fytmp,fztmp,fwtmp,t1tmp,t2tmp,t3tmp, \ - sevdwl,sv0,sv1,sv2,sv3,sv4,sv5) #endif for (int jj = 0; jj < packed_j; jj++) { flt_t a2_0, a2_1, a2_2, a2_3, a2_4, a2_5, a2_6, a2_7, a2_8; @@ -806,8 +811,12 @@ void PairGayBerneIntel::eval(const int offload, const int vflag, acc_t *f_scalar2 = f_scalar + fst4; for (int t = 1; t < nthreads; t++) { #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma vector aligned #endif for (int n = iifrom * 8; n < sto; n++) f_scalar[n] += f_scalar2[n]; diff --git a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp index ad8ef4d84f..ef26f8f2d5 100644 --- a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -294,9 +294,14 @@ void PairLJCharmmCoulCharmmIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#else + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#endif #pragma vector aligned - #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, secoul, \ - sv0, sv1, sv2, sv3, sv4, sv5) #endif for (int jj = 0; jj < ej; jj++) { flt_t forcecoul, forcelj, evdwl; diff --git a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp index a910c74acb..6f6bb3618e 100644 --- a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -314,9 +314,14 @@ void PairLJCharmmCoulLongIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#else + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#endif #pragma vector aligned - #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, secoul, \ - sv0, sv1, sv2, sv3, sv4, sv5) #endif for (int jj = 0; jj < ej; jj++) { flt_t forcecoul, forcelj, evdwl, ecoul; diff --git a/src/INTEL/pair_lj_cut_coul_long_intel.cpp b/src/INTEL/pair_lj_cut_coul_long_intel.cpp index 51e208314b..0d94fdb4c3 100644 --- a/src/INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_cut_coul_long_intel.cpp @@ -305,9 +305,14 @@ void PairLJCutCoulLongIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#else + #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + secoul, sv0, sv1, sv2, sv3, sv4, sv5) +#endif #pragma vector aligned - #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, secoul, \ - sv0, sv1, sv2, sv3, sv4, sv5) #endif for (int jj = 0; jj < ej; jj++) { flt_t forcecoul, forcelj, evdwl, ecoul; diff --git a/src/INTEL/pair_lj_cut_intel.cpp b/src/INTEL/pair_lj_cut_intel.cpp index 84bc664e18..cf84cb3ca5 100644 --- a/src/INTEL/pair_lj_cut_intel.cpp +++ b/src/INTEL/pair_lj_cut_intel.cpp @@ -241,9 +241,15 @@ void PairLJCutIntel::eval(const int offload, const int vflag, if (vflag == VIRIAL_PAIR) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ + sv0, sv1, sv2, sv3, sv4, sv5) \ + aligned(jlist,x,ljc12oi,special_lj,f,lj34i:64) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl, \ sv0, sv1, sv2, sv3, sv4, sv5) + #pragma vector aligned +#endif #endif for (int jj = 0; jj < jnum; jj++) { flt_t forcelj, evdwl; diff --git a/src/INTEL/pair_sw_intel.cpp b/src/INTEL/pair_sw_intel.cpp index 17dffa2843..57a6b29945 100644 --- a/src/INTEL/pair_sw_intel.cpp +++ b/src/INTEL/pair_sw_intel.cpp @@ -371,8 +371,12 @@ void PairSWIntel::eval(const int offload, const int vflag, } #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl) +#else #pragma simd reduction(+:fxtmp, fytmp, fztmp, fwtmp, sevdwl) +#endif + #pragma vector aligned #endif for (int jj = 0; jj < ejnum_pad; jj++) { acc_t fjxtmp, fjytmp, fjztmp, fjtmp; diff --git a/src/INTEL/pppm_disp_intel.cpp b/src/INTEL/pppm_disp_intel.cpp index 8d4ed1778d..6b732ccfac 100644 --- a/src/INTEL/pppm_disp_intel.cpp +++ b/src/INTEL/pppm_disp_intel.cpp @@ -770,8 +770,12 @@ void PPPMDispIntel::particle_map(double delx, double dely, double delz, IP_PRE_omp_range_id_align(iifrom, iito, tid, nlocal, nthr, sizeof(ATOM_T)); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:flag) +#else #pragma simd reduction(+:flag) +#endif + #pragma vector aligned #endif for (int i = iifrom; i < iito; i++) { @@ -876,7 +880,11 @@ void PPPMDispIntel::make_rho_c(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho_lookup[idx][k]; @@ -885,7 +893,11 @@ void PPPMDispIntel::make_rho_c(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1,r2,r3; @@ -917,8 +929,12 @@ void PPPMDispIntel::make_rho_c(IntelBuffers * /*buffers*/) int mzy = m*nix + mz; FFT_SCALAR x0 = y0*rho[1][m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mzyx = l + mzy; @@ -939,7 +955,11 @@ void PPPMDispIntel::make_rho_c(IntelBuffers * /*buffers*/) IP_PRE_omp_range_id(ifrom, ito, tid, ngrid, nthr); #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { for (int j = 1; j < nthr; j++) { @@ -1025,7 +1045,11 @@ void PPPMDispIntel::make_rho_g(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -1034,7 +1058,11 @@ void PPPMDispIntel::make_rho_g(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3; @@ -1067,8 +1095,12 @@ void PPPMDispIntel::make_rho_g(IntelBuffers * /*buffers*/) int mzy = m*nix + mz; FFT_SCALAR x0 = y0*rho[1][m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mzyx = l + mzy; @@ -1089,7 +1121,11 @@ void PPPMDispIntel::make_rho_g(IntelBuffers * /*buffers*/) IP_PRE_omp_range_id(ifrom, ito, tid, ngrid_6, nthr); #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { for (int j = 1; j < nthr; j++) { @@ -1173,7 +1209,11 @@ void PPPMDispIntel::make_rho_a(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -1182,7 +1222,11 @@ void PPPMDispIntel::make_rho_a(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3; @@ -1215,8 +1259,12 @@ void PPPMDispIntel::make_rho_a(IntelBuffers * /*buffers*/) int my = m + nysum; FFT_SCALAR x0 = y0*rho[1][m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l + nxsum; @@ -1307,7 +1355,11 @@ void PPPMDispIntel::make_rho_none(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -1316,7 +1368,11 @@ void PPPMDispIntel::make_rho_none(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3; @@ -1349,8 +1405,12 @@ void PPPMDispIntel::make_rho_none(IntelBuffers * /*buffers*/) int mzy = m*nix + mz; FFT_SCALAR x0 = y0*rho[1][m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mzyx = l + mzy; @@ -1373,7 +1433,11 @@ void PPPMDispIntel::make_rho_none(IntelBuffers * /*buffers*/) IP_PRE_omp_range_id(ifrom, ito, tid, ngrid_6*nsplit, nthr); #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { for (int j = 1; j < nthr; j++) { @@ -1454,7 +1518,11 @@ void PPPMDispIntel::fieldforce_c_ik(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho0[k] = rho_lookup[idx][k]; @@ -1463,7 +1531,11 @@ void PPPMDispIntel::fieldforce_c_ik(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1 = rho_coeff[order-1][k]; @@ -1498,8 +1570,12 @@ void PPPMDispIntel::fieldforce_c_ik(IntelBuffers * /*buffers*/) int my = m+nysum; FFT_SCALAR y0 = z0*rho1[m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l+nxsum; @@ -1624,7 +1700,11 @@ void PPPMDispIntel::fieldforce_c_ad(IntelBuffers * /*buffers*/) int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho_lookup[idx][k]; @@ -1636,7 +1716,11 @@ void PPPMDispIntel::fieldforce_c_ad(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1,r2,r3,dr1,dr2,dr3; @@ -1680,8 +1764,12 @@ void PPPMDispIntel::fieldforce_c_ad(IntelBuffers * /*buffers*/) FFT_SCALAR eky_p = drho[1][m] * rho[2][n]; FFT_SCALAR ekz_p = rho[1][m] * drho[2][n]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l + nxsum; @@ -1702,7 +1790,11 @@ void PPPMDispIntel::fieldforce_c_ad(IntelBuffers * /*buffers*/) } } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { particle_ekx[i] *= hx_inv; @@ -1802,7 +1894,11 @@ void PPPMDispIntel::fieldforce_g_ik(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho0[k] = rho6_lookup[idx][k]; @@ -1811,7 +1907,11 @@ void PPPMDispIntel::fieldforce_g_ik(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1 = rho_coeff_6[order_6-1][k]; @@ -1846,8 +1946,12 @@ void PPPMDispIntel::fieldforce_g_ik(IntelBuffers * /*buffers*/) int my = m+nysum; FFT_SCALAR y0 = z0*rho1[m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l+nxsum; @@ -1967,7 +2071,11 @@ void PPPMDispIntel::fieldforce_g_ad(IntelBuffers * /*buffers*/) int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -1979,7 +2087,11 @@ void PPPMDispIntel::fieldforce_g_ad(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3,dr1,dr2,dr3; @@ -2023,8 +2135,12 @@ void PPPMDispIntel::fieldforce_g_ad(IntelBuffers * /*buffers*/) FFT_SCALAR eky_p = drho[1][m] * rho[2][n]; FFT_SCALAR ekz_p = rho[1][m] * drho[2][n]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l + nxsum; @@ -2045,7 +2161,11 @@ void PPPMDispIntel::fieldforce_g_ad(IntelBuffers * /*buffers*/) } } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { particle_ekx[i] *= hx_inv; @@ -2143,7 +2263,11 @@ void PPPMDispIntel::fieldforce_a_ik(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho0[k] = rho6_lookup[idx][k]; @@ -2152,7 +2276,11 @@ void PPPMDispIntel::fieldforce_a_ik(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1 = rho_coeff_6[order_6-1][k]; @@ -2206,8 +2334,12 @@ void PPPMDispIntel::fieldforce_a_ik(IntelBuffers * /*buffers*/) int my = m+nysum; FFT_SCALAR y0 = z0*rho1[m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l+nxsum; @@ -2398,7 +2530,11 @@ void PPPMDispIntel::fieldforce_a_ad(IntelBuffers * /*buffers*/) int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -2410,7 +2546,11 @@ void PPPMDispIntel::fieldforce_a_ad(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3,dr1,dr2,dr3; @@ -2479,8 +2619,12 @@ void PPPMDispIntel::fieldforce_a_ad(IntelBuffers * /*buffers*/) FFT_SCALAR eky_p = drho[1][m] * rho[2][n]; FFT_SCALAR ekz_p = rho[1][m] * drho[2][n]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l + nxsum; @@ -2541,7 +2685,11 @@ void PPPMDispIntel::fieldforce_a_ad(IntelBuffers * /*buffers*/) } } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { particle_ekx0[i] *= hx_inv; @@ -2671,7 +2819,11 @@ void PPPMDispIntel::fieldforce_none_ik(IntelBuffers * /*buffers*/) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho0[k] = rho6_lookup[idx][k]; @@ -2680,7 +2832,11 @@ void PPPMDispIntel::fieldforce_none_ik(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1 = rho_coeff_6[order_6-1][k]; @@ -2721,8 +2877,12 @@ void PPPMDispIntel::fieldforce_none_ik(IntelBuffers * /*buffers*/) int my = m+nysum; FFT_SCALAR y0 = z0*rho1[m]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l+nxsum; @@ -2848,7 +3008,11 @@ void PPPMDispIntel::fieldforce_none_ad(IntelBuffers * /*buffers*/) int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho6_lookup[idx][k]; @@ -2860,7 +3024,11 @@ void PPPMDispIntel::fieldforce_none_ad(IntelBuffers * /*buffers*/) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower_6; k <= nupper_6; k++) { FFT_SCALAR r1,r2,r3,dr1,dr2,dr3; @@ -2909,8 +3077,12 @@ void PPPMDispIntel::fieldforce_none_ad(IntelBuffers * /*buffers*/) FFT_SCALAR eky_p = drho[1][m] * rho[2][n]; FFT_SCALAR ekz_p = rho[1][m] * drho[2][n]; #if defined(LMP_SIMD_COMPILER) - #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif + #pragma loop_count min(2), max(INTEL_P3M_ALIGNED_MAXORDER), avg(7) #endif for (int l = 0; l < order; l++) { int mx = l + nxsum; @@ -2992,7 +3164,11 @@ void PPPMDispIntel::precompute_rho() for (int i = 0; i < rho_points; i++) { FFT_SCALAR dx = -1. + 1./half_rho_scale * (FFT_SCALAR)i; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower; k<=nupper;k++) { FFT_SCALAR r1 = ZEROF; @@ -3006,7 +3182,11 @@ void PPPMDispIntel::precompute_rho() } if (differentiation_flag == 1) { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower; k<=nupper;k++) { FFT_SCALAR r1 = ZEROF; @@ -3026,7 +3206,11 @@ void PPPMDispIntel::precompute_rho() for (int i = 0; i < rho_points; i++) { FFT_SCALAR dx = -1. + 1./half_rho_scale * (FFT_SCALAR)i; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower_6; k<=nupper_6;k++) { FFT_SCALAR r1 = ZEROF; @@ -3040,7 +3224,11 @@ void PPPMDispIntel::precompute_rho() } if (differentiation_flag == 1) { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower_6; k<=nupper_6;k++) { FFT_SCALAR r1 = ZEROF; diff --git a/src/INTEL/pppm_intel.cpp b/src/INTEL/pppm_intel.cpp index 8b0542d770..8041709ebc 100644 --- a/src/INTEL/pppm_intel.cpp +++ b/src/INTEL/pppm_intel.cpp @@ -394,8 +394,12 @@ void PPPMIntel::particle_map(IntelBuffers *buffers) IP_PRE_omp_range_id_align(iifrom, iito, tid, nlocal, nthr, sizeof(ATOM_T)); #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned +#if defined(USE_OMP_SIMD) + #pragma omp simd reduction(+:flag) +#else #pragma simd reduction(+:flag) +#endif + #pragma vector aligned #endif for (int i = iifrom; i < iito; i++) { @@ -500,7 +504,11 @@ void PPPMIntel::make_rho(IntelBuffers *buffers) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho_lookup[idx][k]; @@ -509,7 +517,11 @@ void PPPMIntel::make_rho(IntelBuffers *buffers) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1,r2,r3; @@ -541,7 +553,11 @@ void PPPMIntel::make_rho(IntelBuffers *buffers) int mzy = m*nix + mz; FFT_SCALAR x0 = y0*rho[1][m]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int l = 0; l < INTEL_P3M_ALIGNED_MAXORDER; l++) { int mzyx = l + mzy; @@ -563,7 +579,11 @@ void PPPMIntel::make_rho(IntelBuffers *buffers) IP_PRE_omp_range_id(ifrom, ito, tid, ngrid, nthr); #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { for (int j = 1; j < nthr; j++) { @@ -645,7 +665,11 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho0[k] = rho_lookup[idx][k]; @@ -654,7 +678,11 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1 = rho_coeff[order-1][k]; @@ -690,7 +718,11 @@ void PPPMIntel::fieldforce_ik(IntelBuffers *buffers) int my = m+nysum; FFT_SCALAR y0 = z0*rho1[m]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int l = 0; l < INTEL_P3M_ALIGNED_MAXORDER; l++) { int mx = l+nxsum; @@ -813,7 +845,11 @@ void PPPMIntel::fieldforce_ad(IntelBuffers *buffers) dz = dz*half_rho_scale + half_rho_scale_plus; int idz = dz; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = 0; k < INTEL_P3M_ALIGNED_MAXORDER; k++) { rho[0][k] = rho_lookup[idx][k]; @@ -825,7 +861,11 @@ void PPPMIntel::fieldforce_ad(IntelBuffers *buffers) } } else { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k = nlower; k <= nupper; k++) { FFT_SCALAR r1,r2,r3,dr1,dr2,dr3; @@ -871,7 +911,11 @@ void PPPMIntel::fieldforce_ad(IntelBuffers *buffers) FFT_SCALAR eky_p = drho[1][m] * rho[2][n]; FFT_SCALAR ekz_p = rho[1][m] * drho[2][n]; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int l = 0; l < INTEL_P3M_ALIGNED_MAXORDER; l++) { int mx = l + nxsum; @@ -893,7 +937,11 @@ void PPPMIntel::fieldforce_ad(IntelBuffers *buffers) } #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int i = ifrom; i < ito; i++) { particle_ekx[i] *= hx_inv; @@ -942,7 +990,11 @@ void PPPMIntel::precompute_rho() for (int i = 0; i < rho_points; i++) { FFT_SCALAR dx = -1. + 1./half_rho_scale * (FFT_SCALAR)i; #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower; k<=nupper;k++) { FFT_SCALAR r1 = ZEROF; @@ -956,7 +1008,11 @@ void PPPMIntel::precompute_rho() } if (differentiation_flag == 1) { #if defined(LMP_SIMD_COMPILER) +#if defined(USE_OMP_SIMD) + #pragma omp simd +#else #pragma simd +#endif #endif for (int k=nlower; k<=nupper;k++) { FFT_SCALAR r1 = ZEROF; From af359df04255b491aafeefd8fc6a49e12f86ad43 Mon Sep 17 00:00:00 2001 From: Mike Brown Date: Mon, 26 Jul 2021 12:04:31 -0700 Subject: [PATCH 159/352] Allowing nofdotr for Intel package with newton off. --- src/INTEL/pair_airebo_intel.cpp | 5 +++-- src/INTEL/pair_buck_coul_cut_intel.cpp | 5 +++-- src/INTEL/pair_buck_coul_long_intel.cpp | 5 +++-- src/INTEL/pair_buck_intel.cpp | 5 +++-- src/INTEL/pair_dpd_intel.cpp | 5 +++-- src/INTEL/pair_eam_intel.cpp | 5 +++-- src/INTEL/pair_gayberne_intel.cpp | 5 +++-- src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp | 5 +++-- src/INTEL/pair_lj_charmm_coul_long_intel.cpp | 5 +++-- src/INTEL/pair_lj_cut_coul_long_intel.cpp | 5 +++-- src/INTEL/pair_lj_cut_intel.cpp | 5 +++-- src/INTEL/pair_sw_intel.cpp | 5 +++-- src/INTEL/pair_tersoff_intel.cpp | 5 +++-- 13 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/INTEL/pair_airebo_intel.cpp b/src/INTEL/pair_airebo_intel.cpp index 5ea0d3168b..be38bbe418 100644 --- a/src/INTEL/pair_airebo_intel.cpp +++ b/src/INTEL/pair_airebo_intel.cpp @@ -292,8 +292,9 @@ void PairAIREBOIntel::compute( ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); pvector[0] = pvector[1] = pvector[2] = 0.0; diff --git a/src/INTEL/pair_buck_coul_cut_intel.cpp b/src/INTEL/pair_buck_coul_cut_intel.cpp index c67450fbc1..9181b15aae 100644 --- a/src/INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/INTEL/pair_buck_coul_cut_intel.cpp @@ -77,8 +77,9 @@ void PairBuckCoulCutIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_buck_coul_long_intel.cpp b/src/INTEL/pair_buck_coul_long_intel.cpp index 7c795d5914..fdf78ff5d9 100644 --- a/src/INTEL/pair_buck_coul_long_intel.cpp +++ b/src/INTEL/pair_buck_coul_long_intel.cpp @@ -77,8 +77,9 @@ void PairBuckCoulLongIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_buck_intel.cpp b/src/INTEL/pair_buck_intel.cpp index ddab17765b..2dae75f920 100644 --- a/src/INTEL/pair_buck_intel.cpp +++ b/src/INTEL/pair_buck_intel.cpp @@ -70,8 +70,9 @@ void PairBuckIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_dpd_intel.cpp b/src/INTEL/pair_dpd_intel.cpp index a9eb4fe6a4..b69473fbbf 100644 --- a/src/INTEL/pair_dpd_intel.cpp +++ b/src/INTEL/pair_dpd_intel.cpp @@ -89,8 +89,9 @@ void PairDPDIntel::compute(int eflag, int vflag, ev_init(eflag, vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_eam_intel.cpp b/src/INTEL/pair_eam_intel.cpp index 13dbd60cb3..911a623d6d 100644 --- a/src/INTEL/pair_eam_intel.cpp +++ b/src/INTEL/pair_eam_intel.cpp @@ -82,8 +82,9 @@ void PairEAMIntel::compute(int eflag, int vflag, ev_init(eflag, vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_gayberne_intel.cpp b/src/INTEL/pair_gayberne_intel.cpp index c3abf68c12..285dd9661b 100644 --- a/src/INTEL/pair_gayberne_intel.cpp +++ b/src/INTEL/pair_gayberne_intel.cpp @@ -76,8 +76,9 @@ void PairGayBerneIntel::compute(int eflag, int vflag, ev_init(eflag, vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nall = atom->nlocal + atom->nghost; diff --git a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp index ef26f8f2d5..3a7ab5276e 100644 --- a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -73,8 +73,9 @@ void PairLJCharmmCoulCharmmIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp index 6f6bb3618e..8a4595dd99 100644 --- a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -77,8 +77,9 @@ void PairLJCharmmCoulLongIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_lj_cut_coul_long_intel.cpp b/src/INTEL/pair_lj_cut_coul_long_intel.cpp index 0d94fdb4c3..a53d74f72a 100644 --- a/src/INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_cut_coul_long_intel.cpp @@ -76,8 +76,9 @@ void PairLJCutCoulLongIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_lj_cut_intel.cpp b/src/INTEL/pair_lj_cut_intel.cpp index cf84cb3ca5..133b6079a1 100644 --- a/src/INTEL/pair_lj_cut_intel.cpp +++ b/src/INTEL/pair_lj_cut_intel.cpp @@ -68,8 +68,9 @@ void PairLJCutIntel::compute(int eflag, int vflag, ev_init(eflag, vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_sw_intel.cpp b/src/INTEL/pair_sw_intel.cpp index 57a6b29945..f494965ff8 100644 --- a/src/INTEL/pair_sw_intel.cpp +++ b/src/INTEL/pair_sw_intel.cpp @@ -97,8 +97,9 @@ void PairSWIntel::compute(int eflag, int vflag, ev_init(eflag, vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; diff --git a/src/INTEL/pair_tersoff_intel.cpp b/src/INTEL/pair_tersoff_intel.cpp index d4b8f7d499..732d100927 100644 --- a/src/INTEL/pair_tersoff_intel.cpp +++ b/src/INTEL/pair_tersoff_intel.cpp @@ -91,8 +91,9 @@ void PairTersoffIntel::compute(int eflag, int vflag, ev_init(eflag,vflag); if (vflag_atom) error->all(FLERR,"INTEL package does not support per-atom stress"); - if (vflag && !vflag_fdotr) - error->all(FLERR,"INTEL package does not support pair_modify nofdotr"); + if (vflag && !vflag_fdotr && force->newton_pair) + error->all(FLERR,"INTEL package does not support pair_modify nofdotr " + "with newton on"); const int inum = list->inum; const int nthreads = comm->nthreads; From fdc75dcf35f1a2331cc0cd7568b45564d5841a02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 18:32:06 -0400 Subject: [PATCH 160/352] add lammps_gather_bonds() function to the C library interface --- doc/src/Library_scatter.rst | 5 ++ src/library.cpp | 107 ++++++++++++++++++++++++++++++++++++ src/library.h | 2 + tools/swig/lammps.i | 2 + 4 files changed, 116 insertions(+) diff --git a/doc/src/Library_scatter.rst b/doc/src/Library_scatter.rst index b45f45f6fb..a01610bdce 100644 --- a/doc/src/Library_scatter.rst +++ b/doc/src/Library_scatter.rst @@ -17,6 +17,7 @@ It documents the following functions: - :cpp:func:`lammps_gather_atoms_subset` - :cpp:func:`lammps_scatter_atoms` - :cpp:func:`lammps_scatter_atoms_subset` +- :cpp:func:`lammps_gather_bonds` - :cpp:func:`lammps_gather` - :cpp:func:`lammps_gather_concat` - :cpp:func:`lammps_gather_subset` @@ -51,6 +52,10 @@ It documents the following functions: ----------------------- +.. doxygenfunction:: lammps_gather_bonds + :project: progguide + +----------------------- .. doxygenfunction:: lammps_gather :project: progguide diff --git a/src/library.cpp b/src/library.cpp index 4847c705af..d745e05755 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2686,6 +2686,113 @@ void lammps_scatter_atoms_subset(void *handle, char *name, int type, int count, END_CAPTURE } +/** Gather type and constituent atom info for all bonds + * +\verbatim embed:rst + +This function copies the list of all bonds into a buffer provided by +the calling code. The buffer will be filled with bond type, bond atom 1, +bond atom 2 for each bond. Thus the buffer has to be allocated to the +dimension of 3 times the **total** number of bonds times the size of +the LAMMPS "tagint" type, which is either 4 or 8 bytes depending on + whether they are stored in 32-bit or 64-bit integers, respectively. +This size depends on the compile time settings used when compiling +the LAMMPS library and can be queried by calling + :cpp:func:`lammps_extract_setting()` with the keyword "tagint". + +When running in parallel, the data buffer must be allocated on **all** +MPI ranks and will be filled with the information for **all** bonds +in the system. + +Below is a brief C code demonstrating accessing this collected bond information. + +.. code-block:: c + + #include + #include + #include + #include "library.h" + + int main(int argc, char **argv) + { + int tagintsize; + int64_t i, nbonds; + void *handle, *bonds; + + handle = lammps_open_no_mpi(0, NULL, NULL); + lammps_file(handle, "in.some_input"); + + tagintsize = lammps_extract_setting(handle, "tagint"); + if (tagintsize == 4) + nbonds = *(int32_t *)lammps_extract_global(handle, "nbonds"); + else + nbonds = *(int64_t *)lammps_extract_global(handle, "nbonds"); + bonds = malloc(nbonds * 3 * tagintsize); + + lammps_gather_bonds(handle, bonds); + + if (lammps_extract_setting(handle, "world_rank") == 0) { + if (tagintsize == 4) { + int32_t *bonds_real = (int32_t *)bonds; + for (i = 0; i < nbonds; ++i) { + printf("bond % 4ld: type = %d, atoms: % 4d % 4d\n",i, + bonds_real[3*i], bonds_real[3*i+1], bonds_real[3*i+2]); + } + } else { + int64_t *bonds_real = (int64_t *)bonds; + for (i = 0; i < nbonds; ++i) { + printf("bond % 4ld: type = %ld, atoms: % 4ld % 4ld\n",i, + bonds_real[3*i], bonds_real[3*i+1], bonds_real[3*i+2]); + } + } + } + + lammps_close(handle); + lammps_mpi_finalize(); + free(bonds); + return 0; + } + +\endverbatim + * + * \param handle pointer to a previously created LAMMPS instance + * \param data pointer to data to copy the result to */ + +void lammps_gather_bonds(void *handle, void *data) +{ + LAMMPS *lmp = (LAMMPS *)handle; + BEGIN_CAPTURE { + void *val = lammps_extract_global(handle,"nbonds"); + bigint nbonds = *(bigint *)val; + + // no bonds + if (nbonds == 0) return; + + // count per MPI rank bonds, determine offsets and allocate local buffers + int localbonds = lmp->atom->avec->pack_bond(nullptr); + int nprocs = lmp->comm->nprocs; + int *bufsizes = new int[nprocs]; + int *bufoffsets = new int[nprocs]; + MPI_Allgather(&localbonds, 1, MPI_INT, bufsizes, 1, MPI_INT, lmp->world); + bufoffsets[0] = 0; + bufsizes[0] *= 3; // 3 items per bond: type, atom1, atom2 + for (int i = 1; i < nprocs; ++i) { + bufoffsets[i] = bufoffsets[i-1] + bufsizes[i-1]; + bufsizes[i] *= 3; // 3 items per bond: type, atom1, atom2 + } + + tagint **bonds; + lmp->memory->create(bonds, localbonds, 3, "library:gather_bonds:localbonds"); + lmp->atom->avec->pack_bond(bonds); + MPI_Allgatherv(&bonds[0][0], 3*localbonds, MPI_LMP_TAGINT, data, bufsizes, + bufoffsets, MPI_LMP_TAGINT, lmp->world); + lmp->memory->destroy(bonds); + delete[] bufsizes; + delete[] bufoffsets; + } + END_CAPTURE +} + /* ---------------------------------------------------------------------- Contributing author: Thomas Swinburne (CNRS & CINaM, Marseille, France) gather the named atom-based entity for all atoms diff --git a/src/library.h b/src/library.h index 654eda38fa..91146e8526 100644 --- a/src/library.h +++ b/src/library.h @@ -152,6 +152,8 @@ void lammps_scatter_atoms(void *handle, char *name, int type, int count, void *d void lammps_scatter_atoms_subset(void *handle, char *name, int type, int count, int ndata, int *ids, void *data); +void lammps_gather_bonds(void *handle, void *data); + void lammps_gather(void *handle, char *name, int type, int count, void *data); void lammps_gather_concat(void *handle, char *name, int type, int count, void *data); void lammps_gather_subset(void *handle, char *name, int type, int count, int ndata, int *ids, diff --git a/tools/swig/lammps.i b/tools/swig/lammps.i index 5bf47f2463..2767e4c068 100644 --- a/tools/swig/lammps.i +++ b/tools/swig/lammps.i @@ -91,6 +91,7 @@ extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); extern void lammps_scatter_atoms(void *, char *, int, int, void *); extern void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_gather_bonds(void *handle, void *data); extern void lammps_gather(void *, char *, int, int, void *); extern void lammps_gather_concat(void *, char *, int, int, void *); extern void lammps_gather_subset(void *, char *, int, int, int, int *, void *); @@ -225,6 +226,7 @@ extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); extern void lammps_scatter_atoms(void *, char *, int, int, void *); extern void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_gather_bonds(void *handle, void *data); extern void lammps_gather(void *, char *, int, int, void *); extern void lammps_gather_concat(void *, char *, int, int, void *); extern void lammps_gather_subset(void *, char *, int, int, int, int *, void *); From 829bc8a617910d2226f67d8ee27c57daced0eb1f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 18:45:37 -0400 Subject: [PATCH 161/352] update equation for updated NEB code --- doc/src/fix_neb.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_neb.rst b/doc/src/fix_neb.rst index 848369d3ea..5e57da328a 100644 --- a/doc/src/fix_neb.rst +++ b/doc/src/fix_neb.rst @@ -89,7 +89,7 @@ first stage) is changed to: .. parsed-literal:: - Fi = -Grad(V) + 2 (Grad(V) dot T') T' + Fi = -Grad(V) + 2 (Grad(V) dot T') T' + Fnudge_perp and the relaxation procedure is continued to a new converged MEP. From cc87e7eee3ba9c842ff8166971183daedd317f08 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 20:59:14 -0400 Subject: [PATCH 162/352] add unit test for c-library interface function lammps_gather_bonds() --- unittest/c-library/CMakeLists.txt | 6 + unittest/c-library/test_library_external.cpp | 2 +- .../c-library/test_library_scatter_gather.cpp | 133 ++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 unittest/c-library/test_library_scatter_gather.cpp diff --git a/unittest/c-library/CMakeLists.txt b/unittest/c-library/CMakeLists.txt index b01cd64677..ee7f323c0f 100644 --- a/unittest/c-library/CMakeLists.txt +++ b/unittest/c-library/CMakeLists.txt @@ -17,6 +17,12 @@ target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=$ add_test(LibraryProperties test_library_properties) set_tests_properties(LibraryProperties PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") +add_executable(test_library_scatter_gather test_library_scatter_gather.cpp test_main.cpp) +target_link_libraries(test_library_scatter_gather PRIVATE lammps GTest::GTest GTest::GMock) +target_compile_definitions(test_library_scatter_gather PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR}) +add_test(LibraryScatterGather test_library_scatter_gather) +set_tests_properties(LibraryScatterGather PROPERTIES ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") + set(TEST_CONFIG_DEFS "-DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR};-DLAMMPS_${LAMMPS_SIZES}") set(PKG_COUNT 0) foreach(PKG ${STANDARD_PACKAGES} ${SUFFIX_PACKAGES}) diff --git a/unittest/c-library/test_library_external.cpp b/unittest/c-library/test_library_external.cpp index 005b31fcab..15edd5f113 100644 --- a/unittest/c-library/test_library_external.cpp +++ b/unittest/c-library/test_library_external.cpp @@ -1,4 +1,4 @@ -// unit tests creating LAMMPS instances via the library interface +// unit tests for interfacing with fix external via the library interface #include "library.h" diff --git a/unittest/c-library/test_library_scatter_gather.cpp b/unittest/c-library/test_library_scatter_gather.cpp new file mode 100644 index 0000000000..34022f617e --- /dev/null +++ b/unittest/c-library/test_library_scatter_gather.cpp @@ -0,0 +1,133 @@ +// unit tests for testing scatter/gather operations through the library interface + +#include "lammps.h" +#include "library.h" +#include "lmptype.h" +#include + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +#include "test_main.h" + +#define STRINGIFY(val) XSTR(val) +#define XSTR(val) #val + +using ::LAMMPS_NS::bigint; +using ::LAMMPS_NS::tagint; +using ::testing::HasSubstr; +using ::testing::StartsWith; + +class GatherProperties : public ::testing::Test { +protected: + void *lmp; + std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER); + + GatherProperties(){}; + ~GatherProperties() override{}; + + void SetUp() override + { + const char *args[] = {"LAMMPS_test", "-log", "none", + "-echo", "screen", "-nocite", + "-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)}; + + char **argv = (char **)args; + int argc = sizeof(args) / sizeof(char *); + + ::testing::internal::CaptureStdout(); + lmp = lammps_open_no_mpi(argc, argv, NULL); + std::string output = ::testing::internal::GetCapturedStdout(); + if (verbose) std::cout << output; + EXPECT_THAT(output, StartsWith("LAMMPS (")); + } + void TearDown() override + { + ::testing::internal::CaptureStdout(); + lammps_close(lmp); + std::string output = ::testing::internal::GetCapturedStdout(); + EXPECT_THAT(output, HasSubstr("Total wall time:")); + if (verbose) std::cout << output; + lmp = nullptr; + } +}; + +TEST_F(GatherProperties, gather_bonds_newton_on) +{ + if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); + std::string input = INPUT_DIR + PATH_SEP + "in.fourmol"; + if (!verbose) ::testing::internal::CaptureStdout(); + lammps_command(lmp, "newton on on"); + lammps_file(lmp, input.c_str()); + if (!verbose) ::testing::internal::GetCapturedStdout(); + + bigint nbonds = *(bigint *)lammps_extract_global(lmp, "nbonds"); + EXPECT_EQ(nbonds, 24); + + tagint *bonds = new tagint[3 * nbonds]; + lammps_gather_bonds(lmp, bonds); + +#define CHECK_BOND(idx, type, atom1, atom2) \ + if (((bonds[3 * idx + 1] == atom1) && (bonds[3 * idx + 2] == atom2)) || \ + ((bonds[3 * idx + 1] == atom2) && (bonds[3 * idx + 2] == atom1))) { \ + EXPECT_EQ(bonds[3 * idx], type); \ + ++count; \ + } + + // check validity of a few bonds by comparing the bond type and counting the matches. + int count = 0; + for (bigint i = 0; i < nbonds; ++i) { + CHECK_BOND(i, 5, 1, 2); + CHECK_BOND(i, 3, 1, 3); + CHECK_BOND(i, 2, 3, 4); + CHECK_BOND(i, 2, 3, 5); + CHECK_BOND(i, 1, 3, 6); + CHECK_BOND(i, 3, 6, 8); + CHECK_BOND(i, 4, 6, 7); + CHECK_BOND(i, 5, 8, 9); + CHECK_BOND(i, 5, 27, 28); + CHECK_BOND(i, 5, 27, 29); + } + EXPECT_EQ(count, 10); + delete[] bonds; +}; + +TEST_F(GatherProperties, gather_bonds_newton_off) +{ + if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP(); + std::string input = INPUT_DIR + PATH_SEP + "in.fourmol"; + if (!verbose) ::testing::internal::CaptureStdout(); + lammps_command(lmp, "newton off off"); + lammps_file(lmp, input.c_str()); + if (!verbose) ::testing::internal::GetCapturedStdout(); + + bigint nbonds = *(bigint *)lammps_extract_global(lmp, "nbonds"); + EXPECT_EQ(nbonds, 24); + + tagint *bonds = new tagint[3 * nbonds]; + lammps_gather_bonds(lmp, bonds); + +#define CHECK_BOND(idx, type, atom1, atom2) \ + if (((bonds[3 * idx + 1] == atom1) && (bonds[3 * idx + 2] == atom2)) || \ + ((bonds[3 * idx + 1] == atom2) && (bonds[3 * idx + 2] == atom1))) { \ + EXPECT_EQ(bonds[3 * idx], type); \ + ++count; \ + } + + // check validity of a few bonds by comparing the bond type and counting the matches. + int count = 0; + for (bigint i = 0; i < nbonds; ++i) { + CHECK_BOND(i, 5, 1, 2); + CHECK_BOND(i, 3, 1, 3); + CHECK_BOND(i, 2, 3, 4); + CHECK_BOND(i, 2, 3, 5); + CHECK_BOND(i, 1, 3, 6); + CHECK_BOND(i, 3, 6, 8); + CHECK_BOND(i, 4, 6, 7); + CHECK_BOND(i, 5, 8, 9); + CHECK_BOND(i, 5, 27, 28); + CHECK_BOND(i, 5, 27, 29); + } + EXPECT_EQ(count, 10); + delete[] bonds; +}; From 458253b452aff5a906de890bcf775a868b6a4b5c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 22:36:00 -0400 Subject: [PATCH 163/352] add python interface with optional numpy support for lammps_gather_bonds() unit tests are included --- doc/src/Library_scatter.rst | 1 + python/lammps/core.py | 29 ++++ python/lammps/numpy_wrapper.py | 18 ++ src/library.cpp | 6 +- unittest/python/CMakeLists.txt | 7 + unittest/python/data.fourmol | 210 +++++++++++++++++++++++ unittest/python/in.fourmol | 25 +++ unittest/python/python-numpy.py | 63 +++++++ unittest/python/python-scatter-gather.py | 90 ++++++++++ 9 files changed, 447 insertions(+), 2 deletions(-) create mode 100644 unittest/python/data.fourmol create mode 100644 unittest/python/in.fourmol create mode 100644 unittest/python/python-scatter-gather.py diff --git a/doc/src/Library_scatter.rst b/doc/src/Library_scatter.rst index a01610bdce..8380ef91bd 100644 --- a/doc/src/Library_scatter.rst +++ b/doc/src/Library_scatter.rst @@ -56,6 +56,7 @@ It documents the following functions: :project: progguide ----------------------- + .. doxygenfunction:: lammps_gather :project: progguide diff --git a/python/lammps/core.py b/python/lammps/core.py index d981243503..03378f471d 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -201,6 +201,9 @@ class lammps(object): [c_void_p,c_char_p,c_int,c_int,c_int,POINTER(c_int),c_void_p] self.lib.lammps_scatter_atoms_subset.restype = None + self.lib.lammps_gather_bonds.argtypes = [c_void_p,c_void_p] + self.lib.lammps_gather_bonds.restype = None + self.lib.lammps_gather.argtypes = \ [c_void_p,c_char_p,c_int,c_int,c_void_p] self.lib.lammps_gather.restype = None @@ -1206,6 +1209,32 @@ class lammps(object): with ExceptionCheck(self): self.lib.lammps_scatter_atoms_subset(self.lmp,name,dtype,count,ndata,ids,data) + + # ------------------------------------------------------------------------- + + def gather_bonds(self): + """Retrieve global list of bonds + + This is a wrapper around the :cpp:func:`lammps_gather_bonds` + function of the C-library interface. + + This function returns a tuple with the number of bonds and a + flat list of ctypes integer values with the bond type, bond atom1, + bond atom2 for each bond. + + .. versionadded:: 28Jul2021 + + :return: a tuple with the number of bonds and a list of c_int or c_long + :rtype: (int, 3*nbonds*c_tagint) + """ + nbonds = self.extract_global("nbonds") + with ExceptionCheck(self): + data = ((3*nbonds)*self.c_tagint)() + self.lib.lammps_gather_bonds(self.lmp,data) + return nbonds,data + + # ------------------------------------------------------------------------- + # return vector of atom/compute/fix properties gathered across procs # 3 variants to match src/library.cpp # name = atom property recognized by LAMMPS in atom->extract() diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index 6f4503a9c8..a6cde93b95 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -248,6 +248,24 @@ class numpy_wrapper: # ------------------------------------------------------------------------- + def gather_bonds(self): + """Retrieve global list of bonds as NumPy array + + This is a wrapper around :py:meth:`lammps.gather_bonds() ` + It behaves the same as the original method, but returns a NumPy array instead + of a ``ctypes`` list. + + .. versionadded:: 28Jul2021 + + :return: the requested data as a 2d-integer numpy array + :rtype: numpy.array(nbonds,3) + """ + import numpy as np + nbonds, value = self.lmp.gather_bonds() + return np.ctypeslib.as_array(value).reshape(nbonds,3) + + # ------------------------------------------------------------------------- + def fix_external_get_force(self, fix_id): """Get access to the array with per-atom forces of a fix external instance with a given fix ID. diff --git a/src/library.cpp b/src/library.cpp index d745e05755..5cb101d6a4 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2695,15 +2695,17 @@ the calling code. The buffer will be filled with bond type, bond atom 1, bond atom 2 for each bond. Thus the buffer has to be allocated to the dimension of 3 times the **total** number of bonds times the size of the LAMMPS "tagint" type, which is either 4 or 8 bytes depending on - whether they are stored in 32-bit or 64-bit integers, respectively. +whether they are stored in 32-bit or 64-bit integers, respectively. This size depends on the compile time settings used when compiling the LAMMPS library and can be queried by calling - :cpp:func:`lammps_extract_setting()` with the keyword "tagint". +:cpp:func:`lammps_extract_setting()` with the keyword "tagint". When running in parallel, the data buffer must be allocated on **all** MPI ranks and will be filled with the information for **all** bonds in the system. +.. versionadded:: 28Jul2021 + Below is a brief C code demonstrating accessing this collected bond information. .. code-block:: c diff --git a/unittest/python/CMakeLists.txt b/unittest/python/CMakeLists.txt index 9c9b7832ad..6832f7e028 100644 --- a/unittest/python/CMakeLists.txt +++ b/unittest/python/CMakeLists.txt @@ -29,6 +29,7 @@ if(Python_EXECUTABLE) # prepare to augment the environment so that the LAMMPS python module and the shared library is found. set(PYTHON_TEST_ENVIRONMENT PYTHONPATH=${LAMMPS_PYTHON_DIR}:$ENV{PYTHONPATH}) list(APPEND PYTHON_TEST_ENVIRONMENT "LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS_DIR}") + list(APPEND PYTHON_TEST_ENVIRONMENT "TEST_INPUT_DIR=${CMAKE_CURRENT_SOURCE_DIR}") if(APPLE) list(APPEND PYTHON_TEST_ENVIRONMENT "DYLD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{DYLD_LIBRARY_PATH};LAMMPS_CMAKE_CACHE=${CMAKE_BINARY_DIR}/CMakeCache.txt") else() @@ -90,6 +91,12 @@ if(Python_EXECUTABLE) COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-fix-external.py -v WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) set_tests_properties(PythonFixExternal PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") + + add_test(NAME PythonScatterGather + COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-scatter-gather.py -v + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) + set_tests_properties(PythonScatterGather PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") + else() message(STATUS "Skipping Tests for the LAMMPS Python Module: no suitable Python interpreter") endif() diff --git a/unittest/python/data.fourmol b/unittest/python/data.fourmol new file mode 100644 index 0000000000..386ad81c49 --- /dev/null +++ b/unittest/python/data.fourmol @@ -0,0 +1,210 @@ +LAMMPS data file via write_data, version 5 May 2020, timestep = 0 + +29 atoms +5 atom types +24 bonds +5 bond types +30 angles +4 angle types +31 dihedrals +5 dihedral types +2 impropers +2 improper types + + -6.024572 8.975428 xlo xhi + -7.692866 7.307134 ylo yhi + -8.086924 6.913076 zlo zhi + +Masses + +1 12.0107 +2 4.00794 +3 14.0067 +4 15.9994 +5 15.9994 + +Pair Coeffs # zero + +1 +2 +3 +4 +5 + +Bond Coeffs # zero + +1 1.5 +2 1.1 +3 1.3 +4 1.2 +5 1 + +Angle Coeffs # zero + +1 110.1 +2 111 +3 120 +4 108.5 + +Atoms # full + +10 2 1 7.0000000000000007e-02 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 0 0 0 +11 2 2 8.9999999999999997e-02 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 0 0 0 +12 2 1 -2.7000000000000002e-01 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 0 0 0 +13 2 2 8.9999999999999997e-02 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 0 0 0 +14 2 2 8.9999999999999997e-02 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 0 0 0 +2 1 2 3.1000000000000000e-01 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 0 0 0 +3 1 1 -2.0000000000000000e-02 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 0 0 0 +4 1 2 8.9999999999999997e-02 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 0 0 0 +6 1 1 5.1000000000000001e-01 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 0 0 0 +7 1 4 -5.1000000000000001e-01 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 0 0 0 +19 3 2 4.2359999999999998e-01 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 0 0 0 +15 2 2 8.9999999999999997e-02 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 0 0 0 +18 3 4 -8.4719999999999995e-01 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 0 0 0 +20 3 2 4.2359999999999998e-01 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 0 0 0 +8 2 3 -4.6999999999999997e-01 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 0 0 0 +9 2 2 3.1000000000000000e-01 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 0 0 0 +16 2 1 5.1000000000000001e-01 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 0 0 0 +17 2 4 -5.1000000000000001e-01 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 0 0 0 +1 1 3 -4.6999999999999997e-01 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 0 0 0 +5 1 2 8.9999999999999997e-02 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 0 0 0 +21 4 5 -8.4719999999999995e-01 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 0 0 0 +22 4 2 4.2359999999999998e-01 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 0 0 0 +23 4 2 4.2359999999999998e-01 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 0 0 0 +24 5 5 -8.4719999999999995e-01 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 0 0 0 +25 5 2 4.2359999999999998e-01 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 0 0 0 +26 5 2 4.2359999999999998e-01 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 0 0 0 +27 6 5 -8.4719999999999995e-01 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 0 0 0 +28 6 2 4.2359999999999998e-01 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 0 0 0 +29 6 2 4.2359999999999998e-01 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 0 0 0 + +Velocities + +1 7.7867804888392077e-04 5.8970331623292821e-04 -2.2179517633030531e-04 +2 2.7129529964126462e-03 4.6286427111164284e-03 3.5805549693846352e-03 +3 -1.2736791029204805e-03 1.6108674226414498e-03 -3.3618185901550799e-04 +4 -9.2828595122009308e-04 -1.2537885319521818e-03 -4.1204974953432108e-03 +5 -1.1800848061603740e-03 7.5424401975844038e-04 6.9023177964912290e-05 +6 -3.0914004879905335e-04 1.2755385764678133e-03 7.9574303350202582e-04 +7 -1.1037894966874103e-04 -7.6764845099077425e-04 -7.7217630460203659e-04 +8 3.9060281273221989e-04 -8.1444231918053418e-04 1.5134641148324972e-04 +9 1.2475530960659720e-03 -2.6608454451432528e-03 1.1117602907112732e-03 +10 4.5008983776042893e-04 4.9530197647538077e-04 -2.3336234361093645e-04 +11 -3.6977669078869707e-04 -1.5289071951960539e-03 -2.9176389881837113e-03 +12 1.0850834530183159e-03 -6.4965897903201833e-04 -1.2971152622619948e-03 +13 4.0754559196230639e-03 3.5043502394946119e-03 -7.8324487687854666e-04 +14 -1.3837220448746613e-04 -4.0656048637594394e-03 -3.9333461173944500e-03 +15 -4.3301707382721859e-03 -3.1802661664634938e-03 3.2037919043360571e-03 +16 -9.6715751018414326e-05 -5.0016572678960377e-04 1.4945658875149626e-03 +17 6.5692180538157174e-04 3.6635779995305095e-04 8.3495414466050911e-04 +18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04 +19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03 +20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03 +21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04 +22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03 +23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03 +24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04 +25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03 +26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03 +27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04 +28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03 +29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03 + +Bonds + +1 5 1 2 +2 3 1 3 +3 2 3 4 +4 2 3 5 +5 1 3 6 +6 3 6 8 +7 4 6 7 +8 5 8 9 +9 3 8 10 +10 2 10 11 +11 1 10 12 +12 1 10 16 +13 2 12 13 +14 2 12 14 +15 2 12 15 +16 4 16 17 +17 5 18 19 +18 5 18 20 +19 5 21 22 +20 5 21 23 +21 5 24 25 +22 5 24 26 +23 5 27 28 +24 5 27 29 + +Angles + +1 4 2 1 3 +2 4 1 3 5 +3 4 1 3 4 +4 4 1 3 6 +5 4 4 3 5 +6 2 5 3 6 +7 2 4 3 6 +8 3 3 6 7 +9 3 3 6 8 +10 3 7 6 8 +11 2 6 8 9 +12 2 9 8 10 +13 3 6 8 10 +14 2 8 10 11 +15 3 8 10 16 +16 2 11 10 12 +17 1 12 10 16 +18 1 8 10 12 +19 2 11 10 16 +20 2 10 12 15 +21 2 10 12 14 +22 2 10 12 13 +23 4 13 12 15 +24 4 13 12 14 +25 4 14 12 15 +26 4 10 16 17 +27 1 19 18 20 +28 1 22 21 23 +29 1 25 24 26 +30 1 28 27 29 + +Dihedrals + +1 2 2 1 3 6 +2 2 2 1 3 4 +3 3 2 1 3 5 +4 1 1 3 6 8 +5 1 1 3 6 7 +6 5 4 3 6 8 +7 5 4 3 6 7 +8 5 5 3 6 8 +9 5 5 3 6 7 +10 4 3 6 8 9 +11 3 3 6 8 10 +12 3 7 6 8 9 +13 4 7 6 8 10 +14 2 6 8 10 12 +15 2 6 8 10 16 +16 2 6 8 10 11 +17 2 9 8 10 12 +18 4 9 8 10 16 +19 5 9 8 10 11 +20 5 8 10 12 13 +21 1 8 10 12 14 +22 5 8 10 12 15 +23 4 8 10 16 17 +24 5 11 10 12 13 +25 5 11 10 12 14 +26 5 11 10 12 15 +27 2 11 10 16 17 +28 2 12 10 16 17 +29 5 16 10 12 13 +30 5 16 10 12 14 +31 5 16 10 12 15 + +Impropers + +1 1 6 3 8 7 +2 2 8 6 10 9 diff --git a/unittest/python/in.fourmol b/unittest/python/in.fourmol new file mode 100644 index 0000000000..e0c3dfc7c1 --- /dev/null +++ b/unittest/python/in.fourmol @@ -0,0 +1,25 @@ +variable units index real +variable input_dir index . +variable data_file index ${input_dir}/data.fourmol +variable pair_style index 'zero 8.0' +variable bond_style index zero +variable angle_style index zero +variable dihedral_style index zero +variable improper_style index zero + +atom_style full +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.1 + +pair_style ${pair_style} +bond_style ${bond_style} +angle_style ${angle_style} +dihedral_style ${dihedral_style} +improper_style ${improper_style} + +read_data ${data_file} +dihedral_coeff * +improper_coeff * + diff --git a/unittest/python/python-numpy.py b/unittest/python/python-numpy.py index dc121691ab..010255a81e 100644 --- a/unittest/python/python-numpy.py +++ b/unittest/python/python-numpy.py @@ -15,6 +15,17 @@ try: except: pass +has_full=False +try: + machine=None + if 'LAMMPS_MACHINE_NAME' in os.environ: + machine=os.environ['LAMMPS_MACHINE_NAME'] + lmp=lammps(name=machine) + has_full = lmp.has_style("atom","full") + lmp.close() +except: + pass + try: import numpy NUMPY_INSTALLED = True @@ -32,6 +43,14 @@ class PythonNumpy(unittest.TestCase): def tearDown(self): del self.lmp + def checkBond(self, vals, btype, batom1, batom2): + if ((vals[1] == batom1 and vals[2] == batom2) + or (vals[1] == batom2 and vals[2] == batom1)): + self.assertEqual(vals[0], btype) + return 1 + else: + return 0 + def testLammpsPointer(self): self.assertEqual(type(self.lmp.lmp), c_void_p) @@ -148,6 +167,50 @@ class PythonNumpy(unittest.TestCase): self.assertTrue((x[1] == (1.0, 1.0, 1.5)).all()) self.assertEqual(len(v), 2) + @unittest.skipIf(not has_full,"Gather bonds test") + def testGatherBond_newton_on(self): + self.lmp.command('shell cd ' + os.environ['TEST_INPUT_DIR']) + self.lmp.command("newton on on") + self.lmp.file("in.fourmol") + self.lmp.command("run 0 post no") + bonds = self.lmp.numpy.gather_bonds() + self.assertEqual(len(bonds),24) + count = 0 + for bond in bonds: + count += self.checkBond(bond, 5, 1, 2) + count += self.checkBond(bond, 3, 1, 3) + count += self.checkBond(bond, 2, 3, 4) + count += self.checkBond(bond, 2, 3, 5) + count += self.checkBond(bond, 1, 6, 3) + count += self.checkBond(bond, 3, 6, 8) + count += self.checkBond(bond, 4, 6, 7) + count += self.checkBond(bond, 5, 8, 9) + count += self.checkBond(bond, 5, 27, 28) + count += self.checkBond(bond, 5, 29, 27) + self.assertEqual(count,10) + + @unittest.skipIf(not has_full,"Gather bonds test") + def testGatherBond_newton_off(self): + self.lmp.command('shell cd ' + os.environ['TEST_INPUT_DIR']) + self.lmp.command("newton off off") + self.lmp.file("in.fourmol") + self.lmp.command("run 0 post no") + bonds = self.lmp.numpy.gather_bonds() + self.assertEqual(len(bonds),24) + count = 0 + for bond in bonds: + count += self.checkBond(bond, 5, 1, 2) + count += self.checkBond(bond, 3, 1, 3) + count += self.checkBond(bond, 2, 3, 4) + count += self.checkBond(bond, 2, 3, 5) + count += self.checkBond(bond, 1, 6, 3) + count += self.checkBond(bond, 3, 6, 8) + count += self.checkBond(bond, 4, 6, 7) + count += self.checkBond(bond, 5, 8, 9) + count += self.checkBond(bond, 5, 27, 28) + count += self.checkBond(bond, 5, 29, 27) + self.assertEqual(count,10) + def testNeighborListSimple(self): self.lmp.commands_string(""" units lj diff --git a/unittest/python/python-scatter-gather.py b/unittest/python/python-scatter-gather.py new file mode 100644 index 0000000000..cd606c2992 --- /dev/null +++ b/unittest/python/python-scatter-gather.py @@ -0,0 +1,90 @@ + +import sys,os,unittest +from lammps import lammps + +has_full=False +try: + machine=None + if 'LAMMPS_MACHINE_NAME' in os.environ: + machine=os.environ['LAMMPS_MACHINE_NAME'] + lmp=lammps(name=machine) + has_full = lmp.has_style("atom","full") + lmp.close() +except: + pass + +class PythonGather(unittest.TestCase): + + def setUp(self): + machine=None + if 'LAMMPS_MACHINE_NAME' in os.environ: + machine=os.environ['LAMMPS_MACHINE_NAME'] + self.lmp=lammps(name=machine, + cmdargs=['-nocite', + '-log','none', + '-echo','screen']) + self.lmp.command('shell cd ' + os.environ['TEST_INPUT_DIR']) + + # clean up temporary files + def tearDown(self): + self.lmp.close() + + # bond data comparison + def checkBond(self, vals, btype, batom1, batom2): + if ((vals[1] == batom1 and vals[2] == batom2) + or (vals[1] == batom2 and vals[2] == batom1)): + self.assertEqual(vals[0], btype) + return 1 + else: + return 0 + + ############################## + @unittest.skipIf(not has_full, "Gather_bonds test") + def testGatherBond_newton_on(self): + """Test gather_bonds() with newton on""" + self.lmp.command("newton on on") + self.lmp.file("in.fourmol") + self.lmp.command("run 0 post no") + nbonds, bonds = self.lmp.gather_bonds() + self.assertEqual(nbonds, 24) + self.assertEqual(len(bonds), 3*24) + count = 0; + for i in range(0,nbonds): + count += self.checkBond(bonds[3*i:3*i+3], 5, 1, 2) + count += self.checkBond(bonds[3*i:3*i+3], 3, 1, 3) + count += self.checkBond(bonds[3*i:3*i+3], 2, 3, 4) + count += self.checkBond(bonds[3*i:3*i+3], 2, 3, 5) + count += self.checkBond(bonds[3*i:3*i+3], 1, 6, 3) + count += self.checkBond(bonds[3*i:3*i+3], 3, 6, 8) + count += self.checkBond(bonds[3*i:3*i+3], 4, 6, 7) + count += self.checkBond(bonds[3*i:3*i+3], 5, 8, 9) + count += self.checkBond(bonds[3*i:3*i+3], 5, 27, 28) + count += self.checkBond(bonds[3*i:3*i+3], 5, 29, 27) + self.assertEqual(count,10) + + @unittest.skipIf(not has_full, "Gather_bonds test") + def testGatherBond_newton_off(self): + """Test gather_bonds() with newton off""" + self.lmp.command("newton off off") + self.lmp.file("in.fourmol") + self.lmp.command("run 0 post no") + nbonds, bonds = self.lmp.gather_bonds() + self.assertEqual(nbonds, 24) + self.assertEqual(len(bonds), 3*24) + count = 0; + for i in range(0,nbonds): + count += self.checkBond(bonds[3*i:3*i+3], 5, 1, 2) + count += self.checkBond(bonds[3*i:3*i+3], 3, 1, 3) + count += self.checkBond(bonds[3*i:3*i+3], 2, 3, 4) + count += self.checkBond(bonds[3*i:3*i+3], 2, 3, 5) + count += self.checkBond(bonds[3*i:3*i+3], 1, 3, 6) + count += self.checkBond(bonds[3*i:3*i+3], 3, 6, 8) + count += self.checkBond(bonds[3*i:3*i+3], 4, 6, 7) + count += self.checkBond(bonds[3*i:3*i+3], 5, 8, 9) + count += self.checkBond(bonds[3*i:3*i+3], 5, 27, 28) + count += self.checkBond(bonds[3*i:3*i+3], 5, 27, 29) + self.assertEqual(count,10) + +############################## +if __name__ == "__main__": + unittest.main() From 044fe2e49d8ad241834800326c05c41c3c4a6875 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 23:09:18 -0400 Subject: [PATCH 164/352] step version number strings for the next patch release --- doc/lammps.1 | 2 +- src/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index 414d0e7139..de496d1af1 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,4 +1,4 @@ -.TH LAMMPS "2 July 2021" "2021-07-2" +.TH LAMMPS "28 July 2021" "2021-07-28" .SH NAME .B LAMMPS \- Molecular Dynamics Simulator. diff --git a/src/version.h b/src/version.h index 43064d25ab..e206353a44 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "2 Jul 2021" +#define LAMMPS_VERSION "28 Jul 2021" From a4ffffad3364123479642134d2f8adb4963d1113 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 26 Jul 2021 23:10:24 -0400 Subject: [PATCH 165/352] update some version strings for library and python APIs --- python/lammps/core.py | 16 ++++++++++++++++ python/lammps/numpy_wrapper.py | 6 ++++++ src/library.cpp | 18 +++++++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 03378f471d..c89c115d1f 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1781,6 +1781,8 @@ class lammps(object): - x is a 2d NumPy array of doubles of the coordinates of the local atoms - f is a 2d NumPy array of doubles of the forces on the local atoms that will be added + .. versionchanged:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param callback: Python function that will be called from fix external @@ -1811,6 +1813,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_get_force` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :return: requested data @@ -1829,6 +1833,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_energy_global` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param eng: potential energy value to be added by fix external @@ -1846,6 +1852,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_virial_global` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param eng: list of 6 floating point numbers with the virial to be added by fix external @@ -1864,6 +1872,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_energy_peratom` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param eatom: list of potential energy values for local atoms to be added by fix external @@ -1885,6 +1895,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_virial_peratom` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param vatom: list of natoms lists with 6 floating point numbers to be added by fix external @@ -1915,6 +1927,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_vector_length` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param length: length of the global vector @@ -1931,6 +1945,8 @@ class lammps(object): This is a wrapper around the :cpp:func:`lammps_fix_external_set_vector` function of the C-library interface. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param idx: 1-based index of the value in the global vector diff --git a/python/lammps/numpy_wrapper.py b/python/lammps/numpy_wrapper.py index a6cde93b95..2f0f74594e 100644 --- a/python/lammps/numpy_wrapper.py +++ b/python/lammps/numpy_wrapper.py @@ -274,6 +274,8 @@ class numpy_wrapper: method. It behaves the same as the original method, but returns a NumPy array instead of a ``ctypes`` pointer. + .. versionchanged:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :return: requested data @@ -294,6 +296,8 @@ class numpy_wrapper: method. It behaves the same as the original method, but accepts a NumPy array instead of a list as argument. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param eatom: per-atom potential energy @@ -319,6 +323,8 @@ class numpy_wrapper: method. It behaves the same as the original method, but accepts a NumPy array instead of a list as argument. + .. versionadded:: 28Jul2021 + :param fix_id: Fix-ID of a fix external instance :type: string :param eatom: per-atom potential energy diff --git a/src/library.cpp b/src/library.cpp index 5cb101d6a4..f534af0925 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -367,7 +367,7 @@ must be explicitly shut down after any LAMMPS instance using it is closed (to release associated resources). After calling this function no Kokkos functionality may be used. -.. versionadded:: TBD +.. versionadded:: 2Jul2021 \endverbatim */ @@ -4945,6 +4945,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionchanged:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5008,6 +5010,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5056,6 +5060,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5105,6 +5111,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5154,6 +5162,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5206,6 +5216,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5251,6 +5263,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. @@ -5305,6 +5319,8 @@ Please see the documentation for :doc:`fix external ` for more information about how to use the fix and how to couple it with an external code. +.. versionadded:: 28Jul2021 + \endverbatim * * \param handle pointer to a previously created LAMMPS instance cast to ``void *``. From 16fae72670b9eebaf3dbec4805d7dd8094f1ca61 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 08:44:59 -0400 Subject: [PATCH 166/352] small tweak for MinGW-64 compilation on Fedora 34 --- cmake/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 7269fc5c9b..b76163aaef 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -363,6 +363,8 @@ if(PKG_MSCG OR PKG_ATC OR PKG_AWPMD OR PKG_ML-QUIP OR PKG_LATTE) endif() endif() +# tweak jpeg library names to avoid linker errors with MinGW cross-compilation +set(JPEG_NAMES libjpeg libjpeg-62) find_package(JPEG QUIET) option(WITH_JPEG "Enable JPEG support" ${JPEG_FOUND}) if(WITH_JPEG) From f39c5178d81276070bc4b29c7c487e21494e7e5f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 09:56:52 -0400 Subject: [PATCH 167/352] update plumed to version 2.7.2 and drop workaround for 2.7.1 --- cmake/Modules/Packages/PLUMED.cmake | 5 ++--- lib/plumed/Install.py | 1 + tools/offline/scripts/init_http_cache.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/Modules/Packages/PLUMED.cmake b/cmake/Modules/Packages/PLUMED.cmake index e9eba779f5..0f063f3e14 100644 --- a/cmake/Modules/Packages/PLUMED.cmake +++ b/cmake/Modules/Packages/PLUMED.cmake @@ -54,8 +54,8 @@ if(DOWNLOAD_PLUMED) set(PLUMED_BUILD_BYPRODUCTS "/lib/libplumedWrapper.a") endif() - set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.7.1/plumed-src-2.7.1.tgz" CACHE STRING "URL for PLUMED tarball") - set(PLUMED_MD5 "4eac6a462ec84dfe0cec96c82421b8e8" CACHE STRING "MD5 checksum of PLUMED tarball") + set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.7.2/plumed-src-2.7.2.tgz" CACHE STRING "URL for PLUMED tarball") + set(PLUMED_MD5 "cfa0b4dd90a81c25d3302e8d97bfeaea" CACHE STRING "MD5 checksum of PLUMED tarball") mark_as_advanced(PLUMED_URL) mark_as_advanced(PLUMED_MD5) @@ -72,7 +72,6 @@ if(DOWNLOAD_PLUMED) ${PLUMED_CONFIG_OMP} CXX=${PLUMED_CONFIG_CXX} CC=${PLUMED_CONFIG_CC} - PATCH_COMMAND sed -i "/^#include /a #include " /src/lepton/Operation.h BUILD_BYPRODUCTS ${PLUMED_BUILD_BYPRODUCTS} ) ExternalProject_get_property(plumed_build INSTALL_DIR) diff --git a/lib/plumed/Install.py b/lib/plumed/Install.py index e3858b39d3..548e51a5bc 100644 --- a/lib/plumed/Install.py +++ b/lib/plumed/Install.py @@ -53,6 +53,7 @@ checksums = { \ '2.6.3' : 'a9f8028fd74528c2024781ea1fdefeee', \ '2.7.0' : '95f29dd0c067577f11972ff90dfc7d12', \ '2.7.1' : '4eac6a462ec84dfe0cec96c82421b8e8', \ + '2.7.2' : 'cfa0b4dd90a81c25d3302e8d97bfeaea', \ } # parse and process arguments diff --git a/tools/offline/scripts/init_http_cache.sh b/tools/offline/scripts/init_http_cache.sh index 55856bbf21..44a07da35a 100755 --- a/tools/offline/scripts/init_http_cache.sh +++ b/tools/offline/scripts/init_http_cache.sh @@ -50,7 +50,7 @@ CUB_URL="https://github.com/NVlabs/cub/archive/1.12.0.tar.gz" KOKKOS_URL="https://github.com/kokkos/kokkos/archive/3.4.01.tar.gz" KIM_URL="https://s3.openkim.org/kim-api/kim-api-2.2.1.txz" MSCG_URL="https://github.com/uchicago-voth/MSCG-release/archive/1.7.3.1.tar.gz" -PLUMED_URL="https://github.com/plumed/plumed2/releases/download/v2.7.1/plumed-src-2.7.1.tgz" +PLUMED_URL="https://github.com/plumed/plumed2/releases/download/v2.7.2/plumed-src-2.7.2.tgz" PACELIB_URL="https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.4.9.tar.gz" LATTE_URL="https://github.com/lanl/LATTE/archive/v1.2.2.tar.gz" SCAFACOS_URL="https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz" From ec069595f767b5285c55dda69834e819ad3c3824 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 11:16:40 -0400 Subject: [PATCH 168/352] move compute orientorder/atom because compute coord/atom depends on it --- doc/src/compute_orientorder_atom.rst | 3 +-- src/{EXTRA-COMPUTE => }/compute_orientorder_atom.cpp | 0 src/{EXTRA-COMPUTE => }/compute_orientorder_atom.h | 0 3 files changed, 1 insertion(+), 2 deletions(-) rename src/{EXTRA-COMPUTE => }/compute_orientorder_atom.cpp (100%) rename src/{EXTRA-COMPUTE => }/compute_orientorder_atom.h (100%) diff --git a/doc/src/compute_orientorder_atom.rst b/doc/src/compute_orientorder_atom.rst index 2efea311a0..bc608e21d7 100644 --- a/doc/src/compute_orientorder_atom.rst +++ b/doc/src/compute_orientorder_atom.rst @@ -182,8 +182,7 @@ page for an overview of LAMMPS output options. Restrictions """""""""""" -This compute is part of the EXTRA-COMPUTE package. It is only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +none Related commands """""""""""""""" diff --git a/src/EXTRA-COMPUTE/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp similarity index 100% rename from src/EXTRA-COMPUTE/compute_orientorder_atom.cpp rename to src/compute_orientorder_atom.cpp diff --git a/src/EXTRA-COMPUTE/compute_orientorder_atom.h b/src/compute_orientorder_atom.h similarity index 100% rename from src/EXTRA-COMPUTE/compute_orientorder_atom.h rename to src/compute_orientorder_atom.h From f7f85822a932c63d95a9a2c0bb93a451ea5519ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 12:07:12 -0400 Subject: [PATCH 169/352] move some more computes from EXTRA-COMPUTE back to src because of dependencies --- doc/src/compute_cluster_atom.rst | 3 +-- src/{EXTRA-COMPUTE => }/compute_aggregate_atom.cpp | 0 src/{EXTRA-COMPUTE => }/compute_aggregate_atom.h | 0 src/{EXTRA-COMPUTE => }/compute_cluster_atom.cpp | 0 src/{EXTRA-COMPUTE => }/compute_cluster_atom.h | 0 src/{EXTRA-COMPUTE => }/compute_fragment_atom.cpp | 0 src/{EXTRA-COMPUTE => }/compute_fragment_atom.h | 0 7 files changed, 1 insertion(+), 2 deletions(-) rename src/{EXTRA-COMPUTE => }/compute_aggregate_atom.cpp (100%) rename src/{EXTRA-COMPUTE => }/compute_aggregate_atom.h (100%) rename src/{EXTRA-COMPUTE => }/compute_cluster_atom.cpp (100%) rename src/{EXTRA-COMPUTE => }/compute_cluster_atom.h (100%) rename src/{EXTRA-COMPUTE => }/compute_fragment_atom.cpp (100%) rename src/{EXTRA-COMPUTE => }/compute_fragment_atom.h (100%) diff --git a/doc/src/compute_cluster_atom.rst b/doc/src/compute_cluster_atom.rst index f82b2affa5..32954480cc 100644 --- a/doc/src/compute_cluster_atom.rst +++ b/doc/src/compute_cluster_atom.rst @@ -119,8 +119,7 @@ The per-atom vector values will be an ID > 0, as explained above. Restrictions """""""""""" -These computes are part of the EXTRA-COMPUTE package. They are only enabled if -LAMMPS was built with that package. See the :doc:`Build package ` page for more info. +none Related commands """""""""""""""" diff --git a/src/EXTRA-COMPUTE/compute_aggregate_atom.cpp b/src/compute_aggregate_atom.cpp similarity index 100% rename from src/EXTRA-COMPUTE/compute_aggregate_atom.cpp rename to src/compute_aggregate_atom.cpp diff --git a/src/EXTRA-COMPUTE/compute_aggregate_atom.h b/src/compute_aggregate_atom.h similarity index 100% rename from src/EXTRA-COMPUTE/compute_aggregate_atom.h rename to src/compute_aggregate_atom.h diff --git a/src/EXTRA-COMPUTE/compute_cluster_atom.cpp b/src/compute_cluster_atom.cpp similarity index 100% rename from src/EXTRA-COMPUTE/compute_cluster_atom.cpp rename to src/compute_cluster_atom.cpp diff --git a/src/EXTRA-COMPUTE/compute_cluster_atom.h b/src/compute_cluster_atom.h similarity index 100% rename from src/EXTRA-COMPUTE/compute_cluster_atom.h rename to src/compute_cluster_atom.h diff --git a/src/EXTRA-COMPUTE/compute_fragment_atom.cpp b/src/compute_fragment_atom.cpp similarity index 100% rename from src/EXTRA-COMPUTE/compute_fragment_atom.cpp rename to src/compute_fragment_atom.cpp diff --git a/src/EXTRA-COMPUTE/compute_fragment_atom.h b/src/compute_fragment_atom.h similarity index 100% rename from src/EXTRA-COMPUTE/compute_fragment_atom.h rename to src/compute_fragment_atom.h From d292da78ca705254536b05f2f799bbbf230398d5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 12:29:44 -0400 Subject: [PATCH 170/352] address CodeQL warnings and reformat with clang-format --- src/EXTRA-COMPUTE/compute_hma.cpp | 28 ++-- src/TALLY/compute_force_tally.cpp | 101 +++++++-------- src/TALLY/compute_heat_flux_tally.cpp | 101 +++++++-------- src/TALLY/compute_heat_flux_virial_tally.cpp | 2 +- src/TALLY/compute_pe_mol_tally.cpp | 62 +++++---- src/TALLY/compute_pe_tally.cpp | 85 ++++++------- src/TALLY/compute_stress_tally.cpp | 127 ++++++++++--------- 7 files changed, 239 insertions(+), 267 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_hma.cpp b/src/EXTRA-COMPUTE/compute_hma.cpp index b74280a8e5..09a2840906 100644 --- a/src/EXTRA-COMPUTE/compute_hma.cpp +++ b/src/EXTRA-COMPUTE/compute_hma.cpp @@ -116,7 +116,7 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : computeU = computeP = computeCv = -1; returnAnharmonic = 0; size_vector = 0; - memory->create(extlist, 3, "hma:extlist"); + extlist = new int[3]; for (int iarg=4; iarg-1) continue; @@ -145,20 +145,11 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : } } - if (size_vector == 0) { - error->all(FLERR,"Illegal compute hma command"); - } - if (size_vector<3) { - memory->grow(extlist, size_vector, "hma:extlist"); - } - memory->create(vector, size_vector, "hma:vector"); + if (size_vector == 0) error->all(FLERR,"Illegal compute hma command"); + vector = new double[size_vector]; - if (computeU>-1 || computeCv>-1) { - peflag = 1; - } - if (computeP>-1) { - pressflag = 1; - } + if (computeU>-1 || computeCv>-1) peflag = 1; + if (computeP>-1) pressflag = 1; nmax = 0; } @@ -170,10 +161,11 @@ ComputeHMA::~ComputeHMA() // check nfix in case all fixes have already been deleted if (modify->nfix) modify->delete_fix(id_fix); - delete [] id_fix; - delete [] id_temp; - memory->destroy(extlist); - memory->destroy(vector); + delete[] id_fix; + delete[] id_temp; + delete[] extlist; + delete[] vector; + memory->destroy(deltaR); } diff --git a/src/TALLY/compute_force_tally.cpp b/src/TALLY/compute_force_tally.cpp index bc9a79713b..8216269fe0 100644 --- a/src/TALLY/compute_force_tally.cpp +++ b/src/TALLY/compute_force_tally.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -14,28 +13,26 @@ #include "compute_force_tally.h" -#include #include "atom.h" -#include "group.h" -#include "pair.h" -#include "update.h" -#include "memory.h" +#include "comm.h" #include "error.h" #include "force.h" -#include "comm.h" +#include "group.h" +#include "memory.h" +#include "pair.h" +#include "update.h" +#include using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputeForceTally::ComputeForceTally(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputeForceTally::ComputeForceTally(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute force/tally command"); + if (narg < 4) error->all(FLERR, "Illegal compute force/tally command"); igroup2 = group->find(arg[3]); - if (igroup2 == -1) - error->all(FLERR,"Could not find compute force/tally second group ID"); + if (igroup2 == -1) error->all(FLERR, "Could not find compute force/tally second group ID"); groupbit2 = group->bitmask[igroup2]; scalar_flag = 1; @@ -46,7 +43,7 @@ ComputeForceTally::ComputeForceTally(LAMMPS *lmp, int narg, char **arg) : comm_reverse = size_peratom_cols = 3; extscalar = 1; - peflag = 1; // we need Pair::ev_tally() to be run + peflag = 1; // we need Pair::ev_tally() to be run did_setup = invoked_peratom = invoked_scalar = -1; nmax = -1; @@ -68,17 +65,16 @@ ComputeForceTally::~ComputeForceTally() void ComputeForceTally::init() { if (force->pair == nullptr) - error->all(FLERR,"Trying to use compute force/tally without pair style"); + error->all(FLERR, "Trying to use compute force/tally without pair style"); else force->pair->add_tally_callback(this); if (comm->me == 0) { if (force->pair->single_enable == 0 || force->pair->manybody_flag) - error->warning(FLERR,"Compute force/tally used with incompatible pair style"); + error->warning(FLERR, "Compute force/tally used with incompatible pair style"); - if (force->bond || force->angle || force->dihedral - || force->improper || force->kspace) - error->warning(FLERR,"Compute force/tally only called from pair style"); + if (force->bond || force->angle || force->dihedral || force->improper || force->kspace) + error->warning(FLERR, "Compute force/tally only called from pair style"); } did_setup = -1; } @@ -99,51 +95,48 @@ void ComputeForceTally::pair_setup_callback(int, int) if (atom->nmax > nmax) { memory->destroy(fatom); nmax = atom->nmax; - memory->create(fatom,nmax,size_peratom_cols,"force/tally:fatom"); + memory->create(fatom, nmax, size_peratom_cols, "force/tally:fatom"); array_atom = fatom; } // clear storage - for (int i=0; i < ntotal; ++i) - for (int j=0; j < size_peratom_cols; ++j) - fatom[i][j] = 0.0; + for (int i = 0; i < ntotal; ++i) + for (int j = 0; j < size_peratom_cols; ++j) fatom[i][j] = 0.0; - for (int i=0; i < size_peratom_cols; ++i) - vector[i] = ftotal[i] = 0.0; + for (int i = 0; i < size_peratom_cols; ++i) vector[i] = ftotal[i] = 0.0; did_setup = update->ntimestep; } /* ---------------------------------------------------------------------- */ -void ComputeForceTally::pair_tally_callback(int i, int j, int nlocal, int newton, - double, double, double fpair, - double dx, double dy, double dz) +void ComputeForceTally::pair_tally_callback(int i, int j, int nlocal, int newton, double, double, + double fpair, double dx, double dy, double dz) { - const int * const mask = atom->mask; + const int *const mask = atom->mask; - if ( ((mask[i] & groupbit) && (mask[j] & groupbit2)) - || ((mask[i] & groupbit2) && (mask[j] & groupbit))) { + if (((mask[i] & groupbit) && (mask[j] & groupbit2)) || + ((mask[i] & groupbit2) && (mask[j] & groupbit))) { if (newton || i < nlocal) { if (mask[i] & groupbit) { - ftotal[0] += fpair*dx; - ftotal[1] += fpair*dy; - ftotal[2] += fpair*dz; + ftotal[0] += fpair * dx; + ftotal[1] += fpair * dy; + ftotal[2] += fpair * dz; } - fatom[i][0] += fpair*dx; - fatom[i][1] += fpair*dy; - fatom[i][2] += fpair*dz; + fatom[i][0] += fpair * dx; + fatom[i][1] += fpair * dy; + fatom[i][2] += fpair * dz; } if (newton || j < nlocal) { if (mask[j] & groupbit) { - ftotal[0] -= fpair*dx; - ftotal[1] -= fpair*dy; - ftotal[2] -= fpair*dz; + ftotal[0] -= fpair * dx; + ftotal[1] -= fpair * dy; + ftotal[2] -= fpair * dz; } - fatom[j][0] -= fpair*dx; - fatom[j][1] -= fpair*dy; - fatom[j][2] -= fpair*dz; + fatom[j][0] -= fpair * dx; + fatom[j][1] -= fpair * dy; + fatom[j][2] -= fpair * dz; } } } @@ -152,7 +145,7 @@ void ComputeForceTally::pair_tally_callback(int i, int j, int nlocal, int newton int ComputeForceTally::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; m = 0; last = first + n; @@ -168,7 +161,7 @@ int ComputeForceTally::pack_reverse_comm(int n, int first, double *buf) void ComputeForceTally::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i, j, m; m = 0; for (i = 0; i < n; i++) { @@ -184,15 +177,14 @@ void ComputeForceTally::unpack_reverse_comm(int n, int *list, double *buf) double ComputeForceTally::compute_scalar() { invoked_scalar = update->ntimestep; - if ((did_setup != invoked_scalar) - || (update->eflag_global != invoked_scalar)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // sum accumulated forces across procs - MPI_Allreduce(ftotal,vector,size_peratom_cols,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(ftotal, vector, size_peratom_cols, MPI_DOUBLE, MPI_SUM, world); - scalar = sqrt(vector[0]*vector[0]+vector[1]*vector[1]+vector[2]*vector[2]); + scalar = sqrt(vector[0] * vector[0] + vector[1] * vector[1] + vector[2] * vector[2]); return scalar; } @@ -201,9 +193,8 @@ double ComputeForceTally::compute_scalar() void ComputeForceTally::compute_peratom() { invoked_peratom = update->ntimestep; - if ((did_setup != invoked_peratom) - || (update->eflag_global != invoked_peratom)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // collect contributions from ghost atoms @@ -213,8 +204,7 @@ void ComputeForceTally::compute_peratom() // clear out ghost atom data after it has been collected to local atoms const int nall = atom->nlocal + atom->nghost; for (int i = atom->nlocal; i < nall; ++i) - for (int j = 0; j < size_peratom_cols; ++j) - fatom[i][j] = 0.0; + for (int j = 0; j < size_peratom_cols; ++j) fatom[i][j] = 0.0; } } @@ -224,7 +214,6 @@ void ComputeForceTally::compute_peratom() double ComputeForceTally::memory_usage() { - double bytes = (nmax < 0) ? 0 : nmax*size_peratom_cols * sizeof(double); + double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double); return bytes; } - diff --git a/src/TALLY/compute_heat_flux_tally.cpp b/src/TALLY/compute_heat_flux_tally.cpp index 96456bf775..7bff99eeb7 100644 --- a/src/TALLY/compute_heat_flux_tally.cpp +++ b/src/TALLY/compute_heat_flux_tally.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -15,26 +14,25 @@ #include "compute_heat_flux_tally.h" #include "atom.h" -#include "group.h" -#include "pair.h" -#include "update.h" -#include "memory.h" +#include "comm.h" #include "error.h" #include "force.h" -#include "comm.h" +#include "group.h" +#include "memory.h" +#include "pair.h" +#include "update.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ ComputeHeatFluxTally::ComputeHeatFluxTally(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) + Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute heat/flux/tally command"); + if (narg < 4) error->all(FLERR, "Illegal compute heat/flux/tally command"); igroup2 = group->find(arg[3]); - if (igroup2 == -1) - error->all(FLERR,"Could not find compute heat/flux/tally second group ID"); + if (igroup2 == -1) error->all(FLERR, "Could not find compute heat/flux/tally second group ID"); groupbit2 = group->bitmask[igroup2]; vector_flag = 1; @@ -44,7 +42,7 @@ ComputeHeatFluxTally::ComputeHeatFluxTally(LAMMPS *lmp, int narg, char **arg) : comm_reverse = 7; extvector = 1; size_vector = 6; - peflag = 1; // we need Pair::ev_tally() to be run + peflag = 1; // we need Pair::ev_tally() to be run did_setup = 0; invoked_peratom = invoked_scalar = -1; @@ -71,17 +69,16 @@ 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, "Trying to use compute heat/flux/tally without pair style"); else force->pair->add_tally_callback(this); if (comm->me == 0) { if (force->pair->single_enable == 0 || force->pair->manybody_flag) - error->warning(FLERR,"Compute heat/flux/tally used with incompatible pair style"); + error->warning(FLERR, "Compute heat/flux/tally used with incompatible pair style"); - if (force->bond || force->angle || force->dihedral - || force->improper || force->kspace) - error->warning(FLERR,"Compute heat/flux/tally only called from pair style"); + if (force->bond || force->angle || force->dihedral || force->improper || force->kspace) + error->warning(FLERR, "Compute heat/flux/tally only called from pair style"); } did_setup = -1; } @@ -102,13 +99,13 @@ void ComputeHeatFluxTally::pair_setup_callback(int, int) memory->destroy(stress); memory->destroy(eatom); nmax = atom->nmax; - memory->create(stress,nmax,6,"heat/flux/tally:stress"); - memory->create(eatom,nmax,"heat/flux/tally:eatom"); + memory->create(stress, nmax, 6, "heat/flux/tally:stress"); + memory->create(eatom, nmax, "heat/flux/tally:eatom"); } // clear storage - for (int i=0; i < ntotal; ++i) { + for (int i = 0; i < ntotal; ++i) { eatom[i] = 0.0; stress[i][0] = 0.0; stress[i][1] = 0.0; @@ -118,30 +115,29 @@ void ComputeHeatFluxTally::pair_setup_callback(int, int) stress[i][5] = 0.0; } - for (int i=0; i < size_vector; ++i) - vector[i] = heatj[i] = 0.0; + for (int i = 0; i < size_vector; ++i) vector[i] = heatj[i] = 0.0; did_setup = update->ntimestep; } /* ---------------------------------------------------------------------- */ -void ComputeHeatFluxTally::pair_tally_callback(int i, int j, int nlocal, int newton, - double evdwl, double ecoul, double fpair, - double dx, double dy, double dz) +void ComputeHeatFluxTally::pair_tally_callback(int i, int j, int nlocal, int newton, double evdwl, + double ecoul, double fpair, double dx, double dy, + double dz) { - const int * const mask = atom->mask; + const int *const mask = atom->mask; - if ( ((mask[i] & groupbit) && (mask[j] & groupbit2)) - || ((mask[i] & groupbit2) && (mask[j] & groupbit))) { + if (((mask[i] & groupbit) && (mask[j] & groupbit2)) || + ((mask[i] & groupbit2) && (mask[j] & groupbit))) { const double epairhalf = 0.5 * (evdwl + ecoul); fpair *= 0.5; - const double v0 = dx*dx*fpair; // dx*fpair = Fij_x - const double v1 = dy*dy*fpair; - const double v2 = dz*dz*fpair; - const double v3 = dx*dy*fpair; - const double v4 = dx*dz*fpair; - const double v5 = dy*dz*fpair; + const double v0 = dx * dx * fpair; // dx*fpair = Fij_x + const double v1 = dy * dy * fpair; + const double v2 = dz * dz * fpair; + const double v3 = dx * dy * fpair; + const double v4 = dx * dz * fpair; + const double v5 = dy * dz * fpair; if (newton || i < nlocal) { eatom[i] += epairhalf; @@ -168,7 +164,7 @@ void ComputeHeatFluxTally::pair_tally_callback(int i, int j, int nlocal, int new int ComputeHeatFluxTally::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; m = 0; last = first + n; @@ -188,7 +184,7 @@ int ComputeHeatFluxTally::pack_reverse_comm(int n, int first, double *buf) void ComputeHeatFluxTally::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i, j, m; m = 0; for (i = 0; i < n; i++) { @@ -209,7 +205,7 @@ void ComputeHeatFluxTally::compute_vector() { invoked_vector = update->ntimestep; if ((did_setup != invoked_vector) || (update->eflag_global != invoked_vector)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + error->all(FLERR, "Energy was not tallied on needed timestep"); // collect contributions from ghost atoms @@ -244,26 +240,28 @@ void ComputeHeatFluxTally::compute_vector() double *rmass = atom->rmass; int *type = atom->type; - double jc[3] = {0.0,0.0,0.0}; - double jv[3] = {0.0,0.0,0.0}; + double jc[3] = {0.0, 0.0, 0.0}; + double jv[3] = {0.0, 0.0, 0.0}; for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - const double * const vi = v[i]; - const double * const si = stress[i]; + const double *const vi = v[i]; + const double *const si = stress[i]; double ke_i; - if (rmass) ke_i = pfactor * rmass[i]; - else ke_i = pfactor * mass[type[i]]; - ke_i *= (vi[0]*vi[0] + vi[1]*vi[1] + vi[2]*vi[2]); + if (rmass) + ke_i = pfactor * rmass[i]; + else + ke_i = pfactor * mass[type[i]]; + ke_i *= (vi[0] * vi[0] + vi[1] * vi[1] + vi[2] * vi[2]); ke_i += eatom[i]; - jc[0] += ke_i*vi[0]; - jc[1] += ke_i*vi[1]; - jc[2] += ke_i*vi[2]; - jv[0] += si[0]*vi[0] + si[3]*vi[1] + si[4]*vi[2]; - jv[1] += si[3]*vi[0] + si[1]*vi[1] + si[5]*vi[2]; - jv[2] += si[4]*vi[0] + si[5]*vi[1] + si[2]*vi[2]; + jc[0] += ke_i * vi[0]; + jc[1] += ke_i * vi[1]; + jc[2] += ke_i * vi[2]; + jv[0] += si[0] * vi[0] + si[3] * vi[1] + si[4] * vi[2]; + jv[1] += si[3] * vi[0] + si[1] * vi[1] + si[5] * vi[2]; + jv[2] += si[4] * vi[0] + si[5] * vi[1] + si[2] * vi[2]; } } @@ -274,7 +272,7 @@ void ComputeHeatFluxTally::compute_vector() heatj[3] = jc[0]; heatj[4] = jc[1]; heatj[5] = jc[2]; - MPI_Allreduce(heatj,vector,size_vector,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(heatj, vector, size_vector, MPI_DOUBLE, MPI_SUM, world); } /* ---------------------------------------------------------------------- @@ -283,7 +281,6 @@ void ComputeHeatFluxTally::compute_vector() double ComputeHeatFluxTally::memory_usage() { - double bytes = (nmax < 0) ? 0 : nmax*comm_reverse * sizeof(double); + double bytes = (nmax < 0) ? 0 : nmax * (double)comm_reverse * sizeof(double); return bytes; } - diff --git a/src/TALLY/compute_heat_flux_virial_tally.cpp b/src/TALLY/compute_heat_flux_virial_tally.cpp index 1a594c1b36..8605b9c546 100644 --- a/src/TALLY/compute_heat_flux_virial_tally.cpp +++ b/src/TALLY/compute_heat_flux_virial_tally.cpp @@ -233,6 +233,6 @@ void ComputeHeatFluxVirialTally::compute_peratom() double ComputeHeatFluxVirialTally::memory_usage() { - double bytes = (nmax < 0) ? 0 : nmax * size_peratom_cols * sizeof(double); + double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double); return bytes; } diff --git a/src/TALLY/compute_pe_mol_tally.cpp b/src/TALLY/compute_pe_mol_tally.cpp index 329c9ff429..fc3efb272b 100644 --- a/src/TALLY/compute_pe_mol_tally.cpp +++ b/src/TALLY/compute_pe_mol_tally.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -15,25 +14,23 @@ #include "compute_pe_mol_tally.h" #include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" #include "group.h" #include "pair.h" #include "update.h" -#include "error.h" -#include "force.h" -#include "comm.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputePEMolTally::ComputePEMolTally(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputePEMolTally::ComputePEMolTally(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute pe/mol/tally command"); + if (narg < 4) error->all(FLERR, "Illegal compute pe/mol/tally command"); igroup2 = group->find(arg[3]); - if (igroup2 == -1) - error->all(FLERR,"Could not find compute pe/mol/tally second group ID"); + if (igroup2 == -1) error->all(FLERR, "Could not find compute pe/mol/tally second group ID"); groupbit2 = group->bitmask[igroup2]; vector_flag = 1; @@ -42,7 +39,7 @@ ComputePEMolTally::ComputePEMolTally(LAMMPS *lmp, int narg, char **arg) : dynamic_group_allow = 0; extvector = 1; - peflag = 1; // we need Pair::ev_tally() to be run + peflag = 1; // we need Pair::ev_tally() to be run did_setup = invoked_vector = -1; vector = new double[size_vector]; @@ -61,20 +58,18 @@ ComputePEMolTally::~ComputePEMolTally() void ComputePEMolTally::init() { if (force->pair == nullptr) - error->all(FLERR,"Trying to use compute pe/mol/tally without pair style"); + error->all(FLERR, "Trying to use compute pe/mol/tally without pair style"); else force->pair->add_tally_callback(this); - if (atom->molecule_flag == 0) - error->all(FLERR,"Compute pe/mol/tally requires molecule IDs"); + if (atom->molecule_flag == 0) error->all(FLERR, "Compute pe/mol/tally requires molecule IDs"); if (comm->me == 0) { if (force->pair->single_enable == 0 || force->pair->manybody_flag) - error->warning(FLERR,"Compute pe/mol/tally used with incompatible pair style"); + error->warning(FLERR, "Compute pe/mol/tally used with incompatible pair style"); - if (force->bond || force->angle || force->dihedral - || force->improper || force->kspace) - error->warning(FLERR,"Compute pe/mol/tally only called from pair style"); + if (force->bond || force->angle || force->dihedral || force->improper || force->kspace) + error->warning(FLERR, "Compute pe/mol/tally only called from pair style"); } did_setup = -1; } @@ -93,29 +88,33 @@ void ComputePEMolTally::pair_setup_callback(int, int) } /* ---------------------------------------------------------------------- */ -void ComputePEMolTally::pair_tally_callback(int i, int j, int nlocal, int newton, - double evdwl, double ecoul, double, - double, double, double) +void ComputePEMolTally::pair_tally_callback(int i, int j, int nlocal, int newton, double evdwl, + double ecoul, double, double, double, double) { - const int * const mask = atom->mask; - const tagint * const molid = atom->molecule; + const int *const mask = atom->mask; + const tagint *const molid = atom->molecule; - if ( ((mask[i] & groupbit) && (mask[j] & groupbit2)) - || ((mask[i] & groupbit2) && (mask[j] & groupbit))) { + if (((mask[i] & groupbit) && (mask[j] & groupbit2)) || + ((mask[i] & groupbit2) && (mask[j] & groupbit))) { - evdwl *= 0.5; ecoul *= 0.5; + evdwl *= 0.5; + ecoul *= 0.5; if (newton || i < nlocal) { if (molid[i] == molid[j]) { - etotal[0] += evdwl; etotal[1] += ecoul; + etotal[0] += evdwl; + etotal[1] += ecoul; } else { - etotal[2] += evdwl; etotal[3] += ecoul; + etotal[2] += evdwl; + etotal[3] += ecoul; } } if (newton || j < nlocal) { if (molid[i] == molid[j]) { - etotal[0] += evdwl; etotal[1] += ecoul; + etotal[0] += evdwl; + etotal[1] += ecoul; } else { - etotal[2] += evdwl; etotal[3] += ecoul; + etotal[2] += evdwl; + etotal[3] += ecoul; } } } @@ -127,10 +126,9 @@ void ComputePEMolTally::compute_vector() { invoked_vector = update->ntimestep; if ((did_setup != invoked_vector) || (update->eflag_global != invoked_vector)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + error->all(FLERR, "Energy was not tallied on needed timestep"); // sum accumulated energies across procs - MPI_Allreduce(etotal,vector,size_vector,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(etotal, vector, size_vector, MPI_DOUBLE, MPI_SUM, world); } - diff --git a/src/TALLY/compute_pe_tally.cpp b/src/TALLY/compute_pe_tally.cpp index dae233f830..07cb500e44 100644 --- a/src/TALLY/compute_pe_tally.cpp +++ b/src/TALLY/compute_pe_tally.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -15,26 +14,24 @@ #include "compute_pe_tally.h" #include "atom.h" -#include "group.h" -#include "pair.h" -#include "update.h" -#include "memory.h" +#include "comm.h" #include "error.h" #include "force.h" -#include "comm.h" +#include "group.h" +#include "memory.h" +#include "pair.h" +#include "update.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputePETally::ComputePETally(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputePETally::ComputePETally(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute pe/tally command"); + if (narg < 4) error->all(FLERR, "Illegal compute pe/tally command"); igroup2 = group->find(arg[3]); - if (igroup2 == -1) - error->all(FLERR,"Could not find compute pe/tally second group ID"); + if (igroup2 == -1) error->all(FLERR, "Could not find compute pe/tally second group ID"); groupbit2 = group->bitmask[igroup2]; scalar_flag = 1; @@ -45,7 +42,7 @@ ComputePETally::ComputePETally(LAMMPS *lmp, int narg, char **arg) : comm_reverse = size_peratom_cols = 2; extscalar = 1; - peflag = 1; // we need Pair::ev_tally() to be run + peflag = 1; // we need Pair::ev_tally() to be run did_setup = invoked_peratom = invoked_scalar = -1; nmax = -1; @@ -67,17 +64,16 @@ ComputePETally::~ComputePETally() void ComputePETally::init() { if (force->pair == nullptr) - error->all(FLERR,"Trying to use compute pe/tally without a pair style"); + error->all(FLERR, "Trying to use compute pe/tally without a pair style"); else force->pair->add_tally_callback(this); if (comm->me == 0) { if (force->pair->single_enable == 0 || force->pair->manybody_flag) - error->warning(FLERR,"Compute pe/tally used with incompatible pair style"); + error->warning(FLERR, "Compute pe/tally used with incompatible pair style"); - if (force->bond || force->angle || force->dihedral - || force->improper || force->kspace) - error->warning(FLERR,"Compute pe/tally only called from pair style"); + if (force->bond || force->angle || force->dihedral || force->improper || force->kspace) + error->warning(FLERR, "Compute pe/tally only called from pair style"); } did_setup = -1; } @@ -98,14 +94,13 @@ void ComputePETally::pair_setup_callback(int, int) if (atom->nmax > nmax) { memory->destroy(eatom); nmax = atom->nmax; - memory->create(eatom,nmax,size_peratom_cols,"pe/tally:eatom"); + memory->create(eatom, nmax, size_peratom_cols, "pe/tally:eatom"); array_atom = eatom; } // clear storage - for (int i=0; i < ntotal; ++i) - eatom[i][0] = eatom[i][1] = 0.0; + for (int i = 0; i < ntotal; ++i) eatom[i][0] = eatom[i][1] = 0.0; vector[0] = etotal[0] = vector[1] = etotal[1] = 0.0; @@ -113,23 +108,27 @@ void ComputePETally::pair_setup_callback(int, int) } /* ---------------------------------------------------------------------- */ -void ComputePETally::pair_tally_callback(int i, int j, int nlocal, int newton, - double evdwl, double ecoul, double, - double, double, double) +void ComputePETally::pair_tally_callback(int i, int j, int nlocal, int newton, double evdwl, + double ecoul, double, double, double, double) { - const int * const mask = atom->mask; + const int *const mask = atom->mask; - if ( ((mask[i] & groupbit) && (mask[j] & groupbit2)) - || ((mask[i] & groupbit2) && (mask[j] & groupbit))) { + if (((mask[i] & groupbit) && (mask[j] & groupbit2)) || + ((mask[i] & groupbit2) && (mask[j] & groupbit))) { - evdwl *= 0.5; ecoul *= 0.5; + evdwl *= 0.5; + ecoul *= 0.5; if (newton || i < nlocal) { - etotal[0] += evdwl; eatom[i][0] += evdwl; - etotal[1] += ecoul; eatom[i][1] += ecoul; + etotal[0] += evdwl; + eatom[i][0] += evdwl; + etotal[1] += ecoul; + eatom[i][1] += ecoul; } if (newton || j < nlocal) { - etotal[0] += evdwl; eatom[j][0] += evdwl; - etotal[1] += ecoul; eatom[j][1] += ecoul; + etotal[0] += evdwl; + eatom[j][0] += evdwl; + etotal[1] += ecoul; + eatom[j][1] += ecoul; } } } @@ -138,7 +137,7 @@ void ComputePETally::pair_tally_callback(int i, int j, int nlocal, int newton, int ComputePETally::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; m = 0; last = first + n; @@ -153,7 +152,7 @@ int ComputePETally::pack_reverse_comm(int n, int first, double *buf) void ComputePETally::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i, j, m; m = 0; for (i = 0; i < n; i++) { @@ -168,15 +167,14 @@ void ComputePETally::unpack_reverse_comm(int n, int *list, double *buf) double ComputePETally::compute_scalar() { invoked_scalar = update->ntimestep; - if ((did_setup != invoked_scalar) - || (update->eflag_global != invoked_scalar)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // sum accumulated energies across procs - MPI_Allreduce(etotal,vector,size_peratom_cols,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(etotal, vector, size_peratom_cols, MPI_DOUBLE, MPI_SUM, world); - scalar = vector[0]+vector[1]; + scalar = vector[0] + vector[1]; return scalar; } @@ -185,9 +183,8 @@ double ComputePETally::compute_scalar() void ComputePETally::compute_peratom() { invoked_peratom = update->ntimestep; - if ((did_setup != invoked_peratom) - || (update->eflag_global != invoked_peratom)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // collect contributions from ghost atoms @@ -196,8 +193,7 @@ void ComputePETally::compute_peratom() // clear out ghost atom data after it has been collected to local atoms const int nall = atom->nlocal + atom->nghost; - for (int i = atom->nlocal; i < nall; ++i) - eatom[i][0] = eatom[i][1] = 0.0; + for (int i = atom->nlocal; i < nall; ++i) eatom[i][0] = eatom[i][1] = 0.0; } } @@ -207,7 +203,6 @@ void ComputePETally::compute_peratom() double ComputePETally::memory_usage() { - double bytes = (nmax < 0) ? 0 : nmax*size_peratom_cols * sizeof(double); + double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double); return bytes; } - diff --git a/src/TALLY/compute_stress_tally.cpp b/src/TALLY/compute_stress_tally.cpp index 8ae42ddf02..dea65ade26 100644 --- a/src/TALLY/compute_stress_tally.cpp +++ b/src/TALLY/compute_stress_tally.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -15,27 +14,25 @@ #include "compute_stress_tally.h" #include "atom.h" -#include "group.h" -#include "pair.h" -#include "update.h" -#include "memory.h" -#include "error.h" -#include "force.h" #include "comm.h" #include "domain.h" +#include "error.h" +#include "force.h" +#include "group.h" +#include "memory.h" +#include "pair.h" +#include "update.h" using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ComputeStressTally::ComputeStressTally(LAMMPS *lmp, int narg, char **arg) : - Compute(lmp, narg, arg) +ComputeStressTally::ComputeStressTally(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg < 4) error->all(FLERR,"Illegal compute stress/tally command"); + if (narg < 4) error->all(FLERR, "Illegal compute stress/tally command"); igroup2 = group->find(arg[3]); - if (igroup2 == -1) - error->all(FLERR,"Could not find compute stress/tally second group ID"); + if (igroup2 == -1) error->all(FLERR, "Could not find compute stress/tally second group ID"); groupbit2 = group->bitmask[igroup2]; scalar_flag = 1; @@ -46,7 +43,7 @@ ComputeStressTally::ComputeStressTally(LAMMPS *lmp, int narg, char **arg) : comm_reverse = size_peratom_cols = 6; extscalar = 0; - peflag = 1; // we need Pair::ev_tally() to be run + peflag = 1; // we need Pair::ev_tally() to be run did_setup = invoked_peratom = invoked_scalar = -1; nmax = -1; @@ -70,17 +67,16 @@ ComputeStressTally::~ComputeStressTally() void ComputeStressTally::init() { if (force->pair == nullptr) - error->all(FLERR,"Trying to use compute stress/tally without pair style"); + error->all(FLERR, "Trying to use compute stress/tally without pair style"); else force->pair->add_tally_callback(this); if (comm->me == 0) { if (force->pair->single_enable == 0 || force->pair->manybody_flag) - error->warning(FLERR,"Compute stress/tally used with incompatible pair style"); + error->warning(FLERR, "Compute stress/tally used with incompatible pair style"); - if (force->bond || force->angle || force->dihedral - || force->improper || force->kspace) - error->warning(FLERR,"Compute stress/tally only called from pair style"); + if (force->bond || force->angle || force->dihedral || force->improper || force->kspace) + error->warning(FLERR, "Compute stress/tally only called from pair style"); } did_setup = -1; } @@ -101,55 +97,64 @@ void ComputeStressTally::pair_setup_callback(int, int) if (atom->nmax > nmax) { memory->destroy(stress); nmax = atom->nmax; - memory->create(stress,nmax,size_peratom_cols,"stress/tally:stress"); + memory->create(stress, nmax, size_peratom_cols, "stress/tally:stress"); array_atom = stress; } // clear storage - for (int i=0; i < ntotal; ++i) - for (int j=0; j < size_peratom_cols; ++j) - stress[i][j] = 0.0; + for (int i = 0; i < ntotal; ++i) + for (int j = 0; j < size_peratom_cols; ++j) stress[i][j] = 0.0; - for (int i=0; i < size_peratom_cols; ++i) - vector[i] = virial[i] = 0.0; + for (int i = 0; i < size_peratom_cols; ++i) vector[i] = virial[i] = 0.0; did_setup = update->ntimestep; } /* ---------------------------------------------------------------------- */ -void ComputeStressTally::pair_tally_callback(int i, int j, int nlocal, int newton, - double, double, double fpair, - double dx, double dy, double dz) +void ComputeStressTally::pair_tally_callback(int i, int j, int nlocal, int newton, double, double, + double fpair, double dx, double dy, double dz) { - const int * const mask = atom->mask; + const int *const mask = atom->mask; - if ( ((mask[i] & groupbit) && (mask[j] & groupbit2)) - || ((mask[i] & groupbit2) && (mask[j] & groupbit))) { + if (((mask[i] & groupbit) && (mask[j] & groupbit2)) || + ((mask[i] & groupbit2) && (mask[j] & groupbit))) { fpair *= 0.5; - const double v0 = dx*dx*fpair; - const double v1 = dy*dy*fpair; - const double v2 = dz*dz*fpair; - const double v3 = dx*dy*fpair; - const double v4 = dx*dz*fpair; - const double v5 = dy*dz*fpair; + const double v0 = dx * dx * fpair; + const double v1 = dy * dy * fpair; + const double v2 = dz * dz * fpair; + const double v3 = dx * dy * fpair; + const double v4 = dx * dz * fpair; + const double v5 = dy * dz * fpair; if (newton || i < nlocal) { - virial[0] += v0; stress[i][0] += v0; - virial[1] += v1; stress[i][1] += v1; - virial[2] += v2; stress[i][2] += v2; - virial[3] += v3; stress[i][3] += v3; - virial[4] += v4; stress[i][4] += v4; - virial[5] += v5; stress[i][5] += v5; + virial[0] += v0; + stress[i][0] += v0; + virial[1] += v1; + stress[i][1] += v1; + virial[2] += v2; + stress[i][2] += v2; + virial[3] += v3; + stress[i][3] += v3; + virial[4] += v4; + stress[i][4] += v4; + virial[5] += v5; + stress[i][5] += v5; } if (newton || j < nlocal) { - virial[0] += v0; stress[j][0] += v0; - virial[1] += v1; stress[j][1] += v1; - virial[2] += v2; stress[j][2] += v2; - virial[3] += v3; stress[j][3] += v3; - virial[4] += v4; stress[j][4] += v4; - virial[5] += v5; stress[j][5] += v5; + virial[0] += v0; + stress[j][0] += v0; + virial[1] += v1; + stress[j][1] += v1; + virial[2] += v2; + stress[j][2] += v2; + virial[3] += v3; + stress[j][3] += v3; + virial[4] += v4; + stress[j][4] += v4; + virial[5] += v5; + stress[j][5] += v5; } } } @@ -158,7 +163,7 @@ void ComputeStressTally::pair_tally_callback(int i, int j, int nlocal, int newto int ComputeStressTally::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; m = 0; last = first + n; @@ -177,7 +182,7 @@ int ComputeStressTally::pack_reverse_comm(int n, int first, double *buf) void ComputeStressTally::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i, j, m; m = 0; for (i = 0; i < n; i++) { @@ -196,18 +201,17 @@ void ComputeStressTally::unpack_reverse_comm(int n, int *list, double *buf) double ComputeStressTally::compute_scalar() { invoked_scalar = update->ntimestep; - if ((did_setup != invoked_scalar) - || (update->eflag_global != invoked_scalar)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_scalar) || (update->eflag_global != invoked_scalar)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // sum accumulated forces across procs - MPI_Allreduce(virial,vector,size_peratom_cols,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(virial, vector, size_peratom_cols, MPI_DOUBLE, MPI_SUM, world); if (domain->dimension == 3) - scalar = (vector[0]+vector[1]+vector[2])/3.0; + scalar = (vector[0] + vector[1] + vector[2]) / 3.0; else - scalar = (vector[0]+vector[1])/2.0; + scalar = (vector[0] + vector[1]) / 2.0; return scalar; } @@ -217,9 +221,8 @@ double ComputeStressTally::compute_scalar() void ComputeStressTally::compute_peratom() { invoked_peratom = update->ntimestep; - if ((did_setup != invoked_peratom) - || (update->eflag_global != invoked_peratom)) - error->all(FLERR,"Energy was not tallied on needed timestep"); + if ((did_setup != invoked_peratom) || (update->eflag_global != invoked_peratom)) + error->all(FLERR, "Energy was not tallied on needed timestep"); // collect contributions from ghost atoms @@ -228,8 +231,7 @@ void ComputeStressTally::compute_peratom() const int nall = atom->nlocal + atom->nghost; for (int i = atom->nlocal; i < nall; ++i) - for (int j = 0; j < size_peratom_cols; ++j) - stress[i][j] = 0.0; + for (int j = 0; j < size_peratom_cols; ++j) stress[i][j] = 0.0; } // convert to stress*volume units = -pressure*volume @@ -251,7 +253,6 @@ void ComputeStressTally::compute_peratom() double ComputeStressTally::memory_usage() { - double bytes = (nmax < 0) ? 0 : nmax*size_peratom_cols * sizeof(double); + double bytes = (nmax < 0) ? 0 : nmax * (double)size_peratom_cols * sizeof(double); return bytes; } - From dbe14d9ee733bfee3e5f020ec532dea7e0cfeb3a Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 27 Jul 2021 11:22:20 -0600 Subject: [PATCH 171/352] Add missing method to Kokkos verlet --- src/KOKKOS/verlet_kokkos.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index 492eac3e49..0758f7eefd 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -76,12 +76,12 @@ VerletKokkos::VerletKokkos(LAMMPS *lmp, int narg, char **arg) : void VerletKokkos::setup(int flag) { if (comm->me == 0 && screen) { - fprintf(screen,"Setting up Verlet run ...\n"); + fputs("Setting up Verlet run ...\n",screen); if (flag) { - fprintf(screen," Unit style : %s\n", update->unit_style); - fprintf(screen," Current step : " BIGINT_FORMAT "\n", - update->ntimestep); - fprintf(screen," Time step : %g\n", update->dt); + fmt::print(screen," Unit style : {}\n" + " Current step : {}\n" + " Time step : {}\n", + update->unit_style,update->ntimestep,update->dt); timer->print_timeout(screen); } } @@ -132,6 +132,7 @@ void VerletKokkos::setup(int flag) // compute all forces + force->setup(); ev_set(update->ntimestep); force_clear(); modify->setup_pre_force(vflag); @@ -140,11 +141,10 @@ void VerletKokkos::setup(int flag) atomKK->sync(force->pair->execution_space,force->pair->datamask_read); force->pair->compute(eflag,vflag); atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); - timer->stamp(Timer::PAIR); } else if (force->pair) force->pair->compute_dummy(eflag,vflag); - if (atomKK->molecular) { + if (atomKK->molecular != Atomic::ATOMIC) { if (force->bond) { atomKK->sync(force->bond->execution_space,force->bond->datamask_read); force->bond->compute(eflag,vflag); @@ -165,7 +165,6 @@ void VerletKokkos::setup(int flag) force->improper->compute(eflag,vflag); atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); } - timer->stamp(Timer::BOND); } if (force->kspace) { @@ -174,9 +173,10 @@ void VerletKokkos::setup(int flag) atomKK->sync(force->kspace->execution_space,force->kspace->datamask_read); force->kspace->compute(eflag,vflag); atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); - timer->stamp(Timer::KSPACE); } else force->kspace->compute_dummy(eflag,vflag); } + + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); lmp->kokkos->auto_sync = 0; @@ -244,11 +244,10 @@ void VerletKokkos::setup_minimal(int flag) atomKK->sync(force->pair->execution_space,force->pair->datamask_read); force->pair->compute(eflag,vflag); atomKK->modified(force->pair->execution_space,force->pair->datamask_modify); - timer->stamp(Timer::PAIR); } else if (force->pair) force->pair->compute_dummy(eflag,vflag); - if (atomKK->molecular) { + if (atomKK->molecular != Atom::ATOMIC) { if (force->bond) { atomKK->sync(force->bond->execution_space,force->bond->datamask_read); force->bond->compute(eflag,vflag); @@ -269,7 +268,6 @@ void VerletKokkos::setup_minimal(int flag) force->improper->compute(eflag,vflag); atomKK->modified(force->improper->execution_space,force->improper->datamask_modify); } - timer->stamp(Timer::BOND); } if (force->kspace) { @@ -278,10 +276,10 @@ void VerletKokkos::setup_minimal(int flag) atomKK->sync(force->kspace->execution_space,force->kspace->datamask_read); force->kspace->compute(eflag,vflag); atomKK->modified(force->kspace->execution_space,force->kspace->datamask_modify); - timer->stamp(Timer::KSPACE); } else force->kspace->compute_dummy(eflag,vflag); } + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); lmp->kokkos->auto_sync = 0; @@ -302,6 +300,7 @@ void VerletKokkos::run(int n) int n_post_integrate = modify->n_post_integrate; int n_pre_exchange = modify->n_pre_exchange; int n_pre_neighbor = modify->n_pre_neighbor; + int n_post_neighbor = modify->n_post_neighbor; int n_pre_force = modify->n_pre_force; int n_pre_reverse = modify->n_pre_reverse; int n_post_force = modify->n_post_force; @@ -320,11 +319,11 @@ void VerletKokkos::run(int n) timer->init_timeout(); for (int i = 0; i < n; i++) { - if (timer->check_timeout(i)) { update->nsteps = i; break; } + ntimestep = ++update->ntimestep; ev_set(ntimestep); @@ -388,6 +387,10 @@ void VerletKokkos::run(int n) } neighbor->build(1); timer->stamp(Timer::NEIGH); + if (n_post_neighbor) { + modify->post_neighbor(); + timer->stamp(Timer::MODIFY); + timer->stamp(Timer::NEIGH); } // force computations @@ -648,5 +651,3 @@ void VerletKokkos::force_clear() } } } - - From de4322b54cb61cc39025996bcd33579a27b118f4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 14:32:04 -0400 Subject: [PATCH 172/352] whitespace fixes --- src/INTEL/intel_intrinsics_airebo.h | 4 ++-- src/INTEL/intel_preprocess.h | 2 +- src/INTEL/intel_simd.h | 36 ++++++++++++++--------------- src/INTEL/pair_buck_intel.cpp | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/INTEL/intel_intrinsics_airebo.h b/src/INTEL/intel_intrinsics_airebo.h index ea29888ea1..5a7959c683 100644 --- a/src/INTEL/intel_intrinsics_airebo.h +++ b/src/INTEL/intel_intrinsics_airebo.h @@ -623,7 +623,7 @@ public: ) { assert(scale == sizeof(FVEC_SCAL_T)); # if FVEC_LEN==8 - FVEC_SUFFIX(_mm512_mask_i32scatter_)(mem, mask.val_, + FVEC_SUFFIX(_mm512_mask_i32scatter_)(mem, mask.val_, _mm512_castsi512_si256(idx.val_), a.val_, sizeof(FVEC_SCAL_T)); # else @@ -668,7 +668,7 @@ public: const double * mem, const int scale ) { assert(scale == sizeof(double)); - __m512d lo = _mm512_mask_i32gather_pd(src.lo_, mask.val_, + __m512d lo = _mm512_mask_i32gather_pd(src.lo_, mask.val_, _mm512_castsi512_si256(idx.val_), mem, sizeof(double)); __m512d hi = _mm512_mask_i32gather_pd(src.hi_, get_bvec_hi(mask.val_), diff --git a/src/INTEL/intel_preprocess.h b/src/INTEL/intel_preprocess.h index 41c91d1578..9f4c78c9bc 100644 --- a/src/INTEL/intel_preprocess.h +++ b/src/INTEL/intel_preprocess.h @@ -338,7 +338,7 @@ enum {TIME_PACK, TIME_HOST_NEIGHBOR, TIME_HOST_PAIR, TIME_OFFLOAD_NEIGHBOR, #endif // TO BE DEPRECATED -#ifndef USE_OMP_SIMD +#ifndef USE_OMP_SIMD #define IP_PRE_fdotr_acc_force_l5(lf, lt, minlocal, nthreads, f_start, \ f_stride, pos, ov0, ov1, ov2, \ diff --git a/src/INTEL/intel_simd.h b/src/INTEL/intel_simd.h index eb5d9857a5..2affa6a394 100644 --- a/src/INTEL/intel_simd.h +++ b/src/INTEL/intel_simd.h @@ -838,10 +838,10 @@ namespace ip_simd { x = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom, _MM_SCALE_2); - y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom+1, _MM_SCALE_2); - z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom+2, _MM_SCALE_2); } @@ -852,10 +852,10 @@ namespace ip_simd { x = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom, _MM_SCALE_2); - y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + y = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom+1, _MM_SCALE_2); - z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + z = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), atom+2, _MM_SCALE_2); type = _mm512_mask_i32gather_epi32(_mm512_undefined_epi32(), m, i, atom+3, @@ -895,7 +895,7 @@ namespace ip_simd { const SIMD_int &joffset, SIMD_double &eng) { SIMD_double jeng; SIMD_conflict_pi_reduce1(rmask, joffset, eng); - jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, _mm512_castsi512_si256(joffset), force, _MM_SCALE_2); jeng = jeng + eng; @@ -908,7 +908,7 @@ namespace ip_simd { SIMD_double engd, jeng; engd = _mm512_cvtps_pd(_mm512_castps512_ps256(eng)); SIMD_conflict_pi_reduce1(rmask, joffset, engd); - jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, _mm512_castsi512_si256(joffset), force, _MM_SCALE_2); jeng = jeng + engd; @@ -920,7 +920,7 @@ namespace ip_simd { _mm512_shuffle_f32x4(eng,eng,238))); SIMD_int joffset2 = _mm512_shuffle_i32x4(joffset, joffset, 238); SIMD_conflict_pi_reduce1(rmask2, joffset2, engd); - jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, _mm512_castsi512_si256(joffset2), force, _MM_SCALE_2); jeng = jeng + engd; @@ -939,7 +939,7 @@ namespace ip_simd { SIMD_double jeng; SIMD_conflict_pi_reduce1(rmask, joffset, eng); - jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + jeng = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, _mm512_castsi512_si256(joffset), force, _MM_SCALE_2); jeng = jeng + eng; @@ -971,7 +971,7 @@ namespace ip_simd { SIMD_double &fy, SIMD_double &fz) { SIMD_conflict_pi_reduce3(m, i, fx, fy, fz); SIMD_double jfrc; - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), force, _MM_SCALE_2); jfrc = jfrc + fx; @@ -983,7 +983,7 @@ namespace ip_simd { jfrc = jfrc + fy; _mm512_mask_i32scatter_pd(force+1, m, _mm512_castsi512_si256(i), jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), force + 2, _MM_SCALE_2); jfrc = jfrc + fz; @@ -1000,13 +1000,13 @@ namespace ip_simd { amzd = _mm512_cvtps_pd(_mm512_castps512_ps256(amz)); SIMD_conflict_pi_reduce3(rmask, joffset, amxd, amyd, amzd); SIMD_double jfrc; - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, _mm512_castsi512_si256(joffset), force, _MM_SCALE_2); jfrc = jfrc + amxd; _mm512_mask_i32scatter_pd(force, rmask, _mm512_castsi512_si256(joffset), jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask, _mm512_castsi512_si256(joffset), force + 1, _MM_SCALE_2); jfrc = jfrc + amyd; @@ -1028,13 +1028,13 @@ namespace ip_simd { _mm512_shuffle_f32x4(amz,amz,238))); SIMD_int joffset2 = _mm512_shuffle_i32x4(joffset, joffset, 238); SIMD_conflict_pi_reduce3(rmask2, joffset2, amxd, amyd, amzd); - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, _mm512_castsi512_si256(joffset2), force, _MM_SCALE_2); jfrc = jfrc + amxd; _mm512_mask_i32scatter_pd(force, rmask2, _mm512_castsi512_si256(joffset2), jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), rmask2, _mm512_castsi512_si256(joffset2), force + 1, _MM_SCALE_2); jfrc = jfrc + amyd; @@ -1045,7 +1045,7 @@ namespace ip_simd { _mm512_castsi512_si256(joffset2), force + 2, _MM_SCALE_2); jfrc = jfrc + amzd; - _mm512_mask_i32scatter_pd(force+2, rmask2, + _mm512_mask_i32scatter_pd(force+2, rmask2, _mm512_castsi512_si256(joffset2), jfrc, _MM_SCALE_2); } @@ -1099,7 +1099,7 @@ namespace ip_simd { const SIMD_int &i, const SIMD_double &fx, const SIMD_double &fy, const SIMD_double &fz) { SIMD_double jfrc; - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), force, _MM_SCALE_2); jfrc = jfrc - fx; @@ -1866,7 +1866,7 @@ namespace ip_simd { jfrc = jfrc + fx; _mm512_mask_i32scatter_pd(force, m, _mm512_castsi512_si256(i), jfrc, _MM_SCALE_2); - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), force + 1, _MM_SCALE_2); jfrc = jfrc + fy; @@ -1880,7 +1880,7 @@ namespace ip_simd { _MM_SCALE_2); if (EFLAG) { if (eatom) { - jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, + jfrc = _mm512_mask_i32gather_pd(_mm512_undefined_pd(), m, _mm512_castsi512_si256(i), force + 3, _MM_SCALE_2); jfrc = jfrc + fwtmp; diff --git a/src/INTEL/pair_buck_intel.cpp b/src/INTEL/pair_buck_intel.cpp index 2dae75f920..f15669e1d3 100644 --- a/src/INTEL/pair_buck_intel.cpp +++ b/src/INTEL/pair_buck_intel.cpp @@ -231,7 +231,7 @@ void PairBuckIntel::eval(const int offload, const int vflag, fxtmp = fytmp = fztmp = (acc_t)0; if (EFLAG) fwtmp = sevdwl = (acc_t)0; if (NEWTON_PAIR == 0) - if (vflag == VIRIAL_PAIR) + if (vflag == VIRIAL_PAIR) sv0 = sv1 = sv2 = sv3 = sv4 = sv5 = (acc_t)0; #if defined(LMP_SIMD_COMPILER) From c4eee478b1b749249864e2e53caea7730d520532 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 15:53:35 -0400 Subject: [PATCH 173/352] move back to src for dependencies --- doc/src/fix_nve_noforce.rst | 3 +-- src/{EXTRA-FIX => }/fix_nve_noforce.cpp | 0 src/{EXTRA-FIX => }/fix_nve_noforce.h | 0 3 files changed, 1 insertion(+), 2 deletions(-) rename src/{EXTRA-FIX => }/fix_nve_noforce.cpp (100%) rename src/{EXTRA-FIX => }/fix_nve_noforce.h (100%) diff --git a/doc/src/fix_nve_noforce.rst b/doc/src/fix_nve_noforce.rst index ee02f795a1..ed13123403 100644 --- a/doc/src/fix_nve_noforce.rst +++ b/doc/src/fix_nve_noforce.rst @@ -49,8 +49,7 @@ the :doc:`run ` command. This fix is not invoked during :doc:`energy minim Restrictions """""""""""" -This fix is part of the EXTRA-FIX package. It is only enabled if LAMMPS -was built with that package. See the :doc:`Build package ` page for more info. +none Related commands """""""""""""""" diff --git a/src/EXTRA-FIX/fix_nve_noforce.cpp b/src/fix_nve_noforce.cpp similarity index 100% rename from src/EXTRA-FIX/fix_nve_noforce.cpp rename to src/fix_nve_noforce.cpp diff --git a/src/EXTRA-FIX/fix_nve_noforce.h b/src/fix_nve_noforce.h similarity index 100% rename from src/EXTRA-FIX/fix_nve_noforce.h rename to src/fix_nve_noforce.h From f20479f10e3bb276e383a06c96b681fb4a0ae898 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 27 Jul 2021 15:47:42 -0600 Subject: [PATCH 174/352] Fix typo --- src/KOKKOS/verlet_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index 0758f7eefd..a4a72c0778 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -144,7 +144,7 @@ void VerletKokkos::setup(int flag) } else if (force->pair) force->pair->compute_dummy(eflag,vflag); - if (atomKK->molecular != Atomic::ATOMIC) { + if (atomKK->molecular != Atom::ATOMIC) { if (force->bond) { atomKK->sync(force->bond->execution_space,force->bond->datamask_read); force->bond->compute(eflag,vflag); From 416048e939451a3ad9123e685175b1792adada61 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Tue, 27 Jul 2021 15:57:06 -0600 Subject: [PATCH 175/352] Fix compile error --- src/KOKKOS/verlet_kokkos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index a4a72c0778..909c6930cf 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -390,7 +390,7 @@ void VerletKokkos::run(int n) if (n_post_neighbor) { modify->post_neighbor(); timer->stamp(Timer::MODIFY); - timer->stamp(Timer::NEIGH); + } } // force computations From fe34fe26b2e4c1521c605e0be1cd92c199a7e3d4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 18:21:08 -0400 Subject: [PATCH 176/352] add a hard dependency on EXTRA-PAIR to the DIELECTRIC package --- cmake/CMakeLists.txt | 1 + src/DIELECTRIC/Install.sh | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index f1fc2e5068..a778c89d42 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -312,6 +312,7 @@ pkg_depends(LATBOLTZ MPI) pkg_depends(PHONON KSPACE) pkg_depends(SCAFACOS MPI) pkg_depends(DIELECTRIC KSPACE) +pkg_depends(DIELECTRIC EXTRA-PAIR) pkg_depends(CG-DNA MOLECULE) pkg_depends(CG-DNA ASPHERE) diff --git a/src/DIELECTRIC/Install.sh b/src/DIELECTRIC/Install.sh index f07446e15b..2505eb1a59 100644 --- a/src/DIELECTRIC/Install.sh +++ b/src/DIELECTRIC/Install.sh @@ -34,6 +34,10 @@ if (test $1 = 1) then echo "Must install KSPACE package with DIELECTRIC package" exit 1 fi + if (test ! -e ../pair_lj_cut_coul_debye.cpp) then + echo "Must install EXTRA-PAIR package with DIELECTRIC package" + exit 1 + fi fi for file in *.cpp *.h; do From 269690b771882997a3bcc462526dcfcc5f057eea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 18:21:22 -0400 Subject: [PATCH 177/352] document hard package dependencies --- doc/src/Packages_details.rst | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/src/Packages_details.rst b/doc/src/Packages_details.rst index 28ae032d34..b4e50fad75 100644 --- a/doc/src/Packages_details.rst +++ b/doc/src/Packages_details.rst @@ -189,6 +189,7 @@ atomic information to continuum fields. **Install:** This package has :ref:`specific installation instructions ` on the :doc:`Build extras ` page. +The ATC package requires that also the `MANYBODY `_ package is installed. **Supporting info:** @@ -518,6 +519,11 @@ compute for simulating systems using boundary element solvers for computing the induced charges at the interface between two media with different dielectric constants. +**Install:** + +To use this package, also the :ref:`KSPACE ` and +:ref:`EXTRA-PAIR ` packages need to be installed. + **Author:** Trung Nguyen and Monica Olvera de la Cruz (Northwestern U) **Supporting info:** @@ -1210,6 +1216,10 @@ can be used to model MD particles influenced by hydrodynamic forces. **Authors:** Frances Mackay and Colin Denniston (University of Western Ontario). +**Install:** + +The LATBOLTZ package requires that LAMMPS is build in :ref:`MPI parallel mode `. + **Supporting info:** * src/LATBOLTZ: filenames -> commands @@ -1603,9 +1613,9 @@ A general interface for machine-learning interatomic potentials, including PyTor **Install:** -To use this package, also the :ref:`ML-SNAP package ` package needs +To use this package, also the :ref:`ML-SNAP ` package needs to be installed. To make the *mliappy* model available, also the -:ref:`PYTHON package ` package needs to be installed, the version +:ref:`PYTHON ` package needs to be installed, the version of Python must be 3.6 or later, and the `cython `_ software must be installed. @@ -1870,6 +1880,10 @@ MPIIO library. It adds :doc:`dump styles ` with a "mpiio" in their style name. Restart files with an ".mpiio" suffix are also written and read in parallel. +**Install:** + +The MPIIO package requires that LAMMPS is build in :ref:`MPI parallel mode `. + **Supporting info:** * src/MPIIO: filenames -> commands @@ -2103,6 +2117,12 @@ And a :doc:`dynamical_matrix ` as well as a :doc:`third_order ` command to compute the dynamical matrix and third order tensor from finite differences. +**Install:** + +The PHONON package requires that also the `KSPACE `_ +package is installed. + + **Authors:** Ling-Ti Kong (Shanghai Jiao Tong University) for "fix phonon" and Charlie Sievers (UC Davis) for "dynamical_matrix" and "third_order" @@ -2486,6 +2506,7 @@ the Forschungszentrum Juelich. **Install:** This package has :ref:`specific installation instructions ` on the :doc:`Build extras ` page. +The SCAFACOS package requires that LAMMPS is build in :ref:`MPI parallel mode `. **Supporting info:** From bb5da016d413768ee54a9c7e9d02b96596bd098a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 27 Jul 2021 18:21:45 -0400 Subject: [PATCH 178/352] add dependencies for KOKKOS style to the conventional build --- src/KOKKOS/Install.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 073f094836..5e7285a75f 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -251,20 +251,20 @@ action pair_lj_class2_kokkos.cpp pair_lj_class2.cpp action pair_lj_class2_kokkos.h pair_lj_class2.h action pair_lj_cut_coul_cut_kokkos.cpp action pair_lj_cut_coul_cut_kokkos.h -action pair_lj_cut_coul_debye_kokkos.cpp -action pair_lj_cut_coul_debye_kokkos.h -action pair_lj_cut_coul_dsf_kokkos.cpp -action pair_lj_cut_coul_dsf_kokkos.h +action pair_lj_cut_coul_debye_kokkos.cpp pair_lj_cut_coul_debye.cpp +action pair_lj_cut_coul_debye_kokkos.h pair_lj_cut_coul_debye.h +action pair_lj_cut_coul_dsf_kokkos.cpp pair_lj_cut_coul_dsf.cpp +action pair_lj_cut_coul_dsf_kokkos.h pair_lj_cut_coul_dsf.h action pair_lj_cut_coul_long_kokkos.cpp pair_lj_cut_coul_long.cpp action pair_lj_cut_coul_long_kokkos.h pair_lj_cut_coul_long.h action pair_lj_cut_kokkos.cpp action pair_lj_cut_kokkos.h action pair_lj_expand_kokkos.cpp action pair_lj_expand_kokkos.h -action pair_lj_gromacs_coul_gromacs_kokkos.cpp -action pair_lj_gromacs_coul_gromacs_kokkos.h -action pair_lj_gromacs_kokkos.cpp -action pair_lj_gromacs_kokkos.h +action pair_lj_gromacs_coul_gromacs_kokkos.cpp pair_lj_gromacs_coul_gromacs.cpp +action pair_lj_gromacs_coul_gromacs_kokkos.h pair_lj_gromacs_coul_gromacs.h +action pair_lj_gromacs_kokkos.cpp pair_lj_gromacs.cpp +action pair_lj_gromacs_kokkos.h pair_lj_gromacs.h action pair_lj_sdk_kokkos.cpp pair_lj_sdk.cpp action pair_lj_sdk_kokkos.h pair_lj_sdk.h action pair_morse_kokkos.cpp From 74a27c102e8edcdc084e45dbd4a8d7e87a104083 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 12:11:35 -0400 Subject: [PATCH 179/352] correct prerequisite --- unittest/force-styles/tests/atomic-pair-lj_relres.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unittest/force-styles/tests/atomic-pair-lj_relres.yaml b/unittest/force-styles/tests/atomic-pair-lj_relres.yaml index 99a83e0c8d..704bb46785 100644 --- a/unittest/force-styles/tests/atomic-pair-lj_relres.yaml +++ b/unittest/force-styles/tests/atomic-pair-lj_relres.yaml @@ -3,7 +3,7 @@ lammps_version: 10 Feb 2021 date_generated: Sun Feb 28 23:32:03 2021 epsilon: 5e-13 prerequisites: ! | - pair born + pair lj/relres pre_commands: ! "" post_commands: ! "" input_file: in.metal From 600471d07f2af2664dbbb996e3a28ca3bb659b0c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 12:11:54 -0400 Subject: [PATCH 180/352] skip run test with fix when fix is not available --- unittest/formats/test_dump_custom.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unittest/formats/test_dump_custom.cpp b/unittest/formats/test_dump_custom.cpp index 772acaacb6..90876dcb2d 100644 --- a/unittest/formats/test_dump_custom.cpp +++ b/unittest/formats/test_dump_custom.cpp @@ -143,6 +143,8 @@ TEST_F(DumpCustomTest, compute_run0) TEST_F(DumpCustomTest, fix_run0) { + if (!info->has_style("fix", "numdiff")) GTEST_SKIP(); + BEGIN_HIDE_OUTPUT(); command("fix numdiff all numdiff 1 0.0001"); END_HIDE_OUTPUT(); From 32be894ae2b120ffc8eaac4111b783f251a1c765 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 16:16:22 -0400 Subject: [PATCH 181/352] silence compiler warnings --- src/CG-DNA/atom_vec_oxdna.cpp | 2 +- src/CG-DNA/pair_oxdna_stk.cpp | 1 - src/CG-DNA/pair_oxrna2_stk.cpp | 1 - src/DIELECTRIC/pppm_disp_dielectric.cpp | 1 - src/DPD-SMOOTH/fix_meso_move.cpp | 2 +- 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/CG-DNA/atom_vec_oxdna.cpp b/src/CG-DNA/atom_vec_oxdna.cpp index 7ce2189a64..f5d56eef31 100644 --- a/src/CG-DNA/atom_vec_oxdna.cpp +++ b/src/CG-DNA/atom_vec_oxdna.cpp @@ -80,7 +80,7 @@ void AtomVecOxdna::data_atom_post(int ilocal) store 5' partner to inform 3'->5' bond directionality ------------------------------------------------------------------------- */ -void AtomVecOxdna::data_bonds_post(int m, int num_bond, tagint atom1, tagint atom2, +void AtomVecOxdna::data_bonds_post(int /*m*/, int /*num_bond*/, tagint atom1, tagint atom2, tagint id_offset) { int n; diff --git a/src/CG-DNA/pair_oxdna_stk.cpp b/src/CG-DNA/pair_oxdna_stk.cpp index 63439e3ac4..2f1a0bf1b6 100644 --- a/src/CG-DNA/pair_oxdna_stk.cpp +++ b/src/CG-DNA/pair_oxdna_stk.cpp @@ -255,7 +255,6 @@ void PairOxdnaStk::compute(int eflag, int vflag) double f1,f4t4,f4t5,f4t6,f5c1,f5c2; double df1,df4t4,df4t5,df4t6,df5c1,df5c2; - double tptofp; evdwl = 0.0; ev_init(eflag,vflag); diff --git a/src/CG-DNA/pair_oxrna2_stk.cpp b/src/CG-DNA/pair_oxrna2_stk.cpp index b6b68662d5..4d733f53b5 100644 --- a/src/CG-DNA/pair_oxrna2_stk.cpp +++ b/src/CG-DNA/pair_oxrna2_stk.cpp @@ -272,7 +272,6 @@ void PairOxrna2Stk::compute(int eflag, int vflag) double f1,f4t5,f4t6,f4t9,f4t10,f5c1,f5c2; double df1,df4t5,df4t6,df4t9,df4t10,df5c1,df5c2; - double tptofp; evdwl = 0.0; ev_init(eflag,vflag); diff --git a/src/DIELECTRIC/pppm_disp_dielectric.cpp b/src/DIELECTRIC/pppm_disp_dielectric.cpp index b6a82296b2..944225dd43 100644 --- a/src/DIELECTRIC/pppm_disp_dielectric.cpp +++ b/src/DIELECTRIC/pppm_disp_dielectric.cpp @@ -609,7 +609,6 @@ void PPPMDispDielectric::fieldforce_c_ad() double *q = atom->q; double **x = atom->x; double **f = atom->f; - double *eps = atom->epsilon; int nlocal = atom->nlocal; for (i = 0; i < nlocal; i++) { diff --git a/src/DPD-SMOOTH/fix_meso_move.cpp b/src/DPD-SMOOTH/fix_meso_move.cpp index 220019ea98..85eee5ffbe 100644 --- a/src/DPD-SMOOTH/fix_meso_move.cpp +++ b/src/DPD-SMOOTH/fix_meso_move.cpp @@ -68,7 +68,7 @@ FixMesoMove::FixMesoMove (LAMMPS *lmp, int narg, char **arg) : // parse args - int iarg; + int iarg = narg; if (strcmp(arg[3],"linear") == 0) { if (narg < 7) error->all(FLERR,"Illegal fix meso/move command"); From f46e1c98f71447cf078c512f8ad92ed25ceabc54 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 16:16:42 -0400 Subject: [PATCH 182/352] removed dead code and make consistent with non-OPENMP version --- src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp index 22ae388236..eacb774372 100644 --- a/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp +++ b/src/OPENMP/pair_lj_cut_coul_cut_dielectric_omp.cpp @@ -104,11 +104,11 @@ void PairLJCutCoulCutDielectricOMP::compute(int eflag, int vflag) template void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const thr) { - int i, j, ii, jj, jnum, itype, jtype, itable; - double qtmp, etmp, xtmp, ytmp, ztmp, delx, dely, delz, evdwl, ecoul, fpair; + int i, j, ii, jj, jnum, itype, jtype; + double qtmp, etmp, xtmp, ytmp, ztmp, delx, dely, delz, evdwl, ecoul; double fpair_i, fpair_j; - double r, rsq, r2inv, r6inv, forcecoul, forcelj, factor_coul, factor_lj; - double grij, expm2, prefactor, t, erfc, prefactorE, efield_i, epot_i; + double rsq, r2inv, r6inv, forcecoul, forcelj, factor_coul, factor_lj; + double efield_i, epot_i; int *ilist, *jlist, *numneigh, **firstneigh; evdwl = ecoul = 0.0; @@ -221,7 +221,7 @@ void PairLJCutCoulCutDielectricOMP::eval(int iifrom, int iito, ThrData *const th } if (EVFLAG) - ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair, delx, dely, delz, thr); + ev_tally_thr(this, i, j, nlocal, NEWTON_PAIR, evdwl, ecoul, fpair_i, delx, dely, delz, thr); } } f[i].x += fxtmp; From 9a4bc8eda12124606f4156a623ff60f759c03715 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 16:16:54 -0400 Subject: [PATCH 183/352] apply citation reminder --- src/ML-RANN/pair_rann.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 73ff747c81..01ef76ec87 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -61,7 +61,7 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918 using namespace LAMMPS_NS; -static const char cite_user_rann_package[] = +static const char cite_ml_rann_package[] = "ML-RANN package:\n\n" "@Article{Nitol2021,\n" " author = {Nitol, Mashroor S and Dickel, Doyl E and Barrett, Christopher D},\n" @@ -75,6 +75,8 @@ static const char cite_user_rann_package[] = PairRANN::PairRANN(LAMMPS *lmp) : Pair(lmp) { + lmp->citeme->add(cite_ml_rann_package); + //initialize ints and bools single_enable = 0; restartinfo = 0; @@ -353,7 +355,7 @@ void PairRANN::read_file(char *filename) int eof = 0; std::string line,line1; const int longline = 4096; - int linenum; + int linenum=0; char linetemp[longline]; std::string strtemp; char *ptr; From 218467b38553a1885da565a0b4a4225523c22863 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 16:17:12 -0400 Subject: [PATCH 184/352] use fabs() instead of abs() on floating point number --- src/MDI/fix_mdi_engine.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/MDI/fix_mdi_engine.cpp b/src/MDI/fix_mdi_engine.cpp index db9e114488..81eb87a0f3 100644 --- a/src/MDI/fix_mdi_engine.cpp +++ b/src/MDI/fix_mdi_engine.cpp @@ -554,7 +554,7 @@ void FixMDIEngine::send_charges(Error *error) void FixMDIEngine::send_energy(Error *error) { // get conversion factor to atomic units - double energy_conv; + double energy_conv = 1.0; if (lmpunits == REAL) { double kelvin_to_hartree; MDI_Conversion_factor("kelvin_energy", "hartree", &kelvin_to_hartree); @@ -884,10 +884,9 @@ void FixMDIEngine::receive_cell(Error *error) // ensure that the new cell vector is orthogonal double small = std::numeric_limits::min(); - if (abs(celldata[1]) > small or abs(celldata[2]) > small or abs(celldata[3]) > small or - abs(celldata[5]) > small or abs(celldata[6]) > small or abs(celldata[7]) > small) { - error->all(FLERR, - "MDI: LAMMPS currently only supports the >CELL command for orthogonal cell vectors"); + if (fabs(celldata[1]) > small or fabs(celldata[2]) > small or fabs(celldata[3]) > small or + fabs(celldata[5]) > small or fabs(celldata[6]) > small or fabs(celldata[7]) > small) { + error->all(FLERR, "MDI: LAMMPS currently only supports the >CELL command for orthogonal cell vectors"); } // set the new LAMMPS cell dimensions From 3a5d3fc5416b72b57d20c38e6a1bf30d00548f3a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 18:11:59 -0400 Subject: [PATCH 185/352] fix compilation --- src/ML-RANN/pair_rann.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 01ef76ec87..00043323c3 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -32,6 +32,7 @@ DISTRIBUTION A. Approved for public release; distribution unlimited. OPSEC#4918 #include "pair_rann.h" #include "atom.h" +#include "citeme.h" #include "comm.h" #include "error.h" #include "force.h" From 6fcfbb7793a2dd9aaa22a8b7778587373ea85395 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 18:18:54 -0400 Subject: [PATCH 186/352] add missing dependency for conventional build --- src/GPU/Install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GPU/Install.sh b/src/GPU/Install.sh index 8d55cd5857..e2bdf0566b 100755 --- a/src/GPU/Install.sh +++ b/src/GPU/Install.sh @@ -47,8 +47,8 @@ action pair_born_coul_long_gpu.cpp pair_born_coul_long.cpp action pair_born_coul_long_gpu.h pair_born_coul_long.cpp action pair_born_coul_long_cs_gpu.cpp pair_born_coul_long_cs.cpp action pair_born_coul_long_cs_gpu.h pair_born_coul_long_cs.cpp -action pair_born_coul_wolf_gpu.cpp -action pair_born_coul_wolf_gpu.h +action pair_born_coul_wolf_gpu.cpp pair_born_coul_wolf.cpp +action pair_born_coul_wolf_gpu.h pair_born_coul_wolf.h action pair_born_coul_wolf_cs_gpu.cpp pair_born_coul_wolf_cs.cpp action pair_born_coul_wolf_cs_gpu.h pair_born_coul_wolf_cs.cpp action pair_born_gpu.cpp From 294ac76f41dfc037771cc5f8a1a1f98021d5e773 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 18:33:33 -0400 Subject: [PATCH 187/352] forgot to move pair style beck to EXTRA-PAIR --- doc/src/pair_beck.rst | 5 ++++- src/{ => EXTRA-PAIR}/pair_beck.cpp | 0 src/{ => EXTRA-PAIR}/pair_beck.h | 0 3 files changed, 4 insertions(+), 1 deletion(-) rename src/{ => EXTRA-PAIR}/pair_beck.cpp (100%) rename src/{ => EXTRA-PAIR}/pair_beck.h (100%) diff --git a/doc/src/pair_beck.rst b/doc/src/pair_beck.rst index d220e0abdd..2bf027515c 100644 --- a/doc/src/pair_beck.rst +++ b/doc/src/pair_beck.rst @@ -84,7 +84,10 @@ This pair style can only be used via the *pair* keyword of the Restrictions """""""""""" -none + +This pair style is part of the EXTRA-PAIR package. It is only enabled if +LAMMPS was built with that package. See the +:doc:`Build package ` page for more info. Related commands """""""""""""""" diff --git a/src/pair_beck.cpp b/src/EXTRA-PAIR/pair_beck.cpp similarity index 100% rename from src/pair_beck.cpp rename to src/EXTRA-PAIR/pair_beck.cpp diff --git a/src/pair_beck.h b/src/EXTRA-PAIR/pair_beck.h similarity index 100% rename from src/pair_beck.h rename to src/EXTRA-PAIR/pair_beck.h From d33863839e68ff455c21ed2f3a21d03e78a9d2d0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 18:37:59 -0400 Subject: [PATCH 188/352] update pair style installation dependencies --- src/GPU/Install.sh | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/GPU/Install.sh b/src/GPU/Install.sh index e2bdf0566b..2e2b32d96a 100755 --- a/src/GPU/Install.sh +++ b/src/GPU/Install.sh @@ -41,8 +41,8 @@ action fix_npt_gpu.cpp action fix_nve_asphere_gpu.h fix_nve_asphere.h action fix_nve_asphere_gpu.cpp fix_nve_asphere.cpp action gpu_extra.h -action pair_beck_gpu.cpp -action pair_beck_gpu.h +action pair_beck_gpu.cpp pair_beck.cpp +action pair_beck_gpu.h pair_beck.h action pair_born_coul_long_gpu.cpp pair_born_coul_long.cpp action pair_born_coul_long_gpu.h pair_born_coul_long.cpp action pair_born_coul_long_cs_gpu.cpp pair_born_coul_long_cs.cpp @@ -71,10 +71,10 @@ action pair_coul_long_gpu.cpp pair_coul_long.cpp action pair_coul_long_gpu.h pair_coul_long.cpp action pair_coul_long_cs_gpu.cpp pair_coul_long_cs.cpp action pair_coul_long_cs_gpu.h pair_coul_long_cs.cpp -action pair_dpd_gpu.cpp -action pair_dpd_gpu.h -action pair_dpd_tstat_gpu.cpp -action pair_dpd_tstat_gpu.h +action pair_dpd_gpu.cpp pair_dpd.cpp +action pair_dpd_gpu.h pair_dpd.h +action pair_dpd_tstat_gpu.cpp pair_dpd_tstat.cpp +action pair_dpd_tstat_gpu.h pair_dpd_tstat.h action pair_lj_cut_dipole_cut_gpu.cpp pair_lj_cut_dipole_cut.cpp action pair_lj_cut_dipole_cut_gpu.h pair_lj_cut_dipole_cut.cpp action pair_lj_sf_dipole_sf_gpu.cpp pair_lj_sf_dipole_sf.cpp @@ -85,12 +85,12 @@ action pair_eam_fs_gpu.cpp pair_eam.cpp action pair_eam_fs_gpu.h pair_eam.cpp action pair_eam_gpu.cpp pair_eam.cpp action pair_eam_gpu.h pair_eam.cpp -action pair_gauss_gpu.cpp -action pair_gauss_gpu.h +action pair_gauss_gpu.cpp pair_gauss.cpp +action pair_gauss_gpu.h pair_gauss.h action pair_gayberne_gpu.cpp pair_gayberne.cpp action pair_gayberne_gpu.h pair_gayberne.cpp -action pair_lj96_cut_gpu.cpp -action pair_lj96_cut_gpu.h +action pair_lj96_cut_gpu.cpp pair_lj96_cut.cpp +action pair_lj96_cut_gpu.h pair_lj96_cut.h action pair_lj_charmm_coul_long_gpu.cpp pair_lj_charmm_coul_long.cpp action pair_lj_charmm_coul_long_gpu.h pair_lj_charmm_coul_long.cpp action pair_lj_charmm_coul_charmm_gpu.cpp pair_lj_charmm_coul_charmm.cpp @@ -99,14 +99,14 @@ action pair_lj_class2_coul_long_gpu.cpp pair_lj_class2_coul_long.cpp action pair_lj_class2_coul_long_gpu.h pair_lj_class2_coul_long.cpp action pair_lj_class2_gpu.cpp pair_lj_class2.cpp action pair_lj_class2_gpu.h pair_lj_class2.cpp -action pair_lj_cubic_gpu.cpp -action pair_lj_cubic_gpu.h +action pair_lj_cubic_gpu.cpp pair_lj_cubic.cpp +action pair_lj_cubic_gpu.h pair_lj_cubic.h action pair_lj_cut_coul_cut_gpu.cpp action pair_lj_cut_coul_cut_gpu.h -action pair_lj_cut_coul_debye_gpu.cpp -action pair_lj_cut_coul_debye_gpu.h -action pair_lj_cut_coul_dsf_gpu.cpp -action pair_lj_cut_coul_dsf_gpu.h +action pair_lj_cut_coul_debye_gpu.cpp pair_lj_cut_coul_debye.cpp +action pair_lj_cut_coul_debye_gpu.h pair_lj_cut_coul_debye.h +action pair_lj_cut_coul_dsf_gpu.cpp pair_lj_cut_coul_dsf.cpp +action pair_lj_cut_coul_dsf_gpu.h pair_lj_cut_coul_dsf.h action pair_lj_cut_coul_long_gpu.cpp pair_lj_cut_coul_long.cpp action pair_lj_cut_coul_long_gpu.h pair_lj_cut_coul_long.cpp action pair_lj_cut_coul_msm_gpu.cpp pair_lj_cut_coul_msm.cpp @@ -119,14 +119,14 @@ action pair_lj_expand_gpu.cpp action pair_lj_expand_gpu.h action pair_lj_expand_coul_long_gpu.cpp pair_lj_expand_coul_long.cpp action pair_lj_expand_coul_long_gpu.h pair_lj_expand_coul_long.cpp -action pair_lj_gromacs_gpu.cpp -action pair_lj_gromacs_gpu.h +action pair_lj_gromacs_gpu.cpp pair_lj_gromacs.cpp +action pair_lj_gromacs_gpu.h pair_lj_gromacs.h action pair_lj_sdk_coul_long_gpu.cpp pair_lj_sdk_coul_long.cpp action pair_lj_sdk_coul_long_gpu.h pair_lj_sdk_coul_long.cpp action pair_lj_sdk_gpu.cpp pair_lj_sdk.cpp action pair_lj_sdk_gpu.h pair_lj_sdk.cpp -action pair_mie_cut_gpu.cpp -action pair_mie_cut_gpu.h +action pair_mie_cut_gpu.cpp pair_mie_cut.cpp +action pair_mie_cut_gpu.h pair_mie_cut.h action pair_morse_gpu.cpp action pair_morse_gpu.h action pair_resquared_gpu.cpp pair_resquared.cpp @@ -153,8 +153,8 @@ action pair_zbl_gpu.cpp action pair_zbl_gpu.h action pppm_gpu.cpp pppm.cpp action pppm_gpu.h pppm.cpp -action pair_ufm_gpu.cpp -action pair_ufm_gpu.h +action pair_ufm_gpu.cpp pair_ufm.cpp +action pair_ufm_gpu.h pair_ufm.h action pair_lj_cut_dipole_long_gpu.cpp pair_lj_cut_dipole_long.cpp action pair_lj_cut_dipole_long_gpu.h pair_lj_cut_dipole_long.cpp action pair_lj_cut_tip4p_long_gpu.h pair_lj_cut_tip4p_long.cpp From b8d32976593c1f3190030bb36de689732dbe8762 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 18:45:09 -0400 Subject: [PATCH 189/352] add missing package dependency --- src/Depend.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Depend.sh b/src/Depend.sh index 4bbbeb9a51..af88f24bb4 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -73,6 +73,8 @@ fi if (test $1 = "DPD-BASIC") then depend GPU + depend OPENMP + depend INTEL fi if (test $1 = "EXTRA-MOLECULE") then From bf6c982b4910a436c997e8c073b0ed745f12d441 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 21:30:06 -0400 Subject: [PATCH 190/352] skip using neighbor list load balancing weight when using KOKKOS with GPU --- src/imbalance_neigh.cpp | 47 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/imbalance_neigh.cpp b/src/imbalance_neigh.cpp index 3a523114ee..0a1c2a87cc 100644 --- a/src/imbalance_neigh.cpp +++ b/src/imbalance_neigh.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -14,6 +13,7 @@ #include "imbalance_neigh.h" +#include "accelerator_kokkos.h" #include "atom.h" #include "comm.h" #include "error.h" @@ -36,9 +36,9 @@ ImbalanceNeigh::ImbalanceNeigh(LAMMPS *lmp) : Imbalance(lmp) int ImbalanceNeigh::options(int narg, char **arg) { - if (narg < 1) error->all(FLERR,"Illegal balance weight command"); - factor = utils::numeric(FLERR,arg[0],false,lmp); - if (factor <= 0.0) error->all(FLERR,"Illegal balance weight command"); + if (narg < 1) error->all(FLERR, "Illegal balance weight command"); + factor = utils::numeric(FLERR, arg[0], false, lmp); + if (factor <= 0.0) error->all(FLERR, "Illegal balance weight command"); return 1; } @@ -50,19 +50,30 @@ void ImbalanceNeigh::compute(double *weight) if (factor == 0.0) return; + // cannot use neighbor list weight with KOKKOS using GPUs + + if (lmp->kokkos && lmp->kokkos->kokkos_exists) { + if (lmp->kokkos->ngpus > 0) { + if (comm->me == 0 && !did_warn) + error->warning(FLERR, "Balance weight neigh skipped with KOKKOS using GPUs"); + did_warn = 1; + return; + } + } + // find suitable neighbor list // can only use certain conventional neighbor lists // NOTE: why not full list, if half does not exist? for (req = 0; req < neighbor->old_nrequest; ++req) { - if (neighbor->old_requests[req]->half && - neighbor->old_requests[req]->skip == 0 && - neighbor->lists[req] && neighbor->lists[req]->numneigh) break; + if (neighbor->old_requests[req]->half && neighbor->old_requests[req]->skip == 0 && + neighbor->lists[req] && neighbor->lists[req]->numneigh) + break; } if (req >= neighbor->old_nrequest || neighbor->ago < 0) { if (comm->me == 0 && !did_warn) - error->warning(FLERR,"Balance weight neigh skipped b/c no list found"); + error->warning(FLERR, "Balance weight neigh skipped b/c no list found"); did_warn = 1; return; } @@ -72,16 +83,16 @@ void ImbalanceNeigh::compute(double *weight) NeighList *list = neighbor->lists[req]; const int inum = list->inum; - const int * const ilist = list->ilist; - const int * const numneigh = list->numneigh; + const int *const ilist = list->ilist; + const int *const numneigh = list->numneigh; int nlocal = atom->nlocal; bigint neighsum = 0; for (int i = 0; i < inum; ++i) neighsum += numneigh[ilist[i]]; double localwt = 0.0; - if (nlocal) localwt = 1.0*neighsum/nlocal; + if (nlocal) localwt = 1.0 * neighsum / nlocal; - if (nlocal && localwt <= 0.0) error->one(FLERR,"Balance weight <= 0.0"); + if (nlocal && localwt <= 0.0) error->one(FLERR, "Balance weight <= 0.0"); // apply factor if specified != 1.0 // wtlo,wthi = lo/hi values excluding 0.0 due to no atoms on this proc @@ -90,15 +101,15 @@ void ImbalanceNeigh::compute(double *weight) // expand/contract all localwt values from lo->hi to lo->newhi if (factor != 1.0) { - double wtlo,wthi; + double wtlo, wthi; if (localwt == 0.0) localwt = BIG; - MPI_Allreduce(&localwt,&wtlo,1,MPI_DOUBLE,MPI_MIN,world); + MPI_Allreduce(&localwt, &wtlo, 1, MPI_DOUBLE, MPI_MIN, world); if (localwt == BIG) localwt = 0.0; - MPI_Allreduce(&localwt,&wthi,1,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&localwt, &wthi, 1, MPI_DOUBLE, MPI_MAX, world); if (wtlo == wthi) return; - double newhi = wthi*factor; - localwt = wtlo + ((localwt-wtlo)/(wthi-wtlo)) * (newhi-wtlo); + double newhi = wthi * factor; + localwt = wtlo + ((localwt - wtlo) / (wthi - wtlo)) * (newhi - wtlo); } for (int i = 0; i < nlocal; i++) weight[i] *= localwt; @@ -108,5 +119,5 @@ void ImbalanceNeigh::compute(double *weight) std::string ImbalanceNeigh::info() { - return fmt::format(" neighbor weight factor: {}\n",factor); + return fmt::format(" neighbor weight factor: {}\n", factor); } From b9ab0eb607895306b64134dcf3747803760c48ff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 21:32:52 -0400 Subject: [PATCH 191/352] fix broken symbolic links --- examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy | 2 +- examples/PACKAGES/electron_stopping/Si.sw | 2 +- examples/PACKAGES/orient_eco/Ni_u3.eam | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy b/examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy index 9d763bffe4..da57022dd3 120000 --- a/examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy +++ b/examples/PACKAGES/cauchy/NiAlH_jea.eam.alloy @@ -1 +1 @@ -../../../../potentials/NiAlH_jea.eam.alloy \ No newline at end of file +../../../potentials/NiAlH_jea.eam.alloy \ No newline at end of file diff --git a/examples/PACKAGES/electron_stopping/Si.sw b/examples/PACKAGES/electron_stopping/Si.sw index e575921334..f2bb3ce799 120000 --- a/examples/PACKAGES/electron_stopping/Si.sw +++ b/examples/PACKAGES/electron_stopping/Si.sw @@ -1 +1 @@ -../../../../potentials/Si.sw \ No newline at end of file +../../../potentials/Si.sw \ No newline at end of file diff --git a/examples/PACKAGES/orient_eco/Ni_u3.eam b/examples/PACKAGES/orient_eco/Ni_u3.eam index 0abe5fb328..7a9c552e94 120000 --- a/examples/PACKAGES/orient_eco/Ni_u3.eam +++ b/examples/PACKAGES/orient_eco/Ni_u3.eam @@ -1 +1 @@ -../../../../potentials/Ni_u3.eam \ No newline at end of file +../../../potentials/Ni_u3.eam \ No newline at end of file From 1e48be92aa7cb86dcd37e87135b013827448f01c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 28 Jul 2021 21:50:20 -0400 Subject: [PATCH 192/352] avoid segfault --- src/ML-RANN/pair_rann.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ML-RANN/pair_rann.cpp b/src/ML-RANN/pair_rann.cpp index 00043323c3..faab2d1b2f 100644 --- a/src/ML-RANN/pair_rann.cpp +++ b/src/ML-RANN/pair_rann.cpp @@ -76,7 +76,7 @@ static const char cite_ml_rann_package[] = PairRANN::PairRANN(LAMMPS *lmp) : Pair(lmp) { - lmp->citeme->add(cite_ml_rann_package); + if (lmp->citeme) lmp->citeme->add(cite_ml_rann_package); //initialize ints and bools single_enable = 0; From 5f2b947b99bd01f0924268599ce6d086ad88170a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 11:48:24 -0400 Subject: [PATCH 193/352] fix typo --- src/utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.h b/src/utils.h index 7df9368b4d..b761534d66 100644 --- a/src/utils.h +++ b/src/utils.h @@ -45,7 +45,7 @@ namespace utils { * * \param text the text to be matched against the pattern * \param pattern the search pattern, which may contain regexp markers - * \return the string that matches the patters or an empty one */ + * \return the string that matches the pattern or an empty one */ std::string strfind(const std::string &text, const std::string &pattern); From 211d6636b43593589e8bf019d36599c4d414ad65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 11:50:11 -0400 Subject: [PATCH 194/352] modernize and simplify code to find best matching restart file --- src/read_restart.cpp | 110 ++++++++++++++----------------------------- src/read_restart.h | 2 +- 2 files changed, 37 insertions(+), 75 deletions(-) diff --git a/src/read_restart.cpp b/src/read_restart.cpp index ac00a7d086..faf9fd1620 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -71,16 +71,18 @@ void ReadRestart::command(int narg, char **arg) // if filename contains "*", search dir for latest restart file - char *file = new char[strlen(arg[0]) + 16]; + char *file; if (strchr(arg[0],'*')) { - int n; + int n=0; if (me == 0) { - file_search(arg[0],file); - n = strlen(file) + 1; + auto fn = file_search(arg[0]); + n = fn.size()+1; + file = utils::strdup(fn); } MPI_Bcast(&n,1,MPI_INT,0,world); + if (me != 0) file = new char[n]; MPI_Bcast(file,n,MPI_CHAR,0,world); - } else strcpy(file,arg[0]); + } else file = utils::strdup(arg[0]); // check for multiproc files and an MPI-IO filename @@ -90,14 +92,12 @@ void ReadRestart::command(int narg, char **arg) else mpiioflag = 0; if (multiproc && mpiioflag) - error->all(FLERR, - "Read restart MPI-IO input not allowed with % in filename"); + error->all(FLERR,"Read restart MPI-IO input not allowed with % in filename"); if (mpiioflag) { mpiio = new RestartMPIIO(lmp); if (!mpiio->mpiio_exists) - error->all(FLERR,"Reading from MPI-IO filename when " - "MPIIO package is not installed"); + error->all(FLERR,"Reading from MPI-IO filename when MPIIO package is not installed"); } // open single restart file or base file for multiproc case @@ -538,83 +538,45 @@ void ReadRestart::command(int narg, char **arg) only called by proc 0 ------------------------------------------------------------------------- */ -void ReadRestart::file_search(char *inpfile, char *outfile) +std::string ReadRestart::file_search(const std::string &inpfile) { - char *ptr; - // separate inpfile into dir + filename - char *dirname = new char[strlen(inpfile) + 1]; - char *filename = new char[strlen(inpfile) + 1]; - - if (strchr(inpfile,'/')) { - ptr = strrchr(inpfile,'/'); - *ptr = '\0'; - strcpy(dirname,inpfile); - strcpy(filename,ptr+1); - *ptr = '/'; - } else { - strcpy(dirname,"./"); - strcpy(filename,inpfile); - } + auto dirname = utils::path_dirname(inpfile); + auto filename = utils::path_basename(inpfile); // if filename contains "%" replace "%" with "base" - char *pattern = new char[strlen(filename) + 16]; + auto pattern = filename; + auto loc = pattern.find('%'); + if (loc != std::string::npos) pattern.replace(loc,1,"base"); - if ((ptr = strchr(filename,'%'))) { - *ptr = '\0'; - sprintf(pattern,"%s%s%s",filename,"base",ptr+1); - *ptr = '%'; - } else strcpy(pattern,filename); + // scan all files in directory, searching for files that match regexp pattern + // maxnum = largest integer that matches "*" - // scan all files in directory, searching for files that match pattern - // maxnum = largest int that matches "*" - - int n = strlen(pattern) + 16; - char *begin = new char[n]; - char *middle = new char[n]; - char *end = new char[n]; - - ptr = strchr(pattern,'*'); - *ptr = '\0'; - strcpy(begin,pattern); - strcpy(end,ptr+1); - int nbegin = strlen(begin); bigint maxnum = -1; + loc = pattern.find('*'); + if (loc != std::string::npos) { + // convert pattern to equivalent regexp + pattern.replace(loc,1,"\\d+"); + struct dirent *ep; + DIR *dp = opendir(dirname.c_str()); + if (dp == nullptr) + error->one(FLERR,"Cannot open directory {} to search for restart file: {}", + dirname, utils::getsyserror()); - struct dirent *ep; - DIR *dp = opendir(dirname); - if (dp == nullptr) - error->one(FLERR,"Cannot open dir to search for restart file"); - while ((ep = readdir(dp))) { - if (strstr(ep->d_name,begin) != ep->d_name) continue; - if ((ptr = strstr(&ep->d_name[nbegin],end)) == nullptr) continue; - if (strlen(end) == 0) ptr = ep->d_name + strlen(ep->d_name); - *ptr = '\0'; - if ((int)strlen(&ep->d_name[nbegin]) < n) { - strcpy(middle,&ep->d_name[nbegin]); - if (ATOBIGINT(middle) > maxnum) maxnum = ATOBIGINT(middle); + while ((ep = readdir(dp))) { + std::string candidate(ep->d_name); + if (utils::strmatch(candidate,pattern)) { + bigint num = ATOBIGINT(utils::strfind(candidate.substr(loc),"\\d+").c_str()); + if (num > maxnum) maxnum = num; + } } + closedir(dp); + if (maxnum < 0) error->one(FLERR,"Found no restart file matching pattern"); + filename.replace(filename.find('*'),1,std::to_string(maxnum)); } - closedir(dp); - if (maxnum < 0) error->one(FLERR,"Found no restart file matching pattern"); - - // create outfile with maxint substituted for "*" - // use original inpfile, not pattern, since need to retain "%" in filename - - std::string newoutfile = inpfile; - newoutfile.replace(newoutfile.find("*"),1,fmt::format("{}",maxnum)); - strcpy(outfile,newoutfile.c_str()); - - // clean up - - delete [] dirname; - delete [] filename; - delete [] pattern; - delete [] begin; - delete [] middle; - delete [] end; + return utils::path_join(dirname,filename); } /* ---------------------------------------------------------------------- diff --git a/src/read_restart.h b/src/read_restart.h index a3f889fbc3..9de52a5f28 100644 --- a/src/read_restart.h +++ b/src/read_restart.h @@ -46,7 +46,7 @@ class ReadRestart : public Command { bigint assignedChunkSize; MPI_Offset assignedChunkOffset, headerOffset; - void file_search(char *, char *); + std::string file_search(const std::string &); void header(); void type_arrays(); void force_fields(); From a9271b6d9a096e3ea5c6967a0e29712d075dede3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 12:36:50 -0400 Subject: [PATCH 195/352] replace temporary char buffer with using fmtlib --- src/SRD/fix_srd.cpp | 58 +++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/src/SRD/fix_srd.cpp b/src/SRD/fix_srd.cpp index dcb62e534d..04fb33eec4 100644 --- a/src/SRD/fix_srd.cpp +++ b/src/SRD/fix_srd.cpp @@ -1277,6 +1277,7 @@ void FixSRD::collisions_single() double **v = atom->v; double **f = atom->f; double **torque = atom->torque; + tagint *tag = atom->tag; int *mask = atom->mask; int nlocal = atom->nlocal; @@ -1329,29 +1330,23 @@ void FixSRD::collisions_single() } #ifdef SRD_DEBUG - if (update->ntimestep == SRD_DEBUG_TIMESTEP && atom->tag[i] == SRD_DEBUG_ATOMID) + if (update->ntimestep == SRD_DEBUG_TIMESTEP && tag[i] == SRD_DEBUG_ATOMID) print_collision(i, j, ibounce, t_remain, dt, xscoll, xbcoll, norm, type); #endif if (t_remain > dt) { ninside++; if (insideflag == INSIDE_ERROR || insideflag == INSIDE_WARN) { - char str[128]; - if (type != WALL) { - sprintf(str, - "SRD particle " TAGINT_FORMAT " started " - "inside big particle " TAGINT_FORMAT " on step " BIGINT_FORMAT " bounce %d", - atom->tag[i], atom->tag[j], update->ntimestep, ibounce + 1); - if (insideflag == INSIDE_ERROR) error->one(FLERR, str); - error->warning(FLERR, str); - } else { - sprintf(str, - "SRD particle " TAGINT_FORMAT " started " - "inside wall %d on step " BIGINT_FORMAT " bounce %d", - atom->tag[i], j, update->ntimestep, ibounce + 1); - if (insideflag == INSIDE_ERROR) error->one(FLERR, str); - error->warning(FLERR, str); - } + std::string mesg; + if (type != WALL) + mesg = fmt::format("SRD particle {} started inside big particle {} on step {} " + " bounce {}", tag[i], tag[j], update->ntimestep, ibounce + 1); + else + mesg = fmt::format("SRD particle {} started inside wall {} on step {} " + "bounce {}", tag[i], j, update->ntimestep, ibounce + 1); + + if (insideflag == INSIDE_ERROR) error->one(FLERR, mesg); + else error->warning(FLERR, mesg); } break; } @@ -1435,6 +1430,7 @@ void FixSRD::collisions_multi() double **v = atom->v; double **f = atom->f; double **torque = atom->torque; + tagint *tag = atom->tag; int *mask = atom->mask; int nlocal = atom->nlocal; @@ -1484,29 +1480,23 @@ void FixSRD::collisions_multi() t_remain = collision_wall_exact(x[i], j, v[i], xscoll, xbcoll, norm); #ifdef SRD_DEBUG - if (update->ntimestep == SRD_DEBUG_TIMESTEP && atom->tag[i] == SRD_DEBUG_ATOMID) + if (update->ntimestep == SRD_DEBUG_TIMESTEP && tag[i] == SRD_DEBUG_ATOMID) print_collision(i, j, ibounce, t_remain, dt, xscoll, xbcoll, norm, type); #endif if (t_remain > dt || t_remain < 0.0) { ninside++; if (insideflag == INSIDE_ERROR || insideflag == INSIDE_WARN) { - char str[128]; - if (type != WALL) { - sprintf(str, - "SRD particle " TAGINT_FORMAT " started " - "inside big particle " TAGINT_FORMAT " on step " BIGINT_FORMAT " bounce %d", - atom->tag[i], atom->tag[j], update->ntimestep, ibounce + 1); - if (insideflag == INSIDE_ERROR) error->one(FLERR, str); - error->warning(FLERR, str); - } else { - sprintf(str, - "SRD particle " TAGINT_FORMAT " started " - "inside wall %d on step " BIGINT_FORMAT " bounce %d", - atom->tag[i], j, update->ntimestep, ibounce + 1); - if (insideflag == INSIDE_ERROR) error->one(FLERR, str); - error->warning(FLERR, str); - } + std::string mesg; + if (type != WALL) + mesg = fmt::format("SRD particle {} started inside big particle {} on step {} " + "bounce {}", tag[i], tag[j], update->ntimestep, ibounce + 1); + else + mesg = fmt::format("SRD particle {} started inside wall {} on step {} " + "bounce {}", tag[i], j, update->ntimestep, ibounce + 1); + + if (insideflag == INSIDE_ERROR) error->one(FLERR, mesg); + error->warning(FLERR, mesg); } t_first = 0.0; break; From 508798ab2be3cfeeb47dd5f6b2d94f7d29a40e5f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 13:25:06 -0400 Subject: [PATCH 196/352] simplify code, make use of fmtlib and utils --- src/ATC/fix_atc.cpp | 26 ++++++++++---------------- src/SCAFACOS/scafacos.cpp | 32 ++++++++++++++------------------ 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/src/ATC/fix_atc.cpp b/src/ATC/fix_atc.cpp index d9770d86de..577a488f5e 100644 --- a/src/ATC/fix_atc.cpp +++ b/src/ATC/fix_atc.cpp @@ -700,20 +700,17 @@ int FixATC::size_restart(int /* nlocal */) { void FixATC::write_restart(FILE * /* fp */) { - char ** args = new char*[2]; - args[0] = new char[50]; - args[1] = new char[50]; - sprintf(args[0],"write_restart"); - sprintf(args[1],"ATC.restart"); + char *args[2]; + args[0] = utils::strdup("write_restart"); + args[1] = utils::strdup("sprintf(args[1],"ATC.restart"); // Then call all objects I own to write their data if (comm->me == 0) { atc_->modify(2,args); } - delete [] args[0]; - delete [] args[1]; - delete [] args; + delete[] args[0]; + delete[] args[1]; } /* ---------------------------------------------------------------------- @@ -722,20 +719,17 @@ void FixATC::write_restart(FILE * /* fp */) { void FixATC::restart(char * /* buf */) { - char ** args = new char*[2]; - args[0] = new char[50]; - args[1] = new char[50]; - sprintf(args[0],"read_restart"); - sprintf(args[1],"ATC.restart"); + char *args[2]; + args[0] = utils::strdup("read_restart"); + args[1] = utils::strdup("ATC.restart"); // Then call all objects I own to write their data if (comm->me == 0) { atc_->modify(2,args); } - delete [] args[0]; - delete [] args[1]; - delete [] args; + delete[] args[0]; + delete[] args[1]; } /* ---------------------------------------------------------------------- diff --git a/src/SCAFACOS/scafacos.cpp b/src/SCAFACOS/scafacos.cpp index 51bf4fb45e..6d4db28fb6 100644 --- a/src/SCAFACOS/scafacos.cpp +++ b/src/SCAFACOS/scafacos.cpp @@ -80,7 +80,7 @@ void Scafacos::settings(int narg, char **arg) Scafacos::~Scafacos() { - delete [] method; + delete[] method; memory->destroy(xpbc); memory->destroy(epot); @@ -95,16 +95,15 @@ Scafacos::~Scafacos() void Scafacos::init() { // error checks - if (screen && me == 0) fprintf(screen, - "Setting up ScaFaCoS with solver %s ...\n",method); - if (logfile && me == 0) fprintf(logfile, - "Setting up ScaFaCoS with solver %s ...\n",method); + if (me == 0) { + utils::logmesg(lmp,"Setting up ScaFaCoS with solver {} ...\n",method); - if ((strcmp(method,"p3m") == 0) && (me == 0)) - error->warning(FLERR,"Virial computation for P3M not available"); + if (strcmp(method,"p3m") == 0) + error->warning(FLERR,"Virial computation for P3M not available"); - if ((strcmp(method,"ewald") == 0) && (me == 0)) - error->warning(FLERR,"Virial computation for Ewald not available"); + if (strcmp(method,"ewald") == 0) + error->warning(FLERR,"Virial computation for Ewald not available"); + } if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); @@ -119,8 +118,7 @@ void Scafacos::init() error->all(FLERR,"Scafacos atom count exceeds 2B"); if (atom->molecular != Atom::ATOMIC) - error->all(FLERR, - "Cannot use Scafacos with molecular charged systems yet"); + error->all(FLERR, "Cannot use Scafacos with molecular charged systems yet"); FCSResult result; @@ -358,15 +356,13 @@ int Scafacos::modify_param(int narg, char **arg) // value1 = 0, 1 // 0 -> homogenous system (default) // 1 -> inhomogenous system (more internal tuning is provided (sequential!)) - if (strcmp(arg[1],"fmm_tuning") == 0) - { - if (screen && me == 0) fprintf(screen, - "ScaFaCoS setting fmm inhomogen tuning ...\n"); - if (logfile && me == 0) fprintf(logfile, - "ScaFaCoS setting fmm inhomogen tuning ...\n"); + if (strcmp(arg[1],"fmm_tuning") == 0) { + if (me == 0) + utils::logmesg(lmp, "ScaFaCoS setting fmm inhomogen tuning ...\n"); + if (narg < 3) error->all(FLERR, "Illegal kspace_modify command (fmm_tuning)"); - fmm_tuning_flag = atoi(arg[2]); + fmm_tuning_flag = utils::inumeric(FLERR, arg[2], false, tmp); return 3; } From 2a1177fa92619c2955e27242fdb19201b7086ca0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 13:29:56 -0400 Subject: [PATCH 197/352] reformat with clang-format --- src/SCAFACOS/scafacos.cpp | 270 +++++++++++++++----------------------- 1 file changed, 109 insertions(+), 161 deletions(-) diff --git a/src/SCAFACOS/scafacos.cpp b/src/SCAFACOS/scafacos.cpp index 6d4db28fb6..451dd7aca9 100644 --- a/src/SCAFACOS/scafacos.cpp +++ b/src/SCAFACOS/scafacos.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -25,10 +24,8 @@ #include "force.h" #include "memory.h" -#include #include -#include -#include +#include // ScaFaCoS library @@ -54,25 +51,24 @@ Scafacos::Scafacos(LAMMPS *lmp) : KSpace(lmp) void Scafacos::settings(int narg, char **arg) { - if (narg != 2) error->all(FLERR,"Illegal scafacos command"); + if (narg != 2) error->all(FLERR, "Illegal scafacos command"); method = utils::strdup(arg[0]); - tolerance = utils::numeric(FLERR,arg[1],false,lmp); + tolerance = utils::numeric(FLERR, arg[1], false, lmp); // optional ScaFaCoS library setting defaults // choose the correct default tolerance type for chosen method // throw an error if a not yet supported solver is chosen - if (strcmp(method,"fmm") == 0) { + if (strcmp(method, "fmm") == 0) { tolerance_type = FCS_TOLERANCE_TYPE_ENERGY; fmm_tuning_flag = 0; - } else if (strcmp(method,"p3m") == 0 || - strcmp(method,"p2nfft") == 0 || - strcmp(method,"ewald") == 0) { + } else if (strcmp(method, "p3m") == 0 || strcmp(method, "p2nfft") == 0 || + strcmp(method, "ewald") == 0) { tolerance_type = FCS_TOLERANCE_TYPE_FIELD; - } else if (strcmp(method,"direct") == 0) { - ; // direct summation has no tolerance type + } else if (strcmp(method, "direct") == 0) { + ; // direct summation has no tolerance type } else { - error->all(FLERR,"Unsupported ScaFaCoS method"); + error->all(FLERR, "Unsupported ScaFaCoS method"); } } @@ -87,7 +83,7 @@ Scafacos::~Scafacos() memory->destroy(efield); // clean up of the ScaFaCoS handle and internal arrays - fcs_destroy((FCS)fcs); + fcs_destroy((FCS) fcs); } /* ---------------------------------------------------------------------- */ @@ -96,26 +92,23 @@ void Scafacos::init() { // error checks if (me == 0) { - utils::logmesg(lmp,"Setting up ScaFaCoS with solver {} ...\n",method); + utils::logmesg(lmp, "Setting up ScaFaCoS with solver {} ...\n", method); - if (strcmp(method,"p3m") == 0) - error->warning(FLERR,"Virial computation for P3M not available"); + if (strcmp(method, "p3m") == 0) + error->warning(FLERR, "Virial computation for P3M not available"); - if (strcmp(method,"ewald") == 0) - error->warning(FLERR,"Virial computation for Ewald not available"); + if (strcmp(method, "ewald") == 0) + error->warning(FLERR, "Virial computation for Ewald not available"); } - if (!atom->q_flag) - error->all(FLERR,"Kspace style requires atom attribute q"); + if (!atom->q_flag) error->all(FLERR, "Kspace style requires atom attribute q"); - if (domain->dimension == 2) - error->all(FLERR,"Cannot use ScaFaCoS with 2d simulation"); + if (domain->dimension == 2) error->all(FLERR, "Cannot use ScaFaCoS with 2d simulation"); - if (domain->triclinic) - error->all(FLERR,"Cannot use ScaFaCoS with triclinic domain yet"); + if (domain->triclinic) error->all(FLERR, "Cannot use ScaFaCoS with triclinic domain yet"); if (atom->natoms > INT_MAX && sizeof(int) != 8) - error->all(FLERR,"Scafacos atom count exceeds 2B"); + error->all(FLERR, "Scafacos atom count exceeds 2B"); if (atom->molecular != Atom::ATOMIC) error->all(FLERR, "Cannot use Scafacos with molecular charged systems yet"); @@ -127,47 +120,44 @@ void Scafacos::init() qqrd2e = force->qqrd2e; if (!initialized) { - result = fcs_init((FCS*)&fcs,method,world); - check_result((void*)&result); + result = fcs_init((FCS *) &fcs, method, world); + check_result((void *) &result); setup_handle(); // using other methods lead to termination of the program, // since they have no tolerance tuning methods - if ( strcmp(method,"fmm") == 0 || - strcmp(method,"p3m") == 0 || - strcmp(method,"p2nfft") == 0 || - strcmp(method,"ewald") == 0) - { - result = fcs_set_tolerance((FCS)fcs,tolerance_type,tolerance); - check_result((void*)&result); + if (strcmp(method, "fmm") == 0 || strcmp(method, "p3m") == 0 || strcmp(method, "p2nfft") == 0 || + strcmp(method, "ewald") == 0) { + result = fcs_set_tolerance((FCS) fcs, tolerance_type, tolerance); + check_result((void *) &result); } double **x = atom->x; double *q = atom->q; int nlocal = atom->nlocal; - if (strcmp(method,"fmm") == 0) { + if (strcmp(method, "fmm") == 0) { if (fmm_tuning_flag == 1) - fcs_fmm_set_internal_tuning((FCS)fcs,FCS_FMM_INHOMOGENOUS_SYSTEM); + fcs_fmm_set_internal_tuning((FCS) fcs, FCS_FMM_INHOMOGENOUS_SYSTEM); else - fcs_fmm_set_internal_tuning((FCS)fcs,FCS_FMM_HOMOGENOUS_SYSTEM); + fcs_fmm_set_internal_tuning((FCS) fcs, FCS_FMM_HOMOGENOUS_SYSTEM); } // for the FMM at least one particle is required per process - if (strcmp(method,"fmm") == 0) { - int empty = (nlocal==0)?1:0; - MPI_Allreduce(MPI_IN_PLACE,&empty,1,MPI_INT,MPI_SUM,world); + if (strcmp(method, "fmm") == 0) { + int empty = (nlocal == 0) ? 1 : 0; + MPI_Allreduce(MPI_IN_PLACE, &empty, 1, MPI_INT, MPI_SUM, world); if (empty > 0) - fcs_set_redistribute((FCS)fcs,1); + fcs_set_redistribute((FCS) fcs, 1); else - fcs_set_redistribute((FCS)fcs,0); + fcs_set_redistribute((FCS) fcs, 0); } - result = fcs_tune((FCS)fcs,nlocal,&x[0][0],q); - check_result((void*)&result); + result = fcs_tune((FCS) fcs, nlocal, &x[0][0], q); + check_result((void *) &result); // more useful here, since the parameters should be tuned now - if (me == 0) fcs_print_parameters((FCS)fcs); + if (me == 0) fcs_print_parameters((FCS) fcs); } initialized = 1; @@ -185,17 +175,16 @@ void Scafacos::compute(int eflag, int vflag) FCSResult result; // for the FMM at least one particle is required per process - if (strcmp(method,"fmm")) - { - int empty = (nlocal==0)?1:0; - MPI_Allreduce(MPI_IN_PLACE,&empty,1,MPI_INT,MPI_SUM,world); + if (strcmp(method, "fmm")) { + int empty = (nlocal == 0) ? 1 : 0; + MPI_Allreduce(MPI_IN_PLACE, &empty, 1, MPI_INT, MPI_SUM, world); if (empty > 0) - fcs_set_redistribute((FCS)fcs,1); + fcs_set_redistribute((FCS) fcs, 1); else - fcs_set_redistribute((FCS)fcs,0); + fcs_set_redistribute((FCS) fcs, 0); } - ev_init(eflag,vflag); + ev_init(eflag, vflag); // grow xpbc, epot, efield if necessary @@ -204,28 +193,26 @@ void Scafacos::compute(int eflag, int vflag) memory->destroy(epot); memory->destroy(efield); maxatom = atom->nmax; - memory->create(xpbc,3*maxatom,"scafacos:xpbc"); - memory->create(epot,maxatom,"scafacos:epot"); - memory->create(efield,maxatom,3,"scafacos:efield"); + memory->create(xpbc, 3 * maxatom, "scafacos:xpbc"); + memory->create(epot, maxatom, "scafacos:epot"); + memory->create(efield, maxatom, 3, "scafacos:efield"); } if (vflag_global) { // for P3M or Ewald we cannot compute the virial. skip it. - if ((strcmp(method,"p3m") != 0) - && (strcmp(method,"ewald") != 0)) { - result = fcs_set_compute_virial((FCS)fcs,1); - check_result((void*)&result); + if ((strcmp(method, "p3m") != 0) && (strcmp(method, "ewald") != 0)) { + result = fcs_set_compute_virial((FCS) fcs, 1); + check_result((void *) &result); } } // pack coords into xpbc and apply PBC - memcpy(xpbc,&x[0][0],3*nlocal*sizeof(double)); + memcpy(xpbc, &x[0][0], 3 * nlocal * sizeof(double)); - - if (domain->xperiodic || domain -> yperiodic || domain -> zperiodic) { - int j = 0; + if (domain->xperiodic || domain->yperiodic || domain->zperiodic) { + int j = 0; for (int i = 0; i < nlocal; i++) { domain->remap(&xpbc[j]); j += 3; @@ -236,14 +223,14 @@ void Scafacos::compute(int eflag, int vflag) if (box_has_changed()) { setup_handle(); - result = fcs_tune((FCS)fcs,nlocal,xpbc,q); - check_result((void*)&result); + result = fcs_tune((FCS) fcs, nlocal, xpbc, q); + check_result((void *) &result); } // invoke ScaFaCoS solver - result = fcs_run((FCS)fcs,nlocal,xpbc,q,&efield[0][0],epot); - check_result((void*)&result); + result = fcs_run((FCS) fcs, nlocal, xpbc, q, &efield[0][0], epot); + check_result((void *) &result); // extract virial @@ -251,10 +238,9 @@ void Scafacos::compute(int eflag, int vflag) // for P3M or Ewald we cannot compute the virial. skip it. - if ((strcmp(method,"p3m") != 0) - && (strcmp(method,"ewald") != 0)) { - result = fcs_get_virial((FCS)fcs,virial_int); - check_result((void*)&result); + if ((strcmp(method, "p3m") != 0) && (strcmp(method, "ewald") != 0)) { + result = fcs_get_virial((FCS) fcs, virial_int); + check_result((void *) &result); virial[0] = virial_int[0]; virial[1] = virial_int[1]; @@ -282,11 +268,10 @@ void Scafacos::compute(int eflag, int vflag) } if (eflag_atom) { - for (int i = 0; i < nlocal; i++) - eatom[i] = 0.5 * qscale * q[i] * epot[i]; + for (int i = 0; i < nlocal; i++) eatom[i] = 0.5 * qscale * q[i] * epot[i]; } - MPI_Allreduce(&myeng,&energy,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&myeng, &energy, 1, MPI_DOUBLE, MPI_SUM, world); } /* ---------------------------------------------------------------------- */ @@ -299,55 +284,34 @@ int Scafacos::modify_param(int narg, char **arg) // value1 = energy, energy_rel, etc // everyone of these should have a default, so user doesn't need to set - if (strcmp(arg[0],"scafacos") != 0) return 0; + if (strcmp(arg[0], "scafacos") != 0) return 0; - if (strcmp(arg[1],"tolerance") == 0) { - if (narg < 3) error->all(FLERR, - "Illegal kspace_modify command (tolerance)"); - if (strcmp(arg[2],"energy") == 0) + if (strcmp(arg[1], "tolerance") == 0) { + if (narg < 3) error->all(FLERR, "Illegal kspace_modify command (tolerance)"); + if (strcmp(arg[2], "energy") == 0) tolerance_type = FCS_TOLERANCE_TYPE_ENERGY; - else if (strcmp(arg[2],"energy_rel") == 0) + else if (strcmp(arg[2], "energy_rel") == 0) tolerance_type = FCS_TOLERANCE_TYPE_ENERGY_REL; - else if (strcmp(arg[2],"field") == 0) + else if (strcmp(arg[2], "field") == 0) tolerance_type = FCS_TOLERANCE_TYPE_FIELD; - else if (strcmp(arg[2],"field_rel") == 0) + else if (strcmp(arg[2], "field_rel") == 0) tolerance_type = FCS_TOLERANCE_TYPE_FIELD_REL; - else if (strcmp(arg[2],"potential") == 0) + else if (strcmp(arg[2], "potential") == 0) tolerance_type = FCS_TOLERANCE_TYPE_POTENTIAL; - else if (strcmp(arg[2],"potential_rel") == 0) + else if (strcmp(arg[2], "potential_rel") == 0) tolerance_type = FCS_TOLERANCE_TYPE_POTENTIAL_REL; - else error->all(FLERR, - "Illegal kspace_modify command (tolerance argument)"); + else + error->all(FLERR, "Illegal kspace_modify command (tolerance argument)"); // check if method is compatatible to chosen tolerance type - if ( - ( - strcmp(method,"fmm") == 0 && - ( - tolerance_type != FCS_TOLERANCE_TYPE_ENERGY && - tolerance_type != FCS_TOLERANCE_TYPE_ENERGY_REL - ) - ) || - ( - strcmp(method,"p2nfft") == 0 && - ( - tolerance_type != FCS_TOLERANCE_TYPE_FIELD && - tolerance_type != FCS_TOLERANCE_TYPE_POTENTIAL - ) - ) || - ( - strcmp(method,"p3m") == 0 && - ( - tolerance_type != FCS_TOLERANCE_TYPE_FIELD - ) - ) || - ( - strcmp(method,"ewald") == 0 && - ( - tolerance_type != FCS_TOLERANCE_TYPE_FIELD - ) - ) - ) - error->all(FLERR,"Illegal kspace_modify command \ + if ((strcmp(method, "fmm") == 0 && + (tolerance_type != FCS_TOLERANCE_TYPE_ENERGY && + tolerance_type != FCS_TOLERANCE_TYPE_ENERGY_REL)) || + (strcmp(method, "p2nfft") == 0 && + (tolerance_type != FCS_TOLERANCE_TYPE_FIELD && + tolerance_type != FCS_TOLERANCE_TYPE_POTENTIAL)) || + (strcmp(method, "p3m") == 0 && (tolerance_type != FCS_TOLERANCE_TYPE_FIELD)) || + (strcmp(method, "ewald") == 0 && (tolerance_type != FCS_TOLERANCE_TYPE_FIELD))) + error->all(FLERR, "Illegal kspace_modify command \ (invalid tolerance / method combination)"); return 3; } @@ -356,13 +320,11 @@ int Scafacos::modify_param(int narg, char **arg) // value1 = 0, 1 // 0 -> homogenous system (default) // 1 -> inhomogenous system (more internal tuning is provided (sequential!)) - if (strcmp(arg[1],"fmm_tuning") == 0) { - if (me == 0) - utils::logmesg(lmp, "ScaFaCoS setting fmm inhomogen tuning ...\n"); + if (strcmp(arg[1], "fmm_tuning") == 0) { + if (me == 0) utils::logmesg(lmp, "ScaFaCoS setting fmm inhomogen tuning ...\n"); - if (narg < 3) error->all(FLERR, - "Illegal kspace_modify command (fmm_tuning)"); - fmm_tuning_flag = utils::inumeric(FLERR, arg[2], false, tmp); + if (narg < 3) error->all(FLERR, "Illegal kspace_modify command (fmm_tuning)"); + fmm_tuning_flag = utils::inumeric(FLERR, arg[2], false, lmp); return 3; } @@ -376,8 +338,8 @@ int Scafacos::modify_param(int narg, char **arg) double Scafacos::memory_usage() { double bytes = 0.0; - bytes += (double)maxatom * sizeof(double); - bytes += (double)3*maxatom * sizeof(double); + bytes += (double) maxatom * sizeof(double); + bytes += (double) 3 * maxatom * sizeof(double); return bytes; } @@ -413,23 +375,23 @@ void Scafacos::setup_handle() old_natoms = atom->natoms; // store parameters to ScaFaCoS handle - result = fcs_set_box_a((FCS)fcs,old_box_x); - check_result((void*)&result); + result = fcs_set_box_a((FCS) fcs, old_box_x); + check_result((void *) &result); - result = fcs_set_box_b((FCS)fcs,old_box_y); - check_result((void*)&result); + result = fcs_set_box_b((FCS) fcs, old_box_y); + check_result((void *) &result); - result = fcs_set_box_c((FCS)fcs,old_box_z); - check_result((void*)&result); + result = fcs_set_box_c((FCS) fcs, old_box_z); + check_result((void *) &result); - result = fcs_set_box_origin((FCS)fcs,old_origin); - check_result((void*)&result); + result = fcs_set_box_origin((FCS) fcs, old_origin); + check_result((void *) &result); - result = fcs_set_periodicity((FCS)fcs,old_periodicity); - check_result((void*)&result); + result = fcs_set_periodicity((FCS) fcs, old_periodicity); + check_result((void *) &result); - result = fcs_set_total_particles((FCS)fcs,old_natoms); - check_result((void*)&result); + result = fcs_set_total_particles((FCS) fcs, old_natoms); + check_result((void *) &result); // allow ScaFaCoS to calculate the near field computations for now // TODO: allow the delegation of the near field computations @@ -437,8 +399,8 @@ void Scafacos::setup_handle() // (near_field_flag = 1 -> enables the internal near field calcs // 0 -> disables the internal near field calcs int near_field_flag = 1; - result = fcs_set_near_field_flag((FCS)fcs,near_field_flag); - check_result((void*)&result); + result = fcs_set_near_field_flag((FCS) fcs, near_field_flag); + check_result((void *) &result); } /* ---------------------------------------------------------------------- @@ -450,17 +412,11 @@ bool Scafacos::box_has_changed() int *periodicity = domain->periodicity; double *prd = domain->prd; - bool changed = - (periodicity[0] != old_periodicity[0]) || - (periodicity[1] != old_periodicity[1]) || - (periodicity[2] != old_periodicity[2]) || - (domain->boundary[0][0] != old_origin[0]) || - (domain->boundary[1][0] != old_origin[1]) || - (domain->boundary[2][0] != old_origin[2]) || - (prd[0] != old_box_x[0]) || - (prd[1] != old_box_y[1]) || - (prd[2] != old_box_z[2]) || - (atom->natoms != old_natoms); + bool changed = (periodicity[0] != old_periodicity[0]) || (periodicity[1] != old_periodicity[1]) || + (periodicity[2] != old_periodicity[2]) || (domain->boundary[0][0] != old_origin[0]) || + (domain->boundary[1][0] != old_origin[1]) || (domain->boundary[2][0] != old_origin[2]) || + (prd[0] != old_box_x[0]) || (prd[1] != old_box_y[1]) || (prd[2] != old_box_z[2]) || + (atom->natoms != old_natoms); return changed; } @@ -469,19 +425,11 @@ bool Scafacos::box_has_changed() check ScaFaCoS result for error condition ------------------------------------------------------------------------- */ -void Scafacos::check_result(void* result_p) +void Scafacos::check_result(void *result_p) { - FCSResult result = *(FCSResult*)result_p; - + FCSResult result = *(FCSResult *) result_p; if (!result) return; - std::stringstream ss; - ss << "ScaFaCoS: " << fcs_result_get_function(result) << "\n" - << fcs_result_get_message(result) << "\n"; - fcs_result_destroy(result); - std::string err_msg = ss.str(); - const char *str = err_msg.c_str(); - - error->one(FLERR,str); + error->one(FLERR, "ScaFaCoS: {}\n{}\n", fcs_result_get_function(result), + fcs_result_get_message(result)); } - From 43b3c97cc06a83f43ceb667299af158bb58afd65 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 13:57:02 -0400 Subject: [PATCH 198/352] add unit tests for scafacos kspace solver (skipping p3m) --- .../tests/kspace-scafacos_direct.yaml | 175 +++++++++++++++++ .../tests/kspace-scafacos_ewald.yaml | 175 +++++++++++++++++ .../tests/kspace-scafacos_fmm.yaml | 176 +++++++++++++++++ .../tests/kspace-scafacos_fmm_tuned.yaml | 177 ++++++++++++++++++ .../tests/kspace-scafacos_p2nfft.yaml | 175 +++++++++++++++++ 5 files changed, 878 insertions(+) create mode 100644 unittest/force-styles/tests/kspace-scafacos_direct.yaml create mode 100644 unittest/force-styles/tests/kspace-scafacos_ewald.yaml create mode 100644 unittest/force-styles/tests/kspace-scafacos_fmm.yaml create mode 100644 unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml create mode 100644 unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml diff --git a/unittest/force-styles/tests/kspace-scafacos_direct.yaml b/unittest/force-styles/tests/kspace-scafacos_direct.yaml new file mode 100644 index 0000000000..5c7570f15a --- /dev/null +++ b/unittest/force-styles/tests/kspace-scafacos_direct.yaml @@ -0,0 +1,175 @@ +--- +lammps_version: 28 Jul 2021 +date_generated: Thu Jul 29 13:45:54 2021 +epsilon: 7.5e-14 +skip_tests: extract gpu intel omp opt single +prerequisites: ! | + atom full + pair zero + kspace scafacos +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + pair_modify compute no + kspace_style scafacos direct 1.0e-6 +input_file: in.empty +pair_style: zero 2.0 +pair_coeff: ! | + * * +extract: ! "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 5.9853519421758639e-01 1.3735181867021682e+00 1.3553118398123448e+01 + 2 1.5495977417051812e+01 4.0901064482224800e+00 3.9689142760273075e+00 + 3 3.9634699227586596e+00 8.4304133468572440e-01 3.5938772222134912e+00 + 4 3.1090997442702091e+00 3.1184313377967317e+00 1.4537232639476148e+01 + 5 1.8022164864743666e+00 2.1524343587962651e+00 2.6722293652717743e+00 + 6 2.5854516104749719e+00 5.4074418485650408e+00 4.7591159965835574e+00 + 7 4.5085861300980330e+00 1.8504344092729441e+00 4.4351554812905318e+00 + 8 9.1242912082495682e+00 1.0407382122243890e+01 2.9241157747521451e+00 + 9 6.3580755255701185e+00 4.5098168804963995e-01 5.2063224557530008e-01 + 10 1.3738254895326291e+01 5.9506335651750595e+00 8.3292051140478023e+00 + 11 2.1591140939862260e+01 2.7838359219866938e+01 9.0468184139203149e+00 + 12 2.6272501643226271e+01 1.1878243620706814e+00 2.9975025845644470e+01 + 13 7.9415746212212115e+00 -1.1156978846139244e-01 1.8691275434341446e+00 + 14 8.2732070516002327e+00 6.4976544568072994e+00 6.1393908897773857e+00 + 15 2.5378490179307608e+01 4.5477024819835226e+00 1.1921452546985176e+01 + 16 1.4456996027678150e+01 4.4987408448045425e+00 1.9033670617692025e+00 + 17 1.4411570771822808e+01 6.7274638192885536e+00 1.4870406187417796e+01 + 18 1.4331749175474449e+01 1.0482464376802829e+01 3.1864156534011063e+00 + 19 2.7427223228525572e+00 6.1128411765767288e+00 3.5982851250987258e+00 + 20 7.2275885421191202e+00 2.1315254859284153e+01 3.0891430823104247e+00 + 21 1.4746202231787546e+00 7.5758871882707695e+00 2.7923168502816673e+00 + 22 6.7427592804762371e-01 1.3468088160213579e+01 4.3760415389126726e+00 + 23 5.4159829386157137e+00 8.6996838351548753e+00 5.0576797231796533e+00 + 24 5.5283986126712401e+00 1.2497361525533321e+01 2.8535356015135558e+00 + 25 8.1600952427161459e+00 6.3653061368403447e+00 1.3583765810182960e+01 + 26 5.7946796146598682e+00 1.1809911136103421e+01 5.3350205480717268e+00 + 27 2.3222078223313545e+01 1.4308615577735122e+01 7.9092893085218252e+00 + 28 1.1102013281586586e+01 1.0806678378903460e+01 5.1440895554828647e-01 + 29 1.8287359787648683e+01 1.7998425806477186e+01 4.7050771715632216e+00 + 30 8.4046655442031053e+00 1.1872406117021130e+01 6.1860069056212152e+00 + 31 1.3623050695718087e+01 8.6702031218446933e+00 4.8870810919460919e+00 + 32 1.3179418229306243e+01 1.2191288089092163e+01 -9.8263947106764393e-01 + 33 1.4297279301696596e+01 1.4239887480993310e+01 7.3729256817488258e+00 + 34 1.3998947344436507e+01 3.1776048016159746e+00 1.1298717537028205e+01 + 35 2.9468286823910446e+00 1.3366823450409385e+01 1.0833085454578157e+01 + 36 4.1478963603586596e+00 5.0950647007156658e+00 5.0657716704360372e+00 + 37 1.1983433489467215e+00 1.9399632404407634e+00 1.9304077852965200e+01 + 38 2.1980043519192014e+00 5.1125475297242176e+00 1.3004703369812349e+01 + 39 4.8211124323100654e+00 1.8702770784992377e+00 1.2710071889334980e+01 + 40 1.0936291037020300e+01 1.0747641274703362e+01 1.6783616809840488e+01 + 41 1.3681312560017849e+01 -1.8629158790112621e+00 1.1701821524793388e+01 + 42 6.9467381765232679e+00 4.7637060577094568e+00 1.2746150480727133e+01 + 43 1.1453606929182719e+01 1.3963112680120156e+01 9.6285078064788561e+00 + 44 1.0957946143799083e+01 4.5241091407661083e+00 7.3426239053057962e+00 + 45 1.9993282728601553e+01 4.1095133032426308e+00 1.6164225011879978e+01 + 46 1.5413197005131515e+01 1.6418790133489544e+01 2.1119218973543749e+01 + 47 1.2975684850695831e+01 7.1446810179661902e-01 1.1664958010444126e+01 + 48 1.1811812370221400e+01 4.2851600826393925e+00 9.3546818776967093e+00 + 49 -5.6481136417776590e-01 1.3549234536083771e+01 1.2941870658558324e+01 + 50 1.4033321448990980e+01 1.0945883537328035e+01 9.0731604549063700e+00 + 51 1.0488346642598131e+01 1.2929293844407319e+01 2.4595750765559014e+01 + 52 7.4407692960476446e+00 2.1319903892877445e+01 1.2750776806561440e+01 + 53 -4.3710058608084712e-01 1.2125072915100851e+01 5.2435758235292766e+00 + 54 1.9049722161470140e+00 2.5506232233588406e+01 2.2648326082900361e+01 + 55 1.1447689112166964e+01 1.9561298290794014e+01 2.4876888053233074e+01 + 56 4.2811648374703983e+00 1.0489509124813502e+01 9.4149155422649500e+00 + 57 8.1948850775391833e+00 7.1137784539961881e+00 6.6071482357158144e+00 + 58 7.4000003036917663e+00 1.0621833679267610e+01 9.2458799718524940e+00 + 59 9.8498619100924500e+00 7.4220159457480621e+00 9.9248619306627575e+00 + 60 1.0686271366672448e+01 9.6778845008794434e+00 6.9750966510655816e+00 + 61 8.6872704836408019e+00 9.9086708918987974e+00 8.7659162700421884e+00 + 62 1.7584082487193914e+01 2.5499739543551133e+01 2.5412753418556658e+01 + 63 2.3929248594802253e+01 1.8678998611072483e+01 2.5689434150334090e+01 + 64 1.2397999591043442e+01 1.2131018694288985e+01 8.7020726387695753e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 6.0139042170565893e-01 1.3750160429895943e+00 1.3549432149993946e+01 + 2 1.5496275026359035e+01 4.0949723913340845e+00 3.9698806725185958e+00 + 3 3.9625951436825182e+00 8.4924799774622872e-01 3.5978087147727069e+00 + 4 3.1103880081589423e+00 3.1188031216258425e+00 1.4539630781212376e+01 + 5 1.8031214860193321e+00 2.1551460580678690e+00 2.6725757139049380e+00 + 6 2.5883246391385732e+00 5.4071946143330818e+00 4.7604710081232939e+00 + 7 4.5094367673327076e+00 1.8523516990890936e+00 4.4374897283022205e+00 + 8 9.1244164207710163e+00 1.0411954482576713e+01 2.9308103053136705e+00 + 9 6.3605067793505352e+00 4.5303910662708602e-01 5.2050085410680846e-01 + 10 1.3736540355121967e+01 5.9548454101194324e+00 8.3352340425069329e+00 + 11 2.1582211856395837e+01 2.7838896482977876e+01 9.0520243290723599e+00 + 12 2.6270681124810483e+01 1.2218578747065352e+00 2.9976316523426174e+01 + 13 7.9480630797425968e+00 -1.1352932738544609e-01 1.8643756804170037e+00 + 14 8.2714273683833266e+00 6.4969847340805797e+00 6.1397581400074470e+00 + 15 2.5373846818471524e+01 4.5561957914239288e+00 1.1930381641603802e+01 + 16 1.4461377278952787e+01 4.5043803025306728e+00 1.9121539902164404e+00 + 17 1.4413248865635788e+01 6.7283945480308871e+00 1.4871009800489965e+01 + 18 1.4332929534926723e+01 1.0480164740797379e+01 3.1870257912613416e+00 + 19 2.7434449476378275e+00 6.1146169188819410e+00 3.5977334668455438e+00 + 20 7.2425618295159664e+00 2.1308311673342512e+01 3.0987392400834244e+00 + 21 1.4758389050070446e+00 7.5750516387526483e+00 2.7933687185161387e+00 + 22 6.7141478473514049e-01 1.3469958638520374e+01 4.3779943760891724e+00 + 23 5.4194369765828867e+00 8.6978601132143734e+00 5.0591216171859807e+00 + 24 5.5269673036893865e+00 1.2492417922963574e+01 2.8556988065312927e+00 + 25 8.1538318258710483e+00 6.3767706624530396e+00 1.3577558102403296e+01 + 26 5.7988021772932461e+00 1.1809741951167283e+01 5.3291185078128738e+00 + 27 2.3226095349652184e+01 1.4311727939045955e+01 7.9117025537454069e+00 + 28 1.1106051994046600e+01 1.0805276884057864e+01 5.1741579430793549e-01 + 29 1.8283448546268271e+01 1.8000100700054563e+01 4.7091092030728285e+00 + 30 8.4024182744895626e+00 1.1874886095684852e+01 6.1852771028177811e+00 + 31 1.3624103369498467e+01 8.6692203361512892e+00 4.8904689470229918e+00 + 32 1.3186838517089031e+01 1.2182289900601420e+01 -9.9163567174173251e-01 + 33 1.4296699965522233e+01 1.4239129431431815e+01 7.3747962232206747e+00 + 34 1.3998700828162860e+01 3.1780110975159825e+00 1.1298459882457337e+01 + 35 2.9476483912265317e+00 1.3372010557159966e+01 1.0833719280799219e+01 + 36 4.1619654895335971e+00 5.1021008206871654e+00 5.0682195894306412e+00 + 37 1.1906514433043405e+00 1.9338014046160006e+00 1.9308431436871658e+01 + 38 2.2004201638762293e+00 5.1128284500759102e+00 1.3004657109728548e+01 + 39 4.8225894348852600e+00 1.8704934261044597e+00 1.2708889640723802e+01 + 40 1.0942823706366436e+01 1.0750486291561124e+01 1.6783164135136751e+01 + 41 1.3678519514274345e+01 -1.8710666990776754e+00 1.1702680149745367e+01 + 42 6.9519207253357109e+00 4.7611724662984853e+00 1.2733394319022967e+01 + 43 1.1455028602857045e+01 1.3963680816565688e+01 9.6305987540808538e+00 + 44 1.0954586155653484e+01 4.5217883307253395e+00 7.3439167992671770e+00 + 45 1.9990174535486407e+01 4.1204539526286199e+00 1.6179740550310733e+01 + 46 1.5411748565687001e+01 1.6381737861635120e+01 2.1116969444357832e+01 + 47 1.2973223321151385e+01 7.1619934622740544e-01 1.1664597770401203e+01 + 48 1.1808986724646296e+01 4.2841322182295656e+00 9.3555144063144020e+00 + 49 -5.5907851791814800e-01 1.3548137759415885e+01 1.2938286795065835e+01 + 50 1.4032179586654296e+01 1.0950006910295924e+01 9.0738475969917101e+00 + 51 1.0490031569389913e+01 1.2914536741406692e+01 2.4603680675209912e+01 + 52 7.4515661707089169e+00 2.1314249566536457e+01 1.2750795317923926e+01 + 53 -4.2891500334442334e-01 1.2141839613036224e+01 5.2345380029690300e+00 + 54 1.8924899954262138e+00 2.5513221718364392e+01 2.2640910998339503e+01 + 55 1.1456302635076725e+01 1.9550899159435200e+01 2.4883232267123113e+01 + 56 4.2820647067979252e+00 1.0494041439836217e+01 9.4156042088084035e+00 + 57 8.1930970714021889e+00 7.1119105312648907e+00 6.6053895450460978e+00 + 58 7.4041507676105507e+00 1.0620775993452371e+01 9.2472586957965639e+00 + 59 9.8451346851328267e+00 7.4219942369368415e+00 9.9290864520233093e+00 + 60 1.0684506271990418e+01 9.6783712531058708e+00 6.9769563413720874e+00 + 61 8.6907078696016260e+00 9.9128629285142456e+00 8.7704672517543916e+00 + 62 1.7585196927509358e+01 2.5509211310704064e+01 2.5408875052384264e+01 + 63 2.3929744498794761e+01 1.8683317441060030e+01 2.5686386698970402e+01 + 64 1.2397983733377961e+01 1.2131876247227028e+01 8.7023314905664169e+00 +... diff --git a/unittest/force-styles/tests/kspace-scafacos_ewald.yaml b/unittest/force-styles/tests/kspace-scafacos_ewald.yaml new file mode 100644 index 0000000000..ecd6ffc221 --- /dev/null +++ b/unittest/force-styles/tests/kspace-scafacos_ewald.yaml @@ -0,0 +1,175 @@ +--- +lammps_version: 28 Jul 2021 +date_generated: Thu Jul 29 13:45:55 2021 +epsilon: 7.5e-14 +skip_tests: extract gpu intel omp opt single +prerequisites: ! | + atom full + pair zero + kspace scafacos +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + pair_modify compute no + kspace_style scafacos ewald 1.0e-6 +input_file: in.empty +pair_style: zero 2.0 +pair_coeff: ! | + * * +extract: ! "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 -3.5775283244914063e-01 7.7865587603851194e-01 8.1307158947787922e-02 + 2 1.2922670590315029e+00 1.2619641981421184e-01 -1.6451193957400917e-01 + 3 -3.7565791702998952e-01 4.8404562205520851e-01 5.0527543874176983e-01 + 4 -2.7873801854386121e-01 -4.8541575968174866e-01 5.2967586744669226e-01 + 5 -1.0334790644240251e-01 5.0145230724995660e-01 7.4440584335513060e-01 + 6 1.6991890109622967e-01 -4.8597285067395801e-01 -1.1155285749064632e+00 + 7 -6.1361115113833331e-01 1.7593891815657139e-01 -1.0492721870394777e+00 + 8 -2.2803883914334380e+00 -8.3759535112438399e-01 5.9290646469975239e-01 + 9 -2.0766421586072484e-01 2.3212491098505297e-01 -9.8891758370881194e-03 + 10 -1.6344533547600255e+00 -1.3880924457341388e+00 1.9431710875846784e+00 + 11 -7.3362792833822799e-01 4.9488845383504998e-01 1.5364768266064170e+00 + 12 5.5588074623242250e+00 -6.1331374125708491e+00 2.0415907387734937e+00 + 13 -9.5439920921902188e-01 -2.4883242903650578e+00 7.6114693047507764e-01 + 14 -3.8887904860117584e-01 8.5477116770823836e-01 9.6044593562908342e-01 + 15 1.2422675493506932e+00 1.1218549628173435e+00 8.1110164044734756e-01 + 16 2.1400268605383865e+00 -2.4965492266203748e-01 2.9338413334557539e-01 + 17 3.4606863573420726e-01 -1.6253293955348258e-01 8.3788046585182652e-01 + 18 5.3913298050650360e-01 -3.6306149880845018e-01 -1.3644433880848611e-01 + 19 -8.8565742855485685e-01 -5.1283565338418813e-01 3.4184803877678438e-01 + 20 9.0201055596643320e-01 -1.5432441180973949e-01 2.5019120318328372e+00 + 21 -8.4304500718502740e-01 -1.1086241169281315e+00 1.0670338984329906e+00 + 22 -7.5370453705195994e-01 1.2324120063268100e+00 -1.2900280857825857e+00 + 23 6.4692284686214085e-01 5.8355643703399025e-02 9.9059773176904661e-02 + 24 4.1808267149116718e-01 2.1972271676460478e-01 9.0178136144889520e-01 + 25 9.5067109947159567e-01 -7.1001433761041055e-01 -2.2522611168143675e-01 + 26 -1.4189628945994965e+00 1.1872355559570493e+00 1.8776854869746780e+00 + 27 1.0876515764273502e+00 1.2659836451876101e+00 1.0886562769829036e+00 + 28 8.3074242334347670e-01 -2.9897327097090359e-01 1.9689055942185812e-01 + 29 9.1437695980628020e-01 -7.3645308473250570e-01 4.8968453448768196e-01 + 30 -1.0806269189961477e+00 -5.6190140339787442e-01 6.4734766260678434e-01 + 31 4.0753460927129886e-01 1.5929817993141845e-01 1.0999321370539653e-01 + 32 1.5183149717553066e+00 -6.5521087383005372e-01 -2.9884632754653433e+00 + 33 3.4940746921888372e-01 2.4326964612621163e-01 1.8192329656334594e-01 + 34 -1.8514129574914248e-01 -8.5852923547760740e-01 1.5455206847313827e-01 + 35 -8.2318178425600952e-01 -3.7842148103659906e-01 7.4317998433186316e-01 + 36 1.1078460070367759e+00 1.9365273733857606e+00 -2.6462424050606739e+00 + 37 -3.0180451316474803e+00 -1.9904234042232416e+00 1.7771282489729818e+00 + 38 1.5764259089536867e-01 -3.1529189165768895e-01 6.6059888155910329e-01 + 39 -2.3668217912482145e-01 1.3757062374735296e-01 1.0037889196678336e+00 + 40 -2.6348865021259882e-01 3.2916510203781731e-02 -5.6628882436553807e-01 + 41 1.1794997157712829e-01 -1.6779742092028040e+00 -3.8148351644750282e+00 + 42 -6.8069226854761511e-01 1.6485138974765121e+00 2.5129563187088899e+00 + 43 1.1330055931126801e+00 1.8497009211030632e-01 -5.6178878220343542e-01 + 44 5.6001340635605568e-01 8.8632610654150024e-01 3.4696759176263675e-01 + 45 3.3423204575671814e+00 3.4033830981377544e-01 -1.1708909898289344e+00 + 46 -3.6144030387785393e+00 6.5548828390316887e+00 -5.2136158572092164e+00 + 47 9.4553668521870238e-01 -7.5577753243620149e-01 -5.9680986967337046e-01 + 48 -1.0326779744043906e+00 -1.6034389840656762e+00 1.1086690830890802e-01 + 49 -5.5577910058369606e-01 -9.3520444938668762e-02 -2.6925160445930993e+00 + 50 -1.3887033917109509e-01 9.9499172345067610e-01 -1.0240555859311622e+00 + 51 4.0222806983901824e+00 -2.6927171397195577e+00 4.2047087014461537e+00 + 52 1.4941233993562599e+00 -3.2009776995700562e-01 -3.3036642779540681e-01 + 53 -2.7624520563920005e+00 3.5611723050032595e+00 -3.9545682501497672e+00 + 54 -1.7603059084766748e+00 1.9529648015896386e+00 -2.2186008176797536e+00 + 55 -7.1872078762525493e-01 1.8064721624337217e+00 -1.0168159662875087e+00 + 56 -1.2592023882495484e+00 -2.6444989788589122e+00 6.0847035235226699e-01 + 57 4.8517138132357318e-01 5.6759693047054770e-02 -1.2104792340960526e+00 + 58 -3.4860996323348342e-01 -5.7331276673498255e-01 -1.0767352946786732e+00 + 59 -1.3340708971796025e+00 3.1332888501297240e-01 -2.9301153736024926e-01 + 60 -1.2164435443163023e-01 -5.1460205871102127e-01 -9.9131864736457537e-03 + 61 4.7522326618707372e-01 1.1558250091010862e+00 -6.1902528991311094e-02 + 62 -2.6660583681422884e-01 8.5591351075782474e-01 5.1116288252156949e-01 + 63 -9.1518968073666329e-01 3.6620871834082208e-01 1.3717009379775633e+00 + 64 -2.0903769339836684e-01 -1.7115807284710055e-01 2.9013399354910757e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 -3.5594687246513851e-01 7.7635110360774062e-01 7.8606244010327925e-02 + 2 1.2912266918676170e+00 1.3173381338846049e-01 -1.6704486024539100e-01 + 3 -3.7771141209754272e-01 4.9113558222546644e-01 5.0843892096618404e-01 + 4 -2.8162602960214750e-01 -4.8885853055479250e-01 5.2872399967143768e-01 + 5 -1.0246509700813915e-01 5.0042161721801071e-01 7.4250173304617095e-01 + 6 1.7024292544564612e-01 -4.8571891643482573e-01 -1.1177736113985253e+00 + 7 -6.1156967647734628e-01 1.7777988770524997e-01 -1.0482593066403549e+00 + 8 -2.2803053652233527e+00 -8.3128853505189815e-01 5.9769610005980611e-01 + 9 -2.0412528982842673e-01 2.3429494633207595e-01 -1.0718228842943205e-02 + 10 -1.6394516410017825e+00 -1.3846084270060846e+00 1.9488592729039023e+00 + 11 -7.4381489395859790e-01 4.9587049221612645e-01 1.5417789661786050e+00 + 12 5.5521653745187747e+00 -6.1072463139592683e+00 2.0379322079766378e+00 + 13 -9.4756462470809255e-01 -2.4877736891899804e+00 7.5226803309043055e-01 + 14 -3.9200446837711395e-01 8.5283753206902235e-01 9.6064721369950445e-01 + 15 1.2362638802582744e+00 1.1275448796921670e+00 8.2038494169656861e-01 + 16 2.1458459966364862e+00 -2.4601526846582616e-01 3.0249484994513204e-01 + 17 3.5033252494564954e-01 -1.6019812976896347e-01 8.3743480500334844e-01 + 18 5.4153945202106868e-01 -3.6539157854410403e-01 -1.3890940478155159e-01 + 19 -8.8373351593798388e-01 -5.1375999600198863e-01 3.3838086377173826e-01 + 20 9.1083776558591201e-01 -1.5901783311179693e-01 2.5120277485392197e+00 + 21 -8.4451326390188375e-01 -1.1114371254461546e+00 1.0683708100111888e+00 + 22 -7.5900351136317357e-01 1.2362948592624003e+00 -1.2904719882957465e+00 + 23 6.4750144905585549e-01 5.7210394561653576e-02 9.9656845183695053e-02 + 24 4.1744599463524096e-01 2.1259307452400425e-01 9.0015278557498735e-01 + 25 9.4150711414692834e-01 -6.9696766946953348e-01 -2.3037907884929940e-01 + 26 -1.4147111014268414e+00 1.1852592022735329e+00 1.8714120935328260e+00 + 27 1.0913575316042794e+00 1.2631798236759981e+00 1.0886692662671837e+00 + 28 8.3606994982976401e-01 -2.9870115604791653e-01 2.0104887913912675e-01 + 29 9.0856098036906352e-01 -7.3344458789491729e-01 4.9044023023818029e-01 + 30 -1.0826205727094163e+00 -5.5988039025050618e-01 6.4711232608099511e-01 + 31 4.1011224141770930e-01 1.5686079255087973e-01 1.1174665384422497e-01 + 32 1.5236800901120839e+00 -6.6447541904097751e-01 -3.0029066595762131e+00 + 33 3.4809924424174560e-01 2.4258774026080121e-01 1.8547873786962699e-01 + 34 -1.8566489516093215e-01 -8.5962613022982770e-01 1.5500121503004105e-01 + 35 -8.2326371527234010e-01 -3.7446494006548797e-01 7.4176901677619744e-01 + 36 1.1216694832071858e+00 1.9435674071483879e+00 -2.6466616874103202e+00 + 37 -3.0242947522582693e+00 -2.0020088295323104e+00 1.7833212234562072e+00 + 38 1.5640855555189809e-01 -3.1385685146909081e-01 6.5939257465479251e-01 + 39 -2.3890624212376724e-01 1.3695249846310167e-01 9.9925648137039358e-01 + 40 -2.5999157346479995e-01 3.1168411923911173e-02 -5.6835334563867468e-01 + 41 1.0984936858413677e-01 -1.6871555450051683e+00 -3.8133642116431425e+00 + 42 -6.7414007843013279e-01 1.6420809941145773e+00 2.4984072206822328e+00 + 43 1.1316433346480113e+00 1.8319724981366828e-01 -5.5898271604147332e-01 + 44 5.5889273038048737e-01 8.8041312264921745e-01 3.4955044314737682e-01 + 45 3.3430620322843434e+00 3.5313991497815123e-01 -1.1569589542118532e+00 + 46 -3.6149781281961069e+00 6.5164580687961173e+00 -5.2150521432106514e+00 + 47 9.4289751736799332e-01 -7.5493583256778529e-01 -5.9703277588756754e-01 + 48 -1.0351254888362169e+00 -1.6064123120606622e+00 1.0928015294629903e-01 + 49 -5.5396348052819100e-01 -9.6219620467544717e-02 -2.7002439840435759e+00 + 50 -1.4230413604720668e-01 9.9949989127967187e-01 -1.0208667027739642e+00 + 51 4.0260347553297775e+00 -2.7092363330661420e+00 4.2163103565049731e+00 + 52 1.5014049017371378e+00 -3.2543162578864432e-01 -3.2804850620113690e-01 + 53 -2.7576475211158806e+00 3.5778880455472803e+00 -3.9634126284559739e+00 + 54 -1.7747042614438060e+00 1.9611723222936202e+00 -2.2286537149711774e+00 + 55 -7.0961411904806315e-01 1.7930263654460663e+00 -1.0103406695277632e+00 + 56 -1.2555251271044243e+00 -2.6388664033178353e+00 6.0588514885091604e-01 + 57 4.8145762540712084e-01 5.2468545137975810e-02 -1.2118211778405148e+00 + 58 -3.4694058897032376e-01 -5.7441401293929450e-01 -1.0787871369640367e+00 + 59 -1.3396085055318709e+00 3.1539675285445645e-01 -2.8946834728313148e-01 + 60 -1.2379671513099984e-01 -5.1727876413981821e-01 -7.3649497602094284e-03 + 61 4.7619944721043755e-01 1.1605170517221104e+00 -5.6890430461321161e-02 + 62 -2.6435363946227447e-01 8.6148926212607924e-01 5.0426612977179008e-01 + 63 -9.1855671177225018e-01 3.7209804640882943e-01 1.3718520221233417e+00 + 64 -2.0776194241579457e-01 -1.6779892537766616e-01 2.9221070734089666e-01 +... diff --git a/unittest/force-styles/tests/kspace-scafacos_fmm.yaml b/unittest/force-styles/tests/kspace-scafacos_fmm.yaml new file mode 100644 index 0000000000..f1cc00db5a --- /dev/null +++ b/unittest/force-styles/tests/kspace-scafacos_fmm.yaml @@ -0,0 +1,176 @@ +--- +lammps_version: 28 Jul 2021 +date_generated: Thu Jul 29 13:51:18 2021 +epsilon: 7.5e-14 +skip_tests: extract gpu intel omp opt single +prerequisites: ! | + atom full + pair zero + kspace scafacos +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + pair_modify compute no + kspace_style scafacos fmm 1.0e-6 + kspace_modify scafacos tolerance energy +input_file: in.empty +pair_style: zero 2.0 +pair_coeff: ! | + * * +extract: ! "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 2.7344321564545199e-01 1.0399389340459080e+00 1.3876659205276564e+01 + 2 1.5449492805477314e+01 3.9807611230601410e+00 3.8452246197298656e+00 + 3 3.7922326387058978e+00 8.3278630398292453e-01 3.4558724384105806e+00 + 4 2.9439011885186255e+00 2.9425289669765928e+00 1.4537825698476643e+01 + 5 1.5918381870117293e+00 1.9466983955760999e+00 2.4920283819610658e+00 + 6 2.6259105850931714e+00 5.3690549282090387e+00 4.7280710550656844e+00 + 7 4.4364137899372924e+00 1.8830119807345869e+00 4.3927142420671821e+00 + 8 8.9994986945653537e+00 1.0319345073350034e+01 3.1325097793340606e+00 + 9 6.2639497792534637e+00 3.5466245249326556e-01 4.4168044703814741e-01 + 10 1.3728949086169523e+01 5.9021795755719113e+00 8.3457486071450901e+00 + 11 2.1935277755276061e+01 2.7869562552965171e+01 8.7269231486518812e+00 + 12 2.6501414582988151e+01 9.2944945967416792e-01 2.9893684135007220e+01 + 13 8.0017877748191459e+00 -2.0479866024583404e-01 1.8886128149553960e+00 + 14 8.2751915637684714e+00 6.4950203286788843e+00 6.1408889770973660e+00 + 15 2.5492627306320166e+01 4.5129392612334049e+00 1.1790352768101927e+01 + 16 1.4548021362622153e+01 4.4129658170857944e+00 1.8763057824176370e+00 + 17 1.4501850921677406e+01 6.7172445683893223e+00 1.4946451374355608e+01 + 18 1.4380224167589164e+01 1.0657328311630781e+01 3.0305280185680523e+00 + 19 2.7117028415674902e+00 6.0958515694152835e+00 3.5888694749409322e+00 + 20 6.8588249090287832e+00 2.1685089048264814e+01 3.0689398605986988e+00 + 21 1.3970677084551384e+00 7.6485731075275760e+00 2.7541504068649560e+00 + 22 6.4444276115387433e-01 1.3543586508616185e+01 4.2755739385279030e+00 + 23 5.4068662708568285e+00 8.7086354605093970e+00 5.0428937664048483e+00 + 24 5.4312713624595412e+00 1.2571266358559207e+01 2.7852427311946037e+00 + 25 8.1530931814725847e+00 6.3515371417579880e+00 1.3439260563417083e+01 + 26 5.7966876253992297e+00 1.1833226279599716e+01 5.3217673083792665e+00 + 27 2.3267860762229891e+01 1.4309271416080643e+01 7.8963457432862878e+00 + 28 1.1260953746938771e+01 1.0982420982569744e+01 5.4782100561044245e-01 + 29 1.8364366816567017e+01 1.8114567006254543e+01 4.7963915777200725e+00 + 30 8.4699064361448997e+00 1.1831127571942893e+01 6.1292910736400543e+00 + 31 1.3574885121129002e+01 8.7336240590005261e+00 4.8188299300991302e+00 + 32 1.3385383391635896e+01 1.2337138351659931e+01 -1.1407697768669256e+00 + 33 1.4431230413397703e+01 1.4323234795228856e+01 7.3412835919167643e+00 + 34 1.3969000840127091e+01 3.0497552961987666e+00 1.1438187958657586e+01 + 35 2.8274638159884948e+00 1.3310584236809728e+01 1.0934799925612198e+01 + 36 4.1227766989196537e+00 5.0496806339038391e+00 5.0760662362820828e+00 + 37 1.0778695907734519e+00 1.7886854478960579e+00 1.9429658878866263e+01 + 38 2.1507826238910930e+00 5.0163985923792263e+00 1.3059978336793199e+01 + 39 4.7184812399996909e+00 1.8254153845821235e+00 1.2785381430623547e+01 + 40 1.0914696730747435e+01 1.0718508242219331e+01 1.6788193635066108e+01 + 41 1.3586482319031427e+01 -1.5239623554047868e+00 1.1745281944028184e+01 + 42 6.9398860475408766e+00 4.7619431190908390e+00 1.2768073133896067e+01 + 43 1.1588156942589237e+01 1.3899372094598682e+01 9.7231617836570958e+00 + 44 1.0965239807623258e+01 4.5248616203907224e+00 7.3388155089857969e+00 + 45 2.0005963749269888e+01 4.2227735756718454e+00 1.6223929793670294e+01 + 46 1.5526017105694056e+01 1.6284929674841809e+01 2.0992367380450514e+01 + 47 1.3127375507045139e+01 5.9613317928545073e-01 1.1818646444579961e+01 + 48 1.1752015469377881e+01 4.2624365718078785e+00 9.3936741324803013e+00 + 49 -1.8079546156243201e-01 1.3484378614909382e+01 1.2968496634781358e+01 + 50 1.3977239289088862e+01 1.1069385506148057e+01 9.1718995954572584e+00 + 51 1.0501584745309099e+01 1.2924452952562842e+01 2.4635331182036264e+01 + 52 7.4312440416195518e+00 2.1362430287074549e+01 1.2684482744099313e+01 + 53 -3.9423378960196026e-01 1.2140650466573046e+01 5.2721840335806291e+00 + 54 1.6486724505756662e+00 2.5799329956672310e+01 2.2930937959414567e+01 + 55 1.1381714926886266e+01 1.9619404013427232e+01 2.4718571006780024e+01 + 56 4.2372057514979335e+00 1.0391112686338122e+01 9.4444056811085204e+00 + 57 8.1940113668230694e+00 7.1104968470235610e+00 6.6029641159913739e+00 + 58 7.4171987227707223e+00 1.0606486204110411e+01 9.2591371200280381e+00 + 59 9.8492228684575540e+00 7.4248619970948182e+00 9.9383790371280565e+00 + 60 1.0703930971193111e+01 9.6975089632661309e+00 6.9600296320772648e+00 + 61 8.6943568640125886e+00 9.9063210411691909e+00 8.7603044365223557e+00 + 62 1.7747505488128564e+01 2.5570881878277447e+01 2.5486645140403137e+01 + 63 2.4039569847433405e+01 1.8842330744592978e+01 2.5780922573255157e+01 + 64 1.2463187447287556e+01 1.2183741551363838e+01 8.7353181028151692e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 2.7651197008406392e-01 1.0415678720698729e+00 1.3872779280956753e+01 + 2 1.5449759395644167e+01 3.9855855054817644e+00 3.8461983571873790e+00 + 3 3.7911997862296709e+00 8.3904670578733764e-01 3.4596764550266497e+00 + 4 2.9451794453200502e+00 2.9429333416401793e+00 1.4539905421385628e+01 + 5 1.5928739082338745e+00 1.9493358736373028e+00 2.4923949279780495e+00 + 6 2.6287567021955258e+00 5.3687720704968056e+00 4.7294762789274083e+00 + 7 4.4371727251964055e+00 1.8849030266615783e+00 4.3950133233595050e+00 + 8 8.9995619482820768e+00 1.0323826143877110e+01 3.1392473059420039e+00 + 9 6.2661777272152639e+00 3.5669414245675257e-01 4.4142832480338445e-01 + 10 1.3727322971707833e+01 5.9063385106156829e+00 8.3518208426500653e+00 + 11 2.1926479844297599e+01 2.7870186233913397e+01 8.7321323974980842e+00 + 12 2.6499840856249261e+01 9.6334231599157905e-01 2.9894678616837652e+01 + 13 8.0083245849009455e+00 -2.0662691830711327e-01 1.8836318629385369e+00 + 14 8.2734278851929588e+00 6.4943521153642392e+00 6.1412708017805970e+00 + 15 2.5488061118032654e+01 4.5213547499959432e+00 1.1799158997410883e+01 + 16 1.4552510395622944e+01 4.4186293928129361e+00 1.8852988616957091e+00 + 17 1.4503677326625587e+01 6.7180175990614028e+00 1.4946852464355752e+01 + 18 1.4381409845727509e+01 1.0654931903189308e+01 3.0312435986608013e+00 + 19 2.7124833930550141e+00 6.0976684772914878e+00 3.5882411745935676e+00 + 20 6.8736353394442133e+00 2.1678276577478638e+01 3.0788227833491426e+00 + 21 1.3982101172000410e+00 7.6478016226010919e+00 2.7552664131408222e+00 + 22 6.4165287851175445e-01 1.3545380494978804e+01 4.2776533346466232e+00 + 23 5.4103203059394964e+00 8.7067977369120033e+00 5.0443785937167185e+00 + 24 5.4297787167004739e+00 1.2566179323562508e+01 2.7871981984985559e+00 + 25 8.1468708309406459e+00 6.3628954278084935e+00 1.3433082052665378e+01 + 26 5.8007775598268116e+00 1.1833060785653855e+01 5.3158441970938508e+00 + 27 2.3271898130087564e+01 1.4312479526039127e+01 7.8988005138596940e+00 + 28 1.1264982854142273e+01 1.0981090427962860e+01 5.5114657128401012e-01 + 29 1.8360475666296047e+01 1.8116213282364310e+01 4.8005153364581687e+00 + 30 8.4676827902592962e+00 1.1833601197660210e+01 6.1285507516936439e+00 + 31 1.3576019178494166e+01 8.7326484174082530e+00 4.8222850257089043e+00 + 32 1.3392834293156350e+01 1.2328158960160978e+01 -1.1499265946201753e+00 + 33 1.4430657860970262e+01 1.4322553032339890e+01 7.3429611976555123e+00 + 34 1.3968718066334933e+01 3.0501935928985864e+00 1.1437920471232577e+01 + 35 2.8282015137638550e+00 1.3315777129063504e+01 1.0935554228914423e+01 + 36 4.1367964153236239e+00 5.0566506601763361e+00 5.0786104316094578e+00 + 37 1.0703378922264071e+00 1.7823190196209198e+00 1.9433986085653753e+01 + 38 2.1530664235557073e+00 5.0165958073490193e+00 1.3059881276991907e+01 + 39 4.7199366925331354e+00 1.8255865421137283e+00 1.2784193925972824e+01 + 40 1.0921240412276147e+01 1.0721353053339275e+01 1.6787748198188012e+01 + 41 1.3583625314875771e+01 -1.5319616145707560e+00 1.1746213735704959e+01 + 42 6.9450188200223204e+00 4.7593292629512449e+00 1.2755291668492266e+01 + 43 1.1589742925168665e+01 1.3899892638039299e+01 9.7253294013139477e+00 + 44 1.0961867009301859e+01 4.5225370661374633e+00 7.3400899132574153e+00 + 45 2.0002822406002132e+01 4.2338956487569925e+00 1.6239535666450255e+01 + 46 1.5524528724029626e+01 1.6247843935047122e+01 2.0990184675085441e+01 + 47 1.3124986938639472e+01 5.9786426712579610e-01 1.1818358403314216e+01 + 48 1.1749182513644152e+01 4.2614857224962961e+00 9.3944809519814623e+00 + 49 -1.7518331942173446e-01 1.3483181307872760e+01 1.2965159543102937e+01 + 50 1.3975895178424322e+01 1.1073548771278318e+01 9.1725615152146194e+00 + 51 1.0503392645304775e+01 1.2909679177891126e+01 2.4643385301924013e+01 + 52 7.4419899358623356e+00 2.1356769669062444e+01 1.2684434373290401e+01 + 53 -3.8607658405206186e-01 1.2157465333393549e+01 5.2631428549295682e+00 + 54 1.6360271583187511e+00 2.5806448449298628e+01 2.2923307834686828e+01 + 55 1.1390250487781625e+01 1.9609063402086711e+01 2.4725021107985334e+01 + 56 4.2381343760165091e+00 1.0395725713994882e+01 9.4450980706100012e+00 + 57 8.1922339516941101e+00 7.1086378058488044e+00 6.6012158192831887e+00 + 58 7.4214030094107608e+00 1.0605483796243540e+01 9.2605304646178155e+00 + 59 9.8444881364839958e+00 7.4248108566067454e+00 9.9426307778310061e+00 + 60 1.0702238644489983e+01 9.6979949572741546e+00 6.9618733394800447e+00 + 61 8.6978096405466658e+00 9.9105244542061097e+00 8.7648658602181566e+00 + 62 1.7748711620965818e+01 2.5580453958857554e+01 2.5482823034836599e+01 + 63 2.4039899519931453e+01 1.8846637147914485e+01 2.5778055934319141e+01 + 64 1.2463078463241402e+01 1.2184586889655829e+01 8.7354368948584202e+00 +... diff --git a/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml b/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml new file mode 100644 index 0000000000..26eed51ded --- /dev/null +++ b/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml @@ -0,0 +1,177 @@ +--- +lammps_version: 28 Jul 2021 +date_generated: Thu Jul 29 13:50:59 2021 +epsilon: 7.5e-14 +skip_tests: extract gpu intel omp opt single +prerequisites: ! | + atom full + pair zero + kspace scafacos +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + pair_modify compute no + kspace_style scafacos fmm 1.0e-6 + kspace_modify scafacos tolerance energy_rel + kspace_modify scafacos fmm_tuning 1 +input_file: in.empty +pair_style: zero 2.0 +pair_coeff: ! | + * * +extract: ! "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 2.7348813331578381e-01 1.0398337508932620e+00 1.3876159757936122e+01 + 2 1.5449500445625777e+01 3.9807925711395882e+00 3.8451554469155158e+00 + 3 3.7922392638729674e+00 8.3276903399611857e-01 3.4558923758723239e+00 + 4 2.9438818801998288e+00 2.9425326004887702e+00 1.4537787108189372e+01 + 5 1.5917206214898922e+00 1.9466982917982683e+00 2.4919869295950248e+00 + 6 2.6259075371703107e+00 5.3690587559849874e+00 4.7280760809090063e+00 + 7 4.4364253542789553e+00 1.8829999380617202e+00 4.3927130682638200e+00 + 8 8.9995014275062033e+00 1.0319344496761227e+01 3.1326023537694150e+00 + 9 6.2638175569366439e+00 3.5476316668194763e-01 4.4166040431977632e-01 + 10 1.3728953726809353e+01 5.9021860546627147e+00 8.3457830077413675e+00 + 11 2.1935169943515557e+01 2.7869616573716833e+01 8.7269888071726189e+00 + 12 2.6501474360021167e+01 9.2945619739867102e-01 2.9893788084785779e+01 + 13 8.0018212209254269e+00 -2.0476829653122275e-01 1.8886468465456818e+00 + 14 8.2751943329581028e+00 6.4950216944197710e+00 6.1408909216811107e+00 + 15 2.5492590440688410e+01 4.5129690225059003e+00 1.1790361371298170e+01 + 16 1.4548053703176246e+01 4.4129859630113533e+00 1.8762729984357014e+00 + 17 1.4501911070441551e+01 6.7171318111851042e+00 1.4946375871215359e+01 + 18 1.4380223720786740e+01 1.0657290731886400e+01 3.0305611923330629e+00 + 19 2.7117054831254972e+00 6.0958452763802571e+00 3.5888843335705802e+00 + 20 6.8588609322722185e+00 2.1685247490849857e+01 3.0689061298679143e+00 + 21 1.3970943275510144e+00 7.6485816765308989e+00 2.7541768792668018e+00 + 22 6.4448316569476405e-01 1.3543545509046767e+01 4.2755852447120430e+00 + 23 5.4068708057498780e+00 8.7086355398483786e+00 5.0428988259149952e+00 + 24 5.4312833896029256e+00 1.2571294549302225e+01 2.7852213701107713e+00 + 25 8.1530954705085517e+00 6.3515410254013185e+00 1.3439303825948702e+01 + 26 5.7966900211547721e+00 1.1833237493134883e+01 5.3217633843164807e+00 + 27 2.3267888779838575e+01 1.4309269348619916e+01 7.8963242010371877e+00 + 28 1.1260947273678511e+01 1.0982376414198882e+01 5.4781815763630859e-01 + 29 1.8364371291956008e+01 1.8114567435533047e+01 4.7963836742107802e+00 + 30 8.4699088067619392e+00 1.1831148231360789e+01 6.1292915173424580e+00 + 31 1.3574908849755397e+01 8.7336218936043508e+00 4.8188371166218111e+00 + 32 1.3385387163964113e+01 1.2337118159363795e+01 -1.1407524184510009e+00 + 33 1.4431168712277392e+01 1.4323208687692121e+01 7.3414504006410386e+00 + 34 1.3969041828620703e+01 3.0496943860655836e+00 1.1438260036991002e+01 + 35 2.8274003881940502e+00 1.3310589799922836e+01 1.0934862963723306e+01 + 36 4.1227887871968436e+00 5.0496895120609047e+00 5.0760680028349290e+00 + 37 1.0778839329208072e+00 1.7887023254017091e+00 1.9429711913612689e+01 + 38 2.1507942905958108e+00 5.0163776336856483e+00 1.3059976489761368e+01 + 39 4.7184683151918598e+00 1.8254262730434008e+00 1.2785388468062990e+01 + 40 1.0914703578871686e+01 1.0718511584407898e+01 1.6788195605985212e+01 + 41 1.3586528046198101e+01 -1.5240408132233365e+00 1.1745234629327168e+01 + 42 6.9398937131136336e+00 4.7619476312053433e+00 1.2768071613391614e+01 + 43 1.1588227900962954e+01 1.3899375234447838e+01 9.7231426518202095e+00 + 44 1.0965233207481576e+01 4.5248581872753171e+00 7.3388192421583183e+00 + 45 2.0005981603238130e+01 4.2227511758916396e+00 1.6223915605052568e+01 + 46 1.5526027660178757e+01 1.6284925837425668e+01 2.0992424515018055e+01 + 47 1.3127360638599988e+01 5.9612362528876883e-01 1.1818654631355532e+01 + 48 1.1751986404039938e+01 4.2624387920065523e+00 9.3936834836215191e+00 + 49 -1.8088745899087394e-01 1.3484430039477767e+01 1.2968484808313010e+01 + 50 1.3977286184112062e+01 1.1069454884631591e+01 9.1718660232339886e+00 + 51 1.0501587646222809e+01 1.2924465595968570e+01 2.4635324740606578e+01 + 52 7.4312485865974578e+00 2.1362396858961155e+01 1.2684502423254669e+01 + 53 -3.9424068307842736e-01 1.2140657200136484e+01 5.2721812571653501e+00 + 54 1.6485961493725905e+00 2.5799336851785167e+01 2.2930957175651425e+01 + 55 1.1381721034165544e+01 1.9619406419408808e+01 2.4718628489144805e+01 + 56 4.2371998207450279e+00 1.0391058816708153e+01 9.4444200256590882e+00 + 57 8.1940124415452154e+00 7.1104964926316265e+00 6.6029660024819821e+00 + 58 7.4171992229434318e+00 1.0606471694757657e+01 9.2591404855050907e+00 + 59 9.8492150170007964e+00 7.4248614672958269e+00 9.9383803157301998e+00 + 60 1.0703943615781606e+01 9.6975161414304889e+00 6.9600326393690422e+00 + 61 8.6943592534555965e+00 9.9063199807746116e+00 8.7603057701106710e+00 + 62 1.7747508836217346e+01 2.5570847046642644e+01 2.5486626980773114e+01 + 63 2.4039557027481166e+01 1.8842345704546617e+01 2.5780849026032008e+01 + 64 1.2463226569826761e+01 1.2183760586283075e+01 8.7353269230481754e+00 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 2.7655614077038770e-01 1.0414626143997929e+00 1.3872281044882385e+01 + 2 1.5449766942760903e+01 3.9856168870747379e+00 3.8461293438372790e+00 + 3 3.7912065186298132e+00 8.3902947798816940e-01 3.4596964702210671e+00 + 4 2.9451602238760008e+00 2.9429370858672668e+00 1.4539866735118618e+01 + 5 1.5927561638347016e+00 1.9493352486036057e+00 2.4923532256852292e+00 + 6 2.6287536719745823e+00 5.3687758985279252e+00 4.7294812963949129e+00 + 7 4.4371843565440887e+00 1.8848910506914887e+00 4.3950121035880807e+00 + 8 8.9995646852940840e+00 1.0323825531388316e+01 3.1393397431003773e+00 + 9 6.2660457365220648e+00 3.5679472756364977e-01 4.4140788476336190e-01 + 10 1.3727327649282635e+01 5.9063449929569556e+00 8.3518552034510591e+00 + 11 2.1926372209609372e+01 2.7870240309194713e+01 8.7321979226291049e+00 + 12 2.6499900558225651e+01 9.6334889661224665e-01 2.9894782842760570e+01 + 13 8.0083579713387767e+00 -2.0659652450187993e-01 1.8836657841036355e+00 + 14 8.2734306616064099e+00 6.4943534748345870e+00 6.1412727378626544e+00 + 15 2.5488024372384881e+01 4.5213844941317838e+00 1.1799167617793602e+01 + 16 1.4552542699098790e+01 4.4186495472922793e+00 1.8852661034736871e+00 + 17 1.4503737595959898e+01 6.7179050792379611e+00 1.4946776837792390e+01 + 18 1.4381409435231228e+01 1.0654894302462434e+01 3.0312767493334012e+00 + 19 2.7124860711088656e+00 6.0976621976484635e+00 3.5882560105608561e+00 + 20 6.8736710874219931e+00 2.1678434988867846e+01 3.0787890906385686e+00 + 21 1.3982367460894576e+00 7.6478102680775519e+00 2.7552928293027943e+00 + 22 6.4169326306508845e-01 1.3545339589741861e+01 4.2776645822412247e+00 + 23 5.4103248493900837e+00 8.7067978227779843e+00 5.0443836366850539e+00 + 24 5.4297907842916224e+00 1.2566207486059163e+01 2.7871769607932020e+00 + 25 8.1468730822611093e+00 6.3628993051274767e+00 1.3433125255649120e+01 + 26 5.8007799584797075e+00 1.1833072017157374e+01 5.3158402827220064e+00 + 27 2.3271926144411747e+01 1.4312477430258067e+01 7.8987789997376181e+00 + 28 1.1264976472326568e+01 1.0981045834527897e+01 5.5114366602934151e-01 + 29 1.8360480179925911e+01 1.8116213711345623e+01 4.8005074793206548e+00 + 30 8.4676851576636274e+00 1.1833621876668358e+01 6.1285512025545916e+00 + 31 1.3576042847021148e+01 8.7326462658984134e+00 4.8222921579271674e+00 + 32 1.3392837978387369e+01 1.2328138924567323e+01 -1.1499093150899995e+00 + 33 1.4430596032798116e+01 1.4322526693890415e+01 7.3431281073933219e+00 + 34 1.3968759042112440e+01 3.0501328584960681e+00 1.1437992430217433e+01 + 35 2.8281380771191573e+00 1.3315782732548923e+01 1.0935617245655472e+01 + 36 4.1368084680450741e+00 5.0566595585926750e+00 5.0786122099441879e+00 + 37 1.0703522301098087e+00 1.7823359592203234e+00 1.9434039156473521e+01 + 38 2.1530780772696327e+00 5.0165748615997767e+00 1.3059879461907968e+01 + 39 4.7199237473338425e+00 1.8255974081293400e+00 1.2784201000972180e+01 + 40 1.0921247275304767e+01 1.0721356400594475e+01 1.6787750162718144e+01 + 41 1.3583671245197891e+01 -1.5320398875481835e+00 1.1746166324691798e+01 + 42 6.9450264839149582e+00 4.7593338045337736e+00 1.2755290145911962e+01 + 43 1.1589813961300360e+01 1.3899896007891060e+01 9.7253102896186281e+00 + 44 1.0961860458506010e+01 4.5225336343607268e+00 7.3400936222246091e+00 + 45 2.0002840354073204e+01 4.2338732914616370e+00 1.6239521371602699e+01 + 46 1.5524539285930016e+01 1.6247840060528361e+01 2.0990241708216441e+01 + 47 1.3124971903636380e+01 5.9785477708513912e-01 1.1818366531227719e+01 + 48 1.1749153529429060e+01 4.2614879359139017e+00 9.3944902939537496e+00 + 49 -1.7527515462349436e-01 1.3483232497861167e+01 1.2965147624216133e+01 + 50 1.3975942039948640e+01 1.1073618153900194e+01 9.1725280413813692e+00 + 51 1.0503395570218585e+01 1.2909691804831095e+01 2.4643378857208571e+01 + 52 7.4419945907157885e+00 2.1356736284156529e+01 1.2684453946465149e+01 + 53 -3.8608341815151459e-01 1.2157472041148559e+01 5.2631401097631194e+00 + 54 1.6359505523220670e+00 2.5806455026771221e+01 2.2923327128942180e+01 + 55 1.1390256585246158e+01 1.9609065799837822e+01 2.4725078576748771e+01 + 56 4.2381284706319988e+00 1.0395671908445410e+01 9.4451124007703342e+00 + 57 8.1922350329752511e+00 7.1086374466494924e+00 6.6012176987006228e+00 + 58 7.4214035215815111e+00 1.0605469307739222e+01 9.2605338196606368e+00 + 59 9.8444802995072678e+00 7.4248103039388100e+00 9.9426320787676286e+00 + 60 1.0702251275564446e+01 9.6980021484872179e+00 6.9618763522862226e+00 + 61 8.6978120433876391e+00 9.9105234066795997e+00 8.7648671872123618e+00 + 62 1.7748715084812812e+01 2.5580419195546956e+01 2.5482804840636767e+01 + 63 2.4039886899787696e+01 1.8846652126082969e+01 2.5777982490636418e+01 + 64 1.2463117502673011e+01 1.2184605937034160e+01 8.7354457321354815e+00 +... diff --git a/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml b/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml new file mode 100644 index 0000000000..4d942c0684 --- /dev/null +++ b/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml @@ -0,0 +1,175 @@ +--- +lammps_version: 28 Jul 2021 +date_generated: Thu Jul 29 13:45:55 2021 +epsilon: 7.5e-14 +skip_tests: extract gpu intel omp opt single +prerequisites: ! | + atom full + pair zero + kspace scafacos +pre_commands: ! | + echo screen + variable newton_pair delete + variable newton_pair index on + atom_modify map array + units metal + atom_style charge + lattice diamond 3.77 + region box block 0 2 0 2 0 2 + create_box 2 box + create_atoms 1 box + displace_atoms all random 0.1 0.1 0.1 623426 + mass 1 28.0 + mass 2 16.0 + set type 1 type/fraction 2 0.666667 998877 + set type 1 charge 0.8 + set type 2 charge 0.4 + velocity all create 100 4534624 loop geom +post_commands: ! | + pair_modify compute no + kspace_style scafacos p2nfft 1.0e-6 +input_file: in.empty +pair_style: zero 2.0 +pair_coeff: ! | + * * +extract: ! "" +natoms: 64 +init_vdwl: 0 +init_coul: 0 +init_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +init_forces: ! |2 + 1 -3.5780085265127770e-01 7.7863976884689778e-01 8.1309435467640190e-02 + 2 1.2922844907752580e+00 1.2617353620515021e-01 -1.6455823742639325e-01 + 3 -3.7573025528065984e-01 4.8404099820901941e-01 5.0527564662430480e-01 + 4 -2.7871835080748381e-01 -4.8533790320940795e-01 5.2971652145288373e-01 + 5 -1.0334757758043411e-01 5.0146818454848385e-01 7.4439669266606512e-01 + 6 1.6994100006738755e-01 -4.8596028890184417e-01 -1.1155467819435494e+00 + 7 -6.1361226431521321e-01 1.7596436024569542e-01 -1.0492912504155925e+00 + 8 -2.2803855631628340e+00 -8.3759709226825729e-01 5.9297120974572937e-01 + 9 -2.0766700827147561e-01 2.3210985744108728e-01 -9.9414887901143056e-03 + 10 -1.6345268803939015e+00 -1.3881009194911340e+00 1.9432492599696523e+00 + 11 -7.3365718913973699e-01 4.9495192619582723e-01 1.5364153798840783e+00 + 12 5.5588866694584471e+00 -6.1330805899451262e+00 2.0415867813193076e+00 + 13 -9.5437646198899539e-01 -2.4883734666800250e+00 7.6111758657297612e-01 + 14 -3.8894783660145515e-01 8.5479214904251943e-01 9.6045059763897767e-01 + 15 1.2422769989298912e+00 1.1218121119058631e+00 8.1111530135350296e-01 + 16 2.1400030020232768e+00 -2.4964129257045650e-01 2.9334364533542473e-01 + 17 3.4605493199199827e-01 -1.6245457119545237e-01 8.3791339271169252e-01 + 18 5.3921802475361413e-01 -3.6306588338753015e-01 -1.3643801942048081e-01 + 19 -8.8564486509567664e-01 -5.1280311157875569e-01 3.4189452371378615e-01 + 20 9.0199869755368822e-01 -1.5438594886161169e-01 2.5018807235162450e+00 + 21 -8.4306432770331152e-01 -1.1086122791050077e+00 1.0670112041584534e+00 + 22 -7.5370542273115437e-01 1.2324093767050341e+00 -1.2900469723801509e+00 + 23 6.4694997778696761e-01 5.8326863628016111e-02 9.9042262644465875e-02 + 24 4.1807597395619162e-01 2.1970422875787554e-01 9.0175261706012111e-01 + 25 9.5070421618820644e-01 -7.1000907447189987e-01 -2.2522424240825395e-01 + 26 -1.4190122120224835e+00 1.1872197340350161e+00 1.8777069287446524e+00 + 27 1.0876171833808459e+00 1.2659568409984263e+00 1.0887050534686826e+00 + 28 8.3074879582524142e-01 -2.9903248606562183e-01 1.9688028219637457e-01 + 29 9.1446004698611993e-01 -7.3648908061130480e-01 4.8971588398224725e-01 + 30 -1.0806496963048899e+00 -5.6194899575245605e-01 6.4737904874501273e-01 + 31 4.0748872588326579e-01 1.5931983570425615e-01 1.1007904844298623e-01 + 32 1.5183422906765025e+00 -6.5520492347733528e-01 -2.9884551390565299e+00 + 33 3.4940717708684493e-01 2.4331903350211614e-01 1.8192795361205777e-01 + 34 -1.8506798197394539e-01 -8.5855506937629600e-01 1.5453618644299572e-01 + 35 -8.2315610861914990e-01 -3.7842441602683485e-01 7.4320784531703932e-01 + 36 1.1078345676821617e+00 1.9365206211001422e+00 -2.6462863074877290e+00 + 37 -3.0179819419253957e+00 -1.9903934289919694e+00 1.7770878311570411e+00 + 38 1.5762694264847721e-01 -3.1528290994028468e-01 6.6060440331789860e-01 + 39 -2.3668961472223182e-01 1.3758070564376421e-01 1.0038071017732935e+00 + 40 -2.6354974417212534e-01 3.2895859882109753e-02 -5.6623994456379567e-01 + 41 1.1795033887687183e-01 -1.6780278035635190e+00 -3.8149014900721743e+00 + 42 -6.8070892131582916e-01 1.6485351522884506e+00 2.5129752962183050e+00 + 43 1.1330337873027332e+00 1.8499156983709580e-01 -5.6176595095281412e-01 + 44 5.5997784986440435e-01 8.8637728505322155e-01 3.4697045321897801e-01 + 45 3.3423529485365053e+00 3.4038384858239051e-01 -1.1708815718073544e+00 + 46 -3.6144176704788360e+00 6.5549069124831325e+00 -5.2136549304833135e+00 + 47 9.4554648103638772e-01 -7.5576666911119417e-01 -5.9677264479171332e-01 + 48 -1.0326975682445696e+00 -1.6034151810142667e+00 1.1080098611982625e-01 + 49 -5.5577414429957672e-01 -9.3455057999570823e-02 -2.6925948328593057e+00 + 50 -1.3886703048963892e-01 9.9499821510491460e-01 -1.0240210089677995e+00 + 51 4.0221556136848591e+00 -2.6927643592781254e+00 4.2047442126568475e+00 + 52 1.4942101177103158e+00 -3.2009381779203661e-01 -3.3033399086403192e-01 + 53 -2.7624774194263360e+00 3.5611583359451511e+00 -3.9545461178665033e+00 + 54 -1.7601771337961456e+00 1.9528817541486010e+00 -2.2185978459566549e+00 + 55 -7.1863965766425175e-01 1.8064448727609259e+00 -1.0168921615510227e+00 + 56 -1.2591654137805013e+00 -2.6445258416521047e+00 6.0847677630810204e-01 + 57 4.8515929186083201e-01 5.6800969610901336e-02 -1.2105082904352986e+00 + 58 -3.4867557627872392e-01 -5.7335255353531400e-01 -1.0767583930439875e+00 + 59 -1.3340915504468165e+00 3.1329653267889523e-01 -2.9296881695668997e-01 + 60 -1.2169996221839811e-01 -5.1456385311797637e-01 -9.8030018204557264e-03 + 61 4.7531716366255333e-01 1.1558482949352020e+00 -6.1949686313014223e-02 + 62 -2.6665969633550657e-01 8.5591252724206024e-01 5.1105211294860375e-01 + 63 -9.1523646674273162e-01 3.6618705261747708e-01 1.3716381151254511e+00 + 64 -2.0905212181142560e-01 -1.7117728320901313e-01 2.9013599408630292e-01 +run_vdwl: 0 +run_coul: 0 +run_stress: ! |2- + 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +run_forces: ! |2 + 1 -3.5599465277874337e-01 7.7633563210201439e-01 7.8608287114398531e-02 + 2 1.2912444513221386e+00 1.3171074778431663e-01 -1.6709077934812025e-01 + 3 -3.7778394309723595e-01 4.9113040113955064e-01 5.0843913734857116e-01 + 4 -2.8160590164110361e-01 -4.8878002393520997e-01 5.2876504771411781e-01 + 5 -1.0246398111325765e-01 5.0042314656761777e-01 7.4249943608168201e-01 + 6 1.7026412976482125e-01 -4.8569149755207264e-01 -1.1177979176537638e+00 + 7 -6.1157150536632754e-01 1.7780526280974610e-01 -1.0482785227682809e+00 + 8 -2.2803033602270113e+00 -8.3129136327922382e-01 5.9776125803763147e-01 + 9 -2.0412884204250900e-01 2.3427962224815385e-01 -1.0770528415536308e-02 + 10 -1.6395249183522340e+00 -1.3846171682090063e+00 1.9489368073674458e+00 + 11 -7.4384398462075541e-01 4.9593348161567763e-01 1.5417172674238946e+00 + 12 5.5522457751993306e+00 -6.1071890124408590e+00 2.0379295184209441e+00 + 13 -9.4754136611890361e-01 -2.4878234814503268e+00 7.5223931626223006e-01 + 14 -3.9207159478920939e-01 8.5285000504462738e-01 9.6066600572919925e-01 + 15 1.2362731881630049e+00 1.1275018638056002e+00 8.2039786516951951e-01 + 16 2.1458216451669467e+00 -2.4600152585358967e-01 3.0245420353190700e-01 + 17 3.5031822937838691e-01 -1.6012009083925022e-01 8.3746799365378788e-01 + 18 5.4162411674577549e-01 -3.6539600304717962e-01 -1.3890268979540130e-01 + 19 -8.8372161780756198e-01 -5.1372696193270195e-01 3.3842788077218255e-01 + 20 9.1082593999160222e-01 -1.5907936723559218e-01 2.5119960949326550e+00 + 21 -8.4453240105018001e-01 -1.1114249926510182e+00 1.0683480182334557e+00 + 22 -7.5901812032485194e-01 1.2362829517602851e+00 -1.2904928786440111e+00 + 23 6.4749652714435890e-01 5.7183792030700724e-02 9.9630367903745021e-02 + 24 4.1743877222754944e-01 2.1257500035865246e-01 9.0012441506337237e-01 + 25 9.4154054368717621e-01 -6.9696307546168668e-01 -2.3037754991060369e-01 + 26 -1.4147606322450448e+00 1.1852438384397077e+00 1.8714334967463950e+00 + 27 1.0913232723293391e+00 1.2631536555896299e+00 1.0887179972260461e+00 + 28 8.3607624699610106e-01 -2.9876033153742881e-01 2.0103809983435189e-01 + 29 9.0867666153903059e-01 -7.3348359738843760e-01 4.9048017891692930e-01 + 30 -1.0826435302980415e+00 -5.5992774065913897e-01 6.4714350012480903e-01 + 31 4.1006603285049326e-01 1.5688269091624402e-01 1.1183257356568566e-01 + 32 1.5237080034236907e+00 -6.6446962259938114e-01 -3.0028977178372305e+00 + 33 3.4809903460421671e-01 2.4263707670092263e-01 1.8548272388516152e-01 + 34 -1.8559179106825602e-01 -8.5965212491687493e-01 1.5498510256295175e-01 + 35 -8.2323811568016536e-01 -3.7446777289783217e-01 7.4179734435525690e-01 + 36 1.1216577568476001e+00 1.9435602775878549e+00 -2.6467050407020145e+00 + 37 -3.0242325221471873e+00 -2.0019779960672435e+00 1.7832800324601961e+00 + 38 1.5639331727398945e-01 -3.1384844053781685e-01 6.5939848308959670e-01 + 39 -2.3891287935735561e-01 1.3696242649001544e-01 9.9927544788075251e-01 + 40 -2.6005244701964797e-01 3.1148344174346039e-02 -5.6830454389140284e-01 + 41 1.0984955793817870e-01 -1.6872092943648189e+00 -3.8134304123272802e+00 + 42 -6.7415702739884864e-01 1.6421029029708696e+00 2.4984265716567360e+00 + 43 1.1316721879007416e+00 1.8321921143065667e-01 -5.5896015264209020e-01 + 44 5.5887069723897620e-01 8.8047366986242992e-01 3.4955517217254256e-01 + 45 3.3430941347488128e+00 3.5318437490380933e-01 -1.1569499934166860e+00 + 46 -3.6149934072318781e+00 6.5164821545447662e+00 -5.2150916858833742e+00 + 47 9.4291455215930775e-01 -7.5491185109055670e-01 -5.9698837432145690e-01 + 48 -1.0351450961955566e+00 -1.6063882052618959e+00 1.0921430875137585e-01 + 49 -5.5395759954278168e-01 -9.6154620179743772e-02 -2.7003218453569198e+00 + 50 -1.4230032022250677e-01 9.9950629772014710e-01 -1.0208325819496138e+00 + 51 4.0259086743816832e+00 -2.7092834758220055e+00 4.2163452584481842e+00 + 52 1.5014916340191014e+00 -3.2542712320455991e-01 -3.2801716278067305e-01 + 53 -2.7576726796548323e+00 3.5778743692015618e+00 -3.9633908627944878e+00 + 54 -1.7745752034899882e+00 1.9610887449781207e+00 -2.2286504726179523e+00 + 55 -7.0953378422719982e-01 1.7929999880092451e+00 -1.0104167898343672e+00 + 56 -1.2554884038218002e+00 -2.6388935478749458e+00 6.0589183486957654e-01 + 57 4.8143879217236130e-01 5.2496567995491412e-02 -1.2118576178317293e+00 + 58 -3.4700718412581655e-01 -5.7444460503038808e-01 -1.0788240405951006e+00 + 59 -1.3396290256712649e+00 3.1536346198386150e-01 -2.8942564038883140e-01 + 60 -1.2385218215819434e-01 -5.1724001128706532e-01 -7.2550429081412703e-03 + 61 4.7629383517182111e-01 1.1605401610189616e+00 -5.6938017636594000e-02 + 62 -2.6440699771965498e-01 8.6148870676117095e-01 5.0415651630294822e-01 + 63 -9.1860291220907786e-01 3.7207635298197222e-01 1.3717887100670061e+00 + 64 -2.0777660840087850e-01 -1.6781857712494050e-01 2.9221204134120399e-01 +... From b4e3795913676db759d1ee6d50a6449a293a1cc2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 13:58:27 -0400 Subject: [PATCH 199/352] fix copy-n-paste error --- src/ATC/fix_atc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ATC/fix_atc.cpp b/src/ATC/fix_atc.cpp index 577a488f5e..21306e01bd 100644 --- a/src/ATC/fix_atc.cpp +++ b/src/ATC/fix_atc.cpp @@ -702,7 +702,7 @@ void FixATC::write_restart(FILE * /* fp */) { char *args[2]; args[0] = utils::strdup("write_restart"); - args[1] = utils::strdup("sprintf(args[1],"ATC.restart"); + args[1] = utils::strdup("ATC.restart"); // Then call all objects I own to write their data if (comm->me == 0) { From 3a968b81adb7821ebbeb8fffed828879699d0069 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 13:59:59 -0400 Subject: [PATCH 200/352] update --- .../tests/kspace-scafacos_fmm.yaml | 258 +++++++++--------- 1 file changed, 129 insertions(+), 129 deletions(-) diff --git a/unittest/force-styles/tests/kspace-scafacos_fmm.yaml b/unittest/force-styles/tests/kspace-scafacos_fmm.yaml index f1cc00db5a..f0e6d4b7e3 100644 --- a/unittest/force-styles/tests/kspace-scafacos_fmm.yaml +++ b/unittest/force-styles/tests/kspace-scafacos_fmm.yaml @@ -1,6 +1,6 @@ --- lammps_version: 28 Jul 2021 -date_generated: Thu Jul 29 13:51:18 2021 +date_generated: Thu Jul 29 13:59:36 2021 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -40,137 +40,137 @@ init_coul: 0 init_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 init_forces: ! |2 - 1 2.7344321564545199e-01 1.0399389340459080e+00 1.3876659205276564e+01 - 2 1.5449492805477314e+01 3.9807611230601410e+00 3.8452246197298656e+00 - 3 3.7922326387058978e+00 8.3278630398292453e-01 3.4558724384105806e+00 - 4 2.9439011885186255e+00 2.9425289669765928e+00 1.4537825698476643e+01 - 5 1.5918381870117293e+00 1.9466983955760999e+00 2.4920283819610658e+00 - 6 2.6259105850931714e+00 5.3690549282090387e+00 4.7280710550656844e+00 - 7 4.4364137899372924e+00 1.8830119807345869e+00 4.3927142420671821e+00 - 8 8.9994986945653537e+00 1.0319345073350034e+01 3.1325097793340606e+00 - 9 6.2639497792534637e+00 3.5466245249326556e-01 4.4168044703814741e-01 - 10 1.3728949086169523e+01 5.9021795755719113e+00 8.3457486071450901e+00 - 11 2.1935277755276061e+01 2.7869562552965171e+01 8.7269231486518812e+00 - 12 2.6501414582988151e+01 9.2944945967416792e-01 2.9893684135007220e+01 - 13 8.0017877748191459e+00 -2.0479866024583404e-01 1.8886128149553960e+00 - 14 8.2751915637684714e+00 6.4950203286788843e+00 6.1408889770973660e+00 - 15 2.5492627306320166e+01 4.5129392612334049e+00 1.1790352768101927e+01 - 16 1.4548021362622153e+01 4.4129658170857944e+00 1.8763057824176370e+00 - 17 1.4501850921677406e+01 6.7172445683893223e+00 1.4946451374355608e+01 - 18 1.4380224167589164e+01 1.0657328311630781e+01 3.0305280185680523e+00 - 19 2.7117028415674902e+00 6.0958515694152835e+00 3.5888694749409322e+00 - 20 6.8588249090287832e+00 2.1685089048264814e+01 3.0689398605986988e+00 - 21 1.3970677084551384e+00 7.6485731075275760e+00 2.7541504068649560e+00 - 22 6.4444276115387433e-01 1.3543586508616185e+01 4.2755739385279030e+00 - 23 5.4068662708568285e+00 8.7086354605093970e+00 5.0428937664048483e+00 - 24 5.4312713624595412e+00 1.2571266358559207e+01 2.7852427311946037e+00 - 25 8.1530931814725847e+00 6.3515371417579880e+00 1.3439260563417083e+01 - 26 5.7966876253992297e+00 1.1833226279599716e+01 5.3217673083792665e+00 - 27 2.3267860762229891e+01 1.4309271416080643e+01 7.8963457432862878e+00 - 28 1.1260953746938771e+01 1.0982420982569744e+01 5.4782100561044245e-01 - 29 1.8364366816567017e+01 1.8114567006254543e+01 4.7963915777200725e+00 - 30 8.4699064361448997e+00 1.1831127571942893e+01 6.1292910736400543e+00 - 31 1.3574885121129002e+01 8.7336240590005261e+00 4.8188299300991302e+00 - 32 1.3385383391635896e+01 1.2337138351659931e+01 -1.1407697768669256e+00 - 33 1.4431230413397703e+01 1.4323234795228856e+01 7.3412835919167643e+00 - 34 1.3969000840127091e+01 3.0497552961987666e+00 1.1438187958657586e+01 - 35 2.8274638159884948e+00 1.3310584236809728e+01 1.0934799925612198e+01 - 36 4.1227766989196537e+00 5.0496806339038391e+00 5.0760662362820828e+00 - 37 1.0778695907734519e+00 1.7886854478960579e+00 1.9429658878866263e+01 - 38 2.1507826238910930e+00 5.0163985923792263e+00 1.3059978336793199e+01 - 39 4.7184812399996909e+00 1.8254153845821235e+00 1.2785381430623547e+01 - 40 1.0914696730747435e+01 1.0718508242219331e+01 1.6788193635066108e+01 - 41 1.3586482319031427e+01 -1.5239623554047868e+00 1.1745281944028184e+01 - 42 6.9398860475408766e+00 4.7619431190908390e+00 1.2768073133896067e+01 - 43 1.1588156942589237e+01 1.3899372094598682e+01 9.7231617836570958e+00 - 44 1.0965239807623258e+01 4.5248616203907224e+00 7.3388155089857969e+00 - 45 2.0005963749269888e+01 4.2227735756718454e+00 1.6223929793670294e+01 - 46 1.5526017105694056e+01 1.6284929674841809e+01 2.0992367380450514e+01 - 47 1.3127375507045139e+01 5.9613317928545073e-01 1.1818646444579961e+01 - 48 1.1752015469377881e+01 4.2624365718078785e+00 9.3936741324803013e+00 - 49 -1.8079546156243201e-01 1.3484378614909382e+01 1.2968496634781358e+01 - 50 1.3977239289088862e+01 1.1069385506148057e+01 9.1718995954572584e+00 - 51 1.0501584745309099e+01 1.2924452952562842e+01 2.4635331182036264e+01 - 52 7.4312440416195518e+00 2.1362430287074549e+01 1.2684482744099313e+01 - 53 -3.9423378960196026e-01 1.2140650466573046e+01 5.2721840335806291e+00 - 54 1.6486724505756662e+00 2.5799329956672310e+01 2.2930937959414567e+01 - 55 1.1381714926886266e+01 1.9619404013427232e+01 2.4718571006780024e+01 - 56 4.2372057514979335e+00 1.0391112686338122e+01 9.4444056811085204e+00 - 57 8.1940113668230694e+00 7.1104968470235610e+00 6.6029641159913739e+00 - 58 7.4171987227707223e+00 1.0606486204110411e+01 9.2591371200280381e+00 - 59 9.8492228684575540e+00 7.4248619970948182e+00 9.9383790371280565e+00 - 60 1.0703930971193111e+01 9.6975089632661309e+00 6.9600296320772648e+00 - 61 8.6943568640125886e+00 9.9063210411691909e+00 8.7603044365223557e+00 - 62 1.7747505488128564e+01 2.5570881878277447e+01 2.5486645140403137e+01 - 63 2.4039569847433405e+01 1.8842330744592978e+01 2.5780922573255157e+01 - 64 1.2463187447287556e+01 1.2183741551363838e+01 8.7353181028151692e+00 + 1 2.7339063940784997e-01 1.0398584642438784e+00 1.3876677115623822e+01 + 2 1.5449478859210185e+01 3.9807646407771706e+00 3.8452108818218989e+00 + 3 3.7922292228486154e+00 8.3278982858858719e-01 3.4558764596299913e+00 + 4 2.9439022400900794e+00 2.9425316358213460e+00 1.4537815418061934e+01 + 5 1.5918282318857477e+00 1.9466923187369278e+00 2.4920164317022322e+00 + 6 2.6259096626027763e+00 5.3690548045118343e+00 4.7280720643143459e+00 + 7 4.4364149858373381e+00 1.8830106981777381e+00 4.3927140926847876e+00 + 8 8.9994919943878458e+00 1.0319333719054111e+01 3.1325190470862920e+00 + 9 6.2639430983643916e+00 3.5465942237364662e-01 4.4164563773324500e-01 + 10 1.3728947295581174e+01 5.9021794828109329e+00 8.3457490577608819e+00 + 11 2.1935266392605453e+01 2.7869586818581052e+01 8.7269386758322902e+00 + 12 2.6501417953214947e+01 9.2944515357453383e-01 2.9893694846480891e+01 + 13 8.0017868283361864e+00 -2.0480000477307078e-01 1.8886125899896180e+00 + 14 8.2751915063617449e+00 6.4950207170647731e+00 6.1408889527755424e+00 + 15 2.5492629057139158e+01 4.5129447136617618e+00 1.1790354529401226e+01 + 16 1.4548033550943442e+01 4.4129760535816764e+00 1.8762996654089177e+00 + 17 1.4501886004384486e+01 6.7172333741966659e+00 1.4946456457253671e+01 + 18 1.4380231352803651e+01 1.0657318078844025e+01 3.0305380619556992e+00 + 19 2.7117040760869258e+00 6.0958489966828280e+00 3.5888701332617345e+00 + 20 6.8588289047326523e+00 2.1685100075630384e+01 3.0689530559241094e+00 + 21 1.3970715864233743e+00 7.6485696628868984e+00 2.7541521458281810e+00 + 22 6.4444947706839140e-01 1.3543590120400586e+01 4.2755781402495483e+00 + 23 5.4068674827365575e+00 8.7086349833601417e+00 5.0428947328516447e+00 + 24 5.4312827345604582e+00 1.2571272098914946e+01 2.7852358900175327e+00 + 25 8.1530893267042561e+00 6.3515315765007285e+00 1.3439268304017853e+01 + 26 5.7966912448449950e+00 1.1833229940174480e+01 5.3217642673833669e+00 + 27 2.3267869472127863e+01 1.4309275826859356e+01 7.8963367708422210e+00 + 28 1.1260944199011011e+01 1.0982416624809950e+01 5.4781008218826555e-01 + 29 1.8364373932483506e+01 1.8114575936962201e+01 4.7963843887110995e+00 + 30 8.4699118725892095e+00 1.1831131679525390e+01 6.1292867917739171e+00 + 31 1.3574891076770147e+01 8.7336295926551148e+00 4.8188233566036978e+00 + 32 1.3385358645582031e+01 1.2337136139430978e+01 -1.1407537543363280e+00 + 33 1.4431254414797383e+01 1.4323270722985020e+01 7.3412982059852405e+00 + 34 1.3969015814731950e+01 3.0497527065417538e+00 1.1438193011115416e+01 + 35 2.8274612870452827e+00 1.3310596649189844e+01 1.0934800402627175e+01 + 36 4.1227796527672247e+00 5.0496833005488906e+00 5.0760639160996570e+00 + 37 1.0778865198577798e+00 1.7886986861195175e+00 1.9429656730727547e+01 + 38 2.1507912036772274e+00 5.0163999162886705e+00 1.3059973398218787e+01 + 39 4.7184837576582739e+00 1.8254210730825249e+00 1.2785375095381566e+01 + 40 1.0914698093337906e+01 1.0718509088271100e+01 1.6788193438507498e+01 + 41 1.3586481981709722e+01 -1.5239863081915879e+00 1.1745282987768370e+01 + 42 6.9398875726161808e+00 4.7619430688781792e+00 1.2768071567242616e+01 + 43 1.1588164715834184e+01 1.3899359269764020e+01 9.7231579194054252e+00 + 44 1.0965239173076537e+01 4.5248617513930398e+00 7.3388171142222944e+00 + 45 2.0005964012876234e+01 4.2227699805208117e+00 1.6223931818222106e+01 + 46 1.5526014505006465e+01 1.6284924134272789e+01 2.0992375692042025e+01 + 47 1.3127373945008495e+01 5.9613676972817820e-01 1.1818649380998295e+01 + 48 1.1752011760073165e+01 4.2624325952007052e+00 9.3936800804301743e+00 + 49 -1.8083114119102686e-01 1.3484382451495406e+01 1.2968496483400171e+01 + 50 1.3977230877784629e+01 1.1069395735976926e+01 9.1718913973014065e+00 + 51 1.0501583772570205e+01 1.2924455613895539e+01 2.4635326394635712e+01 + 52 7.4312466935226507e+00 2.1362429208023588e+01 1.2684489311596673e+01 + 53 -3.9423472393928005e-01 1.2140651778404555e+01 5.2721832783360920e+00 + 54 1.6486683063194796e+00 2.5799339448561621e+01 2.2930940200560425e+01 + 55 1.1381711105261633e+01 1.9619397164808387e+01 2.4718572378018937e+01 + 56 4.2371990707925189e+00 1.0391111164264462e+01 9.4444112139484186e+00 + 57 8.1940110299887845e+00 7.1104964509274149e+00 6.6029642542276257e+00 + 58 7.4171966479935518e+00 1.0606484741894738e+01 9.2591367752523972e+00 + 59 9.8492217557475890e+00 7.4248599602856826e+00 9.9383796190193223e+00 + 60 1.0703934587591242e+01 9.6975123527339750e+00 6.9600273027828559e+00 + 61 8.6943566928347042e+00 9.9063208481752607e+00 8.7603038680622749e+00 + 62 1.7747503909004458e+01 2.5570884925267926e+01 2.5486642748089793e+01 + 63 2.4039571595079909e+01 1.8842327788463692e+01 2.5780918017439593e+01 + 64 1.2463201275251899e+01 1.2183751842880715e+01 8.7353099160217837e+00 run_vdwl: 0 run_coul: 0 run_stress: ! |2- 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 run_forces: ! |2 - 1 2.7651197008406392e-01 1.0415678720698729e+00 1.3872779280956753e+01 - 2 1.5449759395644167e+01 3.9855855054817644e+00 3.8461983571873790e+00 - 3 3.7911997862296709e+00 8.3904670578733764e-01 3.4596764550266497e+00 - 4 2.9451794453200502e+00 2.9429333416401793e+00 1.4539905421385628e+01 - 5 1.5928739082338745e+00 1.9493358736373028e+00 2.4923949279780495e+00 - 6 2.6287567021955258e+00 5.3687720704968056e+00 4.7294762789274083e+00 - 7 4.4371727251964055e+00 1.8849030266615783e+00 4.3950133233595050e+00 - 8 8.9995619482820768e+00 1.0323826143877110e+01 3.1392473059420039e+00 - 9 6.2661777272152639e+00 3.5669414245675257e-01 4.4142832480338445e-01 - 10 1.3727322971707833e+01 5.9063385106156829e+00 8.3518208426500653e+00 - 11 2.1926479844297599e+01 2.7870186233913397e+01 8.7321323974980842e+00 - 12 2.6499840856249261e+01 9.6334231599157905e-01 2.9894678616837652e+01 - 13 8.0083245849009455e+00 -2.0662691830711327e-01 1.8836318629385369e+00 - 14 8.2734278851929588e+00 6.4943521153642392e+00 6.1412708017805970e+00 - 15 2.5488061118032654e+01 4.5213547499959432e+00 1.1799158997410883e+01 - 16 1.4552510395622944e+01 4.4186293928129361e+00 1.8852988616957091e+00 - 17 1.4503677326625587e+01 6.7180175990614028e+00 1.4946852464355752e+01 - 18 1.4381409845727509e+01 1.0654931903189308e+01 3.0312435986608013e+00 - 19 2.7124833930550141e+00 6.0976684772914878e+00 3.5882411745935676e+00 - 20 6.8736353394442133e+00 2.1678276577478638e+01 3.0788227833491426e+00 - 21 1.3982101172000410e+00 7.6478016226010919e+00 2.7552664131408222e+00 - 22 6.4165287851175445e-01 1.3545380494978804e+01 4.2776533346466232e+00 - 23 5.4103203059394964e+00 8.7067977369120033e+00 5.0443785937167185e+00 - 24 5.4297787167004739e+00 1.2566179323562508e+01 2.7871981984985559e+00 - 25 8.1468708309406459e+00 6.3628954278084935e+00 1.3433082052665378e+01 - 26 5.8007775598268116e+00 1.1833060785653855e+01 5.3158441970938508e+00 - 27 2.3271898130087564e+01 1.4312479526039127e+01 7.8988005138596940e+00 - 28 1.1264982854142273e+01 1.0981090427962860e+01 5.5114657128401012e-01 - 29 1.8360475666296047e+01 1.8116213282364310e+01 4.8005153364581687e+00 - 30 8.4676827902592962e+00 1.1833601197660210e+01 6.1285507516936439e+00 - 31 1.3576019178494166e+01 8.7326484174082530e+00 4.8222850257089043e+00 - 32 1.3392834293156350e+01 1.2328158960160978e+01 -1.1499265946201753e+00 - 33 1.4430657860970262e+01 1.4322553032339890e+01 7.3429611976555123e+00 - 34 1.3968718066334933e+01 3.0501935928985864e+00 1.1437920471232577e+01 - 35 2.8282015137638550e+00 1.3315777129063504e+01 1.0935554228914423e+01 - 36 4.1367964153236239e+00 5.0566506601763361e+00 5.0786104316094578e+00 - 37 1.0703378922264071e+00 1.7823190196209198e+00 1.9433986085653753e+01 - 38 2.1530664235557073e+00 5.0165958073490193e+00 1.3059881276991907e+01 - 39 4.7199366925331354e+00 1.8255865421137283e+00 1.2784193925972824e+01 - 40 1.0921240412276147e+01 1.0721353053339275e+01 1.6787748198188012e+01 - 41 1.3583625314875771e+01 -1.5319616145707560e+00 1.1746213735704959e+01 - 42 6.9450188200223204e+00 4.7593292629512449e+00 1.2755291668492266e+01 - 43 1.1589742925168665e+01 1.3899892638039299e+01 9.7253294013139477e+00 - 44 1.0961867009301859e+01 4.5225370661374633e+00 7.3400899132574153e+00 - 45 2.0002822406002132e+01 4.2338956487569925e+00 1.6239535666450255e+01 - 46 1.5524528724029626e+01 1.6247843935047122e+01 2.0990184675085441e+01 - 47 1.3124986938639472e+01 5.9786426712579610e-01 1.1818358403314216e+01 - 48 1.1749182513644152e+01 4.2614857224962961e+00 9.3944809519814623e+00 - 49 -1.7518331942173446e-01 1.3483181307872760e+01 1.2965159543102937e+01 - 50 1.3975895178424322e+01 1.1073548771278318e+01 9.1725615152146194e+00 - 51 1.0503392645304775e+01 1.2909679177891126e+01 2.4643385301924013e+01 - 52 7.4419899358623356e+00 2.1356769669062444e+01 1.2684434373290401e+01 - 53 -3.8607658405206186e-01 1.2157465333393549e+01 5.2631428549295682e+00 - 54 1.6360271583187511e+00 2.5806448449298628e+01 2.2923307834686828e+01 - 55 1.1390250487781625e+01 1.9609063402086711e+01 2.4725021107985334e+01 - 56 4.2381343760165091e+00 1.0395725713994882e+01 9.4450980706100012e+00 - 57 8.1922339516941101e+00 7.1086378058488044e+00 6.6012158192831887e+00 - 58 7.4214030094107608e+00 1.0605483796243540e+01 9.2605304646178155e+00 - 59 9.8444881364839958e+00 7.4248108566067454e+00 9.9426307778310061e+00 - 60 1.0702238644489983e+01 9.6979949572741546e+00 6.9618733394800447e+00 - 61 8.6978096405466658e+00 9.9105244542061097e+00 8.7648658602181566e+00 - 62 1.7748711620965818e+01 2.5580453958857554e+01 2.5482823034836599e+01 - 63 2.4039899519931453e+01 1.8846637147914485e+01 2.5778055934319141e+01 - 64 1.2463078463241402e+01 1.2184586889655829e+01 8.7354368948584202e+00 + 1 2.7645928342823628e-01 1.0414874769541569e+00 1.3872797098516825e+01 + 2 1.5449745448213404e+01 3.9855889682500787e+00 3.8461846982438397e+00 + 3 3.7911963698636382e+00 8.3905020702338851e-01 3.4596804857200909e+00 + 4 2.9451805373111259e+00 2.9429360447301640e+00 1.4539895148633079e+01 + 5 1.5928640303290815e+00 1.9493297547333217e+00 2.4923829469251837e+00 + 6 2.6287557853063563e+00 5.3687719540688095e+00 4.7294772891780914e+00 + 7 4.4371739403868107e+00 1.8849017497472327e+00 4.3950131667175851e+00 + 8 8.9995552533340284e+00 1.0323814819903413e+01 3.1392565388523828e+00 + 9 6.2661710933366166e+00 3.5669104363007026e-01 4.4139344865180674e-01 + 10 1.3727321185765140e+01 5.9063384173823508e+00 8.3518213011316043e+00 + 11 2.1926468508652672e+01 2.7870210465669690e+01 8.7321479530188899e+00 + 12 2.6499844153058724e+01 9.6333797077266248e-01 2.9894689320447924e+01 + 13 8.0083236474777291e+00 -2.0662823393531574e-01 1.8836316231156054e+00 + 14 8.2734278269892751e+00 6.4943525019197601e+00 6.1412707790183365e+00 + 15 2.5488062874804260e+01 4.5213602111696538e+00 1.1799160787844972e+01 + 16 1.4552522552077164e+01 4.4186396154772440e+00 1.8852927829496786e+00 + 17 1.4503712415238203e+01 6.7180064720703658e+00 1.4946857421636633e+01 + 18 1.4381417038107156e+01 1.0654921699623603e+01 3.0312536171817612e+00 + 19 2.7124846362912209e+00 6.0976659150598191e+00 3.5882418308553188e+00 + 20 6.8736393061624899e+00 2.1678287592962189e+01 3.0788359545854989e+00 + 21 1.3982139967723153e+00 7.6477981913429236e+00 2.7552681437631419e+00 + 22 6.4165959030028696e-01 1.3545384100560090e+01 4.2776575229086742e+00 + 23 5.4103215168535854e+00 8.7067972627561456e+00 5.0443795559127391e+00 + 24 5.4297900680169500e+00 1.2566185041689424e+01 2.7871913745225161e+00 + 25 8.1468669639101581e+00 6.3628898647501009e+00 1.3433089797918450e+01 + 26 5.8007811688792899e+00 1.1833064445498119e+01 5.3158411580484470e+00 + 27 2.3271906822465620e+01 1.4312483920301059e+01 7.8987915691260380e+00 + 28 1.1264973350418927e+01 1.0981086093328537e+01 5.5113566639098988e-01 + 29 1.8360482750843289e+01 1.8116222197750265e+01 4.8005081911592908e+00 + 30 8.4676882156895292e+00 1.1833605316139382e+01 6.1285464872550097e+00 + 31 1.3576025097019080e+01 8.7326539393785705e+00 4.8222784679966155e+00 + 32 1.3392809588244059e+01 1.2328156756648957e+01 -1.1499105363143864e+00 + 33 1.4430681800164272e+01 1.4322588936507534e+01 7.3429758520213433e+00 + 34 1.3968732976270516e+01 3.0501910387948552e+00 1.1437925490838637e+01 + 35 2.8281989792122930e+00 1.3315789510170605e+01 1.0935554719620333e+01 + 36 4.1367993635988647e+00 5.0566533382073100e+00 5.0786081191192647e+00 + 37 1.0703547950036052e+00 1.7823323008988323e+00 1.9433983977291188e+01 + 38 2.1530749965147367e+00 5.0165971258695849e+00 1.3059876360959187e+01 + 39 4.7199391959772772e+00 1.8255922410203618e+00 1.2784187608356872e+01 + 40 1.0921241773228969e+01 1.0721353900841990e+01 1.6787748008063314e+01 + 41 1.3583625074225633e+01 -1.5319855542348462e+00 1.1746214735518668e+01 + 42 6.9450203445377880e+00 4.7593292234126858e+00 1.2755290109879242e+01 + 43 1.1589750720538559e+01 1.3899879825058838e+01 9.7253255001354439e+00 + 44 1.0961866377642739e+01 4.5225371936228944e+00 7.3400915139637259e+00 + 45 2.0002822688042535e+01 4.2338920307134398e+00 1.6239537657955605e+01 + 46 1.5524526110327377e+01 1.6247838396911423e+01 2.0990192968324511e+01 + 47 1.3124985358203457e+01 5.9786786463874553e-01 1.1818361316796681e+01 + 48 1.1749178820490608e+01 4.2614817541886705e+00 9.3944868952059188e+00 + 49 -1.7521891902775272e-01 1.3483185129164747e+01 1.2965159377047359e+01 + 50 1.3975886783039433e+01 1.1073558987514561e+01 9.1725533408802917e+00 + 51 1.0503391666236078e+01 1.2909681836133306e+01 2.4643380530938064e+01 + 52 7.4419925959909525e+00 2.1356768584097249e+01 1.2684440920085301e+01 + 53 -3.8607751569896770e-01 1.2157466643553416e+01 5.2631421085673731e+00 + 54 1.6360229488516205e+00 2.5806457903826317e+01 2.2923310115486363e+01 + 55 1.1390246660004443e+01 1.9609056547183688e+01 2.4725022474251180e+01 + 56 4.2381277162112960e+00 1.0395724192373043e+01 9.4451035915336430e+00 + 57 8.1922336154166828e+00 7.1086374091057305e+00 6.6012159565487876e+00 + 58 7.4214009399531689e+00 1.0605482334487448e+01 9.2605301160066631e+00 + 59 9.8444870318141771e+00 7.4248088210650991e+00 9.9426313645506497e+00 + 60 1.0702242256884325e+01 9.6979983507969294e+00 6.9618710188678543e+00 + 61 8.6978094734358660e+00 9.9105242643572851e+00 8.7648652912736189e+00 + 62 1.7748710075687107e+01 2.5580457003967556e+01 2.5482820645277481e+01 + 63 2.4039901318373158e+01 1.8846634202899530e+01 2.5778051415591129e+01 + 64 1.2463092247507770e+01 1.2184597182851650e+01 8.7354287381704836e+00 ... From 9cf790a2fed1ca3e55da0c31fb6f202b847ff3ff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 14:09:49 -0400 Subject: [PATCH 201/352] simplify and use fmtlib --- src/CG-DNA/bond_oxdna_fene.cpp | 60 +++++++++++++--------------------- src/CG-DNA/bond_oxdna_fene.h | 3 +- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/CG-DNA/bond_oxdna_fene.cpp b/src/CG-DNA/bond_oxdna_fene.cpp index 483e54e809..0075ec6bb0 100644 --- a/src/CG-DNA/bond_oxdna_fene.cpp +++ b/src/CG-DNA/bond_oxdna_fene.cpp @@ -17,25 +17,30 @@ #include "bond_oxdna_fene.h" -#include #include "atom.h" -#include "neighbor.h" -#include "comm.h" -#include "update.h" -#include "force.h" -#include "memory.h" -#include "error.h" - #include "atom_vec_ellipsoid.h" +#include "comm.h" +#include "error.h" +#include "force.h" #include "math_extra.h" +#include "memory.h" +#include "neighbor.h" +#include "update.h" + +#include using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- */ - -BondOxdnaFene::BondOxdnaFene(LAMMPS *lmp) : Bond(lmp) +/* ---------------------------------------------------------------------- + compute vector COM-sugar-phosphate backbone interaction site in oxDNA +------------------------------------------------------------------------- */ +static void compute_interaction_sites(const double e1[3], double r[3]) { + constexpr double d_cs=-0.4; + r[0] = d_cs*e1[0]; + r[1] = d_cs*e1[1]; + r[2] = d_cs*e1[2]; } /* ---------------------------------------------------------------------- */ @@ -43,30 +48,14 @@ BondOxdnaFene::BondOxdnaFene(LAMMPS *lmp) : Bond(lmp) BondOxdnaFene::~BondOxdnaFene() { if (allocated) { - memory->destroy(setflag); memory->destroy(k); memory->destroy(Delta); memory->destroy(r0); - } } -/* ---------------------------------------------------------------------- - compute vector COM-sugar-phosphate backbone interaction site in oxDNA -------------------------------------------------------------------------- */ -void BondOxdnaFene::compute_interaction_sites(double e1[3], double /*e2*/[3], - double /*e3*/[3], double r[3]) -{ - double d_cs=-0.4; - - r[0] = d_cs*e1[0]; - r[1] = d_cs*e1[1]; - r[2] = d_cs*e1[2]; - -} - /* ---------------------------------------------------------------------- tally energy and virial into global and per-atom accumulators ------------------------------------------------------------------------- */ @@ -198,8 +187,8 @@ void BondOxdnaFene::compute(int eflag, int vflag) MathExtra::q_to_exyz(qb,bx,by,bz); // vector COM-backbone site a and b - compute_interaction_sites(ax,ay,az,ra_cs); - compute_interaction_sites(bx,by,bz,rb_cs); + compute_interaction_sites(ax,ra_cs); + compute_interaction_sites(bx,rb_cs); // vector backbone site b to a delr[0] = x[a][0] + ra_cs[0] - x[b][0] - rb_cs[0]; @@ -218,11 +207,8 @@ void BondOxdnaFene::compute(int eflag, int vflag) // if r > 2*Delta something serious is wrong, abort if (rlogarg < 0.1) { - char str[128]; - sprintf(str,"FENE bond too long: " BIGINT_FORMAT " " - TAGINT_FORMAT " " TAGINT_FORMAT " %g", - update->ntimestep,atom->tag[a],atom->tag[b],r); - error->warning(FLERR,str); + error->warning(FLERR,"FENE bond too long: {} {} {} {}", + update->ntimestep,atom->tag[a],atom->tag[b],r); rlogarg = 0.1; } @@ -398,10 +384,8 @@ double BondOxdnaFene::single(int type, double rsq, int /*i*/, int /*j*/, // if r > 2*Delta something serious is wrong, abort if (rlogarg < 0.1) { - char str[128]; - sprintf(str,"FENE bond too long: " BIGINT_FORMAT " %g", - update->ntimestep,sqrt(rsq)); - error->warning(FLERR,str); + error->warning(FLERR,"FENE bond too long: {} {:.8}", + update->ntimestep,sqrt(rsq)); rlogarg = 0.1; } diff --git a/src/CG-DNA/bond_oxdna_fene.h b/src/CG-DNA/bond_oxdna_fene.h index d0151da4af..6e2272d597 100644 --- a/src/CG-DNA/bond_oxdna_fene.h +++ b/src/CG-DNA/bond_oxdna_fene.h @@ -26,9 +26,8 @@ namespace LAMMPS_NS { class BondOxdnaFene : public Bond { public: - BondOxdnaFene(class LAMMPS *); + BondOxdnaFene(class LAMMPS *lmp) : Bond(lmp) {} virtual ~BondOxdnaFene(); - virtual void compute_interaction_sites(double *, double *, double *, double *); virtual void compute(int, int); void coeff(int, char **); void init_style(); From b5830b672a998ab45645540f88505c07bbb07129 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 14:18:38 -0400 Subject: [PATCH 202/352] simplify logging code --- src/DIELECTRIC/fix_polarize_bem_gmres.cpp | 15 +++------- src/DRUDE/fix_drude.cpp | 35 +++++++++-------------- 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/DIELECTRIC/fix_polarize_bem_gmres.cpp b/src/DIELECTRIC/fix_polarize_bem_gmres.cpp index 5c52299b2a..667f0efc26 100644 --- a/src/DIELECTRIC/fix_polarize_bem_gmres.cpp +++ b/src/DIELECTRIC/fix_polarize_bem_gmres.cpp @@ -523,13 +523,9 @@ void FixPolarizeBEMGMRES::gmres_solve(double *x, double *r) rho = fabs(g[k]); #ifdef _POLARIZE_DEBUG - if (comm->me == 0) { - char message[256]; - sprintf(message, "itr = %d: k = %d, norm(r) = %g norm(b) = %g", itr, k, rho, normb); - error->warning(FLERR, message); - } + if (comm->me == 0) + error->warning(FLERR,"itr = {}: k = {}, norm(r) = {} norm(b) = {}", itr, k, rho, normb); #endif - if (rho <= rho_tol && rho <= tol_abs) break; } @@ -560,11 +556,8 @@ void FixPolarizeBEMGMRES::gmres_solve(double *x, double *r) rho = sqrt(vec_dot(r, r, n)); #ifdef _POLARIZE_DEBUG - if (comm->me == 0) { - char message[256]; - sprintf(message, "itr = %d: norm(r) = %g norm(b) = %g", itr, rho, normb); - error->warning(FLERR, message); - } + if (comm->me == 0) + error->warning(FLERR, "itr = {}: norm(r) = {} norm(b) = {}", itr, rho, normb); #endif // Barros et al. suggested the condition: norm(r) < EPSILON norm(b) diff --git a/src/DRUDE/fix_drude.cpp b/src/DRUDE/fix_drude.cpp index 1856b5455c..e0b313c35e 100644 --- a/src/DRUDE/fix_drude.cpp +++ b/src/DRUDE/fix_drude.cpp @@ -14,16 +14,16 @@ #include "fix_drude.h" -#include -#include #include "atom.h" +#include "atom_vec.h" #include "comm.h" -#include "modify.h" #include "error.h" #include "memory.h" +#include "modify.h" #include "molecule.h" -#include "atom_vec.h" +#include +#include #include #include @@ -311,20 +311,17 @@ void FixDrude::rebuild_special() { //build_drudeid(); // Log info - if (comm->me == 0) { - if (screen) fprintf(screen, "Rebuild special list taking Drude particles into account\n"); - if (logfile) fprintf(logfile, "Rebuild special list taking Drude particles into account\n"); - } + if (comm->me == 0) + utils::logmesg(lmp, "Rebuild special list taking Drude particles into account\n"); + int nspecmax, nspecmax_old, nspecmax_loc; nspecmax_loc = 0; for (int i=0; ime == 0) { - if (screen) fprintf(screen, "Old max number of 1-2 to 1-4 neighbors: %d\n", nspecmax_old); - if (logfile) fprintf(logfile, "Old max number of 1-2 to 1-4 neighbors: %d\n", nspecmax_old); - } + if (comm->me == 0) + utils::logmesg(lmp, "Old max number of 1-2 to 1-4 neighbors: {}\n", nspecmax_old); // Build lists of drude and core-drude pairs std::vector drude_vec, core_drude_vec, core_special_vec; @@ -351,15 +348,11 @@ void FixDrude::rebuild_special() { if (nspecmax_loc < nspecial[i][2]) nspecmax_loc = nspecial[i][2]; } MPI_Allreduce(&nspecmax_loc, &nspecmax, 1, MPI_INT, MPI_MAX, world); - if (comm->me == 0) { - if (screen) fprintf(screen, "New max number of 1-2 to 1-4 neighbors: %d (+%d)\n", nspecmax, nspecmax - nspecmax_old); - if (logfile) fprintf(logfile, "New max number of 1-2 to 1-4 neighbors: %d (+%d)\n", nspecmax, nspecmax - nspecmax_old); - } - if (atom->maxspecial < nspecmax) { - char str[1024]; - sprintf(str, "Not enough space in special: extra/special/per/atom should be at least %d", nspecmax - nspecmax_old); - error->all(FLERR, str); - } + if (comm->me == 0) + utils::logmesg(lmp, "New max number of 1-2 to 1-4 neighbors: {} (+{})\n", nspecmax, nspecmax - nspecmax_old); + + if (atom->maxspecial < nspecmax) + error->all(FLERR, "Not enough space in special: extra/special/per/atom should be at least {}", nspecmax - nspecmax_old); // Build list of cores' special lists to communicate to ghost drude particles for (int i=0; i Date: Thu, 29 Jul 2021 14:33:41 -0400 Subject: [PATCH 203/352] simplify and use utils functions --- src/EXTRA-COMPUTE/compute_cnp_atom.cpp | 14 +++------ src/EXTRA-FIX/fix_ave_correlate_long.cpp | 8 ++--- src/EXTRA-FIX/fix_electron_stopping.cpp | 7 ++--- src/EXTRA-FIX/fix_gle.cpp | 40 +++++++++--------------- src/EXTRA-FIX/fix_tmd.cpp | 8 ++--- src/EXTRA-FIX/fix_ttm_mod.cpp | 34 +++++++++----------- 6 files changed, 42 insertions(+), 69 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_cnp_atom.cpp b/src/EXTRA-COMPUTE/compute_cnp_atom.cpp index 350567004e..a056b4c991 100644 --- a/src/EXTRA-COMPUTE/compute_cnp_atom.cpp +++ b/src/EXTRA-COMPUTE/compute_cnp_atom.cpp @@ -204,11 +204,8 @@ void ComputeCNPAtom::compute_peratom() int nerrorall; MPI_Allreduce(&nerror,&nerrorall,1,MPI_INT,MPI_SUM,world); - if (nerrorall && comm->me == 0) { - char str[128]; - sprintf(str,"Too many neighbors in CNP for %d atoms",nerrorall); - error->warning(FLERR,str); - } + if (nerrorall && comm->me == 0) + error->warning(FLERR,"Too many neighbors in CNP for {} atoms",nerrorall); // compute CNP value for each atom in group // only performed if # of nearest neighbors = 12 or 14 (fcc,hcp) @@ -311,11 +308,8 @@ void ComputeCNPAtom::compute_peratom() // warning message MPI_Allreduce(&nerror,&nerrorall,1,MPI_INT,MPI_SUM,world); - if (nerrorall && comm->me == 0) { - char str[128]; - sprintf(str,"Too many common neighbors in CNP %d times",nerrorall); - error->warning(FLERR,str); - } + if (nerrorall && comm->me == 0) + error->warning(FLERR,"Too many common neighbors in CNP {} times",nerrorall); } /* ---------------------------------------------------------------------- diff --git a/src/EXTRA-FIX/fix_ave_correlate_long.cpp b/src/EXTRA-FIX/fix_ave_correlate_long.cpp index b45823d509..32a304d08f 100644 --- a/src/EXTRA-FIX/fix_ave_correlate_long.cpp +++ b/src/EXTRA-FIX/fix_ave_correlate_long.cpp @@ -145,11 +145,9 @@ FixAveCorrelateLong::FixAveCorrelateLong(LAMMPS * lmp, int narg, char **arg): error->all(FLERR,"Illegal fix ave/correlate/long command"); if (me == 0) { fp = fopen(arg[iarg+1],"w"); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open fix ave/correlate/long file %s",arg[iarg+1]); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open fix ave/correlate/long file {}: {}", + arg[iarg+1],utils::getsyserror()); } iarg += 2; } else if (strcmp(arg[iarg],"overwrite") == 0) { diff --git a/src/EXTRA-FIX/fix_electron_stopping.cpp b/src/EXTRA-FIX/fix_electron_stopping.cpp index e6aedb014b..bd54fea97d 100644 --- a/src/EXTRA-FIX/fix_electron_stopping.cpp +++ b/src/EXTRA-FIX/fix_electron_stopping.cpp @@ -243,11 +243,8 @@ void FixElectronStopping::read_table(const char *file) char line[MAXLINE]; FILE *fp = utils::open_potential(file,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str, 128, "Cannot open stopping range table %s", file); - error->one(FLERR, str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open stopping range table {}: {}", file, utils::getsyserror()); const int ncol = atom->ntypes + 1; diff --git a/src/EXTRA-FIX/fix_gle.cpp b/src/EXTRA-FIX/fix_gle.cpp index 782ea89792..563295d8c1 100644 --- a/src/EXTRA-FIX/fix_gle.cpp +++ b/src/EXTRA-FIX/fix_gle.cpp @@ -19,18 +19,18 @@ #include "fix_gle.h" +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "random_mars.h" +#include "respa.h" +#include "update.h" + #include #include -#include "atom.h" -#include "force.h" -#include "update.h" -#include "respa.h" -#include "comm.h" -#include "random_mars.h" -#include "memory.h" -#include "error.h" - using namespace LAMMPS_NS; using namespace FixConst; @@ -225,13 +225,9 @@ FixGLE::FixGLE(LAMMPS *lmp, int narg, char **arg) : char *fname = arg[7]; if (comm->me == 0) { fgle = utils::open_potential(fname,lmp,nullptr); - if (fgle == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open A-matrix file %s",fname); - error->one(FLERR,str); - } - if (screen) fprintf(screen,"Reading A-matrix from %s\n", fname); - if (logfile) fprintf(logfile,"Reading A-matrix from %s\n", fname); + if (fgle == nullptr) + error->one(FLERR,"Cannot open A-matrix file {}: {}",fname, utils::getsyserror()); + utils::logmesg(lmp,"Reading A-matrix from {}\n", fname); } // read each line of the file, skipping blank lines or leading '#' @@ -295,15 +291,9 @@ FixGLE::FixGLE(LAMMPS *lmp, int narg, char **arg) : } else { if (comm->me == 0) { fgle = utils::open_potential(fname,lmp,nullptr); - if (fgle == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open C-matrix file %s",fname); - error->one(FLERR,str); - } - if (screen) - fprintf(screen,"Reading C-matrix from %s\n", fname); - if (logfile) - fprintf(logfile,"Reading C-matrix from %s\n", fname); + if (fgle == nullptr) + error->one(FLERR,"Cannot open C-matrix file {}: {}",fname, utils::getsyserror()); + utils::logmesg(lmp,"Reading C-matrix from {}\n", fname); } // read each line of the file, skipping blank lines or leading '#' diff --git a/src/EXTRA-FIX/fix_tmd.cpp b/src/EXTRA-FIX/fix_tmd.cpp index c8dd39910b..335c1a5e6b 100644 --- a/src/EXTRA-FIX/fix_tmd.cpp +++ b/src/EXTRA-FIX/fix_tmd.cpp @@ -75,8 +75,7 @@ nfileevery(0), fp(nullptr), xf(nullptr), xold(nullptr) if (me == 0) { fp = fopen(arg[6],"w"); if (fp == nullptr) - error->one(FLERR,"Cannot open fix tmd file {}: {}", - arg[6], utils::getsyserror()); + error->one(FLERR,"Cannot open fix tmd file {}: {}", arg[6], utils::getsyserror()); fprintf(fp,"%s %s\n","# Step rho_target rho_old gamma_back", "gamma_forward lambda work_lambda work_analytical"); } @@ -381,7 +380,7 @@ int FixTMD::unpack_exchange(int nlocal, double *buf) void FixTMD::readfile(char *file) { if (me == 0) { - if (screen) fprintf(screen,"Reading TMD target file %s ...\n",file); + utils::logmesg(lmp,"Reading TMD target file {} ...\n",file); open(file); } @@ -541,8 +540,7 @@ void FixTMD::open(char *file) } if (fp == nullptr) - error->one(FLERR,"Cannot open file {}: {}", - file, utils::getsyserror()); + error->one(FLERR,"Cannot open file {}: {}",file, utils::getsyserror()); } /* ---------------------------------------------------------------------- */ diff --git a/src/EXTRA-FIX/fix_ttm_mod.cpp b/src/EXTRA-FIX/fix_ttm_mod.cpp index 211b2eadb2..7d89d89e6f 100644 --- a/src/EXTRA-FIX/fix_ttm_mod.cpp +++ b/src/EXTRA-FIX/fix_ttm_mod.cpp @@ -20,22 +20,21 @@ #include "fix_ttm_mod.h" +#include "atom.h" +#include "citeme.h" +#include "comm.h" +#include "domain.h" +#include "error.h" +#include "force.h" +#include "math_const.h" +#include "memory.h" +#include "random_mars.h" +#include "respa.h" +#include "tokenizer.h" +#include "update.h" + #include #include -#include "atom.h" -#include "force.h" -#include "update.h" -#include "domain.h" -#include "respa.h" -#include "comm.h" -#include "random_mars.h" -#include "memory.h" -#include "error.h" -#include "citeme.h" -#include "math_const.h" - - -#include "tokenizer.h" using namespace LAMMPS_NS; using namespace FixConst; @@ -104,11 +103,8 @@ FixTTMMod::FixTTMMod(LAMMPS *lmp, int narg, char **arg) : if (narg != 11) error->all(FLERR,"Illegal fix ttm/mod command"); if (comm->me == 0) { fp = fopen(arg[10],"w"); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open fix ttm/mod file %s",arg[10]); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open fix ttm/mod file {}: {}",arg[10],utils::getsyserror()); } } From ebe5e6c02492e8ea3eae4607e6c6096b5a3da462 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 14:44:15 -0400 Subject: [PATCH 204/352] reformat --- src/INTERLAYER/pair_coul_shield.cpp | 223 ++++++++++++++-------------- 1 file changed, 115 insertions(+), 108 deletions(-) diff --git a/src/INTERLAYER/pair_coul_shield.cpp b/src/INTERLAYER/pair_coul_shield.cpp index 2cda85ead6..dbb12abf2e 100644 --- a/src/INTERLAYER/pair_coul_shield.cpp +++ b/src/INTERLAYER/pair_coul_shield.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -20,22 +19,24 @@ ------------------------------------------------------------------------- */ #include "pair_coul_shield.h" -#include + #include "atom.h" #include "comm.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" -#include "math_special.h" #include "error.h" +#include "force.h" +#include "math_special.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" +#include using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairCoulShield::PairCoulShield(LAMMPS *lmp) : Pair(lmp) { +PairCoulShield::PairCoulShield(LAMMPS *lmp) : Pair(lmp) +{ tap_flag = 1; } @@ -57,13 +58,13 @@ PairCoulShield::~PairCoulShield() void PairCoulShield::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul,fpair,Tap,dTap; - double rsq,r,r3,rarg,th,depsdr,epsr,forcecoul,factor_coul,Vc,fvc; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype; + double qtmp, xtmp, ytmp, ztmp, delx, dely, delz, ecoul, fpair, Tap, dTap; + double rsq, r, r3, rarg, th, depsdr, epsr, forcecoul, factor_coul, Vc, fvc; + int *ilist, *jlist, *numneigh, **firstneigh; ecoul = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -100,47 +101,51 @@ void PairCoulShield::compute(int eflag, int vflag) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; jtype = type[j]; // only include the interaction between different layers if (rsq < cutsq[itype][jtype] && atom->molecule[i] != atom->molecule[j]) { r = sqrt(rsq); - r3 = rsq*r; - rarg = 1.0/sigmae[itype][jtype]; + r3 = rsq * r; + rarg = 1.0 / sigmae[itype][jtype]; th = r3 + MathSpecial::cube(rarg); - epsr = 1.0/pow(th,0.333333333333333333333333); + epsr = 1.0 / pow(th, 1.0 / 3.0); depsdr = MathSpecial::square(epsr); depsdr *= depsdr; - Vc = qqrd2e*qtmp*q[j]*epsr; + Vc = qqrd2e * qtmp * q[j] * epsr; // turn on/off taper function if (tap_flag) { - Tap = calc_Tap(r,cut[itype][jtype]); - dTap = calc_dTap(r,cut[itype][jtype]); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, cut[itype][jtype]); + dTap = calc_dTap(r, cut[itype][jtype]); + } else { + Tap = 1.0; + dTap = 0.0; + } - forcecoul = qqrd2e*qtmp*q[j]*r*depsdr; - fvc = forcecoul*Tap - Vc*dTap/r; - fpair = factor_coul*fvc; + forcecoul = qqrd2e * qtmp * q[j] * r * depsdr; + fvc = forcecoul * Tap - Vc * dTap / r; + fpair = factor_coul * fvc; - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; + f[i][0] += delx * fpair; + f[i][1] += dely * fpair; + f[i][2] += delz * fpair; if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; + f[j][0] -= delx * fpair; + f[j][1] -= dely * fpair; + f[j][2] -= delz * fpair; } if (eflag) { - if (tap_flag) ecoul = Vc*Tap; - else ecoul = Vc - offset[itype][jtype]; + if (tap_flag) + ecoul = Vc * Tap; + else + ecoul = Vc - offset[itype][jtype]; ecoul *= factor_coul; } - if (evflag) ev_tally(i,j,nlocal,newton_pair,0.0, - ecoul,fpair,delx,dely,delz); + if (evflag) ev_tally(i, j, nlocal, newton_pair, 0.0, ecoul, fpair, delx, dely, delz); } } } @@ -157,15 +162,14 @@ void PairCoulShield::allocate() allocated = 1; int n = atom->ntypes; - memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(setflag, n + 1, n + 1, "pair:setflag"); for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; + for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(sigmae,n+1,n+1,"pair:sigmae"); - memory->create(offset,n+1,n+1,"pair:offset"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); + memory->create(cut, n + 1, n + 1, "pair:cut"); + memory->create(sigmae, n + 1, n + 1, "pair:sigmae"); + memory->create(offset, n + 1, n + 1, "pair:offset"); } /* ---------------------------------------------------------------------- @@ -174,17 +178,17 @@ void PairCoulShield::allocate() void PairCoulShield::settings(int narg, char **arg) { - if (narg < 1 || narg > 2) error->all(FLERR,"Illegal pair_style command"); + if (narg < 1 || narg > 2) error->all(FLERR, "Illegal pair_style command"); - cut_global = utils::numeric(FLERR,arg[0],false,lmp); - if (narg == 2) tap_flag = utils::numeric(FLERR,arg[1],false,lmp); + cut_global = utils::numeric(FLERR, arg[0], false, lmp); + if (narg == 2) tap_flag = utils::numeric(FLERR, arg[1], false, lmp); // reset cutoffs that have been explicitly set if (allocated) { - int i,j; + int i, j; for (i = 1; i <= atom->ntypes; i++) - for (j = i+1; j <= atom->ntypes; j++) + for (j = i + 1; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; } } @@ -195,21 +199,21 @@ void PairCoulShield::settings(int narg, char **arg) void PairCoulShield::coeff(int narg, char **arg) { - if (narg < 3 || narg > 4) error->all(FLERR,"Incorrect args for pair coefficients"); + if (narg < 3 || narg > 4) error->all(FLERR, "Incorrect args for pair coefficients"); 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 sigmae_one = utils::numeric(FLERR,arg[2],false,lmp); + double sigmae_one = utils::numeric(FLERR, arg[2], false, lmp); double cut_one = cut_global; - if (narg == 4) cut_one = utils::numeric(FLERR,arg[3],false,lmp); + if (narg == 4) cut_one = utils::numeric(FLERR, arg[3], false, lmp); int count = 0; for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { sigmae[i][j] = sigmae_one; cut[i][j] = cut_one; setflag[i][j] = 1; @@ -217,22 +221,20 @@ void PairCoulShield::coeff(int narg, char **arg) } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } - /* ---------------------------------------------------------------------- init specific to this pair style ------------------------------------------------------------------------- */ void PairCoulShield::init_style() { - if (!atom->q_flag) - error->all(FLERR,"Pair style coul/shield requires atom attribute q"); + if (!atom->q_flag) error->all(FLERR, "Pair style coul/shield requires atom attribute q"); if (!atom->molecule_flag) - error->all(FLERR,"Pair style coul/shield requires atom attribute molecule"); + error->all(FLERR, "Pair style coul/shield requires atom attribute molecule"); - neighbor->request(this,instance_me); + neighbor->request(this, instance_me); } /* ---------------------------------------------------------------------- @@ -242,22 +244,23 @@ void PairCoulShield::init_style() double PairCoulShield::init_one(int i, int j) { if (setflag[i][j] == 0) { - error->all(FLERR,"for pair style coul/shield, parameters need to be set explicitly for all pairs."); + error->all(FLERR, + "for pair style coul/shield, parameters need to be set explicitly for all pairs."); } double *q = atom->q; double qqrd2e = force->qqrd2e; - double r,r3,rarg,th,epsr; + double r, r3, rarg, th, epsr; if (offset_flag) { - r = cut[i][j]; - r3 = r*r*r; - rarg = 1.0/sigmae[i][j]; - th = r3 + MathSpecial::cube(rarg); - epsr = 1.0/pow(th,0.333333333333333333); - offset[i][j] = qqrd2e*q[i]*q[j]*epsr; - } else offset[i][j] = 0.0; - + r = cut[i][j]; + r3 = r * r * r; + rarg = 1.0 / sigmae[i][j]; + th = r3 + MathSpecial::cube(rarg); + epsr = 1.0 / pow(th, 1.0/3.0); + offset[i][j] = qqrd2e * q[i] * q[j] * epsr; + } else + offset[i][j] = 0.0; sigmae[j][i] = sigmae[i][j]; offset[j][i] = offset[i][j]; @@ -274,13 +277,13 @@ void PairCoulShield::write_restart(FILE *fp) { write_restart_settings(fp); - int i,j; + int i, j; for (i = 1; i <= atom->ntypes; i++) for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); + fwrite(&setflag[i][j], sizeof(int), 1, fp); if (setflag[i][j]) { - fwrite(&sigmae[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); + fwrite(&sigmae[i][j], sizeof(double), 1, fp); + fwrite(&cut[i][j], sizeof(double), 1, fp); } } } @@ -294,19 +297,19 @@ void PairCoulShield::read_restart(FILE *fp) read_restart_settings(fp); allocate(); - int i,j; + int i, j; int me = comm->me; for (i = 1; i <= atom->ntypes; i++) for (j = i; j <= atom->ntypes; j++) { - if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world); if (setflag[i][j]) { if (me == 0) { - utils::sfread(FLERR,&sigmae[i][j],sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&cut[i][j],sizeof(double),1,fp,nullptr,error); + utils::sfread(FLERR, &sigmae[i][j], sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error); } - MPI_Bcast(&sigmae[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&sigmae[i][j], 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world); } } } @@ -317,9 +320,9 @@ void PairCoulShield::read_restart(FILE *fp) void PairCoulShield::write_restart_settings(FILE *fp) { - fwrite(&cut_global,sizeof(double),1,fp); - fwrite(&offset_flag,sizeof(int),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&cut_global, sizeof(double), 1, fp); + fwrite(&offset_flag, sizeof(int), 1, fp); + fwrite(&mix_flag, sizeof(int), 1, fp); } /* ---------------------------------------------------------------------- @@ -329,23 +332,22 @@ void PairCoulShield::write_restart_settings(FILE *fp) void PairCoulShield::read_restart_settings(FILE *fp) { if (comm->me == 0) { - utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error); - utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR, &cut_global, sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &offset_flag, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &mix_flag, sizeof(int), 1, fp, nullptr, error); } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&offset_flag,1,MPI_INT,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&cut_global, 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&offset_flag, 1, MPI_INT, 0, world); + MPI_Bcast(&mix_flag, 1, MPI_INT, 0, world); } /* ---------------------------------------------------------------------- */ -double PairCoulShield::single(int i, int j, int itype, int jtype, - double rsq, double factor_coul, double /*factor_lj*/, - double &fforce) +double PairCoulShield::single(int i, int j, int itype, int jtype, double rsq, double factor_coul, + double /*factor_lj*/, double &fforce) { - double r, rarg,Vc,fvc,forcecoul,phishieldec; - double r3,th,epsr,depsdr,Tap,dTap; + double r, rarg, Vc, fvc, forcecoul, phishieldec; + double r3, th, epsr, depsdr, Tap, dTap; double *q = atom->q; double qqrd2e = force->qqrd2e; @@ -357,25 +359,30 @@ double PairCoulShield::single(int i, int j, int itype, int jtype, } r = sqrt(rsq); - r3 = rsq*r; - rarg = 1.0/sigmae[itype][jtype]; + r3 = rsq * r; + rarg = 1.0 / sigmae[itype][jtype]; th = r3 + MathSpecial::cube(rarg); - epsr = 1.0/pow(th,0.333333333333333333); - depsdr = epsr*epsr; + epsr = 1.0 / pow(th, 1.0/3.0); + depsdr = epsr * epsr; depsdr *= depsdr; - Vc = qqrd2e*q[i]*q[j]*epsr; + Vc = qqrd2e * q[i] * q[j] * epsr; // turn on/off taper function if (tap_flag) { - Tap = calc_Tap(r,cut[itype][jtype]); - dTap = calc_dTap(r,cut[itype][jtype]); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, cut[itype][jtype]); + dTap = calc_dTap(r, cut[itype][jtype]); + } else { + Tap = 1.0; + dTap = 0.0; + } - forcecoul = qqrd2e*q[i]*q[j]*r*depsdr; - fvc = forcecoul*Tap - Vc*dTap/r; - fforce = factor_coul*fvc; + forcecoul = qqrd2e * q[i] * q[j] * r * depsdr; + fvc = forcecoul * Tap - Vc * dTap / r; + fforce = factor_coul * fvc; - if (tap_flag) phishieldec = Vc*Tap; - else phishieldec = Vc - offset[itype][jtype]; - return factor_coul*phishieldec; + if (tap_flag) + phishieldec = Vc * Tap; + else + phishieldec = Vc - offset[itype][jtype]; + return factor_coul * phishieldec; } From 520109bda0a073c387c03ebc179bda49744883a0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 14:44:45 -0400 Subject: [PATCH 205/352] simplify --- src/INTERLAYER/pair_drip.cpp | 7 ++--- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 7 ++--- .../pair_kolmogorov_crespi_full.cpp | 7 ++--- src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 7 ++--- src/INTERLAYER/pair_lebedeva_z.cpp | 4 +-- src/MANYBODY/pair_edip.cpp | 7 ++--- src/MANYBODY/pair_edip_multi.cpp | 7 ++--- src/MANYBODY/pair_extep.cpp | 7 ++--- src/MANYBODY/pair_lcbop.cpp | 7 ++--- src/MANYBODY/pair_local_density.cpp | 28 ++++++++----------- src/MANYBODY/pair_meam_spline.cpp | 7 ++--- src/MANYBODY/pair_meam_sw_spline.cpp | 7 ++--- 12 files changed, 34 insertions(+), 68 deletions(-) diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index a59d74bab9..71281623ac 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -161,11 +161,8 @@ void PairDRIP::read_file(char *filename) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open DRIP potential file %s",filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open DRIP potential file {}: {}",filename,utils::getsyserror()); } // read each line out of file, skipping blank lines or leading '#' diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 8317567f69..3a35c281c1 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -202,11 +202,8 @@ void PairILPGrapheneHBN::read_file(char *filename) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open ILP potential file %s",filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open ILP potential file {}: {}",filename,utils::getsyserror()); } // read each line out of file, skipping blank lines or leading '#' diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index c5a2781762..bd5050401e 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -203,11 +203,8 @@ void PairKolmogorovCrespiFull::read_file(char *filename) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open KC potential file %s",filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open KC potential file {}: {}",filename,utils::getsyserror()); } // read each line out of file, skipping blank lines or leading '#' diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp index d5a60bd2c9..481e9f6604 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp @@ -280,11 +280,8 @@ void PairKolmogorovCrespiZ::read_file(char *filename) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open KC potential file %s",filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open KC potential file {}: {}",filename, utils::getsyserror()); } // read each line out of file, skipping blank lines or leading '#' diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp index 57e9535a1c..13a7797534 100644 --- a/src/INTERLAYER/pair_lebedeva_z.cpp +++ b/src/INTERLAYER/pair_lebedeva_z.cpp @@ -187,8 +187,8 @@ void PairLebedevaZ::allocate() void PairLebedevaZ::settings(int narg, char **arg) { if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(force->pair_style,"hybrid/overlay")!=0) - error->all(FLERR,"ERROR: requires hybrid/overlay pair_style"); + if (!utils::strmatch(force->pair_style,"^hybrid/overlay")) + error->all(FLERR,"Pair style lebedeva/z requires using hybrid/overlay"); cut_global = utils::numeric(FLERR,arg[0],false,lmp); diff --git a/src/MANYBODY/pair_edip.cpp b/src/MANYBODY/pair_edip.cpp index 1624d7c908..5efc5b7980 100644 --- a/src/MANYBODY/pair_edip.cpp +++ b/src/MANYBODY/pair_edip.cpp @@ -777,11 +777,8 @@ void PairEDIP::read_file(char *file) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(file, lmp, nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str, 128, "Cannot open EDIP potential file %s", file); - error->one(FLERR, str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open EDIP potential file {}: {}", file,utils::getsyserror()); } // read each set of params from potential file diff --git a/src/MANYBODY/pair_edip_multi.cpp b/src/MANYBODY/pair_edip_multi.cpp index 73cc1ef1f9..47cc5a90fa 100644 --- a/src/MANYBODY/pair_edip_multi.cpp +++ b/src/MANYBODY/pair_edip_multi.cpp @@ -590,11 +590,8 @@ void PairEDIPMulti::read_file(char *file) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(file,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open EDIP potential file %s",file); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open EDIP potential file {}: {}",file,utils::getsyserror()); } // read each set of params from potential file diff --git a/src/MANYBODY/pair_extep.cpp b/src/MANYBODY/pair_extep.cpp index efb5b0e7fb..bc96a40c57 100644 --- a/src/MANYBODY/pair_extep.cpp +++ b/src/MANYBODY/pair_extep.cpp @@ -529,11 +529,8 @@ void PairExTeP::read_file(char *file) FILE *fp; if (comm->me == 0) { fp = utils::open_potential(file,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open ExTeP potential file %s",file); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open ExTeP potential file {}: {}",file,utils::getsyserror()); } // read each line out of file, skipping blank lines or leading '#' diff --git a/src/MANYBODY/pair_lcbop.cpp b/src/MANYBODY/pair_lcbop.cpp index f1223e1eba..3c6f08a7e7 100644 --- a/src/MANYBODY/pair_lcbop.cpp +++ b/src/MANYBODY/pair_lcbop.cpp @@ -930,11 +930,8 @@ void PairLCBOP::read_file(char *filename) if (comm->me == 0) { FILE *fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - snprintf(str,128,"Cannot open LCBOP potential file %s",filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open LCBOP potential file {}: {}",filename,utils::getsyserror()); // skip initial comment lines diff --git a/src/MANYBODY/pair_local_density.cpp b/src/MANYBODY/pair_local_density.cpp index f5944ac826..5fefd33dea 100644 --- a/src/MANYBODY/pair_local_density.cpp +++ b/src/MANYBODY/pair_local_density.cpp @@ -663,29 +663,25 @@ void PairLocalDensity::parse_file(char *filename) { char line[MAXLINE]; double ratio, lc2, uc2, denom; - if (me == 0) { fptr = fopen(filename, "r"); - if (fptr == nullptr) { - char str[128]; - sprintf(str,"Cannot open Local Density potential file %s",filename); - error->one(FLERR,str); - } + if (fptr == nullptr) + error->one(FLERR,"Cannot open Local Density potential file {}: {}",filename,utils::getsyserror()); } - double *ftmp; // tmp var to extract the complete 2D frho array from file + double *ftmp; // tmp var to extract the complete 2D frho array from file - // broadcast number of LD potentials and number of (rho,frho) pairs - if (me == 0) { + // broadcast number of LD potentials and number of (rho,frho) pairs + if (me == 0) { - // first 2 comment lines ignored - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + // first 2 comment lines ignored + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); - // extract number of potentials and number of (frho, rho) points - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); - sscanf(line, "%d %d", &nLD, &nrho); - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + // extract number of potentials and number of (frho, rho) points + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + sscanf(line, "%d %d", &nLD, &nrho); + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); } MPI_Bcast(&nLD,1,MPI_INT,0,world); diff --git a/src/MANYBODY/pair_meam_spline.cpp b/src/MANYBODY/pair_meam_spline.cpp index a63b61c7b2..0425fbcc8e 100644 --- a/src/MANYBODY/pair_meam_spline.cpp +++ b/src/MANYBODY/pair_meam_spline.cpp @@ -445,11 +445,8 @@ void PairMEAMSpline::read_file(const char* filename) if (comm->me == 0) { FILE *fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[1024]; - snprintf(str,128,"Cannot open spline MEAM potential file %s", filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open spline MEAM potential file {}: {}", filename,utils::getsyserror()); // Skip first line of file. It's a comment. char line[MAXLINE]; diff --git a/src/MANYBODY/pair_meam_sw_spline.cpp b/src/MANYBODY/pair_meam_sw_spline.cpp index 74437b70f6..b74b2a01de 100644 --- a/src/MANYBODY/pair_meam_sw_spline.cpp +++ b/src/MANYBODY/pair_meam_sw_spline.cpp @@ -399,11 +399,8 @@ void PairMEAMSWSpline::read_file(const char* filename) { if (comm->me == 0) { FILE *fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[1024]; - snprintf(str,1024,"Cannot open spline MEAM potential file %s", filename); - error->one(FLERR,str); - } + if (fp == nullptr) + error->one(FLERR,"Cannot open spline MEAM potential file {}: {}", filename,utils::getsyserror()); // Skip first line of file. char line[MAXLINE]; From dcff3d70e09e56f908f548a4f6a3046653918694 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 15:18:58 -0400 Subject: [PATCH 206/352] simplify fix instance creation --- .../tracker/reference/contact_history.dat | 8122 +++++++++++++++++ examples/tracker/reference/lifetime_hist.dat | 65 + src/MISC/pair_tracker.cpp | 11 +- 3 files changed, 8189 insertions(+), 9 deletions(-) create mode 100644 examples/tracker/reference/contact_history.dat create mode 100644 examples/tracker/reference/lifetime_hist.dat diff --git a/examples/tracker/reference/contact_history.dat b/examples/tracker/reference/contact_history.dat new file mode 100644 index 0000000000..8ae3885e5c --- /dev/null +++ b/examples/tracker/reference/contact_history.dat @@ -0,0 +1,8122 @@ +16 36 0 0.5 +64 193 0 0.505 +175 194 0 0.505 +63 80 0 0.51 +31 50 0 0.51 +12 188 0 0.515 +18 135 0 0.515 +22 166 0 0.515 +82 70 0 0.515 +61 26 0 0.525 +90 80 0 0.525 +169 197 0 0.53 +90 87 0 0.53 +52 96 0 0.53 +94 163 0 0.53 +31 52 0 0.535 +34 82 0 0.535 +173 93 0 0.54 +163 206 0 0.54 +64 80 0 0.545 +173 201 0 0.545 +18 54 0 0.55 +175 196 0 0.55 +60 197 0 0.555 +3 179 0 0.555 +82 118 0 0.555 +169 187 0 0.56 +44 66 0.06 0.56 +20 164 0 0.565 +44 90 0 0.565 +167 203 0 0.565 +28 173 0 0.57 +55 166 0.065 0.57 +81 96 0 0.575 +60 88 0 0.58 +36 56 0 0.58 +54 134 0 0.58 +8 36 0 0.585 +82 55 0 0.585 +3 180 0 0.59 +90 204 0 0.59 +31 36 0 0.59 +46 27 0 0.59 +41 25 0 0.595 +46 52 0 0.595 +44 121 0.05 0.6 +161 94 0 0.61 +161 194 0 0.61 +50 194 0 0.61 +22 169 0 0.615 +46 29 0 0.615 +46 32 0 0.615 +81 87 0.07 0.615 +143 164 0 0.62 +24 52 0 0.62 +56 92 0 0.62 +94 195 0 0.62 +31 34 0 0.625 +38 60 0 0.625 +59 56 0.045 0.63 +23 167 0 0.63 +167 215 0 0.63 +94 164 0 0.63 +25 55 0.045 0.635 +16 192 0 0.64 +27 43 0 0.64 +36 50 0 0.64 +20 22 0.05 0.645 +31 3 0 0.645 +4 129 0.06 0.655 +31 33 0 0.655 +32 49 0 0.655 +49 68 0.05 0.655 +4 29 0 0.66 +23 20 0.12 0.66 +14 32 0 0.66 +50 193 0 0.66 +34 65 0 0.665 +32 48 0 0.67 +167 87 0 0.67 +4 23 0.105 0.675 +74 109 0 0.675 +52 68 0 0.675 +90 76 0 0.68 +40 59 0.17 0.68 +167 195 0 0.68 +129 22 0.04 0.68 +51 44 0.055 0.685 +129 49 0 0.685 +161 81 0 0.69 +77 66 0.065 0.69 +39 220 0 0.695 +24 132 0.17 0.7 +44 56 0 0.7 +4 24 0 0.705 +27 63 0 0.705 +56 72 0 0.705 +59 80 0 0.71 +59 167 0 0.715 +78 85 0.17 0.715 +40 68 0 0.715 +44 75 0 0.715 +70 220 0 0.715 +28 144 0 0.72 +28 172 0 0.72 +58 166 0 0.72 +161 205 0 0.725 +3 47 0 0.725 +20 133 0 0.725 +70 246 0 0.725 +40 88 0 0.73 +70 80 0.045 0.735 +93 75 0 0.735 +19 55 0 0.74 +11 47 0 0.74 +44 220 0 0.74 +44 80 0 0.74 +27 41 0 0.745 +86 91 0 0.745 +57 19 0.18 0.745 +53 89 0.15 0.745 +4 143 0.05 0.75 +55 197 0 0.75 +42 29 0 0.75 +44 92 0 0.75 +93 126 0 0.75 +63 193 0 0.76 +161 206 0 0.77 +62 193 0 0.775 +19 81 0.175 0.775 +20 81 0.09 0.775 +58 202 0 0.775 +36 53 0 0.775 +20 36 0 0.78 +38 43 0 0.78 +81 53 0 0.78 +143 19 0 0.785 +78 34 0.145 0.785 +143 63 0 0.79 +59 53 0.1 0.79 +163 213 0 0.79 +8 41 0 0.795 +46 51 0 0.795 +52 194 0 0.795 +20 56 0 0.8 +90 199 0 0.8 +23 58 0 0.8 +38 36 0.3 0.8 +169 199 0.23 0.805 +53 66 0 0.805 +53 197 0.19 0.81 +137 130 0.045 0.815 +169 183 0 0.815 +169 89 0 0.815 +8 178 0 0.815 +161 82 0 0.82 +44 72 0 0.82 +48 96 0 0.82 +52 179 0.305 0.82 +20 165 0 0.825 +52 207 0 0.825 +161 209 0 0.83 +48 80 0 0.83 +78 82 0.105 0.835 +86 122 0 0.84 +62 131 0 0.845 +163 200 0 0.845 +31 175 0.27 0.845 +38 178 0 0.845 +54 162 0 0.845 +60 166 0 0.85 +55 163 0.3 0.85 +40 76 0 0.85 +42 218 0 0.85 +44 86 0 0.85 +50 55 0 0.85 +161 193 0 0.865 +19 54 0 0.865 +19 7 0.165 0.87 +62 164 0 0.875 +59 218 0.065 0.875 +163 166 0 0.875 +78 51 0 0.88 +19 133 0 0.885 +86 76 0 0.885 +37 214 0 0.885 +70 106 0 0.885 +74 86 0 0.89 +40 216 0 0.89 +63 96 0 0.895 +31 144 0.38 0.895 +51 68 0 0.895 +70 91 0 0.895 +20 51 0 0.9 +24 55 0 0.905 +48 65 0 0.905 +163 196 0 0.91 +78 205 0.035 0.91 +70 93 0.335 0.91 +55 165 0 0.915 +50 86 0 0.915 +66 216 0 0.92 +63 205 0 0.925 +20 175 0 0.93 +78 67 0 0.93 +12 37 0 0.935 +55 199 0 0.935 +50 175 0 0.935 +73 250 0 0.935 +81 164 0.395 0.94 +12 43 0 0.945 +19 165 0 0.945 +52 168 0 0.945 +61 77 0 0.95 +60 205 0 0.95 +19 56 0 0.95 +163 181 0 0.95 +129 149 0 0.95 +73 246 0 0.95 +81 98 0 0.955 +10 143 0.405 0.96 +3 23 0.28 0.96 +23 131 0.14 0.96 +73 215 0 0.96 +55 171 0 0.965 +60 202 0 0.97 +27 144 0.135 0.97 +57 37 0 0.97 +16 49 0 0.975 +74 220 0 0.975 +31 174 0.245 0.975 +66 113 0 0.975 +3 51 0.385 0.99 +44 85 0 0.99 +35 214 0 0.99 +94 65 0.21 0.99 +139 165 0.41 0.995 +163 199 0 0.995 +56 89 0 0.995 +70 92 0 0.995 +129 159 0 0.995 +129 173 0.325 1.005 +137 166 0 1.01 +19 38 0 1.01 +58 205 0 1.01 +57 43 0 1.01 +139 133 0.45 1.015 +20 130 0 1.015 +57 34 0.44 1.015 +42 192 0 1.015 +37 213 0.48 1.015 +23 51 0 1.02 +23 56 0 1.02 +20 53 0 1.025 +70 121 0 1.025 +137 144 0 1.03 +139 172 0 1.03 +60 176 0 1.03 +163 198 0 1.03 +37 44 0 1.03 +35 216 0 1.03 +139 167 0 1.035 +16 58 0.41 1.04 +63 79 0 1.045 +62 205 0 1.045 +139 166 0 1.045 +3 53 0 1.045 +31 173 0 1.045 +32 60 0 1.045 +201 229 0.22 1.045 +7 10 0 1.05 +8 25 0 1.055 +73 106 0 1.055 +44 71 0 1.055 +19 52 0 1.06 +3 39 0.36 1.065 +85 76 0 1.065 +139 60 0 1.07 +66 94 0.135 1.07 +3 38 0 1.07 +37 73 0 1.07 +62 206 0 1.08 +90 207 0 1.08 +31 58 0 1.08 +42 77 0 1.08 +42 54 0.41 1.085 +201 124 0.43 1.085 +169 204 0.31 1.09 +169 203 0.225 1.09 +23 133 0 1.09 +24 139 0.43 1.09 +5 53 0.375 1.09 +173 164 0 1.09 +94 79 0.06 1.09 +85 121 0 1.09 +8 44 0.255 1.095 +40 214 0 1.095 +35 73 0.53 1.095 +60 175 0.205 1.1 +16 57 0 1.1 +23 139 0 1.1 +169 202 0 1.105 +19 36 0 1.105 +7 25 0 1.11 +66 79 0 1.115 +165 183 0 1.115 +66 114 0.48 1.12 +24 166 0 1.13 +58 191 0.62 1.135 +78 212 0.29 1.135 +56 200 0 1.14 +53 162 0.63 1.14 +175 51 0.315 1.14 +81 90 0.54 1.14 +60 204 0 1.15 +66 211 0.385 1.15 +38 35 0 1.15 +93 79 0 1.15 +73 72 0 1.155 +66 242 0 1.16 +19 23 0 1.16 +93 68 0 1.16 +61 60 0 1.165 +61 169 0.525 1.17 +3 20 0.42 1.17 +139 90 0.515 1.175 +60 94 0.42 1.175 +73 101 0.465 1.175 +55 169 0 1.175 +7 185 0 1.175 +60 170 0 1.185 +8 56 0.575 1.19 +14 48 0.685 1.19 +31 161 0 1.195 +16 64 0 1.2 +46 94 0 1.2 +61 28 0 1.21 +66 222 0 1.21 +31 139 0.62 1.21 +201 220 0.055 1.21 +12 32 0 1.215 +12 54 0 1.215 +19 40 0 1.215 +24 162 0 1.215 +61 43 0 1.22 +8 20 0 1.22 +55 64 0.15 1.22 +14 29 0 1.22 +60 206 0.405 1.225 +16 62 0 1.23 +31 64 0 1.23 +165 52 0 1.23 +201 213 0.28 1.23 +7 188 0 1.235 +60 173 0 1.24 +61 171 0.54 1.25 +20 24 0 1.25 +173 202 0 1.25 +161 179 0 1.255 +25 133 0.08 1.255 +14 62 0.275 1.255 +61 25 0.33 1.26 +55 88 0 1.26 +8 28 0.515 1.265 +38 69 0 1.265 +48 222 0 1.265 +137 58 0.605 1.27 +74 71 0 1.27 +16 25 0.395 1.275 +93 86 0.135 1.275 +78 76 0.775 1.28 +8 57 0 1.28 +23 169 0 1.295 +39 51 0 1.295 +51 167 0 1.295 +16 47 0 1.3 +46 52 0.7 1.3 +34 72 0.66 1.305 +38 85 0 1.305 +48 175 0.195 1.305 +81 197 0.25 1.305 +36 70 0.8 1.31 +70 82 0.69 1.31 +21 57 0 1.31 +59 86 0 1.315 +173 177 0 1.315 +18 28 0.48 1.32 +49 85 0 1.32 +28 166 0 1.325 +60 198 0 1.33 +28 131 0.47 1.33 +81 205 0 1.33 +137 155 0 1.335 +38 51 0 1.335 +53 52 0 1.335 +173 221 0 1.335 +56 193 0 1.34 +50 197 0 1.34 +50 85 0 1.345 +36 84 0.6 1.35 +16 20 0.625 1.36 +27 93 0.795 1.36 +36 212 0.44 1.36 +12 58 0 1.37 +78 109 0 1.375 +9 186 0.305 1.375 +38 86 0.57 1.375 +23 59 0 1.385 +7 42 0 1.385 +61 139 0 1.395 +23 29 0.865 1.395 +55 102 0.85 1.395 +165 201 0.81 1.395 +165 172 0 1.395 +169 133 0.49 1.395 +54 199 0.5 1.4 +21 161 0.73 1.4 +53 27 0.325 1.405 +4 65 0.82 1.41 +78 80 0 1.41 +46 62 0 1.41 +34 65 0.83 1.415 +36 67 0 1.415 +48 76 0 1.415 +40 67 0 1.42 +3 181 0 1.425 +39 67 0.695 1.425 +3 63 0.81 1.43 +61 90 0 1.435 +46 65 0 1.435 +16 63 0 1.44 +32 52 0.74 1.44 +93 233 0.345 1.44 +54 198 0 1.445 +66 84 0.445 1.45 +4 52 0 1.455 +42 188 0 1.455 +32 138 0 1.46 +56 172 0.465 1.46 +12 31 0.445 1.465 +169 217 0 1.465 +173 162 0.47 1.465 +46 81 0 1.47 +48 60 0 1.47 +161 193 0.945 1.475 +16 3 0.9 1.475 +73 224 0.665 1.475 +51 193 0 1.475 +70 218 0.27 1.475 +82 205 0.26 1.48 +90 221 0.595 1.48 +163 88 0 1.48 +27 48 0 1.48 +73 77 0 1.49 +48 52 0.75 1.49 +47 64 0.875 1.49 +23 41 0 1.495 +31 45 0 1.495 +45 63 0 1.495 +61 52 0 1.5 +74 125 0.67 1.5 +47 80 0 1.5 +167 202 0 1.5 +66 212 0 1.505 +58 174 0 1.505 +37 41 0 1.505 +53 81 0.905 1.505 +53 86 0 1.505 +167 176 0.575 1.505 +5 9 0 1.505 +46 35 0 1.51 +46 77 0 1.51 +12 29 0 1.515 +90 174 0.85 1.515 +175 195 0.84 1.515 +85 102 0 1.515 +27 55 0 1.52 +58 86 0 1.52 +70 74 0 1.52 +59 47 0.865 1.525 +32 140 0 1.525 +165 170 0.24 1.525 +163 166 1.005 1.53 +70 75 0 1.53 +61 94 0 1.535 +28 138 0 1.535 +74 75 0 1.535 +70 59 0 1.535 +55 48 0.495 1.54 +90 84 0.39 1.545 +73 93 0 1.545 +39 218 0 1.545 +61 47 0 1.55 +12 21 0 1.55 +18 136 0 1.55 +93 102 0.8 1.55 +12 27 0 1.555 +73 48 0 1.555 +48 96 0.955 1.555 +10 63 0.985 1.57 +14 63 0.475 1.57 +48 90 0 1.57 +54 172 0 1.57 +70 101 0 1.57 +19 131 0 1.575 +55 218 0.92 1.575 +81 67 0 1.575 +173 201 0.95 1.575 +33 81 0 1.58 +31 3 0.945 1.58 +60 122 0.135 1.585 +32 132 0.85 1.585 +33 31 1.01 1.59 +70 118 0 1.59 +30 174 0 1.59 +161 191 0 1.595 +74 106 0 1.595 +31 48 0 1.595 +34 52 0 1.595 +29 129 0 1.595 +5 40 0.74 1.595 +28 173 1.075 1.6 +46 93 0.53 1.6 +7 35 0.97 1.6 +16 43 0 1.605 +64 84 0.61 1.61 +42 73 0 1.615 +63 96 1.12 1.62 +61 93 0 1.62 +32 174 0 1.62 +57 201 0.945 1.62 +54 197 0 1.62 +47 223 0 1.62 +61 44 0.215 1.625 +90 95 0 1.625 +10 62 0.395 1.63 +19 163 0 1.63 +89 94 0.51 1.63 +175 177 0.605 1.63 +42 39 0 1.635 +53 82 0 1.635 +90 234 0 1.645 +167 200 0 1.645 +18 135 0.655 1.65 +9 39 0.77 1.65 +60 76 0 1.655 +89 125 0.62 1.655 +32 18 1.05 1.655 +50 174 0.265 1.655 +52 113 1.12 1.655 +74 95 0 1.66 +34 82 0.66 1.66 +32 129 0 1.665 +40 59 0.975 1.665 +165 213 0 1.665 +49 164 0.695 1.665 +45 224 0.83 1.67 +4 163 0.87 1.675 +90 125 0 1.675 +27 20 0.97 1.675 +38 188 0 1.675 +66 86 0.74 1.68 +85 164 1.01 1.68 +64 201 0 1.685 +73 80 0 1.685 +42 186 0 1.685 +48 62 0 1.685 +52 96 0.725 1.685 +47 191 1.12 1.685 +78 113 0 1.69 +12 40 0.65 1.695 +34 180 0.97 1.695 +36 82 0 1.695 +42 47 0 1.695 +10 4 1.065 1.7 +57 70 0 1.7 +173 193 0 1.7 +61 74 0 1.705 +61 81 1.095 1.705 +3 18 0.495 1.705 +57 86 0 1.705 +10 48 0.555 1.71 +23 165 0 1.71 +52 85 0 1.71 +61 27 0 1.715 +27 62 0 1.715 +14 8 0.155 1.715 +18 162 0 1.72 +51 195 0 1.72 +70 102 0 1.72 +23 135 0 1.725 +27 144 1.145 1.725 +36 224 0.745 1.725 +21 135 0.665 1.725 +39 59 0 1.73 +173 163 0.62 1.73 +39 45 0.88 1.735 +36 97 0.555 1.735 +4 81 0.47 1.74 +10 143 0.985 1.74 +27 44 0 1.74 +74 94 0 1.74 +14 37 0.88 1.74 +16 27 0 1.745 +27 64 0 1.745 +89 110 0.845 1.745 +73 45 0.925 1.75 +34 62 0.21 1.75 +57 165 0.935 1.75 +51 87 0 1.75 +52 88 0 1.75 +18 56 1.24 1.755 +175 207 0 1.755 +34 68 1.165 1.76 +57 140 1.08 1.76 +48 58 0 1.76 +61 190 1.125 1.765 +46 192 0 1.765 +175 221 0 1.765 +28 171 0 1.77 +39 74 0 1.775 +52 68 0.845 1.775 +81 96 0.68 1.775 +74 90 0 1.78 +175 84 0 1.78 +78 72 1.13 1.785 +60 197 1.005 1.785 +28 151 1.035 1.79 +165 174 1.28 1.79 +175 209 0 1.79 +34 78 1.09 1.795 +10 19 1.055 1.8 +51 197 0 1.8 +85 229 0 1.8 +173 185 1.025 1.805 +36 72 0.305 1.81 +28 136 0.4 1.815 +57 48 0 1.815 +49 82 0 1.815 +10 20 0.81 1.825 +4 64 0.72 1.83 +70 121 1.045 1.83 +14 21 0.925 1.835 +49 162 0.64 1.84 +66 98 0 1.845 +59 36 1.255 1.845 +38 74 0 1.845 +2 7 0 1.845 +64 163 0.89 1.85 +49 174 0.73 1.85 +74 110 0.73 1.855 +36 79 0 1.855 +85 76 1.205 1.855 +167 185 0 1.855 +4 47 0 1.86 +78 125 0.805 1.86 +19 29 1.055 1.865 +46 44 0.81 1.865 +81 77 0 1.865 +62 176 1.35 1.87 +42 43 0 1.87 +81 65 0 1.875 +70 86 0 1.875 +40 71 0 1.88 +64 203 0 1.885 +62 82 0.93 1.885 +78 97 0 1.89 +24 57 0 1.895 +173 203 0.06 1.895 +62 59 0 1.9 +89 48 0 1.9 +38 66 0 1.9 +62 165 1.385 1.905 +23 18 0 1.905 +74 102 0.625 1.905 +58 203 0.1 1.905 +48 81 0 1.905 +50 167 0 1.905 +4 161 0.28 1.91 +90 121 0 1.91 +163 191 0.615 1.91 +36 65 0 1.91 +59 171 0 1.915 +3 53 1.165 1.915 +3 66 1.125 1.915 +35 214 1.245 1.92 +32 48 0.72 1.92 +34 81 0 1.925 +175 196 0.84 1.925 +12 53 0 1.93 +27 59 0 1.93 +55 93 0.105 1.93 +89 78 0.8 1.93 +94 203 0 1.93 +137 139 0 1.935 +8 66 1 1.935 +34 131 1.38 1.935 +20 189 1.275 1.94 +55 45 1.275 1.94 +49 56 0 1.94 +27 143 0 1.945 +42 55 0 1.945 +49 173 0.205 1.945 +59 167 1.35 1.95 +74 87 0 1.95 +78 82 1.065 1.955 +62 177 1.415 1.96 +58 96 0.585 1.96 +66 54 1.35 1.965 +66 117 0 1.97 +74 121 0 1.97 +44 77 0.31 1.97 +70 216 0 1.97 +94 92 0.45 1.97 +12 54 1.365 1.975 +55 74 0 1.975 +37 81 0.915 1.975 +51 88 0 1.975 +175 82 0 1.975 +44 48 0 1.98 +78 163 1.335 1.985 +61 129 1.35 1.985 +175 162 0.575 1.985 +78 92 0.91 1.995 +66 73 0.945 2.005 +4 62 0 2.01 +30 170 1.355 2.01 +55 91 0 2.01 +34 161 0.805 2.01 +70 76 0 2.015 +30 159 1.385 2.025 +42 89 0 2.025 +90 52 0.29 2.03 +55 214 0.91 2.03 +32 78 1.525 2.03 +21 134 1.49 2.03 +55 121 0.585 2.035 +40 89 0 2.035 +2 51 1.48 2.035 +33 68 1.205 2.035 +4 53 0 2.04 +28 59 0 2.04 +78 90 0 2.05 +94 195 0.86 2.05 +70 188 0 2.05 +60 168 1.38 2.055 +56 117 1.445 2.055 +73 54 1.52 2.06 +85 121 1.155 2.06 +19 161 0 2.06 +62 18 0.31 2.065 +55 58 0 2.065 +169 181 1.14 2.065 +20 174 0 2.07 +34 85 0 2.07 +18 36 1.535 2.075 +89 58 0 2.075 +37 65 0.8 2.075 +81 205 1.375 2.075 +28 139 0 2.08 +81 79 0 2.08 +55 76 0 2.09 +59 173 0 2.095 +40 86 0 2.095 +32 36 1.49 2.1 +40 167 1.425 2.1 +163 88 1.595 2.105 +28 170 0 2.105 +36 93 0.92 2.105 +56 84 1.055 2.105 +53 161 0.55 2.105 +4 66 0.75 2.11 +61 175 0 2.11 +44 85 1.565 2.11 +165 201 1.495 2.11 +74 60 0 2.115 +90 204 0.625 2.12 +23 42 0 2.12 +135 138 0 2.12 +40 68 1.25 2.12 +61 59 0 2.125 +20 162 0 2.125 +63 162 1.57 2.13 +61 57 0 2.13 +74 214 0 2.13 +38 45 1.045 2.13 +63 68 0 2.135 +78 110 0 2.135 +90 191 0.39 2.135 +34 163 0.635 2.135 +39 76 0 2.14 +94 173 0 2.15 +18 63 1.28 2.15 +27 153 1.515 2.15 +34 54 0.6 2.15 +90 199 1.17 2.16 +47 81 0 2.16 +135 182 0.375 2.165 +58 172 0 2.165 +61 161 0 2.17 +59 47 1.59 2.17 +59 118 1.575 2.17 +90 198 1.485 2.175 +34 56 0 2.175 +46 66 1.115 2.175 +64 174 0.76 2.18 +90 208 0 2.18 +14 18 0.845 2.185 +18 161 0 2.19 +36 62 0 2.19 +36 52 0 2.19 +70 242 1.65 2.19 +23 27 0 2.2 +167 179 1.31 2.2 +47 242 1.7 2.2 +188 216 1.32 2.205 +175 192 1.07 2.205 +28 32 0 2.21 +25 24 0 2.21 +163 83 0 2.215 +20 175 1.295 2.22 +32 140 1.625 2.22 +37 63 0.89 2.22 +32 171 0 2.225 +56 194 0 2.225 +139 151 0 2.225 +82 229 0 2.225 +61 173 0 2.23 +12 48 0.275 2.23 +29 189 1.35 2.23 +167 206 1.68 2.23 +54 92 0.505 2.23 +169 217 1.715 2.23 +47 51 1.52 2.23 +61 78 0 2.235 +64 161 0 2.24 +63 85 1.115 2.24 +61 51 1.225 2.24 +8 41 1.605 2.24 +16 36 0.735 2.24 +58 176 0 2.24 +40 83 0 2.24 +56 161 0 2.24 +37 85 0.905 2.24 +165 27 1.625 2.245 +81 97 0 2.245 +78 205 0.97 2.255 +74 57 0 2.255 +49 24 0 2.255 +70 98 0 2.255 +90 176 0 2.26 +60 206 1.35 2.265 +135 147 0 2.265 +167 88 0 2.265 +52 197 0 2.265 +53 10 1.73 2.265 +4 51 0 2.27 +16 74 1.5 2.275 +27 136 1.66 2.275 +47 63 0 2.275 +188 211 1.395 2.28 +32 170 0 2.28 +47 93 0 2.28 +25 140 0.06 2.285 +38 58 0.925 2.29 +61 45 0 2.295 +33 51 1.005 2.295 +63 83 0.345 2.3 +8 183 1.61 2.3 +20 64 0.64 2.3 +29 20 0 2.3 +167 176 1.74 2.3 +46 37 0.58 2.3 +94 208 0 2.3 +23 50 0 2.305 +32 45 1.57 2.305 +48 91 0 2.305 +63 126 1.46 2.31 +169 168 0 2.31 +4 78 0.62 2.32 +44 93 0 2.32 +49 165 0.75 2.32 +45 36 0 2.325 +44 71 1.605 2.325 +8 73 1.525 2.33 +35 81 0 2.33 +82 179 1.795 2.33 +163 179 0 2.33 +49 161 0 2.33 +25 135 0 2.33 +4 35 0 2.335 +90 202 0 2.335 +46 47 0 2.335 +60 96 0 2.34 +50 137 0.985 2.345 +16 186 0 2.35 +3 69 1.565 2.35 +12 61 0 2.355 +12 32 1.585 2.355 +29 62 0 2.355 +52 195 0 2.355 +63 82 0.315 2.365 +29 143 0 2.365 +137 150 0.075 2.37 +165 57 1.825 2.37 +46 35 1.78 2.37 +64 171 0 2.375 +20 173 0 2.375 +73 74 0 2.375 +25 32 0 2.375 +81 114 0 2.38 +9 185 1.8 2.38 +94 191 0.825 2.38 +94 237 0 2.385 +32 59 0 2.39 +169 185 0 2.39 +81 100 0.99 2.39 +21 165 0.595 2.39 +78 126 1.03 2.395 +64 206 0 2.4 +45 93 1.11 2.4 +42 20 1.16 2.4 +74 109 1.815 2.405 +32 57 0 2.405 +64 126 1.185 2.41 +24 161 0 2.41 +201 96 0 2.41 +8 51 0 2.415 +52 207 0.875 2.415 +21 57 1.855 2.415 +8 24 0 2.42 +35 63 1.635 2.42 +55 163 1.91 2.42 +25 53 0 2.425 +78 62 0 2.43 +50 134 1.245 2.43 +137 131 0.385 2.435 +175 95 0.35 2.435 +163 86 0 2.435 +38 87 1.115 2.435 +55 81 1.94 2.45 +12 185 1.695 2.455 +38 188 1.77 2.455 +42 36 1.125 2.455 +49 175 0 2.455 +21 51 1.345 2.455 +46 43 0 2.46 +70 82 1.945 2.46 +64 60 0 2.465 +63 56 1.255 2.465 +60 117 1.075 2.465 +163 198 1.73 2.465 +50 28 0.345 2.465 +23 24 0 2.47 +94 161 1.81 2.47 +33 222 0 2.47 +50 136 0 2.475 +201 208 1.015 2.475 +53 44 0 2.48 +40 52 1.855 2.485 +53 27 1.61 2.485 +78 175 0.14 2.49 +78 58 1.22 2.49 +10 41 1.745 2.49 +55 117 0.91 2.5 +55 83 1.765 2.5 +49 70 1.93 2.5 +63 95 0 2.505 +39 51 1.59 2.505 +167 58 0 2.505 +48 70 1.94 2.505 +49 81 0 2.505 +38 27 0 2.515 +33 209 0 2.525 +74 58 0 2.53 +48 65 0.95 2.53 +70 81 0.715 2.53 +38 59 0 2.535 +19 51 0 2.54 +28 165 0 2.54 +52 168 1.095 2.54 +81 87 1.875 2.54 +70 95 2.035 2.54 +137 248 0.945 2.545 +163 212 2.02 2.545 +42 43 2.025 2.545 +70 47 1.585 2.55 +89 220 1.805 2.55 +61 64 0 2.555 +12 74 0.62 2.555 +36 95 0.78 2.555 +48 95 0 2.555 +94 92 2.055 2.555 +28 134 0 2.56 +52 95 0.77 2.56 +163 197 0 2.565 +94 174 1.15 2.565 +188 93 1.645 2.57 +89 119 0.675 2.57 +49 45 1.805 2.575 +18 51 0.88 2.585 +39 211 1.93 2.585 +38 42 0 2.585 +54 171 0 2.585 +25 169 2.085 2.585 +52 177 1.61 2.59 +163 195 0 2.595 +7 53 0 2.595 +50 135 0 2.6 +51 87 1.87 2.605 +52 85 1.835 2.605 +74 92 0 2.61 +50 168 0 2.61 +163 84 0 2.615 +163 54 0 2.62 +32 169 0 2.62 +58 161 2.055 2.62 +52 208 1.385 2.62 +173 186 1.625 2.62 +33 70 1.56 2.62 +61 36 0 2.625 +139 132 0.99 2.625 +78 193 1.72 2.635 +52 56 0 2.635 +131 149 0 2.635 +64 169 0 2.64 +35 83 1.485 2.64 +37 44 2.065 2.64 +33 43 0.81 2.64 +188 48 0.205 2.645 +20 159 1.37 2.65 +90 167 0 2.65 +89 77 0.39 2.65 +66 193 2.145 2.655 +90 126 0.245 2.655 +37 56 2.095 2.655 +64 173 0 2.66 +60 203 0 2.66 +12 64 1.73 2.66 +52 212 1.78 2.66 +60 93 0 2.665 +90 172 0 2.665 +74 68 2.075 2.67 +51 54 0 2.67 +42 94 1.86 2.675 +29 144 0.075 2.68 +89 117 0.645 2.68 +42 78 0.25 2.68 +139 171 0 2.68 +12 53 2.175 2.685 +66 163 0.78 2.685 +55 51 0 2.685 +39 214 0 2.685 +61 48 0 2.69 +16 64 1.99 2.69 +4 21 0 2.695 +42 77 1.78 2.695 +51 168 0.82 2.695 +24 51 0 2.705 +55 82 1.955 2.705 +165 181 0 2.705 +55 201 0 2.71 +89 96 0 2.71 +89 80 0 2.715 +54 168 0 2.715 +131 164 0 2.715 +59 201 0 2.72 +175 77 2 2.725 +39 59 1.81 2.725 +56 196 1.73 2.725 +58 201 0 2.73 +51 167 2.14 2.73 +4 40 0.51 2.735 +190 187 0 2.735 +53 168 0.89 2.735 +56 164 0.37 2.74 +49 8 0 2.74 +21 37 0 2.74 +94 206 0 2.74 +8 57 1.455 2.745 +45 76 2.25 2.755 +48 224 0 2.755 +49 21 0.105 2.755 +8 50 0 2.76 +35 55 1.54 2.765 +38 51 1.42 2.765 +37 72 1.245 2.775 +49 35 1.74 2.775 +94 223 1.63 2.775 +8 35 0 2.78 +19 24 0 2.78 +8 54 0 2.79 +24 55 2.175 2.79 +190 176 0 2.795 +93 201 0.095 2.81 +73 45 2.14 2.815 +56 199 0 2.815 +66 52 0.575 2.82 +40 44 0 2.82 +50 164 0 2.82 +33 210 0 2.82 +8 36 1.23 2.825 +12 73 1.145 2.83 +46 94 2.335 2.835 +190 209 0 2.84 +10 64 0.495 2.84 +74 106 1.68 2.84 +78 100 0.815 2.85 +78 52 0 2.855 +12 60 1.685 2.855 +33 192 0 2.855 +57 86 2.19 2.86 +6 39 1.085 2.86 +7 40 0 2.86 +81 77 1.91 2.86 +163 196 1.16 2.865 +62 202 2.23 2.87 +23 37 0 2.87 +74 220 1.775 2.87 +33 69 1.405 2.87 +66 100 1.635 2.875 +74 95 1.795 2.875 +23 40 0 2.88 +137 58 2.38 2.885 +12 169 2.21 2.885 +59 54 0 2.885 +18 135 2.025 2.885 +173 191 0 2.885 +19 37 0 2.89 +74 96 0 2.89 +60 91 0 2.905 +90 94 0 2.905 +38 135 1.275 2.905 +165 169 0 2.905 +50 132 0.215 2.905 +139 160 1.285 2.905 +38 29 2.34 2.91 +38 165 1.055 2.91 +56 118 1.02 2.91 +53 66 0.83 2.91 +81 72 0 2.91 +137 165 0 2.915 +38 169 1.015 2.915 +44 214 0 2.915 +48 68 0.97 2.915 +53 37 0 2.92 +2 178 1.33 2.925 +175 208 0 2.925 +163 85 0 2.925 +55 71 0.6 2.925 +38 167 1.42 2.925 +48 79 0 2.925 +129 147 0 2.93 +137 60 2.4 2.935 +12 90 2.19 2.935 +45 77 0 2.935 +12 27 1.59 2.94 +58 166 1.5 2.94 +40 57 0 2.94 +63 164 1.235 2.945 +12 137 2.3 2.945 +19 63 0.515 2.945 +131 63 2.045 2.95 +29 169 0.69 2.95 +62 94 0 2.955 +30 133 2.215 2.955 +27 60 0 2.955 +28 40 1.325 2.955 +55 118 0.635 2.955 +39 71 0 2.955 +38 89 0 2.955 +188 60 1.805 2.96 +173 198 2.37 2.96 +137 130 1.605 2.965 +30 63 1.83 2.965 +93 79 1.42 2.965 +12 89 1.445 2.97 +28 59 2.25 2.97 +53 86 2.405 2.97 +78 97 2.22 2.975 +20 21 0 2.975 +89 56 2.185 2.975 +40 89 2.4 2.985 +19 143 0.87 2.99 +44 218 0 2.99 +7 37 0 2.99 +66 195 2.185 2.995 +73 118 2.39 2.995 +74 90 2.065 2.995 +6 57 2.075 2.995 +190 35 0.85 3 +73 218 0 3 +3 61 1.24 3 +8 70 1.415 3.005 +60 58 0 3.005 +28 167 0 3.005 +74 79 0 3.005 +165 179 0 3.005 +21 129 0 3.005 +9 33 2.355 3.005 +42 33 1.175 3.01 +34 35 0 3.015 +12 54 2.04 3.02 +175 223 1.13 3.02 +73 91 0 3.02 +38 85 1.335 3.02 +53 70 0 3.02 +57 63 2.415 3.025 +46 51 1.755 3.025 +188 87 1.35 3.035 +16 19 0.835 3.035 +54 89 0 3.035 +169 93 1.955 3.04 +4 30 2.315 3.045 +8 18 0 3.045 +57 93 0.57 3.045 +42 4 1.04 3.045 +73 68 2.355 3.05 +52 83 0 3.05 +64 57 0 3.055 +54 58 0 3.055 +81 113 0 3.055 +27 90 0.465 3.06 +34 69 2.285 3.06 +46 57 2.32 3.06 +3 18 2.245 3.06 +190 44 2.425 3.065 +89 233 2.015 3.07 +54 92 2.455 3.07 +54 197 2.495 3.07 +78 81 0 3.075 +2 37 0 3.075 +27 167 1.22 3.075 +32 138 2.51 3.075 +38 66 2.38 3.075 +173 202 1.88 3.075 +81 68 0 3.085 +201 185 2.355 3.09 +24 162 1.325 3.1 +44 64 0 3.1 +33 20 2.425 3.1 +66 86 1.745 3.105 +90 77 2.09 3.105 +42 49 1.365 3.105 +46 44 2.415 3.105 +169 118 2.59 3.105 +89 93 0 3.11 +165 164 0 3.11 +10 63 2.115 3.115 +44 91 0 3.115 +53 162 2.25 3.12 +27 58 0 3.125 +55 188 0.695 3.125 +89 88 1.77 3.125 +51 161 0 3.13 +173 185 1.86 3.13 +89 86 0 3.135 +38 73 0 3.14 +66 113 2.14 3.145 +23 18 2.015 3.145 +27 175 2.055 3.145 +62 132 0.97 3.15 +64 52 0 3.155 +19 23 2.225 3.155 +44 48 2.585 3.155 +38 69 1.39 3.16 +139 63 1.9 3.165 +33 38 2.505 3.165 +137 167 2.045 3.17 +82 210 2.44 3.175 +61 63 0 3.175 +169 233 2.545 3.175 +137 31 2.305 3.18 +28 58 0 3.18 +89 85 0 3.18 +63 161 0 3.185 +66 211 2.62 3.185 +32 51 2.245 3.185 +50 130 0.34 3.185 +2 20 0 3.19 +36 52 2.345 3.19 +46 139 2.54 3.19 +49 52 0 3.19 +62 165 2.7 3.2 +57 91 2.395 3.2 +78 96 0 3.205 +82 161 1 3.21 +93 171 2.015 3.21 +58 171 0 3.215 +51 164 0.405 3.215 +137 173 2.17 3.22 +175 172 1.12 3.225 +49 180 2.115 3.23 +7 59 2.315 3.23 +82 191 2.735 3.235 +93 223 2.39 3.235 +23 183 2.605 3.24 +49 165 2.57 3.245 +7 54 2.07 3.245 +78 72 2.07 3.25 +62 36 2.675 3.255 +60 172 0 3.255 +46 62 2.185 3.255 +17 50 2.68 3.26 +175 166 2.31 3.26 +173 167 1.675 3.26 +62 57 2.65 3.265 +175 191 0 3.265 +40 81 0 3.265 +46 50 2.115 3.265 +49 66 0 3.265 +44 74 0 3.27 +82 193 0 3.275 +33 186 1.455 3.275 +175 192 2.43 3.28 +82 166 2.14 3.28 +49 139 2.625 3.28 +85 95 1.115 3.28 +66 81 0 3.285 +82 164 0 3.285 +39 50 2.605 3.285 +27 176 2.09 3.29 +49 93 2.675 3.29 +18 28 1.5 3.295 +46 30 2.17 3.295 +173 203 2 3.295 +163 167 0 3.3 +49 37 0 3.3 +85 97 1.195 3.31 +56 81 0 3.31 +32 57 2.58 3.315 +90 203 0 3.32 +36 81 0 3.32 +94 122 2.81 3.32 +63 206 1.72 3.33 +4 50 0 3.33 +34 163 2.25 3.335 +2 50 0.535 3.34 +2 55 2.705 3.345 +175 233 2.11 3.345 +48 66 1.425 3.345 +27 32 0 3.35 +4 37 0 3.355 +37 50 0.875 3.355 +175 126 0.72 3.36 +169 203 1.34 3.36 +82 200 0 3.365 +54 201 0 3.365 +4 58 2.675 3.37 +62 169 1.945 3.37 +57 166 2.045 3.37 +48 40 2.07 3.37 +54 198 1.8 3.37 +82 215 1.91 3.375 +34 24 0 3.38 +4 31 0 3.39 +4 45 0 3.395 +78 110 2.545 3.395 +10 166 2.435 3.395 +64 76 2.855 3.4 +33 51 2.375 3.4 +4 53 2.885 3.405 +73 35 1.335 3.405 +36 165 2.56 3.405 +60 198 1.37 3.41 +169 185 2.86 3.425 +90 96 0 3.43 +139 163 2.55 3.43 +11 176 1.245 3.435 +16 27 2.17 3.435 +49 175 2.805 3.435 +63 96 2.555 3.44 +78 85 1.785 3.44 +70 50 1.545 3.45 +205 124 2.055 3.45 +61 42 0 3.455 +85 35 0 3.455 +89 75 2.84 3.46 +89 119 2.88 3.46 +33 47 0 3.46 +63 85 2.91 3.465 +62 42 0 3.465 +12 185 2.54 3.465 +33 35 0 3.465 +90 204 2.935 3.475 +51 167 2.8 3.475 +173 172 0 3.475 +17 61 1.36 3.48 +137 55 2.54 3.485 +49 143 0 3.485 +173 201 1.66 3.49 +33 94 2.535 3.49 +33 58 2.82 3.5 +12 74 2.66 3.505 +59 169 0 3.505 +62 27 1.9 3.51 +89 77 3.005 3.51 +56 198 0 3.51 +64 81 0 3.515 +3 50 2.425 3.515 +54 70 0.585 3.52 +54 173 1.79 3.525 +33 50 2.415 3.525 +93 128 2.93 3.525 +39 213 0 3.53 +90 233 0 3.535 +139 52 2.33 3.535 +7 70 1.015 3.535 +12 61 2.98 3.54 +58 51 2.58 3.54 +63 47 2.755 3.545 +63 83 2.855 3.545 +18 130 0 3.545 +40 167 2.165 3.545 +60 117 2.87 3.55 +81 88 0 3.55 +173 92 2.52 3.55 +93 125 0 3.55 +82 198 0 3.555 +3 21 0 3.555 +12 186 0 3.56 +59 201 3.025 3.57 +10 140 2.04 3.575 +20 130 1.41 3.575 +62 64 0 3.58 +48 35 1.55 3.585 +53 167 0 3.59 +173 135 1.68 3.59 +58 50 2.61 3.595 +53 134 1.66 3.595 +53 130 2.3 3.595 +93 79 3.02 3.595 +93 68 2.995 3.595 +4 148 0 3.6 +139 166 2.275 3.6 +64 122 2.665 3.61 +56 196 2.915 3.615 +133 150 2.03 3.615 +56 162 0 3.62 +59 110 3.055 3.625 +32 170 3.115 3.625 +32 161 0 3.625 +173 166 1.66 3.625 +19 31 2.865 3.625 +78 58 2.92 3.63 +7 217 2.49 3.63 +48 51 1.51 3.635 +205 63 1.16 3.64 +85 169 2.6 3.64 +34 51 0 3.64 +139 161 1.025 3.64 +188 224 0.5 3.65 +20 159 2.8 3.65 +55 51 2.91 3.65 +49 51 0 3.65 +39 214 3.025 3.655 +31 174 3.1 3.655 +58 163 2.475 3.66 +58 94 0 3.66 +31 143 0 3.66 +64 205 0 3.665 +54 139 2.805 3.665 +12 46 0.945 3.67 +89 64 0 3.67 +129 130 0 3.67 +133 136 0 3.67 +66 117 2.665 3.675 +28 39 1.555 3.675 +85 92 2.42 3.675 +139 42 1.79 3.675 +21 10 2.535 3.675 +12 32 2.52 3.68 +74 63 0 3.685 +73 216 0 3.69 +89 80 2.845 3.69 +12 48 2.91 3.695 +173 193 1.915 3.695 +90 106 2.75 3.7 +180 79 3.04 3.705 +58 77 2.995 3.705 +64 90 0 3.715 +46 10 0 3.72 +90 218 3.035 3.725 +55 59 0 3.725 +169 198 0 3.725 +61 143 0 3.73 +39 60 1 3.73 +49 94 0 3.73 +20 162 2.175 3.735 +93 164 2.515 3.735 +44 218 3.105 3.735 +21 39 1.62 3.735 +36 56 2.025 3.74 +38 37 0 3.74 +89 214 0.915 3.74 +42 63 0 3.74 +82 201 1.47 3.745 +40 88 2.625 3.745 +59 87 0 3.75 +17 37 2.585 3.755 +28 40 3.115 3.76 +85 201 1.32 3.765 +73 45 3.265 3.77 +48 37 1.62 3.77 +169 197 2.555 3.77 +180 210 0 3.775 +175 202 0 3.775 +175 203 0 3.775 +73 219 2.805 3.775 +93 110 2.705 3.785 +36 210 3.25 3.785 +37 63 2.79 3.785 +173 155 0 3.785 +173 91 3.245 3.785 +139 57 1.8 3.785 +73 80 2.875 3.79 +44 58 0 3.79 +31 63 3.12 3.79 +90 86 0 3.795 +55 201 2.9 3.8 +81 202 3.095 3.8 +49 163 0 3.81 +30 50 1.81 3.815 +36 72 2.24 3.815 +23 3 1.155 3.82 +61 10 0 3.82 +93 237 0 3.82 +7 21 0 3.82 +37 51 0 3.825 +70 214 0 3.825 +188 75 0 3.83 +73 59 0 3.83 +38 41 2.895 3.83 +56 194 2.545 3.83 +37 83 3 3.83 +49 21 3.045 3.83 +70 102 3.165 3.83 +10 174 2.715 3.835 +60 195 2.215 3.84 +89 74 0 3.84 +70 41 3.135 3.84 +129 50 0 3.845 +53 60 0 3.845 +36 68 0 3.85 +205 235 0.075 3.855 +129 161 0 3.855 +70 76 2.51 3.855 +20 174 2.92 3.86 +23 40 3.345 3.86 +38 90 3.265 3.86 +89 102 0 3.86 +82 60 2.05 3.865 +36 82 3.095 3.865 +129 165 0 3.865 +64 50 3.105 3.87 +78 91 0.45 3.87 +205 86 2.99 3.87 +85 71 0 3.87 +36 77 0 3.87 +36 67 1.97 3.87 +36 83 0 3.87 +87 76 0 3.87 +37 79 3.03 3.875 +8 69 1.52 3.88 +46 186 0.55 3.88 +40 60 0.875 3.885 +44 85 3.175 3.885 +51 114 3.005 3.885 +205 202 0 3.89 +38 183 0.725 3.89 +54 39 1.2 3.89 +21 44 2.97 3.89 +87 102 0 3.89 +87 91 0 3.89 +92 86 0 3.89 +44 76 0 3.895 +23 39 0.385 3.9 +70 211 0.9 3.9 +20 177 3.285 3.905 +45 76 3.03 3.905 +92 206 3.045 3.905 +32 174 1.69 3.91 +36 163 1.45 3.91 +38 60 0.755 3.91 +63 77 0 3.92 +38 87 3.33 3.92 +20 93 3.405 3.93 +7 16 1.51 3.93 +180 77 2.225 3.935 +49 178 2.15 3.935 +92 167 3.34 3.935 +41 198 3.36 3.935 +58 193 2.21 3.94 +131 81 3.305 3.94 +70 65 0.85 3.94 +205 223 0 3.945 +92 128 2.045 3.945 +36 47 0 3.95 +64 193 0.815 3.955 +60 174 3.405 3.955 +93 174 2.27 3.955 +55 67 1.725 3.955 +55 118 3.27 3.955 +85 120 0.63 3.955 +73 98 1.615 3.96 +46 42 0 3.96 +62 176 1.99 3.965 +90 237 0 3.965 +73 75 0 3.965 +58 206 0.34 3.965 +89 91 0 3.97 +180 224 0 3.975 +62 191 0.115 3.975 +62 164 0.9 3.975 +54 170 0 3.975 +87 106 2.39 3.975 +44 169 1.49 3.98 +51 238 3.29 3.98 +58 174 1.78 3.985 +46 43 3.255 3.985 +70 35 0 3.985 +62 165 3.425 3.99 +60 197 2.415 3.99 +25 54 0 3.99 +55 88 1.515 3.99 +92 199 0 3.99 +18 134 1.32 3.995 +34 28 1.49 3.995 +90 63 0 4 +12 59 0 4.005 +27 136 2.43 4.005 +20 165 2.11 4.005 +46 59 0.4 4.005 +173 163 2.77 4.005 +7 45 1.43 4.005 +16 139 2.25 4.01 +16 44 0.615 4.01 +73 65 2.315 4.01 +92 88 0 4.01 +92 237 0 4.01 +41 76 2.945 4.015 +62 193 0.9 4.02 +2 25 2.85 4.02 +16 64 3.075 4.02 +87 68 2.245 4.02 +87 97 1.645 4.02 +82 55 3.05 4.025 +40 163 0.94 4.025 +41 46 1.265 4.025 +41 176 0.6 4.025 +2 39 2.56 4.03 +46 64 0 4.03 +7 69 1.35 4.03 +16 63 2.195 4.035 +25 137 0 4.035 +34 165 0.86 4.035 +62 177 2.64 4.04 +60 193 3.51 4.04 +28 60 0 4.04 +173 93 2.2 4.04 +62 91 3.495 4.045 +16 30 2.105 4.045 +92 110 3.06 4.045 +42 91 2.435 4.05 +53 136 1.66 4.05 +2 137 2.615 4.055 +188 91 1.29 4.055 +16 57 1.445 4.055 +51 168 3.015 4.055 +137 132 3.235 4.06 +60 136 2.985 4.06 +12 40 3.435 4.06 +188 55 3.145 4.06 +46 74 0.575 4.06 +25 139 2.055 4.065 +45 91 1.815 4.065 +188 87 3.405 4.07 +45 57 1.31 4.07 +19 40 3.49 4.07 +8 181 2.395 4.075 +48 66 3.465 4.075 +23 16 1.545 4.08 +39 57 0 4.08 +42 93 0 4.08 +173 206 0 4.08 +82 66 0 4.085 +41 180 3.45 4.085 +78 224 0 4.1 +20 51 1.2 4.1 +58 74 2.62 4.1 +21 40 0.96 4.1 +25 21 0 4.105 +90 193 0.13 4.105 +40 165 1.05 4.105 +51 96 2.725 4.105 +131 40 2.11 4.105 +20 40 2.045 4.11 +30 174 2.75 4.11 +218 75 0 4.115 +85 207 3.585 4.115 +57 40 2.99 4.115 +51 194 2.67 4.115 +53 168 2.955 4.115 +92 193 2.95 4.115 +188 219 0 4.12 +32 50 2.16 4.12 +218 118 3.345 4.125 +57 121 3.475 4.125 +29 135 1.73 4.125 +20 24 1.395 4.13 +42 64 0 4.13 +85 35 3.535 4.135 +49 190 2.16 4.135 +70 82 2.91 4.135 +6 185 3.59 4.135 +64 83 2.955 4.14 +93 206 0.395 4.14 +32 163 2.3 4.14 +38 36 2.2 4.14 +131 149 2.8 4.14 +27 153 2.25 4.145 +49 173 3.57 4.145 +31 138 2.38 4.145 +54 82 0.715 4.145 +180 191 0 4.15 +180 188 2.925 4.15 +30 48 3.475 4.15 +205 204 1.305 4.15 +57 118 3.63 4.15 +63 66 0 4.16 +57 175 1.835 4.16 +180 187 2.36 4.165 +188 80 0.515 4.165 +82 72 2.855 4.17 +28 138 3.245 4.17 +42 76 3.44 4.17 +46 63 0 4.17 +18 165 0 4.175 +52 202 2.795 4.175 +55 121 2.36 4.175 +64 63 0 4.18 +188 214 0 4.18 +16 28 2.165 4.18 +52 209 1.425 4.185 +173 159 3.45 4.185 +61 131 3.56 4.195 +85 194 2.99 4.195 +41 55 2.45 4.195 +188 102 1.415 4.2 +93 163 2.535 4.2 +32 131 2.275 4.2 +45 63 1.67 4.2 +49 59 3.565 4.2 +63 193 1.145 4.205 +52 126 3.44 4.21 +218 95 1.84 4.215 +28 170 2.99 4.215 +44 45 0 4.215 +53 66 3.35 4.215 +218 84 3.325 4.22 +205 240 0.22 4.225 +36 222 3.215 4.225 +205 126 0 4.23 +38 39 0 4.23 +51 126 3.465 4.23 +39 56 2.05 4.24 +64 110 2.78 4.245 +12 45 0 4.245 +39 121 2.975 4.245 +46 78 0 4.245 +73 88 3.565 4.25 +32 170 3.73 4.25 +50 72 3.64 4.255 +53 39 0 4.255 +59 63 0 4.26 +93 207 2.585 4.26 +58 189 3.27 4.26 +89 76 0 4.26 +3 67 2.99 4.26 +53 87 3.575 4.26 +40 82 0 4.265 +89 45 1.305 4.265 +63 94 0 4.27 +58 30 1.8 4.27 +10 189 2.455 4.275 +39 42 2.975 4.275 +41 48 2.9 4.275 +175 94 0 4.28 +131 159 1.005 4.28 +41 74 0 4.28 +12 39 0 4.285 +57 201 1.805 4.285 +56 66 0 4.285 +54 44 0 4.285 +93 126 0.9 4.29 +59 118 3.675 4.295 +63 83 3.71 4.3 +175 50 2.93 4.3 +93 82 3.4 4.3 +57 166 3.47 4.305 +48 35 3.68 4.305 +53 44 3.54 4.305 +21 29 2.405 4.305 +28 44 1.28 4.31 +86 226 1.79 4.31 +86 230 0 4.31 +90 166 1.5 4.315 +169 174 1.925 4.315 +81 125 3.72 4.315 +49 175 3.695 4.32 +90 172 3.62 4.325 +92 64 0 4.325 +92 47 3.62 4.33 +58 63 0 4.33 +58 171 3.425 4.33 +57 170 2.75 4.33 +46 18 3.83 4.33 +41 43 0 4.33 +86 117 0 4.33 +64 175 0 4.335 +20 159 3.725 4.335 +90 174 1.715 4.34 +180 63 2.805 4.345 +12 92 3.775 4.345 +90 118 1.205 4.345 +169 118 3.77 4.345 +62 159 1.21 4.35 +85 136 3.845 4.35 +56 121 3.485 4.35 +91 80 0 4.35 +91 207 3.55 4.35 +27 174 2.04 4.355 +175 163 0 4.355 +175 106 3.66 4.355 +53 89 3.735 4.355 +91 233 1.76 4.36 +86 198 3.81 4.36 +218 119 3.265 4.365 +59 94 0 4.365 +73 97 1.7 4.365 +85 168 3.15 4.365 +89 67 1.795 4.365 +44 67 3.645 4.365 +173 192 0.49 4.365 +173 161 0 4.365 +188 220 0 4.37 +36 35 0 4.37 +46 20 0 4.37 +169 197 3.785 4.37 +70 97 1.4 4.37 +10 30 0 4.375 +180 39 3.865 4.38 +78 111 2.455 4.385 +62 192 1.97 4.395 +62 132 3.27 4.395 +10 138 2.425 4.395 +12 60 3.345 4.395 +2 44 3.205 4.4 +54 87 0.74 4.405 +85 163 3.53 4.41 +48 47 0 4.415 +49 30 1.14 4.415 +70 118 2.4 4.415 +41 217 0.52 4.415 +81 77 3.16 4.415 +218 71 3.38 4.42 +6 38 0 4.42 +92 217 3.725 4.42 +70 169 3.875 4.42 +73 56 3.895 4.425 +218 205 3.21 4.43 +44 121 2.35 4.43 +78 65 0 4.435 +50 177 3.38 4.435 +131 85 3.79 4.435 +27 192 3.455 4.44 +78 67 1.985 4.445 +12 73 3.335 4.445 +18 137 0.045 4.45 +44 56 3.025 4.45 +70 114 1.455 4.455 +44 60 0 4.46 +17 21 0 4.465 +169 204 2.7 4.47 +180 66 2.485 4.475 +175 77 3.115 4.475 +91 223 3.835 4.475 +53 137 0.695 4.475 +12 183 1.355 4.48 +27 165 3.385 4.48 +16 20 2.055 4.495 +78 210 2.185 4.5 +8 178 0.84 4.5 +28 89 3.45 4.5 +41 28 3.995 4.5 +218 175 3.25 4.505 +32 189 0.065 4.505 +51 195 2.22 4.505 +180 43 0.195 4.51 +16 29 0 4.51 +51 207 3 4.51 +50 161 0 4.51 +169 206 0.45 4.51 +180 177 0 4.515 +16 90 2.62 4.515 +93 85 3.615 4.515 +32 129 2.165 4.515 +32 90 0.18 4.515 +70 68 0.995 4.52 +57 31 2.89 4.525 +70 86 1.925 4.525 +70 83 0 4.535 +18 132 0 4.54 +93 90 0 4.54 +173 60 1.355 4.545 +180 47 0 4.55 +175 161 0 4.55 +44 72 3.735 4.55 +91 240 3.85 4.55 +70 121 2.41 4.55 +91 162 3.985 4.555 +51 87 2.97 4.555 +31 189 2.46 4.555 +54 70 3.7 4.555 +180 35 0 4.56 +49 21 3.95 4.56 +59 170 3.855 4.565 +90 52 2.16 4.565 +42 121 3.415 4.565 +60 170 3.265 4.57 +70 36 1.485 4.57 +21 63 4.04 4.57 +175 162 2.935 4.575 +32 143 0 4.575 +36 66 0 4.575 +180 77 4.035 4.58 +38 135 3.13 4.58 +8 36 2.86 4.585 +73 55 0 4.585 +73 118 3.25 4.585 +7 73 0.935 4.585 +32 139 0 4.585 +38 27 3.22 4.585 +169 87 1.795 4.585 +17 36 2.86 4.595 +55 83 4.035 4.595 +91 125 0 4.595 +218 90 3.88 4.6 +36 83 3.96 4.6 +41 39 0 4.6 +16 36 3.52 4.605 +18 40 1.36 4.605 +93 3 3.91 4.605 +31 59 4.005 4.605 +19 63 3.21 4.605 +78 95 0 4.62 +32 52 2.23 4.62 +180 17 3.19 4.625 +91 79 0 4.625 +70 88 0 4.625 +21 132 4.12 4.625 +48 3 1.63 4.63 +48 50 2.455 4.63 +171 87 3.32 4.635 +46 190 0 4.64 +54 181 3.995 4.64 +78 68 0 4.645 +60 206 3.245 4.645 +8 37 0 4.65 +175 96 0 4.65 +30 192 3.145 4.65 +19 131 3.485 4.655 +59 57 0 4.66 +175 237 0.07 4.665 +81 85 0 4.665 +81 225 1.66 4.665 +8 78 4.055 4.67 +25 46 2.2 4.67 +91 83 3.91 4.67 +54 132 3.61 4.67 +54 168 2.99 4.67 +78 72 3.32 4.675 +171 203 0 4.675 +81 195 0 4.675 +52 177 2.75 4.675 +81 207 1.585 4.68 +16 33 0 4.685 +7 188 1.425 4.685 +89 217 2.54 4.685 +81 240 3.555 4.685 +173 206 4.115 4.69 +41 92 3.58 4.69 +8 87 4.165 4.695 +59 171 3.855 4.695 +59 206 3.965 4.695 +58 60 3.08 4.695 +89 122 0 4.695 +51 79 4.06 4.695 +78 79 0 4.7 +89 102 4.19 4.7 +51 114 3.93 4.7 +173 45 3.27 4.7 +34 44 3.09 4.71 +54 155 3.58 4.71 +86 120 0.93 4.71 +205 233 0.125 4.715 +89 218 0.35 4.715 +49 143 3.895 4.715 +50 225 4.15 4.72 +173 59 2.455 4.72 +81 122 3.935 4.72 +17 18 2.545 4.725 +175 164 0 4.725 +8 18 3.14 4.73 +7 190 4.225 4.73 +51 225 3.02 4.73 +81 96 2.55 4.73 +175 51 1.25 4.735 +91 119 0 4.735 +54 134 1.81 4.735 +173 63 0 4.735 +27 60 3.38 4.74 +18 28 3.375 4.74 +34 48 1.875 4.74 +91 110 0 4.74 +51 162 0.61 4.74 +169 181 3.84 4.74 +52 194 1.36 4.74 +92 233 0 4.745 +53 70 3.565 4.745 +41 218 3.085 4.745 +52 168 3.01 4.75 +171 122 2.68 4.76 +33 45 0 4.765 +50 87 3.61 4.765 +49 131 0 4.775 +7 10 1.59 4.78 +44 85 3.9 4.78 +62 162 0.505 4.785 +73 220 0 4.79 +12 188 0.555 4.795 +86 114 2.42 4.795 +170 191 3.83 4.8 +180 20 3.955 4.805 +38 24 0 4.805 +92 22 4.13 4.81 +18 24 0 4.815 +18 163 0.67 4.815 +175 63 0 4.815 +175 84 1.91 4.815 +205 164 2.735 4.815 +40 44 3.045 4.815 +48 96 4.26 4.82 +86 233 0 4.825 +205 174 1.14 4.825 +21 10 3.73 4.825 +170 166 0 4.83 +93 110 3.845 4.83 +70 117 0 4.83 +56 172 3.99 4.835 +50 194 3.195 4.835 +16 19 3.725 4.84 +7 28 1.4 4.84 +56 204 3.16 4.84 +91 121 0 4.845 +173 174 0 4.845 +25 59 3.995 4.855 +41 59 0 4.855 +37 215 3.925 4.86 +56 168 0 4.865 +31 90 3.25 4.865 +81 237 2.845 4.865 +8 21 0 4.875 +25 190 3.905 4.88 +30 140 4.215 4.88 +205 128 0.2 4.88 +45 224 4.285 4.88 +62 163 0 4.885 +17 53 2.995 4.885 +56 130 4.29 4.885 +50 162 0 4.885 +173 140 3.955 4.885 +7 89 2.405 4.89 +42 54 2.53 4.89 +62 161 0 4.895 +60 91 3.15 4.9 +5 44 3.39 4.9 +18 165 4.3 4.91 +92 76 0 4.91 +37 71 3.205 4.91 +21 27 2.605 4.91 +66 79 1.385 4.91 +66 211 3.88 4.91 +170 163 3.98 4.915 +180 40 3.665 4.915 +25 89 3.815 4.92 +36 189 4.42 4.92 +62 193 4.405 4.93 +59 76 0 4.93 +38 44 0 4.93 +56 163 0 4.93 +37 241 3.635 4.93 +66 84 1.54 4.935 +30 163 2.495 4.94 +167 168 0 4.94 +205 135 4.375 4.945 +57 188 1.73 4.945 +37 245 3.995 4.945 +29 90 3.385 4.945 +86 249 3.065 4.95 +29 171 4.33 4.95 +8 60 4.285 4.96 +36 163 3.95 4.96 +64 219 3.665 4.965 +85 68 0.915 4.965 +50 168 3 4.965 +25 38 0 4.975 +51 68 1.02 4.975 +21 151 3.735 4.985 +10 188 3.72 4.99 +46 64 4.14 4.99 +55 82 4.045 4.99 +31 27 0 4.99 +30 255 3.88 4.995 +33 70 4.395 4.995 +31 28 2.215 4.995 +48 193 4.445 5 +17 133 0 0.5 +92 231 0 0.505 +114 86 0 0.505 +79 255 0 0.51 +89 197 0 0.51 +199 227 0 0.52 +79 242 0 0.52 +117 133 0 0.52 +92 236 0 0.525 +92 117 0 0.53 +121 21 0 0.53 +107 150 0 0.535 +128 137 0 0.545 +107 14 0 0.545 +6 150 0 0.545 +127 1 0 0.55 +97 125 0 0.55 +123 61 0.045 0.555 +98 111 0 0.56 +98 14 0 0.56 +199 91 0 0.565 +80 126 0 0.565 +98 6 0 0.57 +113 1 0 0.575 +229 241 0 0.58 +102 2 0 0.58 +128 28 0 0.585 +197 92 0 0.585 +112 97 0 0.585 +114 230 0 0.585 +119 2 0 0.59 +84 228 0 0.595 +17 22 0.06 0.595 +80 122 0 0.6 +195 215 0 0.605 +96 116 0 0.61 +6 37 0 0.61 +119 19 0 0.61 +128 228 0 0.615 +83 127 0 0.615 +92 229 0 0.615 +110 1 0 0.615 +114 130 0 0.625 +76 88 0 0.63 +98 18 0 0.63 +97 253 0 0.635 +100 120 0 0.635 +118 133 0 0.635 +71 9 0.135 0.64 +68 193 0.09 0.645 +97 158 0 0.645 +80 127 0 0.65 +83 207 0 0.65 +97 5 0 0.65 +126 14 0 0.655 +95 14 0.035 0.655 +114 133 0 0.655 +119 232 0.06 0.655 +104 152 0 0.66 +13 27 0 0.66 +70 105 0 0.665 +84 238 0 0.665 +227 141 0.095 0.665 +21 1 0 0.67 +100 8 0 0.67 +127 227 0 0.675 +113 101 0 0.675 +225 255 0 0.675 +9 29 0 0.68 +106 126 0 0.68 +115 31 0 0.68 +233 250 0.065 0.685 +83 200 0.07 0.685 +84 17 0.155 0.685 +84 120 0 0.685 +98 127 0 0.685 +121 9 0 0.685 +120 20 0 0.685 +128 251 0.05 0.69 +100 101 0 0.69 +123 239 0.18 0.69 +95 115 0 0.695 +26 54 0 0.7 +95 107 0.115 0.7 +110 2 0 0.7 +30 130 0 0.71 +121 104 0 0.71 +95 111 0 0.715 +113 229 0 0.72 +26 57 0 0.725 +113 21 0 0.725 +231 129 0.13 0.725 +100 21 0 0.73 +110 115 0 0.73 +68 195 0.205 0.735 +84 30 0.09 0.735 +231 243 0 0.735 +30 238 0 0.74 +95 29 0.055 0.74 +100 117 0 0.74 +118 245 0.05 0.74 +26 12 0 0.745 +91 235 0 0.745 +85 113 0 0.745 +95 98 0 0.75 +100 148 0 0.75 +6 26 0.25 0.75 +117 17 0 0.755 +117 23 0.185 0.755 +227 143 0 0.76 +6 18 0 0.765 +233 245 0 0.77 +233 253 0.08 0.77 +85 193 0 0.77 +98 116 0 0.775 +106 29 0 0.775 +125 14 0 0.78 +30 4 0 0.78 +100 5 0 0.785 +6 231 0.215 0.785 +99 158 0 0.79 +87 195 0 0.79 +66 99 0.1 0.79 +98 110 0 0.795 +120 130 0 0.795 +127 4 0 0.8 +87 231 0 0.8 +124 23 0 0.8 +100 18 0 0.8 +6 124 0 0.8 +233 108 0.21 0.805 +9 14 0.2 0.805 +118 6 0 0.805 +80 94 0 0.81 +104 4 0.175 0.81 +127 18 0 0.815 +105 21 0.1 0.815 +126 112 0 0.82 +80 92 0 0.82 +84 229 0 0.82 +227 149 0 0.82 +87 230 0.225 0.82 +92 108 0 0.82 +110 15 0.095 0.82 +127 99 0 0.825 +99 105 0.145 0.825 +98 17 0 0.825 +97 145 0.315 0.83 +22 130 0 0.83 +91 201 0 0.835 +102 248 0 0.835 +104 150 0 0.835 +117 103 0 0.835 +68 101 0 0.845 +98 84 0 0.845 +102 5 0 0.845 +115 239 0.165 0.85 +237 255 0 0.85 +80 96 0 0.855 +83 102 0 0.855 +227 132 0 0.855 +91 124 0 0.855 +72 105 0 0.86 +17 24 0 0.86 +83 205 0.145 0.865 +9 110 0.255 0.865 +9 125 0.21 0.865 +102 99 0 0.865 +88 204 0 0.87 +96 225 0.32 0.87 +100 4 0 0.87 +100 29 0 0.87 +6 24 0 0.87 +116 132 0 0.87 +117 84 0 0.87 +6 27 0 0.875 +102 114 0 0.875 +110 99 0 0.875 +68 205 0.28 0.88 +199 234 0 0.88 +199 247 0.245 0.88 +102 115 0 0.88 +105 23 0.38 0.88 +71 103 0 0.885 +68 85 0 0.885 +201 219 0 0.885 +199 236 0 0.885 +110 116 0 0.885 +141 62 0 0.885 +125 239 0 0.89 +122 10 0 0.89 +66 101 0 0.89 +127 15 0 0.895 +201 208 0 0.895 +227 145 0 0.895 +91 233 0 0.895 +116 22 0.11 0.895 +116 231 0.12 0.9 +26 173 0 0.905 +101 150 0 0.91 +97 84 0.22 0.91 +201 215 0 0.915 +17 131 0 0.915 +229 239 0.215 0.92 +6 42 0 0.92 +117 18 0 0.925 +92 249 0.05 0.93 +13 153 0 0.93 +91 118 0 0.935 +100 158 0 0.935 +104 1 0 0.935 +108 231 0.07 0.935 +108 128 0 0.935 +120 131 0 0.935 +128 144 0 0.94 +71 252 0 0.945 +91 108 0 0.945 +71 107 0 0.955 +84 227 0 0.955 +77 97 0 0.955 +72 121 0 0.96 +80 97 0 0.96 +98 1 0 0.96 +98 21 0 0.96 +110 30 0 0.965 +119 133 0 0.965 +119 8 0 0.97 +71 91 0 0.975 +88 196 0.235 0.975 +117 5 0 0.975 +119 18 0 0.975 +22 136 0 0.975 +229 211 0 0.98 +121 10 0 0.98 +118 226 0 0.98 +71 248 0 0.99 +71 108 0 0.99 +6 28 0 0.995 +79 84 0.34 1 +6 53 0 1 +30 16 0.4 1.005 +123 240 0.4 1.005 +2 30 0 1.005 +96 112 0 1.01 +84 110 0 1.015 +30 131 0 1.015 +13 25 0.46 1.015 +124 240 0.22 1.015 +114 101 0.48 1.015 +79 96 0.08 1.02 +227 238 0 1.02 +6 57 0 1.02 +106 154 0 1.02 +17 141 0 1.02 +17 61 0 1.02 +229 121 0.125 1.025 +79 112 0 1.025 +121 6 0 1.025 +72 246 0.43 1.03 +229 249 0 1.03 +101 8 0.405 1.03 +79 98 0 1.03 +99 7 0.175 1.03 +100 15 0 1.035 +17 34 0 1.035 +6 10 0 1.04 +87 108 0 1.045 +98 113 0 1.045 +102 21 0 1.045 +112 124 0.49 1.045 +83 101 0 1.05 +6 154 0 1.05 +113 120 0 1.05 +126 227 0 1.055 +99 148 0 1.055 +13 41 0.28 1.055 +17 49 0 1.055 +68 116 0.165 1.06 +95 30 0.055 1.06 +114 196 0 1.06 +2 38 0.475 1.06 +128 157 0.115 1.065 +29 174 0.26 1.065 +71 250 0 1.065 +99 150 0 1.065 +117 116 0 1.07 +17 161 0 1.07 +6 112 0.28 1.075 +6 123 0 1.075 +126 143 0.135 1.08 +76 112 0 1.085 +22 19 0 1.085 +123 138 0.105 1.085 +17 50 0 1.085 +124 10 0 1.09 +104 12 0 1.09 +121 231 0 1.09 +227 239 0 1.095 +100 30 0 1.095 +100 20 0.48 1.095 +17 143 0 1.095 +83 227 0 1.1 +118 21 0 1.105 +104 25 0 1.11 +233 219 0 1.115 +26 31 0 1.115 +95 112 0 1.115 +17 62 0 1.115 +127 129 0 1.12 +233 251 0 1.12 +99 4 0 1.12 +95 123 0 1.12 +123 231 0 1.12 +120 129 0 1.12 +117 113 0 1.12 +72 119 0 1.125 +76 95 0.46 1.13 +237 228 0 1.13 +88 116 0 1.13 +30 227 0 1.13 +100 3 0 1.13 +6 19 0 1.13 +102 103 0 1.13 +68 96 0 1.135 +126 31 0.535 1.135 +22 131 0 1.135 +17 32 0 1.135 +72 76 0 1.14 +99 15 0 1.14 +95 121 0.5 1.14 +72 89 0 1.145 +108 154 0 1.145 +95 203 0.34 1.15 +102 252 0 1.15 +84 128 0.135 1.155 +225 141 0.215 1.155 +95 92 0.455 1.155 +120 19 0 1.155 +126 129 0 1.16 +76 109 0 1.16 +124 251 0.21 1.16 +114 30 0 1.16 +91 84 0.61 1.17 +122 138 0 1.17 +111 160 0 1.17 +111 11 0 1.17 +229 215 0 1.18 +2 148 0 1.18 +127 143 0 1.195 +122 251 0.24 1.195 +121 29 0.6 1.195 +113 129 0 1.195 +114 200 0 1.195 +233 22 0.65 1.2 +225 145 0 1.2 +30 14 0 1.2 +5 12 0.525 1.2 +91 68 0.63 1.205 +120 8 0.38 1.21 +105 7 0.04 1.21 +96 124 0.42 1.215 +116 130 0 1.215 +118 125 0.545 1.215 +95 122 0 1.22 +120 134 0 1.22 +26 133 0.36 1.225 +89 88 0 1.23 +95 128 0 1.23 +17 46 0 1.23 +127 27 0.685 1.235 +76 123 0 1.235 +22 139 0 1.235 +110 10 0 1.235 +110 29 0 1.235 +119 27 0.475 1.235 +110 14 0 1.245 +126 229 0.735 1.25 +92 208 0 1.25 +239 232 0.57 1.25 +126 196 0.63 1.26 +100 16 0 1.26 +120 28 0.375 1.26 +116 238 0 1.26 +68 115 0 1.265 +205 219 0.745 1.265 +199 227 0.695 1.27 +115 232 0.715 1.27 +110 16 0.165 1.275 +22 232 0 1.28 +68 244 0 1.285 +116 232 0.515 1.285 +68 127 0 1.29 +121 127 0.685 1.29 +114 129 0 1.29 +89 199 0 1.295 +91 113 0.645 1.295 +17 15 0 1.295 +100 104 0 1.295 +122 231 0 1.295 +95 106 0 1.3 +117 225 0.34 1.3 +80 95 0 1.3 +126 228 0 1.31 +102 88 0 1.31 +122 113 0.72 1.31 +123 113 0.765 1.315 +120 123 0.65 1.315 +113 29 0.33 1.315 +122 207 0 1.32 +239 138 0 1.32 +126 115 0 1.325 +22 10 0.44 1.325 +22 169 0.675 1.325 +225 245 0 1.325 +30 115 0 1.325 +102 233 0.645 1.325 +121 26 0 1.325 +68 125 0 1.33 +121 112 0 1.335 +203 84 0.245 1.335 +83 116 0 1.34 +119 10 0 1.34 +111 154 0 1.34 +237 116 0 1.34 +127 26 0.56 1.345 +118 249 0.275 1.345 +127 141 0 1.35 +22 235 0.67 1.35 +113 14 0 1.35 +237 138 0 1.35 +127 25 0.555 1.355 +112 113 0 1.355 +87 229 0 1.365 +124 139 0.3 1.365 +102 77 0.825 1.365 +92 123 0 1.375 +121 107 0 1.375 +205 225 0 1.38 +77 250 0.7 1.38 +239 132 0 1.38 +76 125 0 1.385 +111 46 0.78 1.395 +237 219 0 1.395 +68 17 0.635 1.4 +87 197 0.735 1.4 +128 238 0 1.405 +76 122 0 1.405 +100 1 0 1.405 +97 243 0 1.405 +101 107 0.445 1.41 +100 256 0.585 1.41 +108 57 0.775 1.41 +110 255 0.155 1.41 +80 255 0.51 1.41 +22 165 0 1.415 +95 116 0 1.415 +22 57 0 1.42 +89 233 0 1.42 +89 203 0 1.42 +106 12 0.81 1.42 +201 249 0 1.42 +114 193 0 1.425 +118 108 0 1.425 +205 238 0 1.43 +88 193 0 1.43 +118 123 0 1.43 +25 59 0.755 1.43 +125 105 0.465 1.435 +104 113 0 1.44 +118 26 0.32 1.44 +92 234 0 1.445 +104 116 0.18 1.445 +122 249 0.26 1.445 +97 14 0.895 1.445 +126 142 0.635 1.45 +17 29 0 1.45 +114 232 0 1.45 +117 2 0 1.45 +83 104 0 1.455 +118 227 0 1.455 +97 238 0.52 1.455 +95 109 0 1.46 +116 120 0 1.46 +111 148 0 1.465 +87 104 0 1.47 +237 225 0 1.47 +122 202 0.26 1.475 +98 149 0.97 1.48 +117 21 0 1.48 +119 236 0.24 1.48 +76 118 0 1.485 +92 202 0 1.49 +96 202 0.435 1.49 +112 27 0 1.49 +195 116 0 1.495 +92 230 0 1.495 +114 228 0 1.495 +97 245 0.755 1.495 +231 136 0.38 1.5 +91 203 0 1.5 +126 29 0 1.505 +229 130 0 1.505 +100 255 0.27 1.505 +121 230 0.17 1.51 +112 26 0 1.51 +229 18 0 1.515 +231 150 0.495 1.515 +124 135 0.865 1.515 +6 37 0.64 1.515 +104 229 0.865 1.515 +108 5 0.625 1.515 +108 21 0 1.515 +118 104 0 1.515 +111 4 0 1.515 +25 141 0.39 1.515 +119 24 0 1.52 +120 235 1.025 1.525 +137 249 0.875 1.53 +205 195 0.125 1.53 +227 136 0 1.535 +91 128 0 1.535 +116 229 0 1.535 +195 208 0.285 1.54 +128 225 0 1.545 +97 2 0 1.545 +76 246 0 1.55 +116 24 0.54 1.55 +118 115 0 1.55 +195 245 0 1.555 +88 104 0 1.56 +108 27 0 1.56 +108 8 0.725 1.565 +119 230 1.05 1.565 +119 29 0.615 1.565 +239 243 0 1.565 +99 116 0.49 1.57 +92 128 0 1.575 +118 232 0 1.575 +111 16 0 1.575 +239 32 0.98 1.58 +137 130 0.925 1.585 +227 243 0 1.585 +91 233 1.08 1.585 +17 10 0.4 1.585 +98 248 0.655 1.585 +121 128 0 1.585 +119 128 0.775 1.585 +126 234 0 1.59 +72 146 1.025 1.59 +229 129 0 1.59 +99 31 1.035 1.595 +91 112 0 1.595 +97 5 0.865 1.595 +91 237 0 1.6 +96 234 0 1.6 +127 32 0 1.605 +195 211 0 1.605 +118 137 0 1.605 +26 142 0 1.61 +83 199 0 1.61 +17 30 0 1.61 +17 129 0 1.61 +116 131 0 1.61 +26 157 0.07 1.615 +117 105 0 1.615 +94 122 0.585 1.62 +88 194 0 1.62 +111 104 0.94 1.62 +68 99 0 1.625 +115 228 0.825 1.625 +119 112 0.495 1.625 +119 235 0.325 1.625 +97 1 0 1.625 +72 17 1.1 1.63 +88 232 0.39 1.635 +108 137 0.13 1.635 +121 235 0 1.635 +31 63 0 1.635 +92 235 0 1.64 +195 191 0.94 1.645 +71 86 1.005 1.65 +72 104 0 1.65 +229 21 0.17 1.65 +124 138 0 1.65 +87 233 0 1.655 +227 135 0.92 1.66 +121 203 0 1.66 +111 31 0.46 1.665 +111 3 0 1.665 +128 137 1.035 1.67 +26 155 0.05 1.67 +229 248 0.33 1.675 +84 208 0 1.68 +92 204 0 1.68 +26 240 0 1.685 +86 122 0.93 1.69 +114 199 0 1.69 +114 226 0 1.69 +205 113 0.305 1.695 +115 239 1.175 1.695 +119 12 0 1.695 +31 2 0 1.695 +120 228 1.085 1.7 +93 84 0.405 1.7 +26 144 0 1.705 +100 123 1.125 1.705 +97 13 1.015 1.705 +31 15 0 1.705 +233 137 0 1.71 +126 226 0.66 1.715 +72 113 0 1.715 +26 143 0 1.715 +17 16 0 1.715 +115 31 0.86 1.715 +207 255 1.21 1.715 +77 113 1.13 1.72 +84 191 0.905 1.725 +100 128 0.56 1.725 +112 30 0 1.725 +117 113 1.22 1.725 +17 128 0 1.73 +237 249 0 1.735 +114 197 0 1.735 +26 239 0.525 1.745 +227 165 1.015 1.745 +91 100 0.715 1.745 +225 30 0 1.745 +6 149 0.855 1.745 +26 58 0 1.75 +100 107 0.615 1.75 +100 106 0.68 1.75 +128 129 0 1.755 +229 243 0 1.755 +99 7 1.105 1.755 +6 3 0.5 1.755 +116 10 1.24 1.755 +5 15 0.995 1.755 +80 100 0.705 1.755 +71 6 0.295 1.76 +225 243 0 1.76 +117 231 0 1.765 +100 96 0.915 1.775 +76 107 0 1.78 +123 20 1.145 1.78 +106 26 0.955 1.78 +114 231 0 1.78 +102 124 0 1.785 +123 236 0.235 1.785 +123 139 0 1.785 +119 110 0.94 1.785 +96 207 0 1.79 +102 125 0.505 1.79 +108 38 0.86 1.79 +120 226 0 1.79 +112 160 0 1.79 +93 100 1.255 1.79 +91 127 0.355 1.795 +106 29 0.81 1.795 +94 110 0.515 1.8 +96 113 0 1.81 +233 247 0 1.815 +96 84 0 1.815 +25 134 1.14 1.815 +5 33 0 1.825 +126 17 0 1.835 +120 236 0.535 1.84 +104 231 1.205 1.85 +77 127 1.135 1.85 +112 20 1 1.85 +108 42 0.755 1.855 +115 6 0 1.855 +115 231 0.11 1.86 +227 161 0.555 1.865 +6 150 0.695 1.865 +77 97 1.025 1.865 +22 12 0 1.87 +118 236 0 1.87 +119 231 0 1.87 +5 14 0.165 1.87 +237 110 1.355 1.875 +77 107 0.79 1.875 +83 193 0 1.88 +92 110 1.18 1.88 +205 196 0 1.885 +87 101 0 1.885 +17 20 0 1.885 +6 53 1.275 1.885 +117 146 1.11 1.885 +79 98 1.2 1.895 +22 7 1.115 1.895 +123 116 1.36 1.895 +237 113 0.54 1.9 +225 20 0.815 1.9 +233 220 0.425 1.905 +123 137 0 1.905 +5 148 0 1.905 +133 150 0.11 1.91 +108 26 0 1.91 +25 169 0 1.91 +98 243 0.705 1.915 +124 134 0 1.915 +239 227 1.215 1.92 +120 232 0 1.92 +104 9 1.26 1.925 +84 238 1.395 1.93 +98 113 1.135 1.935 +124 247 0.055 1.935 +114 126 0 1.935 +126 238 0 1.945 +76 110 0.515 1.96 +83 197 0 1.96 +205 221 0 1.965 +87 218 1.235 1.965 +17 120 0 1.965 +68 82 0 1.97 +133 153 0.36 1.97 +25 139 0 1.97 +124 24 0.625 1.975 +124 249 0.035 1.98 +122 240 0 1.98 +95 195 0.975 1.99 +95 88 1.13 1.99 +124 141 0 1.99 +117 82 0 1.99 +5 53 1.39 1.99 +25 236 0.245 1.99 +82 113 0 1.99 +71 146 0.77 1.995 +117 6 0 1.995 +118 125 1.47 2 +26 169 0 2.005 +122 30 0 2.005 +114 239 0 2.005 +22 232 1.4 2.01 +99 248 0 2.015 +87 106 0 2.015 +17 8 0 2.015 +128 143 0 2.02 +106 120 1.335 2.02 +31 129 0 2.02 +229 249 1.41 2.025 +227 236 0.925 2.025 +68 93 1.41 2.03 +195 239 0.27 2.03 +106 22 0.89 2.03 +106 10 0 2.03 +118 25 0 2.03 +72 119 1.355 2.035 +6 120 0 2.035 +133 49 1.46 2.04 +22 134 0 2.04 +67 146 0.07 2.04 +128 20 0.785 2.045 +126 195 0 2.045 +71 106 0 2.05 +108 120 0 2.055 +119 8 1.48 2.055 +122 236 0 2.06 +126 82 0.46 2.065 +25 235 0 2.065 +121 229 1.52 2.07 +128 61 1.5 2.075 +233 25 1.4 2.08 +84 17 1.515 2.08 +95 82 0.39 2.08 +31 18 0 2.08 +101 106 0.555 2.095 +133 161 0.545 2.095 +99 6 0 2.095 +227 142 0 2.095 +17 239 0 2.095 +84 227 1.57 2.1 +17 227 0 2.1 +19 62 0 2.105 +128 113 0.275 2.11 +128 116 0 2.11 +122 10 1.45 2.11 +116 62 1.39 2.11 +82 120 1.205 2.11 +121 237 0 2.115 +110 128 0 2.115 +116 144 1.4 2.115 +79 256 0.63 2.12 +227 49 1.29 2.12 +102 110 0.77 2.12 +112 45 0.935 2.12 +116 29 0 2.12 +2 15 0 2.12 +87 93 0.255 2.125 +96 208 0 2.125 +128 144 1.02 2.135 +83 229 0 2.135 +99 103 0 2.135 +95 17 0.29 2.14 +116 161 0.585 2.14 +26 125 0 2.145 +83 17 0.955 2.145 +67 244 0 2.145 +239 18 0 2.15 +99 149 0 2.15 +225 130 0 2.15 +122 231 1.46 2.15 +68 126 0 2.16 +71 246 0 2.165 +125 10 0 2.165 +84 229 0.85 2.17 +114 82 0 2.17 +125 235 0 2.175 +83 118 0 2.175 +127 10 0 2.185 +113 21 1.525 2.185 +88 231 0 2.19 +237 116 1.37 2.19 +121 199 0 2.19 +72 101 0 2.195 +84 86 1.475 2.195 +123 42 1.095 2.195 +201 229 1.435 2.2 +84 197 0 2.2 +22 50 0 2.2 +127 122 0 2.205 +237 127 0 2.205 +114 121 1.35 2.205 +79 244 0 2.21 +2 24 0 2.21 +85 92 0 2.21 +85 98 0 2.22 +84 120 1.53 2.225 +14 116 0 2.225 +96 235 0 2.23 +104 24 0.495 2.235 +233 231 0 2.24 +26 53 1.675 2.24 +22 235 1.455 2.24 +2 39 1.6 2.24 +68 117 0 2.25 +95 237 0 2.25 +110 122 0 2.25 +87 96 0.855 2.255 +100 31 0 2.26 +97 255 0 2.26 +30 25 1.01 2.26 +94 239 1.095 2.26 +26 23 0 2.265 +99 227 1.245 2.265 +239 225 0 2.27 +31 235 1.6 2.27 +99 22 1.31 2.27 +26 57 1.075 2.275 +237 31 1.57 2.275 +124 125 0 2.275 +122 137 0 2.275 +94 240 1.455 2.275 +26 21 1.69 2.28 +100 239 1.23 2.28 +121 110 0.545 2.28 +119 125 0.47 2.28 +2 46 0 2.28 +26 32 0 2.285 +239 19 1.24 2.285 +229 122 1.55 2.29 +125 25 0.305 2.29 +114 86 0.78 2.29 +115 137 1.71 2.29 +195 231 0 2.31 +14 30 1.795 2.31 +14 36 0.515 2.31 +100 18 1.79 2.31 +113 227 0 2.31 +97 84 1.55 2.31 +128 32 0 2.315 +225 137 1.795 2.315 +93 110 0.49 2.315 +124 232 0 2.32 +193 253 1.315 2.32 +127 128 0 2.325 +119 229 0 2.325 +205 207 0 2.33 +117 201 1.445 2.33 +121 6 1.34 2.335 +116 141 0 2.335 +116 232 1.735 2.345 +127 15 1.685 2.35 +22 236 0 2.35 +116 139 1.42 2.35 +79 126 1.58 2.355 +127 29 0 2.355 +26 30 0 2.355 +95 205 0 2.355 +98 225 1.775 2.355 +104 152 1.39 2.355 +97 225 1.765 2.355 +193 234 1.18 2.355 +117 96 1.755 2.36 +88 201 0 2.365 +30 235 0 2.365 +2 148 1.355 2.365 +201 124 1.375 2.375 +76 93 0 2.375 +99 18 0.935 2.375 +14 45 0 2.375 +121 125 0 2.375 +123 32 0 2.385 +14 48 1.375 2.39 +121 201 0.175 2.39 +195 227 0 2.395 +118 231 0 2.395 +79 114 1.545 2.4 +193 228 1.605 2.4 +26 232 1.58 2.4 +195 115 0.225 2.405 +96 203 0 2.415 +96 102 1.23 2.415 +96 240 0.355 2.415 +14 12 1.755 2.425 +89 98 1.845 2.43 +22 34 1.52 2.435 +89 216 1.805 2.435 +127 123 0 2.44 +96 124 1.46 2.44 +126 100 0 2.445 +17 225 0 2.445 +207 197 0.475 2.445 +126 110 0 2.45 +207 241 0 2.45 +195 133 1.595 2.46 +233 125 0.125 2.465 +17 31 0 2.465 +108 7 0 2.465 +119 7 1.55 2.47 +207 100 1.56 2.47 +83 111 1.72 2.475 +14 10 0 2.475 +83 98 0 2.49 +17 18 0 2.49 +225 24 1.37 2.495 +108 127 0.345 2.495 +76 245 1.875 2.5 +17 16 1.77 2.5 +107 155 1.895 2.5 +31 113 0.525 2.505 +91 105 0 2.51 +92 125 0 2.52 +121 112 1.865 2.52 +124 24 2.02 2.525 +124 27 0 2.525 +117 229 0 2.525 +83 110 2.015 2.53 +227 8 0.89 2.53 +193 222 1.915 2.535 +88 133 1.98 2.54 +199 133 1.95 2.54 +233 251 1.22 2.545 +125 29 0 2.545 +106 127 0 2.545 +117 195 0 2.555 +93 239 1.985 2.555 +92 80 1.785 2.56 +98 22 1.64 2.56 +207 253 0 2.56 +31 19 0 2.565 +121 77 0.83 2.57 +121 25 0 2.57 +118 93 1.58 2.57 +92 102 0 2.575 +225 30 2.03 2.575 +121 93 0 2.575 +98 21 1.995 2.58 +116 24 1.765 2.58 +117 91 1.16 2.585 +26 151 1.155 2.59 +116 130 1.42 2.59 +31 49 0 2.605 +113 133 1.635 2.61 +92 123 1.815 2.615 +101 115 0 2.62 +205 125 0 2.62 +122 104 1.72 2.62 +193 226 0 2.625 +91 250 0.79 2.625 +233 29 1.465 2.63 +127 228 2.04 2.635 +14 34 0.29 2.635 +123 235 0 2.635 +233 239 1.655 2.645 +96 109 2.035 2.645 +2 149 0.745 2.65 +95 67 1.8 2.655 +205 239 0.225 2.66 +124 23 0.855 2.66 +91 112 1.735 2.67 +114 102 1.875 2.675 +118 235 0 2.675 +207 243 0.58 2.675 +193 142 1.6 2.68 +100 120 1.655 2.68 +79 253 0.645 2.685 +193 195 0 2.69 +92 126 0.345 2.69 +115 8 0 2.695 +79 83 1.445 2.7 +233 22 1.39 2.7 +199 234 0.995 2.7 +71 83 0.51 2.705 +95 88 2.15 2.705 +207 206 2.075 2.715 +88 100 1.57 2.72 +77 92 0.88 2.72 +76 77 0 2.725 +108 42 2.13 2.725 +107 148 1.92 2.725 +233 141 0.74 2.73 +96 100 1.955 2.73 +127 21 2.235 2.735 +76 96 0 2.735 +113 240 1.32 2.735 +114 21 0 2.735 +193 221 0 2.74 +99 149 2.2 2.74 +225 21 1.235 2.74 +124 133 0 2.74 +114 244 1.635 2.74 +124 28 0 2.745 +108 46 2.075 2.745 +120 24 0 2.745 +76 109 1.23 2.75 +225 2 1.805 2.75 +119 10 1.415 2.75 +207 85 2.12 2.755 +207 208 0 2.755 +207 255 1.83 2.755 +101 3 1.96 2.76 +67 83 0 2.76 +122 29 0 2.765 +80 251 0.695 2.765 +126 234 2.145 2.77 +233 236 0 2.77 +115 49 1.465 2.775 +225 20 1.995 2.78 +84 226 0 2.785 +97 110 0 2.785 +5 178 0 2.785 +100 225 1.21 2.79 +96 119 1.03 2.795 +115 3 0.33 2.795 +115 24 0 2.795 +205 234 0 2.8 +22 57 1.49 2.8 +5 4 0 2.8 +237 236 0 2.8 +101 150 2.05 2.81 +227 165 2.04 2.82 +101 182 2.07 2.825 +123 27 0 2.825 +14 115 0 2.83 +237 219 2.115 2.83 +237 251 0 2.835 +86 205 2.19 2.84 +25 8 1.405 2.845 +227 50 0.6 2.845 +22 8 0 2.845 +22 7 2.005 2.845 +112 1 1.06 2.845 +76 107 2.04 2.85 +110 115 1.865 2.855 +114 124 1.14 2.86 +119 103 1.845 2.86 +129 248 1.495 2.86 +71 100 2.27 2.865 +84 100 0.135 2.865 +14 2 0 2.865 +86 122 1.965 2.865 +5 37 0 2.865 +99 34 1.455 2.87 +87 205 2.205 2.875 +110 1 1.685 2.875 +5 149 0 2.875 +115 50 0.66 2.88 +106 16 0.905 2.885 +129 120 2.255 2.885 +88 122 1.885 2.89 +121 96 0 2.895 +80 15 2.215 2.895 +121 128 1.82 2.9 +112 20 2.375 2.9 +229 140 2.055 2.91 +71 91 1.1 2.915 +115 30 2.015 2.915 +119 107 2.305 2.915 +67 100 1.005 2.915 +207 144 2.395 2.915 +122 26 0 2.92 +121 205 1.745 2.92 +101 153 1.725 2.925 +128 10 0 2.935 +227 248 2.19 2.935 +112 17 0 2.935 +119 16 1.975 2.94 +122 25 0 2.945 +227 130 0 2.95 +128 140 1.785 2.955 +117 6 2.415 2.955 +228 248 0.49 2.955 +122 141 0 2.96 +119 12 1.995 2.96 +195 223 0.695 2.97 +118 96 0.515 2.97 +97 13 1.715 2.97 +128 231 1.89 2.975 +17 20 1.985 2.975 +68 13 1.97 2.98 +227 20 0 2.98 +110 16 1.505 2.98 +117 80 1.785 2.98 +100 3 2.32 2.985 +108 103 0 2.985 +193 113 1.135 2.99 +99 102 1.645 2.99 +112 49 2.465 2.99 +61 131 2.39 2.99 +95 17 2.215 2.995 +117 25 2.27 2.995 +80 249 0.67 2.995 +17 101 2.425 3 +80 25 2.215 3 +113 30 0 3.005 +96 31 1.915 3.015 +115 131 2.37 3.015 +127 3 2.245 3.02 +14 3 0 3.02 +113 20 0.79 3.02 +114 110 2.125 3.02 +97 255 2.28 3.02 +110 17 0 3.025 +237 31 2.455 3.025 +29 58 0 3.025 +6 184 1.925 3.025 +128 137 1.78 3.03 +110 19 1.71 3.03 +117 100 2.265 3.035 +228 130 0 3.035 +68 17 1.505 3.04 +107 17 1.365 3.04 +102 103 1.51 3.045 +122 31 1.575 3.045 +127 129 2.185 3.05 +5 12 2.52 3.05 +127 104 2.33 3.055 +76 118 1.52 3.055 +104 3 0 3.055 +106 79 1.65 3.055 +106 109 0 3.055 +31 140 2.485 3.06 +110 4 1.92 3.06 +17 125 0 3.065 +100 104 1.77 3.065 +128 251 1.135 3.07 +83 164 2.445 3.07 +199 237 1.685 3.07 +110 31 0.095 3.07 +228 255 0 3.07 +79 17 1.345 3.075 +112 42 0.385 3.075 +72 76 1.24 3.08 +88 98 0 3.08 +117 242 0.525 3.08 +91 109 0 3.09 +102 156 2.295 3.09 +94 100 1.025 3.095 +233 229 0 3.095 +227 236 2.135 3.095 +110 99 1.89 3.1 +115 231 2.56 3.1 +128 16 2.34 3.105 +218 108 2.525 3.105 +83 118 2.33 3.105 +120 128 1.985 3.105 +112 11 0 3.105 +14 148 0 3.11 +126 212 2.45 3.12 +97 243 2.12 3.12 +22 236 2.475 3.125 +93 203 0 3.125 +94 164 1.145 3.13 +29 24 2.405 3.13 +114 17 0 3.13 +125 32 2.5 3.135 +96 203 2.58 3.135 +106 31 0.935 3.135 +85 113 2.125 3.135 +141 252 1.13 3.14 +118 98 1.67 3.14 +119 31 1.96 3.14 +79 14 2.27 3.145 +87 98 0 3.145 +122 120 0.94 3.145 +207 232 1.37 3.15 +5 1 0 3.15 +126 31 1.545 3.155 +233 93 1.88 3.155 +201 200 0 3.155 +79 112 1.505 3.16 +107 190 2.19 3.17 +9 186 1.435 3.175 +205 208 0 3.18 +104 116 2.605 3.18 +116 120 2.06 3.18 +118 115 2.545 3.185 +6 31 2.58 3.19 +199 115 2.535 3.19 +122 22 0.59 3.19 +98 17 1.01 3.195 +201 202 0 3.195 +61 50 1.275 3.2 +79 244 2.39 3.205 +116 132 0.99 3.205 +84 115 0 3.21 +106 6 0 3.21 +120 19 2.04 3.21 +141 158 0.28 3.215 +67 254 0 3.215 +97 254 0 3.215 +121 22 0.145 3.22 +116 50 0.645 3.22 +61 2 1.33 3.22 +233 197 0.825 3.225 +117 122 1.145 3.225 +126 203 0 3.23 +94 205 0 3.23 +106 14 1.855 3.23 +110 256 0 3.23 +72 242 0 3.235 +83 127 2.005 3.235 +14 149 0.91 3.235 +5 39 2.35 3.235 +233 202 2.71 3.24 +227 247 2.06 3.24 +225 127 0 3.24 +84 127 0 3.245 +9 44 0.74 3.25 +116 17 0 3.25 +228 230 2.35 3.25 +141 20 2.74 3.255 +207 20 2.4 3.26 +88 22 1.335 3.265 +108 156 0.29 3.265 +127 5 2.525 3.27 +92 203 0 3.27 +128 138 0 3.275 +225 22 1.395 3.275 +127 142 1.675 3.28 +199 128 1.95 3.28 +81 86 1.41 3.28 +110 15 1.795 3.285 +120 25 0 3.285 +100 149 2.775 3.295 +108 7 2.53 3.295 +127 30 0 3.3 +120 28 1.73 3.3 +193 239 0.295 3.305 +108 10 0 3.305 +120 23 0 3.305 +110 116 1.575 3.31 +120 18 0 3.31 +14 20 0 3.315 +6 10 1.345 3.315 +72 115 0 3.32 +79 254 0 3.325 +96 164 2.8 3.325 +116 16 2.51 3.325 +84 239 0 3.33 +87 197 2.8 3.33 +199 123 2.76 3.33 +67 245 0 3.33 +86 241 2.475 3.335 +229 131 2.835 3.34 +196 245 0 3.345 +99 3 0 3.345 +80 125 0 3.345 +227 131 0 3.35 +107 12 2.83 3.355 +19 131 2.075 3.355 +125 20 1.99 3.36 +225 97 2.65 3.36 +14 30 2.335 3.365 +199 104 2.535 3.37 +228 24 0.895 3.37 +110 154 2.36 3.375 +207 30 0.115 3.375 +106 29 2.005 3.385 +110 68 0 3.385 +118 203 0.3 3.385 +107 31 0.945 3.385 +127 20 0 3.395 +101 152 1.59 3.395 +199 22 1.865 3.395 +227 34 1.345 3.4 +14 42 0.535 3.4 +100 15 2.645 3.4 +67 99 0 3.4 +196 232 0.165 3.405 +22 140 0 3.405 +22 24 0 3.405 +141 143 0 3.405 +101 115 2.745 3.41 +91 107 0 3.41 +80 253 0.375 3.41 +128 27 0 3.415 +22 135 0 3.415 +141 16 2.515 3.415 +228 53 2.9 3.415 +71 245 0.75 3.42 +101 38 2.14 3.42 +99 119 1.445 3.42 +100 1 1.575 3.42 +106 239 1.945 3.42 +122 29 2.87 3.42 +101 156 1.625 3.425 +19 40 2.01 3.425 +104 53 1.35 3.425 +108 28 0 3.43 +107 156 0 3.43 +22 133 0 3.435 +141 135 2.84 3.435 +141 159 1.385 3.435 +117 216 0.56 3.435 +91 112 2.69 3.44 +80 6 1.425 3.44 +22 53 0 3.445 +118 29 2.885 3.445 +125 29 2.905 3.45 +141 155 2.625 3.45 +121 199 2.25 3.45 +113 5 2.925 3.45 +98 8 2.705 3.455 +107 239 2.925 3.455 +116 139 2.48 3.46 +80 13 0.525 3.46 +233 208 0 3.465 +196 237 2.775 3.465 +227 129 0 3.465 +141 62 2.45 3.465 +67 216 0 3.47 +207 227 2.72 3.47 +83 199 2.39 3.475 +115 38 2.44 3.475 +127 34 1.955 3.48 +125 16 1.575 3.48 +86 203 0 3.48 +121 216 1.385 3.48 +118 200 0 3.48 +86 124 1.365 3.485 +99 101 0 3.49 +115 8 2.945 3.49 +72 199 2.045 3.495 +87 124 0 3.495 +91 123 0 3.495 +225 21 2.785 3.495 +108 120 2.885 3.495 +115 4 0 3.495 +196 157 2.59 3.5 +9 58 2.68 3.5 +225 124 1.43 3.505 +225 87 2.245 3.51 +95 13 2.17 3.51 +99 1 0 3.515 +5 4 2.975 3.515 +6 29 2.24 3.52 +106 104 3.015 3.52 +119 115 0 3.52 +88 99 1.78 3.525 +116 157 1.41 3.525 +22 16 2.255 3.53 +100 61 2.1 3.53 +119 2 2.01 3.53 +79 72 1.105 3.535 +79 114 2.475 3.535 +6 155 1.975 3.535 +115 49 2.92 3.535 +207 133 1.52 3.535 +6 112 1.2 3.545 +119 21 0 3.545 +5 156 0 3.545 +193 221 2.795 3.55 +118 26 1.47 3.55 +107 251 0 3.55 +193 157 2.865 3.555 +101 114 1.245 3.555 +92 204 2.07 3.56 +92 123 2.705 3.56 +19 50 0 3.565 +6 251 2.905 3.565 +6 21 0 3.565 +123 21 2.94 3.565 +106 25 0 3.565 +47 67 1.36 3.565 +87 204 2.995 3.57 +104 29 2.42 3.57 +233 220 2.47 3.575 +239 27 2.82 3.575 +114 124 3.07 3.575 +119 137 0 3.575 +9 32 2.54 3.575 +14 128 3.075 3.58 +9 251 2.875 3.58 +195 145 2.685 3.585 +127 1 1.54 3.59 +126 30 0 3.59 +127 32 1.82 3.595 +102 23 1.735 3.595 +117 246 2.44 3.595 +117 21 2.12 3.595 +9 48 2.475 3.595 +84 88 0 3.6 +123 27 2.87 3.6 +95 88 2.735 3.605 +108 23 0 3.605 +76 252 3.025 3.61 +94 88 2.705 3.61 +108 12 0 3.61 +88 228 2.035 3.615 +104 108 0 3.615 +104 137 1.335 3.615 +107 128 3.1 3.615 +112 12 0 3.62 +22 57 2.935 3.625 +127 33 2.625 3.63 +102 91 0 3.63 +119 229 2.755 3.63 +123 137 1.95 3.635 +92 120 2.775 3.64 +115 61 2.075 3.64 +207 237 0 3.64 +99 227 2.82 3.645 +22 8 3.05 3.65 +107 25 1.77 3.65 +96 61 3.08 3.66 +100 5 2.45 3.66 +106 120 2.705 3.66 +228 245 2.395 3.66 +126 61 2.655 3.665 +108 11 0.26 3.665 +121 110 3.14 3.665 +92 124 0 3.67 +121 124 0 3.67 +14 12 2.82 3.68 +22 139 2.995 3.69 +225 241 2.755 3.69 +123 30 0 3.69 +110 13 0 3.69 +71 100 3.195 3.695 +233 253 2.985 3.7 +119 6 0 3.705 +9 125 2.585 3.705 +141 116 2.445 3.705 +95 109 1.765 3.71 +114 242 1.615 3.71 +84 226 2.9 3.715 +4 63 0 3.715 +227 19 0.485 3.72 +22 18 0 3.72 +79 244 3.215 3.725 +72 92 2.37 3.725 +84 116 0 3.725 +4 178 0.575 3.725 +95 242 3.17 3.73 +116 227 0 3.73 +116 240 0 3.73 +118 229 0 3.73 +107 119 2.985 3.73 +5 227 2.91 3.74 +199 234 3.2 3.74 +79 13 1.025 3.745 +121 123 0 3.745 +117 229 2.57 3.745 +5 108 2.635 3.745 +218 105 2.375 3.75 +126 123 0 3.755 +102 112 0.41 3.755 +112 22 2.675 3.755 +133 50 0 3.755 +128 116 2.665 3.76 +118 104 1.81 3.76 +141 256 3.18 3.76 +125 32 3.195 3.765 +101 153 3.065 3.765 +83 118 3.155 3.765 +121 105 0 3.765 +141 61 2.5 3.765 +80 98 2.44 3.77 +128 61 2.51 3.775 +79 67 0 3.78 +71 242 0 3.78 +95 67 3.075 3.78 +4 190 0.175 3.78 +193 83 2.025 3.785 +117 113 2.43 3.785 +97 19 3.06 3.785 +5 119 1.42 3.785 +72 84 0.2 3.79 +99 228 3.06 3.79 +199 241 1.35 3.79 +114 84 0 3.795 +114 226 3.065 3.795 +207 157 1.13 3.805 +102 120 0 3.81 +118 227 1.55 3.81 +119 28 0 3.81 +199 203 0 3.815 +225 118 1.7 3.82 +71 83 3.035 3.825 +77 109 0 3.825 +9 153 3.27 3.825 +35 71 0.665 3.83 +124 138 2.91 3.835 +218 109 0 3.84 +88 194 3.05 3.84 +114 125 2.5 3.84 +4 48 0.515 3.84 +122 120 3.275 3.845 +117 195 2.8 3.845 +71 120 0.955 3.85 +121 104 0.825 3.85 +96 228 3.315 3.855 +128 157 1.165 3.86 +99 125 2.62 3.86 +86 122 3.205 3.86 +117 2 2.23 3.86 +233 223 2.835 3.87 +97 244 0 3.87 +120 29 2.27 3.875 +97 118 3.165 3.875 +193 110 3.1 3.88 +195 227 2.745 3.88 +26 248 2.72 3.88 +97 119 2.745 3.88 +233 126 1.225 3.885 +218 193 3.37 3.885 +115 232 3.275 3.885 +117 201 3.18 3.89 +97 76 3.31 3.89 +126 145 2.415 3.9 +141 129 0 3.9 +121 101 0 3.9 +129 177 2.845 3.905 +233 215 0 3.91 +218 250 0 3.915 +26 232 2.44 3.915 +72 100 0.925 3.92 +196 145 2.455 3.925 +199 220 3.095 3.925 +22 7 2.985 3.925 +22 27 0 3.925 +14 48 2.825 3.925 +207 194 3.265 3.925 +71 5 2.61 3.93 +68 96 2.33 3.93 +118 101 2.665 3.93 +196 200 0 3.935 +102 122 0 3.935 +117 25 3.09 3.935 +95 72 1.035 3.94 +100 125 0 3.94 +67 76 1.105 3.945 +228 61 2.78 3.945 +230 248 2.06 3.945 +91 108 1.155 3.95 +76 101 3.225 3.955 +95 238 2.975 3.96 +218 107 0.305 3.965 +233 197 3.245 3.97 +195 201 1.52 3.97 +83 226 2.42 3.97 +76 122 3.275 3.975 +22 54 0 3.975 +22 31 2.145 3.975 +102 124 1.82 3.975 +66 81 3.41 3.975 +102 25 0 3.98 +108 239 2.86 3.98 +114 119 0 3.98 +128 25 0 3.985 +96 238 2.9 3.985 +123 240 2.72 3.985 +112 240 2.74 3.985 +113 239 0 3.985 +113 229 1.025 3.99 +133 27 3.355 3.99 +71 99 0.71 3.995 +84 228 1.53 4 +4 36 0 4.01 +196 241 0 4.015 +118 197 0 4.015 +81 221 3.005 4.02 +81 241 2.845 4.02 +120 128 3.43 4.02 +127 228 3.325 4.025 +76 118 3.29 4.025 +133 34 3.515 4.025 +239 145 0 4.03 +112 129 3.51 4.03 +22 231 0 4.035 +102 107 0 4.035 +126 226 2.92 4.04 +26 234 2.59 4.04 +101 128 3.335 4.045 +80 122 1.27 4.045 +129 173 3.5 4.045 +133 22 3.485 4.05 +79 256 2.29 4.055 +141 25 2.52 4.055 +112 100 0 4.055 +113 133 3.38 4.055 +4 8 0 4.055 +83 99 0.38 4.06 +96 83 2.205 4.06 +207 145 1.33 4.06 +228 2 3.495 4.06 +233 195 1.675 4.07 +239 138 2.12 4.07 +76 91 0 4.075 +83 194 3.185 4.075 +118 193 3.5 4.075 +81 226 1.985 4.08 +22 137 0 4.08 +227 236 3.465 4.085 +113 22 3.585 4.085 +106 124 0 4.09 +79 255 0.55 4.1 +68 120 2.855 4.1 +88 226 0 4.1 +110 124 3.34 4.1 +19 133 1.4 4.105 +106 126 1.09 4.11 +83 116 2.14 4.115 +96 223 2.525 4.12 +104 25 1.195 4.12 +71 101 0 4.125 +129 34 3.575 4.125 +113 227 2.415 4.125 +201 215 1.48 4.125 +72 99 0 4.13 +14 17 0 4.13 +9 42 0 4.13 +106 98 2.645 4.13 +107 11 0 4.13 +22 10 1.5 4.14 +225 99 1.725 4.145 +129 149 1.69 4.15 +14 190 0.15 4.15 +9 190 2.095 4.15 +23 184 1.865 4.15 +233 101 3.615 4.155 +83 127 3.445 4.155 +99 22 3.085 4.16 +19 228 2.675 4.16 +129 31 2.91 4.165 +115 17 0 4.165 +72 119 2.105 4.17 +142 235 2.71 4.17 +225 127 3.56 4.17 +106 193 3.13 4.17 +106 101 2.14 4.17 +23 31 3.625 4.17 +19 48 3.335 4.17 +9 45 0.34 4.175 +122 204 0 4.175 +116 17 3.495 4.175 +66 86 3.255 4.175 +233 231 3.01 4.18 +125 139 3.62 4.18 +101 21 0 4.18 +22 229 0 4.18 +117 230 3.295 4.18 +119 26 0 4.185 +125 157 3.59 4.19 +84 194 2.765 4.19 +22 21 0 4.19 +86 207 3.675 4.19 +119 25 0 4.19 +4 5 3.66 4.19 +125 158 3.66 4.195 +199 128 3.515 4.195 +121 86 0 4.2 +96 144 3.71 4.21 +94 193 0 4.21 +61 45 3.25 4.21 +114 133 3.465 4.215 +61 17 3.555 4.215 +124 173 3.71 4.22 +114 101 3.58 4.22 +66 225 3.295 4.22 +4 3 0 4.22 +123 144 3.59 4.225 +106 237 2.44 4.225 +116 120 3.695 4.225 +80 101 0.895 4.225 +71 88 0.555 4.23 +127 17 0 4.23 +102 114 2.79 4.23 +66 121 3.72 4.23 +72 195 1.51 4.235 +99 120 0.445 4.24 +118 91 1.04 4.24 +199 26 1.63 4.245 +108 16 0.275 4.245 +117 99 0 4.245 +83 125 2.135 4.25 +112 49 3.195 4.25 +114 230 3.43 4.25 +66 207 3.37 4.25 +129 139 1.155 4.255 +96 235 3.415 4.255 +123 107 0 4.255 +227 25 0.98 4.26 +225 231 0.125 4.26 +141 170 1.08 4.26 +104 6 0 4.26 +122 223 2.735 4.26 +122 239 0 4.26 +4 20 0 4.26 +233 236 2.86 4.265 +112 173 3.595 4.265 +100 115 0 4.27 +9 28 2.475 4.275 +120 247 3.745 4.275 +4 104 3.61 4.275 +4 152 0.625 4.28 +61 13 1.4 4.28 +106 127 3.565 4.285 +113 34 3.6 4.285 +114 124 3.645 4.285 +116 229 1.93 4.285 +119 193 3.75 4.285 +81 142 3.72 4.29 +225 22 3.415 4.29 +112 113 1.44 4.29 +97 103 3.165 4.29 +106 201 3.065 4.295 +23 44 0 4.295 +61 36 3.355 4.305 +77 193 2.19 4.305 +106 123 0 4.305 +225 2 3.53 4.31 +77 207 2.95 4.31 +126 194 3.455 4.315 +239 58 3.655 4.315 +123 127 3.35 4.315 +77 113 2.07 4.315 +120 18 3.52 4.32 +116 46 3.445 4.32 +117 227 0 4.32 +4 207 3.765 4.32 +128 247 3.82 4.325 +84 116 3.815 4.325 +95 228 2.985 4.325 +96 142 2.73 4.325 +61 34 1.175 4.33 +106 233 1.33 4.335 +237 247 3.73 4.34 +124 236 0 4.34 +104 244 3.35 4.34 +80 123 1.105 4.34 +61 33 1.12 4.345 +66 196 3.345 4.345 +199 194 3.02 4.35 +123 235 2.825 4.35 +125 115 2.12 4.355 +239 16 2.305 4.355 +77 100 0.915 4.355 +112 142 2.51 4.355 +87 197 3.37 4.355 +127 16 0 4.36 +124 253 3.425 4.36 +4 34 0 4.36 +122 230 0.145 4.365 +119 31 3.63 4.365 +61 63 3.255 4.37 +126 212 3.385 4.37 +227 57 3.795 4.375 +96 123 0 4.385 +61 115 3.71 4.395 +23 53 0 4.395 +96 124 3.42 4.395 +120 137 0 4.395 +80 100 3.53 4.395 +239 228 0 4.4 +227 53 1.02 4.4 +19 8 0 4.4 +96 113 1.94 4.4 +120 235 2.94 4.4 +26 170 0 4.4 +196 120 3.02 4.405 +19 3 0 4.405 +141 189 0 4.405 +101 110 3.275 4.41 +83 100 0 4.41 +19 23 3.315 4.41 +95 122 2.605 4.41 +96 14 3.395 4.41 +122 123 0 4.41 +237 157 0.26 4.415 +106 94 3.6 4.415 +71 119 0.205 4.42 +239 49 3.125 4.42 +141 156 3.52 4.425 +106 84 3.51 4.425 +199 247 0.985 4.43 +141 158 3.335 4.43 +100 207 3.11 4.43 +102 5 1.77 4.43 +5 227 3.86 4.43 +23 55 0 4.435 +125 228 2.195 4.44 +117 199 0 4.44 +119 14 3.66 4.44 +99 207 2.875 4.445 +196 113 1.4 4.45 +88 249 3.605 4.45 +23 41 1.76 4.45 +112 46 0.97 4.45 +233 108 3.23 4.455 +237 142 0 4.455 +23 152 1 4.455 +96 107 2.875 4.455 +118 96 3.435 4.465 +100 116 0 4.47 +84 113 0 4.475 +96 116 2.525 4.475 +94 107 3.79 4.475 +104 8 0 4.475 +80 94 3.615 4.475 +23 42 2.465 4.48 +201 124 2.605 4.48 +96 141 3.435 4.48 +196 199 0.765 4.485 +68 196 3.305 4.49 +193 194 2.32 4.49 +102 103 3.395 4.49 +106 95 1.65 4.49 +127 142 3.77 4.495 +233 125 3.97 4.495 +199 228 3.925 4.495 +95 239 0.29 4.495 +117 233 0.67 4.495 +84 195 0 4.5 +126 158 3.37 4.505 +193 234 3.99 4.505 +233 96 0 4.505 +95 108 3.345 4.505 +108 103 3.815 4.505 +110 25 3.755 4.505 +126 129 2.415 4.51 +4 160 3.84 4.51 +96 61 3.79 4.51 +71 216 0 4.515 +23 6 0 4.515 +115 34 1.26 4.515 +83 199 3.595 4.525 +227 135 1.915 4.53 +122 120 3.95 4.53 +112 20 3.71 4.53 +126 113 0 4.545 +99 21 0 4.545 +106 125 0 4.545 +193 212 0.17 4.55 +4 112 1.22 4.55 +95 14 2.39 4.55 +95 99 1.77 4.55 +79 112 3.23 4.555 +193 144 3.875 4.56 +88 122 3.53 4.56 +225 19 1.19 4.56 +94 125 0 4.56 +124 125 3.625 4.56 +100 61 3.615 4.56 +71 80 0.06 4.565 +77 119 3.61 4.565 +98 227 3.8 4.575 +102 146 1.095 4.575 +112 207 2.72 4.58 +97 17 0.785 4.58 +2 40 1.31 4.585 +233 193 2.66 4.59 +101 227 2.865 4.59 +196 116 2.575 4.59 +123 125 0 4.59 +79 99 0.91 4.6 +79 61 3.8 4.6 +201 234 3.59 4.6 +124 247 2.055 4.6 +102 216 0 4.6 +102 154 2.46 4.6 +117 122 3.32 4.6 +67 226 4.035 4.605 +107 99 3.49 4.61 +95 112 1.87 4.61 +9 156 0 4.61 +77 66 1.645 4.61 +99 116 1.94 4.62 +26 25 0 4.62 +225 230 1.43 4.62 +104 133 3.58 4.62 +201 120 3.115 4.63 +201 229 4.095 4.63 +88 98 3.585 4.635 +104 116 3.475 4.635 +207 133 3.565 4.635 +127 20 3.8 4.645 +72 115 3.375 4.645 +67 246 3.935 4.645 +201 230 0 4.65 +124 216 4.095 4.65 +79 108 3.385 4.655 +225 145 2.08 4.655 +77 112 2.1 4.655 +22 230 0 4.66 +14 160 0 4.66 +201 240 3.59 4.66 +26 38 3.73 4.665 +201 216 3.67 4.665 +128 230 1.8 4.67 +88 230 0 4.67 +123 128 0 4.67 +196 115 3.33 4.68 +14 45 2.805 4.68 +118 128 1.715 4.68 +22 128 1.8 4.685 +201 96 3.575 4.69 +9 160 0 4.69 +108 127 2.86 4.69 +23 27 3.77 4.695 +110 46 3.93 4.695 +116 34 1.76 4.695 +126 112 1.81 4.7 +22 26 0 4.705 +113 20 3.73 4.71 +101 14 3.325 4.72 +94 207 0 4.72 +129 49 0.795 4.72 +87 195 1.655 4.725 +112 19 1.075 4.725 +115 230 3.4 4.725 +94 97 3.895 4.73 +9 182 3.345 4.73 +94 225 2.705 4.735 +97 207 3.58 4.735 +233 253 3.77 4.745 +116 63 4.09 4.745 +94 100 3.225 4.75 +77 250 4.08 4.755 +229 247 0 4.755 +94 110 2.63 4.76 +100 15 3.85 4.765 +141 137 2.05 4.77 +80 22 4.11 4.77 +229 137 0 4.775 +83 228 2.21 4.785 +88 227 0 4.785 +94 113 0 4.785 +79 207 3.255 4.795 +84 110 1.785 4.795 +9 5 3.25 4.795 +104 119 0 4.795 +199 22 3.54 4.8 +66 113 3.73 4.8 +68 211 1.84 4.805 +201 164 4.265 4.805 +114 227 0 4.805 +114 21 2.905 4.81 +115 24 2.95 4.81 +98 119 0 4.815 +95 107 2.52 4.82 +122 22 3.44 4.83 +108 61 1.91 4.83 +201 197 0 4.835 +123 61 1.01 4.835 +110 207 2.7 4.835 +233 239 2.875 4.84 +239 143 0 4.84 +127 49 1.79 4.845 +126 253 2.27 4.845 +126 235 0 4.845 +98 28 4.055 4.845 +29 38 3.145 4.845 +23 230 3.865 4.85 +123 32 3.605 4.85 +115 137 2.6 4.85 +29 54 2.045 4.855 +72 98 0 4.86 +87 98 4.31 4.86 +199 122 0 4.86 +141 10 1.975 4.86 +105 182 3.5 4.86 +119 101 0 4.865 +83 104 3.11 4.87 +122 235 0 4.87 +118 235 2.87 4.87 +68 98 0 4.875 +113 17 0 4.875 +23 141 4.205 4.88 +95 61 2.555 4.88 +115 231 3.175 4.88 +72 211 0.585 4.885 +83 229 2.395 4.885 +126 61 4.12 4.89 +125 157 4.325 4.89 +4 116 1.175 4.89 +199 203 4.38 4.89 +227 235 3.395 4.895 +110 100 0 4.9 +79 126 4.35 4.905 +126 110 2.605 4.905 +237 216 3.535 4.905 +193 207 0 4.91 +87 211 4.29 4.91 +239 138 4.235 4.91 +98 112 4.365 4.91 +141 61 4.01 4.91 +108 23 3.775 4.91 +68 87 4.15 4.915 +112 16 0 4.915 +119 126 3.91 4.915 +227 248 4.38 4.92 +110 141 4.405 4.92 +239 157 0 4.925 +239 27 3.74 4.925 +121 98 1.425 4.925 +118 98 3.37 4.925 +80 95 2.29 4.925 +126 141 0 4.93 +98 124 3.73 4.93 +196 125 2.92 4.935 +14 6 2.565 4.935 +14 11 0 4.935 +9 23 0 4.935 +123 230 2 4.935 +110 116 3.485 4.935 +127 2 0 4.94 +22 141 2.505 4.94 +225 127 4.27 4.94 +123 21 4.39 4.94 +114 116 0 4.94 +119 23 0 4.94 +68 2 4.37 4.945 +105 14 2.23 4.945 +239 235 0 4.945 +88 113 0 4.945 +114 211 3.625 4.945 +79 84 1.645 4.95 +95 4 3.37 4.95 +115 123 4.385 4.95 +123 90 4.44 4.955 +112 28 4.01 4.955 +239 189 2.56 4.96 +112 58 3.91 4.96 +196 241 4.225 4.965 +121 104 4.075 4.965 +237 26 4.425 4.97 +196 240 3.57 4.97 +119 203 4.43 4.97 +68 88 0 4.975 +68 120 4.25 4.975 +120 129 4.425 4.975 +79 83 2.82 4.98 +83 115 0 4.985 +108 141 4.395 4.985 +113 22 4.435 4.985 +116 49 1.115 4.985 +117 99 4.455 4.985 +119 125 3.62 4.985 +239 253 0 4.99 +98 38 3.91 4.99 +113 98 3.675 4.99 +113 38 4.435 4.99 +114 124 4.37 4.99 +23 112 4.21 4.995 +106 128 0 5 +196 212 0 5 +100 147 4.145 5 +9 125 3.92 5 +125 141 0 5 +194 114 0 0.5 +206 195 0 0.5 +180 48 0 0.51 +192 220 0 0.515 +190 218 0 0.52 +37 70 0 0.52 +148 8 0 0.525 +37 85 0 0.525 +155 187 0 0.53 +45 65 0 0.535 +213 229 0 0.535 +179 214 0 0.545 +155 188 0 0.55 +181 215 0.035 0.55 +192 80 0 0.555 +172 218 0 0.555 +198 246 0 0.555 +15 36 0 0.56 +188 40 0 0.56 +73 192 0 0.56 +183 246 0.045 0.565 +1 16 0 0.565 +137 149 0 0.565 +151 187 0 0.57 +149 156 0 0.57 +11 187 0 0.575 +151 162 0 0.575 +39 215 0 0.575 +206 194 0 0.575 +134 162 0 0.58 +151 178 0 0.58 +176 164 0 0.58 +144 172 0 0.585 +11 218 0.07 0.585 +39 67 0 0.585 +1 31 0 0.59 +194 84 0 0.595 +15 49 0 0.595 +168 188 0 0.595 +73 45 0 0.595 +189 43 0 0.6 +209 242 0 0.6 +180 66 0 0.6 +184 65 0 0.605 +15 34 0 0.61 +15 29 0 0.61 +37 185 0 0.61 +15 5 0.045 0.615 +144 190 0 0.615 +191 218 0 0.62 +209 225 0 0.625 +179 67 0 0.625 +147 15 0 0.63 +170 11 0.03 0.63 +177 3 0 0.63 +198 216 0 0.63 +189 11 0 0.635 +213 230 0 0.635 +1 19 0 0.64 +69 68 0 0.64 +179 65 0 0.645 +209 253 0 0.65 +73 224 0 0.65 +189 166 0.04 0.66 +209 77 0 0.66 +144 185 0 0.665 +221 201 0 0.665 +150 12 0 0.67 +165 60 0 0.67 +190 65 0 0.675 +182 162 0 0.675 +178 214 0 0.675 +69 81 0 0.675 +41 53 0 0.68 +148 34 0 0.68 +152 185 0 0.68 +135 55 0 0.68 +150 11 0 0.69 +45 221 0 0.69 +150 185 0 0.7 +197 87 0 0.7 +189 222 0 0.705 +7 43 0 0.705 +45 191 0 0.705 +166 215 0.13 0.71 +173 186 0.08 0.735 +210 226 0.185 0.735 +139 186 0.085 0.735 +43 75 0 0.74 +184 215 0 0.74 +171 237 0.075 0.74 +177 35 0 0.74 +69 53 0.145 0.74 +47 34 0 0.745 +165 201 0.22 0.755 +198 234 0 0.755 +139 175 0.13 0.755 +33 77 0 0.76 +172 191 0.05 0.76 +174 186 0 0.76 +206 179 0 0.76 +168 215 0 0.765 +45 27 0 0.77 +148 35 0 0.775 +191 33 0 0.78 +191 224 0 0.78 +183 201 0 0.785 +147 35 0 0.79 +190 35 0 0.795 +47 64 0.07 0.795 +171 186 0.13 0.805 +150 8 0 0.805 +182 172 0 0.805 +136 7 0.305 0.81 +189 164 0 0.81 +162 183 0 0.81 +187 201 0 0.81 +164 192 0.265 0.815 +197 215 0 0.815 +43 70 0 0.82 +47 49 0 0.82 +159 153 0.085 0.82 +170 221 0 0.82 +172 208 0.305 0.82 +197 183 0 0.82 +131 152 0.045 0.825 +156 8 0.245 0.825 +135 57 0 0.825 +217 208 0 0.825 +41 70 0 0.835 +171 219 0 0.835 +183 200 0 0.835 +206 238 0 0.84 +191 210 0 0.845 +136 54 0 0.845 +198 187 0 0.845 +221 188 0 0.85 +206 253 0 0.855 +191 212 0 0.86 +144 175 0 0.86 +135 149 0 0.865 +155 177 0.045 0.87 +33 51 0 0.875 +221 249 0.215 0.875 +191 219 0 0.88 +180 77 0 0.88 +45 218 0 0.885 +191 185 0.39 0.89 +136 37 0.31 0.89 +148 16 0 0.89 +132 165 0 0.9 +45 93 0 0.9 +151 149 0 0.905 +182 43 0 0.905 +217 245 0 0.905 +144 62 0 0.91 +172 192 0 0.91 +33 61 0.25 0.915 +156 43 0 0.915 +206 180 0 0.915 +198 188 0 0.915 +156 184 0.395 0.92 +183 202 0 0.92 +190 77 0 0.925 +160 191 0 0.925 +182 34 0 0.925 +143 52 0 0.925 +191 178 0 0.93 +187 215 0 0.93 +187 253 0.29 0.94 +147 194 0.12 0.945 +155 191 0 0.945 +188 215 0 0.945 +176 180 0 0.945 +177 186 0.075 0.945 +135 152 0.425 0.945 +148 186 0.26 0.95 +135 144 0.27 0.95 +131 52 0 0.955 +191 47 0 0.955 +156 37 0 0.955 +168 214 0 0.955 +45 177 0 0.955 +132 152 0 0.96 +152 168 0 0.96 +156 57 0.175 0.96 +69 83 0 0.96 +217 246 0 0.96 +188 37 0 0.965 +132 181 0 0.98 +162 184 0 0.98 +39 216 0 0.98 +176 177 0 0.98 +41 61 0.25 0.99 +217 197 0 0.995 +186 222 0 1 +171 199 0 1.005 +188 216 0 1.005 +186 180 0.12 1.01 +213 195 0 1.01 +69 36 0 1.02 +192 178 0.385 1.025 +47 67 0.095 1.025 +156 10 0 1.025 +135 198 0.29 1.025 +182 187 0 1.03 +160 10 0 1.035 +213 246 0 1.035 +162 152 0 1.04 +176 223 0 1.04 +213 241 0 1.045 +69 51 0 1.05 +41 10 0 1.055 +176 209 0 1.055 +164 208 0 1.065 +39 72 0 1.07 +179 47 0 1.07 +69 246 0 1.07 +135 60 0 1.075 +150 154 0 1.08 +39 187 0 1.08 +170 181 0.365 1.08 +168 170 0.57 1.09 +154 7 0 1.095 +206 164 0 1.095 +149 162 0 1.1 +179 221 0.105 1.105 +154 10 0 1.115 +149 179 0.44 1.12 +197 210 0.48 1.12 +197 245 0.395 1.125 +182 154 0.18 1.125 +133 166 0 1.13 +179 223 0 1.13 +183 216 0 1.135 +132 164 0 1.14 +210 193 0.435 1.14 +144 58 0 1.145 +178 211 0.645 1.145 +11 25 0.495 1.145 +188 71 0 1.155 +180 193 0.615 1.155 +151 144 0.14 1.16 +158 180 0.655 1.165 +11 57 0 1.165 +1 177 0.32 1.165 +41 192 0 1.17 +151 160 0.475 1.17 +11 27 0 1.17 +192 78 0 1.185 +189 180 0 1.185 +43 64 0.19 1.19 +131 167 0.185 1.19 +140 159 0.09 1.2 +35 53 0 1.2 +209 219 0.185 1.2 +178 67 0.265 1.2 +217 71 0 1.2 +168 204 0.17 1.205 +135 183 0.2 1.205 +43 63 0 1.21 +140 183 0.355 1.21 +151 39 0.38 1.21 +187 209 0.57 1.215 +168 180 0.47 1.215 +169 144 0 1.215 +162 167 0 1.22 +69 34 0 1.235 +140 160 0.445 1.24 +171 89 0 1.24 +176 47 0.445 1.24 +139 54 0 1.24 +184 216 0 1.245 +139 59 0 1.245 +189 209 0.615 1.25 +209 205 0 1.25 +170 198 0 1.255 +130 174 0 1.26 +217 44 0.645 1.26 +190 210 0.76 1.265 +164 180 0 1.265 +167 179 0.645 1.265 +186 77 0.52 1.265 +140 182 0.3 1.27 +150 9 0 1.27 +69 74 0.425 1.27 +35 49 0 1.275 +179 193 0 1.275 +198 176 0.16 1.275 +151 9 0.49 1.28 +182 214 0 1.28 +198 92 0 1.28 +167 89 0 1.285 +154 42 0.64 1.29 +15 63 0.77 1.29 +178 164 0 1.29 +140 172 0 1.295 +213 230 0.72 1.295 +206 177 0 1.295 +206 209 0 1.295 +189 217 0.53 1.3 +140 186 0 1.305 +35 55 0.75 1.31 +138 132 0.8 1.31 +144 191 0 1.315 +144 171 0 1.32 +213 226 0 1.32 +180 211 0.615 1.32 +170 191 0 1.325 +140 176 0 1.33 +140 181 0.375 1.33 +189 45 0 1.33 +148 47 0 1.33 +192 210 0.65 1.335 +144 153 0 1.34 +164 181 0 1.345 +182 168 0 1.345 +206 84 0 1.345 +35 83 0.63 1.35 +182 210 0 1.355 +132 33 0.22 1.36 +144 185 0.735 1.36 +174 190 0 1.36 +178 212 0.41 1.36 +153 160 0 1.365 +145 190 0 1.365 +33 181 0 1.37 +148 191 0 1.37 +186 214 0.705 1.375 +178 166 0.435 1.375 +129 177 0 1.38 +43 55 0 1.385 +210 40 0 1.385 +139 57 0 1.385 +170 188 0 1.39 +65 51 0 1.39 +33 145 0.21 1.395 +171 234 0.085 1.395 +147 183 0 1.4 +153 186 0 1.4 +65 40 0 1.405 +179 200 0 1.41 +152 166 0 1.42 +178 168 0 1.42 +189 15 0.745 1.425 +131 178 0.92 1.43 +164 221 0 1.43 +209 226 0 1.43 +147 191 0 1.435 +156 42 0 1.435 +159 47 0.345 1.44 +180 181 0 1.44 +148 45 0 1.45 +180 196 0 1.45 +183 194 0 1.455 +168 183 0 1.455 +170 202 0 1.455 +209 200 0 1.455 +209 198 0.95 1.455 +170 187 0 1.46 +210 36 0 1.46 +177 193 0.675 1.46 +65 63 0 1.46 +167 183 0 1.465 +170 201 0 1.47 +69 245 0.84 1.47 +65 85 0.915 1.47 +43 39 0 1.475 +190 179 0 1.475 +184 36 0 1.475 +209 238 0 1.475 +11 59 0 1.475 +217 233 0 1.475 +217 80 0.885 1.475 +133 168 0.895 1.48 +11 23 0.59 1.48 +217 224 0.75 1.48 +43 214 0 1.485 +11 31 0.465 1.485 +217 192 0 1.485 +184 212 0 1.49 +167 233 0.395 1.49 +189 162 0.83 1.495 +171 233 0.245 1.495 +206 122 0.785 1.495 +69 102 0 1.495 +130 182 0.96 1.5 +184 72 0.56 1.5 +148 16 0.97 1.5 +168 185 0 1.5 +69 218 0.5 1.5 +160 188 0.63 1.505 +210 226 0.98 1.505 +160 44 0.765 1.51 +153 5 0.84 1.51 +69 200 0.91 1.51 +217 230 0 1.51 +192 77 0 1.515 +143 147 1.005 1.515 +148 36 0.16 1.52 +166 39 0.575 1.52 +172 230 0.665 1.52 +69 101 0 1.52 +130 5 0.965 1.525 +168 184 0 1.525 +206 235 0.96 1.525 +143 191 0.695 1.525 +180 81 1.015 1.53 +148 181 0 1.535 +180 63 0.905 1.535 +222 238 0 1.535 +140 143 0.74 1.54 +213 245 0 1.54 +35 63 0 1.54 +133 181 0.335 1.545 +190 63 0.615 1.545 +192 36 0.41 1.55 +184 71 0.68 1.55 +11 61 0 1.55 +217 250 0 1.55 +209 181 0 1.555 +190 79 1.05 1.56 +170 174 0 1.56 +41 40 0 1.565 +41 70 1.05 1.565 +152 14 0.985 1.565 +183 204 0 1.565 +168 193 0 1.565 +192 79 0.76 1.57 +160 47 0 1.57 +182 23 1.07 1.575 +179 192 0.36 1.575 +132 191 0 1.58 +160 42 0 1.58 +170 183 0 1.58 +209 242 0.89 1.58 +147 190 0 1.585 +209 253 0.93 1.585 +192 35 1.08 1.59 +191 179 0 1.59 +134 139 0.38 1.59 +213 202 0.97 1.59 +188 47 0.64 1.59 +135 156 0.725 1.59 +1 150 0.295 1.59 +134 155 0 1.595 +159 179 0.355 1.595 +182 55 1.025 1.595 +182 40 0 1.595 +209 79 0.925 1.595 +144 162 1.09 1.6 +156 166 0 1.6 +178 46 0 1.6 +206 207 0 1.6 +33 40 0 1.605 +171 96 0 1.605 +159 221 0.725 1.605 +180 223 0 1.605 +11 38 0 1.605 +168 191 1.03 1.61 +209 207 0 1.61 +158 45 0 1.61 +139 64 0 1.61 +139 185 0 1.61 +15 152 0.98 1.615 +152 210 0.38 1.615 +177 221 0 1.62 +178 14 0.96 1.62 +15 35 0.985 1.625 +189 43 0.745 1.625 +171 93 0 1.625 +222 45 0 1.625 +189 221 0 1.63 +179 196 0 1.63 +133 149 0 1.635 +186 39 0.58 1.635 +180 77 1.055 1.635 +150 168 1.01 1.64 +209 195 0 1.64 +217 43 0 1.64 +190 44 1.1 1.645 +183 43 0 1.645 +159 45 0 1.645 +162 193 0 1.645 +182 35 0 1.645 +155 16 0.985 1.65 +187 249 0.21 1.65 +210 245 0 1.655 +206 196 0 1.655 +158 174 0 1.655 +149 181 0 1.66 +164 229 1.11 1.66 +133 54 0 1.665 +148 35 0.82 1.665 +15 10 0 1.67 +155 43 0 1.67 +156 176 1.12 1.67 +153 183 0.85 1.67 +187 223 0 1.675 +166 200 0.93 1.675 +43 73 0 1.68 +159 46 0.65 1.68 +186 73 0.54 1.68 +192 74 0 1.685 +130 181 0 1.685 +184 198 0 1.685 +171 221 0 1.685 +181 37 0 1.685 +15 47 0 1.69 +133 151 0 1.695 +180 45 0 1.695 +210 223 0 1.7 +15 34 0.96 1.705 +184 65 0.7 1.705 +103 37 0.18 1.705 +170 41 0.595 1.71 +206 224 0.715 1.71 +185 221 0 1.715 +206 43 1.2 1.725 +222 193 0.73 1.73 +159 185 0.44 1.73 +187 215 1.125 1.73 +210 200 0 1.73 +209 208 0 1.73 +158 178 0.85 1.73 +217 221 0 1.73 +176 45 0.305 1.735 +153 169 0.795 1.735 +136 148 0 1.74 +15 37 0.895 1.74 +166 210 0.535 1.74 +210 98 0.645 1.74 +11 39 0 1.74 +155 174 0 1.745 +177 47 0 1.745 +178 174 1.155 1.745 +164 166 0.61 1.75 +170 11 1.255 1.755 +176 177 1.045 1.755 +190 37 0.845 1.76 +185 201 0 1.76 +188 204 0.225 1.765 +166 211 1.015 1.765 +156 188 0 1.775 +217 39 0 1.775 +149 7 0 1.78 +171 94 0 1.78 +164 83 1.14 1.78 +182 3 0 1.78 +43 110 1.255 1.785 +133 163 0.945 1.785 +149 182 0 1.785 +130 151 1.015 1.785 +164 205 0 1.785 +217 249 0 1.785 +177 65 1.115 1.79 +159 187 0.805 1.795 +188 198 0.965 1.795 +185 204 0.47 1.8 +160 12 0 1.8 +69 75 0.035 1.805 +160 3 1.22 1.81 +179 65 0.7 1.81 +147 15 0.815 1.815 +187 79 0.63 1.815 +147 35 0.94 1.82 +183 202 0.96 1.82 +181 35 0 1.82 +132 173 0 1.825 +103 2 0 1.825 +131 166 0 1.83 +172 192 1.33 1.835 +152 213 1.065 1.84 +183 40 0.695 1.84 +41 192 1.24 1.845 +130 3 1.005 1.845 +164 208 1.135 1.845 +139 156 1.31 1.845 +189 64 1 1.855 +188 192 0 1.855 +174 194 1.28 1.855 +178 7 0 1.855 +129 136 0 1.86 +186 224 0.78 1.86 +170 192 0 1.86 +188 221 0.96 1.865 +184 66 0 1.87 +147 174 0 1.87 +213 196 0 1.87 +174 168 1.115 1.87 +176 224 0 1.88 +143 206 1.34 1.88 +135 86 1.245 1.885 +136 149 0 1.89 +213 37 1.225 1.89 +187 253 0.965 1.89 +222 36 0 1.895 +156 38 0 1.895 +188 215 1.125 1.895 +177 213 1.16 1.895 +174 179 0 1.905 +152 41 0 1.91 +151 188 0 1.915 +143 171 1.26 1.915 +153 149 0 1.915 +198 216 0.69 1.915 +43 44 0 1.92 +152 40 0.67 1.92 +164 88 0.635 1.92 +217 67 1.31 1.92 +147 210 0.065 1.925 +198 249 0 1.925 +131 174 0 1.93 +147 213 0.95 1.93 +174 82 1.205 1.93 +217 200 0 1.93 +222 97 0 1.94 +143 176 1.255 1.94 +198 88 0 1.94 +194 207 0 1.945 +188 172 0 1.95 +182 37 0 1.95 +148 150 0.71 1.955 +152 35 0 1.955 +159 163 1.355 1.955 +178 66 0 1.955 +129 174 0 1.96 +143 64 0 1.96 +198 75 1.41 1.96 +183 35 0 1.965 +217 199 0 1.97 +164 199 0.76 1.98 +174 196 1.23 1.98 +171 86 0 1.985 +178 65 0 1.985 +166 188 0 1.99 +168 88 0.865 1.99 +143 154 1.245 1.99 +213 199 0 1.995 +138 169 0 1.995 +176 201 0 1.995 +198 229 0 1.995 +186 221 0 2 +181 186 1.455 2.005 +206 164 1.165 2.005 +166 199 0.195 2.01 +149 8 0.9 2.02 +213 41 1.01 2.03 +168 200 0 2.03 +185 219 1.525 2.04 +164 200 0 2.04 +153 139 0 2.04 +144 130 1.3 2.045 +164 211 0.38 2.045 +155 206 1.32 2.05 +185 76 1.485 2.06 +138 171 1.545 2.065 +182 45 1.405 2.065 +176 204 0 2.065 +198 230 0 2.07 +148 248 1.325 2.075 +178 212 1.385 2.075 +69 98 0 2.075 +43 93 0 2.08 +155 188 0.605 2.08 +183 87 1.525 2.08 +69 85 0 2.08 +43 89 0 2.085 +134 138 0 2.085 +166 69 0.905 2.085 +135 179 1.4 2.085 +190 221 0 2.09 +187 180 0.165 2.09 +179 185 1.33 2.095 +187 250 0.285 2.1 +33 65 0 2.1 +160 222 1.37 2.105 +43 80 0 2.11 +131 140 1.5 2.11 +198 118 0 2.11 +198 226 0 2.11 +187 109 1.34 2.115 +166 220 1.34 2.115 +131 153 1.56 2.12 +166 41 0.62 2.125 +187 47 0 2.13 +170 60 1.495 2.13 +153 11 0 2.13 +9 38 0.4 2.13 +41 55 0 2.135 +138 150 1.3 2.135 +140 181 1.39 2.14 +147 166 0 2.14 +103 11 0 2.14 +173 93 0.75 2.145 +198 234 1.395 2.15 +170 165 1.545 2.15 +190 65 0.725 2.155 +166 214 0 2.155 +189 90 0.555 2.16 +194 166 0.295 2.16 +166 204 0.155 2.16 +210 217 1.19 2.16 +210 216 0 2.16 +158 16 0 2.16 +222 242 0.755 2.165 +187 221 0 2.165 +187 77 0 2.165 +154 7 1.62 2.17 +209 198 1.62 2.17 +198 212 1.57 2.175 +172 118 1.165 2.175 +172 92 0 2.175 +138 182 1.36 2.18 +69 220 0 2.18 +184 166 0 2.185 +151 54 1.1 2.19 +176 221 0 2.19 +191 82 0.97 2.19 +3 70 1.58 2.19 +194 216 0.335 2.195 +187 80 0.385 2.195 +198 233 0 2.2 +194 204 1.675 2.2 +131 178 1.505 2.205 +210 72 0.49 2.205 +155 172 0 2.21 +185 39 0 2.21 +159 175 1.095 2.21 +136 210 1.305 2.215 +190 77 0.965 2.215 +155 217 1.285 2.22 +152 38 0 2.225 +152 21 1.315 2.23 +210 183 0 2.235 +206 217 0.52 2.24 +158 46 0.56 2.24 +198 245 0 2.245 +164 86 0.78 2.245 +170 57 1.11 2.245 +136 156 0 2.25 +183 216 1.21 2.25 +166 179 0 2.25 +206 185 0.6 2.25 +213 75 0.8 2.255 +172 191 1.555 2.255 +134 156 0 2.26 +140 58 0 2.26 +184 188 0 2.26 +209 211 0 2.26 +155 169 0 2.265 +69 185 0.565 2.265 +192 65 0 2.27 +144 156 0.815 2.27 +213 188 0 2.27 +170 90 0.15 2.27 +209 67 0 2.27 +129 177 1.495 2.275 +185 74 1.545 2.275 +129 148 1.095 2.28 +194 183 1.595 2.28 +209 184 0 2.28 +159 222 1.01 2.285 +131 151 1.01 2.29 +134 179 1.77 2.29 +176 234 0.125 2.29 +190 224 0.84 2.295 +136 171 1.66 2.3 +171 181 1.505 2.3 +136 69 1.72 2.305 +210 39 0 2.31 +131 181 0 2.315 +194 199 0 2.315 +178 183 0 2.315 +132 3 1.6 2.32 +174 221 0.77 2.32 +136 103 0.705 2.325 +136 155 1.64 2.325 +156 39 0 2.325 +192 193 0.985 2.33 +131 179 0 2.33 +15 19 0.85 2.33 +164 181 1.825 2.33 +176 193 1.315 2.33 +69 212 0 2.33 +202 251 0.17 2.33 +176 74 1.735 2.335 +153 9 0 2.335 +149 37 0.42 2.34 +140 57 1.835 2.34 +15 36 0.66 2.34 +213 76 1.405 2.34 +143 155 0.72 2.34 +160 16 0 2.345 +187 204 0 2.35 +138 103 0.95 2.35 +132 190 0 2.355 +132 33 1.56 2.355 +192 221 0 2.36 +132 180 0 2.36 +162 166 0 2.36 +149 180 1.815 2.365 +15 49 1.825 2.37 +144 190 0.69 2.37 +138 9 1 2.37 +172 186 0 2.37 +192 223 0 2.375 +132 179 0 2.375 +158 9 1.015 2.375 +1 37 1.8 2.375 +189 172 0 2.38 +191 241 1.22 2.38 +190 191 0 2.385 +182 214 1.415 2.385 +190 174 1.435 2.39 +130 1 0.445 2.395 +159 171 1.025 2.4 +139 154 1.085 2.4 +160 178 1.65 2.405 +217 89 1.865 2.405 +131 148 0.87 2.41 +144 186 0 2.41 +206 92 0.485 2.41 +69 216 0 2.41 +139 158 1.255 2.41 +179 196 1.7 2.415 +180 70 1.525 2.415 +144 1 0.965 2.42 +184 194 0 2.43 +131 209 1.455 2.44 +41 76 1.165 2.44 +176 177 1.865 2.44 +154 185 0 2.445 +213 187 1.82 2.445 +162 222 1.415 2.445 +180 66 0.78 2.445 +134 163 1.905 2.45 +189 41 1.82 2.45 +184 211 0 2.45 +154 46 1.255 2.455 +184 180 0 2.455 +184 214 0 2.455 +206 186 0.56 2.455 +47 72 1.36 2.46 +159 206 0.71 2.46 +43 36 0.745 2.465 +131 167 1.37 2.465 +144 11 0.955 2.465 +144 177 0 2.465 +248 7 0 2.465 +41 214 0 2.47 +148 184 0.71 2.47 +155 158 0 2.47 +176 205 0 2.47 +178 168 1.93 2.47 +154 12 0 2.475 +15 43 0.66 2.475 +130 103 0.895 2.475 +47 37 1.445 2.475 +190 185 1.48 2.48 +178 222 0 2.48 +154 45 0 2.485 +140 165 0 2.485 +15 12 1.64 2.485 +189 156 1.01 2.485 +155 12 1.82 2.485 +47 83 1.52 2.49 +191 207 0.45 2.49 +69 242 0 2.495 +202 76 1.655 2.5 +136 86 1.65 2.505 +166 183 0 2.505 +43 68 1.375 2.51 +82 118 0.605 2.51 +202 235 2.005 2.51 +189 187 0 2.51 +152 180 0.535 2.51 +176 222 0 2.51 +178 67 1.485 2.51 +198 196 0.54 2.515 +202 75 1.02 2.515 +202 233 0 2.525 +178 194 0.35 2.525 +69 76 0 2.525 +192 218 0 2.53 +164 198 0.55 2.53 +192 208 0.4 2.535 +202 183 1.88 2.54 +69 47 1.815 2.54 +162 212 1.475 2.55 +11 10 0 2.55 +192 224 0 2.555 +131 150 0.645 2.555 +180 213 0.505 2.555 +41 220 1.43 2.565 +194 192 1.895 2.565 +132 15 0.135 2.57 +213 196 1.94 2.575 +135 163 0 2.575 +191 237 1.27 2.575 +168 211 0 2.58 +191 254 1.35 2.585 +190 218 1.095 2.59 +132 174 0 2.595 +189 185 0 2.595 +144 15 0.8 2.595 +178 182 0 2.595 +189 169 0 2.6 +182 38 0 2.6 +132 164 1.325 2.605 +149 153 2.09 2.605 +144 176 0 2.605 +180 221 0 2.605 +192 35 1.765 2.61 +41 218 0 2.61 +160 187 0.71 2.61 +210 48 2.03 2.61 +176 218 0 2.61 +167 185 1.94 2.615 +178 70 1.435 2.62 +178 47 0 2.62 +134 169 1.04 2.625 +189 190 0 2.625 +159 52 1.64 2.625 +189 15 1.9 2.63 +160 48 0.7 2.63 +210 223 1.855 2.63 +140 171 0 2.635 +138 15 2.025 2.635 +182 37 2.065 2.635 +140 167 0.58 2.64 +152 35 2 2.64 +159 179 1.64 2.64 +178 7 1.87 2.64 +190 188 1.01 2.645 +189 43 1.84 2.645 +159 33 0 2.645 +159 164 1.6 2.645 +159 43 0.97 2.645 +191 65 1.885 2.645 +1 16 0.825 2.65 +41 38 0 2.65 +15 177 0 2.65 +187 48 0.21 2.65 +191 126 1.37 2.65 +191 240 1.315 2.65 +198 199 0 2.655 +198 211 0 2.655 +130 148 0 2.655 +184 162 1.34 2.66 +167 203 0.62 2.66 +159 173 0 2.66 +160 173 1.555 2.66 +191 253 1.235 2.66 +191 238 1.28 2.66 +1 36 1.815 2.665 +210 36 2.03 2.665 +136 164 0.625 2.675 +147 164 0 2.675 +150 165 0.62 2.675 +167 118 0.67 2.675 +172 194 2.135 2.675 +160 33 0 2.68 +187 222 0 2.68 +191 205 0 2.68 +191 218 1.97 2.68 +82 72 0 2.685 +132 209 1.345 2.69 +184 36 2.035 2.69 +209 197 0.475 2.69 +177 47 1.87 2.69 +174 212 1.54 2.695 +11 188 0 2.695 +217 245 1.775 2.7 +82 172 2.19 2.705 +151 162 1.9 2.705 +164 85 1.905 2.705 +152 162 1.93 2.71 +148 36 1.78 2.715 +168 85 1.405 2.715 +168 199 0 2.715 +150 166 0 2.72 +170 187 2 2.72 +174 222 1.16 2.72 +189 11 1.165 2.725 +209 219 2.13 2.725 +43 253 2.105 2.73 +151 152 0 2.735 +156 16 0.21 2.735 +135 162 0 2.735 +43 76 0 2.745 +164 197 0 2.745 +182 9 0.355 2.745 +197 212 1.295 2.745 +189 209 2.1 2.75 +183 211 0 2.75 +160 43 0 2.75 +164 167 0.475 2.75 +192 212 0.34 2.755 +147 194 0.975 2.76 +134 149 0 2.765 +136 161 0 2.765 +209 193 0 2.765 +177 48 1.8 2.765 +41 16 0 2.77 +82 207 0 2.775 +164 213 0 2.775 +152 183 0 2.78 +160 46 0 2.78 +197 81 1.43 2.78 +41 48 0 2.785 +180 68 1.025 2.785 +191 234 1.215 2.785 +167 233 1.615 2.79 +167 199 0 2.79 +213 242 0 2.79 +103 9 0 2.79 +170 11 1.995 2.79 +174 219 2.065 2.79 +192 219 0 2.795 +167 204 0 2.795 +183 218 0.425 2.795 +170 150 1.27 2.795 +155 9 0.425 2.8 +156 190 2.12 2.8 +217 218 0 2.805 +178 46 1.685 2.81 +185 218 0 2.815 +160 191 2.29 2.815 +202 240 0.285 2.82 +161 210 2.235 2.82 +69 68 1.205 2.825 +161 196 2.02 2.825 +177 213 1.955 2.825 +192 210 1.485 2.83 +167 87 0.785 2.83 +177 69 1.67 2.83 +177 181 0 2.83 +180 194 0 2.83 +180 67 0 2.83 +151 165 0 2.835 +164 180 1.62 2.835 +152 6 0.8 2.84 +183 215 0 2.84 +82 223 1.73 2.845 +167 92 0 2.845 +161 223 2.155 2.845 +35 100 2.27 2.845 +178 103 0.975 2.85 +143 164 2.145 2.85 +149 103 0 2.855 +164 179 0 2.855 +209 208 2.04 2.86 +174 180 0 2.865 +198 195 0 2.87 +135 82 2.155 2.875 +192 48 0 2.88 +134 162 1.76 2.88 +171 219 2.175 2.88 +168 201 0 2.88 +178 40 0 2.88 +103 37 2.075 2.89 +133 162 0 2.89 +189 164 2.215 2.91 +186 209 2.08 2.91 +181 211 0.82 2.91 +194 217 0.4 2.91 +147 163 0.085 2.915 +171 215 2.4 2.915 +69 87 0 2.92 +192 179 1.835 2.925 +151 11 0 2.925 +138 11 1.01 2.93 +179 215 1.71 2.93 +11 43 0 2.93 +47 97 1.165 2.93 +152 69 0.56 2.935 +180 219 2.315 2.935 +135 58 0 2.935 +189 63 2.44 2.94 +171 234 2.06 2.94 +150 162 0.76 2.94 +209 223 0 2.94 +217 200 2.075 2.94 +186 220 1.2 2.95 +210 39 2.43 2.955 +143 63 1.16 2.955 +143 51 2.355 2.955 +168 226 1.985 2.96 +168 200 2.135 2.96 +150 37 0 2.965 +152 156 0 2.965 +138 58 2.435 2.965 +202 215 0 2.97 +202 214 0.295 2.97 +184 155 2.465 2.97 +147 165 0 2.97 +150 6 1.935 2.97 +187 249 2.43 2.975 +166 186 0 2.975 +180 79 0.885 2.975 +151 202 2.385 2.98 +138 186 0.985 2.98 +201 217 0 2.985 +147 192 2.1 2.99 +185 219 2.23 2.99 +183 74 1.16 2.995 +35 51 0 2.995 +201 234 0 2.995 +185 215 2.35 3 +181 70 2.46 3 +41 202 2.245 3.005 +174 223 1.465 3.005 +136 210 2.43 3.015 +148 35 1.725 3.015 +171 223 2.455 3.015 +178 213 0 3.015 +187 215 1.965 3.02 +136 178 0 3.025 +170 217 0 3.025 +181 44 2.28 3.025 +143 58 0 3.025 +103 69 2.5 3.03 +133 149 1.695 3.03 +133 147 0 3.03 +43 65 0.96 3.035 +206 209 2.14 3.04 +151 201 2.43 3.04 +183 87 2.495 3.04 +174 208 1.445 3.04 +181 188 0 3.04 +136 149 2.395 3.045 +162 181 0 3.045 +140 160 2.345 3.05 +148 9 2.34 3.05 +162 180 0 3.05 +180 69 0.915 3.05 +181 215 1.65 3.05 +24 147 1.575 3.05 +222 196 0 3.05 +149 162 1.89 3.055 +198 202 0 3.06 +198 200 0 3.065 +172 216 2.495 3.065 +155 202 2.28 3.065 +183 40 2.49 3.065 +162 213 0 3.065 +174 209 0.615 3.065 +189 202 0 3.07 +151 69 2.505 3.07 +166 215 1.145 3.07 +15 3 0 3.075 +43 223 2.3 3.08 +202 209 2.175 3.08 +180 65 0 3.08 +133 163 2.44 3.08 +35 181 2.035 3.085 +129 162 0 3.085 +135 197 2.47 3.085 +151 197 2.5 3.09 +213 70 0.845 3.09 +187 91 1.425 3.09 +170 41 2.045 3.09 +168 217 0 3.095 +217 241 2.185 3.095 +140 176 2.225 3.1 +150 217 1.725 3.1 +213 226 2.265 3.1 +166 233 2.54 3.1 +181 241 2.335 3.1 +167 217 0 3.105 +159 209 0.675 3.105 +170 58 0 3.105 +172 200 0.15 3.11 +41 148 2.585 3.115 +136 217 1.45 3.115 +213 97 2.095 3.115 +183 57 2.42 3.115 +136 152 0 3.12 +130 56 2.485 3.12 +35 241 2.375 3.125 +172 230 1.61 3.13 +151 174 2.56 3.13 +35 214 2.6 3.13 +206 222 0 3.135 +206 253 1.175 3.135 +43 91 0.635 3.14 +171 208 0 3.145 +184 35 0 3.15 +206 238 2.355 3.155 +15 42 0.2 3.155 +35 194 0.495 3.155 +147 35 2.11 3.165 +134 156 2.375 3.17 +189 58 0.265 3.175 +153 176 2.4 3.175 +222 223 0 3.175 +182 168 2.49 3.18 +179 241 1.59 3.18 +172 235 2.225 3.185 +160 4 2.685 3.185 +206 224 2.34 3.19 +11 149 2.65 3.19 +134 185 2.03 3.195 +43 234 2.42 3.2 +134 170 1.125 3.2 +177 47 2.695 3.2 +184 67 0 3.205 +167 179 2.6 3.205 +168 211 2.65 3.205 +176 45 1.91 3.205 +135 86 2.15 3.205 +213 76 2.545 3.21 +186 42 2.06 3.21 +43 210 1.745 3.215 +149 8 2.225 3.215 +150 167 2.205 3.215 +187 44 0.49 3.215 +222 255 1.88 3.22 +149 37 2.4 3.225 +186 64 2.385 3.225 +153 198 2.355 3.23 +186 44 0.615 3.235 +176 208 0 3.235 +191 203 0.25 3.235 +184 168 1.845 3.24 +151 189 0.375 3.245 +152 37 0 3.245 +213 187 2.515 3.245 +177 35 0.925 3.25 +43 109 1.36 3.255 +171 191 0 3.255 +135 201 2.065 3.255 +192 47 0 3.26 +15 19 2.73 3.26 +43 80 2.545 3.265 +151 173 1.415 3.265 +186 178 2.635 3.27 +69 194 0.525 3.275 +170 201 2.155 3.275 +213 75 2.61 3.28 +198 41 2.315 3.285 +140 198 2.23 3.285 +167 81 1.965 3.285 +153 183 2.585 3.285 +198 73 2.775 3.29 +147 198 2.125 3.295 +181 194 0 3.295 +190 3 0 3.295 +132 160 0.355 3.3 +140 173 0 3.3 +152 38 2.34 3.3 +147 162 0 3.305 +171 161 2.105 3.305 +171 43 2.445 3.31 +168 164 0 3.31 +177 186 1.02 3.31 +190 37 2.57 3.31 +190 17 2.575 3.32 +138 171 2.82 3.325 +138 161 2.46 3.335 +191 196 0 3.335 +202 218 0 3.335 +192 209 0 3.34 +206 196 2.225 3.34 +159 11 0 3.345 +143 147 1.745 3.345 +202 249 1.95 3.345 +1 8 0 3.35 +155 45 0 3.35 +24 60 2.47 3.35 +52 126 0.905 3.355 +155 12 2.655 3.355 +222 218 0 3.355 +202 76 2.84 3.355 +151 160 1.72 3.36 +151 187 2.02 3.36 +155 161 2.855 3.36 +209 254 0 3.36 +52 96 2.515 3.365 +43 76 2.87 3.37 +138 143 0 3.37 +1 2 0 3.375 +151 217 0.43 3.375 +186 222 1.055 3.375 +186 224 1.925 3.375 +170 203 2.875 3.375 +41 28 2.535 3.38 +189 169 2.71 3.38 +222 254 0 3.38 +170 181 1.155 3.38 +150 213 1.215 3.385 +103 136 2.425 3.39 +156 8 1.615 3.395 +11 33 1.55 3.395 +190 63 2.415 3.395 +202 253 0 3.4 +1 184 2.815 3.405 +148 152 0 3.405 +43 77 0 3.41 +189 171 0 3.41 +190 61 2.285 3.41 +134 198 2.06 3.415 +190 32 2.515 3.42 +171 186 0.865 3.425 +186 218 0 3.425 +135 189 2.735 3.425 +43 220 0 3.43 +43 79 0.6 3.43 +134 167 1.865 3.43 +187 222 2.81 3.435 +182 213 0 3.435 +150 209 2.94 3.44 +156 23 1.69 3.44 +103 179 2.435 3.44 +156 25 2.135 3.445 +1 37 2.42 3.455 +151 251 2.78 3.455 +222 242 2.28 3.455 +176 201 2.115 3.46 +24 55 2.85 3.46 +189 206 0 3.47 +69 36 1.985 3.47 +148 17 1.795 3.475 +150 168 1.81 3.48 +140 189 0 3.485 +15 17 1.34 3.49 +191 37 2.99 3.49 +206 162 2.76 3.495 +167 209 2.845 3.495 +134 168 1.85 3.5 +181 67 1.66 3.505 +1 61 1.595 3.51 +52 94 0 3.51 +168 172 0 3.51 +186 47 0 3.51 +189 166 1.505 3.515 +189 162 2.365 3.515 +174 177 0 3.515 +43 221 0 3.52 +131 150 2.885 3.52 +160 12 2.9 3.52 +24 198 2.25 3.52 +192 188 2.995 3.525 +43 111 2.505 3.525 +132 209 2.77 3.525 +131 167 2.53 3.525 +155 15 0.425 3.525 +185 197 2.465 3.525 +178 67 2.585 3.53 +198 195 2.995 3.535 +155 148 1.905 3.535 +176 180 2.295 3.54 +217 59 2.975 3.54 +43 35 1.635 3.545 +156 16 2.965 3.55 +155 188 2.985 3.555 +69 68 2.93 3.555 +131 209 2.885 3.56 +156 12 0 3.56 +202 111 2.985 3.56 +156 44 0.545 3.575 +151 41 0 3.58 +182 172 2.565 3.58 +168 185 2.375 3.585 +69 111 3.045 3.59 +134 138 2.235 3.595 +155 159 0 3.595 +103 39 0.825 3.595 +163 94 0.785 3.595 +162 198 0 3.6 +11 4 2.01 3.6 +69 40 0 3.605 +177 37 1.145 3.605 +206 221 0 3.605 +191 193 0 3.61 +1 34 1.575 3.615 +1 19 0.755 3.62 +151 172 0 3.62 +69 97 1.285 3.62 +162 167 1.35 3.62 +183 211 3.025 3.625 +185 39 2.985 3.625 +209 196 0 3.625 +172 86 0 3.635 +24 170 2.535 3.635 +131 147 0 3.64 +180 212 0 3.64 +171 217 0 3.645 +151 213 0.985 3.645 +222 194 0 3.645 +161 193 1.975 3.645 +176 188 0 3.645 +11 58 3.05 3.645 +217 210 2.24 3.65 +192 132 1.165 3.655 +171 187 0 3.655 +187 234 0.195 3.655 +222 211 1.6 3.655 +186 48 0 3.655 +182 73 0 3.655 +24 57 2.975 3.665 +187 208 0 3.67 +180 111 2.81 3.67 +172 73 2.885 3.675 +103 185 1.735 3.68 +170 187 2.855 3.68 +206 163 2.355 3.68 +15 178 0 3.685 +27 42 0 3.685 +155 190 0 3.69 +135 174 2.655 3.69 +43 208 1.945 3.695 +3 182 2.905 3.695 +130 1 2.89 3.7 +190 12 1.645 3.7 +134 179 2.465 3.705 +182 188 0 3.705 +24 40 1.035 3.705 +130 194 2.805 3.71 +155 217 2.375 3.71 +177 69 2.945 3.71 +192 45 0 3.715 +172 188 2.595 3.715 +151 171 0.69 3.715 +184 156 0.995 3.72 +24 162 3.2 3.72 +130 56 3.195 3.725 +183 59 1.87 3.725 +130 191 2.935 3.73 +183 215 3.205 3.735 +179 111 3.18 3.735 +33 66 0 3.735 +134 166 0 3.745 +217 197 1.325 3.745 +147 191 2.92 3.75 +1 179 2.805 3.76 +198 86 0 3.76 +165 196 2.255 3.76 +6 2 0 3.76 +186 59 1.975 3.76 +202 180 2.345 3.76 +147 210 2.04 3.765 +209 211 2.75 3.765 +217 249 2.01 3.765 +153 41 0 3.77 +172 69 2.925 3.775 +69 75 3.15 3.78 +6 28 1.57 3.78 +182 69 0 3.78 +161 179 1.755 3.785 +172 41 2.7 3.79 +192 222 0 3.795 +149 162 3.26 3.795 +222 208 0 3.795 +170 153 0 3.795 +190 177 0 3.795 +170 182 0 3.805 +181 214 0 3.805 +43 48 0 3.81 +167 203 3.11 3.81 +163 84 3.035 3.81 +150 69 1.515 3.815 +13 16 3.005 3.815 +192 178 1.08 3.82 +134 27 1.39 3.82 +168 199 3.215 3.82 +202 221 0 3.82 +178 48 1.715 3.82 +163 193 0 3.82 +158 148 0 3.82 +185 203 2.34 3.825 +139 171 2.765 3.825 +251 182 3.235 3.83 +192 180 0 3.835 +170 198 1.88 3.835 +179 211 0 3.835 +147 69 1.975 3.84 +15 12 2.58 3.845 +156 148 3.275 3.845 +183 74 3.32 3.845 +177 152 0 3.845 +135 139 0 3.845 +191 213 3.23 3.845 +213 111 3.155 3.845 +161 180 2.22 3.855 +181 220 1.59 3.855 +150 23 3.355 3.865 +156 45 0 3.865 +11 48 0 3.875 +69 55 0.37 3.88 +179 212 0 3.88 +33 63 0 3.885 +213 199 3.165 3.885 +69 41 0.425 3.89 +251 153 0 3.89 +184 11 3.245 3.895 +151 170 0 3.895 +160 178 2.535 3.895 +130 82 2.495 3.9 +222 68 0 3.9 +33 64 2.08 3.9 +135 82 3.385 3.9 +132 140 3.345 3.905 +187 204 2.64 3.905 +179 180 0 3.905 +213 249 2.15 3.905 +172 76 2.755 3.91 +222 109 0 3.91 +170 136 0.14 3.91 +147 136 0 3.915 +160 185 0 3.915 +147 222 2.97 3.92 +217 45 3.01 3.92 +222 69 2.595 3.925 +185 45 0 3.93 +186 219 1.21 3.93 +182 23 1.745 3.93 +191 179 2.69 3.93 +213 35 0 3.93 +184 67 3.325 3.935 +179 36 2.94 3.935 +11 59 1.7 3.935 +251 148 2.53 3.935 +37 211 2.995 3.935 +179 35 0 3.94 +143 1 3.44 3.94 +74 91 0 3.94 +172 183 0 3.945 +147 161 0 3.945 +143 209 3.12 3.95 +183 45 1.37 3.955 +11 23 2.725 3.955 +198 241 1.255 3.96 +159 46 3.46 3.96 +179 65 1.935 3.96 +43 59 0 3.965 +192 175 3.45 3.97 +1 152 0 3.97 +185 219 3.045 3.97 +184 209 2.83 3.975 +162 179 0 3.975 +130 167 2.425 3.98 +209 180 0 3.985 +192 41 2.07 3.99 +206 185 3.48 3.99 +159 180 0 3.995 +176 219 0 4.01 +178 47 2.7 4.01 +132 135 3.43 4.015 +172 52 3.475 4.015 +156 183 0 4.015 +69 78 2.365 4.02 +171 197 2.48 4.025 +69 35 0 4.025 +52 237 2.77 4.03 +140 136 0 4.035 +151 177 3.41 4.035 +43 78 0 4.04 +15 74 2.875 4.04 +217 234 0 4.04 +130 69 3.44 4.045 +206 187 0 4.05 +222 48 1.315 4.05 +209 181 1.575 4.055 +186 180 1.095 4.06 +181 3 2.78 4.06 +172 191 3.485 4.065 +198 219 3.41 4.075 +172 223 3.51 4.08 +130 140 1.995 4.08 +153 166 0.725 4.08 +190 161 3.16 4.08 +37 181 2.02 4.08 +33 43 3.575 4.085 +52 148 3.115 4.09 +156 187 3.05 4.09 +168 196 0 4.09 +213 216 0 4.09 +74 42 0 4.095 +151 149 3.455 4.1 +143 148 0.955 4.1 +24 82 2.22 4.105 +191 78 3.09 4.115 +192 172 2.805 4.12 +206 219 0 4.12 +186 44 3.385 4.125 +202 209 3.125 4.125 +217 216 0 4.125 +217 80 3.005 4.125 +251 190 3.12 4.125 +143 81 3.32 4.13 +147 78 3.385 4.135 +156 170 0 4.135 +186 220 3.225 4.135 +179 214 1.51 4.135 +74 94 1.91 4.135 +130 185 3.165 4.14 +151 56 3.35 4.14 +152 39 0.3 4.145 +15 48 0.655 4.15 +143 160 1.29 4.15 +190 78 0.305 4.15 +153 185 0 4.155 +190 36 0 4.155 +1 78 2.95 4.165 +183 121 2.915 4.165 +190 178 0 4.165 +74 92 3.5 4.17 +1 222 3.275 4.175 +130 210 3.02 4.185 +148 210 3.345 4.185 +202 250 2.65 4.185 +151 167 0 4.195 +217 203 0 4.195 +179 70 2.17 4.2 +181 210 0 4.2 +37 85 2.31 4.205 +163 148 3.28 4.205 +13 152 2.345 4.21 +206 84 2.125 4.21 +172 208 0.99 4.215 +159 176 0 4.215 +160 177 0 4.215 +251 177 3.67 4.215 +132 152 1.775 4.22 +178 67 3.695 4.22 +186 198 3.245 4.225 +209 81 2.36 4.225 +179 241 3.285 4.225 +213 211 0 4.225 +13 177 3.65 4.23 +37 55 0 4.23 +1 36 2.78 4.235 +162 226 3.41 4.235 +186 7 2.49 4.24 +179 67 0.73 4.24 +13 190 2.535 4.25 +74 36 1 4.25 +15 43 3.315 4.255 +189 156 3.295 4.255 +189 90 3.545 4.255 +152 178 0 4.255 +33 190 0 4.255 +183 55 0.915 4.265 +160 187 3 4.265 +251 176 3.355 4.275 +156 13 3.365 4.28 +137 170 0 4.28 +198 203 0 4.285 +202 111 3.595 4.285 +143 191 2.59 4.285 +136 178 3.635 4.29 +82 94 0 4.29 +187 164 3.16 4.29 +176 148 2.465 4.29 +130 182 2.405 4.3 +130 37 3.755 4.3 +26 189 3.33 4.3 +149 190 1.945 4.305 +130 3 3.055 4.305 +192 166 2.835 4.315 +132 136 0 4.315 +37 198 3.645 4.315 +33 74 1.595 4.315 +1 17 0 4.32 +82 87 0 4.32 +160 174 0.335 4.325 +160 74 2.92 4.325 +168 148 3.625 4.325 +150 177 1.215 4.33 +160 191 2.93 4.335 +37 44 3.225 4.335 +251 174 3.385 4.335 +130 148 2.805 4.34 +167 194 0 4.345 +160 33 2.91 4.345 +37 224 3.71 4.345 +37 97 3.445 4.345 +202 223 0 4.355 +139 174 0 4.355 +43 209 1.37 4.36 +134 26 0.195 4.36 +159 156 3.255 4.36 +217 42 3.7 4.36 +24 149 3.37 4.365 +147 2 3.83 4.365 +138 90 3.64 4.365 +168 226 3.33 4.365 +132 50 3.385 4.37 +160 180 0.11 4.37 +209 195 3.875 4.375 +159 190 0 4.38 +162 126 3.755 4.38 +161 202 2.255 4.38 +152 38 3.72 4.385 +206 118 3.475 4.39 +171 118 3.25 4.395 +162 202 3 4.4 +174 190 3.75 4.4 +39 36 1.71 4.405 +148 164 3.335 4.41 +171 220 1.61 4.41 +202 240 3.86 4.41 +179 217 1.305 4.41 +171 164 2.68 4.415 +165 87 3.595 4.42 +138 172 3.83 4.42 +174 220 3.84 4.425 +43 178 2.695 4.43 +52 165 1.275 4.43 +1 3 0 4.44 +206 198 3.385 4.44 +177 224 3.88 4.44 +130 33 3.59 4.445 +192 171 0.345 4.45 +148 36 3.75 4.45 +244 8 2.09 4.45 +186 217 0.475 4.45 +190 222 0 4.45 +152 183 3.93 4.455 +187 121 3.575 4.455 +202 222 0 4.455 +202 193 1.335 4.46 +161 193 3.765 4.46 +179 78 2.67 4.46 +52 223 1.445 4.465 +147 136 3.935 4.47 +171 233 2.05 4.47 +82 229 3.895 4.475 +185 214 0 4.475 +222 223 3.935 4.48 +222 80 3.71 4.48 +190 47 0 4.48 +52 212 2.74 4.485 +159 162 0 4.485 +191 193 3.785 4.485 +184 2 1.975 4.49 +189 164 3.49 4.495 +137 55 3.635 4.495 +11 12 0 4.495 +172 118 3.875 4.5 +155 251 0 4.5 +251 43 3.97 4.5 +186 188 0 4.505 +185 215 3.155 4.51 +162 195 2.77 4.51 +198 211 2.8 4.515 +198 234 3.955 4.52 +130 191 3.785 4.52 +160 45 0 4.52 +184 78 3.71 4.525 +209 238 3.86 4.53 +139 90 2.415 4.53 +39 51 3.95 4.53 +198 67 3.96 4.535 +202 148 2.985 4.535 +1 147 0 4.545 +202 212 2.21 4.545 +178 183 3.855 4.545 +209 226 3.43 4.55 +178 36 0 4.55 +172 86 3.91 4.555 +185 71 3.96 4.555 +39 68 3.995 4.555 +6 183 3.345 4.555 +150 12 3.995 4.56 +37 73 1.265 4.56 +149 43 3.855 4.565 +170 202 1.925 4.565 +178 69 0 4.565 +6 188 3.91 4.565 +43 177 1.215 4.57 +172 213 0 4.57 +37 83 3.995 4.57 +182 136 0 4.57 +209 78 2.635 4.57 +177 164 0 4.57 +160 244 3.63 4.58 +170 203 4 4.58 +155 217 3.945 4.585 +174 187 1.625 4.585 +130 159 0 4.59 +166 179 3.38 4.59 +182 217 0 4.605 +174 223 3.34 4.61 +147 180 0 4.62 +82 200 3.97 4.62 +170 167 0 4.62 +177 241 4.075 4.62 +206 199 3.965 4.625 +187 203 0 4.625 +187 234 4.045 4.625 +82 207 3.26 4.63 +191 223 0 4.63 +172 219 0 4.635 +206 233 0.45 4.635 +183 67 0.77 4.64 +149 74 4.13 4.645 +209 223 3.795 4.645 +176 217 0 4.65 +39 85 0 4.66 +162 210 0 4.66 +6 45 2.125 4.665 +172 69 3.98 4.665 +182 69 3.965 4.665 +170 185 0 4.68 +251 11 2.315 4.68 +147 44 3.91 4.685 +167 203 4.01 4.685 +185 203 4.06 4.685 +6 10 3.76 4.69 +172 215 0 4.69 +167 122 3.58 4.69 +170 135 0 4.69 +152 44 3.895 4.695 +155 7 1.51 4.695 +174 237 2.815 4.695 +191 241 3.265 4.695 +170 201 3.55 4.7 +176 237 4.145 4.7 +184 217 0 4.705 +178 194 3.79 4.705 +37 194 3.87 4.71 +6 58 3.975 4.715 +140 43 4.205 4.72 +206 96 0 4.72 +178 181 0 4.72 +172 183 4.15 4.725 +172 75 1.61 4.725 +179 194 0 4.725 +179 197 0 4.725 +174 208 4.16 4.73 +165 215 4.13 4.74 +170 164 3.54 4.74 +182 135 2.43 4.745 +174 201 2.305 4.745 +1 48 1.91 4.75 +189 148 0 4.75 +185 191 4.24 4.75 +139 161 3.685 4.75 +198 194 0 4.755 +213 226 3.305 4.76 +24 55 3.825 4.765 +172 197 0 4.765 +150 166 2.82 4.765 +155 6 3.58 4.77 +166 190 4.19 4.775 +202 71 4.19 4.78 +135 183 4.145 4.78 +103 183 4.175 4.78 +213 220 0 4.785 +39 188 0 4.785 +155 41 0 4.785 +1 187 3.675 4.79 +136 217 3.945 4.79 +149 184 0.475 4.79 +206 235 2.11 4.79 +103 44 2.21 4.79 +132 148 0 4.795 +202 80 3.045 4.795 +244 148 3.615 4.8 +176 220 0.22 4.805 +143 175 0 4.805 +191 210 1 4.805 +191 219 0.95 4.81 +213 65 1.175 4.815 +151 167 4.26 4.82 +156 166 3.23 4.82 +158 130 3.955 4.82 +213 200 0 4.825 +147 183 2.84 4.825 +206 128 2.955 4.83 +184 136 0.21 4.83 +191 213 3.905 4.835 +190 73 4.225 4.835 +74 48 0 4.835 +198 201 0 4.84 +176 183 0.265 4.84 +165 171 3.825 4.845 +202 164 2.515 4.845 +161 194 1.965 4.845 +43 64 1.96 4.85 +82 204 2.87 4.85 +156 135 3.4 4.85 +165 204 3.855 4.855 +11 74 0.505 4.855 +172 181 0 4.86 +182 89 4.355 4.86 +190 48 0 4.86 +150 135 0.135 4.865 +132 52 3.67 4.87 +24 171 4.29 4.87 +151 168 0 4.87 +155 184 3.175 4.87 +202 47 2.44 4.875 +190 106 4.26 4.875 +244 130 3.625 4.88 +130 194 3.765 4.885 +156 43 3.335 4.885 +165 209 2.325 4.89 +206 126 0.285 4.89 +82 221 4.1 4.89 +147 8 2.39 4.9 +174 194 4.275 4.9 +159 52 2.84 4.91 +155 179 3.875 4.915 +162 238 3.16 4.915 +176 249 4.105 4.915 +6 185 4.4 4.925 +82 241 1.65 4.925 +183 220 0 4.925 +192 164 1.505 4.93 +147 182 0 4.93 +202 191 0 4.935 +139 156 3.405 4.935 +165 198 0 4.94 +15 61 0 4.94 +135 179 3.89 4.94 +150 198 1.9 4.945 +159 43 2.865 4.945 +151 171 4.105 4.95 +155 187 0.755 4.95 +156 130 4.445 4.95 +177 194 0 4.95 +192 212 4.445 4.955 +183 218 4.445 4.955 +185 148 4.37 4.955 +174 209 4.31 4.955 +190 59 2.36 4.955 +162 241 2.59 4.96 +171 181 4.02 4.96 +179 73 2.06 4.96 +192 202 0 4.965 +136 176 3.32 4.965 +24 255 4.2 4.965 +172 216 3.36 4.965 +136 249 4.04 4.97 +206 212 2.195 4.975 +192 64 4.35 4.98 +158 1 4.08 4.98 +39 87 1.04 4.985 +155 183 0.655 4.985 +187 71 3.86 4.985 +165 179 3.9 4.99 +206 208 0 4.99 +7 185 1.435 4.99 +206 220 0.71 4.995 +138 135 2.19 4.995 +168 238 3.9 4.995 +74 220 3.86 4.995 +33 38 4.49 5 +43 181 4.385 5 +222 194 3.75 5 +211 255 0 0.5 +254 106 0 0.505 +226 246 0 0.505 +227 247 0 0.51 +224 240 0 0.51 +158 46 0 0.515 +130 151 0 0.515 +146 14 0 0.52 +154 42 0 0.52 +256 1 0 0.525 +212 228 0 0.525 +212 101 0 0.525 +254 112 0 0.53 +224 251 0 0.53 +244 112 0 0.535 +219 236 0 0.54 +249 224 0 0.54 +67 110 0 0.545 +208 228 0 0.545 +228 256 0 0.545 +247 152 0 0.545 +256 14 0 0.55 +141 58 0 0.55 +242 110 0 0.55 +249 105 0 0.55 +130 255 0 0.55 +196 116 0 0.56 +244 159 0 0.56 +202 207 0 0.565 +241 132 0.065 0.565 +244 152 0 0.565 +208 256 0 0.57 +233 232 0 0.57 +249 71 0 0.57 +158 242 0 0.58 +203 236 0 0.585 +231 149 0 0.59 +211 227 0 0.59 +238 200 0.09 0.59 +141 28 0 0.595 +111 146 0 0.6 +211 99 0 0.6 +212 99 0 0.605 +141 170 0 0.605 +146 15 0 0.605 +252 149 0 0.605 +223 251 0 0.61 +111 46 0.06 0.615 +134 169 0 0.615 +200 246 0 0.62 +253 110 0.04 0.62 +234 246 0 0.625 +244 160 0 0.625 +252 152 0 0.63 +254 251 0 0.635 +211 145 0.085 0.64 +216 232 0 0.64 +249 211 0.05 0.64 +134 185 0 0.64 +245 137 0.11 0.645 +256 144 0 0.655 +158 110 0 0.655 +153 189 0 0.655 +250 108 0 0.66 +238 242 0 0.66 +245 71 0 0.66 +193 116 0.045 0.665 +203 251 0 0.665 +153 166 0 0.665 +207 125 0 0.67 +103 115 0 0.675 +207 127 0.125 0.675 +232 252 0 0.685 +247 135 0 0.69 +218 65 0.045 0.69 +208 194 0.045 0.695 +158 112 0 0.695 +245 250 0.08 0.695 +246 232 0 0.695 +134 132 0.055 0.695 +251 239 0 0.7 +243 252 0.05 0.7 +194 225 0 0.7 +97 14 0 0.705 +234 252 0 0.705 +235 255 0 0.72 +240 132 0 0.72 +111 10 0 0.725 +247 130 0 0.725 +232 151 0 0.73 +67 100 0 0.74 +214 66 0 0.74 +230 252 0 0.74 +249 232 0 0.74 +224 67 0.24 0.745 +196 216 0 0.75 +239 32 0 0.75 +196 215 0.12 0.76 +254 95 0.045 0.76 +211 225 0 0.76 +220 101 0 0.76 +138 186 0 0.765 +145 14 0.24 0.765 +245 251 0.22 0.765 +103 21 0 0.77 +1 115 0 0.77 +1 34 0 0.77 +67 113 0 0.775 +204 226 0.235 0.775 +146 158 0 0.775 +252 104 0 0.775 +142 139 0 0.775 +254 15 0.095 0.78 +216 226 0 0.78 +145 5 0 0.78 +249 137 0 0.78 +203 238 0 0.79 +240 174 0.065 0.79 +67 104 0 0.795 +111 9 0.17 0.795 +1 7 0.245 0.8 +241 101 0 0.8 +212 77 0 0.805 +232 152 0 0.805 +244 113 0.265 0.805 +248 107 0.285 0.805 +157 186 0 0.81 +67 243 0 0.83 +1 101 0 0.83 +241 240 0 0.83 +246 109 0.06 0.83 +146 132 0 0.835 +157 170 0 0.845 +111 106 0 0.85 +219 73 0 0.85 +241 256 0 0.85 +157 11 0 0.855 +224 244 0 0.855 +65 80 0 0.855 +241 227 0 0.855 +240 159 0 0.86 +195 243 0.24 0.86 +65 113 0.285 0.865 +239 174 0.045 0.865 +247 101 0 0.865 +218 254 0 0.87 +223 67 0 0.875 +239 131 0 0.875 +75 13 0.135 0.88 +211 228 0 0.88 +235 155 0 0.88 +193 113 0 0.885 +109 108 0 0.885 +250 111 0 0.885 +142 15 0.335 0.885 +109 9 0 0.895 +224 111 0 0.895 +230 140 0.05 0.895 +243 101 0 0.895 +235 238 0 0.9 +67 248 0 0.905 +157 177 0 0.905 +241 158 0 0.905 +203 253 0 0.91 +204 253 0 0.91 +142 190 0 0.91 +111 125 0 0.915 +200 120 0.315 0.915 +235 256 0.17 0.915 +248 104 0 0.915 +103 119 0 0.92 +220 106 0 0.92 +65 110 0 0.92 +251 111 0 0.92 +244 103 0.265 0.92 +196 227 0 0.925 +103 1 0.15 0.925 +142 111 0.045 0.925 +219 212 0.25 0.93 +249 109 0 0.945 +207 235 0 0.95 +228 159 0 0.95 +107 153 0 0.95 +256 148 0 0.955 +240 153 0.4 0.955 +224 241 0 0.96 +224 106 0 0.96 +245 252 0 0.96 +138 27 0.385 0.965 +138 173 0 0.965 +75 79 0 0.965 +224 238 0 0.965 +230 123 0.385 0.965 +240 155 0 0.965 +255 155 0.44 0.97 +75 253 0 0.975 +251 159 0 0.975 +134 170 0 0.975 +214 248 0.05 0.98 +236 256 0 0.98 +245 236 0 0.98 +109 15 0.425 0.985 +226 149 0 0.985 +239 158 0.475 0.985 +75 154 0.165 0.99 +230 119 0.1 0.99 +234 254 0.44 0.99 +236 253 0 0.99 +245 227 0 0.99 +224 255 0 0.995 +248 154 0.21 0.995 +234 255 0 1 +247 253 0.425 1 +232 140 0 1.005 +240 140 0.435 1.005 +142 155 0 1.01 +111 159 0 1.015 +75 125 0 1.015 +252 5 0 1.015 +234 109 0.18 1.015 +242 150 0.405 1.015 +9 27 0 1.015 +111 190 0.06 1.025 +248 1 0 1.025 +142 173 0 1.03 +75 112 0 1.035 +242 228 0 1.035 +247 149 0 1.035 +75 109 0 1.04 +146 37 0.39 1.04 +248 250 0.065 1.04 +233 138 0 1.04 +220 223 0.33 1.045 +9 57 0 1.045 +134 154 0.25 1.05 +208 255 0 1.055 +146 178 0 1.055 +65 244 0.06 1.055 +244 110 0 1.055 +231 139 0.48 1.055 +236 170 0.505 1.06 +141 159 0 1.06 +9 8 0.36 1.06 +207 255 0 1.065 +230 250 0 1.065 +235 142 0 1.065 +239 161 0.54 1.065 +105 150 0 1.065 +224 95 0.075 1.07 +228 1 0.3 1.07 +141 145 0 1.07 +254 78 0 1.075 +220 109 0 1.075 +251 137 0 1.075 +239 130 0 1.075 +242 247 0.5 1.08 +211 238 0 1.085 +194 238 0 1.09 +228 158 0 1.09 +228 174 0.24 1.095 +251 151 0.49 1.095 +200 227 0 1.1 +218 246 0 1.1 +105 25 0 1.1 +141 255 0 1.1 +146 100 0 1.105 +226 247 0 1.105 +146 136 0 1.11 +224 249 0.59 1.11 +146 148 0 1.115 +224 251 0.6 1.115 +249 107 0 1.115 +235 144 0 1.115 +105 10 0 1.115 +235 253 0 1.12 +141 161 0 1.12 +13 29 0 1.12 +138 174 0 1.125 +207 227 0 1.125 +248 251 0.45 1.125 +231 23 0 1.125 +157 190 0 1.13 +223 111 0.275 1.13 +9 104 0 1.14 +146 147 0 1.14 +146 182 0.37 1.14 +246 106 0.445 1.14 +196 145 0.645 1.145 +226 255 0 1.145 +142 160 0 1.145 +239 31 0.52 1.145 +141 31 0 1.145 +13 125 0 1.145 +193 211 0.35 1.15 +142 177 0 1.15 +221 109 0 1.15 +13 186 0 1.15 +80 68 0 1.155 +256 159 0 1.16 +236 144 0 1.16 +146 156 0.385 1.165 +232 147 0 1.165 +239 255 0 1.165 +247 136 0 1.165 +103 107 0 1.17 +103 251 0.62 1.175 +243 111 0.675 1.175 +220 248 0.37 1.18 +223 145 0.65 1.18 +247 157 0.14 1.185 +218 249 0 1.185 +157 174 0 1.195 +157 156 0 1.195 +105 5 0 1.195 +13 61 0 1.195 +237 196 0 1.2 +236 157 0 1.2 +247 107 0.205 1.2 +141 174 0 1.205 +226 134 0 1.21 +13 108 0 1.21 +232 132 0 1.215 +248 105 0 1.215 +211 99 0.73 1.23 +232 136 0 1.235 +157 153 0 1.24 +79 76 0.375 1.24 +219 247 0.41 1.245 +223 228 0 1.245 +228 146 0 1.245 +65 99 0.07 1.245 +13 156 0 1.245 +246 154 0 1.245 +215 134 0.63 1.25 +250 158 0.435 1.25 +196 255 0 1.255 +236 136 0.49 1.255 +247 240 0.65 1.255 +247 256 0.31 1.255 +141 10 0.275 1.255 +220 236 0.74 1.26 +193 200 0 1.265 +254 250 0 1.265 +200 134 0.665 1.265 +157 140 0 1.265 +215 231 0.69 1.265 +220 245 0 1.265 +145 161 0.68 1.265 +232 18 0 1.27 +246 256 0.22 1.27 +207 200 0.51 1.275 +223 225 0 1.275 +13 12 0 1.275 +242 6 0.74 1.275 +79 113 0 1.28 +196 97 0.61 1.285 +196 244 0.475 1.285 +231 138 0 1.285 +138 25 0.135 1.285 +103 154 0 1.285 +142 232 0.64 1.29 +220 235 0.64 1.295 +79 106 0 1.295 +219 235 0 1.3 +79 83 0 1.3 +223 80 0.41 1.305 +236 103 0.715 1.305 +238 138 0.57 1.305 +75 77 0 1.315 +223 77 0 1.315 +254 251 0.765 1.32 +223 250 0 1.32 +251 134 0.235 1.32 +240 109 0.6 1.32 +109 145 0.63 1.325 +215 243 0 1.33 +109 113 0.415 1.335 +254 142 0.77 1.34 +241 109 0.305 1.34 +242 2 0 1.34 +247 155 0.135 1.34 +220 240 0.775 1.35 +207 232 0.755 1.355 +146 134 0 1.355 +243 230 0 1.355 +214 247 0.54 1.36 +75 248 0.25 1.36 +215 103 0.61 1.36 +13 155 0 1.365 +248 9 0 1.365 +223 218 0 1.37 +216 230 0.815 1.38 +226 216 0.825 1.38 +194 230 0.85 1.385 +240 252 0.75 1.385 +240 143 0.56 1.385 +232 131 0 1.39 +253 138 0 1.395 +253 1 0.87 1.395 +244 132 0 1.395 +220 77 0 1.4 +251 11 0.8 1.4 +145 99 0 1.4 +196 224 0.395 1.405 +255 138 0 1.41 +214 224 0.835 1.42 +253 100 0.89 1.42 +5 181 0.585 1.425 +207 219 0.13 1.425 +222 211 0.615 1.425 +208 225 0 1.43 +203 223 0 1.43 +196 67 0.155 1.435 +142 244 0 1.435 +243 136 0 1.435 +212 215 0.87 1.44 +208 142 0.79 1.445 +13 159 0 1.445 +145 5 0.92 1.445 +212 71 0.94 1.455 +222 80 0 1.455 +146 9 0.725 1.455 +252 106 0 1.455 +232 135 0 1.455 +109 99 0.885 1.465 +145 111 0 1.465 +212 99 0.75 1.47 +241 239 0 1.47 +254 80 0 1.475 +242 145 0 1.475 +243 153 0.885 1.475 +13 42 0 1.48 +243 3 0.75 1.48 +145 152 0 1.48 +256 106 0 1.49 +109 16 0.97 1.49 +253 228 0 1.49 +79 250 0.57 1.49 +241 142 0 1.49 +13 45 0 1.495 +203 207 0 1.495 +255 16 0.97 1.5 +243 152 0 1.5 +247 9 0.54 1.5 +200 202 0.99 1.505 +109 68 0 1.505 +109 14 0 1.505 +212 100 0.965 1.505 +223 245 0.785 1.505 +193 229 0 1.51 +219 212 1 1.51 +142 162 0.395 1.51 +67 246 0 1.515 +194 204 0.415 1.515 +204 218 0.595 1.52 +142 149 0.09 1.525 +253 97 0.695 1.53 +208 241 0 1.53 +254 149 0.885 1.535 +109 125 0 1.535 +199 119 0 1.535 +75 72 0.315 1.535 +203 239 0.9 1.535 +216 218 0.66 1.54 +241 149 0 1.545 +145 245 0.61 1.55 +215 235 0.67 1.55 +142 1 0.395 1.555 +253 77 0.76 1.56 +219 238 0 1.56 +256 153 0 1.565 +215 218 0.325 1.565 +79 238 1.045 1.565 +219 255 0.105 1.57 +241 1 0 1.57 +142 147 0 1.575 +241 99 0 1.585 +75 104 0.935 1.59 +202 80 0.965 1.59 +236 240 0 1.59 +241 157 0.775 1.59 +211 229 1.005 1.595 +212 146 0.85 1.595 +220 256 0.375 1.595 +241 130 0 1.595 +243 131 0.64 1.595 +211 248 0 1.6 +215 153 0.645 1.6 +253 110 0.745 1.605 +196 65 0.675 1.61 +223 97 0 1.61 +226 146 0 1.61 +142 174 0 1.61 +220 107 0 1.615 +241 221 0.62 1.615 +145 136 0 1.62 +234 207 0 1.62 +253 244 0 1.63 +202 230 0.17 1.63 +234 122 0 1.63 +247 135 0.845 1.63 +145 146 0 1.635 +234 124 0 1.64 +241 79 0.845 1.64 +208 122 0 1.645 +223 211 0 1.645 +1 31 1 1.645 +208 226 0.815 1.65 +142 32 0 1.65 +248 138 0.965 1.65 +241 240 0.89 1.655 +228 136 0.36 1.66 +254 216 0.995 1.665 +228 150 0.64 1.665 +234 26 0.56 1.665 +241 253 0 1.665 +145 150 0.145 1.67 +247 141 1.095 1.67 +211 232 0 1.675 +223 79 0 1.675 +236 169 0.925 1.675 +242 228 1.14 1.675 +145 174 0 1.69 +141 137 0 1.69 +194 232 0.965 1.69 +220 101 0.94 1.69 +223 244 0 1.69 +247 154 0 1.69 +255 159 0 1.695 +254 146 0 1.695 +141 153 1.1 1.695 +141 173 0 1.695 +215 248 0 1.7 +203 236 1.065 1.7 +215 80 0.805 1.705 +238 154 1.11 1.715 +241 145 0 1.715 +254 98 0.135 1.72 +242 104 0 1.725 +242 103 0 1.725 +200 67 0.885 1.73 +216 232 0.92 1.73 +202 235 0.115 1.73 +75 224 0 1.735 +223 65 0 1.735 +252 12 0 1.735 +1 37 0.24 1.74 +252 41 0.7 1.74 +13 190 0 1.74 +221 249 0.995 1.745 +238 13 1.11 1.75 +13 10 0 1.75 +248 6 0.7 1.755 +145 162 0 1.76 +193 194 0 1.76 +234 239 0 1.76 +234 238 0 1.77 +191 65 1.19 1.77 +145 178 0 1.775 +1 159 0 1.775 +194 229 0 1.78 +215 251 0.54 1.78 +212 98 0.255 1.785 +254 99 0 1.795 +199 202 0 1.795 +142 189 0 1.8 +158 192 0.385 1.8 +212 72 0.83 1.805 +105 12 0.065 1.805 +220 247 0.4 1.805 +75 87 0 1.81 +13 33 1.13 1.815 +247 250 0 1.815 +193 241 0.305 1.82 +245 150 0 1.82 +111 125 1.085 1.82 +80 127 0.72 1.825 +231 23 1.215 1.825 +249 240 0 1.83 +141 255 1.21 1.835 +244 150 0.71 1.835 +133 245 0 1.835 +193 197 0 1.84 +252 112 0.34 1.84 +215 98 0.835 1.845 +157 244 0 1.85 +202 249 0 1.85 +145 189 1.29 1.855 +197 120 1.16 1.855 +215 101 0 1.86 +75 110 0 1.865 +215 252 0 1.865 +142 154 1.035 1.865 +228 244 0 1.865 +240 154 0.425 1.865 +246 182 1.3 1.865 +241 225 0 1.87 +142 148 0 1.875 +236 28 0.265 1.875 +242 232 0 1.875 +244 147 0.835 1.875 +146 7 0 1.88 +13 144 0.975 1.88 +246 256 1.285 1.88 +212 216 0 1.885 +219 246 0 1.885 +235 134 0.47 1.885 +254 107 0 1.89 +252 13 0 1.89 +242 75 0.9 1.89 +246 134 0.55 1.89 +218 253 0 1.89 +199 211 0 1.895 +215 219 0 1.895 +215 105 0.64 1.895 +228 148 0 1.895 +245 134 0 1.895 +247 182 1.275 1.895 +247 136 1.305 1.9 +67 75 0.805 1.905 +157 111 0 1.905 +249 253 0 1.905 +238 30 0.84 1.905 +254 251 1.34 1.91 +211 230 0 1.91 +249 157 0 1.91 +238 248 1.355 1.915 +255 112 0.985 1.92 +204 221 0 1.92 +146 115 1.045 1.92 +219 157 0.5 1.92 +252 139 1.335 1.92 +255 5 1.085 1.925 +230 248 0 1.925 +158 156 0.78 1.925 +207 128 0 1.93 +214 146 1.16 1.935 +243 150 0 1.935 +226 134 1.39 1.94 +172 211 1.13 1.94 +172 221 0 1.945 +215 102 1.155 1.95 +80 111 0 1.95 +142 159 0 1.955 +158 112 0.955 1.955 +228 161 0.585 1.97 +193 128 1.38 1.975 +226 244 0 1.975 +65 216 0 1.98 +249 134 0 1.98 +199 220 1.375 1.985 +67 101 0 1.99 +141 132 0 1.99 +146 8 0 1.99 +236 24 0.88 1.99 +200 220 0.44 2.01 +215 243 1.42 2.01 +215 250 0 2.01 +65 71 0.9 2.01 +111 15 0 2.015 +216 219 1.48 2.015 +109 97 0 2.02 +13 123 0 2.025 +254 77 0 2.04 +220 230 0.415 2.045 +240 29 0.46 2.045 +255 248 1.355 2.05 +216 87 1.205 2.05 +247 251 0 2.05 +203 125 0 2.05 +196 242 0 2.055 +196 239 0 2.055 +250 103 0 2.055 +142 62 1.105 2.055 +240 139 0.73 2.055 +193 225 0 2.06 +219 102 1.4 2.065 +226 239 0 2.065 +226 253 1.005 2.065 +241 98 0.515 2.07 +158 186 0 2.07 +196 253 0 2.075 +107 101 1.51 2.075 +228 147 0 2.075 +145 154 1.095 2.08 +230 250 1.21 2.08 +246 149 0.72 2.08 +212 244 0 2.085 +245 255 1.09 2.09 +200 207 1.305 2.095 +142 161 0 2.095 +228 144 0.96 2.1 +75 230 1.545 2.105 +252 16 1.16 2.105 +231 25 0 2.11 +223 111 1.46 2.11 +223 242 0 2.11 +107 10 0 2.115 +221 77 0 2.115 +80 93 0 2.125 +207 227 1.5 2.125 +196 211 0 2.13 +228 253 1.58 2.13 +238 1 0.71 2.135 +223 256 0 2.15 +246 99 0.605 2.15 +245 149 0 2.16 +224 97 0 2.165 +13 31 0 2.165 +105 13 0 2.17 +226 211 0 2.17 +5 22 1.09 2.17 +207 18 1.62 2.17 +249 107 1.2 2.175 +214 101 0 2.185 +207 141 0.21 2.185 +105 110 0.53 2.19 +203 221 0 2.19 +254 250 1.58 2.195 +5 38 0 2.195 +219 111 1.56 2.205 +243 103 0 2.205 +5 39 0.57 2.205 +145 3 0 2.21 +211 244 0 2.21 +252 134 0 2.21 +249 9 1.665 2.21 +247 147 1.6 2.21 +245 228 0 2.215 +219 106 1.205 2.22 +255 100 1.675 2.225 +219 110 0.93 2.225 +242 79 0.845 2.225 +215 231 1.725 2.235 +224 93 1.145 2.235 +251 29 1.48 2.24 +13 11 0 2.24 +240 225 0 2.245 +248 179 1.605 2.255 +202 109 1.455 2.26 +107 119 0.73 2.265 +219 13 1.36 2.265 +249 256 0 2.265 +13 113 1.75 2.265 +248 177 1.65 2.265 +251 143 1.75 2.27 +219 105 0.875 2.275 +191 220 1.675 2.275 +216 218 1.725 2.28 +202 250 0 2.28 +249 156 1.335 2.28 +203 236 1.745 2.285 +109 102 1.31 2.29 +253 105 1.78 2.29 +215 236 0 2.29 +232 18 1.605 2.29 +248 6 1.79 2.3 +237 106 1.305 2.305 +237 29 0 2.305 +142 149 1.79 2.305 +249 140 0.86 2.305 +252 158 0.75 2.31 +228 134 0.585 2.315 +238 245 0.695 2.315 +218 71 0 2.32 +218 105 0.68 2.32 +145 162 1.81 2.32 +219 77 0 2.32 +256 16 0 2.325 +234 107 1.535 2.325 +245 130 0 2.325 +203 124 0 2.325 +200 134 1.44 2.33 +219 254 0 2.33 +219 252 0 2.335 +237 30 0 2.34 +247 244 1.495 2.34 +111 19 0.9 2.345 +232 137 0 2.345 +141 20 0 2.35 +105 138 1.4 2.35 +220 221 0 2.35 +249 103 1.39 2.35 +196 243 0 2.355 +141 228 0 2.355 +65 253 1.83 2.355 +157 130 1.235 2.36 +232 140 1.3 2.36 +200 203 1.835 2.365 +231 165 1.815 2.37 +241 145 1.75 2.37 +107 138 1.36 2.375 +219 255 1.775 2.38 +232 131 1.455 2.38 +13 106 0 2.38 +145 134 1.845 2.385 +204 250 0 2.385 +216 91 1.83 2.385 +234 154 1.325 2.385 +235 256 1.76 2.385 +223 65 1.82 2.39 +235 154 1.605 2.39 +142 29 0.275 2.395 +241 248 0 2.395 +200 130 1.73 2.4 +250 153 0 2.4 +13 16 0 2.4 +238 130 0 2.405 +197 238 1.75 2.41 +212 97 0 2.41 +226 130 0 2.415 +234 138 0 2.415 +13 108 1.42 2.415 +218 93 0.045 2.42 +226 227 0 2.42 +142 130 0 2.42 +212 68 0 2.425 +220 252 0 2.425 +111 112 0 2.43 +223 243 0.64 2.43 +221 80 0.4 2.43 +247 149 1.225 2.43 +253 243 1 2.435 +251 9 0.54 2.435 +203 239 1.615 2.435 +204 246 0 2.44 +223 251 0.75 2.44 +249 138 0 2.44 +244 130 0 2.44 +111 113 0 2.445 +212 215 1.525 2.45 +223 109 0 2.45 +252 109 0 2.45 +235 27 1.225 2.45 +246 138 1.31 2.45 +145 139 1.365 2.455 +254 110 0 2.455 +223 197 1.36 2.455 +13 125 1.54 2.455 +254 1 0 2.46 +204 252 1.565 2.46 +220 251 0 2.46 +251 13 0 2.46 +238 146 1.84 2.46 +204 211 0.215 2.465 +220 109 1.225 2.465 +240 243 1.855 2.465 +197 228 1.875 2.47 +107 12 0 2.47 +226 116 0 2.47 +235 139 0 2.47 +111 115 0.83 2.475 +219 238 1.895 2.475 +226 231 0 2.475 +236 146 1.875 2.475 +255 130 0.655 2.48 +145 152 1.855 2.48 +145 177 0 2.485 +75 89 0 2.485 +231 146 1.88 2.485 +157 155 0 2.495 +142 19 1.33 2.495 +203 251 1.025 2.495 +145 15 0 2.5 +200 153 1.745 2.5 +234 256 0 2.5 +145 161 1.345 2.505 +254 68 0 2.505 +197 242 1.915 2.505 +141 153 1.91 2.505 +212 67 0 2.505 +154 151 0 2.505 +237 221 0.285 2.51 +111 5 0.805 2.51 +145 160 0 2.515 +111 2 0 2.525 +251 30 1.195 2.525 +200 75 1.05 2.535 +219 256 0 2.535 +221 68 2.03 2.535 +203 75 1.87 2.54 +146 130 0 2.54 +154 176 1.885 2.54 +216 114 1.645 2.545 +220 91 1.76 2.545 +250 144 1.59 2.545 +228 19 1.69 2.545 +141 250 1.195 2.55 +141 155 0 2.55 +251 145 1.255 2.55 +47 254 0.625 2.55 +200 227 1.575 2.555 +228 149 0 2.555 +251 238 0 2.555 +111 72 1.26 2.56 +235 137 0 2.56 +111 149 0.715 2.57 +133 28 0 2.575 +145 24 1.9 2.58 +200 26 1.82 2.58 +75 153 1.78 2.58 +238 149 0.745 2.58 +246 107 0 2.58 +197 247 1.86 2.585 +246 151 2.025 2.585 +111 114 1.205 2.59 +252 185 2 2.59 +244 115 1.475 2.59 +158 4 1.64 2.59 +197 216 2.005 2.595 +253 110 2.03 2.595 +75 242 2.035 2.595 +247 137 0 2.595 +65 83 0 2.605 +249 141 0.85 2.605 +235 142 1.14 2.605 +247 151 0 2.605 +196 215 1.635 2.61 +158 33 0 2.61 +241 244 0 2.61 +256 112 0 2.62 +141 238 0 2.625 +141 145 1.255 2.625 +252 144 0.9 2.625 +241 221 1.71 2.625 +197 254 1.965 2.635 +197 232 1.12 2.635 +75 103 0 2.635 +212 232 2.045 2.645 +226 240 0.99 2.645 +13 2 1.045 2.645 +200 248 0 2.655 +231 53 1.91 2.655 +254 253 0 2.66 +216 104 0 2.665 +236 157 1.435 2.665 +254 17 1.095 2.67 +200 246 0.775 2.67 +197 225 0 2.67 +75 9 0.105 2.67 +229 130 1.81 2.67 +200 146 1.025 2.675 +221 228 2.11 2.675 +242 104 1.815 2.675 +200 242 0 2.68 +109 125 1.575 2.68 +157 139 0 2.68 +194 214 0.375 2.68 +145 148 0 2.685 +158 131 2.035 2.685 +238 30 2.085 2.685 +141 154 1.045 2.69 +250 138 0 2.69 +244 104 0.17 2.69 +75 6 0.495 2.695 +250 158 1.375 2.695 +242 102 1.945 2.695 +222 253 0 2.695 +255 3 0.96 2.7 +200 133 1.3 2.7 +208 239 0 2.7 +243 148 0 2.7 +238 13 1.815 2.705 +13 5 2.055 2.705 +247 155 2.205 2.705 +248 1 1.15 2.705 +249 242 2.09 2.71 +154 189 0.43 2.71 +194 242 0.55 2.715 +248 162 1.665 2.715 +208 141 0.565 2.72 +105 16 1.195 2.72 +252 151 0 2.72 +157 148 0 2.725 +215 242 0 2.725 +241 246 0.815 2.73 +247 138 0 2.73 +235 245 2.2 2.735 +75 156 2.19 2.74 +154 140 0 2.74 +154 170 0.435 2.745 +158 14 0 2.75 +158 190 0 2.75 +245 102 1.545 2.75 +204 141 2.165 2.755 +224 106 1.485 2.755 +252 5 2.1 2.755 +254 149 1.54 2.76 +252 150 0 2.76 +218 253 1.955 2.765 +75 256 0 2.765 +219 251 0 2.765 +194 67 0.425 2.765 +204 251 0 2.77 +226 113 1.24 2.77 +231 28 0 2.775 +215 102 2.13 2.775 +244 101 0 2.775 +245 105 1.415 2.775 +158 3 0 2.78 +158 162 2.135 2.78 +252 170 1.375 2.78 +252 7 0 2.78 +244 216 0.47 2.785 +253 15 2.245 2.79 +214 91 1.34 2.795 +221 110 2.095 2.795 +223 113 2.08 2.8 +248 178 1.295 2.805 +242 3 2.265 2.805 +254 99 1.865 2.81 +219 240 0 2.81 +254 240 0 2.815 +224 240 2.25 2.815 +194 207 2.11 2.82 +249 101 1.6 2.825 +157 1 0.735 2.83 +245 101 0 2.83 +158 146 2.295 2.835 +145 1 0 2.84 +111 98 0.72 2.84 +75 251 0 2.84 +224 76 0.375 2.84 +238 65 1.885 2.84 +158 248 1.89 2.845 +214 101 2.265 2.845 +248 131 0.96 2.85 +111 1 0 2.85 +157 107 0 2.85 +240 109 2.13 2.855 +242 101 0 2.86 +256 4 2.14 2.865 +212 240 1.87 2.865 +247 130 0.855 2.865 +212 228 2.055 2.87 +231 170 2.255 2.875 +111 14 0 2.88 +223 241 0 2.88 +214 87 0.815 2.885 +157 15 0 2.885 +223 225 1.3 2.885 +216 72 0 2.89 +236 139 0 2.89 +216 119 1.385 2.895 +226 65 2.18 2.895 +228 247 1.24 2.895 +242 110 2.34 2.895 +235 246 2.05 2.9 +256 17 1.87 2.905 +212 219 1.835 2.905 +216 108 1.655 2.905 +244 246 0.855 2.905 +214 218 0 2.91 +105 104 0 2.91 +238 109 0.205 2.92 +241 98 2.165 2.92 +248 179 2.41 2.925 +204 232 1.105 2.925 +212 243 0 2.925 +221 207 0 2.925 +224 238 2.225 2.93 +238 244 0 2.93 +241 228 0 2.93 +242 2 1.99 2.93 +255 110 1.71 2.94 +212 142 2.425 2.94 +236 160 2.35 2.945 +254 207 0.535 2.95 +254 98 1.99 2.95 +111 17 0.4 2.95 +111 127 0 2.955 +211 101 0 2.955 +248 3 1.315 2.96 +222 238 1.88 2.96 +197 234 2.355 2.96 +256 108 1.335 2.965 +145 13 0.945 2.985 +226 249 2.32 3 +13 3 0.99 3.01 +247 101 1.62 3.015 +226 204 1.975 3.02 +249 102 1.535 3.02 +214 250 0 3.025 +252 134 2.325 3.025 +248 101 0 3.03 +208 142 1.595 3.035 +212 207 0.54 3.035 +235 153 0 3.035 +200 203 2.44 3.04 +109 108 1.325 3.04 +105 41 2.43 3.04 +247 102 2.42 3.04 +26 16 2.425 3.04 +234 141 0.22 3.045 +247 182 2.455 3.045 +141 160 1.425 3.05 +221 107 2.13 3.05 +234 128 0 3.05 +238 242 0.685 3.05 +75 109 1.285 3.055 +255 148 0 3.06 +158 133 2.26 3.06 +141 256 1.06 3.07 +208 128 0 3.075 +105 182 2.165 3.075 +158 107 0 3.08 +154 7 2.575 3.08 +75 91 0 3.08 +212 253 0 3.08 +142 256 0 3.08 +244 110 1.83 3.08 +145 147 0 3.085 +208 196 0 3.085 +243 3 1.625 3.085 +196 255 2.535 3.095 +221 218 0 3.095 +230 251 0 3.095 +145 152 2.565 3.1 +13 146 1.96 3.105 +241 97 0 3.105 +247 250 1.85 3.105 +211 114 2.08 3.11 +252 109 2.605 3.11 +235 216 2.495 3.11 +211 76 1.335 3.115 +144 163 2.585 3.115 +194 65 0.675 3.12 +195 113 0 3.125 +146 3 0 3.13 +229 235 1.6 3.13 +224 95 1.43 3.13 +76 246 1.74 3.13 +157 252 0 3.135 +249 71 2.255 3.14 +196 240 0 3.145 +109 9 1.21 3.145 +146 1 0 3.145 +241 71 2.235 3.145 +111 107 0 3.15 +76 122 1.55 3.15 +105 155 1.925 3.155 +250 101 0.695 3.155 +243 98 2.185 3.155 +144 173 0 3.16 +196 210 0 3.165 +109 17 0.985 3.17 +204 252 2.55 3.175 +216 156 2.66 3.175 +244 107 2.085 3.18 +226 210 2.295 3.185 +240 252 2.68 3.185 +250 11 2.2 3.19 +195 115 2.49 3.19 +202 235 2.56 3.19 +204 240 2.615 3.195 +111 158 0 3.195 +236 150 0 3.195 +133 236 0 3.195 +203 124 2.59 3.2 +230 246 0 3.2 +242 103 2.495 3.2 +26 173 2.485 3.2 +111 253 0 3.205 +249 76 1.94 3.205 +249 154 0 3.205 +204 253 2.345 3.21 +65 110 1.76 3.21 +235 31 2.315 3.21 +76 101 0 3.21 +158 11 0 3.215 +111 80 2.325 3.215 +111 99 0 3.215 +157 154 0 3.215 +164 210 0 3.22 +210 200 2.53 3.225 +243 153 2.26 3.225 +214 242 0 3.235 +164 207 0 3.235 +144 148 0.695 3.235 +111 95 1.05 3.24 +111 218 2.555 3.245 +164 195 0 3.245 +204 128 1.89 3.25 +204 245 0 3.25 +219 91 1.15 3.25 +234 218 0.455 3.25 +144 131 2.095 3.255 +98 115 0 3.255 +98 120 0 3.255 +256 155 0 3.26 +211 121 2.4 3.26 +157 189 0 3.265 +75 67 2.745 3.265 +158 17 1.7 3.27 +208 218 2.055 3.27 +226 146 1.7 3.27 +154 148 1.05 3.275 +146 156 2.18 3.275 +220 246 0 3.275 +133 153 2.015 3.275 +204 208 0 3.28 +111 110 0 3.28 +157 138 0 3.28 +226 216 2.465 3.28 +204 231 0 3.285 +216 99 0 3.285 +220 245 1.335 3.285 +144 154 0.47 3.285 +111 145 2.355 3.29 +253 107 0 3.295 +231 146 2.62 3.295 +249 105 0.82 3.295 +224 91 0.535 3.3 +249 146 1.4 3.31 +158 154 0 3.315 +158 178 1.82 3.315 +256 190 2.155 3.32 +158 100 2.76 3.32 +158 190 2.81 3.32 +220 218 0 3.32 +244 190 2.785 3.32 +254 216 2 3.325 +204 26 1.745 3.325 +75 245 0.945 3.325 +230 133 0 3.325 +256 11 0 3.33 +212 145 2.38 3.33 +236 146 2.555 3.33 +241 230 2.165 3.33 +154 159 0 3.335 +211 244 2.345 3.335 +249 128 2.8 3.335 +236 245 1.02 3.335 +145 146 1.815 3.34 +245 252 1.02 3.34 +210 216 2.835 3.345 +249 251 0 3.345 +211 99 1.745 3.35 +146 149 0 3.355 +144 243 2.795 3.355 +154 255 0 3.36 +157 160 0 3.36 +146 182 2.35 3.36 +230 245 0 3.36 +204 236 0 3.37 +240 61 2.745 3.37 +142 138 0 3.37 +105 160 2.49 3.375 +256 148 1.28 3.38 +238 132 0.29 3.38 +210 254 0 3.385 +212 79 0 3.385 +212 200 0 3.385 +240 143 2.785 3.39 +244 98 0 3.39 +244 160 2.775 3.39 +220 224 0 3.395 +256 132 2.035 3.4 +254 100 0 3.4 +211 5 2.6 3.4 +195 124 1.535 3.4 +204 229 0 3.405 +246 119 1.375 3.405 +153 8 2.57 3.405 +221 251 1.15 3.41 +243 216 0 3.41 +237 112 2.595 3.415 +238 243 0 3.42 +255 129 1.97 3.425 +199 228 2.075 3.425 +158 250 2.785 3.43 +204 124 0 3.43 +241 204 1.995 3.43 +246 12 2.85 3.43 +247 5 1.665 3.43 +248 8 2.36 3.435 +247 242 1.155 3.435 +145 244 0 3.44 +164 253 2.94 3.44 +236 182 2.38 3.44 +216 152 2.81 3.445 +234 102 2.68 3.445 +246 99 2.265 3.445 +246 107 2.655 3.445 +211 117 1.795 3.45 +238 30 2.83 3.45 +241 220 2.38 3.45 +254 247 2.22 3.455 +253 145 0 3.455 +223 109 2.695 3.455 +250 100 2.925 3.455 +241 247 1.255 3.455 +153 136 0 3.455 +145 247 2.58 3.46 +109 125 2.915 3.46 +236 135 0 3.46 +248 136 0.375 3.465 +255 160 0 3.47 +211 102 1.555 3.47 +223 250 2.905 3.47 +224 76 2.91 3.47 +231 53 2.83 3.475 +226 132 2.695 3.475 +242 216 0 3.475 +248 135 0.94 3.48 +211 243 0 3.48 +226 116 2.845 3.48 +221 144 2.595 3.48 +246 155 2.105 3.48 +246 184 2.355 3.48 +75 117 0.675 3.485 +75 97 2.9 3.485 +246 8 2.31 3.485 +231 136 1.645 3.49 +223 158 2.895 3.49 +13 125 2.505 3.49 +241 249 2.06 3.495 +226 129 0 3.5 +243 148 2.865 3.5 +65 216 2.15 3.505 +164 226 0.44 3.505 +213 254 2.08 3.505 +157 149 1.7 3.51 +65 13 1.83 3.51 +164 254 1.76 3.51 +243 100 2.65 3.51 +246 251 0 3.51 +197 254 2.985 3.515 +13 113 2.77 3.515 +246 25 2.655 3.515 +158 248 2.98 3.52 +146 184 2.36 3.52 +250 112 0 3.52 +197 247 2.85 3.52 +141 32 0 3.52 +252 155 0 3.525 +244 148 0 3.525 +245 99 0.76 3.525 +144 149 1.71 3.53 +109 243 2.885 3.53 +109 1 0.75 3.53 +223 255 0 3.53 +219 77 2.57 3.535 +249 98 2.32 3.535 +109 251 0 3.545 +226 158 2.745 3.545 +142 62 2.945 3.545 +242 132 2.92 3.55 +145 256 0 3.555 +223 145 1.395 3.555 +145 242 2.41 3.565 +215 236 2.535 3.565 +65 243 1.81 3.565 +256 100 2.67 3.57 +144 155 0 3.57 +158 152 1.9 3.57 +109 112 0 3.57 +220 236 2.815 3.575 +246 23 1.905 3.575 +105 12 1.85 3.575 +224 13 1.52 3.58 +238 256 0 3.58 +242 1 0 3.585 +248 181 1.065 3.59 +75 236 1.75 3.59 +216 97 0 3.59 +105 13 2.57 3.595 +105 251 0.615 3.595 +158 242 2.43 3.6 +216 5 0.955 3.6 +240 31 2.48 3.6 +158 147 0 3.605 +142 32 1.825 3.605 +255 17 1.405 3.62 +232 147 1.525 3.62 +240 189 2.82 3.62 +144 174 0 3.625 +158 15 0 3.625 +224 253 0 3.625 +13 112 0 3.625 +229 236 0 3.625 +241 145 2.65 3.63 +238 253 0 3.635 +243 5 0 3.635 +220 230 2.47 3.64 +232 236 0 3.64 +154 112 0 3.65 +142 19 2.66 3.65 +216 101 0 3.655 +237 26 0 3.655 +13 108 2.51 3.655 +245 133 2.075 3.655 +199 236 0.99 3.67 +211 79 2.72 3.67 +240 129 0 3.67 +158 245 3.135 3.675 +215 219 2.21 3.675 +216 6 0.81 3.675 +245 132 2.98 3.675 +65 77 0 3.68 +194 211 0 3.68 +220 98 3.005 3.685 +224 68 0 3.685 +240 138 0 3.69 +158 130 0 3.695 +109 68 1.78 3.695 +109 99 2.935 3.695 +199 245 0 3.695 +212 197 2.965 3.695 +237 221 2.59 3.7 +224 110 0 3.7 +249 140 2.625 3.7 +238 128 2.935 3.7 +240 145 0 3.705 +103 38 0.205 3.705 +237 238 0 3.71 +224 254 0 3.71 +252 5 3.14 3.71 +249 153 0 3.71 +215 252 2.595 3.715 +215 98 2.15 3.715 +252 108 0 3.715 +142 31 1.41 3.715 +144 140 0 3.72 +212 211 0 3.72 +224 256 0 3.72 +154 12 2.615 3.73 +237 123 0 3.73 +224 242 2.645 3.735 +105 112 0 3.74 +242 2 3.16 3.74 +103 3 0 3.75 +203 236 2.835 3.755 +214 72 0 3.76 +230 138 0 3.76 +144 161 0 3.765 +197 203 1.9 3.765 +211 255 2.485 3.775 +221 211 2.94 3.775 +245 150 3.12 3.775 +247 98 2.39 3.775 +224 100 1.11 3.78 +252 101 0 3.78 +249 219 0 3.78 +208 105 2.99 3.785 +237 219 3.13 3.785 +250 127 3.27 3.79 +232 18 2.475 3.795 +236 105 1.835 3.795 +219 252 2.665 3.8 +255 127 3.115 3.805 +80 252 0.555 3.805 +154 5 3.3 3.805 +247 152 1.51 3.805 +75 119 0.485 3.81 +236 134 0 3.81 +144 132 0 3.815 +224 255 1.545 3.815 +249 211 1.23 3.815 +249 250 0 3.815 +211 254 0 3.825 +231 138 1.455 3.825 +252 98 2.44 3.825 +245 149 3.13 3.825 +223 256 2.785 3.83 +226 227 2.61 3.83 +256 189 2.05 3.835 +154 140 3.325 3.835 +215 242 2.855 3.835 +197 211 0 3.835 +256 127 3.015 3.84 +80 246 0.475 3.84 +241 216 0 3.84 +243 247 0 3.84 +144 170 0 3.845 +203 230 0 3.845 +216 80 1.285 3.85 +146 252 0.145 3.85 +200 242 2.875 3.86 +111 211 1.755 3.86 +226 115 2.615 3.86 +243 178 3.295 3.865 +232 131 2.59 3.87 +252 107 0 3.875 +234 138 3.21 3.875 +246 11 2.745 3.875 +247 6 3.205 3.88 +204 211 3.165 3.885 +215 254 2.1 3.885 +220 105 0 3.885 +107 6 0 3.89 +238 113 2.07 3.895 +247 146 0 3.895 +211 35 0.485 3.9 +243 140 3.38 3.9 +107 101 2.485 3.905 +249 248 0 3.91 +142 256 3.115 3.915 +246 104 0.385 3.915 +144 61 2.99 3.92 +211 247 0 3.92 +248 137 2.84 3.93 +236 248 0 3.93 +229 132 2.855 3.935 +238 115 2.77 3.94 +65 5 3.04 3.945 +236 103 1.515 3.945 +242 104 3.36 3.945 +224 77 0 3.95 +214 247 2.4 3.955 +247 105 0 3.955 +158 1 0 3.955 +111 243 1.26 3.96 +204 219 0 3.965 +157 245 3.12 3.965 +215 76 1.115 3.965 +247 182 3.21 3.965 +111 244 0 3.975 +249 245 0 3.975 +105 109 0 3.975 +248 24 1.62 3.98 +65 104 3.4 3.985 +144 156 3.37 3.995 +142 243 0 3.995 +247 245 0 3.995 +254 152 3.1 4 +240 230 2.7 4 +75 110 2.91 4.005 +197 120 3.215 4.005 +220 247 2.38 4.01 +226 207 0 4.01 +157 244 2.205 4.015 +215 235 2.16 4.015 +240 29 2.82 4.015 +238 239 0 4.02 +111 97 0 4.025 +158 138 0.175 4.03 +157 138 3.425 4.035 +229 140 2.955 4.035 +256 108 3.45 4.04 +248 132 1.54 4.04 +200 236 0.715 4.04 +240 26 2.48 4.04 +215 231 2.91 4.045 +215 247 0 4.05 +235 138 0 4.05 +103 183 1.785 4.055 +254 146 1.865 4.06 +229 24 1.65 4.06 +203 215 1.37 4.065 +103 130 2.605 4.065 +226 120 2.54 4.07 +226 247 1.17 4.07 +47 210 0 4.07 +234 140 3.445 4.075 +238 116 1.45 4.075 +238 243 3.485 4.075 +250 153 3.065 4.085 +248 184 1.53 4.09 +253 27 3.39 4.09 +111 146 0.655 4.09 +144 32 0 4.095 +200 140 3.025 4.095 +256 190 3.565 4.1 +234 107 2.705 4.1 +154 45 2.62 4.105 +203 141 3.445 4.105 +224 210 1.62 4.11 +223 141 2.76 4.115 +203 247 3.22 4.12 +47 84 3.34 4.12 +256 243 1.74 4.125 +255 14 0.66 4.125 +253 107 3.325 4.125 +195 231 2.7 4.125 +252 150 3.55 4.125 +245 134 2.66 4.125 +237 236 2.925 4.13 +238 125 2.81 4.135 +200 243 0 4.14 +230 27 2.96 4.14 +200 146 2.8 4.145 +47 66 0 4.145 +248 149 0 4.15 +154 192 2.645 4.15 +245 231 0 4.15 +253 192 3.62 4.155 +250 98 2.97 4.155 +200 134 2.995 4.16 +248 130 0 4.165 +249 231 0 4.165 +76 98 0.985 4.165 +212 142 3.655 4.17 +231 18 0 4.17 +249 232 0.83 4.17 +212 255 0 4.18 +234 251 0 4.18 +232 149 0 4.185 +236 135 3.56 4.185 +47 100 1.19 4.185 +214 80 0.6 4.19 +103 244 0.97 4.19 +204 247 0 4.195 +245 5 1.055 4.195 +235 27 2.89 4.2 +47 91 0.845 4.2 +200 26 2.66 4.205 +195 249 3.005 4.205 +242 5 0 4.205 +65 117 2.795 4.21 +242 103 3.315 4.21 +243 131 2.855 4.21 +245 145 2.485 4.21 +109 108 3.275 4.215 +241 243 0 4.215 +144 27 1.815 4.22 +253 105 2.35 4.22 +65 152 3.395 4.22 +235 250 0.05 4.22 +240 228 0 4.22 +242 19 3.355 4.22 +245 255 2.385 4.22 +248 182 0.8 4.225 +146 8 2.29 4.23 +248 140 0.515 4.245 +229 18 1.705 4.245 +65 83 2.86 4.25 +232 140 2.495 4.25 +214 250 3.47 4.26 +157 232 2.79 4.26 +216 98 0 4.26 +230 134 0 4.265 +248 6 2.765 4.27 +157 149 3.625 4.27 +203 214 3.1 4.27 +203 250 3.095 4.27 +240 255 0 4.27 +242 33 3.685 4.27 +236 173 3.61 4.275 +245 109 3.145 4.275 +253 29 3.48 4.28 +234 215 0 4.28 +211 232 2.235 4.29 +242 98 0 4.29 +243 143 2.83 4.29 +103 2 1.925 4.295 +133 30 3.675 4.295 +158 177 0 4.3 +103 104 0 4.3 +240 250 0 4.3 +224 65 0 4.31 +252 155 3.565 4.31 +242 127 2.56 4.31 +242 113 3.05 4.31 +243 1 0 4.31 +194 232 3.285 4.315 +226 249 3.23 4.32 +252 182 0.27 4.32 +103 99 2.23 4.32 +13 178 3.385 4.32 +232 130 0 4.325 +234 153 3.115 4.33 +242 17 1.535 4.33 +243 177 2.84 4.33 +107 16 0 4.335 +249 236 0 4.335 +197 220 2.345 4.34 +157 154 3.52 4.345 +103 23 0.14 4.345 +214 108 3.62 4.35 +253 189 3.005 4.355 +153 138 0 4.355 +208 154 3.01 4.36 +248 7 2.63 4.365 +146 6 0.625 4.365 +252 139 3.605 4.365 +232 244 0.76 4.365 +250 255 0 4.37 +252 186 3.655 4.37 +234 156 3.5 4.37 +229 134 0 4.37 +76 96 3.84 4.37 +254 149 2.87 4.38 +253 153 3.1 4.38 +223 239 0 4.38 +223 255 3.55 4.39 +103 22 3.635 4.39 +229 243 1.91 4.39 +254 231 3.07 4.395 +214 121 1.405 4.395 +219 71 3.86 4.395 +252 151 3.595 4.395 +144 62 1.065 4.4 +208 141 3.41 4.4 +194 229 3.165 4.4 +69 121 2.955 4.4 +248 17 2.955 4.405 +109 149 3.785 4.41 +252 138 0 4.41 +245 103 0 4.41 +76 119 0 4.41 +153 160 2.47 4.41 +194 228 3.265 4.415 +195 212 1.845 4.42 +231 132 2.66 4.42 +208 255 1.95 4.425 +65 80 3.92 4.425 +158 62 3.385 4.435 +146 23 2.21 4.435 +144 192 0.655 4.44 +223 256 3.92 4.445 +105 160 3.765 4.445 +35 106 3.935 4.445 +154 112 3.845 4.45 +256 189 3.895 4.455 +154 123 3.46 4.455 +67 121 2.345 4.455 +245 229 0 4.455 +231 152 3.715 4.46 +221 250 0.33 4.46 +35 113 3.445 4.46 +69 68 3.78 4.465 +13 17 0.585 4.465 +146 19 3.84 4.47 +240 124 2.735 4.475 +146 22 3.83 4.485 +109 9 3.205 4.49 +241 107 3.985 4.49 +247 28 3.875 4.49 +221 244 2.185 4.495 +235 153 3.11 4.495 +240 247 3.7 4.495 +199 231 0 4.5 +154 110 3.74 4.5 +250 251 0 4.5 +144 145 0.63 4.505 +208 236 2.88 4.505 +35 114 3.15 4.51 +238 144 0.92 4.515 +248 99 3.765 4.52 +144 132 3.885 4.525 +145 20 1.4 4.525 +154 4 3.825 4.525 +157 250 0 4.525 +224 157 2.3 4.525 +238 255 0 4.525 +144 255 0.66 4.53 +208 158 2.94 4.53 +238 65 4.015 4.53 +75 109 3.28 4.535 +242 246 0 4.54 +248 5 0 4.545 +200 242 3.94 4.545 +250 46 3.97 4.545 +65 98 0 4.55 +221 232 3.19 4.555 +238 210 3.98 4.555 +248 244 0 4.56 +238 111 0.105 4.56 +111 95 3.335 4.565 +208 79 3.01 4.565 +142 132 0 4.565 +214 219 0 4.575 +238 109 3.63 4.58 +142 232 1.565 4.58 +15 123 3.995 4.58 +248 154 4.03 4.585 +47 108 3.96 4.585 +142 131 0 4.585 +224 107 0 4.59 +219 9 4.095 4.595 +221 144 3.515 4.595 +232 132 1.635 4.595 +242 211 0 4.595 +243 159 2.435 4.595 +248 147 0.82 4.6 +224 250 0 4.6 +245 244 0.61 4.6 +215 230 0 4.605 +232 147 3.77 4.605 +247 29 3.78 4.605 +221 251 3.72 4.61 +247 144 3.835 4.61 +76 117 0 4.615 +212 157 2.28 4.62 +238 242 3.685 4.62 +234 102 3.675 4.625 +103 15 4.1 4.625 +194 242 4.1 4.63 +235 156 3.805 4.63 +232 242 1.9 4.635 +197 230 0 4.64 +252 108 3.96 4.645 +241 255 0 4.645 +219 108 3.47 4.65 +249 219 3.855 4.65 +228 242 4.09 4.65 +243 184 3.92 4.655 +242 153 4.075 4.66 +215 242 4 4.665 +221 107 3.38 4.665 +246 134 1.975 4.665 +154 46 3.11 4.675 +133 2 3.335 4.675 +195 245 1.71 4.68 +220 47 3.6 4.68 +238 245 2.44 4.68 +35 107 3.725 4.68 +200 210 3.98 4.685 +208 216 3.37 4.69 +47 241 3.825 4.69 +236 13 4.165 4.7 +75 67 4.2 4.705 +195 142 3.79 4.71 +153 5 1.615 4.71 +111 255 0 4.72 +69 226 3.925 4.725 +238 204 4.075 4.725 +256 139 3.74 4.73 +109 110 0 4.73 +203 47 3.785 4.73 +226 247 4.16 4.73 +164 47 3.675 4.73 +254 143 3.6 4.735 +75 101 0.12 4.735 +75 153 3.04 4.74 +250 127 3.985 4.74 +164 220 3.52 4.745 +241 68 3.91 4.745 +47 102 3.975 4.745 +228 30 0 4.745 +109 46 3.94 4.75 +154 108 1.545 4.75 +194 69 3.86 4.75 +236 182 3.525 4.75 +35 110 3.43 4.75 +232 158 2.28 4.755 +254 159 3.345 4.76 +75 146 0.945 4.76 +224 241 3.315 4.765 +214 117 1.36 4.775 +26 57 3.715 4.78 +109 14 1.565 4.79 +142 19 3.965 4.79 +111 250 2.355 4.795 +144 140 3.97 4.8 +75 117 4.165 4.8 +203 233 0 4.805 +223 242 4.125 4.805 +234 233 0 4.805 +35 96 4.195 4.805 +245 254 0.785 4.805 +212 245 0.585 4.81 +153 11 2.19 4.81 +65 77 3.95 4.81 +145 137 3.44 4.815 +75 22 4.16 4.815 +224 77 3.985 4.815 +249 246 0 4.815 +251 52 4.16 4.815 +200 145 2.85 4.82 +154 14 1.535 4.82 +221 158 2.25 4.82 +157 15 4.16 4.83 +226 158 4.295 4.83 +245 99 3.615 4.83 +249 164 3.975 4.835 +200 217 4.325 4.84 +234 105 1.49 4.84 +238 248 4.145 4.84 +203 111 3.77 4.845 +203 157 3.415 4.845 +210 117 4.315 4.845 +254 30 3.8 4.85 +197 216 2.735 4.85 +238 158 0 4.855 +200 69 4.03 4.86 +214 243 4.34 4.86 +203 216 3.25 4.86 +203 230 4.22 4.86 +226 246 3.845 4.86 +164 157 2.87 4.86 +215 246 0 4.865 +220 218 3.51 4.865 +153 135 0 4.87 +249 217 4.3 4.87 +240 216 3.625 4.87 +241 79 3.885 4.87 +111 110 3.58 4.875 +208 13 3.04 4.875 +235 30 4.37 4.875 +146 127 4.29 4.88 +230 21 3.405 4.88 +254 13 0 4.885 +200 243 4.37 4.885 +129 130 4.04 4.885 +144 228 2.195 4.89 +154 155 0 4.89 +223 158 3.695 4.89 +76 121 0 4.89 +111 13 0 4.895 +153 186 3.01 4.895 +197 249 1.915 4.895 +220 105 4.115 4.9 +199 227 1.835 4.9 +244 180 3.72 4.9 +246 5 0.57 4.905 +76 110 2.975 4.905 +228 143 0 4.905 +229 235 3.88 4.905 +13 146 3.81 4.91 +13 152 4.33 4.91 +65 13 4.155 4.91 +236 1 4.17 4.91 +242 158 3.81 4.91 +107 61 1.885 4.91 +203 109 3.58 4.915 +220 71 0 4.915 +142 143 0 4.915 +76 71 0 4.915 +153 105 0.2 4.92 +146 2 0 4.92 +220 80 0 4.92 +226 255 1.235 4.92 +234 251 4.25 4.92 +76 105 0 4.92 +224 35 1.645 4.925 +253 156 3.27 4.93 +154 150 4.09 4.935 +219 35 3.735 4.935 +235 29 0 4.94 +35 84 3.19 4.94 +194 35 4.245 4.945 +232 255 1.52 4.945 +195 248 4.365 4.955 +203 144 4.19 4.96 +35 80 3.715 4.96 +243 246 0 4.96 +142 189 2.485 4.96 +152 130 0 4.96 +103 155 0.76 4.965 +254 256 0 4.97 +203 252 2.74 4.97 +232 131 4.04 4.97 +234 247 0 4.97 +76 108 0 4.97 +109 1 3.865 4.975 +65 255 1.71 4.975 +226 109 3.99 4.975 +76 211 3.14 4.975 +152 113 4.355 4.975 +244 184 3.64 4.975 +219 216 2.48 4.98 +103 25 2.225 4.98 +195 227 4.325 4.985 +215 75 0 4.99 +224 252 4.145 4.99 +107 16 4.45 4.995 +234 154 2.415 5 diff --git a/examples/tracker/reference/lifetime_hist.dat b/examples/tracker/reference/lifetime_hist.dat new file mode 100644 index 0000000000..002e269896 --- /dev/null +++ b/examples/tracker/reference/lifetime_hist.dat @@ -0,0 +1,65 @@ +# Histogrammed data for fix 3 +# TimeStep Number-of-bins Total-counts Missing-counts Min-value Max-value +# Bin Coord Count Count/Total +0 30 0 0 1e+20 -1e+20 +1 0.1 0 0 +2 0.3 0 0 +3 0.5 0 0 +4 0.7 0 0 +5 0.9 0 0 +6 1.1 0 0 +7 1.3 0 0 +8 1.5 0 0 +9 1.7 0 0 +10 1.9 0 0 +11 2.1 0 0 +12 2.3 0 0 +13 2.5 0 0 +14 2.7 0 0 +15 2.9 0 0 +16 3.1 0 0 +17 3.3 0 0 +18 3.5 0 0 +19 3.7 0 0 +20 3.9 0 0 +21 4.1 0 0 +22 4.3 0 0 +23 4.5 0 0 +24 4.7 0 0 +25 4.9 0 0 +26 5.1 0 0 +27 5.3 0 0 +28 5.5 0 0 +29 5.7 0 0 +30 5.9 0 0 +1000 30 8122 0 0.5 5 +1 0.1 0 0 +2 0.3 0 0 +3 0.5 910 0.112041 +4 0.7 1253 0.154272 +5 0.9 953 0.117336 +6 1.1 747 0.0919724 +7 1.3 559 0.0688254 +8 1.5 501 0.0616843 +9 1.7 421 0.0518345 +10 1.9 356 0.0438316 +11 2.1 300 0.0369367 +12 2.3 281 0.0345974 +13 2.5 242 0.0297956 +14 2.7 226 0.0278257 +15 2.9 175 0.0215464 +16 3.1 168 0.0206846 +17 3.3 162 0.0199458 +18 3.5 129 0.0158828 +19 3.7 151 0.0185915 +20 3.9 137 0.0168678 +21 4.1 98 0.012066 +22 4.3 104 0.0128047 +23 4.5 83 0.0102192 +24 4.7 77 0.00948042 +25 4.9 86 0.0105885 +26 5.1 3 0.000369367 +27 5.3 0 0 +28 5.5 0 0 +29 5.7 0 0 +30 5.9 0 0 diff --git a/src/MISC/pair_tracker.cpp b/src/MISC/pair_tracker.cpp index 2069561ee9..f2fdb71081 100644 --- a/src/MISC/pair_tracker.cpp +++ b/src/MISC/pair_tracker.cpp @@ -283,15 +283,8 @@ void PairTracker::init_style() // this is so its order in the fix list is preserved if (fix_history == nullptr) { - char dnumstr[16]; - sprintf(dnumstr, "%d", size_history); - char **fixarg = new char *[4]; - fixarg[0] = (char *) "NEIGH_HISTORY_TRACK"; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "NEIGH_HISTORY"; - fixarg[3] = dnumstr; - modify->replace_fix("NEIGH_HISTORY_TRACK_DUMMY", 4, fixarg, 1); - delete[] fixarg; + modify->replace_fix("NEIGH_HISTORY_TRACK_DUMMY", + fmt::format("NEIGH_HISTORY_TRACK all NEIGH_HISTORY {}", size_history), 1); int ifix = modify->find_fix("NEIGH_HISTORY_TRACK"); fix_history = (FixNeighHistory *) modify->fix[ifix]; fix_history->pair = this; From b108da3e5c73bbacec79583eaa4b01d7670e2e5d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 15:26:29 -0400 Subject: [PATCH 207/352] simplify format handling --- src/MISC/fix_ipi.cpp | 19 +++++++++---------- src/MISC/fix_srp.cpp | 24 +++++++---------------- src/MISC/pair_srp.cpp | 44 +++++++++++++++---------------------------- 3 files changed, 31 insertions(+), 56 deletions(-) diff --git a/src/MISC/fix_ipi.cpp b/src/MISC/fix_ipi.cpp index 277ddc8489..6fc3ec97b5 100644 --- a/src/MISC/fix_ipi.cpp +++ b/src/MISC/fix_ipi.cpp @@ -18,18 +18,19 @@ #include "fix_ipi.h" -#include #include "atom.h" -#include "force.h" -#include "update.h" +#include "comm.h" +#include "compute.h" +#include "domain.h" #include "error.h" +#include "force.h" +#include "irregular.h" #include "kspace.h" #include "modify.h" -#include "compute.h" -#include "comm.h" #include "neighbor.h" -#include "irregular.h" -#include "domain.h" +#include "update.h" + +#include using namespace LAMMPS_NS; using namespace FixConst; @@ -83,15 +84,13 @@ static void open_socket(int &sockfd, int inet, int port, char* host, // fetches information on the host struct addrinfo hints, *res; - char service[256]; memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_PASSIVE; - sprintf(service,"%d",port); // convert the port number to a string - ai_err = getaddrinfo(host, service, &hints, &res); + ai_err = getaddrinfo(host, std::to_string(port).c_str(), &hints, &res); if (ai_err!=0) error->one(FLERR,"Error fetching host data. Wrong host name?"); diff --git a/src/MISC/fix_srp.cpp b/src/MISC/fix_srp.cpp index fb502febaf..b7263dbb48 100644 --- a/src/MISC/fix_srp.cpp +++ b/src/MISC/fix_srp.cpp @@ -246,10 +246,8 @@ void FixSRP::setup_pre_force(int /*zz*/) int nadd_all = 0, ndel_all = 0; MPI_Allreduce(&ndel,&ndel_all,1,MPI_INT,MPI_SUM,world); MPI_Allreduce(&nadd,&nadd_all,1,MPI_INT,MPI_SUM,world); - if (comm->me == 0) { - sprintf(str, "Removed/inserted %d/%d bond particles.", ndel_all,nadd_all); - error->message(FLERR,str); - } + if (comm->me == 0) + error->message(FLERR,"Removed/inserted {}/{} bond particles.", ndel_all,nadd_all); // check ghost comm distances // warn and change if shorter from estimate @@ -276,11 +274,9 @@ void FixSRP::setup_pre_force(int /*zz*/) cutghostmin = comm->cutghost[2]/length2; // stop if cutghost is insufficient - if (cutneighmax_srp > cutghostmin) { - sprintf(str, "Communication cutoff too small for fix srp. " - "Need %f, current %f.", cutneighmax_srp, cutghostmin); - error->all(FLERR,str); - } + if (cutneighmax_srp > cutghostmin) + error->all(FLERR,"Communication cutoff too small for fix srp. " + "Need {:.8}, current {:.8}", cutneighmax_srp, cutghostmin); // assign tags for new atoms, update map atom->tag_extend(); @@ -515,14 +511,8 @@ void FixSRP::post_run() bigint ndelete = natoms_previous - atom->natoms; - if (comm->me == 0) { - if (screen) fprintf(screen,"Deleted " BIGINT_FORMAT - " atoms, new total = " BIGINT_FORMAT "\n", - ndelete,atom->natoms); - if (logfile) fprintf(logfile,"Deleted " BIGINT_FORMAT - " atoms, new total = " BIGINT_FORMAT "\n", - ndelete,atom->natoms); - } + if (comm->me == 0) + utils::logmesg(lmp,"Deleted {} atoms, new total = {}\n",ndelete,atom->natoms); // verlet calls box_too_small_check() in post_run // this check maps all bond partners diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index e3a31dda96..67690c8d11 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -28,24 +28,23 @@ Please contact Timothy Sirk for questions (tim.sirk@us.army.mil). #include "pair_srp.h" -#include - -#include #include "atom.h" +#include "citeme.h" #include "comm.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" -#include "error.h" #include "domain.h" -#include "modify.h" +#include "error.h" #include "fix.h" #include "fix_srp.h" -#include "thermo.h" +#include "force.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" #include "output.h" -#include "citeme.h" +#include "thermo.h" +#include +#include using namespace LAMMPS_NS; @@ -79,26 +78,15 @@ PairSRP::PairSRP(LAMMPS *lmp) : Pair(lmp) nextra = 1; segment = nullptr; - // generate unique fix-id for this pair style instance - - fix_id = strdup("XX_FIX_SRP"); - fix_id[0] = '0' + srp_instance / 10; - fix_id[1] = '0' + srp_instance % 10; - ++srp_instance; - - // create fix SRP instance here + // create fix SRP instance here with unique fix id // similar to granular pair styles with history, // this should be early enough that FixSRP::pre_exchange() // will be invoked before other fixes that migrate atoms // this is checked for in FixSRP - char **fixarg = new char*[3]; - fixarg[0] = fix_id; - fixarg[1] = (char *) "all"; - fixarg[2] = (char *) "SRP"; - modify->add_fix(3,fixarg); + modify->add_fix(fmt::format("{:02d}_FIX_SRP all SRP",srp_instance)); f_srp = (FixSRP *) modify->fix[modify->nfix-1]; - delete [] fixarg; + ++srp_instance; } /* ---------------------------------------------------------------------- @@ -468,10 +456,8 @@ void PairSRP::init_style() if (f_srp != (FixSRP *)modify->fix[ifix]) error->all(FLERR,"Fix SRP has been changed unexpectedly"); - if (comm->me == 0) { - if (screen) fprintf(screen,"Using type %d for bond particles\n",bptype); - if (logfile) fprintf(logfile,"Using type %d for bond particles\n",bptype); - } + if (comm->me == 0) + utils::logmesg(lmp,"Using type {} for bond particles\n",bptype); // set bond and bond particle types in fix srp // bonds of this type will be represented by bond particles From c49a533ad9b8c8585dd033571b8e20e2be223e4b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 15:40:43 -0400 Subject: [PATCH 208/352] reformat, simplify, add reference log files --- examples/PACKAGES/srp/in.srp | 4 +- examples/PACKAGES/srp/log.28Jul2021.srp.g++.1 | 156 ++++++++++++++++++ examples/PACKAGES/srp/log.28Jul2021.srp.g++.4 | 156 ++++++++++++++++++ src/MISC/fix_srp.cpp | 8 +- src/MISC/pair_srp.cpp | 65 ++++---- 5 files changed, 348 insertions(+), 41 deletions(-) create mode 100644 examples/PACKAGES/srp/log.28Jul2021.srp.g++.1 create mode 100644 examples/PACKAGES/srp/log.28Jul2021.srp.g++.4 diff --git a/examples/PACKAGES/srp/in.srp b/examples/PACKAGES/srp/in.srp index 018d916292..7f168acbd5 100644 --- a/examples/PACKAGES/srp/in.srp +++ b/examples/PACKAGES/srp/in.srp @@ -35,8 +35,8 @@ thermo_style custom step temp pe v_nPotEng press atoms v_natoms lx ly lz fix 1 all nve timestep 0.01 -restart 500 mid-run-*.restart +#restart 500 mid-run-*.restart run 1000 -write_restart end-run.restart +#write_restart end-run.restart diff --git a/examples/PACKAGES/srp/log.28Jul2021.srp.g++.1 b/examples/PACKAGES/srp/log.28Jul2021.srp.g++.1 new file mode 100644 index 0000000000..6cf252cba4 --- /dev/null +++ b/examples/PACKAGES/srp/log.28Jul2021.srp.g++.1 @@ -0,0 +1,156 @@ +LAMMPS (28 Jul 2021) + using 1 OpenMP thread(s) per MPI task +units lj +atom_style full +boundary p p p + +special_bonds lj/coul 1 1 1 +newton on on + +# save an extra atom type for bond particles +read_data data.chain +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (10.000000 10.000000 10.000000) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 3000 atoms + reading velocities ... + 3000 velocities + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 2700 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 1 1 1 + special bond factors coul: 1 1 1 + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.013 seconds + +neighbor 2.0 bin +neigh_modify every 10 check yes + +bond_style harmonic +bond_coeff * 225.0 0.85 + +comm_modify vel yes +comm_modify cutoff 3.6 + +# must use pair hybrid, since srp bond particles +# do not interact with other atoms types +pair_style hybrid dpd 1.0 1.0 373692 srp 0.8 1 mid +pair_coeff 1 1 dpd 60.0 4.5 1.0 +pair_coeff 1 2 none +pair_coeff 2 2 srp 100.0 + +# auto normalization of thermo quantities is turned off by pair srp +# just divide by natoms +variable natoms equal count(all) +variable nPotEng equal c_thermo_pe/v_natoms + +thermo 50 +thermo_style custom step temp pe v_nPotEng press atoms v_natoms lx ly lz + +fix 1 all nve +timestep 0.01 + +#restart 500 mid-run-*.restart + +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- @Article{Sirk2012 + author = {T. Sirk and Y. Sliozberg and J. Brennan and M. Lisal and J. Andzelm}, + title = {An enhanced entangled polymer model for dissipative particle dynamics}, + journal = {J.~Chem.~Phys.}, + year = 2012, + volume = 136, + pages = {134903} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Using type 2 for bond particles +Thermo normalization turned off by pair srp (src/MISC/pair_srp.cpp:486) +Neighbor list info ... + update every 10 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3.6 + binsize = 1.5, bins = 7 7 7 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair dpd, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair srp, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Removed/inserted 0/2700 bond particles. (src/MISC/fix_srp.cpp:250) +Per MPI rank memory allocation (min/avg/max) = 21.70 | 21.70 | 21.70 Mbytes +Step Temp PotEng v_nPotEng Press Atoms v_natoms Lx Ly Lz + 0 0.98262092 31772.336 10.590779 60.690437 5700 3000 10 10 10 + 50 0.99678169 31789.37 10.596457 61.967133 5700 3000 10 10 10 + 100 1.016953 31770.946 10.590315 61.808425 5700 3000 10 10 10 + 150 1.0151677 31737.965 10.579322 61.034423 5700 3000 10 10 10 + 200 0.99241972 31766.458 10.588819 60.99902 5700 3000 10 10 10 + 250 1.0101747 31816.098 10.605366 61.484391 5700 3000 10 10 10 + 300 1.0058287 31824.98 10.608327 60.656545 5700 3000 10 10 10 + 350 1.0093409 31839.963 10.613321 61.485931 5700 3000 10 10 10 + 400 1.029692 31713.44 10.571147 61.442428 5700 3000 10 10 10 + 450 1.0292264 31739.234 10.579745 61.026996 5700 3000 10 10 10 + 500 1.0141131 31796.032 10.598677 61.099407 5700 3000 10 10 10 + 550 0.99860738 31887.879 10.629293 61.412249 5700 3000 10 10 10 + 600 1.0104436 31830.675 10.610225 60.725018 5700 3000 10 10 10 + 650 1.0060939 31871.441 10.623814 61.12217 5700 3000 10 10 10 + 700 1.0394405 31724.09 10.574697 60.652294 5700 3000 10 10 10 + 750 1.0094386 31827.328 10.609109 61.274573 5700 3000 10 10 10 + 800 0.99986353 31777.205 10.592402 60.652922 5700 3000 10 10 10 + 850 0.9762615 31752.585 10.584195 61.448972 5700 3000 10 10 10 + 900 0.99324534 31794.723 10.598241 61.191199 5700 3000 10 10 10 + 950 1.0139717 31719.123 10.573041 61.876053 5700 3000 10 10 10 + 1000 0.99850758 31774.801 10.5916 60.960607 5700 3000 10 10 10 +Deleted 2700 atoms, new total = 3000 +Loop time of 6.54135 on 1 procs for 1000 steps with 3000 atoms + +Performance: 132082.911 tau/day, 152.874 timesteps/s +99.9% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.5403 | 4.5403 | 4.5403 | 0.0 | 69.41 +Bond | 0.030682 | 0.030682 | 0.030682 | 0.0 | 0.47 +Neigh | 1.7065 | 1.7065 | 1.7065 | 0.0 | 26.09 +Comm | 0.20647 | 0.20647 | 0.20647 | 0.0 | 3.16 +Output | 0.00084543 | 0.00084543 | 0.00084543 | 0.0 | 0.01 +Modify | 0.034479 | 0.034479 | 0.034479 | 0.0 | 0.53 +Other | | 0.022 | | | 0.34 + +Nlocal: 3000.00 ave 3000 max 3000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 12269.0 ave 12269 max 12269 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0.00000 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0.0000000 +Ave special neighs/atom = 1.8000000 +Neighbor list builds = 21 +Dangerous builds = 0 + +#write_restart end-run.restart +Total wall time: 0:00:06 diff --git a/examples/PACKAGES/srp/log.28Jul2021.srp.g++.4 b/examples/PACKAGES/srp/log.28Jul2021.srp.g++.4 new file mode 100644 index 0000000000..ca41ab915a --- /dev/null +++ b/examples/PACKAGES/srp/log.28Jul2021.srp.g++.4 @@ -0,0 +1,156 @@ +LAMMPS (28 Jul 2021) + using 1 OpenMP thread(s) per MPI task +units lj +atom_style full +boundary p p p + +special_bonds lj/coul 1 1 1 +newton on on + +# save an extra atom type for bond particles +read_data data.chain +Reading data file ... + orthogonal box = (0.0000000 0.0000000 0.0000000) to (10.000000 10.000000 10.000000) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 3000 atoms + reading velocities ... + 3000 velocities + scanning bonds ... + 1 = max bonds/atom + reading bonds ... + 2700 bonds +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 1 1 1 + special bond factors coul: 1 1 1 + 2 = max # of 1-2 neighbors + 2 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.011 seconds + +neighbor 2.0 bin +neigh_modify every 10 check yes + +bond_style harmonic +bond_coeff * 225.0 0.85 + +comm_modify vel yes +comm_modify cutoff 3.6 + +# must use pair hybrid, since srp bond particles +# do not interact with other atoms types +pair_style hybrid dpd 1.0 1.0 373692 srp 0.8 1 mid +pair_coeff 1 1 dpd 60.0 4.5 1.0 +pair_coeff 1 2 none +pair_coeff 2 2 srp 100.0 + +# auto normalization of thermo quantities is turned off by pair srp +# just divide by natoms +variable natoms equal count(all) +variable nPotEng equal c_thermo_pe/v_natoms + +thermo 50 +thermo_style custom step temp pe v_nPotEng press atoms v_natoms lx ly lz + +fix 1 all nve +timestep 0.01 + +#restart 500 mid-run-*.restart + +run 1000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- @Article{Sirk2012 + author = {T. Sirk and Y. Sliozberg and J. Brennan and M. Lisal and J. Andzelm}, + title = {An enhanced entangled polymer model for dissipative particle dynamics}, + journal = {J.~Chem.~Phys.}, + year = 2012, + volume = 136, + pages = {134903} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Using type 2 for bond particles +Thermo normalization turned off by pair srp (src/MISC/pair_srp.cpp:486) +Neighbor list info ... + update every 10 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3.6 + binsize = 1.5, bins = 7 7 7 + 3 neighbor lists, perpetual/occasional/extra = 3 0 0 + (1) pair dpd, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (2) pair srp, perpetual, skip from (3) + attributes: half, newton on + pair build: skip + stencil: none + bin: none + (3) neighbor class addition, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Removed/inserted 0/2700 bond particles. (src/MISC/fix_srp.cpp:250) +Per MPI rank memory allocation (min/avg/max) = 10.35 | 10.35 | 10.35 Mbytes +Step Temp PotEng v_nPotEng Press Atoms v_natoms Lx Ly Lz + 0 0.98262092 31772.336 10.590779 60.908146 5700 3000 10 10 10 + 50 1.0094645 31632.293 10.544098 61.107394 5700 3000 10 10 10 + 100 1.0067657 31633.525 10.544508 61.721089 5700 3000 10 10 10 + 150 0.99163624 31751.06 10.583687 60.437789 5700 3000 10 10 10 + 200 0.98701756 31674.754 10.558251 60.897782 5700 3000 10 10 10 + 250 0.99422545 31689.944 10.563315 61.748317 5700 3000 10 10 10 + 300 0.98351268 31756.124 10.585375 61.164735 5700 3000 10 10 10 + 350 0.99570183 31840.098 10.613366 61.210337 5700 3000 10 10 10 + 400 1.0025719 31832.008 10.610669 61.270633 5700 3000 10 10 10 + 450 0.99464256 31812.213 10.604071 60.625168 5700 3000 10 10 10 + 500 0.98753036 31822.577 10.607526 61.007786 5700 3000 10 10 10 + 550 0.98085348 31779.406 10.593135 61.268608 5700 3000 10 10 10 + 600 1.0031999 31849.695 10.616565 61.938464 5700 3000 10 10 10 + 650 1.0102644 31912.564 10.637521 61.298438 5700 3000 10 10 10 + 700 1.0238545 31799.622 10.599874 61.424427 5700 3000 10 10 10 + 750 1.0186874 31781.261 10.593754 60.706143 5700 3000 10 10 10 + 800 1.0245821 31738.473 10.579491 61.550865 5700 3000 10 10 10 + 850 1.0179726 31720.521 10.573507 61.881576 5700 3000 10 10 10 + 900 1.0154591 31760.887 10.586962 61.673156 5700 3000 10 10 10 + 950 0.99349056 31834.644 10.611548 61.624864 5700 3000 10 10 10 + 1000 1.0033121 31820.089 10.606696 60.698277 5700 3000 10 10 10 +Deleted 2700 atoms, new total = 3000 +Loop time of 2.18923 on 4 procs for 1000 steps with 3000 atoms + +Performance: 394659.660 tau/day, 456.782 timesteps/s +98.1% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2744 | 1.2921 | 1.3222 | 1.6 | 59.02 +Bond | 0.0092027 | 0.0093722 | 0.009696 | 0.2 | 0.43 +Neigh | 0.47767 | 0.47768 | 0.47769 | 0.0 | 21.82 +Comm | 0.34932 | 0.37877 | 0.39403 | 2.9 | 17.30 +Output | 0.001045 | 0.0015711 | 0.003145 | 2.3 | 0.07 +Modify | 0.015498 | 0.016073 | 0.017271 | 0.6 | 0.73 +Other | | 0.01362 | | | 0.62 + +Nlocal: 750.000 ave 754 max 743 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 6941.25 ave 6967 max 6911 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 0.00000 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0.0000000 +Ave special neighs/atom = 1.8000000 +Neighbor list builds = 21 +Dangerous builds = 0 + +#write_restart end-run.restart +Total wall time: 0:00:02 diff --git a/src/MISC/fix_srp.cpp b/src/MISC/fix_srp.cpp index b7263dbb48..055d3119b7 100644 --- a/src/MISC/fix_srp.cpp +++ b/src/MISC/fix_srp.cpp @@ -449,10 +449,10 @@ int FixSRP::unpack_border(int n, int first, double *buf) int m = 0; last = first + n; - for (i = first; i < last; i++) { - array[i][0] = buf[m++]; - array[i][1] = buf[m++]; - } + for (i = first; i < last; i++) { + array[i][0] = buf[m++]; + array[i][1] = buf[m++]; + } return m; } diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index 67690c8d11..332e103b12 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -68,7 +68,7 @@ static int srp_instance = 0; set size of pair comms in constructor ---------------------------------------------------------------------- */ -PairSRP::PairSRP(LAMMPS *lmp) : Pair(lmp) +PairSRP::PairSRP(LAMMPS *lmp) : Pair(lmp), fix_id(nullptr) { writedata = 1; single_enable = 0; @@ -118,18 +118,16 @@ void PairSRP::allocate() PairSRP::~PairSRP() { - if (allocated) - { - memory->destroy(setflag); - memory->destroy(cutsq); - memory->destroy(cut); - memory->destroy(a0); - memory->destroy(segment); - } + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + memory->destroy(cut); + memory->destroy(a0); + memory->destroy(segment); + } // check nfix in case all fixes have already been deleted - if (modify->nfix) modify->delete_fix(fix_id); - free(fix_id); + if (modify->nfix) modify->delete_fix(f_srp->id); } /* ---------------------------------------------------------------------- @@ -412,33 +410,31 @@ 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"); - if (!allocated) allocate(); + if (narg < 3 || narg > 4) + error->all(FLERR,"PairSRP: Incorrect args for pair coeff"); + if (!allocated) allocate(); - // set ij bond-bond cutoffs - int ilo, ihi, jlo, jhi; - utils::bounds(FLERR,arg[0], 1, bptype, ilo, ihi, error); - utils::bounds(FLERR,arg[1], 1, bptype, jlo, jhi, error); + // set ij bond-bond cutoffs + int ilo, ihi, jlo, jhi; + utils::bounds(FLERR,arg[0], 1, bptype, ilo, ihi, error); + utils::bounds(FLERR,arg[1], 1, bptype, jlo, jhi, error); - double a0_one = utils::numeric(FLERR,arg[2],false,lmp); - double cut_one = cut_global; - if (narg == 4) cut_one = utils::numeric(FLERR,arg[3],false,lmp); + double a0_one = utils::numeric(FLERR,arg[2],false,lmp); + double cut_one = cut_global; + if (narg == 4) cut_one = utils::numeric(FLERR,arg[3],false,lmp); - int count = 0; - for (int i = ilo; i <= ihi; i++) - { - for (int j = MAX(jlo,i); j <= jhi; j++) - { - a0[i][j] = a0_one; - cut[i][j] = cut_one; - cutsq[i][j] = cut_one * cut_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++) { + a0[i][j] = a0_one; + cut[i][j] = cut_one; + cutsq[i][j] = cut_one * cut_one; + setflag[i][j] = 1; + count++; } + } - if (count == 0) error->warning(FLERR,"PairSRP: No pair coefficients were set"); + if (count == 0) error->warning(FLERR,"PairSRP: No pair coefficients were set"); } /* ---------------------------------------------------------------------- @@ -452,8 +448,7 @@ void PairSRP::init_style() // verify that fix SRP is still defined and has not been changed. - int ifix = modify->find_fix(fix_id); - if (f_srp != (FixSRP *)modify->fix[ifix]) + if (strcmp(f_srp->style,"SRP") != 0) error->all(FLERR,"Fix SRP has been changed unexpectedly"); if (comm->me == 0) From 246b70ae461c9637e28089b7d06d119b652ed895 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 15:56:21 -0400 Subject: [PATCH 209/352] update codeowners list --- .github/CODEOWNERS | 63 +++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b20118794f..f2a73c3cf2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -22,42 +22,42 @@ src/MESSAGE/* @sjplimp src/MLIAP/* @athomps src/SNAP/* @athomps src/SPIN/* @julient31 -src/BROWNIAN/* @samueljmcameron -src/CG-DNA/* @ohenrich -src/CG-SDK/* @akohlmey -src/COLVARS/* @giacomofiorin -src/DIELECTRIC/* @ndtrung81 -src/FEP/* @agiliopadua -src/ML-HDNNP/* @singraber -src/INTEL/* @wmbrownintel -src/MANIFOLD/* @Pakketeretet2 -src/MDI/* @taylor-a-barnes -src/MEAM/* @martok -src/MESONT/* @iafoss -src/MOFFF/* @hheenen -src/MOLFILE/* @akohlmey -src/NETCDF/* @pastewka -src/ML-PACE/* @yury-lysogorskiy -src/PLUMED/* @gtribello -src/PHONON/* @lingtikong -src/PTM/* @pmla -src/OPENMP/* @akohlmey -src/QMMM/* @akohlmey -src/REAXFF/* @hasanmetin -src/REACTION/* @jrgissing -src/SCAFACOS/* @rhalver -src/TALLY/* @akohlmey -src/UEF/* @danicholson -src/VTK/* @rbberger - +src/BROWNIAN/* @samueljmcameron +src/CG-DNA/* @ohenrich +src/CG-SDK/* @akohlmey +src/COLVARS/* @giacomofiorin +src/DIELECTRIC/* @ndtrung81 +src/FEP/* @agiliopadua +src/ML-HDNNP/* @singraber +src/INTEL/* @wmbrownintel +src/MANIFOLD/* @Pakketeretet2 +src/MDI/* @taylor-a-barnes +src/MEAM/* @martok +src/MESONT/* @iafoss +src/MOFFF/* @hheenen +src/MOLFILE/* @akohlmey +src/NETCDF/* @pastewka +src/ML-PACE/* @yury-lysogorskiy +src/PLUMED/* @gtribello +src/PHONON/* @lingtikong +src/PTM/* @pmla +src/OPENMP/* @akohlmey +src/QMMM/* @akohlmey +src/REAXFF/* @hasanmetin @stanmoore1 +src/REACTION/* @jrgissing +src/SCAFACOS/* @rhalver +src/TALLY/* @akohlmey +src/UEF/* @danicholson +src/VTK/* @rbberger # individual files in packages src/GPU/pair_vashishta_gpu.* @andeplane src/KOKKOS/pair_vashishta_kokkos.* @andeplane src/MANYBODY/pair_vashishta_table.* @andeplane src/MANYBODY/pair_atm.* @sergeylishchuk -src/USER-MISC/*_grem.* @dstelter92 -src/USER-MISC/compute_stress_mop*.* @RomainVermorel +src/REPLICA/*_grem.* @dstelter92 +src/EXTRA-COMPUTE/compute_stress_mop*.* @RomainVermorel +src/MISC/*_tracker.* @jtclemm # core LAMMPS classes src/lammps.* @sjplimp @@ -81,6 +81,7 @@ src/kspace.* @sjplimp src/lmptyp.h @sjplimp src/library.* @sjplimp src/main.cpp @sjplimp +src/min_*.* @sjplimp src/memory.* @sjplimp src/modify.* @sjplimp src/molecule.* @sjplimp @@ -109,7 +110,6 @@ src/thermo.* @sjplimp src/universe.* @sjplimp src/update.* @sjplimp src/variable.* @sjplimp -src/verlet.* @sjplimp src/velocity.* @sjplimp src/write_data.* @sjplimp src/write_restart.* @sjplimp @@ -122,6 +122,7 @@ src/info.* @akohlmey @rbberger src/timer.* @akohlmey src/min* @sjplimp @stanmoore1 src/utils.* @akohlmey @rbberger +src/verlet.* @sjplimp @stanmoore1 src/math_eigen_impl.h @jewettaij # tools From 33905fd68954d1fd9624cffd0345ba60e35a693c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 16:07:14 -0400 Subject: [PATCH 210/352] fix one more KOKKOS package installation dependency --- cmake/Modules/Packages/KOKKOS.cmake | 1 + src/KOKKOS/Install.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index aea766b79c..6ddfe1adc8 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -97,6 +97,7 @@ set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp if(PKG_KSPACE) list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/fft3d_kokkos.cpp + ${KOKKOS_PKG_SOURCES_DIR}/kissfft_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/gridcomm_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/remap_kokkos.cpp) if(Kokkos_ENABLE_CUDA) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index 5e7285a75f..dacbb31a0a 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -165,6 +165,7 @@ action improper_class2_kokkos.cpp improper_class2.cpp action improper_class2_kokkos.h improper_class2.h action improper_harmonic_kokkos.cpp improper_harmonic.cpp action improper_harmonic_kokkos.h improper_harmonic.h +action kissfft_kokkos.cpp kissfft.h action kissfft_kokkos.h kissfft.h action kokkos.cpp action kokkos.h From a6d66c35186f616d2c90d28d4d8fc9043d7588a2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 16:07:23 -0400 Subject: [PATCH 211/352] update .gitignore --- src/.gitignore | 65 ++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index 961901e322..6c0a838c1b 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -77,6 +77,7 @@ /compute_mliap.h /mliap_*.cpp /mliap_*.h +/mliap_model_python_couple.pyx /pair_mliap.cpp /pair_mliap.h @@ -250,8 +251,12 @@ /pair_mesont_tpm.cpp /pair_mesont_tpm.h +/compute_adf.cpp +/compute_adf.h /compute_contact_atom.cpp /compute_contact_atom.h +/compute_hexorder_atom.cpp +/compute_hexorder_atom.h /dump_dcd.cpp /dump_dcd.h /fix_controller.cpp @@ -270,6 +275,8 @@ /fix_temp_csvr.h /fix_tmd.cpp /fix_tmd.h +/pair_beck.cpp +/pair_beck.h /pair_born_coul_dsf.cpp /pair_born_coul_dsf.h /pair_born_coul_wolf.cpp @@ -284,6 +291,7 @@ /pair_lj96_cut.h /pair_lj_cubic.cpp /pair_lj_cubic.h +/pair_lj_cubic_const.h /pair_lj_cut_coul_debye.cpp /pair_lj_cut_coul_debye.h /pair_lj_cut_coul_dsf.cpp @@ -292,8 +300,8 @@ /pair_lj_cut_coul_wolf.h /pair_lj_gromacs.cpp /pair_lj_gromacs.h -/pair_lj_gromacs_could_gromacs.cpp -/pair_lj_gromacs_could_gromacs.h +/pair_lj_gromacs_coul_gromacs.cpp +/pair_lj_gromacs_coul_gromacs.h /pair_lj_relres.cpp /pair_lj_relres.h /pair_lj_smooth.cpp @@ -783,18 +791,18 @@ /fix_pour.h /fix_qeq_comb.cpp /fix_qeq_comb.h -/fix_qeq_reax.cpp /fix_qeq_fire.cpp /fix_qeq_fire.h -/fix_qeq_reax.h +/fix_qeq_reaxff.cpp +/fix_qeq_reaxff.h /fix_qmmm.cpp /fix_qmmm.h -/fix_reaxc.cpp -/fix_reaxc.h -/fix_reaxc_bonds.cpp -/fix_reaxc_bonds.h -/fix_reaxc_species.cpp -/fix_reaxc_species.h +/fix_reaxff.cpp +/fix_reaxff.h +/fix_reaxff_bonds.cpp +/fix_reaxff_bonds.h +/fix_reaxff_species.cpp +/fix_reaxff_species.h /fix_rhok.cpp /fix_rhok.h /fix_rigid.cpp @@ -1182,8 +1190,8 @@ /pair_peri_ves.h /pair_quip.cpp /pair_quip.h -/pair_reaxc.cpp -/pair_reaxc.h +/pair_reaxff.cpp +/pair_reaxff.h /pair_rebo.cpp /pair_rebo.h /pair_resquared.cpp @@ -1270,23 +1278,22 @@ /reader_adios.h /reader_molfile.cpp /reader_molfile.h -/reaxc_allocate.cpp -/reaxc_basic_comm.cpp -/reaxc_bond_orders.cpp -/reaxc_bonds.cpp -/reaxc_control.cpp -/reaxc_ffield.cpp -/reaxc_forces.cpp -/reaxc_hydrogen_bonds.cpp -/reaxc_init_md.cpp -/reaxc_list.cpp -/reaxc_lookup.cpp -/reaxc_multi_body.cpp -/reaxc_nonbonded.cpp -/reaxc_reset_tools.cpp -/reaxc_tool_box.cpp -/reaxc_torsion_angles.cpp -/reaxc_valence_angles.cpp +/reaxff_allocate.cpp +/reaxff_bond_orders.cpp +/reaxff_bonds.cpp +/reaxff_control.cpp +/reaxff_ffield.cpp +/reaxff_forces.cpp +/reaxff_hydrogen_bonds.cpp +/reaxff_init_md.cpp +/reaxff_list.cpp +/reaxff_lookup.cpp +/reaxff_multi_body.cpp +/reaxff_nonbonded.cpp +/reaxff_reset_tools.cpp +/reaxff_tool_box.cpp +/reaxff_torsion_angles.cpp +/reaxff_valence_angles.cpp /reaxff_api.h /reaxff_defs.h /reaxff_inline.h From a80829bd79b1ad38198bfd4a3c4a4795ec91589b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 16:14:52 -0400 Subject: [PATCH 212/352] avoid compilation error --- cmake/Modules/Packages/KOKKOS.cmake | 1 - src/KOKKOS/Install.sh | 1 - 2 files changed, 2 deletions(-) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index 6ddfe1adc8..aea766b79c 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -97,7 +97,6 @@ set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp if(PKG_KSPACE) list(APPEND KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/fft3d_kokkos.cpp - ${KOKKOS_PKG_SOURCES_DIR}/kissfft_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/gridcomm_kokkos.cpp ${KOKKOS_PKG_SOURCES_DIR}/remap_kokkos.cpp) if(Kokkos_ENABLE_CUDA) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index dacbb31a0a..5e7285a75f 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -165,7 +165,6 @@ action improper_class2_kokkos.cpp improper_class2.cpp action improper_class2_kokkos.h improper_class2.h action improper_harmonic_kokkos.cpp improper_harmonic.cpp action improper_harmonic_kokkos.h improper_harmonic.h -action kissfft_kokkos.cpp kissfft.h action kissfft_kokkos.h kissfft.h action kokkos.cpp action kokkos.h From ca2abd22be3ef4e788544e80dbc87cc3fe242396 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 17:08:16 -0400 Subject: [PATCH 213/352] remove unused file --- src/KOKKOS/kissfft_kokkos.cpp | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 src/KOKKOS/kissfft_kokkos.cpp diff --git a/src/KOKKOS/kissfft_kokkos.cpp b/src/KOKKOS/kissfft_kokkos.cpp deleted file mode 100644 index f0695edb10..0000000000 --- a/src/KOKKOS/kissfft_kokkos.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// clang-format off -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - https://www.lammps.org/, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - - -namespace LAMMPS_NS { -template class KissFFTKokkos; -#ifdef LMP_KOKKOS_GPU -template class KissFFTKokkos; -#endif -} From 5cdf55937d6228b3b6db301a0613b14227a4bed3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 17:17:06 -0400 Subject: [PATCH 214/352] move pair style tracker to a better location --- doc/src/Commands_pair.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index db3d947892..184fb25300 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -29,7 +29,7 @@ OPT. * :doc:`hybrid/scaled ` * :doc:`kim ` * :doc:`list ` - * + * :doc:`tracker ` * * * @@ -273,7 +273,6 @@ OPT. * :doc:`tip4p/cut (o) ` * :doc:`tip4p/long (o) ` * :doc:`tip4p/long/soft (o) ` - * :doc:`tracker ` * :doc:`tri/lj ` * :doc:`ufm (got) ` * :doc:`vashishta (gko) ` From 4710b7bc9e5a35f1e77583dcec86bff059aac6a2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 11:50:11 -0400 Subject: [PATCH 215/352] modernize and simplify code to find best matching restart file --- src/read_restart.cpp | 110 ++++++++++++++----------------------------- src/read_restart.h | 2 +- 2 files changed, 37 insertions(+), 75 deletions(-) diff --git a/src/read_restart.cpp b/src/read_restart.cpp index ac00a7d086..faf9fd1620 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -71,16 +71,18 @@ void ReadRestart::command(int narg, char **arg) // if filename contains "*", search dir for latest restart file - char *file = new char[strlen(arg[0]) + 16]; + char *file; if (strchr(arg[0],'*')) { - int n; + int n=0; if (me == 0) { - file_search(arg[0],file); - n = strlen(file) + 1; + auto fn = file_search(arg[0]); + n = fn.size()+1; + file = utils::strdup(fn); } MPI_Bcast(&n,1,MPI_INT,0,world); + if (me != 0) file = new char[n]; MPI_Bcast(file,n,MPI_CHAR,0,world); - } else strcpy(file,arg[0]); + } else file = utils::strdup(arg[0]); // check for multiproc files and an MPI-IO filename @@ -90,14 +92,12 @@ void ReadRestart::command(int narg, char **arg) else mpiioflag = 0; if (multiproc && mpiioflag) - error->all(FLERR, - "Read restart MPI-IO input not allowed with % in filename"); + error->all(FLERR,"Read restart MPI-IO input not allowed with % in filename"); if (mpiioflag) { mpiio = new RestartMPIIO(lmp); if (!mpiio->mpiio_exists) - error->all(FLERR,"Reading from MPI-IO filename when " - "MPIIO package is not installed"); + error->all(FLERR,"Reading from MPI-IO filename when MPIIO package is not installed"); } // open single restart file or base file for multiproc case @@ -538,83 +538,45 @@ void ReadRestart::command(int narg, char **arg) only called by proc 0 ------------------------------------------------------------------------- */ -void ReadRestart::file_search(char *inpfile, char *outfile) +std::string ReadRestart::file_search(const std::string &inpfile) { - char *ptr; - // separate inpfile into dir + filename - char *dirname = new char[strlen(inpfile) + 1]; - char *filename = new char[strlen(inpfile) + 1]; - - if (strchr(inpfile,'/')) { - ptr = strrchr(inpfile,'/'); - *ptr = '\0'; - strcpy(dirname,inpfile); - strcpy(filename,ptr+1); - *ptr = '/'; - } else { - strcpy(dirname,"./"); - strcpy(filename,inpfile); - } + auto dirname = utils::path_dirname(inpfile); + auto filename = utils::path_basename(inpfile); // if filename contains "%" replace "%" with "base" - char *pattern = new char[strlen(filename) + 16]; + auto pattern = filename; + auto loc = pattern.find('%'); + if (loc != std::string::npos) pattern.replace(loc,1,"base"); - if ((ptr = strchr(filename,'%'))) { - *ptr = '\0'; - sprintf(pattern,"%s%s%s",filename,"base",ptr+1); - *ptr = '%'; - } else strcpy(pattern,filename); + // scan all files in directory, searching for files that match regexp pattern + // maxnum = largest integer that matches "*" - // scan all files in directory, searching for files that match pattern - // maxnum = largest int that matches "*" - - int n = strlen(pattern) + 16; - char *begin = new char[n]; - char *middle = new char[n]; - char *end = new char[n]; - - ptr = strchr(pattern,'*'); - *ptr = '\0'; - strcpy(begin,pattern); - strcpy(end,ptr+1); - int nbegin = strlen(begin); bigint maxnum = -1; + loc = pattern.find('*'); + if (loc != std::string::npos) { + // convert pattern to equivalent regexp + pattern.replace(loc,1,"\\d+"); + struct dirent *ep; + DIR *dp = opendir(dirname.c_str()); + if (dp == nullptr) + error->one(FLERR,"Cannot open directory {} to search for restart file: {}", + dirname, utils::getsyserror()); - struct dirent *ep; - DIR *dp = opendir(dirname); - if (dp == nullptr) - error->one(FLERR,"Cannot open dir to search for restart file"); - while ((ep = readdir(dp))) { - if (strstr(ep->d_name,begin) != ep->d_name) continue; - if ((ptr = strstr(&ep->d_name[nbegin],end)) == nullptr) continue; - if (strlen(end) == 0) ptr = ep->d_name + strlen(ep->d_name); - *ptr = '\0'; - if ((int)strlen(&ep->d_name[nbegin]) < n) { - strcpy(middle,&ep->d_name[nbegin]); - if (ATOBIGINT(middle) > maxnum) maxnum = ATOBIGINT(middle); + while ((ep = readdir(dp))) { + std::string candidate(ep->d_name); + if (utils::strmatch(candidate,pattern)) { + bigint num = ATOBIGINT(utils::strfind(candidate.substr(loc),"\\d+").c_str()); + if (num > maxnum) maxnum = num; + } } + closedir(dp); + if (maxnum < 0) error->one(FLERR,"Found no restart file matching pattern"); + filename.replace(filename.find('*'),1,std::to_string(maxnum)); } - closedir(dp); - if (maxnum < 0) error->one(FLERR,"Found no restart file matching pattern"); - - // create outfile with maxint substituted for "*" - // use original inpfile, not pattern, since need to retain "%" in filename - - std::string newoutfile = inpfile; - newoutfile.replace(newoutfile.find("*"),1,fmt::format("{}",maxnum)); - strcpy(outfile,newoutfile.c_str()); - - // clean up - - delete [] dirname; - delete [] filename; - delete [] pattern; - delete [] begin; - delete [] middle; - delete [] end; + return utils::path_join(dirname,filename); } /* ---------------------------------------------------------------------- diff --git a/src/read_restart.h b/src/read_restart.h index a3f889fbc3..9de52a5f28 100644 --- a/src/read_restart.h +++ b/src/read_restart.h @@ -46,7 +46,7 @@ class ReadRestart : public Command { bigint assignedChunkSize; MPI_Offset assignedChunkOffset, headerOffset; - void file_search(char *, char *); + std::string file_search(const std::string &); void header(); void type_arrays(); void force_fields(); From 6b20da754984fb94830eb5fda806910090ddf7af Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 17:44:29 -0400 Subject: [PATCH 216/352] update lammps shell test to use a fix that is always available --- unittest/tools/test_lammps_shell.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/unittest/tools/test_lammps_shell.py b/unittest/tools/test_lammps_shell.py index 1768bcf753..15cb259f84 100644 --- a/unittest/tools/test_lammps_shell.py +++ b/unittest/tools/test_lammps_shell.py @@ -94,25 +94,25 @@ class LammpsShell(unittest.TestCase): def testExpandComputeGroup(self): """Test expansion of a group-ID and a compute command""" - matches = re.findall(cmd_group_re, self.InputRunner(b'compute test al\tcentro/at\t\n'), re.MULTILINE) + matches = re.findall(cmd_group_re, self.InputRunner(b'compute test al\tstress/at\t\n'), re.MULTILINE) if self.timeout: self.fail("Timeout") else: self.assertEqual(matches[0][1],"compute") self.assertEqual(matches[0][2],"test") self.assertEqual(matches[0][3],"all") - self.assertEqual(matches[0][4],"centro/atom") + self.assertEqual(matches[0][4],"stress/atom") def testExpandFixGroup(self): """Test expansion of a group-ID and a fix command""" - matches = re.findall(cmd_group_re, self.InputRunner(b'fix test al\tcontroll\t\n'), re.MULTILINE) + matches = re.findall(cmd_group_re, self.InputRunner(b'fix test al\tpropert\t\n'), re.MULTILINE) if self.timeout: self.fail("Timeout") else: self.assertEqual(matches[0][1],"fix") self.assertEqual(matches[0][2],"test") self.assertEqual(matches[0][3],"all") - self.assertEqual(matches[0][4],"controller") + self.assertEqual(matches[0][4],"property/atom") def testExpandSource(self): """Test expansion of a shell command and a file name""" From cb32bb972bf56a0e0c96937bcf368af0299d523a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 20:57:42 -0400 Subject: [PATCH 217/352] fix bugs in ArgInfo class --- src/arg_info.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/arg_info.cpp b/src/arg_info.cpp index b83bb141fa..a274b47b92 100644 --- a/src/arg_info.cpp +++ b/src/arg_info.cpp @@ -68,11 +68,11 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde } else has_idx2 = arg.size(); - if (arg[has_idx2 - 1] != ']') { + if ((arg[has_idx2 - 1] != ']') || ((dim == 1) && (arg.find(']') != has_idx2 - 1))) { type = UNKNOWN; } else { try { - index1 = std::stoi(arg.substr(has_idx1 + 1, arg.size() - (has_idx2 + 2))); + index1 = std::stoi(arg.substr(has_idx1 + 1, arg.size() - (has_idx1 + 2))); } catch (std::invalid_argument &) { type = UNKNOWN; } From d211bbc0d6249302b5172bae3a5065d37ac3b9b5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 20:58:02 -0400 Subject: [PATCH 218/352] expand ArgInfo class unit tests --- unittest/utils/test_argutils.cpp | 56 +++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/unittest/utils/test_argutils.cpp b/unittest/utils/test_argutils.cpp index 7d4653cc13..a527df6fe7 100644 --- a/unittest/utils/test_argutils.cpp +++ b/unittest/utils/test_argutils.cpp @@ -51,10 +51,10 @@ TEST(ArgInfo, compute0) TEST(ArgInfo, compute1) { - ArgInfo arg("c_1[5]", ArgInfo::COMPUTE); + ArgInfo arg("c_1[15]", ArgInfo::COMPUTE); ASSERT_EQ(arg.get_dim(), 1); ASSERT_EQ(arg.get_type(), ArgInfo::COMPUTE); - ASSERT_EQ(arg.get_index1(), 5); + ASSERT_EQ(arg.get_index1(), 15); ASSERT_EQ(arg.get_index2(), -1); ASSERT_THAT(arg.get_name(), StrEq("1")); } @@ -69,6 +69,26 @@ TEST(ArgInfo, compute2) ASSERT_THAT(arg.get_name(), StrEq("text")); } +TEST(ArgInfo, compute3) +{ + ArgInfo arg("c_text[08123][51]", ArgInfo::COMPUTE | ArgInfo::FIX); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::COMPUTE); + ASSERT_EQ(arg.get_index1(), 8123); + ASSERT_EQ(arg.get_index2(), 51); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, compute4) +{ + ArgInfo arg("c_text[111][0125]", ArgInfo::COMPUTE | ArgInfo::FIX); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::COMPUTE); + ASSERT_EQ(arg.get_index1(), 111); + ASSERT_EQ(arg.get_index2(), 125); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + TEST(ArgInfo, fix0) { ArgInfo arg("f_2"); @@ -99,6 +119,26 @@ TEST(ArgInfo, fix2) ASSERT_THAT(arg.get_name(), StrEq("text")); } +TEST(ArgInfo, fix3) +{ + ArgInfo arg("f_text[1234][5]", ArgInfo::FIX); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::FIX); + ASSERT_EQ(arg.get_index1(), 1234); + ASSERT_EQ(arg.get_index2(), 5); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, fix4) +{ + ArgInfo arg("f_text[22][120]", ArgInfo::FIX); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::FIX); + ASSERT_EQ(arg.get_index1(), 22); + ASSERT_EQ(arg.get_index2(), 120); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + TEST(ArgInfo, variable0) { ArgInfo arg("v_text"); @@ -169,19 +209,25 @@ TEST(ArgInfo, unsupported3) TEST(ArgInfo, no_bracket1) { - ArgInfo arg("v_text[2"); + ArgInfo arg("v_text[22"); ASSERT_EQ(arg.get_type(), ArgInfo::UNKNOWN); } TEST(ArgInfo, no_bracket2) { - ArgInfo arg("v_text[2][1"); + ArgInfo arg("v_text[123][12"); ASSERT_EQ(arg.get_type(), ArgInfo::UNKNOWN); } TEST(ArgInfo, no_bracket3) { - ArgInfo arg("v_text[2[1]"); + ArgInfo arg("v_text[2[11]"); + ASSERT_EQ(arg.get_type(), ArgInfo::UNKNOWN); +} + +TEST(ArgInfo, no_bracket4) +{ + ArgInfo arg("v_text[25]021]"); ASSERT_EQ(arg.get_type(), ArgInfo::UNKNOWN); } From 9dc662973e1b9bd1aaf18dc845633515b55c127c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 29 Jul 2021 21:18:03 -0400 Subject: [PATCH 219/352] step version strings for next patch release --- doc/lammps.1 | 2 +- src/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index de496d1af1..a111f7e092 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,4 +1,4 @@ -.TH LAMMPS "28 July 2021" "2021-07-28" +.TH LAMMPS "30 July 2021" "2021-07-30" .SH NAME .B LAMMPS \- Molecular Dynamics Simulator. diff --git a/src/version.h b/src/version.h index e206353a44..a48d6f1873 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "28 Jul 2021" +#define LAMMPS_VERSION "30 Jul 2021" From 5f401da462b23143f45f720333d4f76a5b3f584b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Jul 2021 10:48:15 -0400 Subject: [PATCH 220/352] correct bug in derived CG-DNA FENE bond classes and optimize code --- src/CG-DNA/bond_oxdna2_fene.cpp | 29 ++++++---------------- src/CG-DNA/bond_oxdna2_fene.h | 6 ++--- src/CG-DNA/bond_oxdna_fene.cpp | 43 +++++++++++++++++---------------- src/CG-DNA/bond_oxdna_fene.h | 1 + src/CG-DNA/bond_oxrna2_fene.cpp | 30 ++++++----------------- src/CG-DNA/bond_oxrna2_fene.h | 7 +++--- 6 files changed, 45 insertions(+), 71 deletions(-) diff --git a/src/CG-DNA/bond_oxdna2_fene.cpp b/src/CG-DNA/bond_oxdna2_fene.cpp index 0fad5bfaae..54f2dab9d2 100644 --- a/src/CG-DNA/bond_oxdna2_fene.cpp +++ b/src/CG-DNA/bond_oxdna2_fene.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -19,30 +18,16 @@ using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- */ - -BondOxdna2Fene::BondOxdna2Fene(LAMMPS *lmp) : BondOxdnaFene(lmp) -{ - -} - -/* ---------------------------------------------------------------------- */ - -BondOxdna2Fene::~BondOxdna2Fene() -{ - -} - /* ---------------------------------------------------------------------- compute vector COM-sugar-phosphate backbone interaction site in oxDNA2 ------------------------------------------------------------------------- */ -void BondOxdna2Fene::compute_interaction_sites(double e1[3], double e2[3], - double /*e3*/[3], double r[3]) +void BondOxdna2Fene::compute_interaction_sites(double e1[3], double e2[3], double /*e3*/[3], + double r[3]) const { - double d_cs_x=-0.34, d_cs_y=+0.3408; - - r[0] = d_cs_x*e1[0] + d_cs_y*e2[0]; - r[1] = d_cs_x*e1[1] + d_cs_y*e2[1]; - r[2] = d_cs_x*e1[2] + d_cs_y*e2[2]; + constexpr double d_cs_x = -0.34; + constexpr double d_cs_y = +0.3408; + r[0] = d_cs_x * e1[0] + d_cs_y * e2[0]; + r[1] = d_cs_x * e1[1] + d_cs_y * e2[1]; + r[2] = d_cs_x * e1[2] + d_cs_y * e2[2]; } diff --git a/src/CG-DNA/bond_oxdna2_fene.h b/src/CG-DNA/bond_oxdna2_fene.h index 98a74e3551..6c932f9421 100644 --- a/src/CG-DNA/bond_oxdna2_fene.h +++ b/src/CG-DNA/bond_oxdna2_fene.h @@ -26,9 +26,9 @@ namespace LAMMPS_NS { class BondOxdna2Fene : public BondOxdnaFene { public: - BondOxdna2Fene(class LAMMPS *); - virtual ~BondOxdna2Fene(); - virtual void compute_interaction_sites(double *, double *, double *, double *); + BondOxdna2Fene(class LAMMPS *lmp) : BondOxdnaFene(lmp) {} + virtual ~BondOxdna2Fene() {} + virtual void compute_interaction_sites(double *, double *, double *, double *) const; }; } // namespace LAMMPS_NS diff --git a/src/CG-DNA/bond_oxdna_fene.cpp b/src/CG-DNA/bond_oxdna_fene.cpp index 0075ec6bb0..5a332a0b8c 100644 --- a/src/CG-DNA/bond_oxdna_fene.cpp +++ b/src/CG-DNA/bond_oxdna_fene.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -18,31 +17,20 @@ #include "bond_oxdna_fene.h" #include "atom.h" -#include "atom_vec_ellipsoid.h" -#include "comm.h" -#include "error.h" -#include "force.h" -#include "math_extra.h" -#include "memory.h" #include "neighbor.h" +#include "comm.h" #include "update.h" +#include "force.h" +#include "memory.h" +#include "error.h" + +#include "atom_vec_ellipsoid.h" +#include "math_extra.h" #include using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- - compute vector COM-sugar-phosphate backbone interaction site in oxDNA -------------------------------------------------------------------------- */ -static void compute_interaction_sites(const double e1[3], double r[3]) -{ - constexpr double d_cs=-0.4; - - r[0] = d_cs*e1[0]; - r[1] = d_cs*e1[1]; - r[2] = d_cs*e1[2]; -} - /* ---------------------------------------------------------------------- */ BondOxdnaFene::~BondOxdnaFene() @@ -56,6 +44,19 @@ BondOxdnaFene::~BondOxdnaFene() } +/* ---------------------------------------------------------------------- + compute vector COM-sugar-phosphate backbone interaction site in oxDNA +------------------------------------------------------------------------- */ +void BondOxdnaFene::compute_interaction_sites(double e1[3], double /*e2*/[3], + double /*e3*/[3], double r[3]) const +{ + constexpr double d_cs=-0.4; + + r[0] = d_cs*e1[0]; + r[1] = d_cs*e1[1]; + r[2] = d_cs*e1[2]; +} + /* ---------------------------------------------------------------------- tally energy and virial into global and per-atom accumulators ------------------------------------------------------------------------- */ @@ -187,8 +188,8 @@ void BondOxdnaFene::compute(int eflag, int vflag) MathExtra::q_to_exyz(qb,bx,by,bz); // vector COM-backbone site a and b - compute_interaction_sites(ax,ra_cs); - compute_interaction_sites(bx,rb_cs); + compute_interaction_sites(ax,ay,az,ra_cs); + compute_interaction_sites(bx,by,bz,rb_cs); // vector backbone site b to a delr[0] = x[a][0] + ra_cs[0] - x[b][0] - rb_cs[0]; diff --git a/src/CG-DNA/bond_oxdna_fene.h b/src/CG-DNA/bond_oxdna_fene.h index 6e2272d597..42b542a6fb 100644 --- a/src/CG-DNA/bond_oxdna_fene.h +++ b/src/CG-DNA/bond_oxdna_fene.h @@ -28,6 +28,7 @@ class BondOxdnaFene : public Bond { public: BondOxdnaFene(class LAMMPS *lmp) : Bond(lmp) {} virtual ~BondOxdnaFene(); + virtual void compute_interaction_sites(double *, double *, double *, double *) const; virtual void compute(int, int); void coeff(int, char **); void init_style(); diff --git a/src/CG-DNA/bond_oxrna2_fene.cpp b/src/CG-DNA/bond_oxrna2_fene.cpp index 71c5d9edf3..24de5f7714 100644 --- a/src/CG-DNA/bond_oxrna2_fene.cpp +++ b/src/CG-DNA/bond_oxrna2_fene.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -19,30 +18,17 @@ using namespace LAMMPS_NS; -/* ---------------------------------------------------------------------- */ - -BondOxrna2Fene::BondOxrna2Fene(LAMMPS *lmp) : BondOxdnaFene(lmp) -{ - -} - -/* ---------------------------------------------------------------------- */ - -BondOxrna2Fene::~BondOxrna2Fene() -{ - -} - /* ---------------------------------------------------------------------- compute vector COM-sugar-phosphate backbone interaction site in oxRNA2 ------------------------------------------------------------------------- */ -void BondOxrna2Fene::compute_interaction_sites(double e1[3], double /*e2*/[3], - double e3[3], double r[3]) + +void BondOxrna2Fene::compute_interaction_sites(double e1[3], double /*e2*/[3], double e3[3], + double r[3]) const { - double d_cs_x=-0.4, d_cs_z=+0.2; - - r[0] = d_cs_x*e1[0] + d_cs_z*e3[0]; - r[1] = d_cs_x*e1[1] + d_cs_z*e3[1]; - r[2] = d_cs_x*e1[2] + d_cs_z*e3[2]; + constexpr double d_cs_x = -0.4; + constexpr double d_cs_z = +0.2; + r[0] = d_cs_x * e1[0] + d_cs_z * e3[0]; + r[1] = d_cs_x * e1[1] + d_cs_z * e3[1]; + r[2] = d_cs_x * e1[2] + d_cs_z * e3[2]; } diff --git a/src/CG-DNA/bond_oxrna2_fene.h b/src/CG-DNA/bond_oxrna2_fene.h index 901daf2eb0..a805cd005f 100644 --- a/src/CG-DNA/bond_oxrna2_fene.h +++ b/src/CG-DNA/bond_oxrna2_fene.h @@ -26,9 +26,10 @@ namespace LAMMPS_NS { class BondOxrna2Fene : public BondOxdnaFene { public: - BondOxrna2Fene(class LAMMPS *); - virtual ~BondOxrna2Fene(); - virtual void compute_interaction_sites(double *, double *, double *, double *); + BondOxrna2Fene(class LAMMPS *lmp) : BondOxdnaFene(lmp) {} + virtual ~BondOxrna2Fene() {} + + virtual void compute_interaction_sites(double *, double *, double *, double *) const; }; } // namespace LAMMPS_NS From 82936b1e4f9b9d1e4694a7a572a5157f43a2dce8 Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 30 Jul 2021 18:14:44 +0200 Subject: [PATCH 221/352] fixing indexing bug The gyration_tensor[4] element as computed by "compute gyration" corresponds to the xz component of the gyration tensor and the gyration_tensor[5] to the yz component. The code assumed that gyration_tensor[4] corresponds to the yz component and the gyration_tensor[5] to the xz. --- src/EXTRA-COMPUTE/compute_gyration_shape.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/EXTRA-COMPUTE/compute_gyration_shape.cpp b/src/EXTRA-COMPUTE/compute_gyration_shape.cpp index d64594d219..47c94ac48d 100644 --- a/src/EXTRA-COMPUTE/compute_gyration_shape.cpp +++ b/src/EXTRA-COMPUTE/compute_gyration_shape.cpp @@ -92,8 +92,8 @@ void ComputeGyrationShape::compute_vector() ione[1][1] = gyration_tensor[1]; ione[2][2] = gyration_tensor[2]; ione[0][1] = ione[1][0] = gyration_tensor[3]; - ione[1][2] = ione[2][1] = gyration_tensor[4]; - ione[0][2] = ione[2][0] = gyration_tensor[5]; + ione[0][2] = ione[2][0] = gyration_tensor[4]; + ione[1][2] = ione[2][1] = gyration_tensor[5]; int ierror = MathEigen::jacobi3(ione,evalues,evectors); if (ierror) error->all(FLERR, "Insufficient Jacobi rotations " From db4fcd7537984cc7bb0f09cf58c773f62b3f061e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 30 Jul 2021 15:24:23 -0400 Subject: [PATCH 222/352] update package dependency --- src/OPT/Install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OPT/Install.sh b/src/OPT/Install.sh index b059dab491..0423df143d 100755 --- a/src/OPT/Install.sh +++ b/src/OPT/Install.sh @@ -46,5 +46,5 @@ action pair_lj_long_coul_long_opt.cpp pair_lj_long_coul_long.cpp action pair_lj_long_coul_long_opt.h pair_lj_long_coul_long.cpp action pair_morse_opt.cpp action pair_morse_opt.h -action pair_ufm_opt.cpp -action pair_ufm_opt.h +action pair_ufm_opt.cpp pair_ufm.cpp +action pair_ufm_opt.h pair_ufm.h From 45858be1b6d565330e882ffa1327708a474d9cbb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:22:21 -0400 Subject: [PATCH 223/352] avoid uninitialized data access for hybrid styles with OPENMP --- src/dihedral_hybrid.cpp | 16 ++++++++++++++++ src/improper_hybrid.cpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/dihedral_hybrid.cpp b/src/dihedral_hybrid.cpp index 8088719491..48d879d435 100644 --- a/src/dihedral_hybrid.cpp +++ b/src/dihedral_hybrid.cpp @@ -33,7 +33,11 @@ using namespace LAMMPS_NS; DihedralHybrid::DihedralHybrid(LAMMPS *lmp) : Dihedral(lmp) { + writedata = 0; nstyles = 0; + ndihedrallist = nullptr; + dihedrallist = nullptr; + maxdihedral = nullptr; } /* ---------------------------------------------------------------------- */ @@ -108,6 +112,18 @@ void DihedralHybrid::compute(int eflag, int vflag) ev_init(eflag,vflag); + // need to clear per-thread storage here, when using multiple threads + // with thread-enabled substyles to avoid uninitlialized data access. + + const int nthreads = comm->nthreads; + if (comm->nthreads > 1) { + const bigint nall = atom->nlocal + atom->nghost; + if (eflag_atom) + memset(&eatom[0],0,nall*nthreads*sizeof(double)); + if (vflag_atom) + memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + } + for (m = 0; m < nstyles; m++) { neighbor->ndihedrallist = ndihedrallist[m]; neighbor->dihedrallist = dihedrallist[m]; diff --git a/src/improper_hybrid.cpp b/src/improper_hybrid.cpp index a5781beba2..ed1a8075a9 100644 --- a/src/improper_hybrid.cpp +++ b/src/improper_hybrid.cpp @@ -32,7 +32,11 @@ using namespace LAMMPS_NS; ImproperHybrid::ImproperHybrid(LAMMPS *lmp) : Improper(lmp) { + writedata = 0; nstyles = 0; + nimproperlist = nullptr; + improperlist = nullptr; + maximproper = nullptr; } /* ---------------------------------------------------------------------- */ @@ -107,6 +111,18 @@ void ImproperHybrid::compute(int eflag, int vflag) ev_init(eflag,vflag); + // need to clear per-thread storage here, when using multiple threads + // with thread-enabled substyles to avoid uninitlialized data access. + + const int nthreads = comm->nthreads; + if (comm->nthreads > 1) { + const bigint nall = atom->nlocal + atom->nghost; + if (eflag_atom) + memset(&eatom[0],0,nall*nthreads*sizeof(double)); + if (vflag_atom) + memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + } + for (m = 0; m < nstyles; m++) { neighbor->nimproperlist = nimproperlist[m]; neighbor->improperlist = improperlist[m]; From 8aa39a6c409b81351e6c5cdbcfacdec02ee20c72 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:23:16 -0400 Subject: [PATCH 224/352] make compatible with CLASS2 --- src/dihedral_hybrid.cpp | 10 ++++++++++ src/improper_hybrid.cpp | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/dihedral_hybrid.cpp b/src/dihedral_hybrid.cpp index 48d879d435..752b1818a5 100644 --- a/src/dihedral_hybrid.cpp +++ b/src/dihedral_hybrid.cpp @@ -286,6 +286,16 @@ void DihedralHybrid::coeff(int narg, char **arg) if (m == nstyles) { if (strcmp(arg[1],"none") == 0) none = 1; else if (strcmp(arg[1],"skip") == 0) none = skip = 1; + else if (strcmp(arg[1],"mbt") == 0) + error->all(FLERR,"MiddleBondTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1],"ebt") == 0) + error->all(FLERR,"EndBondTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1],"at") == 0) + error->all(FLERR,"AngleTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1],"aat") == 0) + error->all(FLERR,"AngleAngleTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1],"bb13") == 0) + error->all(FLERR,"BondBond13 coeff for hybrid dihedral has invalid format"); else error->all(FLERR,"Dihedral coeff for hybrid has invalid style"); } diff --git a/src/improper_hybrid.cpp b/src/improper_hybrid.cpp index ed1a8075a9..ffee2e2fc8 100644 --- a/src/improper_hybrid.cpp +++ b/src/improper_hybrid.cpp @@ -283,15 +283,19 @@ void ImproperHybrid::coeff(int narg, char **arg) utils::bounds(FLERR,arg[0],1,atom->nimpropertypes,ilo,ihi,error); // 2nd arg = improper sub-style name - // allow for "none" as valid sub-style name + // allow for "none" or "skip" as valid sub-style name int m; for (m = 0; m < nstyles; m++) if (strcmp(arg[1],keywords[m]) == 0) break; int none = 0; + int skip = 0; if (m == nstyles) { if (strcmp(arg[1],"none") == 0) none = 1; + else if (strcmp(arg[1],"skip") == 0) none = skip = 1; + else if (strcmp(arg[1],"aa") == 0) + error->all(FLERR,"AngleAngle coeff for hybrid improper has invalid format"); else error->all(FLERR,"Improper coeff for hybrid has invalid style"); } From 848db31a771ba4f0b4245467588cabdf4656929e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:25:01 -0400 Subject: [PATCH 225/352] reformat with clang-format --- src/angle_hybrid.cpp | 163 ++++++++++++++++++------------------ src/bond_hybrid.cpp | 154 +++++++++++++++++----------------- src/dihedral_hybrid.cpp | 177 +++++++++++++++++++-------------------- src/improper_hybrid.cpp | 179 ++++++++++++++++++++-------------------- 4 files changed, 327 insertions(+), 346 deletions(-) diff --git a/src/angle_hybrid.cpp b/src/angle_hybrid.cpp index 4fb382790e..12bc9aa97a 100644 --- a/src/angle_hybrid.cpp +++ b/src/angle_hybrid.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -15,14 +14,14 @@ #include "angle_hybrid.h" #include "atom.h" -#include "neighbor.h" #include "comm.h" +#include "error.h" #include "force.h" #include "memory.h" -#include "error.h" +#include "neighbor.h" -#include #include +#include using namespace LAMMPS_NS; @@ -45,19 +44,18 @@ AngleHybrid::~AngleHybrid() { if (nstyles) { for (int i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (int i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (int i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nanglelist; - delete [] maxangle; - for (int i = 0; i < nstyles; i++) - memory->destroy(anglelist[i]); - delete [] anglelist; + delete[] nanglelist; + delete[] maxangle; + for (int i = 0; i < nstyles; i++) memory->destroy(anglelist[i]); + delete[] anglelist; } } @@ -65,7 +63,7 @@ AngleHybrid::~AngleHybrid() void AngleHybrid::compute(int eflag, int vflag) { - int i,j,m,n; + int i, j, m, n; // save ptrs to original anglelist @@ -87,7 +85,7 @@ void AngleHybrid::compute(int eflag, int vflag) if (nanglelist[m] > maxangle[m]) { memory->destroy(anglelist[m]); maxangle[m] = nanglelist[m] + EXTRA; - memory->create(anglelist[m],maxangle[m],4,"angle_hybrid:anglelist"); + memory->create(anglelist[m], maxangle[m], 4, "angle_hybrid:anglelist"); } nanglelist[m] = 0; } @@ -107,7 +105,7 @@ void AngleHybrid::compute(int eflag, int vflag) // set neighbor->anglelist to sub-style anglelist before call // accumulate sub-style global/peratom energy/virial in hybrid - ev_init(eflag,vflag); + ev_init(eflag, vflag); // need to clear per-thread storage here, when using multiple threads // with thread-enabled substyles to avoid uninitlialized data access. @@ -115,17 +113,15 @@ void AngleHybrid::compute(int eflag, int vflag) const int nthreads = comm->nthreads; if (comm->nthreads > 1) { const bigint nall = atom->nlocal + atom->nghost; - if (eflag_atom) - memset(&eatom[0],0,nall*nthreads*sizeof(double)); - if (vflag_atom) - memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + if (eflag_atom) memset(&eatom[0], 0, nall * nthreads * sizeof(double)); + if (vflag_atom) memset(&vatom[0][0], 0, 6 * nall * nthreads * sizeof(double)); } for (m = 0; m < nstyles; m++) { neighbor->nanglelist = nanglelist[m]; neighbor->anglelist = anglelist[m]; - styles[m]->compute(eflag,vflag); + styles[m]->compute(eflag, vflag); if (eflag_global) energy += styles[m]->energy; if (vflag_global) @@ -141,16 +137,14 @@ void AngleHybrid::compute(int eflag, int vflag) if (force->newton_bond) n += atom->nghost; double **vatom_substyle = styles[m]->vatom; for (i = 0; i < n; i++) - for (j = 0; j < 6; j++) - vatom[i][j] += vatom_substyle[i][j]; + for (j = 0; j < 6; j++) vatom[i][j] += vatom_substyle[i][j]; } if (cvflag_atom) { n = atom->nlocal; if (force->newton_bond) n += atom->nghost; double **cvatom_substyle = styles[m]->cvatom; for (i = 0; i < n; i++) - for (j = 0; j < 9; j++) - cvatom[i][j] += cvatom_substyle[i][j]; + for (j = 0; j < 9; j++) cvatom[i][j] += cvatom_substyle[i][j]; } } @@ -167,13 +161,13 @@ void AngleHybrid::allocate() allocated = 1; int n = atom->nangletypes; - memory->create(map,n+1,"angle:map"); - memory->create(setflag,n+1,"angle:setflag"); + memory->create(map, n + 1, "angle:map"); + memory->create(setflag, n + 1, "angle:setflag"); for (int i = 1; i <= n; i++) setflag[i] = 0; nanglelist = new int[nstyles]; maxangle = new int[nstyles]; - anglelist = new int**[nstyles]; + anglelist = new int **[nstyles]; for (int m = 0; m < nstyles; m++) maxangle[m] = 0; for (int m = 0; m < nstyles; m++) anglelist[m] = nullptr; } @@ -184,27 +178,26 @@ void AngleHybrid::allocate() void AngleHybrid::settings(int narg, char **arg) { - int i, m,istyle; + int i, m, istyle; - if (narg < 1) error->all(FLERR,"Illegal angle_style command"); + if (narg < 1) error->all(FLERR, "Illegal angle_style command"); // delete old lists, since cannot just change settings if (nstyles) { for (i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nanglelist; - delete [] maxangle; - for (i = 0; i < nstyles; i++) - memory->destroy(anglelist[i]); - delete [] anglelist; + delete[] nanglelist; + delete[] maxangle; + for (i = 0; i < nstyles; i++) memory->destroy(anglelist[i]); + delete[] anglelist; } allocated = 0; @@ -215,7 +208,7 @@ void AngleHybrid::settings(int narg, char **arg) nstyles = 0; i = 0; while (i < narg) { - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; nstyles++; @@ -223,8 +216,8 @@ void AngleHybrid::settings(int narg, char **arg) // allocate list of sub-styles - styles = new Angle*[nstyles]; - keywords = new char*[nstyles]; + styles = new Angle *[nstyles]; + keywords = new char *[nstyles]; // allocate each sub-style and call its settings() with subset of args // allocate uses suffix, but don't store suffix version in keywords, @@ -239,22 +232,21 @@ void AngleHybrid::settings(int narg, char **arg) while (i < narg) { for (m = 0; m < nstyles; m++) - if (strcmp(arg[i],keywords[m]) == 0) - error->all(FLERR,"Angle style hybrid cannot use " - "same angle style twice"); - if (strcmp(arg[i],"hybrid") == 0) - error->all(FLERR,"Angle style hybrid cannot have hybrid as an argument"); - if (strcmp(arg[i],"none") == 0) - error->all(FLERR,"Angle style hybrid cannot have none as an argument"); + if (strcmp(arg[i], keywords[m]) == 0) + error->all(FLERR, "Angle style hybrid cannot use same angle style twice"); + if (strcmp(arg[i], "hybrid") == 0) + error->all(FLERR, "Angle style hybrid cannot have hybrid as an argument"); + if (strcmp(arg[i], "none") == 0) + error->all(FLERR, "Angle style hybrid cannot have none as an argument"); - styles[nstyles] = force->new_angle(arg[i],1,dummy); - force->store_style(keywords[nstyles],arg[i],0); + styles[nstyles] = force->new_angle(arg[i], 1, dummy); + force->store_style(keywords[nstyles], arg[i], 0); istyle = i; - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; - styles[nstyles]->settings(i-istyle-1,&arg[istyle+1]); + styles[nstyles]->settings(i - istyle - 1, &arg[istyle + 1]); nstyles++; } } @@ -267,26 +259,29 @@ void AngleHybrid::coeff(int narg, char **arg) { if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nangletypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->nangletypes, ilo, ihi, error); // 2nd arg = angle sub-style name // allow for "none" or "skip" as valid sub-style name int m; for (m = 0; m < nstyles; m++) - if (strcmp(arg[1],keywords[m]) == 0) break; + if (strcmp(arg[1], keywords[m]) == 0) break; int none = 0; int skip = 0; if (m == nstyles) { - if (strcmp(arg[1],"none") == 0) none = 1; - else if (strcmp(arg[1],"skip") == 0) none = skip = 1; - else if (strcmp(arg[1],"ba") == 0) - error->all(FLERR,"BondAngle coeff for hybrid angle has invalid format"); - else if (strcmp(arg[1],"bb") == 0) - error->all(FLERR,"BondBond coeff for hybrid angle has invalid format"); - else error->all(FLERR,"Angle coeff for hybrid has invalid style"); + if (strcmp(arg[1], "none") == 0) + none = 1; + else if (strcmp(arg[1], "skip") == 0) + none = skip = 1; + else if (strcmp(arg[1], "ba") == 0) + error->all(FLERR, "BondAngle coeff for hybrid angle has invalid format"); + else if (strcmp(arg[1], "bb") == 0) + error->all(FLERR, "BondBond coeff for hybrid angle has invalid format"); + else + error->all(FLERR, "Angle coeff for hybrid has invalid style"); } // move 1st arg to 2nd arg @@ -296,14 +291,15 @@ void AngleHybrid::coeff(int narg, char **arg) // invoke sub-style coeff() starting with 1st arg - if (!none) styles[m]->coeff(narg-1,&arg[1]); + if (!none) styles[m]->coeff(narg - 1, &arg[1]); // set setflag and which type maps to which sub-style // if sub-style is skip: auxiliary class2 setting in data file so ignore // if sub-style is none: set hybrid setflag, wipe out map for (int i = ilo; i <= ihi; i++) { - if (skip) continue; + if (skip) + continue; else if (none) { setflag[i] = 1; map[i] = -1; @@ -330,8 +326,7 @@ void AngleHybrid::init_style() double AngleHybrid::equilibrium_angle(int i) { - if (map[i] < 0) - error->one(FLERR,"Invoked angle equil angle on angle style none"); + if (map[i] < 0) error->one(FLERR, "Invoked angle equil angle on angle style none"); return styles[map[i]]->equilibrium_angle(i); } @@ -341,13 +336,13 @@ double AngleHybrid::equilibrium_angle(int i) void AngleHybrid::write_restart(FILE *fp) { - fwrite(&nstyles,sizeof(int),1,fp); + fwrite(&nstyles, sizeof(int), 1, fp); int n; for (int m = 0; m < nstyles; m++) { n = strlen(keywords[m]) + 1; - fwrite(&n,sizeof(int),1,fp); - fwrite(keywords[m],sizeof(char),n,fp); + fwrite(&n, sizeof(int), 1, fp); + fwrite(keywords[m], sizeof(char), n, fp); styles[m]->write_restart_settings(fp); } } @@ -359,21 +354,21 @@ void AngleHybrid::write_restart(FILE *fp) void AngleHybrid::read_restart(FILE *fp) { int me = comm->me; - if (me == 0) utils::sfread(FLERR,&nstyles,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&nstyles,1,MPI_INT,0,world); - styles = new Angle*[nstyles]; - keywords = new char*[nstyles]; + if (me == 0) utils::sfread(FLERR, &nstyles, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&nstyles, 1, MPI_INT, 0, world); + styles = new Angle *[nstyles]; + keywords = new char *[nstyles]; allocate(); - int n,dummy; + int n, dummy; for (int m = 0; m < nstyles; m++) { - if (me == 0) utils::sfread(FLERR,&n,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&n,1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &n, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&n, 1, MPI_INT, 0, world); keywords[m] = new char[n]; - if (me == 0) utils::sfread(FLERR,keywords[m],sizeof(char),n,fp,nullptr,error); - MPI_Bcast(keywords[m],n,MPI_CHAR,0,world); - styles[m] = force->new_angle(keywords[m],0,dummy); + if (me == 0) utils::sfread(FLERR, keywords[m], sizeof(char), n, fp, nullptr, error); + MPI_Bcast(keywords[m], n, MPI_CHAR, 0, world); + styles[m] = force->new_angle(keywords[m], 0, dummy); styles[m]->read_restart_settings(fp); } } @@ -382,8 +377,8 @@ void AngleHybrid::read_restart(FILE *fp) double AngleHybrid::single(int type, int i1, int i2, int i3) { - if (map[type] < 0) error->one(FLERR,"Invoked angle single on angle style none"); - return styles[map[type]]->single(type,i1,i2,i3); + if (map[type] < 0) error->one(FLERR, "Invoked angle single on angle style none"); + return styles[map[type]]->single(type, i1, i2, i3); } /* ---------------------------------------------------------------------- @@ -392,10 +387,10 @@ double AngleHybrid::single(int type, int i1, int i2, int i3) double AngleHybrid::memory_usage() { - double bytes = (double)maxeatom * sizeof(double); - bytes += (double)maxvatom*6 * sizeof(double); - bytes += (double)maxcvatom*9 * sizeof(double); - for (int m = 0; m < nstyles; m++) bytes += (double)maxangle[m]*4 * sizeof(int); + double bytes = (double) maxeatom * sizeof(double); + bytes += (double) maxvatom * 6 * sizeof(double); + bytes += (double) maxcvatom * 9 * sizeof(double); + for (int m = 0; m < nstyles; m++) bytes += (double) maxangle[m] * 4 * sizeof(int); for (int m = 0; m < nstyles; m++) if (styles[m]) bytes += styles[m]->memory_usage(); return bytes; diff --git a/src/bond_hybrid.cpp b/src/bond_hybrid.cpp index 920c251f55..dad1010a1e 100644 --- a/src/bond_hybrid.cpp +++ b/src/bond_hybrid.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -21,8 +20,8 @@ #include "memory.h" #include "neighbor.h" -#include #include +#include using namespace LAMMPS_NS; @@ -46,19 +45,18 @@ BondHybrid::~BondHybrid() { if (nstyles) { for (int i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (int i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (int i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nbondlist; - delete [] maxbond; - for (int i = 0; i < nstyles; i++) - memory->destroy(bondlist[i]); - delete [] bondlist; + delete[] nbondlist; + delete[] maxbond; + for (int i = 0; i < nstyles; i++) memory->destroy(bondlist[i]); + delete[] bondlist; } } @@ -66,7 +64,7 @@ BondHybrid::~BondHybrid() void BondHybrid::compute(int eflag, int vflag) { - int i,j,m,n; + int i, j, m, n; // save ptrs to original bondlist @@ -88,7 +86,7 @@ void BondHybrid::compute(int eflag, int vflag) if (nbondlist[m] > maxbond[m]) { memory->destroy(bondlist[m]); maxbond[m] = nbondlist[m] + EXTRA; - memory->create(bondlist[m],maxbond[m],3,"bond_hybrid:bondlist"); + memory->create(bondlist[m], maxbond[m], 3, "bond_hybrid:bondlist"); } nbondlist[m] = 0; } @@ -107,7 +105,7 @@ void BondHybrid::compute(int eflag, int vflag) // set neighbor->bondlist to sub-style bondlist before call // accumulate sub-style global/peratom energy/virial in hybrid - ev_init(eflag,vflag); + ev_init(eflag, vflag); // need to clear per-thread storage once here, when using multiple threads // with thread-enabled substyles to avoid uninitlialized data access. @@ -115,17 +113,15 @@ void BondHybrid::compute(int eflag, int vflag) const int nthreads = comm->nthreads; if (nthreads > 1) { const bigint nall = atom->nlocal + atom->nghost; - if (eflag_atom) - memset(&eatom[0],0,nall*nthreads*sizeof(double)); - if (vflag_atom) - memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + if (eflag_atom) memset(&eatom[0], 0, nall * nthreads * sizeof(double)); + if (vflag_atom) memset(&vatom[0][0], 0, 6 * nall * nthreads * sizeof(double)); } for (m = 0; m < nstyles; m++) { neighbor->nbondlist = nbondlist[m]; neighbor->bondlist = bondlist[m]; - styles[m]->compute(eflag,vflag); + styles[m]->compute(eflag, vflag); if (eflag_global) energy += styles[m]->energy; if (vflag_global) @@ -141,8 +137,7 @@ void BondHybrid::compute(int eflag, int vflag) if (force->newton_bond) n += atom->nghost; double **vatom_substyle = styles[m]->vatom; for (i = 0; i < n; i++) - for (j = 0; j < 6; j++) - vatom[i][j] += vatom_substyle[i][j]; + for (j = 0; j < 6; j++) vatom[i][j] += vatom_substyle[i][j]; } } @@ -159,13 +154,13 @@ void BondHybrid::allocate() allocated = 1; int n = atom->nbondtypes; - memory->create(map,n+1,"bond:map"); - memory->create(setflag,n+1,"bond:setflag"); + memory->create(map, n + 1, "bond:map"); + memory->create(setflag, n + 1, "bond:setflag"); for (int i = 1; i <= n; i++) setflag[i] = 0; nbondlist = new int[nstyles]; maxbond = new int[nstyles]; - bondlist = new int**[nstyles]; + bondlist = new int **[nstyles]; for (int m = 0; m < nstyles; m++) maxbond[m] = 0; for (int m = 0; m < nstyles; m++) bondlist[m] = nullptr; } @@ -176,28 +171,27 @@ void BondHybrid::allocate() void BondHybrid::settings(int narg, char **arg) { - int i,m,istyle; + int i, m, istyle; - if (narg < 1) error->all(FLERR,"Illegal bond_style command"); + if (narg < 1) error->all(FLERR, "Illegal bond_style command"); // delete old lists, since cannot just change settings if (nstyles) { for (i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; has_quartic = -1; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nbondlist; - delete [] maxbond; - for (i = 0; i < nstyles; i++) - memory->destroy(bondlist[i]); - delete [] bondlist; + delete[] nbondlist; + delete[] maxbond; + for (i = 0; i < nstyles; i++) memory->destroy(bondlist[i]); + delete[] bondlist; } allocated = 0; @@ -208,7 +202,7 @@ void BondHybrid::settings(int narg, char **arg) nstyles = 0; i = 0; while (i < narg) { - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; nstyles++; @@ -216,8 +210,8 @@ void BondHybrid::settings(int narg, char **arg) // allocate list of sub-styles - styles = new Bond*[nstyles]; - keywords = new char*[nstyles]; + styles = new Bond *[nstyles]; + keywords = new char *[nstyles]; // allocate each sub-style and call its settings() with subset of args // allocate uses suffix, but don't store suffix version in keywords, @@ -233,29 +227,28 @@ void BondHybrid::settings(int narg, char **arg) while (i < narg) { for (m = 0; m < nstyles; m++) - if (strcmp(arg[i],keywords[m]) == 0) - error->all(FLERR,"Bond style hybrid cannot use same bond style twice"); + if (strcmp(arg[i], keywords[m]) == 0) + error->all(FLERR, "Bond style hybrid cannot use same bond style twice"); - if (strcmp(arg[i],"hybrid") == 0) - error->all(FLERR,"Bond style hybrid cannot have hybrid as an argument"); + if (strcmp(arg[i], "hybrid") == 0) + error->all(FLERR, "Bond style hybrid cannot have hybrid as an argument"); - if (strcmp(arg[i],"none") == 0) - error->all(FLERR,"Bond style hybrid cannot have none as an argument"); + if (strcmp(arg[i], "none") == 0) + error->all(FLERR, "Bond style hybrid cannot have none as an argument"); // register index of quartic bond type, // so that bond type 0 can be mapped to it - if (strncmp(arg[i],"quartic",7) == 0) - has_quartic = m; + if (strncmp(arg[i], "quartic", 7) == 0) has_quartic = m; - styles[nstyles] = force->new_bond(arg[i],1,dummy); - force->store_style(keywords[nstyles],arg[i],0); + styles[nstyles] = force->new_bond(arg[i], 1, dummy); + force->store_style(keywords[nstyles], arg[i], 0); istyle = i; - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; - styles[nstyles]->settings(i-istyle-1,&arg[istyle+1]); + styles[nstyles]->settings(i - istyle - 1, &arg[istyle + 1]); nstyles++; } } @@ -268,20 +261,22 @@ void BondHybrid::coeff(int narg, char **arg) { if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->nbondtypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->nbondtypes, ilo, ihi, error); // 2nd arg = bond sub-style name // allow for "none" as valid sub-style name int m; for (m = 0; m < nstyles; m++) - if (strcmp(arg[1],keywords[m]) == 0) break; + if (strcmp(arg[1], keywords[m]) == 0) break; int none = 0; if (m == nstyles) { - if (strcmp(arg[1],"none") == 0) none = 1; - else error->all(FLERR,"Bond coeff for hybrid has invalid style"); + if (strcmp(arg[1], "none") == 0) + none = 1; + else + error->all(FLERR, "Bond coeff for hybrid has invalid style"); } // move 1st arg to 2nd arg @@ -291,15 +286,17 @@ void BondHybrid::coeff(int narg, char **arg) // invoke sub-style coeff() starting with 1st arg - if (!none) styles[m]->coeff(narg-1,&arg[1]); + if (!none) styles[m]->coeff(narg - 1, &arg[1]); // set setflag and which type maps to which sub-style // if sub-style is none: set hybrid setflag, wipe out map for (int i = ilo; i <= ihi; i++) { setflag[i] = 1; - if (none) map[i] = -1; - else map[i] = m; + if (none) + map[i] = -1; + else + map[i] = m; } } @@ -313,8 +310,7 @@ void BondHybrid::init_style() // bond style quartic will set broken bonds to bond type 0, so we need // to create an entry for it in the bond type to sub-style map - if (has_quartic >= 0) - map[0] = has_quartic; + if (has_quartic >= 0) map[0] = has_quartic; } /* ---------------------------------------------------------------------- @@ -323,8 +319,7 @@ void BondHybrid::init_style() double BondHybrid::equilibrium_distance(int i) { - if (map[i] < 0) - error->one(FLERR,"Invoked bond equil distance on bond style none"); + if (map[i] < 0) error->one(FLERR, "Invoked bond equil distance on bond style none"); return styles[map[i]]->equilibrium_distance(i); } @@ -334,13 +329,13 @@ double BondHybrid::equilibrium_distance(int i) void BondHybrid::write_restart(FILE *fp) { - fwrite(&nstyles,sizeof(int),1,fp); + fwrite(&nstyles, sizeof(int), 1, fp); int n; for (int m = 0; m < nstyles; m++) { n = strlen(keywords[m]) + 1; - fwrite(&n,sizeof(int),1,fp); - fwrite(keywords[m],sizeof(char),n,fp); + fwrite(&n, sizeof(int), 1, fp); + fwrite(keywords[m], sizeof(char), n, fp); styles[m]->write_restart_settings(fp); } } @@ -352,33 +347,32 @@ void BondHybrid::write_restart(FILE *fp) void BondHybrid::read_restart(FILE *fp) { int me = comm->me; - if (me == 0) utils::sfread(FLERR,&nstyles,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&nstyles,1,MPI_INT,0,world); - styles = new Bond*[nstyles]; - keywords = new char*[nstyles]; + if (me == 0) utils::sfread(FLERR, &nstyles, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&nstyles, 1, MPI_INT, 0, world); + styles = new Bond *[nstyles]; + keywords = new char *[nstyles]; allocate(); - int n,dummy; + int n, dummy; for (int m = 0; m < nstyles; m++) { - if (me == 0) utils::sfread(FLERR,&n,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&n,1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &n, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&n, 1, MPI_INT, 0, world); keywords[m] = new char[n]; - if (me == 0) utils::sfread(FLERR,keywords[m],sizeof(char),n,fp,nullptr,error); - MPI_Bcast(keywords[m],n,MPI_CHAR,0,world); - styles[m] = force->new_bond(keywords[m],0,dummy); + if (me == 0) utils::sfread(FLERR, keywords[m], sizeof(char), n, fp, nullptr, error); + MPI_Bcast(keywords[m], n, MPI_CHAR, 0, world); + styles[m] = force->new_bond(keywords[m], 0, dummy); styles[m]->read_restart_settings(fp); } } /* ---------------------------------------------------------------------- */ -double BondHybrid::single(int type, double rsq, int i, int j, - double &fforce) +double BondHybrid::single(int type, double rsq, int i, int j, double &fforce) { - if (map[type] < 0) error->one(FLERR,"Invoked bond single on bond style none"); - return styles[map[type]]->single(type,rsq,i,j,fforce); + if (map[type] < 0) error->one(FLERR, "Invoked bond single on bond style none"); + return styles[map[type]]->single(type, rsq, i, j, fforce); } /* ---------------------------------------------------------------------- @@ -387,9 +381,9 @@ double BondHybrid::single(int type, double rsq, int i, int j, double BondHybrid::memory_usage() { - double bytes = (double)maxeatom * sizeof(double); - bytes += (double)maxvatom*6 * sizeof(double); - for (int m = 0; m < nstyles; m++) bytes += (double)maxbond[m]*3 * sizeof(int); + double bytes = (double) maxeatom * sizeof(double); + bytes += (double) maxvatom * 6 * sizeof(double); + for (int m = 0; m < nstyles; m++) bytes += (double) maxbond[m] * 3 * sizeof(int); for (int m = 0; m < nstyles; m++) if (styles[m]) bytes += styles[m]->memory_usage(); return bytes; diff --git a/src/dihedral_hybrid.cpp b/src/dihedral_hybrid.cpp index 752b1818a5..24a18e6783 100644 --- a/src/dihedral_hybrid.cpp +++ b/src/dihedral_hybrid.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -14,19 +13,18 @@ #include "dihedral_hybrid.h" -#include -#include #include "atom.h" -#include "neighbor.h" #include "comm.h" +#include "error.h" #include "force.h" #include "memory.h" -#include "error.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; - #define EXTRA 1000 /* ---------------------------------------------------------------------- */ @@ -46,19 +44,18 @@ DihedralHybrid::~DihedralHybrid() { if (nstyles) { for (int i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (int i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (int i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] ndihedrallist; - delete [] maxdihedral; - for (int i = 0; i < nstyles; i++) - memory->destroy(dihedrallist[i]); - delete [] dihedrallist; + delete[] ndihedrallist; + delete[] maxdihedral; + for (int i = 0; i < nstyles; i++) memory->destroy(dihedrallist[i]); + delete[] dihedrallist; } } @@ -66,7 +63,7 @@ DihedralHybrid::~DihedralHybrid() void DihedralHybrid::compute(int eflag, int vflag) { - int i,j,m,n; + int i, j, m, n; // save ptrs to original dihedrallist @@ -88,8 +85,7 @@ void DihedralHybrid::compute(int eflag, int vflag) if (ndihedrallist[m] > maxdihedral[m]) { memory->destroy(dihedrallist[m]); maxdihedral[m] = ndihedrallist[m] + EXTRA; - memory->create(dihedrallist[m],maxdihedral[m],5, - "dihedral_hybrid:dihedrallist"); + memory->create(dihedrallist[m], maxdihedral[m], 5, "dihedral_hybrid:dihedrallist"); } ndihedrallist[m] = 0; } @@ -110,7 +106,7 @@ void DihedralHybrid::compute(int eflag, int vflag) // set neighbor->dihedrallist to sub-style dihedrallist before call // accumulate sub-style global/peratom energy/virial in hybrid - ev_init(eflag,vflag); + ev_init(eflag, vflag); // need to clear per-thread storage here, when using multiple threads // with thread-enabled substyles to avoid uninitlialized data access. @@ -118,17 +114,15 @@ void DihedralHybrid::compute(int eflag, int vflag) const int nthreads = comm->nthreads; if (comm->nthreads > 1) { const bigint nall = atom->nlocal + atom->nghost; - if (eflag_atom) - memset(&eatom[0],0,nall*nthreads*sizeof(double)); - if (vflag_atom) - memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + if (eflag_atom) memset(&eatom[0], 0, nall * nthreads * sizeof(double)); + if (vflag_atom) memset(&vatom[0][0], 0, 6 * nall * nthreads * sizeof(double)); } for (m = 0; m < nstyles; m++) { neighbor->ndihedrallist = ndihedrallist[m]; neighbor->dihedrallist = dihedrallist[m]; - styles[m]->compute(eflag,vflag); + styles[m]->compute(eflag, vflag); if (eflag_global) energy += styles[m]->energy; if (vflag_global) @@ -144,16 +138,14 @@ void DihedralHybrid::compute(int eflag, int vflag) if (force->newton_bond) n += atom->nghost; double **vatom_substyle = styles[m]->vatom; for (i = 0; i < n; i++) - for (j = 0; j < 6; j++) - vatom[i][j] += vatom_substyle[i][j]; + for (j = 0; j < 6; j++) vatom[i][j] += vatom_substyle[i][j]; } if (cvflag_atom) { n = atom->nlocal; if (force->newton_bond) n += atom->nghost; double **cvatom_substyle = styles[m]->cvatom; for (i = 0; i < n; i++) - for (j = 0; j < 9; j++) - cvatom[i][j] += cvatom_substyle[i][j]; + for (j = 0; j < 9; j++) cvatom[i][j] += cvatom_substyle[i][j]; } } @@ -170,13 +162,13 @@ void DihedralHybrid::allocate() allocated = 1; int n = atom->ndihedraltypes; - memory->create(map,n+1,"dihedral:map"); - memory->create(setflag,n+1,"dihedral:setflag"); + memory->create(map, n + 1, "dihedral:map"); + memory->create(setflag, n + 1, "dihedral:setflag"); for (int i = 1; i <= n; i++) setflag[i] = 0; ndihedrallist = new int[nstyles]; maxdihedral = new int[nstyles]; - dihedrallist = new int**[nstyles]; + dihedrallist = new int **[nstyles]; for (int m = 0; m < nstyles; m++) maxdihedral[m] = 0; for (int m = 0; m < nstyles; m++) dihedrallist[m] = nullptr; } @@ -187,27 +179,26 @@ void DihedralHybrid::allocate() void DihedralHybrid::settings(int narg, char **arg) { - int i,m,istyle; + int i, m, istyle; - if (narg < 1) error->all(FLERR,"Illegal dihedral_style command"); + if (narg < 1) error->all(FLERR, "Illegal dihedral_style command"); // delete old lists, since cannot just change settings if (nstyles) { for (i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] ndihedrallist; - delete [] maxdihedral; - for (i = 0; i < nstyles; i++) - memory->destroy(dihedrallist[i]); - delete [] dihedrallist; + delete[] ndihedrallist; + delete[] maxdihedral; + for (i = 0; i < nstyles; i++) memory->destroy(dihedrallist[i]); + delete[] dihedrallist; } allocated = 0; @@ -218,7 +209,7 @@ void DihedralHybrid::settings(int narg, char **arg) nstyles = 0; i = 0; while (i < narg) { - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; nstyles++; @@ -226,8 +217,8 @@ void DihedralHybrid::settings(int narg, char **arg) // allocate list of sub-styles - styles = new Dihedral*[nstyles]; - keywords = new char*[nstyles]; + styles = new Dihedral *[nstyles]; + keywords = new char *[nstyles]; // allocate each sub-style and call its settings() with subset of args // allocate uses suffix, but don't store suffix version in keywords, @@ -242,23 +233,21 @@ void DihedralHybrid::settings(int narg, char **arg) while (i < narg) { for (m = 0; m < nstyles; m++) - if (strcmp(arg[i],keywords[m]) == 0) - error->all(FLERR,"Dihedral style hybrid cannot use " - "same dihedral style twice"); - if (strcmp(arg[i],"hybrid") == 0) - error->all(FLERR, - "Dihedral style hybrid cannot have hybrid as an argument"); - if (strcmp(arg[i],"none") == 0) - error->all(FLERR,"Dihedral style hybrid cannot have none as an argument"); + if (strcmp(arg[i], keywords[m]) == 0) + error->all(FLERR, "Dihedral style hybrid cannot use same dihedral style twice"); + if (strcmp(arg[i], "hybrid") == 0) + error->all(FLERR, "Dihedral style hybrid cannot have hybrid as an argument"); + if (strcmp(arg[i], "none") == 0) + error->all(FLERR, "Dihedral style hybrid cannot have none as an argument"); - styles[nstyles] = force->new_dihedral(arg[i],1,dummy); - force->store_style(keywords[nstyles],arg[i],0); + styles[nstyles] = force->new_dihedral(arg[i], 1, dummy); + force->store_style(keywords[nstyles], arg[i], 0); istyle = i; - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; - styles[nstyles]->settings(i-istyle-1,&arg[istyle+1]); + styles[nstyles]->settings(i - istyle - 1, &arg[istyle + 1]); nstyles++; } } @@ -271,32 +260,35 @@ void DihedralHybrid::coeff(int narg, char **arg) { if (!allocated) allocate(); - int ilo,ihi; - utils::bounds(FLERR,arg[0],1,atom->ndihedraltypes,ilo,ihi,error); + int ilo, ihi; + utils::bounds(FLERR, arg[0], 1, atom->ndihedraltypes, ilo, ihi, error); // 2nd arg = dihedral sub-style name // allow for "none" or "skip" as valid sub-style name int m; for (m = 0; m < nstyles; m++) - if (strcmp(arg[1],keywords[m]) == 0) break; + if (strcmp(arg[1], keywords[m]) == 0) break; int none = 0; int skip = 0; if (m == nstyles) { - if (strcmp(arg[1],"none") == 0) none = 1; - else if (strcmp(arg[1],"skip") == 0) none = skip = 1; - else if (strcmp(arg[1],"mbt") == 0) - error->all(FLERR,"MiddleBondTorsion coeff for hybrid dihedral has invalid format"); - else if (strcmp(arg[1],"ebt") == 0) - error->all(FLERR,"EndBondTorsion coeff for hybrid dihedral has invalid format"); - else if (strcmp(arg[1],"at") == 0) - error->all(FLERR,"AngleTorsion coeff for hybrid dihedral has invalid format"); - else if (strcmp(arg[1],"aat") == 0) - error->all(FLERR,"AngleAngleTorsion coeff for hybrid dihedral has invalid format"); - else if (strcmp(arg[1],"bb13") == 0) - error->all(FLERR,"BondBond13 coeff for hybrid dihedral has invalid format"); - else error->all(FLERR,"Dihedral coeff for hybrid has invalid style"); + if (strcmp(arg[1], "none") == 0) + none = 1; + else if (strcmp(arg[1], "skip") == 0) + none = skip = 1; + else if (strcmp(arg[1], "mbt") == 0) + error->all(FLERR, "MiddleBondTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1], "ebt") == 0) + error->all(FLERR, "EndBondTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1], "at") == 0) + error->all(FLERR, "AngleTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1], "aat") == 0) + error->all(FLERR, "AngleAngleTorsion coeff for hybrid dihedral has invalid format"); + else if (strcmp(arg[1], "bb13") == 0) + error->all(FLERR, "BondBond13 coeff for hybrid dihedral has invalid format"); + else + error->all(FLERR, "Dihedral coeff for hybrid has invalid style"); } // move 1st arg to 2nd arg @@ -306,14 +298,15 @@ void DihedralHybrid::coeff(int narg, char **arg) // invoke sub-style coeff() starting with 1st arg - if (!none) styles[m]->coeff(narg-1,&arg[1]); + if (!none) styles[m]->coeff(narg - 1, &arg[1]); // set setflag and which type maps to which sub-style // if sub-style is skip: auxiliary class2 setting in data file so ignore // if sub-style is none and not skip: set hybrid setflag, wipe out map for (int i = ilo; i <= ihi; i++) { - if (skip) continue; + if (skip) + continue; else if (none) { setflag[i] = 1; map[i] = -1; @@ -324,7 +317,9 @@ void DihedralHybrid::coeff(int narg, char **arg) } } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + run dihedral style specific initialization +------------------------------------------------------------------------- */ void DihedralHybrid::init_style() { @@ -338,13 +333,13 @@ void DihedralHybrid::init_style() void DihedralHybrid::write_restart(FILE *fp) { - fwrite(&nstyles,sizeof(int),1,fp); + fwrite(&nstyles, sizeof(int), 1, fp); int n; for (int m = 0; m < nstyles; m++) { n = strlen(keywords[m]) + 1; - fwrite(&n,sizeof(int),1,fp); - fwrite(keywords[m],sizeof(char),n,fp); + fwrite(&n, sizeof(int), 1, fp); + fwrite(keywords[m], sizeof(char), n, fp); styles[m]->write_restart_settings(fp); } } @@ -356,21 +351,21 @@ void DihedralHybrid::write_restart(FILE *fp) void DihedralHybrid::read_restart(FILE *fp) { int me = comm->me; - if (me == 0) utils::sfread(FLERR,&nstyles,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&nstyles,1,MPI_INT,0,world); - styles = new Dihedral*[nstyles]; - keywords = new char*[nstyles]; + if (me == 0) utils::sfread(FLERR, &nstyles, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&nstyles, 1, MPI_INT, 0, world); + styles = new Dihedral *[nstyles]; + keywords = new char *[nstyles]; allocate(); - int n,dummy; + int n, dummy; for (int m = 0; m < nstyles; m++) { - if (me == 0) utils::sfread(FLERR,&n,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&n,1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &n, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&n, 1, MPI_INT, 0, world); keywords[m] = new char[n]; - if (me == 0) utils::sfread(FLERR,keywords[m],sizeof(char),n,fp,nullptr,error); - MPI_Bcast(keywords[m],n,MPI_CHAR,0,world); - styles[m] = force->new_dihedral(keywords[m],0,dummy); + if (me == 0) utils::sfread(FLERR, keywords[m], sizeof(char), n, fp, nullptr, error); + MPI_Bcast(keywords[m], n, MPI_CHAR, 0, world); + styles[m] = force->new_dihedral(keywords[m], 0, dummy); styles[m]->read_restart_settings(fp); } } @@ -381,10 +376,10 @@ void DihedralHybrid::read_restart(FILE *fp) double DihedralHybrid::memory_usage() { - double bytes = (double)maxeatom * sizeof(double); - bytes += (double)maxvatom*6 * sizeof(double); - bytes += (double)maxcvatom*9 * sizeof(double); - for (int m = 0; m < nstyles; m++) bytes += (double)maxdihedral[m]*5 * sizeof(int); + double bytes = (double) maxeatom * sizeof(double); + bytes += (double) maxvatom * 6 * sizeof(double); + bytes += (double) maxcvatom * 9 * sizeof(double); + for (int m = 0; m < nstyles; m++) bytes += (double) maxdihedral[m] * 5 * sizeof(int); for (int m = 0; m < nstyles; m++) if (styles[m]) bytes += styles[m]->memory_usage(); return bytes; diff --git a/src/improper_hybrid.cpp b/src/improper_hybrid.cpp index ffee2e2fc8..d3a9403a6b 100644 --- a/src/improper_hybrid.cpp +++ b/src/improper_hybrid.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -14,15 +13,15 @@ #include "improper_hybrid.h" -#include -#include #include "atom.h" -#include "neighbor.h" #include "comm.h" +#include "error.h" #include "force.h" #include "memory.h" -#include "error.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; @@ -45,19 +44,18 @@ ImproperHybrid::~ImproperHybrid() { if (nstyles) { for (int i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (int i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (int i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nimproperlist; - delete [] maximproper; - for (int i = 0; i < nstyles; i++) - memory->destroy(improperlist[i]); - delete [] improperlist; + delete[] nimproperlist; + delete[] maximproper; + for (int i = 0; i < nstyles; i++) memory->destroy(improperlist[i]); + delete[] improperlist; } } @@ -65,7 +63,7 @@ ImproperHybrid::~ImproperHybrid() void ImproperHybrid::compute(int eflag, int vflag) { - int i,j,m,n; + int i, j, m, n; // save ptrs to original improperlist @@ -87,8 +85,7 @@ void ImproperHybrid::compute(int eflag, int vflag) if (nimproperlist[m] > maximproper[m]) { memory->destroy(improperlist[m]); maximproper[m] = nimproperlist[m] + EXTRA; - memory->create(improperlist[m],maximproper[m],5, - "improper_hybrid:improperlist"); + memory->create(improperlist[m], maximproper[m], 5, "improper_hybrid:improperlist"); } nimproperlist[m] = 0; } @@ -109,7 +106,7 @@ void ImproperHybrid::compute(int eflag, int vflag) // set neighbor->improperlist to sub-style improperlist before call // accumulate sub-style global/peratom energy/virial in hybrid - ev_init(eflag,vflag); + ev_init(eflag, vflag); // need to clear per-thread storage here, when using multiple threads // with thread-enabled substyles to avoid uninitlialized data access. @@ -117,17 +114,15 @@ void ImproperHybrid::compute(int eflag, int vflag) const int nthreads = comm->nthreads; if (comm->nthreads > 1) { const bigint nall = atom->nlocal + atom->nghost; - if (eflag_atom) - memset(&eatom[0],0,nall*nthreads*sizeof(double)); - if (vflag_atom) - memset(&vatom[0][0],0,6*nall*nthreads*sizeof(double)); + if (eflag_atom) memset(&eatom[0], 0, nall * nthreads * sizeof(double)); + if (vflag_atom) memset(&vatom[0][0], 0, 6 * nall * nthreads * sizeof(double)); } for (m = 0; m < nstyles; m++) { neighbor->nimproperlist = nimproperlist[m]; neighbor->improperlist = improperlist[m]; - styles[m]->compute(eflag,vflag); + styles[m]->compute(eflag, vflag); if (eflag_global) energy += styles[m]->energy; if (vflag_global) @@ -143,16 +138,14 @@ void ImproperHybrid::compute(int eflag, int vflag) if (force->newton_bond) n += atom->nghost; double **vatom_substyle = styles[m]->vatom; for (i = 0; i < n; i++) - for (j = 0; j < 6; j++) - vatom[i][j] += vatom_substyle[i][j]; + for (j = 0; j < 6; j++) vatom[i][j] += vatom_substyle[i][j]; } if (cvflag_atom) { n = atom->nlocal; if (force->newton_bond) n += atom->nghost; double **cvatom_substyle = styles[m]->cvatom; for (i = 0; i < n; i++) - for (j = 0; j < 9; j++) - cvatom[i][j] += cvatom_substyle[i][j]; + for (j = 0; j < 9; j++) cvatom[i][j] += cvatom_substyle[i][j]; } } @@ -169,53 +162,43 @@ void ImproperHybrid::allocate() allocated = 1; int n = atom->nimpropertypes; - memory->create(map,n+1,"improper:map"); - memory->create(setflag,n+1,"improper:setflag"); + memory->create(map, n + 1, "improper:map"); + memory->create(setflag, n + 1, "improper:setflag"); for (int i = 1; i <= n; i++) setflag[i] = 0; nimproperlist = new int[nstyles]; maximproper = new int[nstyles]; - improperlist = new int**[nstyles]; + improperlist = new int **[nstyles]; for (int m = 0; m < nstyles; m++) maximproper[m] = 0; for (int m = 0; m < nstyles; m++) improperlist[m] = nullptr; } -/* ---------------------------------------------------------------------- */ - -void ImproperHybrid::init_style() -{ - for (int i = 0; i < nstyles; i++) - styles[i]->init_style(); -} - - /* ---------------------------------------------------------------------- create one improper style for each arg in list ------------------------------------------------------------------------- */ void ImproperHybrid::settings(int narg, char **arg) { - int i,m,istyle; + int i, m, istyle; - if (narg < 1) error->all(FLERR,"Illegal improper_style command"); + if (narg < 1) error->all(FLERR, "Illegal improper_style command"); // delete old lists, since cannot just change settings if (nstyles) { for (i = 0; i < nstyles; i++) delete styles[i]; - delete [] styles; - for (i = 0; i < nstyles; i++) delete [] keywords[i]; - delete [] keywords; + delete[] styles; + for (i = 0; i < nstyles; i++) delete[] keywords[i]; + delete[] keywords; } if (allocated) { memory->destroy(setflag); memory->destroy(map); - delete [] nimproperlist; - delete [] maximproper; - for (i = 0; i < nstyles; i++) - memory->destroy(improperlist[i]); - delete [] improperlist; + delete[] nimproperlist; + delete[] maximproper; + for (i = 0; i < nstyles; i++) memory->destroy(improperlist[i]); + delete[] improperlist; } allocated = 0; @@ -226,7 +209,7 @@ void ImproperHybrid::settings(int narg, char **arg) nstyles = 0; i = 0; while (i < narg) { - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; nstyles++; @@ -234,8 +217,8 @@ void ImproperHybrid::settings(int narg, char **arg) // allocate list of sub-styles - styles = new Improper*[nstyles]; - keywords = new char*[nstyles]; + styles = new Improper *[nstyles]; + keywords = new char *[nstyles]; // allocate each sub-style and call its settings() with subset of args // allocate uses suffix, but don't store suffix version in keywords, @@ -250,23 +233,21 @@ void ImproperHybrid::settings(int narg, char **arg) while (i < narg) { for (m = 0; m < nstyles; m++) - if (strcmp(arg[i],keywords[m]) == 0) - error->all(FLERR,"Improper style hybrid cannot use " - "same improper style twice"); - if (strcmp(arg[i],"hybrid") == 0) - error->all(FLERR, - "Improper style hybrid cannot have hybrid as an argument"); - if (strcmp(arg[i],"none") == 0) - error->all(FLERR,"Improper style hybrid cannot have none as an argument"); + if (strcmp(arg[i], keywords[m]) == 0) + error->all(FLERR, "Improper style hybrid cannot use same improper style twice"); + if (strcmp(arg[i], "hybrid") == 0) + error->all(FLERR, "Improper style hybrid cannot have hybrid as an argument"); + if (strcmp(arg[i], "none") == 0) + error->all(FLERR, "Improper style hybrid cannot have none as an argument"); - styles[nstyles] = force->new_improper(arg[i],1,dummy); - force->store_style(keywords[nstyles],arg[i],0); + styles[nstyles] = force->new_improper(arg[i], 1, dummy); + force->store_style(keywords[nstyles], arg[i], 0); istyle = i; - if (strcmp(arg[i],"table") == 0) i++; + if (strcmp(arg[i], "table") == 0) i++; i++; while (i < narg && !isalpha(arg[i][0])) i++; - styles[nstyles]->settings(i-istyle-1,&arg[istyle+1]); + styles[nstyles]->settings(i - istyle - 1, &arg[istyle + 1]); nstyles++; } } @@ -279,24 +260,27 @@ void ImproperHybrid::coeff(int narg, char **arg) { 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); // 2nd arg = improper sub-style name // allow for "none" or "skip" as valid sub-style name int m; for (m = 0; m < nstyles; m++) - if (strcmp(arg[1],keywords[m]) == 0) break; + if (strcmp(arg[1], keywords[m]) == 0) break; int none = 0; int skip = 0; if (m == nstyles) { - if (strcmp(arg[1],"none") == 0) none = 1; - else if (strcmp(arg[1],"skip") == 0) none = skip = 1; - else if (strcmp(arg[1],"aa") == 0) - error->all(FLERR,"AngleAngle coeff for hybrid improper has invalid format"); - else error->all(FLERR,"Improper coeff for hybrid has invalid style"); + if (strcmp(arg[1], "none") == 0) + none = 1; + else if (strcmp(arg[1], "skip") == 0) + none = skip = 1; + else if (strcmp(arg[1], "aa") == 0) + error->all(FLERR, "AngleAngle coeff for hybrid improper has invalid format"); + else + error->all(FLERR, "Improper coeff for hybrid has invalid style"); } // move 1st arg to 2nd arg @@ -306,13 +290,16 @@ void ImproperHybrid::coeff(int narg, char **arg) // invoke sub-style coeff() starting with 1st arg - if (!none) styles[m]->coeff(narg-1,&arg[1]); + if (!none) styles[m]->coeff(narg - 1, &arg[1]); // set setflag and which type maps to which sub-style - // if sub-style is none: set hybrid setflag, wipe out map + // if sub-style is skip: auxiliary class2 setting in data file so ignore + // if sub-style is none and not skip: set hybrid setflag, wipe out map for (int i = ilo; i <= ihi; i++) { - if (none) { + if (skip) + continue; + else if (none) { setflag[i] = 1; map[i] = -1; } else { @@ -322,19 +309,29 @@ void ImproperHybrid::coeff(int narg, char **arg) } } +/* ---------------------------------------------------------------------- + run improper style specific initialization +------------------------------------------------------------------------- */ + +void ImproperHybrid::init_style() +{ + for (int m = 0; m < nstyles; m++) + if (styles[m]) styles[m]->init_style(); +} + /* ---------------------------------------------------------------------- proc 0 writes to restart file ------------------------------------------------------------------------- */ void ImproperHybrid::write_restart(FILE *fp) { - fwrite(&nstyles,sizeof(int),1,fp); + fwrite(&nstyles, sizeof(int), 1, fp); int n; for (int m = 0; m < nstyles; m++) { n = strlen(keywords[m]) + 1; - fwrite(&n,sizeof(int),1,fp); - fwrite(keywords[m],sizeof(char),n,fp); + fwrite(&n, sizeof(int), 1, fp); + fwrite(keywords[m], sizeof(char), n, fp); styles[m]->write_restart_settings(fp); } } @@ -346,21 +343,21 @@ void ImproperHybrid::write_restart(FILE *fp) void ImproperHybrid::read_restart(FILE *fp) { int me = comm->me; - if (me == 0) utils::sfread(FLERR,&nstyles,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&nstyles,1,MPI_INT,0,world); - styles = new Improper*[nstyles]; - keywords = new char*[nstyles]; + if (me == 0) utils::sfread(FLERR, &nstyles, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&nstyles, 1, MPI_INT, 0, world); + styles = new Improper *[nstyles]; + keywords = new char *[nstyles]; allocate(); - int n,dummy; + int n, dummy; for (int m = 0; m < nstyles; m++) { - if (me == 0) utils::sfread(FLERR,&n,sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&n,1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &n, sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&n, 1, MPI_INT, 0, world); keywords[m] = new char[n]; - if (me == 0) utils::sfread(FLERR,keywords[m],sizeof(char),n,fp,nullptr,error); - MPI_Bcast(keywords[m],n,MPI_CHAR,0,world); - styles[m] = force->new_improper(keywords[m],0,dummy); + if (me == 0) utils::sfread(FLERR, keywords[m], sizeof(char), n, fp, nullptr, error); + MPI_Bcast(keywords[m], n, MPI_CHAR, 0, world); + styles[m] = force->new_improper(keywords[m], 0, dummy); styles[m]->read_restart_settings(fp); } } @@ -371,10 +368,10 @@ void ImproperHybrid::read_restart(FILE *fp) double ImproperHybrid::memory_usage() { - double bytes = (double)maxeatom * sizeof(double); - bytes += (double)maxvatom*6 * sizeof(double); - bytes += (double)maxcvatom*9 * sizeof(double); - for (int m = 0; m < nstyles; m++) bytes += (double)maximproper[m]*5 * sizeof(int); + double bytes = (double) maxeatom * sizeof(double); + bytes += (double) maxvatom * 6 * sizeof(double); + bytes += (double) maxcvatom * 9 * sizeof(double); + for (int m = 0; m < nstyles; m++) bytes += (double) maximproper[m] * 5 * sizeof(int); for (int m = 0; m < nstyles; m++) if (styles[m]) bytes += styles[m]->memory_usage(); return bytes; From a3bfcc68ef4438b3ef1f693167a30f0dfd0672b8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:45:15 -0400 Subject: [PATCH 226/352] add libgomp suppression for newer GCC --- tools/valgrind/OpenMP.supp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/valgrind/OpenMP.supp b/tools/valgrind/OpenMP.supp index 64ee61febd..0820100b94 100644 --- a/tools/valgrind/OpenMP.supp +++ b/tools/valgrind/OpenMP.supp @@ -112,3 +112,14 @@ ... obj:* } +{ + OpnMP_init_part10 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + ... + fun:call_init + fun:_dl_init + ... + obj:* +} From 53050a04296cdcded9bd0bd5c8bbdb479b8ae91a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:45:32 -0400 Subject: [PATCH 227/352] add suppressions for FlexiBLAS on Fedora --- tools/valgrind/FlexiBLAS.supp | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tools/valgrind/FlexiBLAS.supp diff --git a/tools/valgrind/FlexiBLAS.supp b/tools/valgrind/FlexiBLAS.supp new file mode 100644 index 0000000000..d5dda4e54f --- /dev/null +++ b/tools/valgrind/FlexiBLAS.supp @@ -0,0 +1,61 @@ +{ + FL_BLAS_init_part1 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + ... + fun:flexiblas_init + ... + fun:call_init + fun:_dl_init + ... + obj:* +} +{ + FL_BLAS_init_part2 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + ... + fun:dl_open_worker + ... + fun:dlopen_doit + ... + fun:flexiblas_init +} +{ + FL_BLAS_init_part3 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + ... + fun:flexiblas_init + ... + fun:call_init + ... + obj:* +} +{ + FL_BLAS_exception1 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + ... + fun:dl_open_worker + ... + fun:dlopen_doit + ... + obj:* +} +{ + FL_BLAS_exception2 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + ... + fun:dl_open_worker + ... + fun:dlopen_doit + ... + obj:* +} From b7be9415defecf1790f9bc5de055e6d4f843d4b2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:49:26 -0400 Subject: [PATCH 228/352] fix segfault with pair style sw/intel --- src/INTEL/pair_sw_intel.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/INTEL/pair_sw_intel.cpp b/src/INTEL/pair_sw_intel.cpp index f494965ff8..0a7e3baca0 100644 --- a/src/INTEL/pair_sw_intel.cpp +++ b/src/INTEL/pair_sw_intel.cpp @@ -1277,6 +1277,7 @@ template void PairSWIntel::ForceConst::set_ntypes(const int ntypes, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if (ntypes != _ntypes) { if (_ntypes > 0) { fc_packed0 *op2 = p2[0]; @@ -1293,19 +1294,19 @@ void PairSWIntel::ForceConst::set_ntypes(const int ntypes, } #endif - memory->destroy(p2); - memory->destroy(p2f); - memory->destroy(p2f2); - memory->destroy(p2e); - memory->destroy(p3); + _memory->destroy(p2); + _memory->destroy(p2f); + _memory->destroy(p2f2); + _memory->destroy(p2e); + _memory->destroy(p3); } if (ntypes > 0) { _cop = cop; - memory->create(p2,ntypes,ntypes,"fc.p2"); - memory->create(p2f,ntypes,ntypes,"fc.p2f"); - memory->create(p2f2,ntypes,ntypes,"fc.p2f2"); - memory->create(p2e,ntypes,ntypes,"fc.p2e"); - memory->create(p3,ntypes,ntypes,ntypes,"fc.p3"); + _memory->create(p2,ntypes,ntypes,"fc.p2"); + _memory->create(p2f,ntypes,ntypes,"fc.p2f"); + _memory->create(p2f2,ntypes,ntypes,"fc.p2f2"); + _memory->create(p2e,ntypes,ntypes,"fc.p2e"); + _memory->create(p3,ntypes,ntypes,ntypes,"fc.p3"); #ifdef _LMP_INTEL_OFFLOAD fc_packed0 *op2 = p2[0]; @@ -1325,5 +1326,4 @@ void PairSWIntel::ForceConst::set_ntypes(const int ntypes, } } _ntypes = ntypes; - _memory = memory; } From 37ca6a8e0bd8f0fdca1b9bcf83ac446f3f0c40f7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 15:50:44 -0400 Subject: [PATCH 229/352] make handling of reference to Memory class in ForceConst class more robust --- src/INTEL/pair_buck_coul_cut_intel.cpp | 11 +++++----- src/INTEL/pair_buck_coul_long_intel.cpp | 20 +++++++++---------- src/INTEL/pair_buck_intel.cpp | 7 +++---- src/INTEL/pair_dpd_intel.cpp | 8 ++++---- src/INTEL/pair_eam_intel.cpp | 16 +++++++-------- src/INTEL/pair_gayberne_intel.cpp | 20 +++++++++---------- .../pair_lj_charmm_coul_charmm_intel.cpp | 6 +++--- src/INTEL/pair_lj_charmm_coul_long_intel.cpp | 18 ++++++++--------- src/INTEL/pair_lj_cut_coul_long_intel.cpp | 18 ++++++++--------- src/INTEL/pair_lj_cut_intel.cpp | 6 +++--- src/INTEL/pair_tersoff_intel.cpp | 16 +++++++-------- 11 files changed, 72 insertions(+), 74 deletions(-) diff --git a/src/INTEL/pair_buck_coul_cut_intel.cpp b/src/INTEL/pair_buck_coul_cut_intel.cpp index 9181b15aae..2633fd4ab2 100644 --- a/src/INTEL/pair_buck_coul_cut_intel.cpp +++ b/src/INTEL/pair_buck_coul_cut_intel.cpp @@ -504,7 +504,8 @@ void PairBuckCoulCutIntel::ForceConst::set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop) { - if ((ntypes != _ntypes || ntable != _ntable)) { + if (memory != nullptr) _memory = memory; + if ((ntypes != _ntypes) || (ntable != _ntable)) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -526,13 +527,12 @@ void PairBuckCoulCutIntel::ForceConst::set_ntypes(const int ntypes, _memory->destroy(c_force); _memory->destroy(c_energy); _memory->destroy(c_cut); - } if (ntypes > 0) { _cop = cop; - memory->create(c_force,ntypes,ntypes,"fc.c_force"); - memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); - memory->create(c_cut,ntypes,ntypes,"fc.c_cut"); + _memory->create(c_force,ntypes,ntypes,"fc.c_force"); + _memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); + _memory->create(c_cut,ntypes,ntypes,"fc.c_cut"); #ifdef _LMP_INTEL_OFFLOAD @@ -558,5 +558,4 @@ void PairBuckCoulCutIntel::ForceConst::set_ntypes(const int ntypes, } _ntypes=ntypes; _ntable=ntable; - _memory=memory; } diff --git a/src/INTEL/pair_buck_coul_long_intel.cpp b/src/INTEL/pair_buck_coul_long_intel.cpp index fdf78ff5d9..d9d618e4a8 100644 --- a/src/INTEL/pair_buck_coul_long_intel.cpp +++ b/src/INTEL/pair_buck_coul_long_intel.cpp @@ -615,7 +615,8 @@ void PairBuckCoulLongIntel::ForceConst::set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop) { - if ((ntypes != _ntypes || ntable != _ntable)) { + if (memory != nullptr) _memory = memory; + if ((ntypes != _ntypes) || (ntable != _ntable)) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -652,14 +653,14 @@ void PairBuckCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(c_force,ntypes,ntypes,"fc.c_force"); - memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); - memory->create(rho_inv,ntypes,ntypes,"fc.rho_inv"); - memory->create(table,ntable,"pair:fc.table"); - memory->create(etable,ntable,"pair:fc.etable"); - memory->create(detable,ntable,"pair:fc.detable"); - memory->create(ctable,ntable,"pair:fc.ctable"); - memory->create(dctable,ntable,"pair:fc.dctable"); + _memory->create(c_force,ntypes,ntypes,"fc.c_force"); + _memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); + _memory->create(rho_inv,ntypes,ntypes,"fc.rho_inv"); + _memory->create(table,ntable,"pair:fc.table"); + _memory->create(etable,ntable,"pair:fc.etable"); + _memory->create(detable,ntable,"pair:fc.detable"); + _memory->create(ctable,ntable,"pair:fc.ctable"); + _memory->create(dctable,ntable,"pair:fc.dctable"); #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -692,7 +693,6 @@ void PairBuckCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } _ntypes=ntypes; _ntable=ntable; - _memory=memory; } diff --git a/src/INTEL/pair_buck_intel.cpp b/src/INTEL/pair_buck_intel.cpp index f15669e1d3..9bad314fcf 100644 --- a/src/INTEL/pair_buck_intel.cpp +++ b/src/INTEL/pair_buck_intel.cpp @@ -455,6 +455,7 @@ template void PairBuckIntel::ForceConst::set_ntypes(const int ntypes, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if ((ntypes != _ntypes )) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD @@ -477,9 +478,8 @@ void PairBuckIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(c_force,ntypes,ntypes,"fc.c_force"); - memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); - + _memory->create(c_force,ntypes,ntypes,"fc.c_force"); + _memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -499,7 +499,6 @@ void PairBuckIntel::ForceConst::set_ntypes(const int ntypes, } } _ntypes=ntypes; - _memory=memory; } diff --git a/src/INTEL/pair_dpd_intel.cpp b/src/INTEL/pair_dpd_intel.cpp index b69473fbbf..e6ffd1ca44 100644 --- a/src/INTEL/pair_dpd_intel.cpp +++ b/src/INTEL/pair_dpd_intel.cpp @@ -558,6 +558,7 @@ void PairDPDIntel::ForceConst::set_ntypes(const int ntypes, const int max_nbors, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if (ntypes != _ntypes) { if (_ntypes > 0) { _memory->destroy(param); @@ -566,15 +567,14 @@ void PairDPDIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(param,ntypes,ntypes,"fc.param"); - memory->create(rand_buffer_thread, nthreads, max_nbors, + _memory->create(param,ntypes,ntypes,"fc.param"); + _memory->create(rand_buffer_thread, nthreads, max_nbors, "fc.rand_buffer_thread"); - memory->create(rngi,nthreads,"fc.param"); + _memory->create(rngi,nthreads,"fc.param"); for (int i = 0; i < nthreads; i++) rngi[i] = max_nbors; } } _ntypes = ntypes; - _memory = memory; } /* ---------------------------------------------------------------------- diff --git a/src/INTEL/pair_eam_intel.cpp b/src/INTEL/pair_eam_intel.cpp index 911a623d6d..8a42e6bbaa 100644 --- a/src/INTEL/pair_eam_intel.cpp +++ b/src/INTEL/pair_eam_intel.cpp @@ -781,7 +781,8 @@ void PairEAMIntel::ForceConst::set_ntypes(const int ntypes, const int nr, const int nrho, Memory *memory, const int cop) { - if (ntypes != _ntypes || nr + 1 > _nr || nrho + 1 > _nrho) { + if (memory != nullptr) _memory = memory; + if ((ntypes != _ntypes) || (nr + 1 > _nr) || (nrho + 1 > _nrho)) { if (_ntypes > 0) { _memory->destroy(rhor_spline_f); _memory->destroy(rhor_spline_e); @@ -794,18 +795,17 @@ void PairEAMIntel::ForceConst::set_ntypes(const int ntypes, _cop = cop; _nr = nr + 1; IP_PRE_edge_align(_nr, sizeof(flt_t)); - memory->create(rhor_spline_f,ntypes*ntypes*_nr,"fc.rhor_spline_f"); - memory->create(rhor_spline_e,ntypes*ntypes*_nr,"fc.rhor_spline_e"); - memory->create(z2r_spline_t,ntypes*ntypes*_nr,"fc.z2r_spline_t"); + _memory->create(rhor_spline_f,ntypes*ntypes*_nr,"fc.rhor_spline_f"); + _memory->create(rhor_spline_e,ntypes*ntypes*_nr,"fc.rhor_spline_e"); + _memory->create(z2r_spline_t,ntypes*ntypes*_nr,"fc.z2r_spline_t"); _nrho = nrho + 1; IP_PRE_edge_align(_nrho, sizeof(flt_t)); - memory->create(frho_spline_f,ntypes*_nrho,"fc.frho_spline_f"); - memory->create(frho_spline_e,ntypes*_nrho,"fc.frho_spline_e"); - memory->create(scale_f,ntypes,ntypes,"fc.scale_f"); + _memory->create(frho_spline_f,ntypes*_nrho,"fc.frho_spline_f"); + _memory->create(frho_spline_e,ntypes*_nrho,"fc.frho_spline_e"); + _memory->create(scale_f,ntypes,ntypes,"fc.scale_f"); } } _ntypes = ntypes; - _memory = memory; } /* ---------------------------------------------------------------------- */ diff --git a/src/INTEL/pair_gayberne_intel.cpp b/src/INTEL/pair_gayberne_intel.cpp index 285dd9661b..139792e543 100644 --- a/src/INTEL/pair_gayberne_intel.cpp +++ b/src/INTEL/pair_gayberne_intel.cpp @@ -990,6 +990,7 @@ void PairGayBerneIntel::ForceConst::set_ntypes(const int ntypes, const int nthreads, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if (ntypes != _ntypes) { if (_ntypes > 0) { fc_packed3 *oic = ic; @@ -1029,15 +1030,15 @@ void PairGayBerneIntel::ForceConst::set_ntypes(const int ntypes, if (ntypes > 0) { _cop = cop; - memory->create(ijc, ntypes, ntypes, "fc.ijc"); - memory->create(lj34, ntypes, ntypes, "fc.lj34"); - memory->create(ic, ntypes, "fc.ic"); - memory->create(rsq_form, nthreads, one_length, "rsq_form"); - memory->create(delx_form, nthreads, one_length, "delx_form"); - memory->create(dely_form, nthreads, one_length, "dely_form"); - memory->create(delz_form, nthreads, one_length, "delz_form"); - memory->create(jtype_form, nthreads, one_length, "jtype_form"); - memory->create(jlist_form, nthreads, one_length, "jlist_form"); + _memory->create(ijc, ntypes, ntypes, "fc.ijc"); + _memory->create(lj34, ntypes, ntypes, "fc.lj34"); + _memory->create(ic, ntypes, "fc.ic"); + _memory->create(rsq_form, nthreads, one_length, "rsq_form"); + _memory->create(delx_form, nthreads, one_length, "delx_form"); + _memory->create(dely_form, nthreads, one_length, "dely_form"); + _memory->create(delz_form, nthreads, one_length, "delz_form"); + _memory->create(jtype_form, nthreads, one_length, "jtype_form"); + _memory->create(jlist_form, nthreads, one_length, "jlist_form"); for (int zn = 0; zn < nthreads; zn++) for (int zo = 0; zo < one_length; zo++) { @@ -1082,5 +1083,4 @@ void PairGayBerneIntel::ForceConst::set_ntypes(const int ntypes, } } _ntypes = ntypes; - _memory = memory; } diff --git a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp index 3a7ab5276e..23e357516f 100644 --- a/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -559,6 +559,7 @@ void PairLJCharmmCoulCharmmIntel::pack_force_const(ForceConst &fc, template void PairLJCharmmCoulCharmmIntel::ForceConst::set_ntypes( const int ntypes, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if (ntypes != _ntypes) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD @@ -579,8 +580,8 @@ void PairLJCharmmCoulCharmmIntel::ForceConst::set_ntypes( } if (ntypes > 0) { _cop = cop; - memory->create(cutsq,ntypes,ntypes,"fc.cutsq"); - memory->create(lj,ntypes,ntypes,"fc.lj"); + _memory->create(cutsq,ntypes,ntypes,"fc.cutsq"); + _memory->create(lj,ntypes,ntypes,"fc.lj"); #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -599,5 +600,4 @@ void PairLJCharmmCoulCharmmIntel::ForceConst::set_ntypes( } } _ntypes=ntypes; - _memory=memory; } diff --git a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp index 8a4595dd99..696f5948ac 100644 --- a/src/INTEL/pair_lj_charmm_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_charmm_coul_long_intel.cpp @@ -654,7 +654,8 @@ void PairLJCharmmCoulLongIntel::ForceConst::set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop) { - if ((ntypes != _ntypes || ntable != _ntable)) { + if (memory != nullptr) _memory = memory; + if ((ntypes != _ntypes) || (ntable != _ntable)) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -688,13 +689,13 @@ void PairLJCharmmCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(cutsq,ntypes,ntypes,"fc.cutsq"); - memory->create(lj,ntypes,ntypes,"fc.lj"); - memory->create(table,ntable,"pair:fc.table"); - memory->create(etable,ntable,"pair:fc.etable"); - memory->create(detable,ntable,"pair:fc.detable"); - memory->create(ctable,ntable,"pair:fc.ctable"); - memory->create(dctable,ntable,"pair:fc.dctable"); + _memory->create(cutsq,ntypes,ntypes,"fc.cutsq"); + _memory->create(lj,ntypes,ntypes,"fc.lj"); + _memory->create(table,ntable,"pair:fc.table"); + _memory->create(etable,ntable,"pair:fc.etable"); + _memory->create(detable,ntable,"pair:fc.detable"); + _memory->create(ctable,ntable,"pair:fc.ctable"); + _memory->create(dctable,ntable,"pair:fc.dctable"); #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -724,5 +725,4 @@ void PairLJCharmmCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } _ntypes=ntypes; _ntable=ntable; - _memory=memory; } diff --git a/src/INTEL/pair_lj_cut_coul_long_intel.cpp b/src/INTEL/pair_lj_cut_coul_long_intel.cpp index a53d74f72a..f78f579a9a 100644 --- a/src/INTEL/pair_lj_cut_coul_long_intel.cpp +++ b/src/INTEL/pair_lj_cut_coul_long_intel.cpp @@ -610,7 +610,8 @@ void PairLJCutCoulLongIntel::ForceConst::set_ntypes(const int ntypes, const int ntable, Memory *memory, const int cop) { - if ((ntypes != _ntypes || ntable != _ntable)) { + if (memory != nullptr) _memory = memory; + if ((ntypes != _ntypes) || (ntable != _ntable)) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -644,13 +645,13 @@ void PairLJCutCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(c_force,ntypes,ntypes,"fc.c_force"); - memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); - memory->create(table,ntable,"pair:fc.table"); - memory->create(etable,ntable,"pair:fc.etable"); - memory->create(detable,ntable,"pair:fc.detable"); - memory->create(ctable,ntable,"pair:fc.ctable"); - memory->create(dctable,ntable,"pair:fc.dctable"); + _memory->create(c_force,ntypes,ntypes,"fc.c_force"); + _memory->create(c_energy,ntypes,ntypes,"fc.c_energy"); + _memory->create(table,ntable,"pair:fc.table"); + _memory->create(etable,ntable,"pair:fc.etable"); + _memory->create(detable,ntable,"pair:fc.detable"); + _memory->create(ctable,ntable,"pair:fc.ctable"); + _memory->create(dctable,ntable,"pair:fc.dctable"); #ifdef _LMP_INTEL_OFFLOAD flt_t * ospecial_lj = special_lj; @@ -681,5 +682,4 @@ void PairLJCutCoulLongIntel::ForceConst::set_ntypes(const int ntypes, } _ntypes=ntypes; _ntable=ntable; - _memory=memory; } diff --git a/src/INTEL/pair_lj_cut_intel.cpp b/src/INTEL/pair_lj_cut_intel.cpp index 133b6079a1..afd01e9919 100644 --- a/src/INTEL/pair_lj_cut_intel.cpp +++ b/src/INTEL/pair_lj_cut_intel.cpp @@ -471,6 +471,7 @@ template void PairLJCutIntel::ForceConst::set_ntypes(const int ntypes, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if (ntypes != _ntypes) { if (_ntypes > 0) { _memory->destroy(ljc12o); @@ -478,10 +479,9 @@ void PairLJCutIntel::ForceConst::set_ntypes(const int ntypes, } if (ntypes > 0) { _cop = cop; - memory->create(ljc12o,ntypes,ntypes,"fc.c12o"); - memory->create(lj34,ntypes,ntypes,"fc.lj34"); + _memory->create(ljc12o,ntypes,ntypes,"fc.c12o"); + _memory->create(lj34,ntypes,ntypes,"fc.lj34"); } } _ntypes = ntypes; - _memory = memory; } diff --git a/src/INTEL/pair_tersoff_intel.cpp b/src/INTEL/pair_tersoff_intel.cpp index 732d100927..3c963cb850 100644 --- a/src/INTEL/pair_tersoff_intel.cpp +++ b/src/INTEL/pair_tersoff_intel.cpp @@ -550,6 +550,7 @@ template void PairTersoffIntel::ForceConst::set_ntypes(const int ntypes, Memory *memory, const int cop) { + if (memory != nullptr) _memory = memory; if ((ntypes != _ntypes)) { if (_ntypes > 0) { #ifdef _LMP_INTEL_OFFLOAD @@ -581,13 +582,13 @@ void PairTersoffIntel::ForceConst::set_ntypes(const int ntypes, _cop = cop; size_t VL = 512 / 8 / sizeof(flt_t); int ntypes_pad = ntypes + VL - ntypes % VL; - memory->create(c_first_loop,ntypes,ntypes,"fc.c_first_loop"); - memory->create(c_second_loop,ntypes,ntypes,"fc.c_second_loop"); - memory->create(c_cutoff_outer,ntypes,ntypes,"fc.c_cutoff_outer"); - memory->create(c_inner_loop,ntypes,ntypes,ntypes,"fc.c_inner_loop"); - memory->create(c_cutoff_inner,ntypes,ntypes,ntypes_pad,"fc.c_cutoff_inner"); - memory->create(c_inner,ntypes,ntypes,ntypes,"fc.c_inner"); - memory->create(c_outer,ntypes,ntypes,"fc.c_outer"); + _memory->create(c_first_loop,ntypes,ntypes,"fc.c_first_loop"); + _memory->create(c_second_loop,ntypes,ntypes,"fc.c_second_loop"); + _memory->create(c_cutoff_outer,ntypes,ntypes,"fc.c_cutoff_outer"); + _memory->create(c_inner_loop,ntypes,ntypes,ntypes,"fc.c_inner_loop"); + _memory->create(c_cutoff_inner,ntypes,ntypes,ntypes_pad,"fc.c_cutoff_inner"); + _memory->create(c_inner,ntypes,ntypes,ntypes,"fc.c_inner"); + _memory->create(c_outer,ntypes,ntypes,"fc.c_outer"); #ifdef _LMP_INTEL_OFFLOAD c_first_loop_t * oc_first_loop = c_first_loop[0]; c_second_loop_t * oc_second_loop = c_second_loop[0]; @@ -614,7 +615,6 @@ void PairTersoffIntel::ForceConst::set_ntypes(const int ntypes, } } _ntypes=ntypes; - _memory=memory; } #ifdef _LMP_INTEL_OFFLOAD From 04c7e7543e12c54a0da8c713e861473cf16d9f31 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 21:34:30 -0400 Subject: [PATCH 230/352] use friend statement instead of (incorrect) cast to give access to protected class member --- src/pair.h | 1 + src/pair_hybrid.cpp | 2 +- src/pair_hybrid_scaled.cpp | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pair.h b/src/pair.h index c4a5d3678c..0c082fa1c5 100644 --- a/src/pair.h +++ b/src/pair.h @@ -30,6 +30,7 @@ class Pair : protected Pointers { friend class FixOMP; friend class FixQEq; friend class PairHybrid; + friend class PairHybridScaled; friend class ThrOMP; friend class Info; diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 8f97451347..550f5c6873 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -569,7 +569,7 @@ void PairHybrid::init_style() // same style must not be used multiple times for (istyle = 0; istyle < nstyles; istyle++) { - bool is_gpu = (((PairHybrid *)styles[istyle])->suffix_flag & Suffix::GPU); + bool is_gpu = styles[istyle]->suffix_flag & Suffix::GPU; if (multiple[istyle] && is_gpu) error->all(FLERR,"GPU package styles must not be used multiple times"); } diff --git a/src/pair_hybrid_scaled.cpp b/src/pair_hybrid_scaled.cpp index 90d1747075..367afe7809 100644 --- a/src/pair_hybrid_scaled.cpp +++ b/src/pair_hybrid_scaled.cpp @@ -340,8 +340,7 @@ void PairHybridScaled::settings(int narg, char **arg) special_lj[nstyles] = special_coul[nstyles] = nullptr; compute_tally[nstyles] = 1; - if ((((PairHybridScaled *)styles[nstyles])->suffix_flag - & (Suffix::INTEL|Suffix::GPU|Suffix::OMP)) != 0) + if ((styles[nstyles]->suffix_flag & (Suffix::INTEL|Suffix::GPU|Suffix::OMP)) != 0) error->all(FLERR,"Pair style hybrid/scaled does not support " "accelerator styles"); From c1c31c6b04490718d42c4ef2ba3c21fd23660440 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 21:35:25 -0400 Subject: [PATCH 231/352] may not call memmove() on a null pointer, even if 'n' is 0. --- src/variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variable.cpp b/src/variable.cpp index 953d0ddf85..2ef1957a09 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -5122,7 +5122,7 @@ int VarReader::read_scalar(char *str) if (n == 1) continue; // skip if blank line break; } - memmove(str,ptr,n); // move trimmed string back + if (n > 0) memmove(str,ptr,n); // move trimmed string back } MPI_Bcast(&n,1,MPI_INT,0,world); if (n == 0) return 1; From 0938bc89997e8940a43fd75517a59591aefa5bd0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 2 Aug 2021 21:53:31 -0400 Subject: [PATCH 232/352] update docs for hybrid style updates --- doc/src/dihedral_hybrid.rst | 2 +- doc/src/improper_hybrid.rst | 39 ++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/doc/src/dihedral_hybrid.rst b/doc/src/dihedral_hybrid.rst index add0d4d282..998a752275 100644 --- a/doc/src/dihedral_hybrid.rst +++ b/doc/src/dihedral_hybrid.rst @@ -57,7 +57,7 @@ If *class2* is one of the dihedral hybrid styles, the same rule holds for specifying additional AngleTorsion (and EndBondTorsion, etc) coefficients either via the input script or in the data file. I.e. *class2* must be added to each line after the dihedral type. For -lines in the AngleTorsion (or EndBondTorsion, etc) section of the data +lines in the AngleTorsion (or EndBondTorsion, etc) Coeffs section of the data file for dihedral types that are not *class2*, you must use an dihedral style of *skip* as a placeholder, e.g. diff --git a/doc/src/improper_hybrid.rst b/doc/src/improper_hybrid.rst index cc26e14ce5..7c070d2e9c 100644 --- a/doc/src/improper_hybrid.rst +++ b/doc/src/improper_hybrid.rst @@ -40,13 +40,38 @@ potential with coefficients 120.0, 30 for :math:`K`, :math:`\chi_0`. Improper type 2 would be computed with a *cvff* potential with coefficients 20.0, -1, 2 for K, d, and n, respectively. -If the improper *class2* potential is one of the hybrid styles, it -requires additional AngleAngle coefficients be specified in the data -file. These lines must also have an additional "class2" argument -added after the improper type. For improper types which are assigned -to other hybrid styles, use the style name (e.g. "harmonic") -appropriate to that style. The AngleAngle coeffs for that improper -type will then be ignored. +If improper coefficients are specified in the data file read via the +:doc:`read_data ` command, then the same rule applies. +E.g. "harmonic" or "cvff", must be added after the improper type, for +each line in the "Improper Coeffs" section, e.g. + +.. parsed-literal:: + + Improper Coeffs + + 1 harmonic 120.0 30 + 2 cvff 20.0 -1 2 + ... + +If *class2* is one of the improper hybrid styles, the same rule holds +for specifying additional AngleAngle coefficients either via the input +script or in the data file. I.e. *class2* must be added to each line +after the improper type. For +lines in the AngleAngle Coeffs section of the data +file for dihedral types that are not *class2*, you must use an +improper style of *skip* as a placeholder, e.g. + +.. parsed-literal:: + + AngleAngle Coeffs + + 1 skip + 2 class2 0.0 0.0 0.0 115.06 130.01 115.06 + ... + +Note that it is not necessary to use the improper style *skip* in the +input script, since AngleAngle coefficients +need not be specified at all for improper types that are not *class2*. An improper style of *none* can be specified as the second argument to the improper_coeff command, if you desire to turn off certain improper From 2a9be4275850a8ed653e6b5ae055c6a5db81534b Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Tue, 3 Aug 2021 18:03:09 -0400 Subject: [PATCH 233/352] Update Colvars to version 2021-08-03 --- lib/colvars/Makefile.common | 1 + lib/colvars/Makefile.deps | 19 +- lib/colvars/colvar.cpp | 147 +++++-- lib/colvars/colvar.h | 13 +- lib/colvars/colvar_arithmeticpath.h | 12 + lib/colvars/colvaratoms.cpp | 83 ++-- lib/colvars/colvaratoms.h | 34 +- lib/colvars/colvarbias_abf.cpp | 13 +- lib/colvars/colvarbias_abf.h | 2 + lib/colvars/colvarbias_histogram.cpp | 4 +- lib/colvars/colvarbias_histogram.h | 1 - lib/colvars/colvarbias_meta.cpp | 199 +++++---- lib/colvars/colvarbias_meta.h | 6 +- lib/colvars/colvarcomp.cpp | 12 +- lib/colvars/colvarcomp.h | 106 ++++- lib/colvars/colvarcomp_alchlambda.cpp | 56 +++ lib/colvars/colvarcomp_apath.cpp | 42 +- lib/colvars/colvarcomp_distances.cpp | 35 +- lib/colvars/colvarcomp_gpath.cpp | 8 +- lib/colvars/colvarcomp_rotations.cpp | 332 +++++++++++++++ lib/colvars/colvarcomp_volmaps.cpp | 93 ++++- lib/colvars/colvardeps.cpp | 34 +- lib/colvars/colvardeps.h | 5 + lib/colvars/colvargrid.cpp | 101 ++++- lib/colvars/colvargrid.h | 29 +- lib/colvars/colvarmodule.cpp | 111 +++-- lib/colvars/colvarmodule.h | 33 +- lib/colvars/colvarmodule_utils.h | 80 ++++ lib/colvars/colvarparse.cpp | 24 ++ lib/colvars/colvarparse.h | 10 +- lib/colvars/colvarproxy.cpp | 173 +++++++- lib/colvars/colvarproxy.h | 164 +++++++- lib/colvars/colvarproxy_tcl.cpp | 2 + lib/colvars/colvarproxy_tcl.h | 8 +- lib/colvars/colvarproxy_volmaps.cpp | 73 +++- lib/colvars/colvarproxy_volmaps.h | 58 ++- lib/colvars/colvars_version.h | 2 +- lib/colvars/colvarscript.cpp | 447 +++++++++++++++++++-- lib/colvars/colvarscript.h | 135 +++++-- lib/colvars/colvarscript_commands.cpp | 48 +++ lib/colvars/colvarscript_commands.h | 169 +++++++- lib/colvars/colvarscript_commands_bias.h | 40 +- lib/colvars/colvarscript_commands_colvar.h | 89 ++-- lib/colvars/colvartypes.cpp | 3 + lib/colvars/colvarvalue.cpp | 14 +- lib/colvars/colvarvalue.h | 6 +- src/COLVARS/colvarproxy_lammps_version.h | 2 +- src/COLVARS/fix_colvars.cpp | 6 +- 48 files changed, 2557 insertions(+), 527 deletions(-) create mode 100644 lib/colvars/colvarcomp_alchlambda.cpp create mode 100644 lib/colvars/colvarmodule_utils.h diff --git a/lib/colvars/Makefile.common b/lib/colvars/Makefile.common index ce501dc5f3..5743507507 100644 --- a/lib/colvars/Makefile.common +++ b/lib/colvars/Makefile.common @@ -30,6 +30,7 @@ COLVARS_SRCS = \ colvarbias_histogram.cpp \ colvarbias_meta.cpp \ colvarbias_restraint.cpp \ + colvarcomp_alchlambda.cpp \ colvarcomp_angles.cpp \ colvarcomp_apath.cpp \ colvarcomp_coordnums.cpp \ diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index 78e8768edd..cdf948a471 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -86,6 +86,20 @@ $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h +$(COLVARS_OBJ_DIR)colvarcomp_alchlambda.o: colvarcomp_alchlambda.cpp \ + colvarmodule.h colvars_version.h colvar.h colvarvalue.h colvartypes.h \ + colvarparse.h colvarparams.h colvardeps.h lepton/include/Lepton.h \ + lepton/include/lepton/CompiledExpression.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/windowsIncludes.h \ + lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/ExpressionProgram.h \ + lepton/include/lepton/ExpressionTreeNode.h \ + lepton/include/lepton/Operation.h lepton/include/lepton/CustomFunction.h \ + lepton/include/lepton/Exception.h \ + lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ + colvarcomp.h colvaratoms.h colvarproxy.h colvarproxy_tcl.h \ + colvarproxy_volmaps.h colvar_arithmeticpath.h colvar_geometricpath.h $(COLVARS_OBJ_DIR)colvarcomp_angles.o: colvarcomp_angles.cpp \ colvarmodule.h colvars_version.h colvar.h colvarvalue.h colvartypes.h \ colvarparse.h colvarparams.h colvardeps.h lepton/include/Lepton.h \ @@ -285,7 +299,7 @@ $(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ lepton/include/lepton/Exception.h \ lepton/include/lepton/ParsedExpression.h lepton/include/lepton/Parser.h \ colvarscript_commands.h colvarscript_commands_colvar.h \ - colvarscript_commands_bias.h colvaratoms.h + colvarscript_commands_bias.h colvaratoms.h colvarmodule_utils.h $(COLVARS_OBJ_DIR)colvarproxy_replicas.o: colvarproxy_replicas.cpp \ colvarmodule.h colvars_version.h colvarproxy.h colvartypes.h \ colvarvalue.h colvarproxy_tcl.h colvarproxy_volmaps.h @@ -294,7 +308,8 @@ $(COLVARS_OBJ_DIR)colvarproxy_tcl.o: colvarproxy_tcl.cpp colvarmodule.h \ colvarproxy_tcl.h colvarproxy_volmaps.h colvaratoms.h colvarparse.h \ colvarparams.h colvardeps.h $(COLVARS_OBJ_DIR)colvarproxy_volmaps.o: colvarproxy_volmaps.cpp \ - colvarmodule.h colvars_version.h colvarproxy_volmaps.h + colvarmodule.h colvars_version.h colvarproxy_volmaps.h \ + colvarmodule_utils.h $(COLVARS_OBJ_DIR)colvarscript.o: colvarscript.cpp colvarproxy.h \ colvarmodule.h colvars_version.h colvartypes.h colvarvalue.h \ colvarproxy_tcl.h colvarproxy_volmaps.h colvardeps.h colvarparse.h \ diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index ed6fec1ac5..54e11aaa75 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -96,7 +96,7 @@ int colvar::init(std::string const &conf) "", colvarparse::parse_silent)) { enable(f_cv_scripted); - cvm::log("This colvar uses scripted function \"" + scripted_function + "\"."); + cvm::log("This colvar uses scripted function \"" + scripted_function + "\".\n"); std::string type_str; get_keyval(conf, "scriptedFunctionType", type_str, "scalar"); @@ -134,7 +134,7 @@ int colvar::init(std::string const &conf) std::sort(cvcs.begin(), cvcs.end(), compare); if(cvcs.size() > 1) { - cvm::log("Sorted list of components for this scripted colvar:"); + cvm::log("Sorted list of components for this scripted colvar:\n"); for (i = 0; i < cvcs.size(); i++) { cvm::log(cvm::to_str(i+1) + " " + cvcs[i]->name); } @@ -298,6 +298,11 @@ int colvar::init(std::string const &conf) error_code |= init_extended_Lagrangian(conf); error_code |= init_output_flags(conf); + // Detect if we have one component that is an alchemical lambda + if (is_enabled(f_cv_single_cvc) && cvcs[0]->function_type == "alch_lambda") { + enable(f_cv_external); + } + // Now that the children are defined we can solve dependencies enable(f_cv_active); @@ -636,7 +641,6 @@ int colvar::init_extended_Lagrangian(std::string const &conf) x_ext.type(colvarvalue::type_notset); v_ext.type(value()); fr.type(value()); - const bool found = get_keyval(conf, "extendedTemp", temp, cvm::temperature()); if (temp <= 0.0) { if (found) @@ -654,7 +658,7 @@ int colvar::init_extended_Lagrangian(std::string const &conf) return INPUT_ERROR; } ext_force_k = cvm::boltzmann() * temp / (tolerance * tolerance); - cvm::log("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " [E]/U^2"); + cvm::log("Computed extended system force constant: " + cvm::to_str(ext_force_k) + " [E]/U^2\n"); get_keyval(conf, "extendedTimeConstant", extended_period, 200.0); if (extended_period <= 0.0) { @@ -662,7 +666,7 @@ int colvar::init_extended_Lagrangian(std::string const &conf) } ext_mass = (cvm::boltzmann() * temp * extended_period * extended_period) / (4.0 * PI * PI * tolerance * tolerance); - cvm::log("Computed fictitious mass: " + cvm::to_str(ext_mass) + " [E]/(U/fs)^2 (U: colvar unit)"); + cvm::log("Computed fictitious mass: " + cvm::to_str(ext_mass) + " [E]/(U/fs)^2 (U: colvar unit)\n"); { bool b_output_energy; @@ -770,7 +774,9 @@ template int colvar::init_components_type(std::string c if ( (cvcp->function_type != std::string("distance_z")) && (cvcp->function_type != std::string("dihedral")) && (cvcp->function_type != std::string("polar_phi")) && - (cvcp->function_type != std::string("spin_angle")) ) { + (cvcp->function_type != std::string("spin_angle")) && + (cvcp->function_type != std::string("euler_phi")) && + (cvcp->function_type != std::string("euler_psi"))) { cvm::error("Error: invalid use of period and/or " "wrapAround in a \""+ std::string(def_config_key)+ @@ -860,6 +866,7 @@ int colvar::init_components(std::string const &conf) "inertia", "inertia"); error_code |= init_components_type(conf, "moment of inertia around an axis", "inertiaZ"); error_code |= init_components_type(conf, "eigenvector", "eigenvector"); + error_code |= init_components_type(conf, "alchemical coupling parameter", "alchLambda"); error_code |= init_components_type(conf, "geometrical path collective variables (s)", "gspath"); error_code |= init_components_type(conf, "geometrical path collective variables (z)", "gzpath"); error_code |= init_components_type(conf, "linear combination of other collective variables", "linearCombination"); @@ -867,6 +874,9 @@ int colvar::init_components(std::string const &conf) error_code |= init_components_type(conf, "geometrical path collective variables (z) for other CVs", "gzpathCV"); error_code |= init_components_type(conf, "arithmetic path collective variables (s) for other CVs", "aspathCV"); error_code |= init_components_type(conf, "arithmetic path collective variables (s) for other CVs", "azpathCV"); + error_code |= init_components_type(conf, "euler phi angle of the optimal orientation", "eulerPhi"); + error_code |= init_components_type(conf, "euler psi angle of the optimal orientation", "eulerPsi"); + error_code |= init_components_type(conf, "euler theta angle of the optimal orientation", "eulerTheta"); error_code |= init_components_type(conf, "total value of atomic map", "mapTotal"); @@ -1074,6 +1084,7 @@ int colvar::init_dependencies() { init_feature(f_cv_hide_Jacobian, "hide_Jacobian_force", f_type_user); require_feature_self(f_cv_hide_Jacobian, f_cv_Jacobian); // can only hide if calculated + exclude_feature_self(f_cv_hide_Jacobian, f_cv_extended_Lagrangian); init_feature(f_cv_extended_Lagrangian, "extended_Lagrangian", f_type_user); require_feature_self(f_cv_extended_Lagrangian, f_cv_scalar); @@ -1082,6 +1093,9 @@ int colvar::init_dependencies() { init_feature(f_cv_Langevin, "Langevin_dynamics", f_type_user); require_feature_self(f_cv_Langevin, f_cv_extended_Lagrangian); + init_feature(f_cv_external, "external", f_type_user); + require_feature_self(f_cv_external, f_cv_single_cvc); + init_feature(f_cv_single_cvc, "single_component", f_type_static); init_feature(f_cv_linear, "linear", f_type_static); @@ -1195,6 +1209,21 @@ std::vector > colvar::get_atom_lists() } +std::vector const &colvar::get_volmap_ids() +{ + volmap_ids_.resize(cvcs.size()); + for (size_t i = 0; i < cvcs.size(); i++) { + if (cvcs[i]->param_exists("mapID") == COLVARS_OK) { + volmap_ids_[i] = + *(reinterpret_cast(cvcs[i]->get_param_ptr("mapID"))); + } else { + volmap_ids_[i] = -1; + } + } + return volmap_ids_; +} + + colvar::~colvar() { // There is no need to call free_children_deps() here @@ -1552,9 +1581,11 @@ int colvar::collect_cvc_total_forces() } } - if (!is_enabled(f_cv_hide_Jacobian)) { + if (!(is_enabled(f_cv_hide_Jacobian) && is_enabled(f_cv_subtract_applied_force))) { // add the Jacobian force to the total force, and don't apply any silent // correction internally: biases such as colvarbias_abf will handle it + // If f_cv_hide_Jacobian is enabled, a force of -fj is present in ft due to the + // Jacobian-compensating force ft += fj; } } @@ -1687,14 +1718,16 @@ cvm::real colvar::update_forces_energy() // add the biases' force, which at this point should already have // been summed over each bias using this colvar + // fb is already multiplied by the relevant time step factor for each bias f += fb; if (is_enabled(f_cv_Jacobian)) { // the instantaneous Jacobian force was not included in the reported total force; // instead, it is subtracted from the applied force (silent Jacobian correction) // This requires the Jacobian term for the *current* timestep + // Need to scale it for impulse MTS if (is_enabled(f_cv_hide_Jacobian)) - f -= fj; + f -= fj * cvm::real(time_step_factor); } // At this point f is the force f from external biases that will be applied to the @@ -1727,26 +1760,44 @@ cvm::real colvar::update_forces_energy() colvarvalue f_ext(fr.type()); // force acting on the extended variable f_ext.reset(); - // the total force is applied to the fictitious mass, while the - // atoms only feel the harmonic force + wall force - // fr: bias force on extended variable (without harmonic spring), for output in trajectory - // f_ext: total force on extended variable (including harmonic spring) - // f: - initially, external biasing force - // - after this code block, colvar force to be applied to atomic coordinates - // ie. spring force (fb_actual will be added just below) + if (is_enabled(f_cv_external)) { + // There are no forces on the "actual colvar" bc there is no gradient wrt atomic coordinates + // So we apply this to the extended DOF + f += fb_actual; + } + fr = f; // External force has been scaled for a 1-timestep impulse, scale it back because we will // integrate it with the colvar's own timestep factor f_ext = f / cvm::real(time_step_factor); - f_ext += (-0.5 * ext_force_k) * this->dist2_lgrad(x_ext, x); - f = (-0.5 * ext_force_k) * this->dist2_rgrad(x_ext, x); - // Coupling force is a slow force, to be applied to atomic coords impulse-style - f *= cvm::real(time_step_factor); + + colvarvalue f_system(fr.type()); // force exterted by the system on the extended DOF + + if (is_enabled(f_cv_external)) { + // Add "alchemical" force from external variable + f_system = cvcs[0]->total_force(); + // f is now irrelevant because we are not applying atomic forces in the simulation + // just driving the external variable lambda + } else { + // the total force is applied to the fictitious mass, while the + // atoms only feel the harmonic force + wall force + // fr: bias force on extended variable (without harmonic spring), for output in trajectory + // f_ext: total force on extended variable (including harmonic spring) + // f: - initially, external biasing force + // - after this code block, colvar force to be applied to atomic coordinates + // ie. spring force (fb_actual will be added just below) + f_system = (-0.5 * ext_force_k) * this->dist2_lgrad(x_ext, x); + f = -1.0 * f_system; + // Coupling force is a slow force, to be applied to atomic coords impulse-style + // over a single MD timestep + f *= cvm::real(time_step_factor); + } + f_ext += f_system; if (is_enabled(f_cv_subtract_applied_force)) { // Report a "system" force without the biases on this colvar - // that is, just the spring force - ft_reported = (-0.5 * ext_force_k) * this->dist2_lgrad(x_ext, x); + // that is, just the spring force (or alchemical force) + ft_reported = f_system; } else { // The total force acting on the extended variable is f_ext // This will be used in the next timestep @@ -1778,10 +1829,19 @@ cvm::real colvar::update_forces_energy() (is_enabled(f_cv_reflecting_upper_boundary) && (delta = x_ext - upper_boundary) > 0)) { x_ext -= 2.0 * delta; v_ext *= -1.0; + if ((is_enabled(f_cv_reflecting_lower_boundary) && (delta = x_ext - lower_boundary) < 0) || + (is_enabled(f_cv_reflecting_upper_boundary) && (delta = x_ext - upper_boundary) > 0)) { + cvm::error("Error: extended coordinate value " + cvm::to_str(x_ext) + " is still outside boundaries after reflection.\n"); + } } x_ext.apply_constraints(); this->wrap(x_ext); + if (is_enabled(f_cv_external)) { + // Colvar value is constrained to the extended value + x = x_ext; + cvcs[0]->set_value(x_ext); + } } else { // If this is a postprocessing run (eg. in VMD), the extended DOF // is equal to the actual coordinate @@ -1789,9 +1849,11 @@ cvm::real colvar::update_forces_energy() } } - // Now adding the force on the actual colvar (for those biases that - // bypass the extended Lagrangian mass) - f += fb_actual; + if (!is_enabled(f_cv_external)) { + // Now adding the force on the actual colvar (for those biases that + // bypass the extended Lagrangian mass) + f += fb_actual; + } if (cvm::debug()) cvm::log("Done updating colvar \""+this->name+"\".\n"); @@ -1954,7 +2016,7 @@ int colvar::update_cvc_flags() int colvar::update_cvc_config(std::vector const &confs) { - cvm::log("Updating configuration for colvar \""+name+"\""); + cvm::log("Updating configuration for colvar \""+name+"\"\n"); if (confs.size() != cvcs.size()) { return cvm::error("Error: Wrong number of CVC config strings. " @@ -2076,6 +2138,15 @@ bool colvar::periodic_boundaries() const cvm::real colvar::dist2(colvarvalue const &x1, colvarvalue const &x2) const { + if ( is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function) ) { + if (is_enabled(f_cv_periodic) && is_enabled(f_cv_scalar)) { + cvm::real diff = x1.real_value - x2.real_value; + const cvm::real period_lower_boundary = wrap_center - period / 2.0; + const cvm::real period_upper_boundary = wrap_center + period / 2.0; + diff = (diff < period_lower_boundary ? diff + period : ( diff > period_upper_boundary ? diff - period : diff)); + return diff * diff; + } + } if (is_enabled(f_cv_homogeneous)) { return (cvcs[0])->dist2(x1, x2); } else { @@ -2086,6 +2157,15 @@ cvm::real colvar::dist2(colvarvalue const &x1, colvarvalue colvar::dist2_lgrad(colvarvalue const &x1, colvarvalue const &x2) const { + if ( is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function) ) { + if (is_enabled(f_cv_periodic) && is_enabled(f_cv_scalar)) { + cvm::real diff = x1.real_value - x2.real_value; + const cvm::real period_lower_boundary = wrap_center - period / 2.0; + const cvm::real period_upper_boundary = wrap_center + period / 2.0; + diff = (diff < period_lower_boundary ? diff + period : ( diff > period_upper_boundary ? diff - period : diff)); + return 2.0 * diff; + } + } if (is_enabled(f_cv_homogeneous)) { return (cvcs[0])->dist2_lgrad(x1, x2); } else { @@ -2096,6 +2176,15 @@ colvarvalue colvar::dist2_lgrad(colvarvalue const &x1, colvarvalue colvar::dist2_rgrad(colvarvalue const &x1, colvarvalue const &x2) const { + if ( is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function) ) { + if (is_enabled(f_cv_periodic) && is_enabled(f_cv_scalar)) { + cvm::real diff = x1.real_value - x2.real_value; + const cvm::real period_lower_boundary = wrap_center - period / 2.0; + const cvm::real period_upper_boundary = wrap_center + period / 2.0; + diff = (diff < period_lower_boundary ? diff + period : ( diff > period_upper_boundary ? diff - period : diff)); + return (-2.0) * diff; + } + } if (is_enabled(f_cv_homogeneous)) { return (cvcs[0])->dist2_rgrad(x1, x2); } else { @@ -2302,7 +2391,7 @@ std::ostream & colvar::write_traj_label(std::ostream & os) os << " " << cvm::wrap_string(this->name, this_cv_width); - if (is_enabled(f_cv_extended_Lagrangian)) { + if (is_enabled(f_cv_extended_Lagrangian) && !is_enabled(f_cv_external)) { // extended DOF os << " r_" << cvm::wrap_string(this->name, this_cv_width-2); @@ -2314,7 +2403,7 @@ std::ostream & colvar::write_traj_label(std::ostream & os) os << " v_" << cvm::wrap_string(this->name, this_cv_width-2); - if (is_enabled(f_cv_extended_Lagrangian)) { + if (is_enabled(f_cv_extended_Lagrangian) && !is_enabled(f_cv_external)) { // extended DOF os << " vr_" << cvm::wrap_string(this->name, this_cv_width-3); @@ -2347,7 +2436,7 @@ std::ostream & colvar::write_traj(std::ostream &os) os << " "; if (is_enabled(f_cv_output_value)) { - if (is_enabled(f_cv_extended_Lagrangian)) { + if (is_enabled(f_cv_extended_Lagrangian) && !is_enabled(f_cv_external)) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << x; @@ -2360,7 +2449,7 @@ std::ostream & colvar::write_traj(std::ostream &os) if (is_enabled(f_cv_output_velocity)) { - if (is_enabled(f_cv_extended_Lagrangian)) { + if (is_enabled(f_cv_extended_Lagrangian) && !is_enabled(f_cv_external)) { os << " " << std::setprecision(cvm::cv_prec) << std::setw(cvm::cv_width) << v_fdiff; diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 5cf0077a39..2856170727 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -192,7 +192,7 @@ protected: /// Amplitude of Gaussian white noise for Langevin extended dynamics cvm::real ext_sigma; - /// \brief Harmonic restraint force + /// \brief Applied force on extended DOF, for output (unscaled if using MTS) colvarvalue fr; /// \brief Jacobian force, when Jacobian_force is enabled @@ -591,6 +591,7 @@ public: class alpha_dihedrals; class alpha_angles; class dihedPC; + class alch_lambda; class componentDisabled; class CartesianBasedPath; class gspath; @@ -601,6 +602,9 @@ public: class gzpathCV; class aspathCV; class azpathCV; + class euler_phi; + class euler_psi; + class euler_theta; // non-scalar components class distance_vec; @@ -658,6 +662,9 @@ protected: static std::map> global_cvc_map; #endif + /// Volmap numeric IDs, one for each CVC (-1 if not available) + std::vector volmap_ids_; + public: /// \brief Sorted array of (zero-based) IDs for all atoms involved @@ -670,6 +677,10 @@ public: /// \brief Get vector of vectors of atom IDs for all atom groups virtual std::vector > get_atom_lists(); + + /// Volmap numeric IDs, one for each CVC (-1 if not available) + std::vector const &get_volmap_ids(); + }; diff --git a/lib/colvars/colvar_arithmeticpath.h b/lib/colvars/colvar_arithmeticpath.h index 552edf23e3..cf613af389 100644 --- a/lib/colvars/colvar_arithmeticpath.h +++ b/lib/colvars/colvar_arithmeticpath.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace ArithmeticPathCV { @@ -24,6 +25,7 @@ public: virtual void computeValue(); virtual void computeDerivatives(); virtual void compute(); + virtual void reComputeLambda(const vector& rmsd_between_refs); protected: scalar_type lambda; vector weights; @@ -124,6 +126,16 @@ void ArithmeticPathBase::computeDerivative } } +template +void ArithmeticPathBase::reComputeLambda(const vector& rmsd_between_refs) { + scalar_type mean_square_displacements = 0.0; + for (size_t i_frame = 1; i_frame < total_frames; ++i_frame) { + cvm::log(std::string("Distance between frame ") + cvm::to_str(i_frame) + " and " + cvm::to_str(i_frame + 1) + " is " + cvm::to_str(rmsd_between_refs[i_frame - 1]) + std::string("\n")); + mean_square_displacements += rmsd_between_refs[i_frame - 1] * rmsd_between_refs[i_frame - 1]; + } + mean_square_displacements /= scalar_type(total_frames - 1); + lambda = 1.0 / mean_square_displacements; +} } #endif // ARITHMETICPATHCV_H diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index 1a4280a202..9bbd91cf05 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -37,6 +37,7 @@ cvm::atom::atom(int atom_number) } id = p->get_atom_id(index); update_mass(); + update_charge(); reset_data(); } @@ -53,6 +54,7 @@ cvm::atom::atom(cvm::residue_id const &residue, } id = p->get_atom_id(index); update_mass(); + update_charge(); reset_data(); } @@ -62,6 +64,7 @@ cvm::atom::atom(atom const &a) { id = (cvm::proxy)->get_atom_id(index); update_mass(); + update_charge(); reset_data(); } @@ -214,8 +217,6 @@ int cvm::atom_group::init() index = -1; b_dummy = false; - b_center = false; - b_rotate = false; b_user_defined_fit = false; fitting_group = NULL; @@ -240,8 +241,9 @@ int cvm::atom_group::init_dependencies() { } init_feature(f_ag_active, "active", f_type_dynamic); - init_feature(f_ag_center, "translational_fit", f_type_static); - init_feature(f_ag_rotate, "rotational_fit", f_type_static); + init_feature(f_ag_center, "center_to_reference", f_type_user); + init_feature(f_ag_center_origin, "center_to_origin", f_type_user); + init_feature(f_ag_rotate, "rotate_to_origin", f_type_user); init_feature(f_ag_fitting_group, "fitting_group", f_type_static); init_feature(f_ag_explicit_gradient, "explicit_atom_gradient", f_type_dynamic); init_feature(f_ag_fit_gradients, "fit_gradients", f_type_user); @@ -272,6 +274,10 @@ int cvm::atom_group::init_dependencies() { // Features that are implemented (or not) by all atom groups feature_states[f_ag_active].available = true; + feature_states[f_ag_center].available = true; + feature_states[f_ag_center_origin].available = true; + feature_states[f_ag_rotate].available = true; + // f_ag_scalable_com is provided by the CVC iff it is COM-based feature_states[f_ag_scalable_com].available = false; // TODO make f_ag_scalable depend on f_ag_scalable_com (or something else) @@ -317,6 +323,9 @@ void cvm::atom_group::update_total_mass() total_mass += ai->mass; } } + if (total_mass < 1e-15) { + cvm::error("ERROR: " + description + " has zero total mass.\n"); + } } @@ -381,12 +390,22 @@ int cvm::atom_group::parse(std::string const &group_conf) // We need to know about fitting to decide whether the group is scalable // and we need to know about scalability before adding atoms - bool b_defined_center = get_keyval(group_conf, "centerReference", b_center, false); - bool b_defined_rotate = get_keyval(group_conf, "rotateReference", b_rotate, false); + bool b_defined_center = get_keyval_feature(this, group_conf, "centerToOrigin", f_ag_center_origin, false); + // Legacy alias + b_defined_center |= get_keyval_feature(this, group_conf, "centerReference", f_ag_center, is_enabled(f_ag_center_origin), parse_deprecated); + b_defined_center |= get_keyval_feature(this, group_conf, "centerToReference", f_ag_center, is_enabled(f_ag_center)); + + if (is_enabled(f_ag_center_origin) && ! is_enabled(f_ag_center)) { + return cvm::error("centerToReference may not be disabled if centerToOrigin is enabled.\n"); + } + // Legacy alias + bool b_defined_rotate = get_keyval_feature(this, group_conf, "rotateReference", f_ag_rotate, false, parse_deprecated); + b_defined_rotate |= get_keyval_feature(this, group_conf, "rotateToReference", f_ag_rotate, is_enabled(f_ag_rotate)); + // is the user setting explicit options? b_user_defined_fit = b_defined_center || b_defined_rotate; - if (is_available(f_ag_scalable_com) && !b_rotate && !b_center) { + if (is_available(f_ag_scalable_com) && !is_enabled(f_ag_rotate) && !is_enabled(f_ag_center)) { enable(f_ag_scalable_com); enable(f_ag_scalable); } @@ -507,12 +526,8 @@ int cvm::atom_group::parse(std::string const &group_conf) // whether these atoms will ever receive forces or not bool enable_forces = true; - // disableForces is deprecated - if (get_keyval(group_conf, "enableForces", enable_forces, true)) { - noforce = !enable_forces; - } else { - get_keyval(group_conf, "disableForces", noforce, false, colvarparse::parse_silent); - } + get_keyval(group_conf, "enableForces", enable_forces, true, colvarparse::parse_silent); + noforce = !enable_forces; } // Now that atoms are defined we can parse the detailed fitting options @@ -760,10 +775,10 @@ std::string const cvm::atom_group::print_atom_ids() const int cvm::atom_group::parse_fitting_options(std::string const &group_conf) { - if (b_center || b_rotate) { + if (is_enabled(f_ag_center) || is_enabled(f_ag_rotate)) { if (b_dummy) - cvm::error("Error: centerReference or rotateReference " + cvm::error("Error: centerToReference or rotateToReference " "cannot be defined for a dummy atom.\n"); bool b_ref_pos_group = false; @@ -827,7 +842,7 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) if (ref_pos.size()) { - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { if (ref_pos.size() != group_for_fit->size()) cvm::error("Error: the number of reference positions provided("+ cvm::to_str(ref_pos.size())+ @@ -846,7 +861,7 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) return COLVARS_ERROR; } - if (b_rotate && !noforce) { + if (is_enabled(f_ag_rotate) && !noforce) { cvm::log("Warning: atom group \""+key+ "\" will be aligned to a fixed orientation given by the reference positions provided. " "If the internal structure of the group changes too much (i.e. its RMSD is comparable " @@ -865,7 +880,7 @@ int cvm::atom_group::parse_fitting_options(std::string const &group_conf) bool b_fit_gradients; get_keyval(group_conf, "enableFitGradients", b_fit_gradients, true); - if (b_fit_gradients && (b_center || b_rotate)) { + if (b_fit_gradients && (is_enabled(f_ag_center) || is_enabled(f_ag_rotate))) { enable(f_ag_fit_gradients); } } @@ -879,7 +894,7 @@ void cvm::atom_group::do_feature_side_effects(int id) // If enabled features are changed upstream, the features below should be refreshed switch (id) { case f_ag_fit_gradients: - if (b_center || b_rotate) { + if (is_enabled(f_ag_center) || is_enabled(f_ag_rotate)) { atom_group *group_for_fit = fitting_group ? fitting_group : this; group_for_fit->fit_gradients.assign(group_for_fit->size(), cvm::atom_pos(0.0, 0.0, 0.0)); rot.request_group1_gradients(group_for_fit->size()); @@ -971,7 +986,7 @@ int cvm::atom_group::calc_required_properties() calc_center_of_geometry(); if (!is_enabled(f_ag_scalable)) { - if (b_center || b_rotate) { + if (is_enabled(f_ag_center) || is_enabled(f_ag_rotate)) { if (fitting_group) { fitting_group->calc_center_of_geometry(); } @@ -1001,7 +1016,7 @@ void cvm::atom_group::calc_apply_roto_translation() fitting_group->cog_orig = fitting_group->center_of_geometry(); } - if (b_center) { + if (is_enabled(f_ag_center)) { // center on the origin first cvm::atom_pos const rpg_cog = fitting_group ? fitting_group->center_of_geometry() : this->center_of_geometry(); @@ -1011,9 +1026,9 @@ void cvm::atom_group::calc_apply_roto_translation() } } - if (b_rotate) { - // rotate the group (around the center of geometry if b_center is - // true, around the origin otherwise) + if (is_enabled(f_ag_rotate)) { + // rotate the group (around the center of geometry if f_ag_center is + // enabled, around the origin otherwise) rot.calc_optimal_rotation(fitting_group ? fitting_group->positions() : this->positions(), @@ -1030,7 +1045,7 @@ void cvm::atom_group::calc_apply_roto_translation() } } - if (b_center) { + if (is_enabled(f_ag_center) && !is_enabled(f_ag_center_origin)) { // align with the center of geometry of ref_pos apply_translation(ref_pos_cog); if (fitting_group) { @@ -1063,7 +1078,7 @@ void cvm::atom_group::read_velocities() { if (b_dummy) return; - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { ai->read_velocity(); @@ -1084,7 +1099,7 @@ void cvm::atom_group::read_total_forces() { if (b_dummy) return; - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { ai->read_total_force(); @@ -1172,14 +1187,14 @@ void cvm::atom_group::calc_fit_gradients() cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; - if (b_center) { + if (is_enabled(f_ag_center)) { // add the center of geometry contribution to the gradients cvm::rvector atom_grad; for (size_t i = 0; i < this->size(); i++) { atom_grad += atoms[i].grad; } - if (b_rotate) atom_grad = (rot.inverse()).rotate(atom_grad); + if (is_enabled(f_ag_rotate)) atom_grad = (rot.inverse()).rotate(atom_grad); atom_grad *= (-1.0)/(cvm::real(group_for_fit->size())); for (size_t j = 0; j < group_for_fit->size(); j++) { @@ -1187,7 +1202,7 @@ void cvm::atom_group::calc_fit_gradients() } } - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { // add the rotation matrix contribution to the gradients cvm::rotation const rot_inv = rot.inverse(); @@ -1196,7 +1211,7 @@ void cvm::atom_group::calc_fit_gradients() // compute centered, unrotated position cvm::atom_pos const pos_orig = - rot_inv.rotate((b_center ? (atoms[i].pos - ref_pos_cog) : (atoms[i].pos))); + rot_inv.rotate((is_enabled(f_ag_center) ? (atoms[i].pos - ref_pos_cog) : (atoms[i].pos))); // calculate \partial(R(q) \vec{x}_i)/\partial q) \cdot \partial\xi/\partial\vec{x}_i cvm::quaternion const dxdq = @@ -1340,7 +1355,7 @@ void cvm::atom_group::apply_colvar_force(cvm::real const &force) return; } - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { // rotate forces back to the original frame cvm::rotation const rot_inv = rot.inverse(); @@ -1355,7 +1370,7 @@ void cvm::atom_group::apply_colvar_force(cvm::real const &force) } } - if ((b_center || b_rotate) && is_enabled(f_ag_fit_gradients)) { + if ((is_enabled(f_ag_center) || is_enabled(f_ag_rotate)) && is_enabled(f_ag_fit_gradients)) { atom_group *group_for_fit = fitting_group ? fitting_group : this; @@ -1386,7 +1401,7 @@ void cvm::atom_group::apply_force(cvm::rvector const &force) return; } - if (b_rotate) { + if (is_enabled(f_ag_rotate)) { cvm::rotation const rot_inv = rot.inverse(); for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index af6a529f8a..490b008d06 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -101,18 +101,14 @@ public: inline void update_mass() { colvarproxy *p = cvm::proxy; - if (p->updated_masses()) { - mass = p->get_atom_mass(index); - } + mass = p->get_atom_mass(index); } /// Get the latest value of the charge inline void update_charge() { colvarproxy *p = cvm::proxy; - if (p->updated_charges()) { - charge = p->get_atom_charge(index); - } + charge = p->get_atom_charge(index); } /// Get the current position @@ -328,35 +324,23 @@ public: /// If yes, returns 1-based number of a common atom; else, returns 0 static int overlap(const atom_group &g1, const atom_group &g2); - /// \brief When updating atomic coordinates, translate them to align with the - /// center of mass of the reference coordinates - bool b_center; - - /// \brief When updating atom coordinates (and after - /// centering them if b_center is set), rotate the group to - /// align with the reference coordinates. - /// - /// Note: gradients will be calculated in the rotated frame: when - /// forces will be applied, they will rotated back to the original - /// frame - bool b_rotate; - /// The rotation calculated automatically if b_rotate is defined + /// The rotation calculated automatically if f_ag_rotate is defined cvm::rotation rot; - /// \brief Indicates that the user has explicitly set centerReference or + /// \brief Indicates that the user has explicitly set centerToReference or /// rotateReference, and the corresponding reference: /// cvc's (eg rmsd, eigenvector) will not override the user's choice bool b_user_defined_fit; - /// \brief use reference coordinates for b_center or b_rotate + /// \brief use reference coordinates for f_ag_center or f_ag_rotate std::vector ref_pos; /// \brief Center of geometry of the reference coordinates; regardless - /// of whether b_center is true, ref_pos is centered to zero at + /// of whether f_ag_center is true, ref_pos is centered to zero at /// initialization, and ref_pos_cog serves to center the positions cvm::atom_pos ref_pos_cog; - /// \brief If b_center or b_rotate is true, use this group to + /// \brief If f_ag_center or f_ag_rotate is true, use this group to /// define the transformation (default: this group itself) atom_group *fitting_group; @@ -395,12 +379,12 @@ public: void apply_translation(cvm::rvector const &t); /// \brief Get the current velocities; this must be called always - /// *after* read_positions(); if b_rotate is defined, the same + /// *after* read_positions(); if f_ag_rotate is defined, the same /// rotation applied to the coordinates will be used void read_velocities(); /// \brief Get the current total_forces; this must be called always - /// *after* read_positions(); if b_rotate is defined, the same + /// *after* read_positions(); if f_ag_rotate is defined, the same /// rotation applied to the coordinates will be used void read_total_forces(); diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index a84ec358dd..4893ceb46d 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -136,10 +136,11 @@ int colvarbias_abf::init(std::string const &conf) colvars[i]->enable(f_cv_hide_Jacobian); } - // If any colvar is extended-system, we need to collect the extended - // system gradient - if (colvars[i]->is_enabled(f_cv_extended_Lagrangian)) + // If any colvar is extended-system (restrained style, not external with constraint), we are running eABF + if (colvars[i]->is_enabled(f_cv_extended_Lagrangian) + && !colvars[i]->is_enabled(f_cv_external)) { b_extended = true; + } // Cannot mix and match coarse time steps with ABF because it gives // wrong total force averages - total force needs to be averaged over @@ -475,7 +476,7 @@ int colvarbias_abf::update() last_gradients->copy_grid(*gradients); last_samples->copy_grid(*samples); shared_last_step = cvm::step_absolute(); - cvm::log("Prepared sample and gradient buffers at step "+cvm::to_str(cvm::step_absolute())+"."); + cvm::log("Prepared sample and gradient buffers at step "+cvm::to_str(cvm::step_absolute())+".\n"); } // update UI estimator every step @@ -812,8 +813,10 @@ int colvarbias_abf::write_output_files() cvm::log("ABF bias trying to write gradients and samples to disk"); } - if (shared_on && cvm::main()->proxy->replica_index() > 0) { + if (shared_on && cvm::main()->proxy->replica_index() > 0 + && ! (b_CZAR_estimator || b_UI_estimator) ) { // No need to report the same data as replica 0, let it do the I/O job + // except if using an eABF FE estimator return COLVARS_OK; } diff --git a/lib/colvars/colvarbias_abf.h b/lib/colvars/colvarbias_abf.h index 15c81e9466..3a3120a058 100644 --- a/lib/colvars/colvarbias_abf.h +++ b/lib/colvars/colvarbias_abf.h @@ -121,6 +121,8 @@ private: } else { system_force[i] = colvars[i]->total_force().real_value - colvar_forces[i].real_value; + // If hideJacobian is active then total_force has an extra term of -fj + // which is the Jacobian-compensating force at the colvar level } if (cvm::debug()) cvm::log("ABF System force calc: cv " + cvm::to_str(i) + diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 3efe0b0acc..92cc112845 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -129,14 +129,14 @@ int colvarbias_histogram::update() // output_prefix is unset during the constructor if (cvm::step_relative() == 0) { out_name = cvm::output_prefix() + "." + this->name + ".dat"; - cvm::log("Histogram " + this->name + " will be written to file \"" + out_name + "\""); + cvm::log("Histogram " + this->name + " will be written to file \"" + out_name + "\"\n"); } } if (out_name_dx.size() == 0) { if (cvm::step_relative() == 0) { out_name_dx = cvm::output_prefix() + "." + this->name + ".dx"; - cvm::log("Histogram " + this->name + " will be written to file \"" + out_name_dx + "\""); + cvm::log("Histogram " + this->name + " will be written to file \"" + out_name_dx + "\"\n"); } } diff --git a/lib/colvars/colvarbias_histogram.h b/lib/colvars/colvarbias_histogram.h index 2e6c6884fb..6044fa189e 100644 --- a/lib/colvars/colvarbias_histogram.h +++ b/lib/colvars/colvarbias_histogram.h @@ -35,7 +35,6 @@ protected: colvar_grid_scalar *grid; std::vector bin; std::string out_name, out_name_dx; - size_t output_freq; /// If one or more of the variables are \link colvarvalue::type_vector \endlink, treat them as arrays of this length size_t colvar_array_size; diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index d448b1f2e4..ccbd6c406f 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -50,6 +50,7 @@ colvarbias_meta::colvarbias_meta(char const *key) dump_fes = true; keep_hills = false; + restart_keep_hills = false; dump_fes_save = false; dump_replica_fes = false; @@ -902,7 +903,7 @@ void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, count++) { size_t i; for (i = 0; i < num_variables(); i++) { - new_colvar_values[i] = hills_energy->bin_to_value_scalar(he_ix[i], i); + new_colvar_values[i] = he->bin_to_value_scalar(he_ix[i], i); } // loop over the hills and increment the energy grid locally @@ -934,40 +935,12 @@ void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, } } else { - - // TODO delete this (never used) - - // simpler version, with just the energy - - for ( ; (he->index_ok(he_ix)); ) { - - for (size_t i = 0; i < num_variables(); i++) { - new_colvar_values[i] = hills_energy->bin_to_value_scalar(he_ix[i], i); - } - - hills_energy_here = 0.0; - calc_hills(h_first, h_last, hills_energy_here, &new_colvar_values); - he->acc_value(he_ix, hills_energy_here); - - he->incr(he_ix); - - count++; - if ((count % print_frequency) == 0) { - if (print_progress) { - cvm::real const progress = cvm::real(count) / cvm::real(he->number_of_points()); - std::ostringstream os; - os.setf(std::ios::fixed, std::ios::floatfield); - os << std::setw(6) << std::setprecision(2) - << 100.0 * progress - << "% done."; - cvm::log(os.str()); - } - } - } + cvm::error("No grid object provided in metadynamics::project_hills()\n", + BUG_ERROR); } if (print_progress) { - cvm::log("100.00% done."); + cvm::log("100.00% done.\n"); } if (! keep_hills) { @@ -1281,9 +1254,25 @@ int colvarbias_meta::set_state_params(std::string const &state_conf) return error_code; } + colvarparse::get_keyval(state_conf, "keepHills", restart_keep_hills, false, + colvarparse::parse_restart); + + if ((!restart_keep_hills) && (cvm::main()->restart_version_number() < 20210604)) { + if (keep_hills) { + cvm::log("Warning: could not ensure that keepHills was enabled when " + "this state file was written; because it is enabled now, " + "it is assumed that it was also then, but please verify.\n"); + restart_keep_hills = true; + } + } else { + if (restart_keep_hills) { + cvm::log("This state file/stream contains explicit hills.\n"); + } + } + std::string check_replica = ""; if (colvarparse::get_keyval(state_conf, "replicaID", check_replica, - std::string(""), colvarparse::parse_silent) && + std::string(""), colvarparse::parse_restart) && (check_replica != this->replica_id)) { return cvm::error("Error: in the state file , the " "\"metadynamics\" block has a different replicaID ("+ @@ -1297,8 +1286,6 @@ int colvarbias_meta::set_state_params(std::string const &state_conf) std::istream & colvarbias_meta::read_state_data(std::istream& is) { - bool grids_from_restart_file = use_grids; - if (use_grids) { if (expand_grids) { @@ -1343,7 +1330,6 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) !(hills_energy->read_restart(is))) { is.clear(); is.seekg(hills_energy_pos, std::ios::beg); - grids_from_restart_file = false; if (!rebin_grids) { if (hills_energy_backup == NULL) cvm::fatal_error("Error: couldn't read the free energy grid for metadynamics bias \""+ @@ -1381,7 +1367,6 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) !(hills_energy_gradients->read_restart(is))) { is.clear(); is.seekg(hills_energy_gradients_pos, std::ios::beg); - grids_from_restart_file = false; if (!rebin_grids) { if (hills_energy_backup == NULL) cvm::fatal_error("Error: couldn't read the free energy gradients grid for metadynamics bias \""+ @@ -1419,28 +1404,29 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) } } + // Save references to the end of the list of existing hills, so that it can + // be cleared if hills are read successfully state bool const existing_hills = !hills.empty(); size_t const old_hills_size = hills.size(); hill_iter old_hills_end = hills.end(); hill_iter old_hills_off_grid_end = hills_off_grid.end(); - // read the hills explicitly written (if there are any) + // Read any hills following the grid data (if any) while (read_hill(is)) { - if (cvm::debug()) + if (cvm::debug()) { cvm::log("Read a previously saved hill under the " "metadynamics bias \""+ this->name+"\", created at step "+ cvm::to_str((hills.back()).it)+".\n"); + } } is.clear(); new_hills_begin = hills.end(); - if (grids_from_restart_file) { - if (hills.size() > old_hills_size) - cvm::log("Read "+cvm::to_str(hills.size())+ - " hills in addition to the grids.\n"); - } else { - if (!hills.empty()) - cvm::log("Read "+cvm::to_str(hills.size())+" hills.\n"); + cvm::log("Read "+cvm::to_str(hills.size() - old_hills_size)+" hills.\n"); + + if (existing_hills) { + hills.erase(hills.begin(), old_hills_end); + hills_off_grid.erase(hills_off_grid.begin(), old_hills_off_grid_end); } if (rebin_grids) { @@ -1454,7 +1440,16 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) colvar_grid_gradient *new_hills_energy_gradients = new colvar_grid_gradient(colvars); - if (!grids_from_restart_file || (keep_hills && !hills.empty())) { + if (cvm::debug()) { + std::ostringstream tmp_os; + tmp_os << "hills_energy parameters:\n"; + hills_energy->write_params(tmp_os); + tmp_os << "new_hills_energy parameters:\n"; + new_hills_energy->write_params(tmp_os); + cvm::log(tmp_os.str()); + } + + if (restart_keep_hills && !hills.empty()) { // if there are hills, recompute the new grids from them cvm::log("Rebinning the energy and forces grids from "+ cvm::to_str(hills.size())+" hills (this may take a while)...\n"); @@ -1494,11 +1489,6 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) if (cvm::debug()) cvm::log("colvarbias_meta::read_restart() done\n"); - if (existing_hills) { - hills.erase(hills.begin(), old_hills_end); - hills_off_grid.erase(hills_off_grid.begin(), old_hills_off_grid_end); - } - has_data = true; if (comm != single_replica) { @@ -1509,6 +1499,15 @@ std::istream & colvarbias_meta::read_state_data(std::istream& is) } +inline std::istream & reset_istream(std::istream &is, size_t start_pos) +{ + is.clear(); + is.seekg(start_pos, std::ios::beg); + is.setstate(std::ios::failbit); + return is; +} + + std::istream & colvarbias_meta::read_hill(std::istream &is) { if (!is) return is; // do nothing if failbit is set @@ -1518,45 +1517,72 @@ std::istream & colvarbias_meta::read_hill(std::istream &is) std::string data; if ( !(is >> read_block("hill", &data)) ) { - is.clear(); - is.seekg(start_pos, std::ios::beg); - is.setstate(std::ios::failbit); - return is; + return reset_istream(is, start_pos); } + std::istringstream data_is(data); + cvm::step_number h_it = 0L; - get_keyval(data, "step", h_it, h_it, parse_restart); - if (h_it <= state_file_step) { - if (cvm::debug()) - cvm::log("Skipping a hill older than the state file for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); - return is; - } - cvm::real h_weight; - get_keyval(data, "weight", h_weight, hill_weight, parse_restart); - std::vector h_centers(num_variables()); for (i = 0; i < num_variables(); i++) { h_centers[i].type(variables(i)->value()); } - get_keyval(data, "centers", h_centers, h_centers, parse_restart); - std::vector h_sigmas(num_variables()); - get_keyval(data, "widths", h_sigmas, h_sigmas, parse_restart); - for (i = 0; i < num_variables(); i++) { - // For backward compatibility, read the widths instead of the sigmas - h_sigmas[i] /= 2.0; - } + std::string h_replica; - std::string h_replica = ""; - if (comm != single_replica) { - get_keyval(data, "replicaID", h_replica, replica_id, parse_restart); - if (h_replica != replica_id) - cvm::fatal_error("Error: trying to read a hill created by replica \""+h_replica+ - "\" for replica \""+replica_id+ - "\"; did you swap output files?\n"); + std::string keyword; + while (data_is >> keyword) { + + if (keyword == "step") { + if ( !(data_is >> h_it)) { + return reset_istream(is, start_pos); + } + if ((h_it <= state_file_step) && !restart_keep_hills) { + if (cvm::debug()) + cvm::log("Skipping a hill older than the state file for metadynamics bias \""+ + this->name+"\""+ + ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+"\n"); + return is; + } + } + + if (keyword == "weight") { + if ( !(data_is >> h_weight)) { + return reset_istream(is, start_pos); + } + } + + if (keyword == "centers") { + for (i = 0; i < num_variables(); i++) { + if ( !(data_is >> h_centers[i])) { + return reset_istream(is, start_pos); + } + } + } + + if (keyword == "widths") { + for (i = 0; i < num_variables(); i++) { + if ( !(data_is >> h_sigmas[i])) { + return reset_istream(is, start_pos); + } + // For backward compatibility, read the widths instead of the sigmas + h_sigmas[i] /= 2.0; + } + } + + if (comm != single_replica) { + if (keyword == "replicaID") { + if ( !(data_is >> h_replica)) { + return reset_istream(is, start_pos); + } + if (h_replica != replica_id) { + cvm::error("Error: trying to read a hill created by replica \""+ + h_replica+"\" for replica \""+replica_id+ + "\"; did you swap output files?\n", INPUT_ERROR); + } + } + } } hill_iter const hills_end = hills.end(); @@ -1699,8 +1725,12 @@ std::string const colvarbias_meta::hills_traj_file_name() const std::string const colvarbias_meta::get_state_params() const { std::ostringstream os; - if (this->comm != single_replica) + if (keep_hills) { + os << "keepHills on" << "\n"; + } + if (this->comm != single_replica) { os << "replicaID " << this->replica_id << "\n"; + } return (colvarbias::get_state_params() + os.str()); } @@ -1944,6 +1974,7 @@ colvarbias_meta::hill::hill(cvm::step_number it_in, sigmas(cv_values.size()), replica(replica_in) { + hill_value = 0.0; for (size_t i = 0; i < cv_values.size(); i++) { centers[i].type(cv_values[i]); centers[i] = cv_values[i]; @@ -1967,7 +1998,9 @@ colvarbias_meta::hill::hill(colvarbias_meta::hill const &h) centers(h.centers), sigmas(h.sigmas), replica(h.replica) -{} +{ + hill_value = 0.0; +} colvarbias_meta::hill::~hill() diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index 2f34abcc77..bf1710170e 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -155,10 +155,12 @@ protected: /// \brief How often the hills should be projected onto the grids size_t grids_freq; - /// \brief Whether to keep the hills in the restart file (e.g. to do - /// meaningful accurate rebinning afterwards) + /// Keep hills in the restart file (e.g. to accurately rebin later) bool keep_hills; + /// value of keepHills saved in the most recent restart file + bool restart_keep_hills; + /// \brief Dump the free energy surface (.pmf file) every restartFrequency bool dump_fes; diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index a1542d05bf..8938e64a0e 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -51,7 +51,7 @@ int colvar::cvc::init(std::string const &conf) std::string const old_name(name); if (name.size() > 0) { - cvm::log("Updating configuration for component \""+name+"\""); + cvm::log("Updating configuration for component \""+name+"\"\n"); } if (get_keyval(conf, "name", name, name)) { @@ -112,7 +112,7 @@ int colvar::cvc::init_total_force_params(std::string const &conf) } if (get_keyval_feature(this, conf, "oneSiteTotalForce", f_cvc_one_site_total_force, is_enabled(f_cvc_one_site_total_force))) { - cvm::log("Computing total force on group 1 only"); + cvm::log("Computing total force on group 1 only\n"); } if (! is_enabled(f_cvc_one_site_total_force)) { @@ -426,7 +426,7 @@ void colvar::cvc::collect_gradients(std::vector const &atom_ids, std::vecto // If necessary, apply inverse rotation to get atomic // gradient in the laboratory frame - if (ag.b_rotate) { + if (ag.is_enabled(f_ag_rotate)) { cvm::rotation const rot_inv = ag.rot.inverse(); for (size_t k = 0; k < ag.size(); k++) { @@ -505,7 +505,7 @@ void colvar::cvc::debug_gradients() cvm::atom_pos fit_gradient_sum, gradient_sum; // print the values of the fit gradients - if (group->b_rotate || group->b_center) { + if (group->is_enabled(f_ag_center) || group->is_enabled(f_ag_rotate)) { if (group->is_enabled(f_ag_fit_gradients)) { size_t j; @@ -514,7 +514,7 @@ void colvar::cvc::debug_gradients() for (j = 0; j < group_for_fit->fit_gradients.size(); j++) { cvm::log((group->fitting_group ? std::string("refPosGroup") : group->key) + "[" + cvm::to_str(j) + "] = " + - (group->b_rotate ? + (group->is_enabled(f_ag_rotate) ? cvm::to_str(rot_0.rotate(group_for_fit->fit_gradients[j])) : cvm::to_str(group_for_fit->fit_gradients[j]))); } @@ -525,7 +525,7 @@ void colvar::cvc::debug_gradients() for (size_t ia = 0; ia < group->size(); ia++) { // tests are best conducted in the unrotated (simulation) frame - cvm::rvector const atom_grad = (group->b_rotate ? + cvm::rvector const atom_grad = (group->is_enabled(f_ag_rotate) ? rot_inv.rotate((*group)[ia].grad) : (*group)[ia].grad); gradient_sum += atom_grad; diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 57df68ab6e..2f68ac6abc 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -271,6 +271,12 @@ public: /// \brief Whether or not this CVC will be computed in parallel whenever possible bool b_try_scalable; + /// Forcibly set value of CVC - useful for driving an external coordinate, + /// eg. lambda dynamics + inline void set_value(colvarvalue const &new_value) { + x = new_value; + } + protected: /// \brief Cached value @@ -1344,6 +1350,71 @@ public: }; +class colvar::euler_phi + : public colvar::orientation +{ +public: + euler_phi(std::string const &conf); + euler_phi(); + virtual int init(std::string const &conf); + virtual ~euler_phi() {} + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to handle the 2*PI periodicity + virtual void wrap(colvarvalue &x_unwrapped) const; +}; + + +class colvar::euler_psi + : public colvar::orientation +{ +public: + euler_psi(std::string const &conf); + euler_psi(); + virtual int init(std::string const &conf); + virtual ~euler_psi() {} + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + /// Redefined to handle the 2*PI periodicity + virtual void wrap(colvarvalue &x_unwrapped) const; +}; + + +class colvar::euler_theta + : public colvar::orientation +{ +public: + euler_theta(std::string const &conf); + euler_theta(); + virtual int init(std::string const &conf); + virtual ~euler_theta() {} + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + // theta angle is a scalar variable and not periodic + // we need to override the virtual functions from orientation + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; +}; + /// \brief Colvar component: root mean square deviation (RMSD) of a /// group with respect to a set of reference coordinates; uses \link @@ -1406,6 +1477,28 @@ public: }; +// \brief Colvar component: alch_lambda +// To communicate value with back-end in lambda-dynamics +class colvar::alch_lambda + : public colvar::cvc +{ +protected: + // No atom groups needed +public: + alch_lambda(std::string const &conf); + alch_lambda(); + virtual ~alch_lambda() {} + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); + virtual cvm::real dist2(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const; + virtual colvarvalue dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const; +}; + class colvar::componentDisabled : public colvar::cvc @@ -1681,11 +1774,20 @@ public: protected: - /// Identifier of the map object (as used by the simulation engine) - std::string map_name; + /// String identifier of the map object (as used by the simulation engine) + std::string volmap_name; + + /// Numeric identifier of the map object (as used by the simulation engine) + int volmap_id; /// Index of the map objet in the proxy arrays int volmap_index; + + /// Group of atoms selected internally (optional) + cvm::atom_group *atoms; + + /// Weights assigned to each atom (default: uniform weights) + std::vector atom_weights; }; diff --git a/lib/colvars/colvarcomp_alchlambda.cpp b/lib/colvars/colvarcomp_alchlambda.cpp new file mode 100644 index 0000000000..5e10a1dab5 --- /dev/null +++ b/lib/colvars/colvarcomp_alchlambda.cpp @@ -0,0 +1,56 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + + +#include + +#include "colvarmodule.h" +#include "colvarvalue.h" +#include "colvarparse.h" +#include "colvar.h" +#include "colvarcomp.h" + + +colvar::alch_lambda::alch_lambda(std::string const &conf) + : cvc(conf) +{ + function_type = "alch_lambda"; + + disable(f_cvc_explicit_gradient); + disable(f_cvc_gradient); + + x.type(colvarvalue::type_scalar); + // Query initial value from back-end + cvm::proxy->get_alch_lambda(&x.real_value); +} + + +void colvar::alch_lambda::calc_value() +{ + // Special workflow: + // at the beginning of the timestep we get a force instead of calculating the value + + cvm::proxy->get_dE_dLambda(&ft.real_value); + ft.real_value *= -1.0; // Energy derivative to force +} + + +void colvar::alch_lambda::calc_gradients() +{ +} + + +void colvar::alch_lambda::apply_force(colvarvalue const &force) +{ + // Special workflow: + // at the end of the time step we send a new value + cvm::proxy->set_alch_lambda(&x.real_value); +} + +simple_scalar_dist_functions(alch_lambda) diff --git a/lib/colvars/colvarcomp_apath.cpp b/lib/colvars/colvarcomp_apath.cpp index 591d8d0012..a4d1df9e50 100644 --- a/lib/colvars/colvarcomp_apath.cpp +++ b/lib/colvars/colvarcomp_apath.cpp @@ -19,17 +19,8 @@ colvar::aspathCV::aspathCV(std::string const &conf): CVBasedPath(conf) { get_keyval(conf, "weights", p_weights, std::vector(cv.size(), 1.0)); x.type(colvarvalue::type_scalar); use_explicit_gradients = true; - std::vector rmsd_between_refs(total_reference_frames - 1, 0.0); - computeDistanceBetweenReferenceFrames(rmsd_between_refs); - cvm::real mean_square_displacements = 0.0; - for (size_t i_frame = 1; i_frame < total_reference_frames; ++i_frame) { - cvm::log(std::string("Distance between frame ") + cvm::to_str(i_frame) + " and " + cvm::to_str(i_frame + 1) + " is " + cvm::to_str(rmsd_between_refs[i_frame - 1]) + std::string("\n")); - mean_square_displacements += rmsd_between_refs[i_frame - 1] * rmsd_between_refs[i_frame - 1]; - } - mean_square_displacements /= cvm::real(total_reference_frames - 1); - cvm::real suggested_lambda = 1.0 / mean_square_displacements; cvm::real p_lambda; - get_keyval(conf, "lambda", p_lambda, suggested_lambda); + get_keyval(conf, "lambda", p_lambda, -1.0); ArithmeticPathCV::ArithmeticPathBase::initialize(cv.size(), total_reference_frames, p_lambda, ref_cv[0], p_weights); cvm::log(std::string("Lambda is ") + cvm::to_str(lambda) + std::string("\n")); for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { @@ -58,6 +49,16 @@ void colvar::aspathCV::updateDistanceToReferenceFrames() { } void colvar::aspathCV::calc_value() { + if (lambda < 0) { + // this implies that the user may not set a valid lambda value + // so recompute it by the suggested value in Parrinello's paper + cvm::log("A non-positive value of lambda is detected, which implies that it may not set in the configuration.\n"); + cvm::log("This component (aspathCV) will recompute a value for lambda following the suggestion in the origin paper.\n"); + std::vector rmsd_between_refs(total_reference_frames - 1, 0.0); + computeDistanceBetweenReferenceFrames(rmsd_between_refs); + reComputeLambda(rmsd_between_refs); + cvm::log("Ok, the value of lambda is updated to " + cvm::to_str(lambda)); + } computeValue(); x = s; } @@ -107,17 +108,8 @@ colvar::azpathCV::azpathCV(std::string const &conf): CVBasedPath(conf) { get_keyval(conf, "weights", p_weights, std::vector(cv.size(), 1.0)); x.type(colvarvalue::type_scalar); use_explicit_gradients = true; - std::vector rmsd_between_refs(total_reference_frames - 1, 0.0); - computeDistanceBetweenReferenceFrames(rmsd_between_refs); - cvm::real mean_square_displacements = 0.0; - for (size_t i_frame = 1; i_frame < total_reference_frames; ++i_frame) { - cvm::log(std::string("Distance between frame ") + cvm::to_str(i_frame) + " and " + cvm::to_str(i_frame + 1) + " is " + cvm::to_str(rmsd_between_refs[i_frame - 1]) + std::string("\n")); - mean_square_displacements += rmsd_between_refs[i_frame - 1] * rmsd_between_refs[i_frame - 1]; - } - mean_square_displacements /= cvm::real(total_reference_frames - 1); - cvm::real suggested_lambda = 1.0 / mean_square_displacements; cvm::real p_lambda; - get_keyval(conf, "lambda", p_lambda, suggested_lambda); + get_keyval(conf, "lambda", p_lambda, -1.0); ArithmeticPathCV::ArithmeticPathBase::initialize(cv.size(), total_reference_frames, p_lambda, ref_cv[0], p_weights); cvm::log(std::string("Lambda is ") + cvm::to_str(lambda) + std::string("\n")); for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { @@ -146,6 +138,16 @@ void colvar::azpathCV::updateDistanceToReferenceFrames() { } void colvar::azpathCV::calc_value() { + if (lambda < 0) { + // this implies that the user may not set a valid lambda value + // so recompute it by the suggested value in Parrinello's paper + cvm::log("A non-positive value of lambda is detected, which implies that it may not set in the configuration.\n"); + cvm::log("This component (azpathCV) will recompute a value for lambda following the suggestion in the origin paper.\n"); + std::vector rmsd_between_refs(total_reference_frames - 1, 0.0); + computeDistanceBetweenReferenceFrames(rmsd_between_refs); + reComputeLambda(rmsd_between_refs); + cvm::log("Ok, the value of lambda is updated to " + cvm::to_str(lambda)); + } computeValue(); x = z; } diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index 1b1b295ff1..c044da86b3 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -194,10 +194,10 @@ colvar::distance_z::distance_z(std::string const &conf) ref2 = parse_group(conf, "ref2", true); if ( ref2 ) { - cvm::log("Using axis joining the centers of mass of groups \"ref\" and \"ref2\""); + cvm::log("Using axis joining the centers of mass of groups \"ref\" and \"ref2\"\n"); fixed_axis = false; if (key_lookup(conf, "axis")) - cvm::log("Warning: explicit axis definition will be ignored!"); + cvm::log("Warning: explicit axis definition will be ignored!\n"); } else { if (get_keyval(conf, "axis", axis, cvm::rvector(0.0, 0.0, 1.0))) { if (axis.norm2() == 0.0) { @@ -808,9 +808,9 @@ colvar::gyration::gyration(std::string const &conf) atoms = parse_group(conf, "atoms"); if (atoms->b_user_defined_fit) { - cvm::log("WARNING: explicit fitting parameters were provided for atom group \"atoms\"."); + cvm::log("WARNING: explicit fitting parameters were provided for atom group \"atoms\".\n"); } else { - atoms->b_center = true; + atoms->enable(f_ag_center); atoms->ref_pos.assign(1, cvm::atom_pos(0.0, 0.0, 0.0)); atoms->fit_gradients.assign(atoms->size(), cvm::rvector(0.0, 0.0, 0.0)); } @@ -1025,13 +1025,13 @@ colvar::rmsd::rmsd(std::string const &conf) } if (atoms->b_user_defined_fit) { - cvm::log("WARNING: explicit fitting parameters were provided for atom group \"atoms\"."); + cvm::log("WARNING: explicit fitting parameters were provided for atom group \"atoms\".\n"); } else { // Default: fit everything - cvm::log("Enabling \"centerReference\" and \"rotateReference\", to minimize RMSD before calculating it as a variable: " + cvm::log("Enabling \"centerToReference\" and \"rotateToReference\", to minimize RMSD before calculating it as a variable: " "if this is not the desired behavior, disable them explicitly within the \"atoms\" block.\n"); - atoms->b_center = true; - atoms->b_rotate = true; + atoms->enable(f_ag_center); + atoms->enable(f_ag_rotate); // default case: reference positions for calculating the rmsd are also those used // for fitting atoms->ref_pos = ref_pos; @@ -1156,7 +1156,7 @@ void colvar::rmsd::calc_Jacobian_derivative() cvm::real rotation_term = 0.0; // The rotation term only applies is coordinates are rotated - if (atoms->b_rotate) { + if (atoms->is_enabled(f_ag_rotate)) { // gradient of the rotation matrix cvm::matrix2d grad_rot_mat(3, 3); @@ -1202,7 +1202,7 @@ void colvar::rmsd::calc_Jacobian_derivative() } // The translation term only applies is coordinates are centered - cvm::real translation_term = atoms->b_center ? 3.0 : 0.0; + cvm::real translation_term = atoms->is_enabled(f_ag_center) ? 3.0 : 0.0; jd.real_value = x.real_value > 0.0 ? (3.0 * atoms->size() - 1.0 - translation_term - rotation_term) / x.real_value : @@ -1284,10 +1284,10 @@ colvar::eigenvector::eigenvector(std::string const &conf) cvm::log("WARNING: explicit fitting parameters were provided for atom group \"atoms\".\n"); } else { // default: fit everything - cvm::log("Enabling \"centerReference\" and \"rotateReference\", to minimize RMSD before calculating the vector projection: " + cvm::log("Enabling \"centerToReference\" and \"rotateToReference\", to minimize RMSD before calculating the vector projection: " "if this is not the desired behavior, disable them explicitly within the \"atoms\" block.\n"); - atoms->b_center = true; - atoms->b_rotate = true; + atoms->enable(f_ag_center); + atoms->enable(f_ag_rotate); atoms->ref_pos = ref_pos; atoms->center_ref_pos(); atoms->disable(f_ag_fit_gradients); // cancel out if group is fitted on itself @@ -1355,14 +1355,14 @@ colvar::eigenvector::eigenvector(std::string const &conf) if (b_difference_vector) { - if (atoms->b_center) { + if (atoms->is_enabled(f_ag_center)) { // both sets should be centered on the origin for fitting for (size_t i = 0; i < atoms->size(); i++) { eigenvec[i] -= eig_center; ref_pos[i] -= ref_pos_center; } } - if (atoms->b_rotate) { + if (atoms->is_enabled(f_ag_rotate)) { atoms->rot.calc_optimal_rotation(eigenvec, ref_pos); for (size_t i = 0; i < atoms->size(); i++) { eigenvec[i] = atoms->rot.rotate(eigenvec[i]); @@ -1372,7 +1372,7 @@ colvar::eigenvector::eigenvector(std::string const &conf) for (size_t i = 0; i < atoms->size(); i++) { eigenvec[i] -= ref_pos[i]; } - if (atoms->b_center) { + if (atoms->is_enabled(f_ag_center)) { // bring back the ref positions to where they were for (size_t i = 0; i < atoms->size(); i++) { ref_pos[i] += ref_pos_center; @@ -1521,7 +1521,8 @@ colvar::cartesian::cartesian(std::string const &conf) x.type(colvarvalue::type_vector); disable(f_cvc_explicit_gradient); - x.vector1d_value.resize(atoms->size() * axes.size()); + // Don't try to access atoms if creation of the atom group failed + if (atoms != NULL) x.vector1d_value.resize(atoms->size() * axes.size()); } diff --git a/lib/colvars/colvarcomp_gpath.cpp b/lib/colvars/colvarcomp_gpath.cpp index 8849f9dbe4..884dfdaee9 100644 --- a/lib/colvars/colvarcomp_gpath.cpp +++ b/lib/colvars/colvarcomp_gpath.cpp @@ -65,8 +65,8 @@ colvar::CartesianBasedPath::CartesianBasedPath(std::string const &conf): cvc(con cvm::atom_group* tmp_atoms = parse_group(conf, "atoms"); if (!has_user_defined_fitting) { // Swipe from the rmsd class - tmp_atoms->b_center = true; - tmp_atoms->b_rotate = true; + tmp_atoms->enable(f_ag_center); + tmp_atoms->enable(f_ag_rotate); tmp_atoms->ref_pos = reference_frames[i_frame]; tmp_atoms->center_ref_pos(); tmp_atoms->enable(f_ag_fit_gradients); @@ -87,8 +87,8 @@ colvar::CartesianBasedPath::CartesianBasedPath(std::string const &conf): cvc(con std::vector reference_fitting_position(tmp_fitting_atoms->size()); cvm::load_coords(reference_position_filename.c_str(), &reference_fitting_position, tmp_fitting_atoms, reference_column, reference_column_value); // setup the atom group for calculating - tmp_atoms->b_center = true; - tmp_atoms->b_rotate = true; + tmp_atoms->enable(f_ag_center); + tmp_atoms->enable(f_ag_rotate); tmp_atoms->b_user_defined_fit = true; tmp_atoms->disable(f_ag_scalable); tmp_atoms->disable(f_ag_scalable_com); diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp index c7a414b006..fbf572b3f3 100644 --- a/lib/colvars/colvarcomp_rotations.cpp +++ b/lib/colvars/colvarcomp_rotations.cpp @@ -442,3 +442,335 @@ void colvar::spin_angle::wrap(colvarvalue &x_unwrapped) const return; } + + +colvar::euler_phi::euler_phi(std::string const &conf) + : orientation() +{ + function_type = "euler_phi"; + period = 360.0; + enable(f_cvc_periodic); + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); + init(conf); +} + + +colvar::euler_phi::euler_phi() + : orientation() +{ + function_type = "euler_phi"; + period = 360.0; + enable(f_cvc_periodic); + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); +} + + +int colvar::euler_phi::init(std::string const &conf) +{ + int error_code = COLVARS_OK; + error_code |= orientation::init(conf); + return error_code; +} + + +void colvar::euler_phi::calc_value() +{ + atoms_cog = atoms->center_of_geometry(); + + rot.calc_optimal_rotation(ref_pos, atoms->positions_shifted(-1.0 * atoms_cog)); + + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + const cvm::real tmp_y = 2 * (q0 * q1 + q2 * q3); + const cvm::real tmp_x = 1 - 2 * (q1 * q1 + q2 * q2); + x.real_value = cvm::atan2(tmp_y, tmp_x) * (180.0/PI); +} + + +void colvar::euler_phi::calc_gradients() +{ + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + const cvm::real denominator = (2 * q0 * q1 + 2 * q2 * q3) * (2 * q0 * q1 + 2 * q2 * q3) + (-2 * q1 * q1 - 2 * q2 * q2 + 1) * (-2 * q1 * q1 - 2 * q2 * q2 + 1); + const cvm::real dxdq0 = (180.0/PI) * 2 * q1 * (-2 * q1 * q1 - 2 * q2 * q2 + 1) / denominator; + const cvm::real dxdq1 = (180.0/PI) * (2 * q0 * (-2 * q1 * q1 - 2 * q2 * q2 + 1) - 4 * q1 * (-2 * q0 * q1 - 2 * q2 * q3)) / denominator; + const cvm::real dxdq2 = (180.0/PI) * (-4 * q2 * (-2 * q0 * q1 - 2 * q2 * q3) + 2 * q3 * (-2 * q1 * q1 - 2 * q2 * q2 + 1)) / denominator; + const cvm::real dxdq3 = (180.0/PI) * 2 * q2 * (-2 * q1 * q1 - 2 * q2 * q2 + 1) / denominator; + for (size_t ia = 0; ia < atoms->size(); ia++) { + (*atoms)[ia].grad = (dxdq0 * (rot.dQ0_2[ia])[0]) + + (dxdq1 * (rot.dQ0_2[ia])[1]) + + (dxdq2 * (rot.dQ0_2[ia])[2]) + + (dxdq3 * (rot.dQ0_2[ia])[3]); + } +} + + +void colvar::euler_phi::apply_force(colvarvalue const &force) +{ + cvm::real const &fw = force.real_value; + if (!atoms->noforce) { + atoms->apply_colvar_force(fw); + } +} + + +cvm::real colvar::euler_phi::dist2(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return diff * diff; +} + + +colvarvalue colvar::euler_phi::dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return 2.0 * diff; +} + + +colvarvalue colvar::euler_phi::dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return (-2.0) * diff; +} + + +void colvar::euler_phi::wrap(colvarvalue &x_unwrapped) const +{ + if ((x_unwrapped.real_value - wrap_center) >= 180.0) { + x_unwrapped.real_value -= 360.0; + return; + } + + if ((x_unwrapped.real_value - wrap_center) < -180.0) { + x_unwrapped.real_value += 360.0; + return; + } + + return; +} + + +colvar::euler_psi::euler_psi(std::string const &conf) + : orientation() +{ + function_type = "euler_psi"; + period = 360.0; + enable(f_cvc_periodic); + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); + init(conf); +} + + +colvar::euler_psi::euler_psi() + : orientation() +{ + function_type = "euler_psi"; + period = 360.0; + enable(f_cvc_periodic); + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); +} + + +int colvar::euler_psi::init(std::string const &conf) +{ + int error_code = COLVARS_OK; + error_code |= orientation::init(conf); + return error_code; +} + + +void colvar::euler_psi::calc_value() +{ + atoms_cog = atoms->center_of_geometry(); + + rot.calc_optimal_rotation(ref_pos, atoms->positions_shifted(-1.0 * atoms_cog)); + + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + const cvm::real tmp_y = 2 * (q0 * q3 + q1 * q2); + const cvm::real tmp_x = 1 - 2 * (q2 * q2 + q3 * q3); + x.real_value = cvm::atan2(tmp_y, tmp_x) * (180.0/PI); +} + + +void colvar::euler_psi::calc_gradients() +{ + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + const cvm::real denominator = (2 * q0 * q3 + 2 * q1 * q2) * (2 * q0 * q3 + 2 * q1 * q2) + (-2 * q2 * q2 - 2 * q3 * q3 + 1) * (-2 * q2 * q2 - 2 * q3 * q3 + 1); + const cvm::real dxdq0 = (180.0/PI) * 2 * q3 * (-2 * q2 * q2 - 2 * q3 * q3 + 1) / denominator; + const cvm::real dxdq1 = (180.0/PI) * 2 * q2 * (-2 * q2 * q2 - 2 * q3 * q3 + 1) / denominator; + const cvm::real dxdq2 = (180.0/PI) * (2 * q1 * (-2 * q2 * q2 - 2 * q3 * q3 + 1) - 4 * q2 * (-2 * q0 * q3 - 2 * q1 * q2)) / denominator; + const cvm::real dxdq3 = (180.0/PI) * (2 * q0 * (-2 * q2 * q2 - 2 * q3 * q3 + 1) - 4 * q3 * (-2 * q0 * q3 - 2 * q1 * q2)) / denominator; + for (size_t ia = 0; ia < atoms->size(); ia++) { + (*atoms)[ia].grad = (dxdq0 * (rot.dQ0_2[ia])[0]) + + (dxdq1 * (rot.dQ0_2[ia])[1]) + + (dxdq2 * (rot.dQ0_2[ia])[2]) + + (dxdq3 * (rot.dQ0_2[ia])[3]); + } +} + + +void colvar::euler_psi::apply_force(colvarvalue const &force) +{ + cvm::real const &fw = force.real_value; + if (!atoms->noforce) { + atoms->apply_colvar_force(fw); + } +} + + +cvm::real colvar::euler_psi::dist2(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return diff * diff; +} + + +colvarvalue colvar::euler_psi::dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return 2.0 * diff; +} + + +colvarvalue colvar::euler_psi::dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + cvm::real diff = x1.real_value - x2.real_value; + diff = (diff < -180.0 ? diff + 360.0 : (diff > 180.0 ? diff - 360.0 : diff)); + return (-2.0) * diff; +} + + +void colvar::euler_psi::wrap(colvarvalue &x_unwrapped) const +{ + if ((x_unwrapped.real_value - wrap_center) >= 180.0) { + x_unwrapped.real_value -= 360.0; + return; + } + + if ((x_unwrapped.real_value - wrap_center) < -180.0) { + x_unwrapped.real_value += 360.0; + return; + } + + return; +} + + +colvar::euler_theta::euler_theta(std::string const &conf) + : orientation() +{ + function_type = "euler_theta"; + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); + init(conf); +} + + +colvar::euler_theta::euler_theta() + : orientation() +{ + function_type = "euler_theta"; + enable(f_cvc_explicit_gradient); + x.type(colvarvalue::type_scalar); +} + + +int colvar::euler_theta::init(std::string const &conf) +{ + int error_code = COLVARS_OK; + error_code |= orientation::init(conf); + return error_code; +} + + +void colvar::euler_theta::calc_value() +{ + atoms_cog = atoms->center_of_geometry(); + + rot.calc_optimal_rotation(ref_pos, atoms->positions_shifted(-1.0 * atoms_cog)); + + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + x.real_value = cvm::asin(2 * (q0 * q2 - q3 * q1)) * (180.0/PI); +} + + +void colvar::euler_theta::calc_gradients() +{ + const cvm::real& q0 = rot.q.q0; + const cvm::real& q1 = rot.q.q1; + const cvm::real& q2 = rot.q.q2; + const cvm::real& q3 = rot.q.q3; + const cvm::real denominator = cvm::sqrt(1 - (2 * q0 * q2 - 2 * q1 * q3) * (2 * q0 * q2 - 2 * q1 * q3)); + const cvm::real dxdq0 = (180.0/PI) * 2 * q2 / denominator; + const cvm::real dxdq1 = (180.0/PI) * -2 * q3 / denominator; + const cvm::real dxdq2 = (180.0/PI) * 2 * q0 / denominator; + const cvm::real dxdq3 = (180.0/PI) * -2 * q1 / denominator; + for (size_t ia = 0; ia < atoms->size(); ia++) { + (*atoms)[ia].grad = (dxdq0 * (rot.dQ0_2[ia])[0]) + + (dxdq1 * (rot.dQ0_2[ia])[1]) + + (dxdq2 * (rot.dQ0_2[ia])[2]) + + (dxdq3 * (rot.dQ0_2[ia])[3]); + } +} + + +void colvar::euler_theta::apply_force(colvarvalue const &force) +{ + cvm::real const &fw = force.real_value; + if (!atoms->noforce) { + atoms->apply_colvar_force(fw); + } +} + + +cvm::real colvar::euler_theta::dist2(colvarvalue const &x1, + colvarvalue const &x2) const +{ + // theta angle is not periodic + return cvc::dist2(x1, x2); +} + + +colvarvalue colvar::euler_theta::dist2_lgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + // theta angle is not periodic + return cvc::dist2_lgrad(x1, x2); +} + + +colvarvalue colvar::euler_theta::dist2_rgrad(colvarvalue const &x1, + colvarvalue const &x2) const +{ + // theta angle is not periodic + return cvc::dist2_rgrad(x1, x2); +} diff --git a/lib/colvars/colvarcomp_volmaps.cpp b/lib/colvars/colvarcomp_volmaps.cpp index 8ea2b76de4..5f80e46717 100644 --- a/lib/colvars/colvarcomp_volmaps.cpp +++ b/lib/colvars/colvarcomp_volmaps.cpp @@ -19,6 +19,9 @@ colvar::map_total::map_total() : cvc(), volmap_index(-1) { function_type = "map_total"; + volmap_id = -1; + volmap_index = -1; + atoms = NULL; x.type(colvarvalue::type_scalar); } @@ -27,6 +30,9 @@ colvar::map_total::map_total(std::string const &conf) : cvc(), volmap_index(-1) { function_type = "map_total"; + volmap_id = -1; + volmap_index = -1; + atoms = NULL; x.type(colvarvalue::type_scalar); map_total::init(conf); } @@ -35,26 +41,101 @@ colvar::map_total::map_total(std::string const &conf) int colvar::map_total::init(std::string const &conf) { int error_code = cvc::init(conf); - get_keyval(conf, "mapName", map_name, map_name); - volmap_index = (cvm::proxy)->init_volmap(map_name); - error_code |= volmap_index > 0 ? COLVARS_OK : INPUT_ERROR; + colvarproxy *proxy = cvm::main()->proxy; + get_keyval(conf, "mapName", volmap_name, volmap_name); + get_keyval(conf, "mapID", volmap_id, volmap_id); + register_param("mapID", reinterpret_cast(&volmap_id)); + + if ((volmap_name.size() > 0) && (volmap_id >= 0)) { + error_code |= + cvm::error("Error: mapName and mapID are mutually exclusive.\n"); + } + + // Parse optional group + atoms = parse_group(conf, "atoms", true); + if (atoms != NULL) { + + // Using internal selection + if (volmap_name.size()) { + error_code |= proxy->check_volmap_by_name(volmap_name); + } + if (volmap_id >= 0) { + error_code |= proxy->check_volmap_by_id(volmap_id); + } + + } else { + + // Using selection from the MD engine + if (volmap_name.size()) { + volmap_index = proxy->init_volmap_by_name(volmap_name); + } + if (volmap_id >= 0) { + volmap_index = proxy->init_volmap_by_id(volmap_id); + } + error_code |= volmap_index > 0 ? COLVARS_OK : INPUT_ERROR; + } + + if (get_keyval(conf, "atomWeights", atom_weights, atom_weights)) { + if (atoms == NULL) { + error_code |= cvm::error("Error: weights can only be assigned when atoms " + "are selected explicitly in Colvars.\n", + INPUT_ERROR); + } else { + if (atoms->size() != atom_weights.size()) { + error_code |= cvm::error("Error: if defined, the number of weights ("+ + cvm::to_str(atom_weights.size())+ + ") must equal the number of atoms ("+ + cvm::to_str(atoms->size())+ + ").\n", INPUT_ERROR); + } + } + } + + if (volmap_name.size() > 0) { + volmap_id = proxy->get_volmap_id_from_name(volmap_name.c_str()); + } + return error_code; } void colvar::map_total::calc_value() { - x.real_value = (cvm::proxy)->get_volmap_value(volmap_index); + colvarproxy *proxy = cvm::main()->proxy; + int flags = is_enabled(f_cvc_gradient) ? colvarproxy::volmap_flag_gradients : + colvarproxy::volmap_flag_gradients; + + if (atoms != NULL) { + // Compute the map inside Colvars + x.real_value = 0.0; + + cvm::real *w = NULL; + if (atom_weights.size() > 0) { + flags |= colvarproxy::volmap_flag_use_atom_field; + w = &(atom_weights[0]); + } + proxy->compute_volmap(flags, volmap_id, atoms->begin(), atoms->end(), + &(x.real_value), w); + } else { + // Get the externally computed value + x.real_value = proxy->get_volmap_value(volmap_index); + } } void colvar::map_total::calc_gradients() { - // Atomic coordinates are not available here + // Computed in calc_value() or by the MD engine } void colvar::map_total::apply_force(colvarvalue const &force) { - (cvm::proxy)->apply_volmap_force(volmap_index, force.real_value); + colvarproxy *proxy = cvm::main()->proxy; + if (atoms) { + if (!atoms->noforce) + atoms->apply_colvar_force(force.real_value); + } else { + proxy->apply_volmap_force(volmap_index, force.real_value); + } } diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 94c5cfbda7..c240ce5a96 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -49,7 +49,7 @@ void colvardeps::free_children_deps() { // Cannot be in the base class destructor because it needs the derived class features() size_t i,j,fid; - if (cvm::debug()) cvm::log("DEPS: freeing children deps for " + description); + if (cvm::debug()) cvm::log("DEPS: freeing children deps for " + description + "\n"); cvm::increase_depth(); for (fid = 0; fid < feature_states.size(); fid++) { @@ -58,7 +58,7 @@ void colvardeps::free_children_deps() { int g = features()[fid]->requires_children[i]; for (j=0; jfeatures()[g]->description); + + children[j]->features()[g]->description + "\n"); children[j]->decr_ref_count(g); } } @@ -80,7 +80,7 @@ void colvardeps::restore_children_deps() { int g = features()[fid]->requires_children[i]; for (j=0; jfeatures()[g]->description); + + children[j]->features()[g]->description + "\n"); children[j]->enable(g, false, false); } } @@ -135,7 +135,7 @@ int colvardeps::enable(int feature_id, if (cvm::debug()) { cvm::log("DEPS: " + description + (dry_run ? " testing " : " enabling ") + - "\"" + f->description +"\""); + "\"" + f->description +"\"\n"); } if (fs->enabled) { @@ -144,7 +144,7 @@ int colvardeps::enable(int feature_id, // as requirement is enabled fs->ref_count++; if (cvm::debug()) - cvm::log("DEPS: bumping ref_count to " + cvm::to_str(fs->ref_count)); + cvm::log("DEPS: bumping ref_count to " + cvm::to_str(fs->ref_count) + "\n"); } // Do not try to further resolve deps return COLVARS_OK; @@ -243,7 +243,7 @@ int colvardeps::enable(int feature_id, enable(g, false, false); // Just for printing error output } cvm::decrease_depth(); - cvm::log("-----------------------------------------"); + cvm::log("-----------------------------------------\n"); if (toplevel) { cvm::error("Error: Failed dependency in " + description + "."); } @@ -285,7 +285,7 @@ int colvardeps::enable(int feature_id, do_feature_side_effects(feature_id); if (cvm::debug()) cvm::log("DEPS: feature \"" + f->description + "\" in " - + description + " enabled, ref_count = 1."); + + description + " enabled, ref_count = 1." + "\n"); } return COLVARS_OK; } @@ -297,7 +297,7 @@ int colvardeps::disable(int feature_id) { feature_state *fs = &feature_states[feature_id]; if (cvm::debug()) cvm::log("DEPS: disabling feature \"" - + f->description + "\" in " + description); + + f->description + "\" in " + description + "\n"); if (fs->enabled == false) { return COLVARS_OK; @@ -313,14 +313,14 @@ int colvardeps::disable(int feature_id) { // internal deps (self) for (i=0; irequires_self.size(); i++) { if (cvm::debug()) cvm::log("DEPS: dereferencing self " - + features()[f->requires_self[i]]->description); + + features()[f->requires_self[i]]->description + "\n"); decr_ref_count(f->requires_self[i]); } // alternates for (i=0; ialternate_refs.size(); i++) { if (cvm::debug()) cvm::log("DEPS: dereferencing alt " - + features()[fs->alternate_refs[i]]->description); + + features()[fs->alternate_refs[i]]->description + "\n"); decr_ref_count(fs->alternate_refs[i]); } // Forget these, now that they are dereferenced @@ -337,7 +337,7 @@ int colvardeps::disable(int feature_id) { int g = f->requires_children[i]; for (j=0; jfeatures()[g]->description); + + children[j]->features()[g]->description + "\n"); children[j]->decr_ref_count(g); } } @@ -430,11 +430,13 @@ void colvardeps::require_feature_alt(int f, int g, int h, int i, int j) { void colvardeps::print_state() { size_t i; - cvm::log("Features of \"" + description + "\" ON/OFF (refcount)"); + cvm::log("Features of \"" + description + "\" (refcount)\n"); for (i = 0; i < feature_states.size(); i++) { - std::string onoff = is_enabled(i) ? "ON" : "OFF"; - cvm::log("- " + features()[i]->description + " " + onoff + " (" - + cvm::to_str(feature_states[i].ref_count) + ")"); + std::string onoff = is_enabled(i) ? "ON " : " "; + // Only display refcount if non-zero for less clutter + std::string refcount = feature_states[i].ref_count != 0 ? + " (" + cvm::to_str(feature_states[i].ref_count) + ") " : ""; + cvm::log("- " + onoff + features()[i]->description + refcount + "\n"); } cvm::increase_depth(); for (i=0; irequires_children.size(); i++) { int g = features()[fid]->requires_children[i]; if (cvm::debug()) cvm::log("DEPS: re-enabling children's " - + child->features()[g]->description); + + child->features()[g]->description + "\n"); child->enable(g, false, false); } } diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index f4f543f336..9fd441ffec 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -283,6 +283,10 @@ public: /// center with fictitious mass; bias forces will be applied to /// the center f_cv_extended_Lagrangian, + /// \brief An extended variable that sets an external variable in the + /// back-end (eg. an alchemical coupling parameter for lambda-dynamics) + /// Can have a single component + f_cv_external, /// \brief The extended system coordinate undergoes Langevin dynamics f_cv_Langevin, /// \brief Output the potential and kinetic energies @@ -375,6 +379,7 @@ public: enum features_atomgroup { f_ag_active, f_ag_center, + f_ag_center_origin, f_ag_rotate, f_ag_fitting_group, /// Perform a standard minimum msd fit for given atoms diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index df122b1be4..2074c97aca 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -122,17 +122,83 @@ cvm::real colvar_grid_scalar::entropy() const colvar_grid_gradient::colvar_grid_gradient() - : colvar_grid(), samples(NULL) + : colvar_grid(), + samples(NULL), + weights(NULL) {} colvar_grid_gradient::colvar_grid_gradient(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, nx_i.size()), samples(NULL) + : colvar_grid(nx_i, 0.0, nx_i.size()), + samples(NULL), + weights(NULL) {} colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars) - : colvar_grid(colvars, 0.0, colvars.size()), samples(NULL) + : colvar_grid(colvars, 0.0, colvars.size()), + samples(NULL), + weights(NULL) {} + +colvar_grid_gradient::colvar_grid_gradient(std::string &filename) + : colvar_grid(), + samples(NULL), + weights(NULL) +{ + std::ifstream is; + is.open(filename.c_str()); + if (!is.is_open()) { + cvm::error("Error opening multicol gradient file " + filename + " for reading.\n"); + return; + } + + // Data in the header: nColvars, then for each + // xiMin, dXi, nPoints, periodic flag + + std::string hash; + size_t i; + + if ( !(is >> hash) || (hash != "#") ) { + cvm::error("Error reading grid at position "+ + cvm::to_str(static_cast(is.tellg()))+ + " in stream(read \"" + hash + "\")\n"); + return; + } + + is >> nd; + mult = nd; + std::vector lower_in(nd), widths_in(nd); + std::vector nx_in(nd); + std::vector periodic_in(nd); + + for (i = 0; i < nd; i++ ) { + if ( !(is >> hash) || (hash != "#") ) { + cvm::error("Error reading grid at position "+ + cvm::to_str(static_cast(is.tellg()))+ + " in stream(read \"" + hash + "\")\n"); + return; + } + + is >> lower_in[i] >> widths_in[i] >> nx_in[i] >> periodic_in[i]; + } + + this->setup(nx_in, 0., mult); + + widths = widths_in; + + for (i = 0; i < nd; i++ ) { + lower_boundaries.push_back(colvarvalue(lower_in[i])); + periodic.push_back(static_cast(periodic_in[i])); + } + + // Reset the istream for read_multicol, which expects the whole file + is.clear(); + is.seekg(0); + read_multicol(is); + is.close(); +} + + void colvar_grid_gradient::write_1D_integral(std::ostream &os) { cvm::real bin, min, integral; @@ -202,7 +268,7 @@ integrate_potential::integrate_potential(std::vector &colvars, colvar_ // Compute inverse of Laplacian diagonal for Jacobi preconditioning // For now all code related to preconditioning is commented out // until a method better than Jacobi is implemented -// cvm::log("Preparing inverse diagonal for preconditioning..."); +// cvm::log("Preparing inverse diagonal for preconditioning...\n"); // inv_lap_diag.resize(nt); // std::vector id(nt), lap_col(nt); // for (int i = 0; i < nt; i++) { @@ -213,7 +279,30 @@ integrate_potential::integrate_potential(std::vector &colvars, colvar_ // id[i] = 0.; // inv_lap_diag[i] = 1. / lap_col[i]; // } -// cvm::log("Done."); +// cvm::log("Done.\n"); + } +} + + +integrate_potential::integrate_potential(colvar_grid_gradient * gradients) + : gradients(gradients) +{ + nd = gradients->num_variables(); + nx = gradients->number_of_points_vec(); + widths = gradients->widths; + periodic = gradients->periodic; + + // Expand grid by 1 bin in non-periodic dimensions + for (size_t i = 0; i < nd; i++ ) { + if (!periodic[i]) nx[i]++; + // Shift the grid by half the bin width (values at edges instead of center of bins) + lower_boundaries.push_back(gradients->lower_boundaries[i].real_value - 0.5 * widths[i]); + } + + setup(nx); + + if (nd > 1) { + divergence.resize(nt); } } @@ -246,7 +335,7 @@ int integrate_potential::integrate(const int itmax, const cvm::real &tol, cvm::r } else if (nd <= 3) { nr_linbcg_sym(divergence, data, tol, itmax, iter, err); - cvm::log("Integrated in " + cvm::to_str(iter) + " steps, error: " + cvm::to_str(err)); + cvm::log("Integrated in " + cvm::to_str(iter) + " steps, error: " + cvm::to_str(err) + "\n"); } else { cvm::error("Cannot integrate PMF in dimension > 3\n"); diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index 17d049a6eb..3642ae387c 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -102,6 +102,12 @@ public: return nd; } + /// Return the numbers of points in all dimensions + inline std::vector const &number_of_points_vec() const + { + return nx; + } + /// Return the number of points in the i-th direction, if provided, or /// the total number inline size_t number_of_points(int const icv = -1) const @@ -199,6 +205,7 @@ public: { nd = nt = 0; mult = 1; + has_parent_data = false; this->setup(); } @@ -222,9 +229,9 @@ public: hard_lower_boundaries(g.hard_lower_boundaries), hard_upper_boundaries(g.hard_upper_boundaries), widths(g.widths), + has_parent_data(false), has_data(false) - { - } + {} /// \brief Constructor from explicit grid sizes \param nx_i Number /// of grid points along each dimension \param t Initial value for @@ -233,7 +240,7 @@ public: colvar_grid(std::vector const &nx_i, T const &t = T(), size_t mult_i = 1) - : has_data(false) + : has_parent_data(false), has_data(false) { this->setup(nx_i, t, mult_i); } @@ -245,7 +252,7 @@ public: T const &t = T(), size_t mult_i = 1, bool add_extra_bin = false) - : has_data(false) + : has_parent_data(false), has_data(false) { this->init_from_colvars(colvars, t, mult_i, add_extra_bin); } @@ -1066,8 +1073,8 @@ public: std::vector nx_read; std::vector bin; - if ( cv.size() != nd ) { - cvm::error("Cannot read grid file: missing reference to colvars."); + if ( cv.size() > 0 && cv.size() != nd ) { + cvm::error("Cannot read grid file: number of variables in file differs from number referenced by grid.\n"); return is; } @@ -1525,6 +1532,9 @@ public: /// Constructor from a vector of colvars colvar_grid_gradient(std::vector &colvars); + /// Constructor from a multicol file + colvar_grid_gradient(std::string &filename); + /// \brief Get a vector with the binned value(s) indexed by ix, normalized if applicable inline void vector_value(std::vector const &ix, std::vector &v) const { @@ -1658,10 +1668,13 @@ class integrate_potential : public colvar_grid_scalar {} /// Constructor from a vector of colvars + gradient grid - integrate_potential (std::vector &colvars, colvar_grid_gradient * gradients); + integrate_potential(std::vector &colvars, colvar_grid_gradient * gradients); + + /// Constructor from a gradient grid (for processing grid files without a Colvars config) + integrate_potential(colvar_grid_gradient * gradients); /// \brief Calculate potential from divergence (in 2D); return number of steps - int integrate (const int itmax, const cvm::real & tol, cvm::real & err); + int integrate(const int itmax, const cvm::real & tol, cvm::real & err); /// \brief Update matrix containing divergence and boundary conditions /// based on new gradient point value, in neighboring bins diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 95d42560fc..405c68244b 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -34,6 +34,9 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) xyz_reader_use_count = 0; + restart_version_str.clear(); + restart_version_int = 0; + if (proxy == NULL) { proxy = proxy_in; // Pointer to the proxy object parse = new colvarparse(); // Parsing object for global options @@ -48,7 +51,7 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) cvm::log(cvm::line_marker); cvm::log("Initializing the collective variables module, version "+ - cvm::to_str(COLVARS_VERSION)+".\n"); + version()+".\n"); cvm::log("Please cite Fiorin et al, Mol Phys 2013:\n " "https://dx.doi.org/10.1080/00268976.2013.813594\n" "in any publication based on this calculation.\n"); @@ -58,7 +61,7 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) } #if (__cplusplus >= 201103L) - cvm::log("This version was built with the C++11 standard or higher."); + cvm::log("This version was built with the C++11 standard or higher.\n"); #else cvm::log("This version was built without the C++11 standard: some features are disabled.\n" "Please see the following link for details:\n" @@ -186,6 +189,7 @@ std::istream & colvarmodule::getline(std::istream &is, std::string &line) size_t const sz = l.size(); if (sz > 0) { if (l[sz-1] == '\r' ) { + // Replace Windows newlines with Unix newlines line = l.substr(0, sz-1); } else { line = l; @@ -200,6 +204,7 @@ std::istream & colvarmodule::getline(std::istream &is, std::string &line) int colvarmodule::parse_config(std::string &conf) { + // Auto-generated additional configuration extra_conf.clear(); // Check that the input has matching braces @@ -208,6 +213,9 @@ int colvarmodule::parse_config(std::string &conf) INPUT_ERROR); } + // Check that the input has only ASCII characters, and warn otherwise + colvarparse::check_ascii(conf); + // Parse global options if (catch_input_errors(parse_global_params(conf))) { return get_error(); @@ -472,7 +480,7 @@ int colvarmodule::parse_biases(std::string const &conf) if (use_scripted_forces) { cvm::log(cvm::line_marker); cvm::increase_depth(); - cvm::log("User forces script will be run at each bias update."); + cvm::log("User forces script will be run at each bias update.\n"); cvm::decrease_depth(); } @@ -754,6 +762,9 @@ int colvarmodule::calc() error_code |= end_of_step(); + // TODO move this to a base-class proxy method that calls this function + error_code |= proxy->end_of_step(); + return error_code; } @@ -1311,21 +1322,23 @@ std::istream & colvarmodule::read_restart(std::istream &is) colvarparse::parse_restart); it = it_restart; - std::string restart_version; - int restart_version_int = 0; + restart_version_str.clear(); + restart_version_int = 0; parse->get_keyval(restart_conf, "version", - restart_version, std::string(""), + restart_version_str, std::string(""), colvarparse::parse_restart); - if (restart_version.size()) { - if (restart_version != std::string(COLVARS_VERSION)) { - cvm::log("This state file was generated with version "+ - restart_version+"\n"); - } + if (restart_version_str.size()) { + // Initialize integer version number of this restart file restart_version_int = - proxy->get_version_from_string(restart_version.c_str()); + proxy->get_version_from_string(restart_version_str.c_str()); } - if (restart_version_int < 20160810) { + if (restart_version() != version()) { + cvm::log("This state file was generated with version "+ + restart_version()+"\n"); + } + + if (restart_version_number() < 20160810) { // check for total force change if (proxy->total_forces_enabled()) { warn_total_forces = true; @@ -1769,6 +1782,8 @@ int cvm::read_index_file(char const *filename) cvm::error("Error: in opening index file \""+ std::string(filename)+"\".\n", FILE_ERROR); + } else { + index_file_names.push_back(std::string(filename)); } while (is.good()) { @@ -1861,6 +1876,7 @@ int colvarmodule::reset_index_groups() } index_group_names.clear(); index_groups.clear(); + index_file_names.clear(); return COLVARS_OK; } @@ -1924,48 +1940,75 @@ int cvm::load_coords_xyz(char const *filename, std::string line; cvm::real x = 0.0, y = 0.0, z = 0.0; + std::string const error_msg("Error: cannot parse XYZ file \""+ + std::string(filename)+"\".\n"); + if ( ! (xyz_is >> natoms) ) { - cvm::error("Error: cannot parse XYZ file " - + std::string(filename) + ".\n", INPUT_ERROR); + return cvm::error(error_msg, INPUT_ERROR); } ++xyz_reader_use_count; if (xyz_reader_use_count < 2) { - cvm::log("Warning: beginning from 2019-11-26 the XYZ file reader assumes Angstrom units."); + cvm::log("Warning: beginning from 2019-11-26 the XYZ file reader assumes Angstrom units.\n"); } - // skip comment line - cvm::getline(xyz_is, line); - cvm::getline(xyz_is, line); - xyz_is.width(255); - std::vector::iterator pos_i = pos->begin(); + if (xyz_is.good()) { + // skip comment line + cvm::getline(xyz_is, line); + cvm::getline(xyz_is, line); + xyz_is.width(255); + } else { + return cvm::error(error_msg, INPUT_ERROR); + } + std::vector::iterator pos_i = pos->begin(); + size_t xyz_natoms = 0; if (pos->size() != natoms) { // Use specified indices int next = 0; // indices are zero-based std::vector::const_iterator index = atoms->sorted_ids().begin(); - for ( ; pos_i != pos->end() ; pos_i++, index++) { + for ( ; pos_i != pos->end() ; pos_i++, index++) { while ( next < *index ) { cvm::getline(xyz_is, line); next++; } - xyz_is >> symbol; - xyz_is >> x >> y >> z; - // XYZ files are assumed to be in Angstrom (as eg. VMD will) - (*pos_i)[0] = proxy->angstrom_to_internal(x); - (*pos_i)[1] = proxy->angstrom_to_internal(y); - (*pos_i)[2] = proxy->angstrom_to_internal(z); + if (xyz_is.good()) { + xyz_is >> symbol; + xyz_is >> x >> y >> z; + // XYZ files are assumed to be in Angstrom (as eg. VMD will) + (*pos_i)[0] = proxy->angstrom_to_internal(x); + (*pos_i)[1] = proxy->angstrom_to_internal(y); + (*pos_i)[2] = proxy->angstrom_to_internal(z); + xyz_natoms++; + } else { + return cvm::error(error_msg, INPUT_ERROR); + } } + } else { // Use all positions + for ( ; pos_i != pos->end() ; pos_i++) { - xyz_is >> symbol; - xyz_is >> x >> y >> z; - (*pos_i)[0] = proxy->angstrom_to_internal(x); - (*pos_i)[1] = proxy->angstrom_to_internal(y); - (*pos_i)[2] = proxy->angstrom_to_internal(z); + if (xyz_is.good()) { + xyz_is >> symbol; + xyz_is >> x >> y >> z; + (*pos_i)[0] = proxy->angstrom_to_internal(x); + (*pos_i)[1] = proxy->angstrom_to_internal(y); + (*pos_i)[2] = proxy->angstrom_to_internal(z); + xyz_natoms++; + } else { + return cvm::error(error_msg, INPUT_ERROR); + } } } - return (cvm::get_error() ? COLVARS_ERROR : COLVARS_OK); + + if (xyz_natoms != pos->size()) { + return cvm::error("Error: The number of positions read from file \""+ + std::string(filename)+"\" does not match the number of "+ + "positions required: "+cvm::to_str(xyz_natoms)+" vs. "+ + cvm::to_str(pos->size())+".\n", INPUT_ERROR); + } + + return COLVARS_OK; } diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 1cad4195d6..3d4296a4c9 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -81,6 +81,12 @@ private: public: + /// Get the version string (YYYY-MM-DD format) + std::string version() const + { + return std::string(COLVARS_VERSION); + } + /// Get the version number (higher = more recent) int version_number() const { @@ -150,6 +156,12 @@ public: return ::cos(static_cast(x)); } + /// Reimplemented to work around MS compiler issues + static inline real asin(real const &x) + { + return ::asin(static_cast(x)); + } + /// Reimplemented to work around MS compiler issues static inline real acos(real const &x) { @@ -685,6 +697,9 @@ public: static rvector position_distance(atom_pos const &pos1, atom_pos const &pos2); + /// \brief Names of .ndx files that have been loaded + std::vector index_file_names; + /// \brief Names of groups from one or more Gromacs .ndx files std::vector index_group_names; @@ -758,7 +773,11 @@ protected: /// Write labels at the next iteration bool cv_traj_write_labels; -private: + /// Version of the most recent state file read + std::string restart_version_str; + + /// Integer version of the most recent state file read + int restart_version_int; /// Counter for the current depth in the object hierarchy (useg e.g. in output) size_t depth_s; @@ -771,6 +790,18 @@ private: public: + /// Version of the most recent state file read + inline std::string restart_version() const + { + return restart_version_str; + } + + /// Integer version of the most recent state file read + inline int restart_version_number() const + { + return restart_version_int; + } + /// Get the current object depth in the hierarchy static size_t & depth(); diff --git a/lib/colvars/colvarmodule_utils.h b/lib/colvars/colvarmodule_utils.h new file mode 100644 index 0000000000..a7004edd92 --- /dev/null +++ b/lib/colvars/colvarmodule_utils.h @@ -0,0 +1,80 @@ +// -*- c++ -*- + +// This file is part of the Collective Variables module (Colvars). +// The original version of Colvars and its updates are located at: +// https://github.com/Colvars/colvars +// Please update all Colvars source files before making any changes. +// If you wish to distribute your changes, please submit them to the +// Colvars repository at GitHub. + + +#ifndef COLVARMODULE_UTILS_H +#define COLVARMODULE_UTILS_H + + +#include "colvarmodule.h" + + +template +cvm::real get_force_norm2(T const &x) +{ + return x.norm2(); +} + + +template <> +inline cvm::real get_force_norm2(cvm::real const &x) +{ + return x*x; +} + + +template +cvm::real compute_norm2_stats(std::vector const &v, + int *minmax_index = NULL) +{ + cvm::real result = 0.0; + if (flag == -1) { + // Initialize for minimum search, using approx. largest float32 value + result = 1.0e38; + } + + typename std::vector::const_iterator xi = v.begin(); + size_t i = 0; + + if (get_index) *minmax_index = -1; // Let's not assume minmax_index is initialized to -1 + + for ( ; xi != v.end(); xi++, i++) { + cvm::real const norm2 = get_force_norm2(*xi); + if (flag == 0) { + result += norm2; + } + if (flag == 1) { + if (norm2 > result) { + result = norm2; + if (get_index) *minmax_index = i; + } + } + if (flag == -1) { + if (norm2 < result) { + result = norm2; + if (get_index) *minmax_index = i; + } + } + } + + size_t const n = v.size(); + + if (flag == 0) { + if (n > 0) { + result /= cvm::real(n); + } + } + + result = cvm::sqrt(result); + + return result; +} + + +#endif diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index cbe19c1914..3449a681f3 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -125,6 +125,10 @@ void colvarparse::mark_key_set_user(std::string const &key_str, cvm::log("# "+key_str+" = "+cvm::to_str(value)+"\n", cvm::log_user_params()); } + if (parse_mode & parse_deprecation_warning) { + cvm::log("Warning: keyword "+key_str+ + " is deprecated. Check the documentation for the current equivalent.\n"); + } } @@ -919,6 +923,26 @@ int colvarparse::check_braces(std::string const &conf, return (brace_count != 0) ? INPUT_ERROR : COLVARS_OK; } + +int colvarparse::check_ascii(std::string const &conf) +{ + // Check for non-ASCII characters + std::string line; + std::istringstream is(conf); + while (cvm::getline(is, line)) { + unsigned char const * const uchars = + reinterpret_cast(line.c_str()); + for (size_t i = 0; i < line.size(); i++) { + if (uchars[i] & 0x80U) { + cvm::log("Warning: non-ASCII character detected in this line: \""+ + line+"\".\n"); + } + } + } + return COLVARS_OK; +} + + void colvarparse::split_string(const std::string& data, const std::string& delim, std::vector& dest) { size_t index = 0, new_index = 0; std::string tmpstr; diff --git a/lib/colvars/colvarparse.h b/lib/colvars/colvarparse.h index b7d42fdffa..8e35896f89 100644 --- a/lib/colvars/colvarparse.h +++ b/lib/colvars/colvarparse.h @@ -56,6 +56,8 @@ public: parse_echo = (1<<1), /// Print the default value of a keyword, if it is NOT given parse_echo_default = (1<<2), + /// Print a deprecation warning if the keyword is given + parse_deprecation_warning = (1<<3), /// Do not print the keyword parse_silent = 0, /// Raise error if the keyword is not provided @@ -66,7 +68,9 @@ public: /// The call is being executed from a read_restart() function parse_restart = (1<<18), /// Alias for old default behavior (should be phased out) - parse_normal = (1<<2) | (1<<1) | (1<<17) + parse_normal = (1<<2) | (1<<1) | (1<<17), + /// Settings for a deprecated keyword + parse_deprecated = (1<<1) | (1<<3) | (1<<17) }; /// \brief Check that all the keywords within "conf" are in the list @@ -317,6 +321,10 @@ public: /// from this position static int check_braces(std::string const &conf, size_t const start_pos); + /// \brief Check that a config string contains non-ASCII characters + /// \param conf The configuration string + static int check_ascii(std::string const &conf); + /// \brief Split a string with a specified delimiter into a vector /// \param data The string to be splitted /// \param delim A delimiter diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index 24f833f857..d0f83c70a7 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -24,12 +24,15 @@ #include "colvarproxy.h" #include "colvarscript.h" #include "colvaratoms.h" +#include "colvarmodule_utils.h" colvarproxy_system::colvarproxy_system() { angstrom_value = 0.0; + kcal_mol_value = 0.0; + boundaries_type = boundaries_unsupported; total_force_requested = false; reset_pbc_lattice(); } @@ -38,6 +41,46 @@ colvarproxy_system::colvarproxy_system() colvarproxy_system::~colvarproxy_system() {} +int colvarproxy_system::set_unit_system(std::string const & /* units */, + bool /* check_only */) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +cvm::real colvarproxy_system::backend_angstrom_value() +{ + return 1.0; +} + + +cvm::real colvarproxy_system::boltzmann() +{ + return 0.001987191; +} + + +cvm::real colvarproxy_system::temperature() +{ + // TODO define, document and implement a user method to set the value of this + return 300.0; +} + + +cvm::real colvarproxy_system::dt() +{ + // TODO define, document and implement a user method to set the value of this + return 1.0; +} + + +cvm::real colvarproxy_system::rand_gaussian() +{ + // TODO define, document and implement a user method to set the value of this + return 0.0; +} + + void colvarproxy_system::add_energy(cvm::real /* energy */) {} @@ -139,9 +182,31 @@ int colvarproxy_system::get_molid(int &) } +int colvarproxy_system::get_alch_lambda(cvm::real* lambda) +{ + return cvm::error("Error in get_alch_lambda: alchemical lambda dynamics is not supported by this build.", + COLVARS_NOT_IMPLEMENTED); +} + + +int colvarproxy_system::set_alch_lambda(cvm::real* lambda) +{ + return cvm::error("Error in set_alch_lambda: alchemical lambda dynamics is not supported by this build.", + COLVARS_NOT_IMPLEMENTED); +} + + +int colvarproxy_system::get_dE_dLambda(cvm::real* force) +{ + return cvm::error("Error in get_dE_dLambda: alchemical lambda dynamics is not supported by this build.", + COLVARS_NOT_IMPLEMENTED); +} + colvarproxy_atoms::colvarproxy_atoms() { + atoms_rms_applied_force_ = atoms_max_applied_force_ = 0.0; + atoms_max_applied_force_id_ = -1; updated_masses_ = updated_charges_ = false; } @@ -178,6 +243,18 @@ int colvarproxy_atoms::add_atom_slot(int atom_id) } +int colvarproxy_atoms::init_atom(int /* atom_number */) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +int colvarproxy_atoms::check_atom_id(int /* atom_number */) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + int colvarproxy_atoms::init_atom(cvm::residue_id const & /* residue */, std::string const & /* atom_name */, std::string const & /* segment_id */) @@ -232,8 +309,39 @@ int colvarproxy_atoms::load_coords(char const * /* filename */, } +void colvarproxy_atoms::compute_rms_atoms_applied_force() +{ + atoms_rms_applied_force_ = + compute_norm2_stats(atoms_new_colvar_forces); +} -colvarproxy_atom_groups::colvarproxy_atom_groups() {} + +void colvarproxy_atoms::compute_max_atoms_applied_force() +{ + int minmax_index = -1; + size_t const n_atoms_ids = atoms_ids.size(); + if ((n_atoms_ids > 0) && (n_atoms_ids == atoms_new_colvar_forces.size())) { + atoms_max_applied_force_ = + compute_norm2_stats(atoms_new_colvar_forces, + &minmax_index); + if (minmax_index >= 0) { + atoms_max_applied_force_id_ = atoms_ids[minmax_index]; + } else { + atoms_max_applied_force_id_ = -1; + } + } else { + atoms_max_applied_force_ = + compute_norm2_stats(atoms_new_colvar_forces); + atoms_max_applied_force_id_ = -1; + } +} + + + +colvarproxy_atom_groups::colvarproxy_atom_groups() +{ + atom_groups_rms_applied_force_ = atom_groups_max_applied_force_ = 0.0; +} colvarproxy_atom_groups::~colvarproxy_atom_groups() @@ -296,6 +404,20 @@ void colvarproxy_atom_groups::clear_atom_group(int index) } +void colvarproxy_atom_groups::compute_rms_atom_groups_applied_force() +{ + atom_groups_rms_applied_force_ = + compute_norm2_stats(atom_groups_new_colvar_forces); +} + + +void colvarproxy_atom_groups::compute_max_atom_groups_applied_force() +{ + atom_groups_max_applied_force_ = + compute_norm2_stats(atom_groups_new_colvar_forces); +} + + colvarproxy_smp::colvarproxy_smp() { @@ -464,28 +586,14 @@ int colvarproxy_smp::smp_unlock() colvarproxy_script::colvarproxy_script() { script = NULL; + force_script_defined = false; + have_scripts = false; } colvarproxy_script::~colvarproxy_script() {} -char const *colvarproxy_script::script_obj_to_str(unsigned char *obj) -{ - cvm::error("Error: trying to print a script object without a scripting " - "language interface.\n", BUG_ERROR); - return reinterpret_cast(obj); -} - - -std::vector colvarproxy_script::script_obj_to_str_vector(unsigned char * /* obj */) -{ - cvm::error("Error: trying to print a script object without a scripting " - "language interface.\n", BUG_ERROR); - return std::vector(); -} - - int colvarproxy_script::run_force_callback() { return COLVARS_NOT_IMPLEMENTED; @@ -512,6 +620,7 @@ int colvarproxy_script::run_colvar_gradient_callback(std::string const & /* name colvarproxy_io::colvarproxy_io() { input_buffer_ = NULL; + restart_frequency_engine = 0; } @@ -660,6 +769,23 @@ int colvarproxy::update_output() } +int colvarproxy::end_of_step() +{ + // Disable flags that Colvars doesn't need any more + updated_masses_ = updated_charges_ = false; + + // Compute force statistics + compute_rms_atoms_applied_force(); + compute_max_atoms_applied_force(); + compute_rms_atom_groups_applied_force(); + compute_max_atom_groups_applied_force(); + compute_rms_volmaps_applied_force(); + compute_max_volmaps_applied_force(); + + return COLVARS_OK; +} + + int colvarproxy::post_run() { int error_code = COLVARS_OK; @@ -672,6 +798,19 @@ int colvarproxy::post_run() } +void colvarproxy::log(std::string const &message) +{ + fprintf(stdout, "colvars: %s", message.c_str()); +} + + +void colvarproxy::error(std::string const &message) +{ + // TODO handle errors? + colvarproxy::log(message); +} + + void colvarproxy::add_error_msg(std::string const &message) { std::istringstream is(message); diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 7a60292092..c9841ebdf4 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -59,7 +59,7 @@ public: std::string units; /// \brief Request to set the units used internally by Colvars - virtual int set_unit_system(std::string const &units, bool check_only) = 0; + virtual int set_unit_system(std::string const &units, bool check_only); /// \brief Value of 1 Angstrom in the internal (front-end) Colvars unit for atomic coordinates /// * defaults to 0. in the base class; derived proxy classes must set it @@ -68,7 +68,7 @@ public: cvm::real angstrom_value; /// \brief Value of 1 Angstrom in the backend's unit for atomic coordinates - virtual cvm::real backend_angstrom_value() = 0; + virtual cvm::real backend_angstrom_value(); /// \brief Value of 1 kcal/mol in the internal Colvars unit for energy cvm::real kcal_mol_value; @@ -79,6 +79,12 @@ public: return l * angstrom_value; } + /// \brief Convert a length from internal to Angstrom + inline cvm::real internal_to_angstrom(cvm::real l) const + { + return l / angstrom_value; + } + // /// \brief Convert a length from back-end unit to internal // inline cvm::real back_end_to_internal_unit(cvm::real l) { // if (angstrom_value == 0.) { @@ -88,19 +94,19 @@ public: // } /// \brief Boltzmann constant in internal Colvars units - virtual cvm::real boltzmann() = 0; + virtual cvm::real boltzmann(); /// \brief Target temperature of the simulation (K units) - virtual cvm::real temperature() = 0; + virtual cvm::real temperature(); /// \brief Time step of the simulation (fs) - virtual cvm::real dt() = 0; + virtual cvm::real dt(); /// \brief Pseudo-random number with Gaussian distribution - virtual cvm::real rand_gaussian(void) = 0; + virtual cvm::real rand_gaussian(void); /// Pass restraint energy value for current timestep to MD engine - virtual void add_energy(cvm::real energy) = 0; + virtual void add_energy(cvm::real energy); /// \brief Get the PBC-aware distance vector between two positions virtual cvm::rvector position_distance(cvm::atom_pos const &pos1, @@ -126,6 +132,15 @@ public: /// \param molid Set this argument equal to the current VMD molid virtual int get_molid(int &molid); + /// Get value of alchemical lambda parameter from back-end (if available) + virtual int get_alch_lambda(cvm::real* lambda); + + /// Set value of alchemical lambda parameter in back-end (if available) + virtual int set_alch_lambda(cvm::real* lambda); + + /// Get energy derivative with respect to lambda (if available) + virtual int get_dE_dLambda(cvm::real* force); + protected: /// Whether the total forces have been requested @@ -167,11 +182,11 @@ public: /// Prepare this atom for collective variables calculation, selecting it by /// numeric index (1-based) - virtual int init_atom(int atom_number) = 0; + virtual int init_atom(int atom_number); /// Check that this atom number is valid, but do not initialize the /// corresponding atom yet - virtual int check_atom_id(int atom_number) = 0; + virtual int check_atom_id(int atom_number); /// Select this atom for collective variables calculation, using name and /// residue number. Not all programs support this: leave this function as @@ -262,11 +277,16 @@ public: return cvm::rvector(0.0); } - inline std::vector *modify_atom_ids() + inline std::vector const *get_atom_ids() const { return &atoms_ids; } + inline std::vector const *get_atom_masses() const + { + return &atoms_masses; + } + inline std::vector *modify_atom_masses() { // assume that we are requesting masses to change them @@ -274,6 +294,11 @@ public: return &atoms_masses; } + inline std::vector const *get_atom_charges() + { + return &atoms_charges; + } + inline std::vector *modify_atom_charges() { // assume that we are requesting charges to change them @@ -281,21 +306,60 @@ public: return &atoms_charges; } + inline std::vector const *get_atom_positions() const + { + return &atoms_positions; + } + inline std::vector *modify_atom_positions() { return &atoms_positions; } + inline std::vector const *get_atom_total_forces() const + { + return &atoms_total_forces; + } + inline std::vector *modify_atom_total_forces() { return &atoms_total_forces; } - inline std::vector *modify_atom_new_colvar_forces() + inline std::vector const *get_atom_applied_forces() const { return &atoms_new_colvar_forces; } + inline std::vector *modify_atom_applied_forces() + { + return &atoms_new_colvar_forces; + } + + /// Compute the root-mean-square of the applied forces + void compute_rms_atoms_applied_force(); + + /// Compute the maximum norm among all applied forces + void compute_max_atoms_applied_force(); + + /// Get the root-mean-square of the applied forces + inline cvm::real rms_atoms_applied_force() const + { + return atoms_rms_applied_force_; + } + + /// Get the maximum norm among all applied forces + inline cvm::real max_atoms_applied_force() const + { + return atoms_max_applied_force_; + } + + /// Get the atom ID with the largest applied force + inline int max_atoms_applied_force_id() const + { + return atoms_max_applied_force_id_; + } + /// Record whether masses have been updated inline bool updated_masses() const { @@ -326,6 +390,15 @@ protected: /// \brief Forces applied from colvars, to be communicated to the MD integrator std::vector atoms_new_colvar_forces; + /// Root-mean-square of the applied forces + cvm::real atoms_rms_applied_force_; + + /// Maximum norm among all applied forces + cvm::real atoms_max_applied_force_; + + /// ID of the atom with the maximum norm among all applied forces + int atoms_max_applied_force_id_; + /// Whether the masses and charges have been updated from the host code bool updated_masses_, updated_charges_; @@ -404,6 +477,56 @@ public: return cvm::rvector(0.0); } + inline std::vector const *get_atom_group_ids() const + { + return &atom_groups_ids; + } + + inline std::vector *modify_atom_group_masses() + { + // TODO updated_masses + return &atom_groups_masses; + } + + inline std::vector *modify_atom_group_charges() + { + // TODO updated masses + return &atom_groups_charges; + } + + inline std::vector *modify_atom_group_positions() + { + return &atom_groups_coms; + } + + inline std::vector *modify_atom_group_total_forces() + { + return &atom_groups_total_forces; + } + + inline std::vector *modify_atom_group_applied_forces() + { + return &atom_groups_new_colvar_forces; + } + + /// Compute the root-mean-square of the applied forces + void compute_rms_atom_groups_applied_force(); + + /// Compute the maximum norm among all applied forces + void compute_max_atom_groups_applied_force(); + + /// Get the root-mean-square of the applied forces + inline cvm::real rms_atom_groups_applied_force() const + { + return atom_groups_rms_applied_force_; + } + + /// Get the maximum norm among all applied forces + inline cvm::real max_atom_groups_applied_force() const + { + return atom_groups_max_applied_force_; + } + protected: /// \brief Array of 0-based integers used to uniquely associate atom groups @@ -422,6 +545,12 @@ protected: /// \brief Forces applied from colvars, to be communicated to the MD integrator std::vector atom_groups_new_colvar_forces; + /// Root-mean-square of the applied group forces + cvm::real atom_groups_rms_applied_force_; + + /// Maximum norm among all applied group forces + cvm::real atom_groups_max_applied_force_; + /// Used by all init_atom_group() functions: create a slot for an atom group not requested yet int add_atom_group_slot(int atom_group_id); }; @@ -519,12 +648,6 @@ public: /// Destructor virtual ~colvarproxy_script(); - /// Convert a script object (Tcl or Python call argument) to a C string - virtual char const *script_obj_to_str(unsigned char *obj); - - /// Convert a script object (Tcl or Python call argument) to a vector of strings - virtual std::vector script_obj_to_str_vector(unsigned char *obj); - /// Pointer to the scripting interface object /// (does not need to be allocated in a new interface) colvarscript *script; @@ -706,11 +829,14 @@ public: /// \brief Update data based from the results of a module update (e.g. send forces) virtual int update_output(); + /// Carry out operations needed before next step is run + int end_of_step(); + /// Print a message to the main log - virtual void log(std::string const &message) = 0; + virtual void log(std::string const &message); /// Print a message to the main log and/or let the host code know about it - virtual void error(std::string const &message) = 0; + virtual void error(std::string const &message); /// Record error message (used by VMD to collect them after a script call) void add_error_msg(std::string const &message); diff --git a/lib/colvars/colvarproxy_tcl.cpp b/lib/colvars/colvarproxy_tcl.cpp index a799bead7d..0a5473cae9 100644 --- a/lib/colvars/colvarproxy_tcl.cpp +++ b/lib/colvars/colvarproxy_tcl.cpp @@ -11,6 +11,8 @@ #if defined(NAMD_TCL) || defined(VMDTCL) #define COLVARS_TCL +#endif +#ifdef COLVARS_TCL #include #endif diff --git a/lib/colvars/colvarproxy_tcl.h b/lib/colvars/colvarproxy_tcl.h index 371b3c0224..badb62f900 100644 --- a/lib/colvars/colvarproxy_tcl.h +++ b/lib/colvars/colvarproxy_tcl.h @@ -27,7 +27,7 @@ public: /// Is Tcl available? (trigger initialization if needed) int tcl_available(); - /// Tcl implementation of script_obj_to_str() + /// Get a string representation of the Tcl object pointed to by obj char const *tcl_get_str(void *obj); /// Tcl implementation of run_force_callback() @@ -51,6 +51,12 @@ public: return tcl_interp_; } + /// Set the pointer to the Tcl interpreter + inline void set_tcl_interp(void *interp) + { + tcl_interp_ = interp; + } + protected: /// Pointer to Tcl interpreter object diff --git a/lib/colvars/colvarproxy_volmaps.cpp b/lib/colvars/colvarproxy_volmaps.cpp index fc665eec99..03e5d303d1 100644 --- a/lib/colvars/colvarproxy_volmaps.cpp +++ b/lib/colvars/colvarproxy_volmaps.cpp @@ -9,9 +9,13 @@ #include "colvarmodule.h" #include "colvarproxy_volmaps.h" +#include "colvarmodule_utils.h" -colvarproxy_volmaps::colvarproxy_volmaps() {} +colvarproxy_volmaps::colvarproxy_volmaps() +{ + volmaps_rms_applied_force_ = volmaps_max_applied_force_ = 0.0; +} colvarproxy_volmaps::~colvarproxy_volmaps() {} @@ -46,25 +50,41 @@ int colvarproxy_volmaps::add_volmap_slot(int volmap_id) } -int colvarproxy_volmaps::init_volmap(int volmap_id) +int colvarproxy_volmaps::check_volmap_by_id(int /* volmap_id */) { - return cvm::error("Error: access to volumetric maps is unavailable " - "in this build.\n", + return cvm::error("Error: selecting volumetric maps is not available.\n", COLVARS_NOT_IMPLEMENTED); } -int colvarproxy_volmaps::init_volmap(const char *volmap_name) +int colvarproxy_volmaps::check_volmap_by_name(const char * /* volmap_name */) { - return cvm::error("Error: access to volumetric maps is unavailable " - "in this build.\n", - COLVARS_NOT_IMPLEMENTED); + return cvm::error("Error: selecting volumetric maps by name is not " + "available.\n", COLVARS_NOT_IMPLEMENTED); } -int colvarproxy_volmaps::init_volmap(const std::string &volmap_name) +int colvarproxy_volmaps::init_volmap_by_name(char const *volmap_name) { - return init_volmap(volmap_name.c_str()); + return -1; +} + + +int colvarproxy_volmaps::init_volmap_by_id(int volmap_id) +{ + return -1; +} + + +int colvarproxy_volmaps::init_volmap_by_name(std::string const &volmap_name) +{ + return init_volmap_by_name(volmap_name.c_str()); +} + + +int colvarproxy_volmaps::check_volmap_by_name(std::string const &volmap_name) +{ + return check_volmap_by_name(volmap_name.c_str()); } @@ -79,3 +99,36 @@ void colvarproxy_volmaps::clear_volmap(int index) volmaps_ncopies[index] -= 1; } } + + +int colvarproxy_volmaps::get_volmap_id_from_name(char const *volmap_name) +{ + // Raise error + colvarproxy_volmaps::check_volmap_by_name(volmap_name); + return -1; +} + + +int colvarproxy_volmaps::compute_volmap(int /* flags */, + int /* volmap_id */, + cvm::atom_iter /* atom_begin */, + cvm::atom_iter /* atom_end */, + cvm::real * /* value */, + cvm::real * /* atom_field */) +{ + return COLVARS_NOT_IMPLEMENTED; +} + + +void colvarproxy_volmaps::compute_rms_volmaps_applied_force() +{ + volmaps_rms_applied_force_ = + compute_norm2_stats(volmaps_new_colvar_forces); +} + + +void colvarproxy_volmaps::compute_max_volmaps_applied_force() +{ + volmaps_max_applied_force_ = + compute_norm2_stats(volmaps_new_colvar_forces); +} diff --git a/lib/colvars/colvarproxy_volmaps.h b/lib/colvars/colvarproxy_volmaps.h index 67cbb2cd2d..6e88ee83f9 100644 --- a/lib/colvars/colvarproxy_volmaps.h +++ b/lib/colvars/colvarproxy_volmaps.h @@ -25,17 +25,37 @@ public: int add_volmap_slot(int volmap_id); /// Request and prepare this volumetric map for use by Colvars - virtual int init_volmap(int volmap_id); + /// \param volmap_id Numeric ID used by the MD engine + /// \returns Index of the map in the colvarproxy arrays + virtual int init_volmap_by_id(int volmap_id); /// Request and prepare this volumetric map for use by Colvars - virtual int init_volmap(char const *volmap_name); + /// \param volmap_name Name used by the MD engine + /// \returns Index of the map in the colvarproxy arrays + virtual int init_volmap_by_name(char const *volmap_name); + + /// Check that the given volmap ID is valid (return COLVARS_OK if it is) + /// \param volmap_id Numeric ID used by the MD engine + /// \returns Error code + virtual int check_volmap_by_id(int volmap_id); + + /// Check that the given volmap name is valid (return COLVARS_OK if it is) + /// \param volmap_name Name used by the MD engine + /// \returns Error code + virtual int check_volmap_by_name(char const *volmap_name); /// Request and prepare this volumetric map for use by Colvars - int init_volmap(std::string const &volmap_name); + int init_volmap_by_name(std::string const &volmap_name); + + /// Check that the given volmap name is valid (return COLVARS_OK if it is) + int check_volmap_by_name(std::string const &volmap_name); /// \brief Used by the CVC destructors virtual void clear_volmap(int index); + /// Get the numeric ID of the given volumetric map (for the MD program) + virtual int get_volmap_id_from_name(char const *volmap_name); + /// Get the numeric ID of the given volumetric map (for the MD program) inline int get_volmap_id(int index) const { @@ -54,6 +74,32 @@ public: volmaps_new_colvar_forces[index] += new_force; } + /// Re-weigh an atomic field (e.g. a colvar) by the value of a volumetric map + /// \param flags Combination of flags + /// \param volmap_id Numeric index of the map (no need to request it) + /// \param atom_begin Iterator pointing to first atom + /// \param atom_end Iterator pointing past the last atom + /// \param value Pointer to location of total to increment + /// \param atom_field Array of atomic field values (if NULL, ones are used) + virtual int compute_volmap(int flags, + int volmap_id, + cvm::atom_iter atom_begin, + cvm::atom_iter atom_end, + cvm::real *value, + cvm::real *atom_field); + + /// Flags controlling what computation is done on the map + enum { + volmap_flag_null = 0, + volmap_flag_gradients = 1, + volmap_flag_use_atom_field = (1<<8) + }; + + /// Compute the root-mean-square of the applied forces + void compute_rms_volmaps_applied_force(); + + /// Compute the maximum norm among all applied forces + void compute_max_volmaps_applied_force(); protected: @@ -70,6 +116,12 @@ protected: /// \brief Forces applied from colvars, to be communicated to the MD /// integrator std::vector volmaps_new_colvar_forces; + + /// Root-mean-square of the the applied forces + cvm::real volmaps_rms_applied_force_; + + /// Maximum norm among all applied forces + cvm::real volmaps_max_applied_force_; }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index 33e05d72d1..7847bd4aba 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,3 +1,3 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2020-09-17" +#define COLVARS_VERSION "2021-08-03" #endif diff --git a/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index ebd52b10ad..490ff6e81c 100644 --- a/lib/colvars/colvarscript.cpp +++ b/lib/colvars/colvarscript.cpp @@ -13,6 +13,8 @@ #if defined(NAMD_TCL) || defined(VMDTCL) #define COLVARS_TCL +#endif +#ifdef COLVARS_TCL #include #endif @@ -23,6 +25,19 @@ +#ifdef COLVARS_TCL +/// Run the script API via Tcl command-line interface +/// \param clientData Not used +/// \param my_interp Pointer to Tcl_Interp object (read from Colvars if NULL) +/// \param objc Number of Tcl command parameters +/// \param objv Array of command parameters +/// \return Result of the script command +extern "C" int tcl_run_colvarscript_command(ClientData clientData, + Tcl_Interp *interp_in, + int objc, Tcl_Obj *const objv[]); +#endif + + colvarscript::colvarscript(colvarproxy *p) : proxy_(p), colvars(p->colvars), @@ -57,9 +72,11 @@ int colvarscript::init_commands() } cmd_help.resize(colvarscript::cv_n_commands); + cmd_rethelp.resize(colvarscript::cv_n_commands); cmd_n_args_min.resize(colvarscript::cv_n_commands); cmd_n_args_max.resize(colvarscript::cv_n_commands); cmd_arghelp.resize(colvarscript::cv_n_commands); + cmd_full_help.resize(colvarscript::cv_n_commands); cmd_fns.resize(colvarscript::cv_n_commands); if (cmd_names) { @@ -95,24 +112,60 @@ int colvarscript::init_command(colvarscript::command const &comm, { cmd_str_map[std::string(name)] = comm; cmd_names[comm] = name; - cmd_help[comm] = help; + + // Initialize short help string and return-value help string (if present) + { + std::string const help_str(help); + std::istringstream is(help_str); + std::string line; + std::getline(is, line); + cmd_help[comm] = line; + cmd_rethelp[comm] = ""; + while (std::getline(is, line)) { + cmd_rethelp[comm] += line + "\n"; + } + } + + // Initialize arguments' help strings cmd_n_args_min[comm] = n_args_min; cmd_n_args_max[comm] = n_args_max; - std::string const arghelp_str(arghelp); - std::istringstream is(arghelp_str); - std::string line; - for (int iarg = 0; iarg < n_args_max; iarg++) { - if (! std::getline(is, line)) { - return cvm::error("Error: could not initialize help string for scripting " - "command \""+std::string(name)+"\".\n", BUG_ERROR); + { + std::string const arghelp_str(arghelp); + std::istringstream is(arghelp_str); + std::string line; + for (int iarg = 0; iarg < n_args_max; iarg++) { + if (! std::getline(is, line)) { + return cvm::error("Error: could not initialize help string for scripting " + "command \""+std::string(name)+"\".\n", BUG_ERROR); + } + cmd_arghelp[comm].push_back(line); } - cmd_arghelp[comm].push_back(line); } + + cmd_full_help[comm] = cmd_help[comm]+"\n"; + if (cmd_n_args_min[comm] > 0) { + cmd_full_help[comm] += "\nParameters\n"; + cmd_full_help[comm] += "----------\n\n"; + size_t i; + for (i = 0; i < cmd_n_args_min[comm]; i++) { + cmd_full_help[comm] += cmd_arghelp[comm][i]+"\n"; + } + for (i = cmd_n_args_min[comm]; i < cmd_n_args_max[comm]; i++) { + cmd_full_help[comm] += cmd_arghelp[comm][i]+" (optional)\n"; + } + } + if (cmd_rethelp[comm].size() > 0) { + cmd_full_help[comm] += "\nReturns\n"; + cmd_full_help[comm] += "-------\n\n"; + cmd_full_help[comm] += cmd_rethelp[comm]+"\n"; + } + cmd_fns[comm] = fn; if (cvm::debug()) { cvm::log("Defined command \""+std::string(name)+"\", with help string:\n"); - cvm::log(get_command_help(name)); + cvm::log(get_command_full_help(name)); } + return COLVARS_OK; } @@ -133,27 +186,76 @@ std::string colvarscript::get_cmd_prefix(colvarscript::Object_type t) } -std::string colvarscript::get_command_help(char const *cmd) + +char const *colvarscript::get_command_help(char const *cmd) { if (cmd_str_map.count(cmd) > 0) { colvarscript::command const c = cmd_str_map[std::string(cmd)]; - std::string new_result(cmd_help[c]+"\n"); - if (cmd_n_args_max[c] == 0) return new_result; - new_result += "\nParameters\n"; - new_result += "----------\n\n"; - size_t i; - for (i = 0; i < cmd_n_args_min[c]; i++) { - new_result += cmd_arghelp[c][i]+"\n"; - } - for (i = cmd_n_args_min[c]; i < cmd_n_args_max[c]; i++) { - new_result += cmd_arghelp[c][i]+" (optional)\n"; - } - return new_result; + return cmd_help[c].c_str(); } - cvm::error("Error: command "+std::string(cmd)+ " is not implemented.\n", INPUT_ERROR); - return std::string(""); + return NULL; +} + + +char const *colvarscript::get_command_rethelp(char const *cmd) +{ + if (cmd_str_map.count(cmd) > 0) { + colvarscript::command const c = cmd_str_map[std::string(cmd)]; + return cmd_rethelp[c].c_str(); + } + cvm::error("Error: command "+std::string(cmd)+ + " is not implemented.\n", INPUT_ERROR); + return NULL; +} + + +char const *colvarscript::get_command_arghelp(char const *cmd, int i) +{ + if (cmd_str_map.count(cmd) > 0) { + colvarscript::command const c = cmd_str_map[std::string(cmd)]; + return cmd_arghelp[c][i].c_str(); + } + cvm::error("Error: command "+std::string(cmd)+ + " is not implemented.\n", INPUT_ERROR); + return NULL; +} + + +int colvarscript::get_command_n_args_min(char const *cmd) +{ + if (cmd_str_map.count(cmd) > 0) { + colvarscript::command const c = cmd_str_map[std::string(cmd)]; + return cmd_n_args_min[c]; + } + cvm::error("Error: command "+std::string(cmd)+ + " is not implemented.\n", INPUT_ERROR); + return -1; +} + + +int colvarscript::get_command_n_args_max(char const *cmd) +{ + if (cmd_str_map.count(cmd) > 0) { + colvarscript::command const c = cmd_str_map[std::string(cmd)]; + return cmd_n_args_max[c]; + } + cvm::error("Error: command "+std::string(cmd)+ + " is not implemented.\n", INPUT_ERROR); + return -1; +} + + +char const *colvarscript::get_command_full_help(char const *cmd) +{ + if (cmd_str_map.count(cmd) > 0) { + colvarscript::command const c = cmd_str_map[std::string(cmd)]; + return cmd_full_help[c].c_str(); + } + cvm::error("Error: command "+std::string(cmd)+ + " is not implemented.\n", INPUT_ERROR); + return NULL; } @@ -234,7 +336,7 @@ std::string colvarscript::get_command_cmdline_help(colvarscript::Object_type t, if (cmd_str_map.count(cmdkey) > 0) { command const c = cmd_str_map[cmdkey]; return get_command_cmdline_syntax(t, c)+"\n\n"+ - get_command_help(cmd_names[c]); + get_command_full_help(cmd_names[c]); } cvm::error("Error: could not find scripting command \""+cmd+"\".", INPUT_ERROR); @@ -244,7 +346,7 @@ std::string colvarscript::get_command_cmdline_help(colvarscript::Object_type t, int colvarscript::run(int objc, unsigned char *const objv[]) { - result.clear(); + clear_str_result(); if (cvm::debug()) { cvm::log("Called script run with " + cvm::to_str(objc) + " args:"); @@ -346,6 +448,60 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } +char *colvarscript::obj_to_str(unsigned char *obj) +{ + char *strobj = reinterpret_cast(obj); + if (cvm::debug()) { + cvm::log("Using simple-cast script::obj_to_str(): result = \"" + + (strobj ? std::string(strobj) : std::string("(null)")) + "\""); + } + return strobj; +} + + +std::vector colvarscript::obj_to_str_vector(unsigned char *obj) +{ + if (cvm::debug()) { + cvm::log("Using simple-cast colvarscript::obj_to_str_vector().\n"); + } + + std::vector new_result; + std::string const str(reinterpret_cast(obj)); + + // TODO get rid of this once colvarscript can handle both fix_modify and Tcl? + // LAMMPS has a nicer function in the utils class + + for (size_t i = 0; i < str.length(); i++) { + char const c = str[i]; + if (c == '\"') { + i++; + if (i >= str.length()) { + cvm::error("Error: could not split the following string:\n"+ + str+"\n", INPUT_ERROR); + break; + } + new_result.push_back(std::string("")); + while (str[i] != '\"') { + new_result.back().append(1, str[i]); + if (i >= str.length()) { + cvm::error("Error: could not split the following string:\n"+ + str+"\n", INPUT_ERROR); + break; + } else { + i++; + } + } + } + } + + if (cvm::debug()) { + cvm::log("result = "+cvm::to_str(new_result)+".\n"); + } + + return new_result; +} + + int colvarscript::proc_features(colvardeps *obj, int objc, unsigned char *const objv[]) { @@ -428,9 +584,9 @@ int colvarscript::set_result_str(std::string const &s) { if (cvm::get_error() != COLVARS_OK) { // Avoid overwriting the error message - result += s; + modify_str_result() += s; } else { - result = s; + modify_str_result() = s; } return COLVARS_OK; } @@ -438,17 +594,17 @@ int colvarscript::set_result_str(std::string const &s) void colvarscript::add_error_msg(std::string const &s) { - result += s; + modify_str_result() += s; // Ensure terminating newlines if (s[s.size()-1] != '\n') { - result += "\n"; + modify_str_result() += "\n"; } } int colvarscript::clear_str_result() { - result.clear(); + modify_str_result().clear(); return COLVARS_OK; } @@ -487,32 +643,69 @@ const char * get_colvarscript_result() int tcl_colvars_vmd_init(Tcl_Interp *interp, int molid); #endif -extern "C" -int tcl_run_colvarscript_command(ClientData /* clientData */, - Tcl_Interp *my_interp, - int objc, Tcl_Obj *const objv[]) +#if !defined(VMDTCL) && !defined(NAMD_TCL) +extern "C" { + int Colvars_Init(Tcl_Interp *interp) { + colvarproxy *proxy = new colvarproxy(); + colvarmodule *colvars = new colvarmodule(proxy); + proxy->set_tcl_interp(reinterpret_cast(interp)); + proxy->colvars = colvars; + proxy->script = new colvarscript(proxy); + Tcl_CreateObjCommand(interp, "cv", tcl_run_colvarscript_command, + (ClientData *) NULL, (Tcl_CmdDeleteProc *) NULL); + Tcl_EvalEx(interp, "package provide colvars", -1, 0); + return TCL_OK; + } +} +#endif + + +extern "C" int tcl_run_colvarscript_command(ClientData /* clientData */, + Tcl_Interp *my_interp, + int objc, Tcl_Obj *const objv[]) { colvarmodule *colvars = cvm::main(); if (!colvars) { #if defined(VMDTCL) + + if (objc == 2) { + if (!strcmp(Tcl_GetString(objv[1]), "molid")) { + // return invalid molid + Tcl_SetResult(my_interp, (char *) "-1", TCL_STATIC); + } + if (!strcmp(Tcl_GetString(objv[1]), "delete") || + !strcmp(Tcl_GetString(objv[1]), "reset")) { + // nothing to delete or reset + Tcl_SetResult(my_interp, NULL, TCL_STATIC); + } + if (!strcmp(Tcl_GetString(objv[1]), "help")) { + // print message + Tcl_SetResult(my_interp, + (char *) "First, setup the Colvars module with: " + "cv molid |top", TCL_STATIC); + } + return TCL_OK; + } + if (objc >= 3) { // require a molid to create the module if (!strcmp(Tcl_GetString(objv[1]), "molid")) { - int molid = -1; + int molid = -(1<<16); // This value is used to indicate "top" if (strcmp(Tcl_GetString(objv[2]), "top")) { // If this is not "top", get the integer value Tcl_GetIntFromObj(my_interp, objv[2], &molid); } return tcl_colvars_vmd_init(my_interp, molid); } else { - // TODO allow calling cv help after this - Tcl_SetResult(my_interp, (char *) "Syntax error.", TCL_STATIC); + Tcl_SetResult(my_interp, (char *) "Syntax error. First, setup the Colvars module with cv molid |top", TCL_STATIC); return TCL_ERROR; } } + Tcl_SetResult(my_interp, (char *) "First, setup the Colvars module with: " - "cv molid ", TCL_STATIC); + "cv molid |top", TCL_STATIC); + #else Tcl_SetResult(my_interp, const_cast("Error: Colvars module not yet initialized"), @@ -534,10 +727,19 @@ int tcl_run_colvarscript_command(ClientData /* clientData */, cvm::clear_error(); - int retval = script->run(objc, - reinterpret_cast(objv)); + unsigned char * arg_pointers_[100]; + if (objc > 100) { + std::string const errstr = "Too many positional arguments ("+ + cvm::to_str(objc)+") passed to the \"cv\" command.\n"; + Tcl_SetResult(interp, const_cast(errstr.c_str()), TCL_VOLATILE); + return TCL_ERROR; + } + for (int i = 0; i < objc; i++) { + arg_pointers_[i] = reinterpret_cast(const_cast(proxy->tcl_get_str(objv[i]))); + } + int retval = script->run(objc, arg_pointers_); - std::string result = proxy->get_error_msgs() + script->result; + std::string result = proxy->get_error_msgs() + script->str_result(); Tcl_SetResult(interp, const_cast(result.c_str()), TCL_VOLATILE); @@ -558,3 +760,162 @@ int tcl_run_colvarscript_command(ClientData /* clientData */, } #endif // #if defined(COLVARS_TCL) + + + + +int colvarscript::set_result_text_from_str(std::string const &x_str, + unsigned char *obj) { + if (obj) { + strcpy(reinterpret_cast(obj), x_str.c_str()); + } else { + set_result_str(x_str); + } + return COLVARS_OK; +} + +// Template to convert everything to string and use the above + +template +int colvarscript::set_result_text(T const &x, unsigned char *obj) { + std::string const x_str = x.to_simple_string(); + return set_result_text_from_str(x_str, obj); +} + + +template +int colvarscript::pack_vector_elements_text(std::vector const &x, + std::string &x_str) { + x_str.clear(); + for (size_t i = 0; i < x.size(); ++i) { + if (i > 0) x_str.append(1, ' '); + x_str += cvm::to_str(x[i]); + } + return COLVARS_OK; +} + + +// Specializations for plain old data types that don't have a stringifier member + +template <> +int colvarscript::set_result_text(int const &x, unsigned char *obj) { + std::string const x_str = cvm::to_str(x); + return set_result_text_from_str(x_str, obj); +} + +template <> +int colvarscript::set_result_text(std::vector const &x, + unsigned char *obj) { + std::string x_str(""); + pack_vector_elements_text(x, x_str); + return set_result_text_from_str(x_str, obj); +} + + +template <> +int colvarscript::set_result_text(long int const &x, unsigned char *obj) { + std::string const x_str = cvm::to_str(x); + return set_result_text_from_str(x_str, obj); +} + +template <> +int colvarscript::set_result_text(std::vector const &x, + unsigned char *obj) { + std::string x_str(""); + pack_vector_elements_text(x, x_str); + return set_result_text_from_str(x_str, obj); +} + + +template <> +int colvarscript::set_result_text(cvm::real const &x, unsigned char *obj) { + std::string const x_str = cvm::to_str(x); + return set_result_text_from_str(x_str, obj); +} + +template <> +int colvarscript::set_result_text(std::vector const &x, + unsigned char *obj) { + std::string x_str(""); + pack_vector_elements_text(x, x_str); + return set_result_text_from_str(x_str, obj); +} + + +// TODO these can be removed after the Tcl backend is ready (otherwise, the +// default template syntax may break scripts or the Dashboard) + +template <> +int colvarscript::set_result_text(std::vector const &x, + unsigned char *obj) { + std::string x_str(""); + for (size_t i = 0; i < x.size(); i++) { + if (i > 0) x_str.append(1, ' '); + x_str += "{ "+x[i].to_simple_string()+" }"; + } + return set_result_text_from_str(x_str, obj); +} + +template <> +int colvarscript::set_result_text(std::vector const &x, + unsigned char *obj) { + std::string x_str(""); + for (size_t i = 0; i < x.size(); i++) { + if (i > 0) x_str.append(1, ' '); + x_str += "{ "+x[i].to_simple_string()+" }"; + } + return set_result_text_from_str(x_str, obj); +} + + +// Member functions to set script results for each typexc + +int colvarscript::set_result_int(int const &x, unsigned char *obj) { + return set_result_text(x, obj); +} + +int colvarscript::set_result_int_vec(std::vector const &x, + unsigned char *obj) { + return set_result_text< std::vector >(x, obj); +} + + +int colvarscript::set_result_long_int(long int const &x, unsigned char *obj) { + return set_result_text(x, obj); +} + +int colvarscript::set_result_long_int_vec(std::vector const &x, + unsigned char *obj) { + return set_result_text< std::vector >(x, obj); +} + + +int colvarscript::set_result_real(cvm::real const &x, unsigned char *obj) { + return set_result_text(x, obj); +} + +int colvarscript::set_result_real_vec(std::vector const &x, + unsigned char *obj) { + return set_result_text< std::vector >(x, obj); +} + + +int colvarscript::set_result_rvector(cvm::rvector const &x, unsigned char *obj) { + return set_result_text(x, obj); +} + +int colvarscript::set_result_rvector_vec(std::vector const &x, + unsigned char *obj) { + return set_result_text< std::vector >(x, obj); +} + + +int colvarscript::set_result_colvarvalue(colvarvalue const &x, + unsigned char *obj) { + return set_result_text(x, obj); +} + +int colvarscript::set_result_colvarvalue_vec(std::vector const &x, + unsigned char *obj) { + return set_result_text< std::vector >(x, obj); +} diff --git a/lib/colvars/colvarscript.h b/lib/colvars/colvarscript.h index d6f77668e6..7eac15c09d 100644 --- a/lib/colvars/colvarscript.h +++ b/lib/colvars/colvarscript.h @@ -46,9 +46,8 @@ public: /// COLVARSCRIPT_ERROR int proxy_error; - /// If an error is returned by one of the methods, it should set this to the - /// error message - std::string result; + /// String representation of the result of a script call + std::string str_result_; /// Run a script command with space-separated positional arguments (objects) int run(int objc, unsigned char *const objv[]); @@ -56,13 +55,13 @@ public: /// Get the string result of the current scripting call inline std::string const &str_result() const { - return result; + return str_result_; } /// Modify the string result of the current scripting call inline std::string &modify_str_result() { - return result; + return str_result_; } /// Set the return value to the given string @@ -137,21 +136,38 @@ public: template int cmd_arg_shift(); - /// Use scripting language to get the string representation of an object - inline char const *obj_to_str(unsigned char *const obj) - { - return (obj == NULL ? NULL : proxy_->script_obj_to_str(obj)); - } - /// Get names of all commands inline char const **get_command_names() const { return cmd_names; } + /// Get one-line help summary for a command + /// \param cmd Name of the command's function (e.g. "cv_units") + char const *get_command_help(char const *cmd); + + /// Get description of the return value of a command + /// \param cmd Name of the command's function (e.g. "cv_units") + char const *get_command_rethelp(char const *cmd); + + /// Get description of the argument of a command (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + /// \param i Index of the argument; 0 is the first argument after the + /// prefix, e.g. "value" has an index of 0 in the array of arguments: + /// { "cv", "colvar", "xi", "value" } + char const *get_command_arghelp(char const *cmd, int i); + + /// Get number of required arguments (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + int get_command_n_args_min(char const *cmd); + + /// Get number of total arguments (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + int get_command_n_args_max(char const *cmd); + /// Get help string for a command (does not specify how it is launched) /// \param cmd Name of the command's function (e.g. "cv_units") - std::string get_command_help(char const *cmd); + char const *get_command_full_help(char const *cmd); /// Get summary of command line syntax for all commands of a given context /// \param t One of use_module, use_colvar or use_bias @@ -182,6 +198,53 @@ public: return this->proxy_; } + // Input functions - get the string reps of script argument objects + + /// Get the string representation of an object (by default, a simple cast) + char *obj_to_str(unsigned char *obj); + + /// Get a list of strings from an object (does not work with a simple cast) + std::vector obj_to_str_vector(unsigned char *obj); + + + // Output functions - convert internal objects to representations suitable + // for use in the scripting language. At the moment only conversion to C + // strings is supported, and obj is assumed to be a char * pointer. + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_int(int const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_int_vec(std::vector const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_long_int(long int const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_long_int_vec(std::vector const &x, + unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_real(cvm::real const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_real_vec(std::vector const &x, + unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_rvector(cvm::rvector const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_rvector_vec(std::vector const &x, + unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_colvarvalue(colvarvalue const &x, unsigned char *obj = NULL); + + /// Copy x into obj if not NULL, or into the script object's result otherwise + int set_result_colvarvalue_vec(std::vector const &x, + unsigned char *obj = NULL); + private: /// Set up all script API functions @@ -193,14 +256,6 @@ private: int n_args_min, int n_args_max, char const *arghelp, int (*fn)(void *, int, unsigned char * const *)); - /// Execute a script command - inline int exec_command(command c, - void *pobj, - int objc, unsigned char * const *objv) - { - return (*(cmd_fns[c]))(pobj, objc, objv); - } - public: // TODO this function will be removed soon /// Run subcommands on base colvardeps object (colvar, bias, ...) @@ -218,6 +273,9 @@ private: // TODO /// Help strings for each command std::vector cmd_help; + /// Description of the return values of each command (may be empty) + std::vector cmd_rethelp; + /// Minimum number of arguments for each command std::vector cmd_n_args_min; @@ -227,6 +285,9 @@ private: // TODO /// Help strings for each command argument std::vector< std::vector > cmd_arghelp; + /// Full help strings for each command + std::vector cmd_full_help; + /// Implementations of each command std::vector cmd_fns; @@ -241,6 +302,18 @@ private: // TODO return NULL; } + /// Set obj equal to x, using its string representation + template + int set_result_text(T const &x, unsigned char *obj); + + /// Code reused by instances of set_result_text() + template + int pack_vector_elements_text(std::vector const &x, std::string &x_str); + + /// Code reused by all instances of set_result_text() + int set_result_text_from_str(std::string const &x_str, unsigned char *obj); + + }; @@ -305,13 +378,15 @@ int colvarscript::check_cmd_nargs(char const *cmd, { int const shift = cmd_arg_shift(); if (objc < shift+n_args_min) { - add_error_msg("Missing arguments for script function \""+std::string(cmd)+ - "\":\n"+get_command_help(cmd)); + add_error_msg("Insufficient number of arguments ("+cvm::to_str(objc)+ + ") for script function \""+std::string(cmd)+ + "\":\n"+get_command_full_help(cmd)); return COLVARSCRIPT_ERROR; } if (objc > shift+n_args_max) { - add_error_msg("Too many arguments for script function \""+std::string(cmd)+ - "\":\n"+get_command_help(cmd)); + add_error_msg("Too many arguments ("+cvm::to_str(objc)+ + ") for script function \""+std::string(cmd)+ + "\":\n"+get_command_full_help(cmd)); return COLVARSCRIPT_ERROR; } return COLVARSCRIPT_OK; @@ -364,18 +439,6 @@ int colvarscript::cmd_arg_shift() extern "C" { -#if defined(COLVARS_TCL) - /// Run the script API via Tcl command-line interface - /// \param clientData Not used - /// \param my_interp Pointer to Tcl_Interp object (read from Colvars if NULL) - /// \param objc Number of Tcl command parameters - /// \param objv Array of command parameters - /// \return Result of the script command - int tcl_run_colvarscript_command(ClientData clientData, - Tcl_Interp *interp_in, - int objc, Tcl_Obj *const objv[]); -#endif // #if defined(COLVARS_TCL) - /// Generic wrapper for string-based scripting int run_colvarscript_command(int objc, unsigned char *const objv[]); diff --git a/lib/colvars/colvarscript_commands.cpp b/lib/colvars/colvarscript_commands.cpp index c74663d2fd..0029979912 100644 --- a/lib/colvars/colvarscript_commands.cpp +++ b/lib/colvars/colvarscript_commands.cpp @@ -33,6 +33,54 @@ char const **cvscript_command_names() } +extern "C" +char const *cvscript_command_help(char const *c) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_help(c); +} + + +extern "C" +char const *cvscript_command_rethelp(char const *c) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_rethelp(c); +} + + +extern "C" +char const *cvscript_command_arghelp(char const *c, int i) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_arghelp(c, i); +} + + +extern "C" +char const *cvscript_command_full_help(char const *c) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_full_help(c); +} + + +extern "C" +int cvscript_command_n_args_min(char const *c) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_n_args_min(c); +} + + +extern "C" +int cvscript_command_n_args_max(char const *c) +{ + colvarscript *script = colvarscript_obj(); + return script->get_command_n_args_max(c); +} + + // Instantiate the body of all script commands #define CVSCRIPT_COMM_FN(COMM,N_ARGS_MIN,N_ARGS_MAX,ARGS,FN_BODY) \ diff --git a/lib/colvars/colvarscript_commands.h b/lib/colvars/colvarscript_commands.h index d90a3ac422..021aae1cc6 100644 --- a/lib/colvars/colvarscript_commands.h +++ b/lib/colvars/colvarscript_commands.h @@ -25,7 +25,8 @@ // COMM = the id of the command (must be a member of colvarscript::command) -// HELP = a one-line description (C string literal) for the command +// HELP = short description (C string literal) for the command; the second line +// is optional, and documents the return value (if any) // N_ARGS_MIN = the lowest number of arguments allowed @@ -68,6 +69,33 @@ extern "C" { /// Get the names of all commands (array of strings) char const ** cvscript_command_names(); + /// Get the help summary of the given command + /// \param cmd Name of the command's function (e.g. "cv_units") + char const *cvscript_command_help(char const *cmd); + + /// Get description of the return value of a command + /// \param cmd Name of the command's function (e.g. "cv_units") + char const *cvscript_command_rethelp(char const *cmd); + + /// Get description of the arguments of a command (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + /// \param i Index of the argument; 0 is the first argument after the + /// prefix, e.g. "value" has an index of 0 in the array of arguments: + /// { "cv", "colvar", "xi", "value" } + char const *cvscript_command_arghelp(char const *cmd, int i); + + /// Get the full help string of a command + /// \param cmd Name of the command's function (e.g. "cv_units") + char const *cvscript_command_full_help(char const *cmd); + + /// Get number of required arguments (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + int cvscript_command_n_args_min(char const *cmd); + + /// Get number of total arguments (excluding prefix) + /// \param cmd Name of the command's function (e.g. "cv_units") + int cvscript_command_n_args_max(char const *cmd); + } #endif @@ -135,7 +163,8 @@ CVSCRIPT(cv_delete, ) CVSCRIPT(cv_frame, - "Get or set current frame number (VMD only)", + "Get or set current frame number (VMD only)\n" + "frame : integer - Frame number", 0, 1, "frame : integer - Frame number", char const *arg = @@ -143,7 +172,7 @@ CVSCRIPT(cv_frame, if (arg == NULL) { long int f = -1; if (script->proxy()->get_frame(f) == COLVARS_OK) { - script->set_result_str(cvm::to_str(f)); + script->set_result_long_int(f); return COLVARS_OK; } else { script->add_error_msg("Frame number is not available"); @@ -161,8 +190,90 @@ CVSCRIPT(cv_frame, return COLVARS_OK; ) +CVSCRIPT(cv_getatomappliedforces, + "Get the list of forces applied by Colvars to atoms\n" + "forces : array of arrays of floats - Atomic forces", + 0, 0, + "", + script->set_result_rvector_vec(*(script->proxy()->get_atom_applied_forces())); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomappliedforcesmax, + "Get the maximum norm of forces applied by Colvars to atoms\n" + "force : float - Maximum atomic force", + 0, 0, + "", + script->set_result_real(script->proxy()->max_atoms_applied_force()); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomappliedforcesmaxid, + "Get the atom ID with the largest applied force\n" + "id : int - ID of the atom with the maximum atomic force", + 0, 0, + "", + script->set_result_int(script->proxy()->max_atoms_applied_force_id()); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomappliedforcesrms, + "Get the root-mean-square norm of forces applied by Colvars to atoms\n" + "force : float - RMS atomic force", + 0, 0, + "", + script->set_result_real(script->proxy()->rms_atoms_applied_force()); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomids, + "Get the list of indices of atoms used in Colvars\n" + "indices : array of ints - Atomic indices", + 0, 0, + "", + script->set_result_int_vec(*(script->proxy()->get_atom_ids())); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomcharges, + "Get the list of charges of atoms used in Colvars\n" + "charges : array of floats - Atomic charges", + 0, 0, + "", + script->set_result_real_vec(*(script->proxy()->get_atom_charges())); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatommasses, + "Get the list of masses of atoms used in Colvars\n" + "masses : array of floats - Atomic masses", + 0, 0, + "", + script->set_result_real_vec(*(script->proxy()->get_atom_masses())); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatompositions, + "Get the list of cached positions of atoms used in Colvars\n" + "positions : array of arrays of floats - Atomic positions", + 0, 0, + "", + script->set_result_rvector_vec(*(script->proxy()->get_atom_positions())); + return COLVARS_OK; + ) + +CVSCRIPT(cv_getatomtotalforces, + "Get the list of cached total forces of atoms used in Colvars\n" + "forces : array of arrays of floats - Atomic total foces", + 0, 0, + "", + script->set_result_rvector_vec(*(script->proxy()->get_atom_total_forces())); + return COLVARS_OK; + ) + CVSCRIPT(cv_getconfig, - "Get the module's configuration string read so far", + "Get the module's configuration string read so far\n" + "conf : string - Current configuration string", 0, 0, "", script->set_result_str(cvm::main()->get_config()); @@ -170,15 +281,17 @@ CVSCRIPT(cv_getconfig, ) CVSCRIPT(cv_getenergy, - "Get the current Colvars energy", + "Get the current Colvars energy\n" + "E : float - Amount of energy (internal units)", 0, 0, "", - script->set_result_str(cvm::to_str(cvm::main()->total_bias_energy)); + script->set_result_real(cvm::main()->total_bias_energy); return COLVARS_OK; ) CVSCRIPT(cv_help, - "Get the help string of the Colvars scripting interface", + "Get the help string of the Colvars scripting interface\n" + "help : string - Help string", 0, 1, "command : string - Get the help string of this specific command", unsigned char *const cmdobj = @@ -205,7 +318,8 @@ CVSCRIPT(cv_help, ) CVSCRIPT(cv_list, - "Return a list of all variables or biases", + "Return a list of all variables or biases\n" + "list : sequence of strings - List of elements", 0, 1, "param : string - \"colvars\" or \"biases\"; default is \"colvars\"", std::string res; @@ -235,7 +349,8 @@ CVSCRIPT(cv_list, ) CVSCRIPT(cv_listcommands, - "Get the list of script functions, prefixed with \"cv_\", \"colvar_\" or \"bias_\"", + "Get the list of script functions, prefixed with \"cv_\", \"colvar_\" or \"bias_\"\n" + "list : sequence of strings - List of commands", 0, 0, "", int const n_commands = cvscript_n_commands(); @@ -249,6 +364,20 @@ CVSCRIPT(cv_listcommands, return COLVARS_OK; ) +CVSCRIPT(cv_listindexfiles, + "Get a list of the index files loaded in this session", + 0, 0, + "", + int const n_files = script->module()->index_file_names.size(); + std::string result; + for (int i = 0; i < n_files; i++) { + if (i > 0) result.append(1, ' '); + result.append(script->module()->index_file_names[i]); + } + script->set_result_str(result); + return COLVARS_OK; + ) + CVSCRIPT(cv_load, "Load data from a state file into all matching colvars and biases", 1, 1, @@ -280,15 +409,16 @@ CVSCRIPT(cv_loadfromstring, ) CVSCRIPT(cv_molid, - "Get or set the molecule ID on which Colvars is defined (VMD only)", + "Get or set the molecule ID on which Colvars is defined (VMD only)\n" + "molid : integer - Current molecule ID", 0, 1, - "molid : integer - Molecule ID; -1 means undefined", + "molid : integer - New molecule ID; -1 means undefined", char const *arg = script->obj_to_str(script->get_module_cmd_arg(0, objc, objv)); if (arg == NULL) { int molid = -1; script->proxy()->get_molid(molid); - script->set_result_str(cvm::to_str(molid)); + script->set_result_int(molid); return COLVARS_OK; } else { script->add_error_msg("Error: To change the molecule ID in VMD, use cv delete first."); @@ -297,7 +427,8 @@ CVSCRIPT(cv_molid, ) CVSCRIPT(cv_printframe, - "Return the values that would be written to colvars.traj", + "Return the values that would be written to colvars.traj\n" + "values : string - The values\n", 0, 0, "", std::ostringstream os; @@ -307,7 +438,8 @@ CVSCRIPT(cv_printframe, ) CVSCRIPT(cv_printframelabels, - "Return the labels that would be written to colvars.traj", + "Return the labels that would be written to colvars.traj\n" + "Labels : string - The labels", 0, 0, "", std::ostringstream os; @@ -348,14 +480,16 @@ CVSCRIPT(cv_save, ) CVSCRIPT(cv_savetostring, - "Write the Colvars state to a string and return it", + "Write the Colvars state to a string and return it\n" + "state : string - The saved state", 0, 0, "", return script->module()->write_restart_string(script->modify_str_result()); ) CVSCRIPT(cv_units, - "Get or set the current Colvars unit system", + "Get or set the current Colvars unit system\n" + "units : string - The current unit system", 0, 1, "units : string - The new unit system", char const *argstr = @@ -390,7 +524,8 @@ CVSCRIPT(cv_update, ) CVSCRIPT(cv_version, - "Get the Colvars Module version number", + "Get the Colvars Module version number\n" + "version : string - Colvars version", 0, 0, "", script->set_result_str(COLVARS_VERSION); diff --git a/lib/colvars/colvarscript_commands_bias.h b/lib/colvars/colvarscript_commands_bias.h index 990902e239..f83b3422ff 100644 --- a/lib/colvars/colvarscript_commands_bias.h +++ b/lib/colvars/colvarscript_commands_bias.h @@ -9,15 +9,17 @@ CVSCRIPT(bias_bin, - "Get the current grid bin index (1D ABF only for now)", + "Get the current grid bin index (1D ABF only for now)\n" + "bin : integer - Bin index", 0, 0, "", - script->set_result_str(cvm::to_str(this_bias->current_bin())); + script->set_result_int(this_bias->current_bin()); return COLVARS_OK; ) CVSCRIPT(bias_bincount, - "Get the number of samples at the given grid bin (1D ABF only for now)", + "Get the number of samples at the given grid bin (1D ABF only for now)\n" + "samples : integer - Number of samples", 0, 1, "index : integer - Grid index; defaults to current bin", int index = this_bias->current_bin(); @@ -30,12 +32,13 @@ CVSCRIPT(bias_bincount, return COLVARSCRIPT_ERROR; } } - script->set_result_str(cvm::to_str(this_bias->bin_count(index))); + script->set_result_int(this_bias->bin_count(index)); return COLVARS_OK; ) CVSCRIPT(bias_binnum, - "Get the total number of grid points of this bias (1D ABF only for now)", + "Get the total number of grid points of this bias (1D ABF only for now)\n" + "Bins : integer - Number of grid points", 0, 0, "", int r = this_bias->bin_num(); @@ -44,7 +47,7 @@ CVSCRIPT(bias_binnum, this_bias->name); return COLVARSCRIPT_ERROR; } - script->set_result_str(cvm::to_str(r)); + script->set_result_int(r); return COLVARS_OK; ) @@ -57,22 +60,25 @@ CVSCRIPT(bias_delete, ) CVSCRIPT(bias_energy, - "Get the current energy of this bias", + "Get the current energy of this bias\n" + "E : float - Energy value", 0, 0, "", - script->set_result_str(cvm::to_str(this_bias->get_energy())); + script->set_result_real(this_bias->get_energy()); return COLVARS_OK; ) CVSCRIPT(bias_get, - "Get the value of the given feature for this bias", + "Get the value of the given feature for this bias\n" + "state : 1/0 - State of the given feature", 1, 1, "feature : string - Name of the feature", return script->proc_features(this_bias, objc, objv); ) CVSCRIPT(bias_getconfig, - "Return the configuration string of this bias", + "Return the configuration string of this bias\n" + "conf : string - Current configuration string", 0, 0, "", script->set_result_str(this_bias->get_config()); @@ -80,7 +86,8 @@ CVSCRIPT(bias_getconfig, ) CVSCRIPT(bias_help, - "Get a help summary or the help string of one bias subcommand", + "Get a help summary or the help string of one bias subcommand\n" + "help : string - Help string", 0, 1, "command : string - Get the help string of this specific command", unsigned char *const cmdobj = @@ -129,7 +136,8 @@ CVSCRIPT(bias_save, ) CVSCRIPT(bias_savetostring, - "Save data from this bias into a string and return it", + "Save data from this bias into a string and return it\n" + "state : string - The bias state", 0, 0, "", return this_bias->write_state_string(script->modify_str_result()); @@ -156,7 +164,8 @@ CVSCRIPT(bias_share, ) CVSCRIPT(bias_state, - "Print a string representation of the feature state of this bias", + "Print a string representation of the feature state of this bias\n" + "state : string - String representation of the bias features", 0, 0, "", this_bias->print_state(); @@ -164,10 +173,11 @@ CVSCRIPT(bias_state, ) CVSCRIPT(bias_update, - "Recompute this bias and return its up-to-date energy", + "Recompute this bias and return its up-to-date energy\n" + "E : float - Energy value", 0, 0, "", this_bias->update(); - script->set_result_str(cvm::to_str(this_bias->get_energy())); + script->set_result_colvarvalue(this_bias->get_energy()); return COLVARS_OK; ) diff --git a/lib/colvars/colvarscript_commands_colvar.h b/lib/colvars/colvarscript_commands_colvar.h index b880b5b8be..7c4c2d67f7 100644 --- a/lib/colvars/colvarscript_commands_colvar.h +++ b/lib/colvars/colvarscript_commands_colvar.h @@ -9,7 +9,8 @@ CVSCRIPT(colvar_addforce, - "Apply the given force onto this colvar and return the same", + "Apply the given force onto this colvar and return the same\n" + "force : float or array - Applied force; matches colvar dimensionality", 1, 1, "force : float or array - Applied force; must match colvar dimensionality", std::string const f_str(script->obj_to_str(script->get_colvar_cmd_arg(0, objc, objv))); @@ -23,7 +24,7 @@ CVSCRIPT(colvar_addforce, return COLVARSCRIPT_ERROR; } this_colvar->add_bias_force(force); - script->set_result_str(force.to_simple_string()); + script->set_result_colvarvalue(force); return COLVARS_OK; ) @@ -56,22 +57,25 @@ CVSCRIPT(colvar_delete, ) CVSCRIPT(colvar_get, - "Get the value of the given feature for this colvar", + "Get the value of the given feature for this colvar\n" + "state : 1/0 - State of the given feature", 1, 1, "feature : string - Name of the feature", return script->proc_features(this_colvar, objc, objv); ) CVSCRIPT(colvar_getappliedforce, - "Return the total of the forces applied to this colvar", + "Return the total of the forces applied to this colvar\n" + "force : float - Applied force; matches the colvar dimensionality", 0, 0, "", - script->set_result_str((this_colvar->applied_force()).to_simple_string()); + script->set_result_colvarvalue(this_colvar->applied_force()); return COLVARS_OK; ) CVSCRIPT(colvar_getatomgroups, - "Return the atom indices used by this colvar as a list of lists", + "Return the atom indices used by this colvar as a list of lists\n" + "groups : array of arrays of ints - Atom indices", 0, 0, "", std::string result; @@ -91,21 +95,17 @@ CVSCRIPT(colvar_getatomgroups, ) CVSCRIPT(colvar_getatomids, - "Return the list of atom indices used by this colvar", + "Return the list of atom indices used by this colvar\n" + "indices : array of ints - Atom indices", 0, 0, "", - std::string result; - std::vector::iterator li = this_colvar->atom_ids.begin(); - for ( ; li != this_colvar->atom_ids.end(); ++li) { - result += cvm::to_str(*li); - result += " "; - } - script->set_result_str(result); + script->set_result_int_vec(this_colvar->atom_ids); return COLVARS_OK; ) CVSCRIPT(colvar_getconfig, - "Return the configuration string of this colvar", + "Return the configuration string of this colvar\n" + "conf : string - Current configuration string", 0, 0, "", script->set_result_str(this_colvar->get_config()); @@ -113,35 +113,34 @@ CVSCRIPT(colvar_getconfig, ) CVSCRIPT(colvar_getgradients, - "Return the atomic gradients of this colvar", + "Return the atomic gradients of this colvar\n" + "gradients : array of arrays of floats - Atomic gradients", 0, 0, "", - std::string result; - std::vector::iterator li = - this_colvar->atomic_gradients.begin(); - for ( ; li != this_colvar->atomic_gradients.end(); ++li) { - result += "{"; - int j; - for (j = 0; j < 3; ++j) { - result += cvm::to_str((*li)[j]); - result += " "; - } - result += "} "; - } - script->set_result_str(result); + script->set_result_rvector_vec(this_colvar->atomic_gradients); return COLVARS_OK; ) CVSCRIPT(colvar_gettotalforce, - "Return the sum of internal and external forces to this colvar", + "Return the sum of internal and external forces to this colvar\n" + "force : float - Total force; matches the colvar dimensionality", 0, 0, "", - script->set_result_str((this_colvar->total_force()).to_simple_string()); + script->set_result_colvarvalue(this_colvar->total_force()); + return COLVARS_OK; + ) + +CVSCRIPT(colvar_getvolmapids, + "Return the list of volumetric map indices used by this colvar", + 0, 0, + "", + script->set_result_int_vec(this_colvar->get_volmap_ids()); return COLVARS_OK; ) CVSCRIPT(colvar_help, - "Get a help summary or the help string of one colvar subcommand", + "Get a help summary or the help string of one colvar subcommand\n" + "help : string - Help string", 0, 1, "command : string - Get the help string of this specific command", unsigned char *const cmdobj = @@ -167,7 +166,7 @@ CVSCRIPT(colvar_modifycvcs, "Modify configuration of individual components by passing string arguments", 1, 1, "confs : sequence of strings - New configurations; empty strings are skipped", - std::vector const confs(script->proxy()->script_obj_to_str_vector(script->get_colvar_cmd_arg(0, objc, objv))); + std::vector const confs(script->obj_to_str_vector(script->get_colvar_cmd_arg(0, objc, objv))); cvm::increase_depth(); int res = this_colvar->update_cvc_config(confs); cvm::decrease_depth(); @@ -180,10 +179,11 @@ CVSCRIPT(colvar_modifycvcs, ) CVSCRIPT(colvar_run_ave, - "Get the current running average of the value of this colvar", + "Get the current running average of the value of this colvar\n" + "value : float or array - Averaged value; matches the colvar dimensionality", 0, 0, "", - script->set_result_str(this_colvar->run_ave().to_simple_string()); + script->set_result_colvarvalue(this_colvar->run_ave()); return COLVARS_OK; ) @@ -196,7 +196,8 @@ CVSCRIPT(colvar_set, ) CVSCRIPT(colvar_state, - "Print a string representation of the feature state of this colvar", + "Print a string representation of the feature state of this colvar\n" + "state : string - The feature state", 0, 0, "", this_colvar->print_state(); @@ -204,7 +205,8 @@ CVSCRIPT(colvar_state, ) CVSCRIPT(colvar_type, - "Get the type description of this colvar", + "Get the type description of this colvar\n" + "type : string - Type description", 0, 0, "", script->set_result_str(this_colvar->value().type_desc(this_colvar->value().value_type)); @@ -212,25 +214,28 @@ CVSCRIPT(colvar_type, ) CVSCRIPT(colvar_update, - "Recompute this colvar and return its up-to-date value", + "Recompute this colvar and return its up-to-date value\n" + "value : float or array - Current value; matches the colvar dimensionality", 0, 0, "", this_colvar->calc(); this_colvar->update_forces_energy(); - script->set_result_str((this_colvar->value()).to_simple_string()); + script->set_result_colvarvalue(this_colvar->value()); return COLVARS_OK; ) CVSCRIPT(colvar_value, - "Get the current value of this colvar", + "Get the current value of this colvar\n" + "value : float or array - Current value; matches the colvar dimensionality", 0, 0, "", - script->set_result_str(this_colvar->value().to_simple_string()); + script->set_result_colvarvalue(this_colvar->value()); return COLVARS_OK; ) CVSCRIPT(colvar_width, - "Get the width of this colvar", + "Get the width of this colvar\n" + "width : float - Value of the width", 0, 0, "", script->set_result_str(cvm::to_str(this_colvar->width, 0, diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp index 3cbaed63a8..4117a7a68f 100644 --- a/lib/colvars/colvartypes.cpp +++ b/lib/colvars/colvartypes.cpp @@ -256,6 +256,7 @@ namespace { colvarmodule::rotation::rotation() { b_debug_gradients = false; + lambda = 0.0; #ifdef COLVARS_LAMMPS jacobi = new_Jacobi_solver(4); #else @@ -268,6 +269,7 @@ colvarmodule::rotation::rotation(cvm::quaternion const &qi) : q(qi) { b_debug_gradients = false; + lambda = 0.0; #ifdef COLVARS_LAMMPS jacobi = new_Jacobi_solver(4); #else @@ -283,6 +285,7 @@ colvarmodule::rotation::rotation(cvm::real angle, cvm::rvector const &axis) cvm::real const sina = cvm::sin(angle/2.0); q = cvm::quaternion(cvm::cos(angle/2.0), sina * axis_n.x, sina * axis_n.y, sina * axis_n.z); + lambda = 0.0; #ifdef COLVARS_LAMMPS jacobi = new_Jacobi_solver(4); #else diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index 7ab617bc44..24a2790f6e 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -224,7 +224,7 @@ void colvarvalue::is_derivative() colvarvalue::colvarvalue(colvarvalue const &x) - : value_type(x.type()) + : value_type(x.type()), real_value(0.0) { switch (x.type()) { case type_scalar: @@ -252,6 +252,7 @@ colvarvalue::colvarvalue(colvarvalue const &x) colvarvalue::colvarvalue(cvm::vector1d const &v, Type vti) + : real_value(0.0) { if ((vti != type_vector) && (v.size() != num_dimensions(vti))) { cvm::error("Error: trying to initialize a variable of type \""+type_desc(vti)+ @@ -579,16 +580,7 @@ colvarvalue colvarvalue::dist2_grad(colvarvalue const &x2) const cvm::rvector const &v1 = this->rvector_value; cvm::rvector const &v2 = x2.rvector_value; cvm::real const cos_t = v1 * v2; - cvm::real const sin_t = cvm::sqrt(1.0 - cos_t*cos_t); - return colvarvalue( 2.0 * sin_t * - cvm::rvector((-1.0) * sin_t * v2.x + - cos_t/sin_t * (v1.x - cos_t*v2.x), - (-1.0) * sin_t * v2.y + - cos_t/sin_t * (v1.y - cos_t*v2.y), - (-1.0) * sin_t * v2.z + - cos_t/sin_t * (v1.z - cos_t*v2.z) - ), - colvarvalue::type_unit3vectorderiv ); + return colvarvalue(2.0 * (cos_t * v1 - v2), colvarvalue::type_unit3vectorderiv); } case colvarvalue::type_quaternion: case colvarvalue::type_quaternionderiv: diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index ca367dd43f..3f26c35df4 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -124,7 +124,7 @@ public: /// Constructor from a type specification inline colvarvalue(Type const &vti) - : value_type(vti) + : value_type(vti), real_value(0.0) { reset(); } @@ -138,12 +138,12 @@ public: /// by default a type \link type_3vector \endlink , if you want a /// \link type_unit3vector \endlink you must set it explicitly) inline colvarvalue(cvm::rvector const &v, Type vti = type_3vector) - : value_type(vti), rvector_value(v) + : value_type(vti), real_value(0.0), rvector_value(v) {} /// \brief Copy constructor from quaternion base type inline colvarvalue(cvm::quaternion const &q, Type vti = type_quaternion) - : value_type(vti), quaternion_value(q) + : value_type(vti), real_value(0.0), quaternion_value(q) {} /// Copy constructor from vector1d base type diff --git a/src/COLVARS/colvarproxy_lammps_version.h b/src/COLVARS/colvarproxy_lammps_version.h index d9f2955233..0399595533 100644 --- a/src/COLVARS/colvarproxy_lammps_version.h +++ b/src/COLVARS/colvarproxy_lammps_version.h @@ -1,3 +1,3 @@ #ifndef COLVARPROXY_VERSION -#define COLVARPROXY_VERSION "2020-04-07" +#define COLVARPROXY_VERSION "2021-03-02" #endif diff --git a/src/COLVARS/fix_colvars.cpp b/src/COLVARS/fix_colvars.cpp index f4f6974c70..45e12951bb 100644 --- a/src/COLVARS/fix_colvars.cpp +++ b/src/COLVARS/fix_colvars.cpp @@ -480,7 +480,7 @@ void FixColvars::one_time_init() memory->create(force_buf,3*num_coords,"colvars:force_buf"); if (me == 0) { - std::vector &tl = *(proxy->modify_atom_ids()); + std::vector const &tl = *(proxy->get_atom_ids()); inthash_t *hashtable=new inthash_t; inthash_init(hashtable, num_coords); idmap = (void *)hashtable; @@ -563,7 +563,7 @@ void FixColvars::setup(int vflag) if (me == 0) { - std::vector &id = *(proxy->modify_atom_ids()); + std::vector const &id = *(proxy->get_atom_ids()); std::vector &tp = *(proxy->modify_atom_types()); std::vector &cd = *(proxy->modify_atom_positions()); std::vector &of = *(proxy->modify_atom_total_forces()); @@ -836,7 +836,7 @@ void FixColvars::post_force(int /*vflag*/) if (me == 0) { - std::vector &fo = *(proxy->modify_atom_new_colvar_forces()); + std::vector &fo = *(proxy->modify_atom_applied_forces()); double *fbuf = force_buf; for (int j=0; j < num_coords; ++j) { From 7068f3e77beaea64e6077a17cef1a607bf920165 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 12:02:55 -0400 Subject: [PATCH 234/352] add a few more test cases for testing utils::split_words() --- unittest/utils/test_utils.cpp | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index 4ce4733a6a..08922e648f 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -120,6 +120,44 @@ TEST(Utils, split_words_simple) ASSERT_THAT(list[2], StrEq("three")); } +TEST(Utils, split_words_leading_whitespace) +{ + auto list = utils::split_words(" one two three"); + ASSERT_EQ(list.size(), 3); + ASSERT_THAT(list[0], StrEq("one")); + ASSERT_THAT(list[1], StrEq("two")); + ASSERT_THAT(list[2], StrEq("three")); +} + +TEST(Utils, split_words_trailing_whitespace) +{ + auto list = utils::split_words("one two three "); + ASSERT_EQ(list.size(), 3); + ASSERT_THAT(list[0], StrEq("one")); + ASSERT_THAT(list[1], StrEq("two")); + ASSERT_THAT(list[2], StrEq("three")); +} + +TEST(Utils, split_words_heredoc) +{ + auto list = utils::split_words("one two three \"\"\""); + ASSERT_EQ(list.size(), 4); + ASSERT_THAT(list[0], StrEq("one")); + ASSERT_THAT(list[1], StrEq("two")); + ASSERT_THAT(list[2], StrEq("three")); + ASSERT_THAT(list[3], StrEq("\"\"\"")); +} + +TEST(Utils, split_words_heredoc_whitespace) +{ + auto list = utils::split_words("one two three \"\"\" "); + ASSERT_EQ(list.size(), 4); + ASSERT_THAT(list[0], StrEq("one")); + ASSERT_THAT(list[1], StrEq("two")); + ASSERT_THAT(list[2], StrEq("three")); + ASSERT_THAT(list[3], StrEq("\"\"\"")); +} + TEST(Utils, split_words_quoted) { auto list = utils::split_words("one 'two' \"three\""); From c4442206d44e7ab9efd793f22e273f3a508501a5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 12:03:34 -0400 Subject: [PATCH 235/352] add special case for heredocs in utils::split_words() to avoid segfaults --- src/utils.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils.cpp b/src/utils.cpp index 654d5d3301..c0c15d0f3b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -855,6 +855,13 @@ std::vector utils::split_words(const std::string &text) if (c != '\'') ++len; c = *++buf; + // handle triple double quotation marks + } else if ((c == '"') && (buf[1] == '"') && (buf[2] == '"') && (buf[3] != '"')) { + len = 3; + add = 1; + buf += 3; + c = *buf; + // handle double quote } else if (c == '"') { ++beg; From bb9c0630f879b33e4765feec35497bd7f778a28e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 17:06:02 -0400 Subject: [PATCH 236/352] suppressions for readline function calls from lammps-shell --- tools/valgrind/readline.supp | 169 +++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 tools/valgrind/readline.supp diff --git a/tools/valgrind/readline.supp b/tools/valgrind/readline.supp new file mode 100644 index 0000000000..f1e1c6df1e --- /dev/null +++ b/tools/valgrind/readline.supp @@ -0,0 +1,169 @@ +{ + Readline_init_part1 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:xmalloc + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part2 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:strdup + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part3 + Memcheck:Leak + match-leak-kinds: reachable + fun:realloc + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part4 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part5 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + ... + fun:tgetent_sp + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part6 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + ... + fun:tgetent_sp + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part7 + Memcheck:Leak + match-leak-kinds: reachable + fun:realloc + ... + fun:tgetent_sp + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part8 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + ... + fun:tgetent_sp + ... + fun:rl_initialize + fun:readline + ... + obj:* +} +{ + Readline_init_part9 + Memcheck:Leak + match-leak-kinds: reachable + fun:calloc + ... + fun:tgetstr_sp + ... + fun:rl_initialize + fun:readline + obj:* +} +{ + Readline_prompt_part1 + Memcheck:Leak + match-leak-kinds: reachable + fun:realloc + fun:xrealloc + ... + fun:rl_set_prompt + fun:readline + ... + obj:* +} +{ + Readline_prompt_part2 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:xmalloc + ... + fun:rl_set_prompt + fun:readline + ... + obj:* +} +{ + Readline_history_part1 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:xmalloc + ... + fun:readline_internal_teardown + fun:readline + ... + obj:* +} +{ + Readline_history_part2 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:xmalloc + ... + fun:readline_internal_teardown + fun:readline + ... + obj:* +} +{ + Readline_history_part3 + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:xmalloc + ... + fun:add_history + fun:shell_cmd + ... + obj:* +} From 2e7b3081a10384d6aabfde0e1cacf6df887e1e9e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 17:07:16 -0400 Subject: [PATCH 237/352] fix bug enumerating output when using python invoke with multiple functions --- src/PYTHON/python_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 793fedf00e..2e043dab73 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -138,7 +138,7 @@ void PythonImpl::command(int narg, char **arg) if (ifunc < 0) error->all(FLERR,"Python invoke of undefined function"); char *str = nullptr; - if (noutput) { + if (pfuncs[ifunc].noutput) { str = input->variable->pythonstyle(pfuncs[ifunc].ovarname, pfuncs[ifunc].name); if (!str) From 08a727d510d3cad16589dc9473bb2fc84115fd62 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 17:19:23 -0400 Subject: [PATCH 238/352] make some class members temporaries since they don't need to persist --- src/PYTHON/python_impl.cpp | 22 +++++++++------------- src/PYTHON/python_impl.h | 5 +---- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 2e043dab73..61092e90ed 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -47,12 +47,6 @@ enum{NONE,INT,DOUBLE,STRING,PTR}; PythonImpl::PythonImpl(LAMMPS *lmp) : Pointers(lmp) { - ninput = noutput = 0; - istr = nullptr; - ostr = nullptr; - format = nullptr; - length_longstr = 0; - // pfuncs stores interface info for each Python function nfunc = 0; @@ -168,11 +162,12 @@ void PythonImpl::command(int narg, char **arg) // parse optional args, invoke is not allowed in this mode - ninput = noutput = 0; - istr = nullptr; - ostr = nullptr; - format = nullptr; - length_longstr = 0; + int ninput = 0; + int noutput = 0; + char **istr = nullptr; + char *ostr = nullptr; + char *format = nullptr; + int length_longstr = 0; char *pyfile = nullptr; char *herestr = nullptr; int existflag = 0; @@ -223,7 +218,7 @@ void PythonImpl::command(int narg, char **arg) // create or overwrite entry in pfuncs vector with name = arg[0] - int ifunc = create_entry(arg[0]); + int ifunc = create_entry(arg[0],ninput,noutput,length_longstr, istr, ostr, format); PyUtils::GIL lock; @@ -409,7 +404,8 @@ char *PythonImpl::long_string(int ifunc) /* ------------------------------------------------------------------ */ -int PythonImpl::create_entry(char *name) +int PythonImpl::create_entry(char *name, int ninput, int noutput, int length_longstr, + char **istr, char *ostr, char *format) { // ifunc = index to entry by name in pfuncs vector, can be old or new // free old vectors if overwriting old pfunc diff --git a/src/PYTHON/python_impl.h b/src/PYTHON/python_impl.h index 0190e8d7c2..dd215fdedf 100644 --- a/src/PYTHON/python_impl.h +++ b/src/PYTHON/python_impl.h @@ -35,9 +35,6 @@ class PythonImpl : protected Pointers, public PythonInterface { bool has_minimum_version(int major, int minor); private: - int ninput, noutput, length_longstr; - char **istr; - char *ostr, *format; void *pyMain; struct PyFunc { @@ -57,7 +54,7 @@ class PythonImpl : protected Pointers, public PythonInterface { PyFunc *pfuncs; int nfunc; - int create_entry(char *); + int create_entry(char *, int, int, int, char **, char *, char *); void deallocate(int); }; From bc6dfdb65648d7d1219957fcce469ec4362ea383 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 17:44:56 -0400 Subject: [PATCH 239/352] update readme --- tools/valgrind/README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/valgrind/README b/tools/valgrind/README index fb35b4586a..8a32f7928c 100644 --- a/tools/valgrind/README +++ b/tools/valgrind/README @@ -10,7 +10,9 @@ valgrind --show-leak-kinds=all --track-origins=yes \ --suppressions=/path/to/lammps/tools/valgrind/OpenMPI.supp \ --suppressions=/path/to/lammps/tools/valgrind/Python3.supp \ --suppressions=/path/to/lammps/tools/valgrind/GTest.supp \ + --suppressions=/path/to/lammps/tools/valgrind/FlexiBLAS.supp \ + --suppressions=/path/to/lammps/tools/valgrind/readline.supp \ lmp -in in.melt -Last update: 2020-07-09 +Last update: 2021-08-04 From 9a60ab0c23063f790b2509dfdef63b860afa16c3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 4 Aug 2021 21:31:42 -0400 Subject: [PATCH 240/352] correctly insert atoms/molecules any nfreq timesteps even with multiple run this changes the computation of "next_reneighbor" so that it is based on "nfirst" which is set during the constructor of the class. This still maintains the property that the first deposit attempt is not done during setup, but on the next step. --- src/fix_deposit.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp index f3b175fc78..7f153cd172 100644 --- a/src/fix_deposit.cpp +++ b/src/fix_deposit.cpp @@ -195,7 +195,7 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : force_reneighbor = 1; next_reneighbor = update->ntimestep + 1; - nfirst = next_reneighbor; + nfirst = next_reneighbor-nfreq; ninserted = 0; } @@ -288,8 +288,7 @@ void FixDeposit::init() double separation = MAX(2.0*maxradinsert,maxradall+maxradinsert); if (sqrt(nearsq) < separation && comm->me == 0) - error->warning(FLERR,"Fix deposit near setting < possible " - "overlap separation {}",separation); + error->warning(FLERR,"Fix deposit near setting < possible overlap separation {}",separation); } } @@ -297,7 +296,7 @@ void FixDeposit::init() void FixDeposit::setup_pre_exchange() { - if (ninserted < ninsert) next_reneighbor = update->ntimestep+1; + if (ninserted < ninsert) next_reneighbor = nfirst + ((update->ntimestep - nfirst)/nfreq)*nfreq + nfreq; else next_reneighbor = 0; } From 5295bb51098394803fee730e9c85d4c590adc4d3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 5 Aug 2021 12:20:20 -0400 Subject: [PATCH 241/352] fix refactoring bugs --- src/REPLICA/fix_grem.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/REPLICA/fix_grem.cpp b/src/REPLICA/fix_grem.cpp index 07b8051225..743d31fe96 100644 --- a/src/REPLICA/fix_grem.cpp +++ b/src/REPLICA/fix_grem.cpp @@ -76,20 +76,19 @@ FixGrem::FixGrem(LAMMPS *lmp, int narg, char **arg) : // pass id_temp as 4th arg to pressure constructor id_press = utils::strdup(std::string(id) + "_press"); - modify->add_compute(fmt::format("{} all PRESSURE/GREM {}", - id_press, id_temp)); + modify->add_compute(fmt::format("{} all PRESSURE/GREM {} {}", id_press, id_temp, id)); // create a new compute ke style // id = fix-ID + ke id_ke = utils::strdup(std::string(id) + "_ke"); - modify->add_compute(fmt::format("{} all ke",id_temp)); + modify->add_compute(fmt::format("{} all ke",id_ke)); // create a new compute pe style // id = fix-ID + pe id_pe = utils::strdup(std::string(id) + "_pe"); - modify->add_compute(fmt::format("{} all pe",id_temp)); + modify->add_compute(fmt::format("{} all pe",id_pe)); int ifix = modify->find_fix(id_nh); if (ifix < 0) From 980b817f3ff3c107013dcaf574b90e7a992ed352 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 5 Aug 2021 18:03:05 -0400 Subject: [PATCH 242/352] Allow python pair style to load class from __main__ --- src/PYTHON/pair_python.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/PYTHON/pair_python.cpp b/src/PYTHON/pair_python.cpp index 2cffcb8b05..5b4e841927 100644 --- a/src/PYTHON/pair_python.cpp +++ b/src/PYTHON/pair_python.cpp @@ -253,20 +253,24 @@ void PairPython::coeff(int narg, char **arg) if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) error->all(FLERR,"Incorrect args for pair coefficients"); - // check if python potential file exists and source it + + // check if python potential class type exists + // load module if necessary std::string full_cls_name = arg[2]; + std::string module_name = "__main__"; + std::string cls_name = full_cls_name; + size_t lastpos = full_cls_name.rfind("."); - if (lastpos == std::string::npos) { - error->all(FLERR,"Python pair style requires fully qualified class name"); + if (lastpos != std::string::npos) { + module_name = full_cls_name.substr(0, lastpos); + cls_name = full_cls_name.substr(lastpos+1); } - std::string module_name = full_cls_name.substr(0, lastpos); - std::string cls_name = full_cls_name.substr(lastpos+1); - PyUtils::GIL lock; PyObject * pModule = PyImport_ImportModule(module_name.c_str()); + if (!pModule) { PyUtils::Print_Errors(); error->all(FLERR,"Loading python pair style module failure"); @@ -278,7 +282,7 @@ void PairPython::coeff(int narg, char **arg) PyObject *py_pair_type = PyObject_GetAttrString(pModule, cls_name.c_str()); if (!py_pair_type) { PyUtils::Print_Errors(); - error->all(FLERR,"Could not find pair style class in module'"); + error->all(FLERR, "Could not find pair style class {} in module {}", cls_name, module_name); } PyObject * py_pair_instance = PyObject_CallObject(py_pair_type, nullptr); From 53b94ac94d5cfdbd39cd8ab8c7c449b723794bb4 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 5 Aug 2021 18:10:19 -0400 Subject: [PATCH 243/352] Allow fix python/move to load class from __main__ --- src/PYTHON/fix_python_move.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/PYTHON/fix_python_move.cpp b/src/PYTHON/fix_python_move.cpp index 72b61a834c..eef2c4083f 100644 --- a/src/PYTHON/fix_python_move.cpp +++ b/src/PYTHON/fix_python_move.cpp @@ -51,15 +51,15 @@ FixPythonMove::FixPythonMove(LAMMPS *lmp, int narg, char **arg) : // create integrator instance std::string full_cls_name = arg[3]; + std::string module_name = "__main__"; + std::string cls_name = full_cls_name; size_t lastpos = full_cls_name.rfind("."); - if (lastpos == std::string::npos) { - error->all(FLERR,"Fix python/integrate requires fully qualified class name"); + if (lastpos != std::string::npos) { + module_name = full_cls_name.substr(0, lastpos); + cls_name = full_cls_name.substr(lastpos+1); } - std::string module_name = full_cls_name.substr(0, lastpos); - std::string cls_name = full_cls_name.substr(lastpos+1); - PyObject *pModule = PyImport_ImportModule(module_name.c_str()); if (!pModule) { PyUtils::Print_Errors(); @@ -72,7 +72,7 @@ FixPythonMove::FixPythonMove(LAMMPS *lmp, int narg, char **arg) : PyObject *py_move_type = PyObject_GetAttrString(pModule, cls_name.c_str()); if (!py_move_type) { PyUtils::Print_Errors(); - error->all(FLERR,"Could not find integrator class in module'"); + error->all(FLERR,"Could not find integrator class {} in module {}", cls_name, module_name); } PyObject *ptr = PY_VOID_POINTER(lmp); From f3a03d6a84c41a18b8fff40e1a49c31841424a98 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 6 Aug 2021 10:21:40 -0400 Subject: [PATCH 244/352] Catch ValueError instead of base exception --- python/lammps/core.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/lammps/core.py b/python/lammps/core.py index 5dcc31854b..7dea6e5e6e 100644 --- a/python/lammps/core.py +++ b/python/lammps/core.py @@ -1393,7 +1393,7 @@ class lammps(object): id_lmp = (self.c_tagint*n)() try: id_lmp[:] = id[0:n] - except: # lgtm [py/catch-base-exception] + except ValueError: return 0 else: id_lmp = None @@ -1401,21 +1401,21 @@ class lammps(object): type_lmp = (c_int*n)() try: type_lmp[:] = type[0:n] - except: # lgtm [py/catch-base-exception] + except ValueError: return 0 three_n = 3*n x_lmp = (c_double*three_n)() try: x_lmp[:] = x[0:three_n] - except: # lgtm [py/catch-base-exception] + except ValueError: return 0 if v: v_lmp = (c_double*(three_n))() try: v_lmp[:] = v[0:three_n] - except: # lgtm [py/catch-base-exception] + except ValueError: return 0 else: v_lmp = None @@ -1424,7 +1424,7 @@ class lammps(object): img_lmp = (self.c_imageint*n)() try: img_lmp[:] = image[0:n] - except: # lgtm [py/catch-base-exception] + except ValueError: return 0 else: img_lmp = None From b9fa4e1db2523d56449c85d18bf7a3ed413716ad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 08:13:03 -0400 Subject: [PATCH 245/352] avoid memory leaks on specifying keywords multiple times --- src/PYTHON/python_impl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PYTHON/python_impl.cpp b/src/PYTHON/python_impl.cpp index 61092e90ed..2da5f68895 100644 --- a/src/PYTHON/python_impl.cpp +++ b/src/PYTHON/python_impl.cpp @@ -179,6 +179,7 @@ void PythonImpl::command(int narg, char **arg) ninput = utils::inumeric(FLERR,arg[iarg+1],false,lmp); if (ninput < 0) error->all(FLERR,"Invalid python command"); iarg += 2; + delete[] istr; istr = new char*[ninput]; if (iarg+ninput > narg) error->all(FLERR,"Invalid python command"); for (int i = 0; i < ninput; i++) istr[i] = arg[iarg+i]; @@ -186,6 +187,7 @@ void PythonImpl::command(int narg, char **arg) } else if (strcmp(arg[iarg],"return") == 0) { if (iarg+2 > narg) error->all(FLERR,"Invalid python command"); noutput = 1; + delete[] ostr; ostr = arg[iarg+1]; iarg += 2; } else if (strcmp(arg[iarg],"format") == 0) { From eb52f7c290316d019c7097a08682cbe8e9439e03 Mon Sep 17 00:00:00 2001 From: Giacomo Fiorin Date: Fri, 6 Aug 2021 10:25:12 -0400 Subject: [PATCH 246/352] Update Colvars to version 2021-08-06 (silence Coverity Scan warnings) Also include PDF copy of the manual forgotten in previous PR. --- doc/src/PDF/colvars-refman-lammps.pdf | Bin 577960 -> 1362479 bytes lib/colvars/colvarcomp_volmaps.cpp | 2 +- lib/colvars/colvargrid.cpp | 8 ++++++++ lib/colvars/colvars_version.h | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index 8fcc37c26ed28a0426c6146a5e68e793525e653b..8b6e5bffdcc71ae69d68a9449b3ec259b7478a9a 100644 GIT binary patch delta 1146175 zcmZsCQ;;sqmSx$tZQHhO+qS>5>y&NRDW0-@%C>FWn*ZLO?&*%6my8t|85#MId+*G( z)~+ZftxHi&;DTp@VU#m>uynH`VrJt=pCbpM2GnS7IBaqt`R~+aj2se2Ny(%%L4mY6 zdOABy#{X-NUH2=ah$W~L{C)^sV0;qB1}CL zEG8skqD)3YM?6MEft(CS9u;av2faZPiK&v5guJJC7Dy&)Bux#+JE}yh5!&W18o^V7bOF|i<9|JcilN9I!2AtF0z(xpT0*5zADR*wd8>|MEKMbi?nj+! zQ%GKlEUEj9hz#SxfEmV+gv z3LTQE$ZhV#2pX_e9}ffmuoF}dlEW=aCXPb~rk0S@ss)4HP-yIAGb=(PMI=Egg%X&cjK>I;lBkC+6VcBuia*v72!=ID(_&tffXJ344VZ*T zP=&@jB~zV(z#&SI5_R3NYDQ9$g=WCUqb*#UJtbe7g9vd4=}4jznzScdgED3^O^^?} zByhE@=c*7BSNUgeQC60b%~WDsp=CO_zpBibkuqv<=-^x`Q6`|H(!r;%3Z+T#MCH&I zL{wt;F()%;YrHz#n{@~Tc=||3nuEV*20bZ9d0|01;KNPHRrTXC zYkm08&Dr%wZh+uX-I}q%#eqWk=CNbDIS(h_Tl8Yzii+P&6sZ7zEOF`p2?cqe)zT!%;~Sa{QCqpUc0(iT77 zMskyzrq*1_sL^6a`r8ah1a$Fq?lpCb6>=0ZlcZ7hJj`EzL8-pX#^x{^cBeTU7)C3LYq_!IER1bP zun*9gpI+;IM;xtH-bC9&ajYq>b*1WLI0jdW02c7mdmi~?kCmqgILQfYqHSECguxn;TcI$!*xQNX(%<8ym%%z_i<0N*J-5*;7ta*m+U@+WpT7qZ$IM}+Rr^*IXz;iIq zAez=Xn{Jm!7q%tXF0Bwh{B#5J05O$M8`NjM zMT)a~Y@hxu_pBxP5_*`2^1AengLl+58|MRjf5ytGS2J9`TrdJww%pVUV7*W#?L&Sa zvZKj_{E|Ce-(9`s{YyYb zXLI0}c&By?;F3L-<2y zXK&i$8=^=Y5xq?!x8ggJyl7gdt4Z`*_-}Uv?q zll{M?c5cpeXL=B-Lnvs-6oC3W~E>{jRN?bKb!?hvA(}Q0qZ3*@iPTqqGQA zQfUq}G4+_~=QLH^Tb8O08kw0`=09t_Lto5Aya!fN?vrjX)uaGDX=*9KVk8x4Z*sf2 zEEBi9#az*=qsC@J3W>&e^+9L{XzeA?u}L>2QhCLt;IVMO%gJLwt}_d?V3<)eLlbZD zi6%fw&4m=&rtwChcfnzzR1p$Exl_F;AziWtXdzw3qmG59`+}(gb4t(T(1fO4j-f}n zlYt(&(koiPT=D>W=4RNK$Ra613}isEM3{P*tC2A%^)f{1BqY%O`z&!5D1V2{A&xU6 zp?b*{Q4#|ooU4pLK#`QABx_7e5~xpjjl{(K%FTj|gxG@uS*f*PhJzeLSP()(u$0ip zh2!ub5|UGHfViy*na^HHwcFV&i_L21q-PP)ELq1$EE50~2OVZ1-e4Ja)YENO8O0g! zM3~gLa)c3q!9|Cs)Qu2o(BO#;8Dp^*mW<(%tFSQRP-e1JRHo0t!9*Yi+^VX7g6M>i z;A#bpLnb5?WdmX@S)sv|$s9z57l$RL$@lQ7s8G!)J7t`3VTyn_oH(amkrNst;k_)R zMWp|FV~znXk7RxB!VJ1vG1CmX3N3rIeY#;^6stB>t>cGudnb(La zh2>MK_K8FGa0pcRl+L6&f2VXI#P*ET;U2KV$MXZ|-P`6m%A8ECFYFqBTA4<$#4-1} zTX^yDlD4XxqWG$!4cnL9YI2k(WE6>tu|`*YB)Chv8+FUODb=-^YIts&w=;C=#ugQk z#rm|)lBtz_(^^{f7lRPixgy^hgU1=Hz}1d0JX+0w`1nc@JJxL_W9rcC2r;$Y7)h4z z zTgi>+OVDRnrG|VM2gFW4gt{|2Ek90geik5pi>bm#-d7jj2Ck&?dM5m2FT+4X5IaWt z<72w!=9ROWT(iL)0-CyfwsbwN!!q|HOcl^X`y{Xr4?_GCG?(HmU5avBjb_U+9(V(iHEAW({Ybjv%NwY01*zu~KAj>yDzzV7@??ml+HT~7WOJB#z^ zAjn>HTfM?msQM%N(_DVVWGB0^XbWDi*FxSq)xqzv6I>T}PY-Csst`sJK{Z@Qu5Ac9h0PJ=?G#vyo{><6jLSRJ zl-TsGoLRQnakwW=_Uu9!=78CZ7wHXv^#8VtU6^dMga|kcG#V8se>fm&rNuxl<9b>D zSyy1OpZuFK);*?YN@E*O*@cn2Tw;6G0(l>|QBhBx36BkTVSJ64af{Edzzp#BEmK}= zJvopbKe+$?x@5JUyis@}tbB!O&p(q27Oml_=rN{HO2Om3`c`w^eNem!FJ$pSNy75T za766&F>R4wsUgMPC!R!<&gJ8oQnIjg$j8cvK>CvL)Aj8Z)tu2*k^6dKSy%jV?5I4p zLawF?yzD_G19+89I;y#cIRfULGe{*2ry#@NRYZ~fV!+EMLlvVh9Tr|D-ls8tPQbR* z&FUd=zO^z9Rs<1)KH8=n&V({a>O6e?(jCkDo~9bw4wJJKQ$5~i{XU%|Nq-#I!q`_} z%pJ^J-CWF#?f-=wO>AJ;*w~4fi2jB6`2MR9uyb<&6aBjq0OC|-RX3QBdOkEysiuqy z%gLWGM7%=H0(a*{&-&%@_BmQ2N($o*cT&k&!x32dr9a+1UN*K4{G12p4g`!(k(u4T zZ)9uk4S%{)^H2~3;GE6C#xn|aip_JqQdzLsFb(W1|T)kcS32Im|H&NzZO>KC&lN6r9?7aeCT-gbX zZ)kz4)D;ITV2tDJdvNKU4cck_?F=||JZKw4bx}rbTj0hVSu>8;d?+c$NS2GtE2$8D z148N?8cVe#+pNeqD3?_&Z$c`+(JO$IbJ`%f(bC zz-BM_!+)kn!%8O4u>{fj{QR_C-PS>_S{bqDGf40cp&mu!b9idRC3}I`#B*5+$L3l- zHQ1{3Vg0!y6lG?ThUM#Z)u)i9Q=MLmtkSbVonRO+;yKM7Gtw@eY99~35%yqlww-lB z6D+uR0C}224K=2}8pq>1&E=T$f_ zSpzeHE!q5d++Iq(zu*5Pb)#5=-Ic@J&EZ&C!DKY(Dg7I?`ottYJ+yk4cn~rRj>UsX zdZK%iQO+&6S2g7BuzsLzVDL;4K4JQgcI_SeDx`b#8z!vEW>qcqGDGYm{Y5>{UbDL)Yg9-THG0l3d{MON|f^$rZmK4G4rf6@NO)n5oPo zO`^M0oUvQmkpiuZo66udQB@S!TQtK2{*F`XFvDiymOhacpG(C;CnaN!NgWg ze!urRl1L5u=Ik5*+r>HAu$lN^GN^en(2m?$W># zQ(JiR9X688O&t1g9L50L`)8YtU)g}fae?eR#X#Zo<#Z$vGy=w;X$$3X6~&5pOb7XD zCyRZWmHcZz6S+DrBc0K91D}a{LSTb&F%P}Qy_cWUhQ)cRZKSI#XJGR$-om~5buD-| zwMZ!I>6XuC$@l_KPm;AhEW;g&o1_MR>6WT-SKaPc-#d9%`ELOdixismvH)7OZhV!x zl{q|S*3)8yLEC}xkkTpCu%+J0_U(T@!SYzJC-=>Ooh@_HaluK%G;ykXg}i{{FfH86(ej8S4G++6-?)RdNKtH!#I}qEz6O*{^2;Ssh{Ja-Sr2w|5&|2Q zV~olu-^gx4NH5HJCt7TUV4vV4Ox_+m03OMdJAHNr(!1wa2FspqV9GvfqIyf#TOtkueriUmuuVt1(WwkT6# zXUD~_2+2#QPI!cO=%6mOa@MO6PgqE|Vn7cX8IG+tN|E(FRagdF5=)fTwJ#b}g|@7S z*soJ|ZzS%b#!Zp0jN7}rdDKz=CL~yeSi(WLJr33$Y}R9vP99%UKqDEyRZ1h6FxO{g z?UDrKExhDKo+<47rSOj-yU4?yg*Teb!VZ4WORkK|xZEK@sb)5>wU|pFr<*#V#GjrK z$eoPmi3L|Y=j|Vs`!hV)zOSuEQHfxER{RlbBcf0EM&a{*J3Ln*P(mZgGcT!A49&`a zj_{}Oq!S1ncg`T`STs-XPR(SMxB=039t#W*NU+{j1xoD}b(0CFRpNm$!RD{;Tg6fJ ztgZ_+MIf3vdQeC_!25!P;kR|}WvpAyh=09vfqg*JboL9@%cLd6d z7a0lc5%T7tV5$?TXGI_Ecg>S0hWtDiqeSkr;jB6$W?WZ^_q&3UDiUAYm_0B8$JR~+q>HRWnli%~E ztx(kdFB@ik>~gC40upJ=)k@64lLrywS3hL2P65Y`&0A1Vj7a6rg?s&3b`0hZD9}*~ z`~NPk>B8LL=%CD8T;3X*YAr?<1fuW7L=Yk*dkrYCPZSGLMDW?K1W_LHCSsJ701xox`cTz_V{eFG z;HSA$-6khBts;(&dFIWdnDHfc^sRi_kJO>~$%X^jM>xNK&iwaVX>w8n#+CG8M=rXQ zf7(K>!Oes*ABwn~uQb}+;JfYK9P(xaYgp8gZMbJ=v%u@6eZ0(LW)*U6h>#G}bC291>%wF)G$N zBAxEt)^~Ul?uh?ZoJ_q!xyO#(u^-so?E=&;v8$&4o;(>-bO-mcGbcJgU=mDucgT6O z32569cnEa~g7Eoyp%On-4VD>`TK>{}pD25mt4(n6I(zW;pauXO$oV)H@NSpO4s(fGb}HN$eYxo%_P2|WvaH>HvS%6 zHMTGHXOQVVFJg}I>KfnDxPCJ{? z!9;=LooAoynG^tx&ED3p0zth8vE+>G5&Zrf2IDFVjL zEk&kTfgU8^cEsf~AERDT#fn9NVe1Z7R$%scj()o$Jbz50-z~uT8DBB?wI8TWk$iM> z2gU@F6&Rlb4D2H*meJ>h{^ISE>r4^f&qo-p!)mEFG629Q>rAy(2 zcFgoF1&M1eRc+R4@vWB?VhA+I!#aCiTs1|Pg~?co8$olC&0Y?*bkm1DxyJEp`6p0n z&Nf9g^E+rH0qKc<%ICgNdt}Gx5Fahv-2Pu+x}?EM)Vh)k*)(m+(kLe$g$s?`hF*Wd zvdJ_yzAFGR%`xC>ilSPYEYyE>uiHU(phXJ99Xa@I#o%@msqO@3CvNL|vK^k78_PIi zTD0hbg@*C(J;%?pH~O*&t3&Y{tgOalcy)|m9g7KiTXZ8+XJkIPfG=a?SsPsh!wd&)*GEeYV%cl_A6YXi2vLUynp?wO$LhIg|! z4)>#<6s(Hle6Daw#Evz@b!vhxt^v4pPM`9>+NO%_L3 zaeQ6||LrTKG&a9)#dGQA#X-2#_a)vNddLO7opmWCXL$o*v6;%<;|~h8th%VK6I5PT zO97xe&b0UX7zk@uQ_h9iou>!a6zdCXX`^^I;_FT{=)H=ABkgsK%(~QKlH7A! zj(o`-Ie7}`d=T{$-fx~zfce%@0+>MNy)fgatr4YOqpI14i1L&Tqa%~_-0|0J#=#Qi z(ERU-wVm1alCw<(3-vH+fxVqD!RvTIme-wH)FDj=4&6I)T+8U14mN$I$Ld1UUO~X) zst`b$k}xJIW&DgwQP!=)WdgPKI!m?cZfxd*l+l&&^d00axK8d4ntp|B?vUYt{ zEZdJjcUJeXm$US(hp8=GBqmZxqu(Jh9yaP;7il%&-7j?eorbsy)}<_aB!t#<7Ncay zR)LmzMO@NDPEG&)u0YoAQx@v!Nl$q^=X z3er#SYuHF6%3q17^c;(9EM{OWnz(<9@r{KZ>JNS>OixNR13 z`}a+}c_4vaj7{eIcAMYod0~Ck{J4-EyYZr?(Kb;2?yk>->B06y>5K)yyog-f%>Tuz zuyAsvBa4Gm1DbU=9B{c&{8uz@o$r~@s-joIko%-5GJ$wAh^9drabJa7Qnh$Hz*KmX zKfm(M%W}u2_93=_L1b!<&lb$;70_dz6=GSp$w`6bIk0yk;gEY!aPMO|uwfo z!@*b9u&0r0u#EG(pM~ZwglK~~aBt>du=8PbID%#g0r4;f8&)FERxweb%e<)Kx-86P zna}drUIJN3{gD2n^#Ql9NI@_he+$m;w4#w`U_feRSa$P@6cPIW#GIlR8G8gAi-G{i zF&d2P6rsF|BUkQ_>r$N7Kyw@S#W?o+7D4r?K$-U0#jSzV{N@ejq)M0`kR9{*4A?D5 zxoHu409f0-o53xb?ui;^RvVs=>`+Hi{RfwwYJ6o>uLj#P7` z8FmZ9HkP{NSX>x4R-t$w0+)8R&kaWff5nnsWWTGa%fmBvRlRHe-J>fk>&ye+Tsg z>Fwk%%J=}W8?BI5KzAZRh=#(a258+;S1AY6wkK`T^pze^KaqCi~bov`2EhO7S1U7Le?(+8OYPu#-cLwGv6Aws&X?0nFaA37!W2V z9GW-QtqwpRZuc(BM>?lEvmKiKZ96VX-)vid7B06l!rHqG>~_wNzV2tQFstleb_2TD zcE37S9X&Rd{#jIS066#Kn&(CA{sFYFGhlu^JD8t(_%wU1)NC`#U;S7$b4>!?ZXMbU z?b9}<`LwU*%)QO0HL|mxM0g2-DL9FKJQ}YxG^1Vm5M!F#4e&d*Hoi2N8dONlBs+X&-i`zv`zRve09N*ry?*LUy?mg22 z4xK|0#vSR94;H-}8C&l*?VLC1zT_T=V&7&WRmN&l9xL>{*LOPjwXBR&pJ$c4D+-j9 zjc--)H)$5%CU+j(*@D~lypxN--!!MWjc*f2#-5G6dIUa}n}+Z9-px9E>;6o2_zYrn zqiU~y5Ru)}4Tx-;o*m$EApq|!+Yo_gzvng5j~&Yg$xi<5#u1m32g8$@llVLEm^;1v zfVIq(u??sZy)OEWYJT18bibw?&}*K~_R~PFh_x?nL4NMDyOZ*-)5)3RAD=h9pC7j^ z_Zx(tj2TAHiQvef#h^24 zbZOn0{3lQul0|1!?^3(_pFp!q@6Kgt0-f=H0GT0L^g6XJmAmL(%l@S!llQ0lt0&2? z^v);AW#JxE07jFN7_#ndc>N#wL+6d(Z+VV5dWRKsB2AU8B6eYHC1Yu#ZRz0gGa{=z zabG05al%EIF; zd>@Vqv5~G@GNcdwf->8kC-j9tKD?Ba zn0SsUDX}1MA(X4cFwre*Y^+ql9?_Z8oxX|)Ura5~nZbk`8NgCjPCiRXbL{O_eAri?#NXK>BMzdy`P;dmD zP6Asha!l?9m|bH3lt6Ijn%E(M*?3dH2Ah-h0kaa>pC6TL>En=f7IoTcnM+St3?1X) zK+D&6K~)|>2T>=G~H+R{hSg|eXK^z>@G*(O>^F74wNK5SjVXrzwf%oV@SIcN{BcEKtvc! zjNZrH4B?0m1&3To3)wn;sBr?GGKnbZ;Ri=jAPkL&}_F}HvX1_{{KV&70``&%Ws9ryd$%|Q1WFAZUXJzdD z?HvK}&GOAt&G<6ZJ_ANpzgy4&@iYYLe3f2mcNP1}L&eb}=<&1!ntZihdUtL6&O-

6SIn=f6O>d{hEA+cYb({DQ=xmNvdHBq@wML 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

Ctjz+{%J{(JgkJ=WRBElw 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

Hdfg1^QHka3)baF!t7y*h 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∾?v{-|rXR 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

%S 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∋MU!nJ>kT=- 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

gVz4T$*^D$6h(-1KD(5#H+T!M{fCvg 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%0Ance|qXG+R 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

UdVVC<&3+zI< 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

2^2>#jy*CT@dqTOvCZBO(HoJ(nceAZ>?xUwT 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

UFN>+L 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

PJ>AZ34n@A<c`CLU4M_;ldH2$Lvk# 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 int flags = is_enabled(f_cvc_gradient) ? colvarproxy::volmap_flag_gradients : - colvarproxy::volmap_flag_gradients; + colvarproxy::volmap_flag_null; if (atoms != NULL) { // Compute the map inside Colvars diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 2074c97aca..b3768a47f6 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -166,6 +166,14 @@ colvar_grid_gradient::colvar_grid_gradient(std::string &filename) } is >> nd; + + if (nd > 50) { + cvm::error("Error: excessive number of dimensions in file \""+ + filename+"\". Please ensure that the file is not corrupt.\n", + INPUT_ERROR); + return; + } + mult = nd; std::vector lower_in(nd), widths_in(nd); std::vector nx_in(nd); diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index 7847bd4aba..dd56c39f3a 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,3 +1,3 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2021-08-03" +#define COLVARS_VERSION "2021-08-06" #endif From 5861577a72529815c9a18c47a80f396f8a85b997 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 11:32:49 -0400 Subject: [PATCH 247/352] use temporary vector container to avoid explicit delete[] --- src/modify.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index c617bf1477..a498d5c909 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -1018,13 +1018,12 @@ void Modify::replace_fix(const std::string &oldfix, const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); - char **newarg = new char*[args.size()]; - int i=0; + std::vector newarg(args.size()); + int i = 0; for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - replace_fix(oldfix.c_str(),args.size(),newarg,trysuffix); - delete[] newarg; + replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); } /* ---------------------------------------------------------------------- @@ -1279,13 +1278,12 @@ void Modify::add_compute(int narg, char **arg, int trysuffix) void Modify::add_compute(const std::string &computecmd, int trysuffix) { auto args = utils::split_words(computecmd); - char **newarg = new char*[args.size()]; + std::vectornewarg(args.size()); int i=0; for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_compute(args.size(),newarg,trysuffix); - delete[] newarg; + add_compute(args.size(),newarg.data(),trysuffix); } From 06f6434b381a3b281604812afa9b570ad1249e8b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:00:54 -0400 Subject: [PATCH 248/352] when creating or replacing a fix or compute, return pointer to new instance --- src/modify.cpp | 25 ++++++++++++------------- src/modify.h | 12 ++++++------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index a498d5c909..a114beb938 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -803,7 +803,7 @@ int Modify::min_reset_ref() add a new fix or replace one with same ID ------------------------------------------------------------------------- */ -void Modify::add_fix(int narg, char **arg, int trysuffix) +Fix *Modify::add_fix(int narg, char **arg, int trysuffix) { if (narg < 3) error->all(FLERR,"Illegal fix command"); @@ -956,13 +956,14 @@ void Modify::add_fix(int narg, char **arg, int trysuffix) if (newflag) nfix++; fmask[ifix] = fix[ifix]->setmask(); fix[ifix]->post_constructor(); + return fix[ifix]; } /* ---------------------------------------------------------------------- convenience function to allow adding a fix from a single string ------------------------------------------------------------------------- */ -void Modify::add_fix(const std::string &fixcmd, int trysuffix) +Fix *Modify::add_fix(const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); std::vector newarg(args.size()); @@ -970,7 +971,7 @@ void Modify::add_fix(const std::string &fixcmd, int trysuffix) for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_fix(args.size(),newarg.data(),trysuffix); + return add_fix(args.size(),newarg.data(),trysuffix); } @@ -981,8 +982,7 @@ void Modify::add_fix(const std::string &fixcmd, int trysuffix) replace it later with the desired Fix instance ------------------------------------------------------------------------- */ -void Modify::replace_fix(const char *replaceID, - int narg, char **arg, int trysuffix) +Fix *Modify::replace_fix(const char *replaceID, int narg, char **arg, int trysuffix) { int ifix = find_fix(replaceID); if (ifix < 0) error->all(FLERR,"Modify replace_fix ID could not be found"); @@ -1007,15 +1007,14 @@ void Modify::replace_fix(const char *replaceID, // invoke add_fix // it will find and overwrite the replaceID fix - add_fix(narg,arg,trysuffix); + return add_fix(narg,arg,trysuffix); } /* ---------------------------------------------------------------------- convenience function to allow replacing a fix from a single string ------------------------------------------------------------------------- */ -void Modify::replace_fix(const std::string &oldfix, - const std::string &fixcmd, int trysuffix) +Fix *Modify::replace_fix(const std::string &oldfix, const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); std::vector newarg(args.size()); @@ -1023,7 +1022,7 @@ void Modify::replace_fix(const std::string &oldfix, for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); + return replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); } /* ---------------------------------------------------------------------- @@ -1213,7 +1212,7 @@ int Modify::check_rigid_list_overlap(int *select) add a new compute ------------------------------------------------------------------------- */ -void Modify::add_compute(int narg, char **arg, int trysuffix) +Compute *Modify::add_compute(int narg, char **arg, int trysuffix) { if (narg < 3) error->all(FLERR,"Illegal compute command"); @@ -1268,14 +1267,14 @@ void Modify::add_compute(int narg, char **arg, int trysuffix) if (compute[ncompute] == nullptr) error->all(FLERR,utils::check_packages_for_style("compute",arg[2],lmp)); - ncompute++; + return compute[ncompute++]; } /* ---------------------------------------------------------------------- convenience function to allow adding a compute from a single string ------------------------------------------------------------------------- */ -void Modify::add_compute(const std::string &computecmd, int trysuffix) +Compute *Modify::add_compute(const std::string &computecmd, int trysuffix) { auto args = utils::split_words(computecmd); std::vectornewarg(args.size()); @@ -1283,7 +1282,7 @@ void Modify::add_compute(const std::string &computecmd, int trysuffix) for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_compute(args.size(),newarg.data(),trysuffix); + return add_compute(args.size(),newarg.data(),trysuffix); } diff --git a/src/modify.h b/src/modify.h index 5111ef43ab..9446f285e7 100644 --- a/src/modify.h +++ b/src/modify.h @@ -100,18 +100,18 @@ class Modify : protected Pointers { virtual int min_dof(); virtual int min_reset_ref(); - void add_fix(int, char **, int trysuffix = 1); - void add_fix(const std::string &, int trysuffix = 1); - void replace_fix(const char *, int, char **, int trysuffix = 1); - void replace_fix(const std::string &, const std::string &, int trysuffix = 1); + Fix *add_fix(int, char **, int trysuffix = 1); + Fix *add_fix(const std::string &, int trysuffix = 1); + Fix *replace_fix(const char *, int, char **, int trysuffix = 1); + Fix *replace_fix(const std::string &, const std::string &, int trysuffix = 1); void modify_fix(int, char **); void delete_fix(const std::string &); void delete_fix(int); int find_fix(const std::string &); int find_fix_by_style(const char *); - void add_compute(int, char **, int trysuffix = 1); - void add_compute(const std::string &, int trysuffix = 1); + Compute *add_compute(int, char **, int trysuffix = 1); + Compute *add_compute(const std::string &, int trysuffix = 1); void modify_compute(int, char **); void delete_compute(const std::string &); void delete_compute(int); From b16bca2f45d5b4de23957a30e36b8b66db7b7501 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:09:06 -0400 Subject: [PATCH 249/352] simplify --- src/velocity.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/velocity.cpp b/src/velocity.cpp index acc374fa4a..9397e41861 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -849,15 +849,11 @@ void Velocity::options(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"temp") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command"); - int icompute; - for (icompute = 0; icompute < modify->ncompute; icompute++) - if (strcmp(arg[iarg+1],modify->compute[icompute]->id) == 0) break; - if (icompute == modify->ncompute) - error->all(FLERR,"Could not find velocity temperature ID"); + int icompute = modify->find_compute(arg[iarg+1]); + if (icompute < 0) error->all(FLERR,"Could not find velocity temperature ID"); temperature = modify->compute[icompute]; if (temperature->tempflag == 0) - error->all(FLERR, - "Velocity temperature ID does not compute temperature"); + error->all(FLERR,"Velocity temperature ID does not compute temperature"); iarg += 2; } else if (strcmp(arg[iarg],"bias") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command"); From a7d05cff0932de4c04c0e0f1ddeaa667d300d61f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:12:34 -0400 Subject: [PATCH 250/352] streamline code by using changes in Modify class --- src/velocity.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/velocity.cpp b/src/velocity.cpp index 9397e41861..fa09f451df 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -187,11 +187,11 @@ void Velocity::create(double t_desired, int seed) Compute *temperature_nobias = nullptr; if (temperature == nullptr || bias_flag) { - modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); + auto newcompute = modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); if (temperature == nullptr) { - temperature = modify->compute[modify->ncompute-1]; + temperature = newcompute; tcreate_flag = 1; - } else temperature_nobias = modify->compute[modify->ncompute-1]; + } else temperature_nobias = newcompute; } // initialize temperature computation(s) @@ -575,8 +575,7 @@ void Velocity::scale(int /*narg*/, char **arg) int tflag = 0; if (temperature == nullptr) { - modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); - temperature = modify->compute[modify->ncompute-1]; + temperature = modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); tflag = 1; } From 8baaed57247d6b13f409672e1aabcf577e893fc8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 08:38:06 -0400 Subject: [PATCH 251/352] use const std::string & instead of const char *. avoid exception in sfree() --- src/REAXFF/reaxff_api.h | 6 +++--- src/REAXFF/reaxff_tool_box.cpp | 26 ++++++++++---------------- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/REAXFF/reaxff_api.h b/src/REAXFF/reaxff_api.h index ae3b013541..540012ab8f 100644 --- a/src/REAXFF/reaxff_api.h +++ b/src/REAXFF/reaxff_api.h @@ -141,9 +141,9 @@ namespace ReaxFF // toolbox - extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const char *); - extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const char *); - extern void sfree(LAMMPS_NS::Error *, void *, const char *); + extern void *scalloc(LAMMPS_NS::Error *, rc_bigint, rc_bigint, const std::string &); + extern void *smalloc(LAMMPS_NS::Error *, rc_bigint, const std::string &); + extern void sfree(LAMMPS_NS::Error *, void *, const std::string &); // torsion angles diff --git a/src/REAXFF/reaxff_tool_box.cpp b/src/REAXFF/reaxff_tool_box.cpp index 15ad4b85e3..5ea87ca769 100644 --- a/src/REAXFF/reaxff_tool_box.cpp +++ b/src/REAXFF/reaxff_tool_box.cpp @@ -36,13 +36,12 @@ namespace ReaxFF { /* safe malloc */ - void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name) + void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const std::string &name) { void *ptr; if (n <= 0) { - auto errmsg = fmt::format("Trying to allocate {} bytes for array {}. " - "returning NULL.", n, name); + auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.", n, name); if (error_ptr) error_ptr->one(FLERR,errmsg); else fputs(errmsg.c_str(),stderr); @@ -51,8 +50,7 @@ namespace ReaxFF { ptr = malloc(n); if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", - n, name); + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n, name); if (error_ptr) error_ptr->one(FLERR,errmsg); else fputs(errmsg.c_str(),stderr); } @@ -61,21 +59,19 @@ namespace ReaxFF { } /* safe calloc */ - void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name) + void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const std::string &name) { void *ptr; if (n <= 0) { - auto errmsg = fmt::format("Trying to allocate {} elements for array {}. " - "returning NULL.\n", n, name); + auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.\n", n, name); if (error_ptr) error_ptr->one(FLERR,errmsg); else fputs(errmsg.c_str(),stderr); return nullptr; } if (size <= 0) { - auto errmsg = fmt::format("Elements size for array {} is {}. " - "returning NULL", name, size); + auto errmsg = fmt::format("Elements size for array {} is {}. Returning NULL", name, size); if (error_ptr) error_ptr->one(FLERR,errmsg); else fputs(errmsg.c_str(),stderr); return nullptr; @@ -83,8 +79,7 @@ namespace ReaxFF { ptr = calloc(n, size); if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", - n*size, name); + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n*size, name); if (error_ptr) error_ptr->one(FLERR,errmsg); else fputs(errmsg.c_str(),stderr); } @@ -93,12 +88,11 @@ namespace ReaxFF { } /* safe free */ - void sfree(LAMMPS_NS::Error* error_ptr, void *ptr, const char *name) + void sfree(LAMMPS_NS::Error *error_ptr, void *ptr, const std::string &name) { if (ptr == nullptr) { - auto errmsg = fmt::format("Trying to free the already free()'d pointer {}", - name); - if (error_ptr) error_ptr->one(FLERR,errmsg); + auto errmsg = std::string("Trying to free the already free()'d pointer: ") + name; + if (error_ptr) error_ptr->one(FLERR, errmsg); else fputs(errmsg.c_str(),stderr); return; } From aeef6e67738fc948967c72f6bf29f086767a1a0b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 08:39:32 -0400 Subject: [PATCH 252/352] reformat with clang-format --- src/REAXFF/reaxff_tool_box.cpp | 131 ++++++++++++++++++--------------- 1 file changed, 71 insertions(+), 60 deletions(-) diff --git a/src/REAXFF/reaxff_tool_box.cpp b/src/REAXFF/reaxff_tool_box.cpp index 5ea87ca769..550668197c 100644 --- a/src/REAXFF/reaxff_tool_box.cpp +++ b/src/REAXFF/reaxff_tool_box.cpp @@ -1,4 +1,3 @@ -// clang-format off /*---------------------------------------------------------------------- PuReMD - Purdue ReaxFF Molecular Dynamics Program @@ -35,69 +34,81 @@ namespace ReaxFF { - /* safe malloc */ - void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const std::string &name) - { - void *ptr; +/* safe malloc */ +void *smalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, const std::string &name) +{ + void *ptr; - if (n <= 0) { - auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.", n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); + if (n <= 0) { + auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.", n, name); + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); - return nullptr; - } - - ptr = malloc(n); - if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - } - - return ptr; + return nullptr; } - /* safe calloc */ - void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const std::string &name) - { - void *ptr; - - if (n <= 0) { - auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.\n", n, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - return nullptr; - } - - if (size <= 0) { - auto errmsg = fmt::format("Elements size for array {} is {}. Returning NULL", name, size); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - return nullptr; - } - - ptr = calloc(n, size); - if (ptr == nullptr) { - auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n*size, name); - if (error_ptr) error_ptr->one(FLERR,errmsg); - else fputs(errmsg.c_str(),stderr); - } - - return ptr; + ptr = malloc(n); + if (ptr == nullptr) { + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n, name); + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); } - /* safe free */ - void sfree(LAMMPS_NS::Error *error_ptr, void *ptr, const std::string &name) - { - if (ptr == nullptr) { - auto errmsg = std::string("Trying to free the already free()'d pointer: ") + name; - if (error_ptr) error_ptr->one(FLERR, errmsg); - else fputs(errmsg.c_str(),stderr); - return; - } - - free(ptr); - ptr = nullptr; - } + return ptr; } + +/* safe calloc */ +void *scalloc(LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const std::string &name) +{ + void *ptr; + + if (n <= 0) { + auto errmsg = fmt::format("Invalid size {} for array {}. Returning NULL.\n", n, name); + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); + return nullptr; + } + + if (size <= 0) { + auto errmsg = fmt::format("Elements size for array {} is {}. Returning NULL", name, size); + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); + return nullptr; + } + + ptr = calloc(n, size); + if (ptr == nullptr) { + auto errmsg = fmt::format("Failed to allocate {} bytes for array {}", n * size, name); + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); + } + + return ptr; +} + +/* safe free */ +void sfree(LAMMPS_NS::Error *error_ptr, void *ptr, const std::string &name) +{ + if (ptr == nullptr) { + auto errmsg = std::string("Trying to free the already free()'d pointer: ") + name; + if (error_ptr) + error_ptr->one(FLERR, errmsg); + else + fputs(errmsg.c_str(), stderr); + return; + } + + free(ptr); + ptr = nullptr; +} +} // namespace ReaxFF From 93465f98d8c6e7cb4ce80682c1b5d75015748793 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 09:13:37 -0400 Subject: [PATCH 253/352] improve error message --- src/modify.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modify.cpp b/src/modify.cpp index c617bf1477..b2670fe5f9 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -985,7 +985,7 @@ void Modify::replace_fix(const char *replaceID, int narg, char **arg, int trysuffix) { int ifix = find_fix(replaceID); - if (ifix < 0) error->all(FLERR,"Modify replace_fix ID could not be found"); + if (ifix < 0) error->all(FLERR,"Modify replace_fix ID {} could not be found", replaceID); // change ID, igroup, style of fix being replaced to match new fix // requires some error checking on arguments for new fix From e29bd3d157ed394088d9c599e570afcb1ac670b2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 14:07:43 -0400 Subject: [PATCH 254/352] update defines from -DLMP_USER- to -DLMP_ for consistency --- cmake/Modules/Packages/INTEL.cmake | 2 +- cmake/Modules/Packages/MDI.cmake | 4 ++-- cmake/Modules/Packages/OPENMP.cmake | 2 +- src/INTEL/Install.sh | 2 +- src/INTEL/intel_preprocess.h | 2 +- src/MDI/Install.sh | 2 +- src/OPENMP/Install.sh | 6 +++--- src/accelerator_omp.h | 4 ++-- src/atom.cpp | 4 ++-- src/finish.cpp | 8 ++++---- src/info.cpp | 4 ++-- src/lammps.cpp | 2 +- src/main.cpp | 4 ++-- src/memory.cpp | 4 ++-- src/my_page.cpp | 2 +- src/my_pool_chunk.cpp | 2 +- 16 files changed, 27 insertions(+), 27 deletions(-) diff --git a/cmake/Modules/Packages/INTEL.cmake b/cmake/Modules/Packages/INTEL.cmake index fee86dc870..af08249090 100644 --- a/cmake/Modules/Packages/INTEL.cmake +++ b/cmake/Modules/Packages/INTEL.cmake @@ -3,7 +3,7 @@ if(NOT FOUND_IMMINTRIN) message(FATAL_ERROR "immintrin.h header not found, Intel package won't work without it") endif() -target_compile_definitions(lammps PRIVATE -DLMP_USER_INTEL) +target_compile_definitions(lammps PRIVATE -DLMP_INTEL) set(INTEL_ARCH "cpu" CACHE STRING "Architectures used by INTEL (cpu or knl)") set(INTEL_ARCH_VALUES cpu knl) diff --git a/cmake/Modules/Packages/MDI.cmake b/cmake/Modules/Packages/MDI.cmake index a75160a6d6..047c30c603 100644 --- a/cmake/Modules/Packages/MDI.cmake +++ b/cmake/Modules/Packages/MDI.cmake @@ -114,5 +114,5 @@ else() target_link_libraries(lmp PRIVATE ${mdi_LIBRARY}) endif() -target_compile_definitions(lammps PRIVATE -DLMP_USER_MDI) -target_compile_definitions(lmp PRIVATE -DLMP_USER_MDI) +target_compile_definitions(lammps PRIVATE -DLMP_MDI) +target_compile_definitions(lmp PRIVATE -DLMP_MDI) diff --git a/cmake/Modules/Packages/OPENMP.cmake b/cmake/Modules/Packages/OPENMP.cmake index 0a23e58b4b..a69a81acec 100644 --- a/cmake/Modules/Packages/OPENMP.cmake +++ b/cmake/Modules/Packages/OPENMP.cmake @@ -5,7 +5,7 @@ ${OPENMP_SOURCES_DIR}/fix_nh_omp.cpp ${OPENMP_SOURCES_DIR}/fix_nh_sphere_omp.cpp ${OPENMP_SOURCES_DIR}/domain_omp.cpp) - target_compile_definitions(lammps PRIVATE -DLMP_USER_OMP) + target_compile_definitions(lammps PRIVATE -DLMP_OPENMP) set_property(GLOBAL PROPERTY "OMP_SOURCES" "${OPENMP_SOURCES}") # detects styles which have OPENMP version diff --git a/src/INTEL/Install.sh b/src/INTEL/Install.sh index 8c291f0ae2..94d967b194 100755 --- a/src/INTEL/Install.sh +++ b/src/INTEL/Install.sh @@ -56,7 +56,7 @@ if (test $mode = 1) then if (test -e ../Makefile.package) then sed -i -e 's/[^ \t]*INTEL[^ \t]* //' ../Makefile.package - sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_USER_INTEL |' ../Makefile.package + sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_INTEL |' ../Makefile.package fi elif (test $mode = 0) then diff --git a/src/INTEL/intel_preprocess.h b/src/INTEL/intel_preprocess.h index 9f4c78c9bc..27daa5f3d2 100644 --- a/src/INTEL/intel_preprocess.h +++ b/src/INTEL/intel_preprocess.h @@ -50,7 +50,7 @@ #ifndef LMP_INTEL_PREPROCESS_H #define LMP_INTEL_PREPROCESS_H -// LAMMPS_MEMALIGN is set to 64 by default for -DLMP_USER_INTEL +// LAMMPS_MEMALIGN is set to 64 by default for -DLMP_INTEL // so we only need to error out in case of a different alignment #if LAMMPS_MEMALIGN && (LAMMPS_MEMALIGN != 64) #error Please set -DLAMMPS_MEMALIGN=64 in CCFLAGS of your LAMMPS makefile for INTEL package diff --git a/src/MDI/Install.sh b/src/MDI/Install.sh index 4f1ea6dfba..bc19162a17 100755 --- a/src/MDI/Install.sh +++ b/src/MDI/Install.sh @@ -40,7 +40,7 @@ if (test $1 = 1) then sed -i -e 's/[^ \t]*mdi[^ \t]* //g' ../Makefile.package sed -i -e 's|^PKG_INC =[ \t]*|&-I../../lib/mdi/includelink |' ../Makefile.package sed -i -e 's/[^ \t]*MDI[^ \t]* //' ../Makefile.package - sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_USER_MDI |' ../Makefile.package + sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_MDI |' ../Makefile.package sed -i -e 's|^PKG_PATH =[ \t]*|&-L../../lib/mdi/liblink |' ../Makefile.package sed -i -e 's|^PKG_LIB =[ \t]*|&-lmdi |' ../Makefile.package sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(mdi_SYSINC) |' ../Makefile.package diff --git a/src/OPENMP/Install.sh b/src/OPENMP/Install.sh index 6d9423033e..1802f068e9 100755 --- a/src/OPENMP/Install.sh +++ b/src/OPENMP/Install.sh @@ -54,7 +54,7 @@ if (test $mode = 1) then if (test -e ../Makefile.package) then sed -i -e 's/[^ \t]*OMP[^ \t]* //' ../Makefile.package - sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_USER_OMP |' ../Makefile.package + sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_OPENMP |' ../Makefile.package fi # need to delete a bunch of dependency files because they @@ -65,7 +65,7 @@ if (test $mode = 1) then rm -f ../Obj_*/$f done - # force rebuild of files with LMP_USER_OMP switch + # force rebuild of files with LMP_OPENMP switch touch ../accelerator_omp.h @@ -83,7 +83,7 @@ elif (test $mode = 0) then rm -f ../Obj_*/$f done - # force rebuild of files with LMP_USER_OMP switch + # force rebuild of files with LMP_OPENMP switch touch ../accelerator_omp.h diff --git a/src/accelerator_omp.h b/src/accelerator_omp.h index 437ce3e413..0a85816684 100644 --- a/src/accelerator_omp.h +++ b/src/accelerator_omp.h @@ -13,7 +13,7 @@ // NOTE: this file is *supposed* to be included multiple times -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP // true interface to OPENMP @@ -41,4 +41,4 @@ class DomainOMP : public Domain { #endif /* LMP_DOMAIN_OMP_H */ -#endif /* !LMP_USER_OMP */ +#endif /* !LMP_OPENMP */ diff --git a/src/atom.cpp b/src/atom.cpp index 6063398f40..0a629e2fe6 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -38,7 +38,7 @@ #include #include -#ifdef LMP_USER_INTEL +#ifdef LMP_INTEL #include "neigh_request.h" #endif @@ -2196,7 +2196,7 @@ void Atom::setup_sort_bins() bininvy = nbiny / (bboxhi[1]-bboxlo[1]); bininvz = nbinz / (bboxhi[2]-bboxlo[2]); -#ifdef LMP_USER_INTEL +#ifdef LMP_INTEL int intel_neigh = 0; if (neighbor->nrequest) { if (neighbor->requests[0]->intel) intel_neigh = 1; diff --git a/src/finish.cpp b/src/finish.cpp index 210b48dcb7..81ba59c1df 100644 --- a/src/finish.cpp +++ b/src/finish.cpp @@ -34,7 +34,7 @@ #include #include -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP #include "modify.h" #include "fix_omp.h" #include "thr_data.h" @@ -48,7 +48,7 @@ static void mpi_timings(const char *label, Timer *t, enum Timer::ttype tt, MPI_Comm world, const int nprocs, const int nthreads, const int me, double time_loop, FILE *scr, FILE *log); -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP static void omp_times(FixOMP *fix, const char *label, enum Timer::ttype which, const int nthreads,FILE *scr, FILE *log); #endif @@ -363,7 +363,7 @@ void Finish::end(int flag) } } -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP int ifix = modify->find_fix("package_omp"); // print thread breakdown only with full timer detail @@ -691,7 +691,7 @@ void mpi_timings(const char *label, Timer *t, enum Timer::ttype tt, /* ---------------------------------------------------------------------- */ -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP void omp_times(FixOMP *fix, const char *label, enum Timer::ttype which, const int nthreads,FILE *scr, FILE *log) { diff --git a/src/info.cpp b/src/info.cpp index 6756c174ca..7c0eb572db 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -1222,7 +1222,7 @@ bool Info::has_accelerator_feature(const std::string &package, return lmp_gpu_config(category,setting); } #endif -#if defined(LMP_USER_OMP) +#if defined(LMP_OPENMP) if (package == "OPENMP") { if (category == "precision") { if (setting == "double") return true; @@ -1238,7 +1238,7 @@ bool Info::has_accelerator_feature(const std::string &package, } } #endif -#if defined(LMP_USER_INTEL) +#if defined(LMP_INTEL) if (package == "INTEL") { if (category == "precision") { if (setting == "double") return true; diff --git a/src/lammps.cpp b/src/lammps.cpp index 70174b9d14..5820a625d2 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -798,7 +798,7 @@ void LAMMPS::create() else neighbor = new Neighbor(this); if (kokkos) domain = new DomainKokkos(this); -#ifdef LMP_USER_OMP +#ifdef LMP_OPENMP else domain = new DomainOMP(this); #else else domain = new Domain(this); diff --git a/src/main.cpp b/src/main.cpp index 76ae4fde09..d65247c224 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,7 +31,7 @@ #endif // import MolSSI Driver Interface library -#if defined(LMP_USER_MDI) +#if defined(LMP_MDI) #include #endif @@ -47,7 +47,7 @@ int main(int argc, char **argv) MPI_Comm lammps_comm = MPI_COMM_WORLD; -#if defined(LMP_USER_MDI) +#if defined(LMP_MDI) // initialize MDI interface, if compiled in int mdi_flag; diff --git a/src/memory.cpp b/src/memory.cpp index 8f7faad545..2a053e3dbd 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -16,7 +16,7 @@ #include "error.h" -#if defined(LMP_USER_INTEL) && \ +#if defined(LMP_INTEL) && \ ((defined(__INTEL_COMPILER) || defined(__INTEL_LLVM_COMPILER))) #ifndef LMP_INTEL_NO_TBB #define LMP_USE_TBB_ALLOCATOR @@ -31,7 +31,7 @@ #endif #endif -#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) +#if defined(LMP_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) #define LAMMPS_MEMALIGN 64 #endif diff --git a/src/my_page.cpp b/src/my_page.cpp index 7cbaca2ef7..efad82d3d6 100644 --- a/src/my_page.cpp +++ b/src/my_page.cpp @@ -16,7 +16,7 @@ #include -#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) +#if defined(LMP_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) #define LAMMPS_MEMALIGN 64 #endif diff --git a/src/my_pool_chunk.cpp b/src/my_pool_chunk.cpp index 1c770d0208..484a4b3fcf 100644 --- a/src/my_pool_chunk.cpp +++ b/src/my_pool_chunk.cpp @@ -16,7 +16,7 @@ #include -#if defined(LMP_USER_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) +#if defined(LMP_INTEL) && !defined(LAMMPS_MEMALIGN) && !defined(_WIN32) #define LAMMPS_MEMALIGN 64 #endif From e9e6cdca1d9bace1cd59a50ec6fa6a56f728626d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 14:22:48 -0400 Subject: [PATCH 255/352] using GPU package is not compatible with fix qeq variants --- .../force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml | 2 +- .../tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml index d3e6b38980..31a44ce897 100644 --- a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml +++ b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_point.yaml @@ -2,7 +2,7 @@ lammps_version: 8 Apr 2021 date_generated: Tue Apr 20 14:47:51 2021 epsilon: 7.5e-13 -skip_tests: intel single +skip_tests: intel single gpu prerequisites: ! | pair buck/coul/cut fix qeq/point diff --git a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml index 2a80c30144..ca05006535 100644 --- a/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml +++ b/unittest/force-styles/tests/atomic-pair-buck_coul_cut_qeq_shielded.yaml @@ -2,7 +2,7 @@ lammps_version: 8 Apr 2021 date_generated: Tue Apr 20 14:48:00 2021 epsilon: 7.5e-13 -skip_tests: intel single +skip_tests: intel single gpu prerequisites: ! | pair buck/coul/cut fix qeq/shielded From 03f9ef7de9213f49105f1435c13557c9e5ee852a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 15:34:43 -0400 Subject: [PATCH 256/352] add unique identifier to the history fix so the gran/*/history styles can be used multiple times with pair style hybrid --- src/GRANULAR/pair_gran_hooke_history.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 753cceb247..7137b911f1 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -68,7 +68,7 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) // this is so final order of Modify:fix will conform to input script fix_history = nullptr; - modify->add_fix("NEIGH_HISTORY_HH_DUMMY all DUMMY"); + modify->add_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me)+" all DUMMY"); fix_dummy = (FixDummy *) modify->fix[modify->nfix-1]; } @@ -80,8 +80,8 @@ PairGranHookeHistory::~PairGranHookeHistory() delete [] svector; - if (!fix_history) modify->delete_fix("NEIGH_HISTORY_HH_DUMMY"); - else modify->delete_fix("NEIGH_HISTORY_HH"); + if (!fix_history) modify->delete_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me)); + else modify->delete_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me)); if (allocated) { memory->destroy(setflag); @@ -436,10 +436,9 @@ void PairGranHookeHistory::init_style() // this is so its order in the fix list is preserved if (history && (fix_history == nullptr)) { - auto cmd = fmt::format("NEIGH_HISTORY_HH all NEIGH_HISTORY {}", - size_history); - modify->replace_fix("NEIGH_HISTORY_HH_DUMMY",cmd,1); - int ifix = modify->find_fix("NEIGH_HISTORY_HH"); + auto cmd = fmt::format("NEIGH_HISTORY_HH{} all NEIGH_HISTORY {}", instance_me, size_history); + modify->replace_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me),cmd,1); + int ifix = modify->find_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me)); fix_history = (FixNeighHistory *) modify->fix[ifix]; fix_history->pair = this; } @@ -507,7 +506,7 @@ void PairGranHookeHistory::init_style() // set fix which stores history info if (history) { - int ifix = modify->find_fix("NEIGH_HISTORY_HH"); + int ifix = modify->find_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me)); if (ifix < 0) error->all(FLERR,"Could not find pair fix neigh history ID"); fix_history = (FixNeighHistory *) modify->fix[ifix]; } From 29bf3acd9e81ecba033d12a8f3e3481c8a6c4630 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:34:32 -0400 Subject: [PATCH 257/352] apply changes to modify class --- src/CORESHELL/compute_temp_cs.cpp | 17 ++++--- src/DPD-REACT/fix_rx.cpp | 10 ++-- src/DPD-REACT/fix_rx.h | 2 +- src/EXTRA-COMPUTE/compute_hma.cpp | 5 +- src/FEP/fix_adapt_fep.cpp | 12 ++--- src/GRANULAR/pair_gran_hooke_history.cpp | 36 +++++---------- src/GRANULAR/pair_granular.cpp | 59 ++++++++++-------------- src/KOKKOS/fix_rx_kokkos.cpp | 27 +++++------ src/MISC/pair_srp.cpp | 3 +- src/OPENMP/pair_reaxff_omp.cpp | 6 +-- src/REACTION/fix_bond_react.cpp | 45 ++++++------------ 11 files changed, 84 insertions(+), 138 deletions(-) diff --git a/src/CORESHELL/compute_temp_cs.cpp b/src/CORESHELL/compute_temp_cs.cpp index ed6634f4b0..04c7a743d8 100644 --- a/src/CORESHELL/compute_temp_cs.cpp +++ b/src/CORESHELL/compute_temp_cs.cpp @@ -19,19 +19,19 @@ #include "compute_temp_cs.h" -#include - #include "atom.h" #include "atom_vec.h" +#include "comm.h" #include "domain.h" -#include "update.h" +#include "error.h" +#include "fix_store.h" #include "force.h" #include "group.h" -#include "modify.h" -#include "fix_store.h" -#include "comm.h" #include "memory.h" -#include "error.h" +#include "modify.h" +#include "update.h" + +#include using namespace LAMMPS_NS; @@ -74,8 +74,7 @@ ComputeTempCS::ComputeTempCS(LAMMPS *lmp, int narg, char **arg) : strcpy(id_fix,fixcmd.c_str()); fixcmd += fmt::format(" {} STORE peratom 0 1", group->names[igroup]); - modify->add_fix(fixcmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *)modify->add_fix(fixcmd); // set fix store values = 0 for now // fill them in via setup() once Comm::borders() has been called diff --git a/src/DPD-REACT/fix_rx.cpp b/src/DPD-REACT/fix_rx.cpp index 52dcaaf2d5..e50e145853 100644 --- a/src/DPD-REACT/fix_rx.cpp +++ b/src/DPD-REACT/fix_rx.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "domain.h" #include "error.h" +#include "fix_property_atom.h" #include "force.h" #include "group.h" #include "math_special.h" @@ -344,12 +345,9 @@ void FixRX::post_constructor() newcmd1 += " ghost yes"; newcmd2 += " ghost yes"; - modify->add_fix(newcmd1); - fix_species = (FixPropertyAtom *) modify->fix[modify->nfix-1]; - restartFlag = modify->fix[modify->nfix-1]->restart_reset; - - modify->add_fix(newcmd2); - fix_species_old = (FixPropertyAtom *) modify->fix[modify->nfix-1]; + fix_species = (FixPropertyAtom *) modify->add_fix(newcmd1); + restartFlag = fix_species->restart_reset; + fix_species_old = (FixPropertyAtom *) modify->add_fix(newcmd2); if (nspecies==0) error->all(FLERR,"There are no rx species specified."); diff --git a/src/DPD-REACT/fix_rx.h b/src/DPD-REACT/fix_rx.h index debf4d911e..1d65c4c09e 100644 --- a/src/DPD-REACT/fix_rx.h +++ b/src/DPD-REACT/fix_rx.h @@ -136,7 +136,7 @@ class FixRX : public Fix { //!< ODE Solver diagnostics. void odeDiagnostics(void); - private: + protected: char *kineticsFile; char *id_fix_species, *id_fix_species_old; class FixPropertyAtom *fix_species, *fix_species_old; diff --git a/src/EXTRA-COMPUTE/compute_hma.cpp b/src/EXTRA-COMPUTE/compute_hma.cpp index 09a2840906..043dcec6cf 100644 --- a/src/EXTRA-COMPUTE/compute_hma.cpp +++ b/src/EXTRA-COMPUTE/compute_hma.cpp @@ -91,9 +91,8 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : // our new fix's group = same as compute group id_fix = utils::strdup(std::string(id)+"_COMPUTE_STORE"); - modify->add_fix(fmt::format("{} {} STORE peratom 1 3", - id_fix, group->names[igroup])); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *)modify->add_fix(fmt::format("{} {} STORE peratom 1 3", + id_fix, group->names[igroup])); // calculate xu,yu,zu for fix store array // skip if reset from restart file diff --git a/src/FEP/fix_adapt_fep.cpp b/src/FEP/fix_adapt_fep.cpp index b5aad03887..3b4290f2c9 100644 --- a/src/FEP/fix_adapt_fep.cpp +++ b/src/FEP/fix_adapt_fep.cpp @@ -216,10 +216,8 @@ void FixAdaptFEP::post_constructor() id_fix_chg = nullptr; if (diamflag) { - auto cmd = fmt::format("{}_FIX_STORE_DIAM {} STORE peratom 1 1", - group->names[igroup]); - modify->add_fix(cmd); - fix_diam = (FixStore *) modify->fix[modify->nfix-1]; + auto cmd = fmt::format("{}_FIX_STORE_DIAM {} STORE peratom 1 1", group->names[igroup]); + fix_diam = (FixStore *) modify->add_fix(cmd); if (fix_diam->restart_reset) fix_diam->restart_reset = 0; else { @@ -236,10 +234,8 @@ void FixAdaptFEP::post_constructor() } if (chgflag) { - auto cmd = fmt::format("{}_FIX_STORE_CHG {} STORE peratom 1 1", - group->names[igroup]); - modify->add_fix(cmd); - fix_chg = (FixStore *) modify->fix[modify->nfix-1]; + auto cmd = fmt::format("{}_FIX_STORE_CHG {} STORE peratom 1 1", group->names[igroup]); + fix_chg = (FixStore *) modify->add_fix(cmd); if (fix_chg->restart_reset) fix_chg->restart_reset = 0; else { diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 753cceb247..cf51d5db3e 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -68,8 +67,7 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) // this is so final order of Modify:fix will conform to input script fix_history = nullptr; - modify->add_fix("NEIGH_HISTORY_HH_DUMMY all DUMMY"); - fix_dummy = (FixDummy *) modify->fix[modify->nfix-1]; + fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_HH_DUMMY all DUMMY"); } /* ---------------------------------------------------------------------- */ @@ -436,22 +434,19 @@ void PairGranHookeHistory::init_style() // this is so its order in the fix list is preserved if (history && (fix_history == nullptr)) { - auto cmd = fmt::format("NEIGH_HISTORY_HH all NEIGH_HISTORY {}", - size_history); - modify->replace_fix("NEIGH_HISTORY_HH_DUMMY",cmd,1); - int ifix = modify->find_fix("NEIGH_HISTORY_HH"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; + auto cmd = fmt::format("NEIGH_HISTORY_HH all NEIGH_HISTORY {}", size_history); + fix_history = (FixNeighHistory *) modify->replace_fix("NEIGH_HISTORY_HH_DUMMY", cmd, 1); fix_history->pair = this; } // check for FixFreeze and set freeze_group_bit - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; + int ifreeze = modify->find_fix_by_style("^freeze"); + if (ifreeze < 0) freeze_group_bit = 0; + else freeze_group_bit = modify->fix[ifreeze]->groupbit; // check for FixRigid so can extract rigid body masses + // FIXME: this only catches the first rigid fix, there may be multiple. fix_rigid = nullptr; for (i = 0; i < modify->nfix; i++) @@ -460,15 +455,8 @@ void PairGranHookeHistory::init_style() // check for FixPour and FixDeposit so can extract particle radii - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; + int ipour = modify->find_fix_by_style("^pour"); + int idep = modify->find_fix_by_style("^deposit"); // set maxrad_dynamic and maxrad_frozen for each type // include future FixPour and FixDeposit particles as dynamic @@ -499,10 +487,8 @@ void PairGranHookeHistory::init_style() else onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); // set fix which stores history info diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index cca349b819..d0e75d4812 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -20,25 +20,24 @@ #include "pair_granular.h" -#include -#include - #include "atom.h" -#include "force.h" -#include "update.h" -#include "modify.h" +#include "comm.h" +#include "error.h" #include "fix.h" #include "fix_dummy.h" #include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" +#include "force.h" #include "math_const.h" #include "math_special.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "update.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -103,8 +102,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) // this is so final order of Modify:fix will conform to input script fix_history = nullptr; - modify->add_fix("NEIGH_HISTORY_GRANULAR_DUMMY all DUMMY"); - fix_dummy = (FixDummy *) modify->fix[modify->nfix-1]; + fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_GRANULAR_DUMMY all DUMMY"); } /* ---------------------------------------------------------------------- */ @@ -1122,21 +1120,21 @@ void PairGranular::init_style() // this is so its order in the fix list is preserved if (use_history && fix_history == nullptr) { - modify->replace_fix("NEIGH_HISTORY_GRANULAR_DUMMY","NEIGH_HISTORY_GRANULAR" - " all NEIGH_HISTORY " + std::to_string(size_history),1); - int ifix = modify->find_fix("NEIGH_HISTORY_GRANULAR"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; + fix_history = (FixNeighHistory *) modify->replace_fix("NEIGH_HISTORY_GRANULAR_DUMMY", + "NEIGH_HISTORY_GRANULAR" + " all NEIGH_HISTORY " + + std::to_string(size_history),1); fix_history->pair = this; } // check for FixFreeze and set freeze_group_bit - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; + int ifix = modify->find_fix_by_style("^freeze"); + if (ifix < 0) freeze_group_bit = 0; + else freeze_group_bit = modify->fix[ifix]->groupbit; // check for FixRigid so can extract rigid body masses + // FIXME: this only catches the first rigid fix, there may be multiple. fix_rigid = nullptr; for (i = 0; i < modify->nfix; i++) @@ -1145,15 +1143,8 @@ void PairGranular::init_style() // check for FixPour and FixDeposit so can extract particle radii - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; + int ipour = modify->find_fix_by_style("^pour"); + int idep = modify->find_fix_by_style("^deposit"); // set maxrad_dynamic and maxrad_frozen for each type // include future FixPour and FixDeposit particles as dynamic @@ -1187,10 +1178,8 @@ void PairGranular::init_style() } } - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); // set fix which stores history info diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp index 7bc7bf95c3..15b4a39849 100644 --- a/src/KOKKOS/fix_rx_kokkos.cpp +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -13,24 +13,25 @@ ------------------------------------------------------------------------- */ #include "fix_rx_kokkos.h" -#include -#include "atom_masks.h" + #include "atom_kokkos.h" -#include "force.h" -#include "memory_kokkos.h" -#include "update.h" -#include "modify.h" -#include "neighbor.h" -#include "neigh_list_kokkos.h" -#include "neigh_request.h" -#include "error.h" -#include "math_special_kokkos.h" +#include "atom_masks.h" #include "comm.h" #include "domain.h" +#include "error.h" +#include "fix_property_atom.h" +#include "force.h" #include "kokkos.h" - +#include "math_special_kokkos.h" +#include "memory_kokkos.h" +#include "modify.h" +#include "neigh_list_kokkos.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "update.h" #include // DBL_EPSILON +#include using namespace LAMMPS_NS; using namespace FixConst; @@ -104,7 +105,7 @@ void FixRxKokkos::post_constructor() FixRX::post_constructor(); // Need a copy of this - this->my_restartFlag = modify->fix[modify->nfix-1]->restart_reset; + this->my_restartFlag = fix_species->restart_reset; } /* ---------------------------------------------------------------------- */ diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index 332e103b12..0fef989c88 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -84,8 +84,7 @@ PairSRP::PairSRP(LAMMPS *lmp) : Pair(lmp), fix_id(nullptr) // will be invoked before other fixes that migrate atoms // this is checked for in FixSRP - modify->add_fix(fmt::format("{:02d}_FIX_SRP all SRP",srp_instance)); - f_srp = (FixSRP *) modify->fix[modify->nfix-1]; + f_srp = (FixSRP *) modify->add_fix(fmt::format("{:02d}_FIX_SRP all SRP",srp_instance)); ++srp_instance; } diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 69d68e67e8..6cf3e90575 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -136,10 +136,8 @@ void PairReaxFFOMP::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - if (fix_reaxff == nullptr) { - modify->add_fix(fmt::format("{} all REAXFF",fix_id)); - fix_reaxff = (FixReaxFF *) modify->fix[modify->nfix-1]; - } + if (fix_reaxff == nullptr) + fix_reaxff = (FixReaxFF *) modify->add_fix(fmt::format("{} all REAXFF",fix_id)); api->control->nthreads = comm->nthreads; } diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index 46d7efdf8d..e52347727f 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -701,37 +701,25 @@ it will have the name 'i_limit_tags' and will be intitialized to 0 (not in group void FixBondReact::post_constructor() { // let's add the limit_tags per-atom property fix - std::string cmd = std::string("bond_react_props_internal"); - id_fix2 = new char[cmd.size()+1]; - strcpy(id_fix2,cmd.c_str()); - - int ifix = modify->find_fix(id_fix2); - if (ifix == -1) { - cmd += std::string(" all property/atom i_limit_tags i_react_tags ghost yes"); - modify->add_fix(cmd); - } + id_fix2 = utils::strdup("bond_react_props_internal"); + if (modify->find_fix(id_fix2) < 0) + modify->add_fix(std::string(id_fix2)+" all property/atom i_limit_tags i_react_tags ghost yes"); // create master_group if not already existing // NOTE: limit_tags and react_tags automaticaly intitialized to zero (unless read from restart) group->find_or_create(master_group); - cmd = fmt::format("{} dynamic all property limit_tags",master_group); + std::string cmd = fmt::format("{} dynamic all property limit_tags",master_group); group->assign(cmd); if (stabilization_flag == 1) { int groupid = group->find(exclude_group); // create exclude_group if not already existing, or use as parent group if static if (groupid == -1 || group->dynamic[groupid] == 0) { - // create stabilization per-atom property - cmd = std::string("bond_react_stabilization_internal"); - id_fix3 = new char[cmd.size()+1]; - strcpy(id_fix3,cmd.c_str()); - ifix = modify->find_fix(id_fix3); - if (ifix == -1) { - cmd += std::string(" all property/atom i_statted_tags ghost yes"); - modify->add_fix(cmd); - fix3 = modify->fix[modify->nfix-1]; - } + // create stabilization per-atom property + id_fix3 = utils::strdup("bond_react_stabilization_internal"); + if (modify->find_fix(id_fix3) < 0) + fix3 = modify->add_fix(std::string(id_fix3) + " all property/atom i_statted_tags ghost yes"); statted_id = utils::strdup("statted_tags"); @@ -770,7 +758,7 @@ void FixBondReact::post_constructor() // this returns names of corresponding property int unused; - char * idprop; + char *idprop; idprop = (char *) fix->extract("property",unused); if (idprop == nullptr) error->all(FLERR,"Exclude group must be a per-atom property group"); @@ -787,17 +775,10 @@ void FixBondReact::post_constructor() // let's create a new nve/limit fix to limit newly reacted atoms - cmd = std::string("bond_react_MASTER_nve_limit"); - id_fix1 = new char[cmd.size()+1]; - strcpy(id_fix1,cmd.c_str()); - - ifix = modify->find_fix(id_fix1); - - if (ifix == -1) { - cmd += fmt::format(" {} nve/limit {}",master_group,nve_limit_xmax); - modify->add_fix(cmd); - fix1 = modify->fix[modify->nfix-1]; - } + id_fix1 = utils::strdup("bond_react_MASTER_nve_limit"); + if (modify->find_fix(id_fix1) < 0) + fix1 = modify->add_fix(fmt::format("{} {} nve/limit {}", + id_fix1,master_group,nve_limit_xmax)); } } From 06371629d6749d6a1a772848492a9f5e48f60c80 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:44:42 -0400 Subject: [PATCH 258/352] workaround for PGI compilers --- cmake/Modules/Packages/MACHDYN.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/Modules/Packages/MACHDYN.cmake b/cmake/Modules/Packages/MACHDYN.cmake index 6d941f9798..efe8a562eb 100644 --- a/cmake/Modules/Packages/MACHDYN.cmake +++ b/cmake/Modules/Packages/MACHDYN.cmake @@ -30,3 +30,8 @@ else() endif() target_link_libraries(lammps PRIVATE Eigen3::Eigen) endif() + +# PGI/Nvidia compiler internals collide with vector intrinsics support in Eigen3 +if((CMAKE_CXX_COMPILER_ID STREQUAL "PGI") OR (CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC")) + target_compile_definitions(lammps PRIVATE -DEIGEN_DONT_VECTORIZE) +endif() From 0123f9290f6f85d9cf109db4664ebc8b95d36c89 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:53:46 -0400 Subject: [PATCH 259/352] update Eigen3 to support the latest stable release 3.3.9 --- cmake/Modules/Packages/MACHDYN.cmake | 4 ++-- lib/machdyn/Install.py | 3 ++- lib/machdyn/Makefile.lammps | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/Modules/Packages/MACHDYN.cmake b/cmake/Modules/Packages/MACHDYN.cmake index efe8a562eb..fab532541e 100644 --- a/cmake/Modules/Packages/MACHDYN.cmake +++ b/cmake/Modules/Packages/MACHDYN.cmake @@ -7,8 +7,8 @@ endif() option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" ${DOWNLOAD_EIGEN3_DEFAULT}) if(DOWNLOAD_EIGEN3) message(STATUS "Eigen3 download requested - we will build our own") - set(EIGEN3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz" CACHE STRING "URL for Eigen3 tarball") - set(EIGEN3_MD5 "9e30f67e8531477de4117506fe44669b" CACHE STRING "MD5 checksum of Eigen3 tarball") + set(EIGEN3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz" CACHE STRING "URL for Eigen3 tarball") + set(EIGEN3_MD5 "609286804b0f79be622ccf7f9ff2b660" CACHE STRING "MD5 checksum of Eigen3 tarball") mark_as_advanced(EIGEN3_URL) mark_as_advanced(EIGEN3_MD5) include(ExternalProject) diff --git a/lib/machdyn/Install.py b/lib/machdyn/Install.py index 16dd3038a8..2e90c9ca0f 100644 --- a/lib/machdyn/Install.py +++ b/lib/machdyn/Install.py @@ -17,11 +17,12 @@ parser = ArgumentParser(prog='Install.py', # settings -version = '3.3.7' +version = '3.3.9' tarball = "eigen.tar.gz" # known checksums for different Eigen versions. used to validate the download. checksums = { \ + '3.3.9' : '609286804b0f79be622ccf7f9ff2b660', \ '3.3.7' : '9e30f67e8531477de4117506fe44669b' \ } diff --git a/lib/machdyn/Makefile.lammps b/lib/machdyn/Makefile.lammps index 6c914708dd..71db4fd4bc 100644 --- a/lib/machdyn/Makefile.lammps +++ b/lib/machdyn/Makefile.lammps @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -machdyn_SYSINC = -I../../lib/includelink/eigen3 -machdyn_SYSLIB = -machdyn_SYSPATH = +machdyn_SYSINC = +machdyn_SYSLIB = +machdyn_SYSPATH = From e789bf8925fc2cfc8c002e231f3f88feca2273ea Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 11:32:49 -0400 Subject: [PATCH 260/352] use temporary vector container to avoid explicit delete[] --- src/modify.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index b2670fe5f9..42c3e62d07 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -1018,13 +1018,12 @@ void Modify::replace_fix(const std::string &oldfix, const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); - char **newarg = new char*[args.size()]; - int i=0; + std::vector newarg(args.size()); + int i = 0; for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - replace_fix(oldfix.c_str(),args.size(),newarg,trysuffix); - delete[] newarg; + replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); } /* ---------------------------------------------------------------------- @@ -1279,13 +1278,12 @@ void Modify::add_compute(int narg, char **arg, int trysuffix) void Modify::add_compute(const std::string &computecmd, int trysuffix) { auto args = utils::split_words(computecmd); - char **newarg = new char*[args.size()]; + std::vectornewarg(args.size()); int i=0; for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_compute(args.size(),newarg,trysuffix); - delete[] newarg; + add_compute(args.size(),newarg.data(),trysuffix); } From 01f5b7e09562c8832d6cf34e0871d836fe1a5d9a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:00:54 -0400 Subject: [PATCH 261/352] when creating or replacing a fix or compute, return pointer to new instance --- src/modify.cpp | 25 ++++++++++++------------- src/modify.h | 12 ++++++------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/modify.cpp b/src/modify.cpp index 42c3e62d07..53df8092aa 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -803,7 +803,7 @@ int Modify::min_reset_ref() add a new fix or replace one with same ID ------------------------------------------------------------------------- */ -void Modify::add_fix(int narg, char **arg, int trysuffix) +Fix *Modify::add_fix(int narg, char **arg, int trysuffix) { if (narg < 3) error->all(FLERR,"Illegal fix command"); @@ -956,13 +956,14 @@ void Modify::add_fix(int narg, char **arg, int trysuffix) if (newflag) nfix++; fmask[ifix] = fix[ifix]->setmask(); fix[ifix]->post_constructor(); + return fix[ifix]; } /* ---------------------------------------------------------------------- convenience function to allow adding a fix from a single string ------------------------------------------------------------------------- */ -void Modify::add_fix(const std::string &fixcmd, int trysuffix) +Fix *Modify::add_fix(const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); std::vector newarg(args.size()); @@ -970,7 +971,7 @@ void Modify::add_fix(const std::string &fixcmd, int trysuffix) for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_fix(args.size(),newarg.data(),trysuffix); + return add_fix(args.size(),newarg.data(),trysuffix); } @@ -981,8 +982,7 @@ void Modify::add_fix(const std::string &fixcmd, int trysuffix) replace it later with the desired Fix instance ------------------------------------------------------------------------- */ -void Modify::replace_fix(const char *replaceID, - int narg, char **arg, int trysuffix) +Fix *Modify::replace_fix(const char *replaceID, int narg, char **arg, int trysuffix) { int ifix = find_fix(replaceID); if (ifix < 0) error->all(FLERR,"Modify replace_fix ID {} could not be found", replaceID); @@ -1007,15 +1007,14 @@ void Modify::replace_fix(const char *replaceID, // invoke add_fix // it will find and overwrite the replaceID fix - add_fix(narg,arg,trysuffix); + return add_fix(narg,arg,trysuffix); } /* ---------------------------------------------------------------------- convenience function to allow replacing a fix from a single string ------------------------------------------------------------------------- */ -void Modify::replace_fix(const std::string &oldfix, - const std::string &fixcmd, int trysuffix) +Fix *Modify::replace_fix(const std::string &oldfix, const std::string &fixcmd, int trysuffix) { auto args = utils::split_words(fixcmd); std::vector newarg(args.size()); @@ -1023,7 +1022,7 @@ void Modify::replace_fix(const std::string &oldfix, for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); + return replace_fix(oldfix.c_str(),args.size(),newarg.data(),trysuffix); } /* ---------------------------------------------------------------------- @@ -1213,7 +1212,7 @@ int Modify::check_rigid_list_overlap(int *select) add a new compute ------------------------------------------------------------------------- */ -void Modify::add_compute(int narg, char **arg, int trysuffix) +Compute *Modify::add_compute(int narg, char **arg, int trysuffix) { if (narg < 3) error->all(FLERR,"Illegal compute command"); @@ -1268,14 +1267,14 @@ void Modify::add_compute(int narg, char **arg, int trysuffix) if (compute[ncompute] == nullptr) error->all(FLERR,utils::check_packages_for_style("compute",arg[2],lmp)); - ncompute++; + return compute[ncompute++]; } /* ---------------------------------------------------------------------- convenience function to allow adding a compute from a single string ------------------------------------------------------------------------- */ -void Modify::add_compute(const std::string &computecmd, int trysuffix) +Compute *Modify::add_compute(const std::string &computecmd, int trysuffix) { auto args = utils::split_words(computecmd); std::vectornewarg(args.size()); @@ -1283,7 +1282,7 @@ void Modify::add_compute(const std::string &computecmd, int trysuffix) for (const auto &arg : args) { newarg[i++] = (char *)arg.c_str(); } - add_compute(args.size(),newarg.data(),trysuffix); + return add_compute(args.size(),newarg.data(),trysuffix); } diff --git a/src/modify.h b/src/modify.h index 5111ef43ab..9446f285e7 100644 --- a/src/modify.h +++ b/src/modify.h @@ -100,18 +100,18 @@ class Modify : protected Pointers { virtual int min_dof(); virtual int min_reset_ref(); - void add_fix(int, char **, int trysuffix = 1); - void add_fix(const std::string &, int trysuffix = 1); - void replace_fix(const char *, int, char **, int trysuffix = 1); - void replace_fix(const std::string &, const std::string &, int trysuffix = 1); + Fix *add_fix(int, char **, int trysuffix = 1); + Fix *add_fix(const std::string &, int trysuffix = 1); + Fix *replace_fix(const char *, int, char **, int trysuffix = 1); + Fix *replace_fix(const std::string &, const std::string &, int trysuffix = 1); void modify_fix(int, char **); void delete_fix(const std::string &); void delete_fix(int); int find_fix(const std::string &); int find_fix_by_style(const char *); - void add_compute(int, char **, int trysuffix = 1); - void add_compute(const std::string &, int trysuffix = 1); + Compute *add_compute(int, char **, int trysuffix = 1); + Compute *add_compute(const std::string &, int trysuffix = 1); void modify_compute(int, char **); void delete_compute(const std::string &); void delete_compute(int); From 0d9344c9e2335aaf6f51c9efe03efff807768594 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:09:06 -0400 Subject: [PATCH 262/352] simplify --- src/velocity.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/velocity.cpp b/src/velocity.cpp index acc374fa4a..9397e41861 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -849,15 +849,11 @@ void Velocity::options(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"temp") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command"); - int icompute; - for (icompute = 0; icompute < modify->ncompute; icompute++) - if (strcmp(arg[iarg+1],modify->compute[icompute]->id) == 0) break; - if (icompute == modify->ncompute) - error->all(FLERR,"Could not find velocity temperature ID"); + int icompute = modify->find_compute(arg[iarg+1]); + if (icompute < 0) error->all(FLERR,"Could not find velocity temperature ID"); temperature = modify->compute[icompute]; if (temperature->tempflag == 0) - error->all(FLERR, - "Velocity temperature ID does not compute temperature"); + error->all(FLERR,"Velocity temperature ID does not compute temperature"); iarg += 2; } else if (strcmp(arg[iarg],"bias") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command"); From 0b30f57812a911ad0a51f72a92125bc911957096 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 12:12:34 -0400 Subject: [PATCH 263/352] streamline code by using changes in Modify class --- src/velocity.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/velocity.cpp b/src/velocity.cpp index 9397e41861..fa09f451df 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -187,11 +187,11 @@ void Velocity::create(double t_desired, int seed) Compute *temperature_nobias = nullptr; if (temperature == nullptr || bias_flag) { - modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); + auto newcompute = modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); if (temperature == nullptr) { - temperature = modify->compute[modify->ncompute-1]; + temperature = newcompute; tcreate_flag = 1; - } else temperature_nobias = modify->compute[modify->ncompute-1]; + } else temperature_nobias = newcompute; } // initialize temperature computation(s) @@ -575,8 +575,7 @@ void Velocity::scale(int /*narg*/, char **arg) int tflag = 0; if (temperature == nullptr) { - modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); - temperature = modify->compute[modify->ncompute-1]; + temperature = modify->add_compute(fmt::format("velocity_temp {} temp",group->names[igroup])); tflag = 1; } From 156790df2c96e90bf63ee7b6d52173ef12e452fc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:34:32 -0400 Subject: [PATCH 264/352] apply changes to modify class --- src/CORESHELL/compute_temp_cs.cpp | 17 ++++--- src/DPD-REACT/fix_rx.cpp | 10 ++-- src/DPD-REACT/fix_rx.h | 2 +- src/EXTRA-COMPUTE/compute_hma.cpp | 5 +- src/FEP/fix_adapt_fep.cpp | 12 ++--- src/GRANULAR/pair_gran_hooke_history.cpp | 35 +++++--------- src/GRANULAR/pair_granular.cpp | 59 ++++++++++-------------- src/KOKKOS/fix_rx_kokkos.cpp | 27 +++++------ src/MISC/pair_srp.cpp | 3 +- src/OPENMP/pair_reaxff_omp.cpp | 6 +-- src/REACTION/fix_bond_react.cpp | 45 ++++++------------ 11 files changed, 85 insertions(+), 136 deletions(-) diff --git a/src/CORESHELL/compute_temp_cs.cpp b/src/CORESHELL/compute_temp_cs.cpp index ed6634f4b0..04c7a743d8 100644 --- a/src/CORESHELL/compute_temp_cs.cpp +++ b/src/CORESHELL/compute_temp_cs.cpp @@ -19,19 +19,19 @@ #include "compute_temp_cs.h" -#include - #include "atom.h" #include "atom_vec.h" +#include "comm.h" #include "domain.h" -#include "update.h" +#include "error.h" +#include "fix_store.h" #include "force.h" #include "group.h" -#include "modify.h" -#include "fix_store.h" -#include "comm.h" #include "memory.h" -#include "error.h" +#include "modify.h" +#include "update.h" + +#include using namespace LAMMPS_NS; @@ -74,8 +74,7 @@ ComputeTempCS::ComputeTempCS(LAMMPS *lmp, int narg, char **arg) : strcpy(id_fix,fixcmd.c_str()); fixcmd += fmt::format(" {} STORE peratom 0 1", group->names[igroup]); - modify->add_fix(fixcmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *)modify->add_fix(fixcmd); // set fix store values = 0 for now // fill them in via setup() once Comm::borders() has been called diff --git a/src/DPD-REACT/fix_rx.cpp b/src/DPD-REACT/fix_rx.cpp index 52dcaaf2d5..e50e145853 100644 --- a/src/DPD-REACT/fix_rx.cpp +++ b/src/DPD-REACT/fix_rx.cpp @@ -18,6 +18,7 @@ #include "comm.h" #include "domain.h" #include "error.h" +#include "fix_property_atom.h" #include "force.h" #include "group.h" #include "math_special.h" @@ -344,12 +345,9 @@ void FixRX::post_constructor() newcmd1 += " ghost yes"; newcmd2 += " ghost yes"; - modify->add_fix(newcmd1); - fix_species = (FixPropertyAtom *) modify->fix[modify->nfix-1]; - restartFlag = modify->fix[modify->nfix-1]->restart_reset; - - modify->add_fix(newcmd2); - fix_species_old = (FixPropertyAtom *) modify->fix[modify->nfix-1]; + fix_species = (FixPropertyAtom *) modify->add_fix(newcmd1); + restartFlag = fix_species->restart_reset; + fix_species_old = (FixPropertyAtom *) modify->add_fix(newcmd2); if (nspecies==0) error->all(FLERR,"There are no rx species specified."); diff --git a/src/DPD-REACT/fix_rx.h b/src/DPD-REACT/fix_rx.h index debf4d911e..1d65c4c09e 100644 --- a/src/DPD-REACT/fix_rx.h +++ b/src/DPD-REACT/fix_rx.h @@ -136,7 +136,7 @@ class FixRX : public Fix { //!< ODE Solver diagnostics. void odeDiagnostics(void); - private: + protected: char *kineticsFile; char *id_fix_species, *id_fix_species_old; class FixPropertyAtom *fix_species, *fix_species_old; diff --git a/src/EXTRA-COMPUTE/compute_hma.cpp b/src/EXTRA-COMPUTE/compute_hma.cpp index 09a2840906..043dcec6cf 100644 --- a/src/EXTRA-COMPUTE/compute_hma.cpp +++ b/src/EXTRA-COMPUTE/compute_hma.cpp @@ -91,9 +91,8 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : // our new fix's group = same as compute group id_fix = utils::strdup(std::string(id)+"_COMPUTE_STORE"); - modify->add_fix(fmt::format("{} {} STORE peratom 1 3", - id_fix, group->names[igroup])); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *)modify->add_fix(fmt::format("{} {} STORE peratom 1 3", + id_fix, group->names[igroup])); // calculate xu,yu,zu for fix store array // skip if reset from restart file diff --git a/src/FEP/fix_adapt_fep.cpp b/src/FEP/fix_adapt_fep.cpp index b5aad03887..3b4290f2c9 100644 --- a/src/FEP/fix_adapt_fep.cpp +++ b/src/FEP/fix_adapt_fep.cpp @@ -216,10 +216,8 @@ void FixAdaptFEP::post_constructor() id_fix_chg = nullptr; if (diamflag) { - auto cmd = fmt::format("{}_FIX_STORE_DIAM {} STORE peratom 1 1", - group->names[igroup]); - modify->add_fix(cmd); - fix_diam = (FixStore *) modify->fix[modify->nfix-1]; + auto cmd = fmt::format("{}_FIX_STORE_DIAM {} STORE peratom 1 1", group->names[igroup]); + fix_diam = (FixStore *) modify->add_fix(cmd); if (fix_diam->restart_reset) fix_diam->restart_reset = 0; else { @@ -236,10 +234,8 @@ void FixAdaptFEP::post_constructor() } if (chgflag) { - auto cmd = fmt::format("{}_FIX_STORE_CHG {} STORE peratom 1 1", - group->names[igroup]); - modify->add_fix(cmd); - fix_chg = (FixStore *) modify->fix[modify->nfix-1]; + auto cmd = fmt::format("{}_FIX_STORE_CHG {} STORE peratom 1 1", group->names[igroup]); + fix_chg = (FixStore *) modify->add_fix(cmd); if (fix_chg->restart_reset) fix_chg->restart_reset = 0; else { diff --git a/src/GRANULAR/pair_gran_hooke_history.cpp b/src/GRANULAR/pair_gran_hooke_history.cpp index 7137b911f1..e6013b9940 100644 --- a/src/GRANULAR/pair_gran_hooke_history.cpp +++ b/src/GRANULAR/pair_gran_hooke_history.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -68,8 +67,8 @@ PairGranHookeHistory::PairGranHookeHistory(LAMMPS *lmp) : Pair(lmp) // this is so final order of Modify:fix will conform to input script fix_history = nullptr; - modify->add_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me)+" all DUMMY"); - fix_dummy = (FixDummy *) modify->fix[modify->nfix-1]; + fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_HH_DUMMY" + + std::to_string(instance_me) + " all DUMMY"); } /* ---------------------------------------------------------------------- */ @@ -437,20 +436,19 @@ void PairGranHookeHistory::init_style() if (history && (fix_history == nullptr)) { auto cmd = fmt::format("NEIGH_HISTORY_HH{} all NEIGH_HISTORY {}", instance_me, size_history); - modify->replace_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me),cmd,1); - int ifix = modify->find_fix("NEIGH_HISTORY_HH"+std::to_string(instance_me)); - fix_history = (FixNeighHistory *) modify->fix[ifix]; + fix_history = (FixNeighHistory *) modify->replace_fix("NEIGH_HISTORY_HH_DUMMY" + + std::to_string(instance_me),cmd,1); fix_history->pair = this; } // check for FixFreeze and set freeze_group_bit - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; + int ifreeze = modify->find_fix_by_style("^freeze"); + if (ifreeze < 0) freeze_group_bit = 0; + else freeze_group_bit = modify->fix[ifreeze]->groupbit; // check for FixRigid so can extract rigid body masses + // FIXME: this only catches the first rigid fix, there may be multiple. fix_rigid = nullptr; for (i = 0; i < modify->nfix; i++) @@ -459,15 +457,8 @@ void PairGranHookeHistory::init_style() // check for FixPour and FixDeposit so can extract particle radii - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; + int ipour = modify->find_fix_by_style("^pour"); + int idep = modify->find_fix_by_style("^deposit"); // set maxrad_dynamic and maxrad_frozen for each type // include future FixPour and FixDeposit particles as dynamic @@ -498,10 +489,8 @@ void PairGranHookeHistory::init_style() else onerad_dynamic[type[i]] = MAX(onerad_dynamic[type[i]],radius[i]); - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); // set fix which stores history info diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index cca349b819..d0e75d4812 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -20,25 +20,24 @@ #include "pair_granular.h" -#include -#include - #include "atom.h" -#include "force.h" -#include "update.h" -#include "modify.h" +#include "comm.h" +#include "error.h" #include "fix.h" #include "fix_dummy.h" #include "fix_neigh_history.h" -#include "comm.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "neigh_request.h" -#include "memory.h" -#include "error.h" +#include "force.h" #include "math_const.h" #include "math_special.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "update.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -103,8 +102,7 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) // this is so final order of Modify:fix will conform to input script fix_history = nullptr; - modify->add_fix("NEIGH_HISTORY_GRANULAR_DUMMY all DUMMY"); - fix_dummy = (FixDummy *) modify->fix[modify->nfix-1]; + fix_dummy = (FixDummy *) modify->add_fix("NEIGH_HISTORY_GRANULAR_DUMMY all DUMMY"); } /* ---------------------------------------------------------------------- */ @@ -1122,21 +1120,21 @@ void PairGranular::init_style() // this is so its order in the fix list is preserved if (use_history && fix_history == nullptr) { - modify->replace_fix("NEIGH_HISTORY_GRANULAR_DUMMY","NEIGH_HISTORY_GRANULAR" - " all NEIGH_HISTORY " + std::to_string(size_history),1); - int ifix = modify->find_fix("NEIGH_HISTORY_GRANULAR"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; + fix_history = (FixNeighHistory *) modify->replace_fix("NEIGH_HISTORY_GRANULAR_DUMMY", + "NEIGH_HISTORY_GRANULAR" + " all NEIGH_HISTORY " + + std::to_string(size_history),1); fix_history->pair = this; } // check for FixFreeze and set freeze_group_bit - for (i = 0; i < modify->nfix; i++) - if (strcmp(modify->fix[i]->style,"freeze") == 0) break; - if (i < modify->nfix) freeze_group_bit = modify->fix[i]->groupbit; - else freeze_group_bit = 0; + int ifix = modify->find_fix_by_style("^freeze"); + if (ifix < 0) freeze_group_bit = 0; + else freeze_group_bit = modify->fix[ifix]->groupbit; // check for FixRigid so can extract rigid body masses + // FIXME: this only catches the first rigid fix, there may be multiple. fix_rigid = nullptr; for (i = 0; i < modify->nfix; i++) @@ -1145,15 +1143,8 @@ void PairGranular::init_style() // check for FixPour and FixDeposit so can extract particle radii - int ipour; - for (ipour = 0; ipour < modify->nfix; ipour++) - if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; - if (ipour == modify->nfix) ipour = -1; - - int idep; - for (idep = 0; idep < modify->nfix; idep++) - if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; - if (idep == modify->nfix) idep = -1; + int ipour = modify->find_fix_by_style("^pour"); + int idep = modify->find_fix_by_style("^deposit"); // set maxrad_dynamic and maxrad_frozen for each type // include future FixPour and FixDeposit particles as dynamic @@ -1187,10 +1178,8 @@ void PairGranular::init_style() } } - MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); - MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes, - MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_dynamic[1],&maxrad_dynamic[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); + MPI_Allreduce(&onerad_frozen[1],&maxrad_frozen[1],atom->ntypes,MPI_DOUBLE,MPI_MAX,world); // set fix which stores history info diff --git a/src/KOKKOS/fix_rx_kokkos.cpp b/src/KOKKOS/fix_rx_kokkos.cpp index 7bc7bf95c3..15b4a39849 100644 --- a/src/KOKKOS/fix_rx_kokkos.cpp +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -13,24 +13,25 @@ ------------------------------------------------------------------------- */ #include "fix_rx_kokkos.h" -#include -#include "atom_masks.h" + #include "atom_kokkos.h" -#include "force.h" -#include "memory_kokkos.h" -#include "update.h" -#include "modify.h" -#include "neighbor.h" -#include "neigh_list_kokkos.h" -#include "neigh_request.h" -#include "error.h" -#include "math_special_kokkos.h" +#include "atom_masks.h" #include "comm.h" #include "domain.h" +#include "error.h" +#include "fix_property_atom.h" +#include "force.h" #include "kokkos.h" - +#include "math_special_kokkos.h" +#include "memory_kokkos.h" +#include "modify.h" +#include "neigh_list_kokkos.h" +#include "neigh_request.h" +#include "neighbor.h" +#include "update.h" #include // DBL_EPSILON +#include using namespace LAMMPS_NS; using namespace FixConst; @@ -104,7 +105,7 @@ void FixRxKokkos::post_constructor() FixRX::post_constructor(); // Need a copy of this - this->my_restartFlag = modify->fix[modify->nfix-1]->restart_reset; + this->my_restartFlag = fix_species->restart_reset; } /* ---------------------------------------------------------------------- */ diff --git a/src/MISC/pair_srp.cpp b/src/MISC/pair_srp.cpp index 332e103b12..0fef989c88 100644 --- a/src/MISC/pair_srp.cpp +++ b/src/MISC/pair_srp.cpp @@ -84,8 +84,7 @@ PairSRP::PairSRP(LAMMPS *lmp) : Pair(lmp), fix_id(nullptr) // will be invoked before other fixes that migrate atoms // this is checked for in FixSRP - modify->add_fix(fmt::format("{:02d}_FIX_SRP all SRP",srp_instance)); - f_srp = (FixSRP *) modify->fix[modify->nfix-1]; + f_srp = (FixSRP *) modify->add_fix(fmt::format("{:02d}_FIX_SRP all SRP",srp_instance)); ++srp_instance; } diff --git a/src/OPENMP/pair_reaxff_omp.cpp b/src/OPENMP/pair_reaxff_omp.cpp index 69d68e67e8..6cf3e90575 100644 --- a/src/OPENMP/pair_reaxff_omp.cpp +++ b/src/OPENMP/pair_reaxff_omp.cpp @@ -136,10 +136,8 @@ void PairReaxFFOMP::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - if (fix_reaxff == nullptr) { - modify->add_fix(fmt::format("{} all REAXFF",fix_id)); - fix_reaxff = (FixReaxFF *) modify->fix[modify->nfix-1]; - } + if (fix_reaxff == nullptr) + fix_reaxff = (FixReaxFF *) modify->add_fix(fmt::format("{} all REAXFF",fix_id)); api->control->nthreads = comm->nthreads; } diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index 46d7efdf8d..e52347727f 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -701,37 +701,25 @@ it will have the name 'i_limit_tags' and will be intitialized to 0 (not in group void FixBondReact::post_constructor() { // let's add the limit_tags per-atom property fix - std::string cmd = std::string("bond_react_props_internal"); - id_fix2 = new char[cmd.size()+1]; - strcpy(id_fix2,cmd.c_str()); - - int ifix = modify->find_fix(id_fix2); - if (ifix == -1) { - cmd += std::string(" all property/atom i_limit_tags i_react_tags ghost yes"); - modify->add_fix(cmd); - } + id_fix2 = utils::strdup("bond_react_props_internal"); + if (modify->find_fix(id_fix2) < 0) + modify->add_fix(std::string(id_fix2)+" all property/atom i_limit_tags i_react_tags ghost yes"); // create master_group if not already existing // NOTE: limit_tags and react_tags automaticaly intitialized to zero (unless read from restart) group->find_or_create(master_group); - cmd = fmt::format("{} dynamic all property limit_tags",master_group); + std::string cmd = fmt::format("{} dynamic all property limit_tags",master_group); group->assign(cmd); if (stabilization_flag == 1) { int groupid = group->find(exclude_group); // create exclude_group if not already existing, or use as parent group if static if (groupid == -1 || group->dynamic[groupid] == 0) { - // create stabilization per-atom property - cmd = std::string("bond_react_stabilization_internal"); - id_fix3 = new char[cmd.size()+1]; - strcpy(id_fix3,cmd.c_str()); - ifix = modify->find_fix(id_fix3); - if (ifix == -1) { - cmd += std::string(" all property/atom i_statted_tags ghost yes"); - modify->add_fix(cmd); - fix3 = modify->fix[modify->nfix-1]; - } + // create stabilization per-atom property + id_fix3 = utils::strdup("bond_react_stabilization_internal"); + if (modify->find_fix(id_fix3) < 0) + fix3 = modify->add_fix(std::string(id_fix3) + " all property/atom i_statted_tags ghost yes"); statted_id = utils::strdup("statted_tags"); @@ -770,7 +758,7 @@ void FixBondReact::post_constructor() // this returns names of corresponding property int unused; - char * idprop; + char *idprop; idprop = (char *) fix->extract("property",unused); if (idprop == nullptr) error->all(FLERR,"Exclude group must be a per-atom property group"); @@ -787,17 +775,10 @@ void FixBondReact::post_constructor() // let's create a new nve/limit fix to limit newly reacted atoms - cmd = std::string("bond_react_MASTER_nve_limit"); - id_fix1 = new char[cmd.size()+1]; - strcpy(id_fix1,cmd.c_str()); - - ifix = modify->find_fix(id_fix1); - - if (ifix == -1) { - cmd += fmt::format(" {} nve/limit {}",master_group,nve_limit_xmax); - modify->add_fix(cmd); - fix1 = modify->fix[modify->nfix-1]; - } + id_fix1 = utils::strdup("bond_react_MASTER_nve_limit"); + if (modify->find_fix(id_fix1) < 0) + fix1 = modify->add_fix(fmt::format("{} {} nve/limit {}", + id_fix1,master_group,nve_limit_xmax)); } } From 88604328f5b1b1f6e34cfd10ad7f1575a5b7d553 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:44:42 -0400 Subject: [PATCH 265/352] workaround for PGI compilers --- cmake/Modules/Packages/MACHDYN.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/Modules/Packages/MACHDYN.cmake b/cmake/Modules/Packages/MACHDYN.cmake index 6d941f9798..efe8a562eb 100644 --- a/cmake/Modules/Packages/MACHDYN.cmake +++ b/cmake/Modules/Packages/MACHDYN.cmake @@ -30,3 +30,8 @@ else() endif() target_link_libraries(lammps PRIVATE Eigen3::Eigen) endif() + +# PGI/Nvidia compiler internals collide with vector intrinsics support in Eigen3 +if((CMAKE_CXX_COMPILER_ID STREQUAL "PGI") OR (CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC")) + target_compile_definitions(lammps PRIVATE -DEIGEN_DONT_VECTORIZE) +endif() From f23b04f9b6d2f2b6f0c5c6d99c6c2b4410906b4a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 18:53:46 -0400 Subject: [PATCH 266/352] update Eigen3 to support the latest stable release 3.3.9 --- cmake/Modules/Packages/MACHDYN.cmake | 4 ++-- lib/machdyn/Install.py | 3 ++- lib/machdyn/Makefile.lammps | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmake/Modules/Packages/MACHDYN.cmake b/cmake/Modules/Packages/MACHDYN.cmake index efe8a562eb..fab532541e 100644 --- a/cmake/Modules/Packages/MACHDYN.cmake +++ b/cmake/Modules/Packages/MACHDYN.cmake @@ -7,8 +7,8 @@ endif() option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" ${DOWNLOAD_EIGEN3_DEFAULT}) if(DOWNLOAD_EIGEN3) message(STATUS "Eigen3 download requested - we will build our own") - set(EIGEN3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz" CACHE STRING "URL for Eigen3 tarball") - set(EIGEN3_MD5 "9e30f67e8531477de4117506fe44669b" CACHE STRING "MD5 checksum of Eigen3 tarball") + set(EIGEN3_URL "https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz" CACHE STRING "URL for Eigen3 tarball") + set(EIGEN3_MD5 "609286804b0f79be622ccf7f9ff2b660" CACHE STRING "MD5 checksum of Eigen3 tarball") mark_as_advanced(EIGEN3_URL) mark_as_advanced(EIGEN3_MD5) include(ExternalProject) diff --git a/lib/machdyn/Install.py b/lib/machdyn/Install.py index 16dd3038a8..2e90c9ca0f 100644 --- a/lib/machdyn/Install.py +++ b/lib/machdyn/Install.py @@ -17,11 +17,12 @@ parser = ArgumentParser(prog='Install.py', # settings -version = '3.3.7' +version = '3.3.9' tarball = "eigen.tar.gz" # known checksums for different Eigen versions. used to validate the download. checksums = { \ + '3.3.9' : '609286804b0f79be622ccf7f9ff2b660', \ '3.3.7' : '9e30f67e8531477de4117506fe44669b' \ } diff --git a/lib/machdyn/Makefile.lammps b/lib/machdyn/Makefile.lammps index 6c914708dd..71db4fd4bc 100644 --- a/lib/machdyn/Makefile.lammps +++ b/lib/machdyn/Makefile.lammps @@ -1,5 +1,5 @@ # Settings that the LAMMPS build will import when this package library is used -machdyn_SYSINC = -I../../lib/includelink/eigen3 -machdyn_SYSLIB = -machdyn_SYSPATH = +machdyn_SYSINC = +machdyn_SYSLIB = +machdyn_SYSPATH = From 68c15ebf04b83f1c12920e5beb05dad4a0eafd88 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 6 Aug 2021 21:30:32 -0400 Subject: [PATCH 267/352] refactor/simplify code due to changes in Modify --- src/balance.cpp | 3 +-- src/compute_chunk_atom.cpp | 10 +++------- src/compute_displace_atom.cpp | 6 ++---- src/compute_msd.cpp | 21 ++++++++------------- src/compute_msd_chunk.cpp | 21 +++++++++------------ src/compute_vacf.cpp | 12 ++++-------- src/dump_custom.cpp | 11 ++++------- src/fix_adapt.cpp | 18 ++++++------------ src/min.cpp | 3 +-- src/respa.cpp | 5 ++--- src/variable.cpp | 12 +++--------- 11 files changed, 43 insertions(+), 79 deletions(-) diff --git a/src/balance.cpp b/src/balance.cpp index af142f404d..feb5eae708 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -499,8 +499,7 @@ void Balance::weight_storage(char *prefix) int ifix = modify->find_fix(cmd); if (ifix < 1) { cmd += " all STORE peratom 0 1"; - modify->add_fix(cmd); - fixstore = (FixStore *) modify->fix[modify->nfix-1]; + fixstore = (FixStore *) modify->add_fix(cmd); } else fixstore = (FixStore *) modify->fix[ifix]; // do not carry weights with atoms during normal atom migration diff --git a/src/compute_chunk_atom.cpp b/src/compute_chunk_atom.cpp index 81eafcf8d6..5d789f722a 100644 --- a/src/compute_chunk_atom.cpp +++ b/src/compute_chunk_atom.cpp @@ -562,13 +562,9 @@ void ComputeChunkAtom::init() // fixstore initializes all values to 0.0 if ((idsflag == ONCE || lockcount) && !fixstore) { - std::string cmd = id + std::string("_COMPUTE_STORE"); - id_fix = new char[cmd.size()+1]; - strcpy(id_fix,cmd.c_str()); - - cmd += fmt::format(" {} STORE peratom 1 1", group->names[igroup]); - modify->add_fix(cmd); - fixstore = (FixStore *) modify->fix[modify->nfix-1]; + id_fix = utils::strdup(id + std::string("_COMPUTE_STORE")); + fixstore = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 1", + id_fix, group->names[igroup])); } if ((idsflag != ONCE && !lockcount) && fixstore) { diff --git a/src/compute_displace_atom.cpp b/src/compute_displace_atom.cpp index 68776c1936..821525c53a 100644 --- a/src/compute_displace_atom.cpp +++ b/src/compute_displace_atom.cpp @@ -74,10 +74,8 @@ ComputeDisplaceAtom::ComputeDisplaceAtom(LAMMPS *lmp, int narg, char **arg) : // id = compute-ID + COMPUTE_STORE, fix group = compute group id_fix = utils::strdup(std::string(id) + "_COMPUTE_STORE"); - std::string cmd = id_fix + fmt::format(" {} STORE peratom 1 3", - group->names[igroup]); - modify->add_fix(cmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 3", + id_fix, group->names[igroup])); // calculate xu,yu,zu for fix store array // skip if reset from restart file diff --git a/src/compute_msd.cpp b/src/compute_msd.cpp index ce9e10304e..209eec2810 100644 --- a/src/compute_msd.cpp +++ b/src/compute_msd.cpp @@ -14,16 +14,15 @@ #include "compute_msd.h" -#include - #include "atom.h" -#include "update.h" -#include "group.h" #include "domain.h" -#include "modify.h" -#include "fix_store.h" #include "error.h" +#include "fix_store.h" +#include "group.h" +#include "modify.h" +#include "update.h" +#include using namespace LAMMPS_NS; @@ -66,13 +65,9 @@ ComputeMSD::ComputeMSD(LAMMPS *lmp, int narg, char **arg) : // create a new fix STORE style for reference positions // id = compute-ID + COMPUTE_STORE, fix group = compute group - std::string fixcmd = id + std::string("_COMPUTE_STORE"); - id_fix = new char[fixcmd.size()+1]; - strcpy(id_fix,fixcmd.c_str()); - - fixcmd += fmt::format(" {} STORE peratom 1 3",group->names[igroup]); - modify->add_fix(fixcmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + id_fix = utils::strdup(id + std::string("_COMPUTE_STORE")); + fix = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 3", + id_fix, group->names[igroup])); // calculate xu,yu,zu for fix store array // skip if reset from restart file diff --git a/src/compute_msd_chunk.cpp b/src/compute_msd_chunk.cpp index 74528da2f6..0d5b146338 100644 --- a/src/compute_msd_chunk.cpp +++ b/src/compute_msd_chunk.cpp @@ -14,18 +14,17 @@ #include "compute_msd_chunk.h" -#include - #include "atom.h" -#include "group.h" -#include "update.h" -#include "modify.h" #include "compute_chunk_atom.h" #include "domain.h" -#include "fix_store.h" -#include "memory.h" #include "error.h" +#include "fix_store.h" +#include "group.h" +#include "memory.h" +#include "modify.h" +#include "update.h" +#include using namespace LAMMPS_NS; @@ -52,16 +51,14 @@ ComputeMSDChunk::ComputeMSDChunk(LAMMPS *lmp, int narg, char **arg) : // create a new fix STORE style for reference positions // id = compute-ID + COMPUTE_STORE, fix group = compute group - // do not know size of array at this point, just allocate 1x3 array + // do not know size of array at this point, just allocate 1x1 array // fix creation must be done now so that a restart run can // potentially re-populate the fix array (and change it to correct size) // otherwise size reset and init will be done in setup() id_fix = utils::strdup(std::string(id) + "_COMPUTE_STORE"); - std::string fixcmd = id_fix - + fmt::format(" {} STORE global 1 1",group->names[igroup]); - modify->add_fix(fixcmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + fix = (FixStore *) modify->add_fix(fmt::format("{} {} STORE global 1 1", + id_fix,group->names[igroup])); } /* ---------------------------------------------------------------------- */ diff --git a/src/compute_vacf.cpp b/src/compute_vacf.cpp index ba88c6d2c1..90dcbf8d4f 100644 --- a/src/compute_vacf.cpp +++ b/src/compute_vacf.cpp @@ -14,8 +14,6 @@ #include "compute_vacf.h" -#include - #include "atom.h" #include "update.h" #include "group.h" @@ -23,6 +21,7 @@ #include "fix_store.h" #include "error.h" +#include using namespace LAMMPS_NS; @@ -42,12 +41,9 @@ ComputeVACF::ComputeVACF(LAMMPS *lmp, int narg, char **arg) : // create a new fix STORE style // id = compute-ID + COMPUTE_STORE, fix group = compute group - std::string fixcmd = id + std::string("_COMPUTE_STORE"); - id_fix = new char[fixcmd.size()+1]; - strcpy(id_fix,fixcmd.c_str()); - fixcmd += fmt::format(" {} STORE peratom 1 3", group->names[igroup]); - modify->add_fix(fixcmd); - fix = (FixStore *) modify->fix[modify->nfix-1]; + id_fix = utils::strdup(id + std::string("_COMPUTE_STORE")); + fix = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 3", + id_fix, group->names[igroup])); // store current velocities in fix store array // skip if reset from restart file diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 6c417026ca..6bb7653e3b 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1960,18 +1960,15 @@ int DumpCustom::modify_param(int narg, char **arg) thresh_last[nthresh] = -1; } else { thresh_fix = (FixStore **) - memory->srealloc(thresh_fix,(nthreshlast+1)*sizeof(FixStore *), - "dump:thresh_fix"); + memory->srealloc(thresh_fix,(nthreshlast+1)*sizeof(FixStore *),"dump:thresh_fix"); thresh_fixID = (char **) - memory->srealloc(thresh_fixID,(nthreshlast+1)*sizeof(char *), - "dump:thresh_fixID"); + memory->srealloc(thresh_fixID,(nthreshlast+1)*sizeof(char *),"dump:thresh_fixID"); memory->grow(thresh_first,(nthreshlast+1),"dump:thresh_first"); std::string threshid = fmt::format("{}{}_DUMP_STORE",id,nthreshlast); thresh_fixID[nthreshlast] = utils::strdup(threshid); - modify->add_fix(fmt::format("{} {} STORE peratom 1 1",threshid, - group->names[igroup])); - thresh_fix[nthreshlast] = (FixStore *) modify->fix[modify->nfix-1]; + threshid += fmt::format(" {} STORE peratom 1 1", group->names[igroup]); + thresh_fix[nthreshlast] = (FixStore *) modify->add_fix(threshid); thresh_last[nthreshlast] = nthreshlast; thresh_first[nthreshlast] = 1; diff --git a/src/fix_adapt.cpp b/src/fix_adapt.cpp index 670c0dc4be..e5c2c3dece 100644 --- a/src/fix_adapt.cpp +++ b/src/fix_adapt.cpp @@ -252,12 +252,9 @@ void FixAdapt::post_constructor() id_fix_chg = nullptr; if (diamflag && atom->radius_flag) { - std::string fixcmd = id + std::string("_FIX_STORE_DIAM"); - id_fix_diam = utils::strdup(fixcmd); - fixcmd += fmt::format(" {} STORE peratom 1 1",group->names[igroup]); - modify->add_fix(fixcmd); - fix_diam = (FixStore *) modify->fix[modify->nfix-1]; - + id_fix_diam = utils::strdup(id + std::string("_FIX_STORE_DIAM")); + fix_diam = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 1", + id_fix_diam,group->names[igroup])); if (fix_diam->restart_reset) fix_diam->restart_reset = 0; else { double *vec = fix_diam->vstore; @@ -273,12 +270,9 @@ void FixAdapt::post_constructor() } if (chgflag && atom->q_flag) { - std::string fixcmd = id + std::string("_FIX_STORE_CHG"); - id_fix_chg = utils::strdup(fixcmd); - fixcmd += fmt::format(" {} STORE peratom 1 1",group->names[igroup]); - modify->add_fix(fixcmd); - fix_chg = (FixStore *) modify->fix[modify->nfix-1]; - + id_fix_chg = utils::strdup(id + std::string("_FIX_STORE_CHG")); + fix_chg = (FixStore *) modify->add_fix(fmt::format("{} {} STORE peratom 1 1", + id_fix_chg,group->names[igroup])); if (fix_chg->restart_reset) fix_chg->restart_reset = 0; else { double *vec = fix_chg->vstore; diff --git a/src/min.cpp b/src/min.cpp index 8fe73dc9e1..69e24a541f 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -121,8 +121,7 @@ void Min::init() // create fix needed for storing atom-based quantities // will delete it at end of run - modify->add_fix("MINIMIZE all MINIMIZE"); - fix_minimize = (FixMinimize *) modify->fix[modify->nfix-1]; + fix_minimize = (FixMinimize *) modify->add_fix("MINIMIZE all MINIMIZE"); // clear out extra global and per-atom dof // will receive requests for new per-atom dof during pair init() diff --git a/src/respa.cpp b/src/respa.cpp index c51ec04131..5190441994 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -302,9 +302,8 @@ void Respa::init() // if supported, we also store torques on a per-level basis std::string cmd = fmt::format("RESPA all RESPA {}",nlevels); - if (atom->torque_flag) modify->add_fix(cmd + " torque"); - else modify->add_fix(cmd); - fix_respa = (FixRespa *) modify->fix[modify->nfix-1]; + if (atom->torque_flag) cmd += " torque"; + fix_respa = (FixRespa *) modify->add_fix(cmd); // insure respa inner/middle/outer is using Pair class that supports it diff --git a/src/variable.cpp b/src/variable.cpp index 2ef1957a09..a7b2955b33 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -5065,16 +5065,10 @@ VarReader::VarReader(LAMMPS *lmp, char *name, char *file, int flag) : if (style == Variable::ATOMFILE) { if (atom->map_style == Atom::MAP_NONE) - error->all(FLERR,"Cannot use atomfile-style " - "variable unless an atom map exists"); - - std::string cmd = name + std::string("_VARIABLE_STORE"); - id_fix = utils::strdup(cmd); - - cmd += " all STORE peratom 0 1"; - modify->add_fix(cmd); - fixstore = (FixStore *) modify->fix[modify->nfix-1]; + error->all(FLERR,"Cannot use atomfile-style variable unless an atom map exists"); + id_fix = utils::strdup(std::string(name) + "_VARIABLE_STORE"); + fixstore = (FixStore *) modify->add_fix(std::string(id_fix) + " all STORE peratom 0 1"); buffer = new char[CHUNK*MAXLINE]; } } From 42625a82d15c32a7964f2cc11420640bde4b7a74 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Aug 2021 09:45:02 -0400 Subject: [PATCH 268/352] simplify more code for creating fix instances using the improved APIs --- src/REAXFF/fix_reaxff_species.cpp | 109 ++---------------------------- src/REAXFF/fix_reaxff_species.h | 3 - src/REAXFF/pair_reaxff.cpp | 6 +- src/REPLICA/hyper.cpp | 3 +- src/REPLICA/prd.cpp | 6 +- src/REPLICA/tad.cpp | 79 ++++------------------ 6 files changed, 24 insertions(+), 182 deletions(-) diff --git a/src/REAXFF/fix_reaxff_species.cpp b/src/REAXFF/fix_reaxff_species.cpp index 53746b968b..4fc08975a8 100644 --- a/src/REAXFF/fix_reaxff_species.cpp +++ b/src/REAXFF/fix_reaxff_species.cpp @@ -309,113 +309,16 @@ void FixReaxFFSpecies::init() if (!setupflag) { // create a compute to store properties - create_compute(); + modify->add_compute("SPECATOM all SPEC/ATOM q x y z vx vy vz abo01 abo02 abo03 abo04 " + "abo05 abo06 abo07 abo08 abo09 abo10 abo11 abo12 abo13 abo14 " + "abo15 abo16 abo17 abo18 abo19 abo20 abo21 abo22 abo23 abo24"); // create a fix to point to fix_ave_atom for averaging stored properties - create_fix(); - + auto fixcmd = fmt::format("SPECBOND all ave/atom {} {} {}",tmparg[0],tmparg[1],tmparg[2]); + for (int i = 1; i < 32; ++i) fixcmd += " c_SPECATOM[" + std::to_string(i) + "]"; + f_SPECBOND = (FixAveAtom *) modify->add_fix(fixcmd); setupflag = 1; } - -} - -/* ---------------------------------------------------------------------- */ - -void FixReaxFFSpecies::create_compute() -{ - int narg; - char **args; - - narg = 34; - args = new char*[narg]; - args[0] = (char *) "SPECATOM"; - args[1] = (char *) "all"; - args[2] = (char *) "SPEC/ATOM"; - args[3] = (char *) "q"; - args[4] = (char *) "x"; - args[5] = (char *) "y"; - args[6] = (char *) "z"; - args[7] = (char *) "vx"; - args[8] = (char *) "vy"; - args[9] = (char *) "vz"; - args[10] = (char *) "abo01"; - args[11] = (char *) "abo02"; - args[12] = (char *) "abo03"; - args[13] = (char *) "abo04"; - args[14] = (char *) "abo05"; - args[15] = (char *) "abo06"; - args[16] = (char *) "abo07"; - args[17] = (char *) "abo08"; - args[18] = (char *) "abo09"; - args[19] = (char *) "abo10"; - args[20] = (char *) "abo11"; - args[21] = (char *) "abo12"; - args[22] = (char *) "abo13"; - args[23] = (char *) "abo14"; - args[24] = (char *) "abo15"; - args[25] = (char *) "abo16"; - args[26] = (char *) "abo17"; - args[27] = (char *) "abo18"; - args[28] = (char *) "abo19"; - args[29] = (char *) "abo20"; - args[30] = (char *) "abo21"; - args[31] = (char *) "abo22"; - args[32] = (char *) "abo23"; - args[33] = (char *) "abo24"; - modify->add_compute(narg,args); - delete [] args; -} - -/* ---------------------------------------------------------------------- */ - -void FixReaxFFSpecies::create_fix() -{ - int narg; - char **args; - - narg = 37; - args = new char*[narg]; - args[0] = (char *) "SPECBOND"; - args[1] = (char *) "all"; - args[2] = (char *) "ave/atom"; - args[3] = tmparg[0]; - args[4] = tmparg[1]; - args[5] = tmparg[2]; - args[6] = (char *) "c_SPECATOM[1]"; // q, array_atoms[i][0] - args[7] = (char *) "c_SPECATOM[2]"; // x, 1 - args[8] = (char *) "c_SPECATOM[3]"; // y, 2 - args[9] = (char *) "c_SPECATOM[4]"; // z, 3 - args[10] = (char *) "c_SPECATOM[5]"; // vx, 4 - args[11] = (char *) "c_SPECATOM[6]"; // vy, 5 - args[12] = (char *) "c_SPECATOM[7]"; // vz, 6 - args[13] = (char *) "c_SPECATOM[8]"; // abo01, 7 - args[14] = (char *) "c_SPECATOM[9]"; - args[15] = (char *) "c_SPECATOM[10]"; - args[16] = (char *) "c_SPECATOM[11]"; - args[17] = (char *) "c_SPECATOM[12]"; - args[18] = (char *) "c_SPECATOM[13]"; - args[19] = (char *) "c_SPECATOM[14]"; - args[20] = (char *) "c_SPECATOM[15]"; - args[21] = (char *) "c_SPECATOM[16]"; - args[22] = (char *) "c_SPECATOM[17]"; - args[23] = (char *) "c_SPECATOM[18]"; - args[24] = (char *) "c_SPECATOM[19]"; // abo12, 18 - args[25] = (char *) "c_SPECATOM[20]"; - args[26] = (char *) "c_SPECATOM[21]"; - args[27] = (char *) "c_SPECATOM[22]"; - args[28] = (char *) "c_SPECATOM[23]"; - args[29] = (char *) "c_SPECATOM[24]"; - args[30] = (char *) "c_SPECATOM[25]"; - args[31] = (char *) "c_SPECATOM[26]"; - args[32] = (char *) "c_SPECATOM[27]"; - args[33] = (char *) "c_SPECATOM[28]"; - args[34] = (char *) "c_SPECATOM[29]"; - args[35] = (char *) "c_SPECATOM[30]"; - args[36] = (char *) "c_SPECATOM[31]"; - modify->add_fix(narg,args); - f_SPECBOND = (FixAveAtom *) modify->fix[modify->nfix-1]; - delete [] args; - } /* ---------------------------------------------------------------------- */ diff --git a/src/REAXFF/fix_reaxff_species.h b/src/REAXFF/fix_reaxff_species.h index 1957c1f8b1..b65ea49476 100644 --- a/src/REAXFF/fix_reaxff_species.h +++ b/src/REAXFF/fix_reaxff_species.h @@ -61,8 +61,6 @@ class FixReaxFFSpecies : public Fix { char *ele, **eletype, *filepos; void Output_ReaxFF_Bonds(bigint, FILE *); - void create_compute(); - void create_fix(); AtomCoord chAnchor(AtomCoord, AtomCoord); virtual void FindMolecule(); void SortMolecule(int &); @@ -82,7 +80,6 @@ class FixReaxFFSpecies : public Fix { class NeighList *list; class FixAveAtom *f_SPECBOND; class PairReaxFF *reaxff; - }; } diff --git a/src/REAXFF/pair_reaxff.cpp b/src/REAXFF/pair_reaxff.cpp index 0aea45b9cd..758ee70ab7 100644 --- a/src/REAXFF/pair_reaxff.cpp +++ b/src/REAXFF/pair_reaxff.cpp @@ -368,10 +368,8 @@ void PairReaxFF::init_style() error->warning(FLERR,"Total cutoff < 2*bond cutoff. May need to use an " "increased neighbor list skin."); - if (fix_reaxff == nullptr) { - modify->add_fix(fmt::format("{} all REAXFF",fix_id)); - fix_reaxff = (FixReaxFF *) modify->fix[modify->nfix-1]; - } + if (fix_reaxff == nullptr) + fix_reaxff = (FixReaxFF *) modify->add_fix(fmt::format("{} all REAXFF",fix_id)); } /* ---------------------------------------------------------------------- */ diff --git a/src/REPLICA/hyper.cpp b/src/REPLICA/hyper.cpp index 84ff43ec85..d391604530 100644 --- a/src/REPLICA/hyper.cpp +++ b/src/REPLICA/hyper.cpp @@ -101,8 +101,7 @@ void Hyper::command(int narg, char **arg) // create FixEventHyper class to store event and pre-quench states - modify->add_fix("hyper_event all EVENT/HYPER"); - fix_event = (FixEventHyper *) modify->fix[modify->nfix-1]; + fix_event = (FixEventHyper *) modify->add_fix("hyper_event all EVENT/HYPER"); // create Finish for timing output diff --git a/src/REPLICA/prd.cpp b/src/REPLICA/prd.cpp index 23e572e88b..501e7675a8 100644 --- a/src/REPLICA/prd.cpp +++ b/src/REPLICA/prd.cpp @@ -145,8 +145,7 @@ void PRD::command(int narg, char **arg) // create ComputeTemp class to monitor temperature - modify->add_compute("prd_temp all temp"); - temperature = modify->compute[modify->ncompute-1]; + temperature = modify->add_compute("prd_temp all temp"); // create Velocity class for velocity creation in dephasing // pass it temperature compute, loop_setting, dist_setting settings @@ -168,8 +167,7 @@ void PRD::command(int narg, char **arg) // create FixEventPRD class to store event and pre-quench states - modify->add_fix("prd_event all EVENT/PRD"); - fix_event = (FixEventPRD *) modify->fix[modify->nfix-1]; + fix_event = (FixEventPRD *) modify->add_fix("prd_event all EVENT/PRD"); // create Finish for timing output diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 5631944dbf..9b6ecf0b0c 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -131,28 +131,11 @@ void TAD::command(int narg, char **arg) // create FixEventTAD object to store last event - int narg2 = 3; - char **args = new char*[narg2]; - args[0] = (char *) "tad_event"; - args[1] = (char *) "all"; - args[2] = (char *) "EVENT/TAD"; - modify->add_fix(narg2,args); - fix_event = (FixEventTAD *) modify->fix[modify->nfix-1]; - delete [] args; + fix_event = (FixEventTAD *) modify->add_fix("tad_event all EVENT/TAD"); // create FixStore object to store revert state - narg2 = 6; - args = new char*[narg2]; - args[0] = (char *) "tad_revert"; - args[1] = (char *) "all"; - args[2] = (char *) "STORE"; - args[3] = (char *) "peratom"; - args[4] = (char *) "0"; - args[5] = (char *) "7"; - modify->add_fix(narg2,args); - fix_revert = (FixStore *) modify->fix[modify->nfix-1]; - delete [] args; + fix_revert = (FixStore *) modify->add_fix("tad_revert all STORE peratom 0 7"); // create Finish for timing output @@ -195,13 +178,10 @@ void TAD::command(int narg, char **arg) // set minimize style for quench - narg2 = 1; - args = new char*[narg2]; + char *args[1]; args[0] = min_style; - update->create_minimize(narg2,args,1); - - delete [] args; + update->create_minimize(1,args,1); // init minimizer settings and minimizer itself @@ -691,25 +671,13 @@ void TAD::perform_neb(int ievent) // create FixNEB object to support NEB - int narg2 = 4; - char **args = new char*[narg2]; - args[0] = (char *) "neb"; - args[1] = (char *) "all"; - args[2] = (char *) "neb"; - args[3] = (char *) "1.0"; - modify->add_fix(narg2,args); - fix_neb = (Fix *) modify->fix[modify->nfix-1]; - delete [] args; + fix_neb = (Fix *) modify->add_fix("neb all neb 1.0"); // switch minimize style to quickmin for NEB - narg2 = 1; - args = new char*[narg2]; + char *args[1]; args[0] = min_style_neb; - - update->create_minimize(narg2,args,1); - - delete [] args; + update->create_minimize(1,args,1); // create NEB object @@ -769,17 +737,12 @@ void TAD::perform_neb(int ievent) // switch minimize style back for quench - narg2 = 1; - args = new char*[narg2]; args[0] = min_style; - - update->create_minimize(narg2,args,1); + update->create_minimize(1,args,1); update->etol = etol; update->ftol = ftol; - delete [] args; - // clean up modify->delete_fix("neb"); @@ -895,25 +858,14 @@ void TAD::delete_event_list() { void TAD::add_event() { + if (n_event_list == nmax_event_list) + grow_event_list(nmax_event_list+nmin_event_list); // create FixEventTAD object to store possible event - int narg = 3; - char **args = new char*[narg]; - - char str[128]; - sprintf(str,"tad_event_%d",n_event_list); - - args[0] = str; - args[1] = (char *) "all"; - args[2] = (char *) "EVENT/TAD"; - modify->add_fix(narg,args); - - if (n_event_list == nmax_event_list) - grow_event_list(nmax_event_list+nmin_event_list); - n_event_list += 1; - int ievent = n_event_list-1; - fix_event_list[ievent] = (FixEventTAD *) modify->fix[modify->nfix-1]; + int ievent = n_event_list++; + fix_event_list[ievent] + = (FixEventTAD *) modify->add_fix(fmt::format("tad_event_{} all EVENT/TAD", ievent)); // store quenched state for new event @@ -923,11 +875,6 @@ void TAD::add_event() fix_event->restore_state_quench(); fix_event_list[ievent]->store_state_quench(); - - // string clean-up - - delete [] args; - } /* ---------------------------------------------------------------------- From fe008b93d7196ce62272c2a5c4cf4db4e5974516 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 7 Aug 2021 10:33:26 -0400 Subject: [PATCH 269/352] remove obsolete line --- src/modify.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modify.cpp b/src/modify.cpp index 53df8092aa..995b3b82ac 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -37,7 +37,6 @@ using namespace FixConst; #define DELTA 4 #define BIG 1.0e20 -#define NEXCEPT 7 // change when add to exceptions in add_fix() /* ---------------------------------------------------------------------- */ From c8b7b8271de1703e5f1838146dcf6ce9e4437275 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Aug 2021 16:28:03 -0400 Subject: [PATCH 270/352] add missing dependency --- src/GPU/Install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/GPU/Install.sh b/src/GPU/Install.sh index 2e2b32d96a..a87d2165d9 100755 --- a/src/GPU/Install.sh +++ b/src/GPU/Install.sh @@ -113,8 +113,8 @@ action pair_lj_cut_coul_msm_gpu.cpp pair_lj_cut_coul_msm.cpp action pair_lj_cut_coul_msm_gpu.h pair_lj_cut_coul_msm.h action pair_lj_cut_gpu.cpp action pair_lj_cut_gpu.h -action pair_lj_smooth_gpu.cpp -action pair_lj_smooth_gpu.h +action pair_lj_smooth_gpu.cpp pair_lj_smooth.cpp +action pair_lj_smooth_gpu.h pair_lj_smooth.h action pair_lj_expand_gpu.cpp action pair_lj_expand_gpu.h action pair_lj_expand_coul_long_gpu.cpp pair_lj_expand_coul_long.cpp From 26c681cf73d314cf27ff37b161f5b0a013ec0592 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 9 Aug 2021 16:28:19 -0400 Subject: [PATCH 271/352] update for changes in base class --- src/KOKKOS/pair_gran_hooke_history_kokkos.cpp | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp index 93f8e37006..fab33d0ec7 100644 --- a/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp +++ b/src/KOKKOS/pair_gran_hooke_history_kokkos.cpp @@ -13,17 +13,18 @@ ------------------------------------------------------------------------- */ #include "pair_gran_hooke_history_kokkos.h" -#include "kokkos.h" + #include "atom_kokkos.h" #include "atom_masks.h" -#include "memory_kokkos.h" +#include "error.h" +#include "fix_neigh_history_kokkos.h" #include "force.h" -#include "neighbor.h" +#include "kokkos.h" +#include "memory_kokkos.h" +#include "modify.h" #include "neigh_list.h" #include "neigh_request.h" -#include "error.h" -#include "modify.h" -#include "fix_neigh_history_kokkos.h" +#include "neighbor.h" #include "update.h" using namespace LAMMPS_NS; @@ -67,20 +68,13 @@ void PairGranHookeHistoryKokkos::init_style() // this is so its order in the fix list is preserved if (history && fix_history == nullptr) { - char dnumstr[16]; - sprintf(dnumstr,"%d",3); - char **fixarg = new char*[4]; - fixarg[0] = (char *) "NEIGH_HISTORY_HH"; - fixarg[1] = (char *) "all"; + auto cmd = std::string("NEIGH_HISTORY_HH") + std::to_string(instance_me) + " all "; if (execution_space == Device) - fixarg[2] = (char *) "NEIGH_HISTORY/KK/DEVICE"; + cmd += "NEIGH_HISTORY/KK/DEVICE 3"; else - fixarg[2] = (char *) "NEIGH_HISTORY/KK/HOST"; - fixarg[3] = dnumstr; - modify->replace_fix("NEIGH_HISTORY_HH_DUMMY",4,fixarg,1); - delete [] fixarg; - int ifix = modify->find_fix("NEIGH_HISTORY_HH"); - fix_history = (FixNeighHistory *) modify->fix[ifix]; + cmd += "NEIGH_HISTORY/KK/HOST 3"; + fix_history = (FixNeighHistory *) + modify->replace_fix("NEIGH_HISTORY_HH_DUMMY"+std::to_string(instance_me),cmd,1); fix_history->pair = this; fix_historyKK = (FixNeighHistoryKokkos *)fix_history; } From 0928c912c0ca043ad8f93d0d27823b7b389b283e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 05:50:03 -0400 Subject: [PATCH 272/352] fix memory leaks and reformat --- src/REPLICA/fix_pimd.cpp | 558 +++++++++++++++++++++------------------ src/REPLICA/fix_pimd.h | 1 + 2 files changed, 296 insertions(+), 263 deletions(-) diff --git a/src/REPLICA/fix_pimd.cpp b/src/REPLICA/fix_pimd.cpp index ce1d41302f..bb4af16f1b 100644 --- a/src/REPLICA/fix_pimd.cpp +++ b/src/REPLICA/fix_pimd.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -24,69 +23,29 @@ #include "fix_pimd.h" -#include -#include - -#include "universe.h" -#include "comm.h" -#include "force.h" #include "atom.h" +#include "comm.h" #include "domain.h" -#include "update.h" +#include "error.h" +#include "force.h" #include "math_const.h" #include "memory.h" -#include "error.h" +#include "universe.h" +#include "update.h" + +#include +#include using namespace LAMMPS_NS; using namespace FixConst; using namespace MathConst; -enum{PIMD,NMPIMD,CMD}; +enum { PIMD, NMPIMD, CMD }; /* ---------------------------------------------------------------------- */ FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { - method = PIMD; - fmass = 1.0; - nhc_temp = 298.15; - nhc_nchain = 2; - sp = 1.0; - - for (int i=3; iuniverse_all(FLERR,"Unknown method parameter for fix pimd"); - } - else if (strcmp(arg[i],"fmass")==0) - { - fmass = atof(arg[i+1]); - if (fmass<0.0 || fmass>1.0) error->universe_all(FLERR,"Invalid fmass value for fix pimd"); - } - else if (strcmp(arg[i],"sp")==0) - { - sp = atof(arg[i+1]); - if (fmass<0.0) error->universe_all(FLERR,"Invalid sp value for fix pimd"); - } - else if (strcmp(arg[i],"temp")==0) - { - nhc_temp = atof(arg[i+1]); - if (nhc_temp<0.0) error->universe_all(FLERR,"Invalid temp value for fix pimd"); - } - else if (strcmp(arg[i],"nhc")==0) - { - nhc_nchain = atoi(arg[i+1]); - if (nhc_nchain<2) error->universe_all(FLERR,"Invalid nhc value for fix pimd"); - } - else error->universe_all(arg[i],i+1,"Unknown keyword for fix pimd"); - } - - /* Initiation */ - max_nsend = 0; tag_send = nullptr; buf_send = nullptr; @@ -110,25 +69,60 @@ FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) nhc_eta_dotdot = nullptr; nhc_eta_mass = nullptr; + method = PIMD; + fmass = 1.0; + nhc_temp = 298.15; + nhc_nchain = 2; + sp = 1.0; + + for (int i = 3; i < narg - 1; i += 2) { + if (strcmp(arg[i], "method") == 0) { + if (strcmp(arg[i + 1], "pimd") == 0) + method = PIMD; + else if (strcmp(arg[i + 1], "nmpimd") == 0) + method = NMPIMD; + else if (strcmp(arg[i + 1], "cmd") == 0) + method = CMD; + else + error->universe_all(FLERR, "Unknown method parameter for fix pimd"); + } else if (strcmp(arg[i], "fmass") == 0) { + fmass = utils::numeric(FLERR, arg[i + 1], false, lmp); + if (fmass < 0.0 || fmass > 1.0) + error->universe_all(FLERR, "Invalid fmass value for fix pimd"); + } else if (strcmp(arg[i], "sp") == 0) { + sp = utils::numeric(FLERR, arg[i + 1], false, lmp); + if (fmass < 0.0) error->universe_all(FLERR, "Invalid sp value for fix pimd"); + } else if (strcmp(arg[i], "temp") == 0) { + nhc_temp = utils::numeric(FLERR, arg[i + 1], false, lmp); + if (nhc_temp < 0.0) error->universe_all(FLERR, "Invalid temp value for fix pimd"); + } else if (strcmp(arg[i], "nhc") == 0) { + nhc_nchain = utils::inumeric(FLERR, arg[i + 1], false, lmp); + if (nhc_nchain < 2) error->universe_all(FLERR, "Invalid nhc value for fix pimd"); + } else + error->universe_all(FLERR, fmt::format("Unknown keyword {} for fix pimd", arg[i])); + } + + /* Initiation */ + size_peratom_cols = 12 * nhc_nchain + 3; nhc_offset_one_1 = 3 * nhc_nchain; - nhc_offset_one_2 = 3 * nhc_nchain +3; + nhc_offset_one_2 = 3 * nhc_nchain + 3; nhc_size_one_1 = sizeof(double) * nhc_offset_one_1; nhc_size_one_2 = sizeof(double) * nhc_offset_one_2; restart_peratom = 1; - peratom_flag = 1; - peratom_freq = 1; + peratom_flag = 1; + peratom_freq = 1; global_freq = 1; vector_flag = 1; size_vector = 2; - extvector = 1; + extvector = 1; comm_forward = 3; - atom->add_callback(Atom::GROW); // Call LAMMPS to allocate memory for per-atom array - atom->add_callback(Atom::RESTART); // Call LAMMPS to re-assign restart-data for per-atom array + atom->add_callback(Atom::GROW); // Call LAMMPS to allocate memory for per-atom array + atom->add_callback(Atom::RESTART); // Call LAMMPS to re-assign restart-data for per-atom array grow_arrays(atom->nmax); @@ -138,7 +132,37 @@ FixPIMD::FixPIMD(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) } /* ---------------------------------------------------------------------- */ +FixPIMD::~FixPIMD() +{ + delete[] mass; + atom->delete_callback(id, Atom::GROW); + atom->delete_callback(id, Atom::RESTART); + memory->destroy(M_x2xp); + memory->destroy(M_xp2x); + memory->destroy(M_f2fp); + memory->destroy(M_fp2f); + memory->sfree(lam); + + if (buf_beads) + for (int i = 0; i < np; i++) memory->sfree(buf_beads[i]); + delete[] buf_beads; + delete[] plan_send; + delete[] plan_recv; + delete[] mode_index; + + memory->sfree(tag_send); + memory->sfree(buf_send); + memory->sfree(buf_recv); + + memory->destroy(array_atom); + memory->destroy(nhc_eta); + memory->destroy(nhc_eta_dot); + memory->destroy(nhc_eta_dotdot); + memory->destroy(nhc_eta_mass); +} + +/* ---------------------------------------------------------------------- */ int FixPIMD::setmask() { int mask = 0; @@ -153,9 +177,10 @@ int FixPIMD::setmask() void FixPIMD::init() { if (atom->map_style == Atom::MAP_NONE) - error->all(FLERR,"Fix pimd requires an atom map, see atom_modify"); + error->all(FLERR, "Fix pimd requires an atom map, see atom_modify"); - if (universe->me==0 && screen) fprintf(screen,"Fix pimd initializing Path-Integral ...\n"); + if (universe->me == 0 && universe->uscreen) + fprintf(universe->uscreen, "Fix pimd initializing Path-Integral ...\n"); // prepare the constants @@ -181,16 +206,16 @@ void FixPIMD::init() /* The current solution, using LAMMPS internal real units */ const double Boltzmann = force->boltz; - const double Plank = force->hplanck; + const double Plank = force->hplanck; - double hbar = Plank / ( 2.0 * MY_PI ); - double beta = 1.0 / (Boltzmann * nhc_temp); - double _fbond = 1.0 * np / (beta*beta*hbar*hbar) ; + double hbar = Plank / (2.0 * MY_PI); + double beta = 1.0 / (Boltzmann * nhc_temp); + double _fbond = 1.0 * np / (beta * beta * hbar * hbar); omega_np = sqrt(np) / (hbar * beta) * sqrt(force->mvv2e); - fbond = - _fbond * force->mvv2e; + fbond = -_fbond * force->mvv2e; - if (universe->me==0) + if (universe->me == 0) printf("Fix pimd -P/(beta^2 * hbar^2) = %20.7lE (kcal/mol/A^2)\n\n", fbond); dtv = update->dt; @@ -198,10 +223,12 @@ void FixPIMD::init() comm_init(); - mass = new double [atom->ntypes+1]; + mass = new double[atom->ntypes + 1]; - if (method==CMD || method==NMPIMD) nmpimd_init(); - else for (int i=1; i<=atom->ntypes; i++) mass[i] = atom->mass[i] / np * fmass; + if (method == CMD || method == NMPIMD) + nmpimd_init(); + else + for (int i = 1; i <= atom->ntypes; i++) mass[i] = atom->mass[i] / np * fmass; if (!nhc_ready) nhc_init(); } @@ -210,7 +237,8 @@ void FixPIMD::init() void FixPIMD::setup(int vflag) { - if (universe->me==0 && screen) fprintf(screen,"Setting up Path-Integral ...\n"); + if (universe->me == 0 && universe->uscreen) + fprintf(universe->uscreen, "Setting up Path-Integral ...\n"); post_force(vflag); } @@ -234,13 +262,13 @@ void FixPIMD::final_integrate() void FixPIMD::post_force(int /*flag*/) { - for (int i=0; inlocal; i++) for(int j=0; j<3; j++) atom->f[i][j] /= np; + for (int i = 0; i < atom->nlocal; i++) + for (int j = 0; j < 3; j++) atom->f[i][j] /= np; comm_exec(atom->x); spring_force(); - if (method==CMD || method==NMPIMD) - { + if (method == CMD || method == NMPIMD) { /* forward comm for the force on ghost atoms */ nmpimd_fill(atom->f); @@ -262,34 +290,38 @@ void FixPIMD::post_force(int /*flag*/) void FixPIMD::nhc_init() { double tau = 1.0 / omega_np; - double KT = force->boltz * nhc_temp; + double KT = force->boltz * nhc_temp; double mass0 = KT * tau * tau; int max = 3 * atom->nlocal; - for (int i=0; iiworld==0) ; else nhc_eta_mass[i][ichain] *= fmass; + nhc_eta_mass[i][ichain] = mass0; + if ((method == CMD || method == NMPIMD) && universe->iworld == 0) + ; + else + nhc_eta_mass[i][ichain] *= fmass; } - nhc_eta_dot[i][nhc_nchain] = 0.0; + nhc_eta_dot[i][nhc_nchain] = 0.0; - for (int ichain=1; ichainmvv2e - KT) / nhc_eta_mass[i][ichain]; + for (int ichain = 1; ichain < nhc_nchain; ichain++) + nhc_eta_dotdot[i][ichain] = (nhc_eta_mass[i][ichain - 1] * nhc_eta_dot[i][ichain - 1] * + nhc_eta_dot[i][ichain - 1] * force->mvv2e - + KT) / + nhc_eta_mass[i][ichain]; } // Zero NH acceleration for CMD - if (method==CMD && universe->iworld==0) for (int i=0; iiworld == 0) + for (int i = 0; i < max; i++) + for (int ichain = 0; ichain < nhc_nchain; ichain++) nhc_eta_dotdot[i][ichain] = 0.0; nhc_ready = true; } @@ -302,8 +334,7 @@ void FixPIMD::nhc_update_x() double **x = atom->x; double **v = atom->v; - if (method==CMD || method==NMPIMD) - { + if (method == CMD || method == NMPIMD) { nmpimd_fill(atom->v); comm_exec(atom->v); @@ -313,8 +344,7 @@ void FixPIMD::nhc_update_x() nmpimd_transform(buf_beads, v, M_xp2x[universe->iworld]); } - for (int i=0; iv; double **f = atom->f; - for (int i=0; iiworld==0) return; + if (method == CMD && universe->iworld == 0) return; double expfac; int nmax = 3 * atom->nlocal; double KT = force->boltz * nhc_temp; double kecurrent, t_current; - double dthalf = 0.5 * update->dt; - double dt4 = 0.25 * update->dt; - double dt8 = 0.125 * update->dt; + double dthalf = 0.5 * update->dt; + double dt4 = 0.25 * update->dt; + double dt8 = 0.125 * update->dt; - for (int i=0; imvv2e; + kecurrent = mass[type[iatm]] * vv[idim] * vv[idim] * force->mvv2e; t_current = kecurrent / force->boltz; double *eta = nhc_eta[i]; @@ -366,9 +394,8 @@ void FixPIMD::nhc_update_v() eta_dotdot[0] = (kecurrent - KT) / nhc_eta_mass[i][0]; - for (int ichain=nhc_nchain-1; ichain>0; ichain--) - { - expfac = exp(-dt8 * eta_dot[ichain+1]); + for (int ichain = nhc_nchain - 1; ichain > 0; ichain--) { + expfac = exp(-dt8 * eta_dot[ichain + 1]); eta_dot[ichain] *= expfac; eta_dot[ichain] += eta_dotdot[ichain] * dt4; eta_dot[ichain] *= expfac; @@ -388,19 +415,18 @@ void FixPIMD::nhc_update_v() kecurrent = force->boltz * t_current; eta_dotdot[0] = (kecurrent - KT) / nhc_eta_mass[i][0]; - for (int ichain=0; ichaincreate(M_f2fp, np, np, "fix_feynman:M_f2fp"); memory->create(M_fp2f, np, np, "fix_feynman:M_fp2f"); - lam = (double*) memory->smalloc(sizeof(double)*np, "FixPIMD::lam"); + lam = (double *) memory->smalloc(sizeof(double) * np, "FixPIMD::lam"); // Set up eigenvalues lam[0] = 0.0; - if (np%2==0) lam[np-1] = 4.0 * np; + if (np % 2 == 0) lam[np - 1] = 4.0 * np; - for (int i=2; i<=np/2; i++) - { - lam[2*i-3] = lam[2*i-2] = 2.0 * np * (1.0 - 1.0 *cos(2.0*MY_PI*(i-1)/np)); + for (int i = 2; i <= np / 2; i++) { + lam[2 * i - 3] = lam[2 * i - 2] = 2.0 * np * (1.0 - 1.0 * cos(2.0 * MY_PI * (i - 1) / np)); } // Set up eigenvectors for non-degenerated modes - for (int i=0; iiworld; - for (int i=1; i<=atom->ntypes; i++) - { + for (int i = 1; i <= atom->ntypes; i++) { mass[i] = atom->mass[i]; - if (iworld) - { + if (iworld) { mass[i] *= lam[iworld]; mass[i] *= fmass; } @@ -486,17 +507,17 @@ void FixPIMD::nmpimd_fill(double **ptr) /* ---------------------------------------------------------------------- */ -void FixPIMD::nmpimd_transform(double** src, double** des, double *vector) +void FixPIMD::nmpimd_transform(double **src, double **des, double *vector) { int n = atom->nlocal; int m = 0; - for (int i=0; ix; double **f = atom->f; - double* _mass = atom->mass; - int* type = atom->type; + double *_mass = atom->mass; + int *type = atom->type; int nlocal = atom->nlocal; - double* xlast = buf_beads[x_last]; - double* xnext = buf_beads[x_next]; + double *xlast = buf_beads[x_last]; + double *xnext = buf_beads[x_next]; - for (int i=0; ime - comm->nprocs; int rank_next = universe->me + comm->nprocs; - if (rank_last<0) rank_last += universe->nprocs; - if (rank_next>=universe->nprocs) rank_next -= universe->nprocs; + if (rank_last < 0) rank_last += universe->nprocs; + if (rank_next >= universe->nprocs) rank_next -= universe->nprocs; - plan_send[0] = rank_next; plan_send[1] = rank_last; - plan_recv[0] = rank_last; plan_recv[1] = rank_next; + plan_send[0] = rank_next; + plan_send[1] = rank_last; + plan_recv[0] = rank_last; + plan_recv[1] = rank_next; - mode_index[0] = 0; mode_index[1] = 1; - x_last = 1; x_next = 0; - } - else - { + mode_index[0] = 0; + mode_index[1] = 1; + x_last = 1; + x_next = 0; + } else { size_plan = np - 1; - plan_send = new int [size_plan]; - plan_recv = new int [size_plan]; - mode_index = new int [size_plan]; + plan_send = new int[size_plan]; + plan_recv = new int[size_plan]; + mode_index = new int[size_plan]; - for (int i=0; ime + comm->nprocs * (i+1); - if (plan_send[i]>=universe->nprocs) plan_send[i] -= universe->nprocs; + for (int i = 0; i < size_plan; i++) { + plan_send[i] = universe->me + comm->nprocs * (i + 1); + if (plan_send[i] >= universe->nprocs) plan_send[i] -= universe->nprocs; - plan_recv[i] = universe->me - comm->nprocs * (i+1); - if (plan_recv[i]<0) plan_recv[i] += universe->nprocs; + plan_recv[i] = universe->me - comm->nprocs * (i + 1); + if (plan_recv[i] < 0) plan_recv[i] += universe->nprocs; - mode_index[i]=(universe->iworld+i+1)%(universe->nworlds); + mode_index[i] = (universe->iworld + i + 1) % (universe->nworlds); } - x_next = (universe->iworld+1+universe->nworlds)%(universe->nworlds); - x_last = (universe->iworld-1+universe->nworlds)%(universe->nworlds); + x_next = (universe->iworld + 1 + universe->nworlds) % (universe->nworlds); + x_last = (universe->iworld - 1 + universe->nworlds) % (universe->nworlds); } - if (buf_beads) - { - for (int i=0; inlocal; - if (nlocal > max_nlocal) - { - max_nlocal = nlocal+200; + if (nlocal > max_nlocal) { + max_nlocal = nlocal + 200; int size = sizeof(double) * max_nlocal * 3; - buf_recv = (double*) memory->srealloc(buf_recv, size, "FixPIMD:x_recv"); + buf_recv = (double *) memory->srealloc(buf_recv, size, "FixPIMD:x_recv"); - for (int i=0; isrealloc(buf_beads[i], size, "FixPIMD:x_beads[i]"); + for (int i = 0; i < np; i++) + buf_beads[i] = (double *) memory->srealloc(buf_beads[i], size, "FixPIMD:x_beads[i]"); } // copy local positions - memcpy(buf_beads[universe->iworld], &(ptr[0][0]), sizeof(double)*nlocal*3); + memcpy(buf_beads[universe->iworld], &(ptr[0][0]), sizeof(double) * nlocal * 3); // go over comm plans - for (int iplan = 0; iplanuworld, MPI_STATUS_IGNORE); + MPI_Sendrecv(&(nlocal), 1, MPI_INT, plan_send[iplan], 0, &(nsend), 1, MPI_INT, plan_recv[iplan], + 0, universe->uworld, MPI_STATUS_IGNORE); // allocate arrays - if (nsend > max_nsend) - { - max_nsend = nsend+200; - tag_send = (tagint*) memory->srealloc(tag_send, sizeof(tagint)*max_nsend, "FixPIMD:tag_send"); - buf_send = (double*) memory->srealloc(buf_send, sizeof(double)*max_nsend*3, "FixPIMD:x_send"); + if (nsend > max_nsend) { + max_nsend = nsend + 200; + tag_send = + (tagint *) memory->srealloc(tag_send, sizeof(tagint) * max_nsend, "FixPIMD:tag_send"); + buf_send = + (double *) memory->srealloc(buf_send, sizeof(double) * max_nsend * 3, "FixPIMD:x_send"); } // send tags - MPI_Sendrecv( atom->tag, nlocal, MPI_LMP_TAGINT, plan_send[iplan], 0, - tag_send, nsend, MPI_LMP_TAGINT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); + MPI_Sendrecv(atom->tag, nlocal, MPI_LMP_TAGINT, plan_send[iplan], 0, tag_send, nsend, + MPI_LMP_TAGINT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); // wrap positions double *wrap_ptr = buf_send; - int ncpy = sizeof(double)*3; + int ncpy = sizeof(double) * 3; - for (int i=0; imap(tag_send[i]); - if (index<0) - { + if (index < 0) { char error_line[256]; - sprintf(error_line, "Atom " TAGINT_FORMAT " is missing at world [%d] " - "rank [%d] required by rank [%d] (" TAGINT_FORMAT ", " - TAGINT_FORMAT ", " TAGINT_FORMAT ").\n", tag_send[i], - universe->iworld, comm->me, plan_recv[iplan], - atom->tag[0], atom->tag[1], atom->tag[2]); + sprintf(error_line, + "Atom " TAGINT_FORMAT " is missing at world [%d] " + "rank [%d] required by rank [%d] (" TAGINT_FORMAT ", " TAGINT_FORMAT + ", " TAGINT_FORMAT ").\n", + tag_send[i], universe->iworld, comm->me, plan_recv[iplan], atom->tag[0], + atom->tag[1], atom->tag[2]); - error->universe_one(FLERR,error_line); + error->universe_one(FLERR, error_line); } memcpy(wrap_ptr, ptr[index], ncpy); @@ -677,21 +694,20 @@ void FixPIMD::comm_exec(double **ptr) // sendrecv x - MPI_Sendrecv( buf_send, nsend*3, MPI_DOUBLE, plan_recv[iplan], 0, - buf_recv, nlocal*3, MPI_DOUBLE, plan_send[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); + MPI_Sendrecv(buf_send, nsend * 3, MPI_DOUBLE, plan_recv[iplan], 0, buf_recv, nlocal * 3, + MPI_DOUBLE, plan_send[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); // copy x - memcpy(buf_beads[mode_index[iplan]], buf_recv, sizeof(double)*nlocal*3); + memcpy(buf_beads[mode_index[iplan]], buf_recv, sizeof(double) * nlocal * 3); } } /* ---------------------------------------------------------------------- */ -int FixPIMD::pack_forward_comm(int n, int *list, double *buf, - int /*pbc_flag*/, int * /*pbc*/) +int FixPIMD::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, int * /*pbc*/) { - int i,j,m; + int i, j, m; m = 0; @@ -709,7 +725,7 @@ int FixPIMD::pack_forward_comm(int n, int *list, double *buf, void FixPIMD::unpack_forward_comm(int n, int first, double *buf) { - int i,m,last; + int i, m, last; m = 0; last = first + n; @@ -726,47 +742,51 @@ void FixPIMD::unpack_forward_comm(int n, int first, double *buf) double FixPIMD::memory_usage() { - return (double)atom->nmax * size_peratom_cols * sizeof(double); + return (double) atom->nmax * size_peratom_cols * sizeof(double); } /* ---------------------------------------------------------------------- */ void FixPIMD::grow_arrays(int nmax) { - if (nmax==0) return; - int count = nmax*3; + if (nmax == 0) return; + int count = nmax * 3; memory->grow(array_atom, nmax, size_peratom_cols, "FixPIMD::array_atom"); - memory->grow(nhc_eta, count, nhc_nchain, "FixPIMD::nh_eta"); - memory->grow(nhc_eta_dot, count, nhc_nchain+1, "FixPIMD::nh_eta_dot"); - memory->grow(nhc_eta_dotdot, count, nhc_nchain, "FixPIMD::nh_eta_dotdot"); - memory->grow(nhc_eta_mass, count, nhc_nchain, "FixPIMD::nh_eta_mass"); + memory->grow(nhc_eta, count, nhc_nchain, "FixPIMD::nh_eta"); + memory->grow(nhc_eta_dot, count, nhc_nchain + 1, "FixPIMD::nh_eta_dot"); + memory->grow(nhc_eta_dotdot, count, nhc_nchain, "FixPIMD::nh_eta_dotdot"); + memory->grow(nhc_eta_mass, count, nhc_nchain, "FixPIMD::nh_eta_mass"); } /* ---------------------------------------------------------------------- */ void FixPIMD::copy_arrays(int i, int j, int /*delflag*/) { - int i_pos = i*3; - int j_pos = j*3; + int i_pos = i * 3; + int j_pos = j * 3; - memcpy(nhc_eta [j_pos], nhc_eta [i_pos], nhc_size_one_1); - memcpy(nhc_eta_dot [j_pos], nhc_eta_dot [i_pos], nhc_size_one_2); + memcpy(nhc_eta[j_pos], nhc_eta[i_pos], nhc_size_one_1); + memcpy(nhc_eta_dot[j_pos], nhc_eta_dot[i_pos], nhc_size_one_2); memcpy(nhc_eta_dotdot[j_pos], nhc_eta_dotdot[i_pos], nhc_size_one_1); - memcpy(nhc_eta_mass [j_pos], nhc_eta_mass [i_pos], nhc_size_one_1); + memcpy(nhc_eta_mass[j_pos], nhc_eta_mass[i_pos], nhc_size_one_1); } /* ---------------------------------------------------------------------- */ int FixPIMD::pack_exchange(int i, double *buf) { - int offset=0; + int offset = 0; int pos = i * 3; - memcpy(buf+offset, nhc_eta[pos], nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(buf+offset, nhc_eta_dot[pos], nhc_size_one_2); offset += nhc_offset_one_2; - memcpy(buf+offset, nhc_eta_dotdot[pos], nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(buf+offset, nhc_eta_mass[pos], nhc_size_one_1); offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta[pos], nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta_dot[pos], nhc_size_one_2); + offset += nhc_offset_one_2; + memcpy(buf + offset, nhc_eta_dotdot[pos], nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta_mass[pos], nhc_size_one_1); + offset += nhc_offset_one_1; return size_peratom_cols; } @@ -775,13 +795,17 @@ int FixPIMD::pack_exchange(int i, double *buf) int FixPIMD::unpack_exchange(int nlocal, double *buf) { - int offset=0; - int pos = nlocal*3; + int offset = 0; + int pos = nlocal * 3; - memcpy(nhc_eta[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(nhc_eta_dot[pos], buf+offset, nhc_size_one_2); offset += nhc_offset_one_2; - memcpy(nhc_eta_dotdot[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(nhc_eta_mass[pos], buf+offset, nhc_size_one_1); offset += nhc_offset_one_1; + memcpy(nhc_eta[pos], buf + offset, nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(nhc_eta_dot[pos], buf + offset, nhc_size_one_2); + offset += nhc_offset_one_2; + memcpy(nhc_eta_dotdot[pos], buf + offset, nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(nhc_eta_mass[pos], buf + offset, nhc_size_one_1); + offset += nhc_offset_one_1; return size_peratom_cols; } @@ -790,17 +814,21 @@ int FixPIMD::unpack_exchange(int nlocal, double *buf) int FixPIMD::pack_restart(int i, double *buf) { - int offset=0; + int offset = 0; int pos = i * 3; // pack buf[0] this way because other fixes unpack it - buf[offset++] = size_peratom_cols+1; + buf[offset++] = size_peratom_cols + 1; - memcpy(buf+offset, nhc_eta[pos], nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(buf+offset, nhc_eta_dot[pos], nhc_size_one_2); offset += nhc_offset_one_2; - memcpy(buf+offset, nhc_eta_dotdot[pos], nhc_size_one_1); offset += nhc_offset_one_1; - memcpy(buf+offset, nhc_eta_mass[pos], nhc_size_one_1); offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta[pos], nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta_dot[pos], nhc_size_one_2); + offset += nhc_offset_one_2; + memcpy(buf + offset, nhc_eta_dotdot[pos], nhc_size_one_1); + offset += nhc_offset_one_1; + memcpy(buf + offset, nhc_eta_mass[pos], nhc_size_one_1); + offset += nhc_offset_one_1; - return size_peratom_cols+1; + return size_peratom_cols + 1; } /* ---------------------------------------------------------------------- */ @@ -813,15 +841,19 @@ void FixPIMD::unpack_restart(int nlocal, int nth) // unpack the Nth first values this way because other fixes pack them int m = 0; - for (int i=0; i (extra[nlocal][m]); + for (int i = 0; i < nth; i++) m += static_cast(extra[nlocal][m]); m++; int pos = nlocal * 3; - memcpy(nhc_eta[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1; - memcpy(nhc_eta_dot[pos], extra[nlocal]+m, nhc_size_one_2); m += nhc_offset_one_2; - memcpy(nhc_eta_dotdot[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1; - memcpy(nhc_eta_mass[pos], extra[nlocal]+m, nhc_size_one_1); m += nhc_offset_one_1; + memcpy(nhc_eta[pos], extra[nlocal] + m, nhc_size_one_1); + m += nhc_offset_one_1; + memcpy(nhc_eta_dot[pos], extra[nlocal] + m, nhc_size_one_2); + m += nhc_offset_one_2; + memcpy(nhc_eta_dotdot[pos], extra[nlocal] + m, nhc_size_one_1); + m += nhc_offset_one_1; + memcpy(nhc_eta_mass[pos], extra[nlocal] + m, nhc_size_one_1); + m += nhc_offset_one_1; nhc_ready = true; } @@ -830,21 +862,21 @@ void FixPIMD::unpack_restart(int nlocal, int nth) int FixPIMD::maxsize_restart() { - return size_peratom_cols+1; + return size_peratom_cols + 1; } /* ---------------------------------------------------------------------- */ int FixPIMD::size_restart(int /*nlocal*/) { - return size_peratom_cols+1; + return size_peratom_cols + 1; } /* ---------------------------------------------------------------------- */ double FixPIMD::compute_vector(int n) { - if (n==0) { return spring_energy; } - if (n==1) { return t_sys; } + if (n == 0) { return spring_energy; } + if (n == 1) { return t_sys; } return 0.0; } diff --git a/src/REPLICA/fix_pimd.h b/src/REPLICA/fix_pimd.h index 2c13663f23..05a24dedce 100644 --- a/src/REPLICA/fix_pimd.h +++ b/src/REPLICA/fix_pimd.h @@ -27,6 +27,7 @@ namespace LAMMPS_NS { class FixPIMD : public Fix { public: FixPIMD(class LAMMPS *, int, char **); + virtual ~FixPIMD(); int setmask(); From 3e99e24f41d68a7c8a9a60e9620d213957155157 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 05:50:44 -0400 Subject: [PATCH 273/352] make calls to virtual functions from constructors explicit --- src/GRANULAR/fix_wall_gran.cpp | 5 ++--- src/GRANULAR/fix_wall_gran_region.cpp | 5 ++--- src/MANYBODY/pair_tersoff_table.cpp | 2 +- src/OPENMP/pair_tersoff_table_omp.cpp | 2 +- src/REAXFF/fix_qeq_reaxff.cpp | 2 +- src/compute_dipole.cpp | 5 +---- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/GRANULAR/fix_wall_gran.cpp b/src/GRANULAR/fix_wall_gran.cpp index a604782993..5f16176e49 100644 --- a/src/GRANULAR/fix_wall_gran.cpp +++ b/src/GRANULAR/fix_wall_gran.cpp @@ -437,7 +437,7 @@ FixWallGran::FixWallGran(LAMMPS *lmp, int narg, char **arg) : // register with Atom class history_one = nullptr; - grow_arrays(atom->nmax); + FixWallGran::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); atom->add_callback(Atom::RESTART); @@ -1555,8 +1555,7 @@ double FixWallGran::memory_usage() void FixWallGran::grow_arrays(int nmax) { - if (use_history) memory->grow(history_one,nmax,size_history, - "fix_wall_gran:history_one"); + if (use_history) memory->grow(history_one,nmax,size_history,"fix_wall_gran:history_one"); if (peratom_flag) { memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); } diff --git a/src/GRANULAR/fix_wall_gran_region.cpp b/src/GRANULAR/fix_wall_gran_region.cpp index 0a92bac543..37afe9632c 100644 --- a/src/GRANULAR/fix_wall_gran_region.cpp +++ b/src/GRANULAR/fix_wall_gran_region.cpp @@ -62,7 +62,7 @@ FixWallGranRegion::FixWallGranRegion(LAMMPS *lmp, int narg, char **arg) : ncontact = nullptr; walls = nullptr; history_many = nullptr; - grow_arrays(atom->nmax); + FixWallGranRegion::grow_arrays(atom->nmax); // initialize shear history as if particle is not touching region @@ -355,8 +355,7 @@ void FixWallGranRegion::grow_arrays(int nmax) if (use_history) { memory->grow(ncontact,nmax,"fix_wall_gran:ncontact"); memory->grow(walls,nmax,tmax,"fix_wall_gran:walls"); - memory->grow(history_many,nmax,tmax,size_history, - "fix_wall_gran:history_many"); + memory->grow(history_many,nmax,tmax,size_history,"fix_wall_gran:history_many"); } if (peratom_flag) memory->grow(array_atom,nmax,size_peratom_cols,"fix_wall_gran:array_atom"); diff --git a/src/MANYBODY/pair_tersoff_table.cpp b/src/MANYBODY/pair_tersoff_table.cpp index e64e5bce02..94c4d88b09 100644 --- a/src/MANYBODY/pair_tersoff_table.cpp +++ b/src/MANYBODY/pair_tersoff_table.cpp @@ -91,7 +91,7 @@ PairTersoffTable::~PairTersoffTable() memory->destroy(cutsq); } deallocateGrids(); - deallocatePreLoops(); + PairTersoffTable::deallocatePreLoops(); } /* ---------------------------------------------------------------------- */ diff --git a/src/OPENMP/pair_tersoff_table_omp.cpp b/src/OPENMP/pair_tersoff_table_omp.cpp index 47ee2feca8..5367a3d043 100644 --- a/src/OPENMP/pair_tersoff_table_omp.cpp +++ b/src/OPENMP/pair_tersoff_table_omp.cpp @@ -53,7 +53,7 @@ PairTersoffTableOMP::PairTersoffTableOMP(LAMMPS *lmp) : PairTersoffTableOMP::~PairTersoffTableOMP() { if (allocated) { - deallocatePreLoops(); + PairTersoffTableOMP::deallocatePreLoops(); } } diff --git a/src/REAXFF/fix_qeq_reaxff.cpp b/src/REAXFF/fix_qeq_reaxff.cpp index fd197a156a..8c3b7df190 100644 --- a/src/REAXFF/fix_qeq_reaxff.cpp +++ b/src/REAXFF/fix_qeq_reaxff.cpp @@ -165,7 +165,7 @@ FixQEqReaxFF::~FixQEqReaxFF() memory->destroy(s_hist); memory->destroy(t_hist); - deallocate_storage(); + FixQEqReaxFF::deallocate_storage(); deallocate_matrix(); memory->destroy(shld); diff --git a/src/compute_dipole.cpp b/src/compute_dipole.cpp index 053f11e6f9..b67c3df3ce 100644 --- a/src/compute_dipole.cpp +++ b/src/compute_dipole.cpp @@ -29,7 +29,7 @@ enum { MASSCENTER, GEOMCENTER }; ComputeDipole::ComputeDipole(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg) { - if (narg != 3) error->all(FLERR, "Illegal compute com command"); + if ((narg < 3) || (narg > 4)) error->all(FLERR, "Illegal compute dipole command"); scalar_flag = 1; vector_flag = 1; @@ -39,11 +39,8 @@ ComputeDipole::ComputeDipole(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, n vector = new double[size_vector]; vector[0] = vector[1] = vector[2] = 0.0; - usecenter = MASSCENTER; - if ((narg != 3) && (narg != 4)) error->all(FLERR, "Illegal compute dipole command"); - if (narg == 4) { if (utils::strmatch(arg[3], "^geom")) usecenter = GEOMCENTER; From 3bfb235070d0154e22fe1afce38e75b073916689 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 05:50:53 -0400 Subject: [PATCH 274/352] fix memory leak --- src/GRANULAR/pair_granular.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index cca349b819..d6db110514 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -111,7 +111,8 @@ PairGranular::PairGranular(LAMMPS *lmp) : Pair(lmp) PairGranular::~PairGranular() { - delete [] svector; + delete[] svector; + delete[] history_transfer_factors; if (!fix_history) modify->delete_fix("NEIGH_HISTORY_GRANULAR_DUMMY"); else modify->delete_fix("NEIGH_HISTORY_GRANULAR"); From 1abce8e82155dbe3a8cec0217c429f0c1acfcfd3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 05:51:05 -0400 Subject: [PATCH 275/352] remove dead code --- src/DPD-REACT/pair_exp6_rx.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/DPD-REACT/pair_exp6_rx.cpp b/src/DPD-REACT/pair_exp6_rx.cpp index f5adfac7a1..8240cb88b7 100644 --- a/src/DPD-REACT/pair_exp6_rx.cpp +++ b/src/DPD-REACT/pair_exp6_rx.cpp @@ -617,8 +617,7 @@ void PairExp6rx::coeff(int narg, char **arg) if (strcmp(site1,"1fluid") == 0) isite1 = oneFluidApproxParameter; - else - { + else { int isp; for (isp = 0; isp < nspecies; isp++) if (strcmp(site1, &atom->dname[isp][0]) == 0) break; @@ -631,8 +630,7 @@ void PairExp6rx::coeff(int narg, char **arg) if (strcmp(site2,"1fluid") == 0) isite2 = oneFluidApproxParameter; - else - { + else { int isp; for (isp = 0; isp < nspecies; isp++) if (strcmp(site2, &atom->dname[isp][0]) == 0) break; @@ -644,8 +642,7 @@ void PairExp6rx::coeff(int narg, char **arg) } // Set the interaction potential type to the enumerated type. - for (int iparam = 0; iparam < nparams; ++iparam) - { + for (int iparam = 0; iparam < nparams; ++iparam) { if (strcmp( params[iparam].potential, "exp6") == 0) params[iparam].potentialType = exp6PotentialType; else @@ -663,7 +660,6 @@ void PairExp6rx::coeff(int narg, char **arg) scalingFlag = EXPONENT; exponentR = utils::numeric(FLERR,arg[6],false,lmp); exponentEpsilon = utils::numeric(FLERR,arg[7],false,lmp); - if (narg > 9) error->all(FLERR,"Incorrect args for pair coefficients"); if (narg == 9) cut_one = utils::numeric(FLERR,arg[8],false,lmp); } else if (strcmp(arg[5],"polynomial") == 0) { scalingFlag = POLYNOMIAL; From f08c249d40a7b485203bfe3ce7e727da1a997d93 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 06:23:46 -0400 Subject: [PATCH 276/352] don't hide parameter with local variable --- src/ASPHERE/pair_resquared.cpp | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/ASPHERE/pair_resquared.cpp b/src/ASPHERE/pair_resquared.cpp index 5c0602a453..4210818c61 100644 --- a/src/ASPHERE/pair_resquared.cpp +++ b/src/ASPHERE/pair_resquared.cpp @@ -505,10 +505,10 @@ void PairRESquared::precompute_i(const int i,RE2Vars &ws) MathExtra::rotation_generator_x(ws.A,ws.lA[0]); MathExtra::rotation_generator_y(ws.A,ws.lA[1]); MathExtra::rotation_generator_z(ws.A,ws.lA[2]); - for (int i=0; i<3; i++) { - MathExtra::times3(aTs,ws.lA[i],ws.lAtwo[i]); - MathExtra::transpose_times3(ws.lA[i],ws.sa,ws.lAsa[i]); - MathExtra::plus3(ws.lAsa[i],ws.lAtwo[i],ws.lAsa[i]); + for (int m=0; m<3; m++) { + MathExtra::times3(aTs,ws.lA[m],ws.lAtwo[m]); + MathExtra::transpose_times3(ws.lA[m],ws.sa,ws.lAsa[m]); + MathExtra::plus3(ws.lAsa[m],ws.lAtwo[m],ws.lAsa[m]); } } @@ -724,10 +724,10 @@ double PairRESquared::resquared_analytic(const int i, const int j, dspr = 7.0/h12-1.0/hsec+stemp; pbsr = b_alpha*sigma[type[i]][type[j]]/hsec; - for (int i=0; i<3; i++) { - u[0] = -rhat[i]*rhat[0]; - u[1] = -rhat[i]*rhat[1]; - u[2] = -rhat[i]*rhat[2]; + for (int m=0; m<3; m++) { + u[0] = -rhat[m]*rhat[0]; + u[1] = -rhat[m]*rhat[1]; + u[2] = -rhat[m]*rhat[2]; u[i] += 1.0; u[0] /= rnorm; u[1] /= rnorm; @@ -753,7 +753,7 @@ double PairRESquared::resquared_analytic(const int i, const int j, dh12 = rhat[i]+MathExtra::dot3(u,spr); dUa = pbsu*(eta*dchi+deta*chi)-dh12*dspu; dUr = pbsr*(eta*dchi+deta*chi)-dh12*dspr; - fforce[i]=dUr*Ur+dUa*Ua; + fforce[m]=dUr*Ur+dUa*Ua; } // torque on i @@ -950,19 +950,19 @@ double PairRESquared::resquared_lj(const int i, const int j, dspr = 7.0/h12-1.0/hsec+stemp; pbsr = b_alpha*sigma[type[i]][type[j]]/hsec; - for (int i=0; i<3; i++) { - u[0] = -rhat[i]*rhat[0]; - u[1] = -rhat[i]*rhat[1]; - u[2] = -rhat[i]*rhat[2]; - u[i] += 1.0; + for (int m=0; m<3; m++) { + u[0] = -rhat[m]*rhat[0]; + u[1] = -rhat[m]*rhat[1]; + u[2] = -rhat[m]*rhat[2]; + u[m] += 1.0; u[0] /= rnorm; u[1] /= rnorm; u[2] /= rnorm; dchi = MathExtra::dot3(u,fourw); - dh12 = rhat[i]+MathExtra::dot3(u,spr); + dh12 = rhat[m]+MathExtra::dot3(u,spr); dUa = pbsu*dchi-dh12*dspu; dUr = pbsr*dchi-dh12*dspr; - fforce[i]=dUr*Ur+dUa*Ua; + fforce[m]=dUr*Ur+dUa*Ua; } // torque on i @@ -970,17 +970,17 @@ double PairRESquared::resquared_lj(const int i, const int j, if (calc_torque) { MathExtra::vecmat(fourw,wi.aTe,fwae); - for (int i=0; i<3; i++) { - MathExtra::matvec(wi.lA[i],rhat,p); + for (int m=0; m<3; m++) { + MathExtra::matvec(wi.lA[m],rhat,p); double tempv[3]; - MathExtra::matvec(wi.lA[i],w,tempv); + MathExtra::matvec(wi.lA[m],w,tempv); dchi = -MathExtra::dot3(fwae,tempv); - MathExtra::matvec(lAtwo[i],spr,tempv); + MathExtra::matvec(lAtwo[m],spr,tempv); dh12 = -MathExtra::dot3(s,tempv); dUa = pbsu*dchi-dh12*dspu; dUr = pbsr*dchi-dh12*dspr; - ttor[i] = -(dUa*Ua+dUr*Ur); + ttor[m] = -(dUa*Ua+dUr*Ur); } } From a765cf373abb84b62a903c985aa99350d64676ac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 06:24:22 -0400 Subject: [PATCH 277/352] update formatting --- src/BODY/pair_body_rounded_polygon.cpp | 18 +++++++++--------- src/BODY/pair_body_rounded_polyhedron.cpp | 21 +++++++++------------ 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index 7dc7956586..23a4da7f07 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -21,21 +21,21 @@ #include "pair_body_rounded_polygon.h" -#include -#include -#include "math_extra.h" #include "atom.h" #include "atom_vec_body.h" #include "body_rounded_polygon.h" #include "comm.h" -#include "force.h" -#include "fix.h" -#include "modify.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" #include "error.h" +#include "fix.h" +#include "force.h" +#include "math_extra.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 65179ecb80..6deb06aafb 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -23,22 +23,22 @@ #include "pair_body_rounded_polyhedron.h" -#include -#include #include "atom.h" #include "atom_vec_body.h" #include "body_rounded_polyhedron.h" #include "comm.h" -#include "force.h" -#include "fix.h" -#include "modify.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" #include "error.h" -#include "math_extra.h" +#include "fix.h" +#include "force.h" #include "math_const.h" +#include "math_extra.h" +#include "memory.h" +#include "modify.h" +#include "neigh_list.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; using namespace MathConst; @@ -1212,10 +1212,7 @@ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, contact_list[num_contacts].unique = 1; num_contacts++; } - } else { - } - return interact; } From 9cb8a6205e8b693e745aa53b8111138242ee5ab2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 06:24:39 -0400 Subject: [PATCH 278/352] apply "no" argument correctly --- src/EXTRA-FIX/fix_gld.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/EXTRA-FIX/fix_gld.cpp b/src/EXTRA-FIX/fix_gld.cpp index 34ed43301e..2e30882206 100644 --- a/src/EXTRA-FIX/fix_gld.cpp +++ b/src/EXTRA-FIX/fix_gld.cpp @@ -132,6 +132,7 @@ FixGLD::FixGLD(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Illegal fix gld command"); } if (strcmp(arg[iarg+1],"no") == 0) { + zeroflag = 0; } else if (strcmp(arg[iarg+1],"yes") == 0) { zeroflag = 1; } else { @@ -144,6 +145,7 @@ FixGLD::FixGLD(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, "Illegal fix gld command"); } if (strcmp(arg[iarg+1],"no") == 0) { + freezeflag = 0; } else if (strcmp(arg[iarg+1],"yes") == 0) { freezeflag = 1; for (int i = 0; i < atom->nlocal; i++) { From eaedd9ad488e74c316de4dfe2330524dbd30c7a8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 06:24:57 -0400 Subject: [PATCH 279/352] fix output issues --- src/REPLICA/neb.cpp | 8 +++++--- src/SPIN/neb_spin.cpp | 12 +++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp index 66a1dd83d5..a445ace756 100644 --- a/src/REPLICA/neb.cpp +++ b/src/REPLICA/neb.cpp @@ -94,7 +94,8 @@ NEB::~NEB() { MPI_Comm_free(&roots); memory->destroy(all); - delete [] rdist; + delete[] rdist; + if (fp) fclose(fp); } /* ---------------------------------------------------------------------- @@ -379,8 +380,8 @@ void NEB::readfile(char *file, int flag) char line[MAXLINE]; double xx,yy,zz,delx,dely,delz; - if (me_universe == 0 && screen) - fprintf(screen,"Reading NEB coordinate file(s) ...\n"); + if (me_universe == 0 && universe->uscreen) + fprintf(universe->uscreen,"Reading NEB coordinate file(s) ...\n"); // flag = 0, universe root reads header of file, bcast to universe // flag = 1, each replica's root reads header of file, bcast to world @@ -534,6 +535,7 @@ void NEB::readfile(char *file, int flag) else fclose(fp); } } + fp = nullptr; } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index a07a16350a..1b798166a1 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -78,7 +78,8 @@ NEBSpin::~NEBSpin() { MPI_Comm_free(&roots); memory->destroy(all); - delete [] rdist; + delete[] rdist; + if (fp) fclose(fp); } /* ---------------------------------------------------------------------- @@ -373,8 +374,8 @@ void NEBSpin::readfile(char *file, int flag) double xx,yy,zz; double musp,spx,spy,spz; - if (me_universe == 0 && screen) - fprintf(screen,"Reading NEBSpin coordinate file(s) ...\n"); + if (me_universe == 0 && universe->uscreen) + fprintf(universe->uscreen,"Reading NEBSpin coordinate file(s) ...\n"); // flag = 0, universe root reads header of file, bcast to universe // flag = 1, each replica's root reads header of file, bcast to world @@ -546,8 +547,8 @@ void NEBSpin::readfile(char *file, int flag) // clean up - delete [] buffer; - delete [] values; + delete[] buffer; + delete[] values; if (flag == 0) { if (me_universe == 0) { @@ -560,6 +561,7 @@ void NEBSpin::readfile(char *file, int flag) else fclose(fp); } } + fp = nullptr; } /* ---------------------------------------------------------------------- From cba8e8237ae754cd842e4440a1d555c7be3fbbfa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 13 Aug 2021 06:25:21 -0400 Subject: [PATCH 280/352] avoid memory leak with MPI-IO --- src/read_restart.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/read_restart.cpp b/src/read_restart.cpp index faf9fd1620..e42bb59272 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -44,7 +44,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -ReadRestart::ReadRestart(LAMMPS *lmp) : Command(lmp) {} +ReadRestart::ReadRestart(LAMMPS *lmp) : Command(lmp), mpiio(nullptr) {} /* ---------------------------------------------------------------------- */ @@ -110,8 +110,7 @@ void ReadRestart::command(int narg, char **arg) } fp = fopen(hfile.c_str(),"rb"); if (fp == nullptr) - error->one(FLERR,"Cannot open restart file {}: {}", - hfile, utils::getsyserror()); + error->one(FLERR,"Cannot open restart file {}: {}", hfile, utils::getsyserror()); } // read magic string, endian flag, format revision @@ -336,8 +335,7 @@ void ReadRestart::command(int narg, char **arg) procfile.replace(procfile.find("%"),1,fmt::format("{}",icluster)); fp = fopen(procfile.c_str(),"rb"); if (fp == nullptr) - error->one(FLERR,"Cannot open restart file {}: {}", - procfile, utils::getsyserror()); + error->one(FLERR,"Cannot open restart file {}: {}", procfile, utils::getsyserror()); } int procsperfile; @@ -401,7 +399,7 @@ void ReadRestart::command(int narg, char **arg) // clean-up memory - delete [] file; + delete[] file; memory->destroy(buf); // for multiproc or MPI-IO files: @@ -525,8 +523,9 @@ void ReadRestart::command(int narg, char **arg) MPI_Barrier(world); if (comm->me == 0) - utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n", - MPI_Wtime()-time1); + utils::logmesg(lmp," read_restart CPU = {:.3f} seconds\n",MPI_Wtime()-time1); + + delete mpiio; } /* ---------------------------------------------------------------------- @@ -599,7 +598,7 @@ void ReadRestart::header() if (me == 0) utils::logmesg(lmp," restart file = {}, LAMMPS = {}\n", version,lmp->version); - delete [] version; + delete[] version; // we have no forward compatibility, thus exit with error @@ -638,7 +637,7 @@ void ReadRestart::header() } else if (flag == UNITS) { char *style = read_string(); if (strcmp(style,update->unit_style) != 0) update->set_units(style); - delete [] style; + delete[] style; } else if (flag == NTIMESTEP) { update->ntimestep = read_bigint(); @@ -772,9 +771,9 @@ void ReadRestart::header() atom->create_avec(style,nargcopy,argcopy,1); if (comm->me ==0) utils::logmesg(lmp," restoring atom style {} from restart\n",style); - for (int i = 0; i < nargcopy; i++) delete [] argcopy[i]; - delete [] argcopy; - delete [] style; + for (int i = 0; i < nargcopy; i++) delete[] argcopy[i]; + delete[] argcopy; + delete[] style; } else if (flag == NATOMS) { atom->natoms = read_bigint(); @@ -889,7 +888,7 @@ void ReadRestart::type_arrays() double *mass = new double[atom->ntypes+1]; read_double_vec(atom->ntypes,&mass[1]); atom->set_mass(mass); - delete [] mass; + delete[] mass; } else error->all(FLERR, "Invalid flag in type arrays section of restart file"); @@ -910,7 +909,7 @@ void ReadRestart::force_fields() if (flag == PAIR) { style = read_string(); force->create_pair(style,1); - delete [] style; + delete[] style; if (comm->me ==0) utils::logmesg(lmp," restoring pair style {} from restart\n", force->pair_style); @@ -926,7 +925,7 @@ void ReadRestart::force_fields() } else if (flag == BOND) { style = read_string(); force->create_bond(style,1); - delete [] style; + delete[] style; if (comm->me ==0) utils::logmesg(lmp," restoring bond style {} from restart\n", force->bond_style); @@ -935,7 +934,7 @@ void ReadRestart::force_fields() } else if (flag == ANGLE) { style = read_string(); force->create_angle(style,1); - delete [] style; + delete[] style; if (comm->me ==0) utils::logmesg(lmp," restoring angle style {} from restart\n", force->angle_style); @@ -944,7 +943,7 @@ void ReadRestart::force_fields() } else if (flag == DIHEDRAL) { style = read_string(); force->create_dihedral(style,1); - delete [] style; + delete[] style; if (comm->me ==0) utils::logmesg(lmp," restoring dihedral style {} from restart\n", force->dihedral_style); @@ -953,7 +952,7 @@ void ReadRestart::force_fields() } else if (flag == IMPROPER) { style = read_string(); force->create_improper(style,1); - delete [] style; + delete[] style; if (comm->me ==0) utils::logmesg(lmp," restoring improper style {} from restart\n", force->improper_style); @@ -1117,7 +1116,7 @@ void ReadRestart::magic_string() MPI_Bcast(str,n,MPI_CHAR,0,world); if (strcmp(str,MAGIC_STRING) != 0) error->all(FLERR,"Invalid LAMMPS restart file"); - delete [] str; + delete[] str; } /* ---------------------------------------------------------------------- @@ -1164,7 +1163,7 @@ void ReadRestart::check_eof_magic() if (strcmp(str,MAGIC_STRING) != 0) error->all(FLERR,"Incomplete or corrupted LAMMPS restart file"); - delete [] str; + delete[] str; } /* ---------------------------------------------------------------------- From e15c51c7e1351b6e3ae130f64f3b24282882cd12 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 15 Aug 2021 17:44:22 -0400 Subject: [PATCH 281/352] correctly use global cutoff instead of per-type-pair cutoffs --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 15 +++------------ src/INTERLAYER/pair_kolmogorov_crespi_full.cpp | 15 +++------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 3a35c281c1..efb7214cd7 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -141,15 +141,6 @@ void PairILPGrapheneHBN::settings(int narg, char **arg) cut_global = utils::numeric(FLERR,arg[0],false,lmp); if (narg == 2) tap_flag = utils::numeric(FLERR,arg[1],false,lmp); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } } /* ---------------------------------------------------------------------- @@ -175,14 +166,14 @@ double PairILPGrapheneHBN::init_one(int i, int j) if (!offset_flag) error->all(FLERR,"Must use 'pair_modify shift yes' with this pair style"); - if (offset_flag && (cut[i][j] > 0.0)) { + if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; Param& p = params[iparam_ij]; - offset[i][j] = -p.C6*pow(1.0/cut[i][j],6)/(1.0 + exp(-p.d*(cut[i][j]/p.seff - 1.0))); + offset[i][j] = -p.C6*pow(1.0/cut_global,6)/(1.0 + exp(-p.d*(cut_global/p.seff - 1.0))); } else offset[i][j] = 0.0; offset[j][i] = offset[i][j]; - return cut[i][j]; + return cut_global; } /* ---------------------------------------------------------------------- diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index bd5050401e..21ef996a3c 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -143,15 +143,6 @@ void PairKolmogorovCrespiFull::settings(int narg, char **arg) cut_global = utils::numeric(FLERR,arg[0],false,lmp); if (narg == 2) tap_flag = utils::numeric(FLERR,arg[1],false,lmp); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } } /* ---------------------------------------------------------------------- @@ -176,14 +167,14 @@ double PairKolmogorovCrespiFull::init_one(int i, int j) if (!offset_flag) error->all(FLERR,"Must use 'pair_modify shift yes' with this pair style"); - if (offset_flag && (cut[i][j] > 0.0)) { + if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; Param& p = params[iparam_ij]; - offset[i][j] = -p.A*pow(p.z0/cut[i][j],6); + offset[i][j] = -p.A*pow(p.z0/cut_global,6); } else offset[i][j] = 0.0; offset[j][i] = offset[i][j]; - return cut[i][j]; + return cut_global; } /* ---------------------------------------------------------------------- From 7efbdb24cc03b40a9cabc68c23bb5dceb9c58eb2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 15 Aug 2021 18:39:21 -0400 Subject: [PATCH 282/352] fix memory leak --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index efb7214cd7..3aa5ae7bf5 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -107,6 +107,7 @@ PairILPGrapheneHBN::~PairILPGrapheneHBN() memory->destroy(elem2param); memory->destroy(cutILPsq); + memory->sfree(params); } /* ---------------------------------------------------------------------- From 832f6499edf4e54143278ca71c5514b842f8f71b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 15 Aug 2021 18:39:42 -0400 Subject: [PATCH 283/352] add suppression for OpenMP in newer GCC compilers --- tools/valgrind/OpenMP.supp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/valgrind/OpenMP.supp b/tools/valgrind/OpenMP.supp index 0820100b94..e1870e668c 100644 --- a/tools/valgrind/OpenMP.supp +++ b/tools/valgrind/OpenMP.supp @@ -123,3 +123,14 @@ ... obj:* } +{ + OpnMP_init_part11 + Memcheck:Leak + match-leak-kinds: possible + fun:calloc + ... + fun:allocate_dtv + ... + fun:GOMP_parallel + obj:* +} From 7b873ffc0be54f64febce73dedd1e78c7c1447a5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 15 Aug 2021 19:07:57 -0400 Subject: [PATCH 284/352] add unit tests for ilp/graphene/hbn and kolmogorov/crespi/full --- unittest/force-styles/tests/data.bilayer | 72 ++++++++++ unittest/force-styles/tests/in.bilayer | 16 +++ .../tests/manybody-pair-ilp-graphene-hbn.yaml | 126 ++++++++++++++++++ ...anybody-pair-ilp-graphene-hbn_notaper.yaml | 126 ++++++++++++++++++ .../manybody-pair-kolmogorov_crespi_full.yaml | 126 ++++++++++++++++++ ...y-pair-kolmogorov_crespi_full_notaper.yaml | 126 ++++++++++++++++++ 6 files changed, 592 insertions(+) create mode 100644 unittest/force-styles/tests/data.bilayer create mode 100644 unittest/force-styles/tests/in.bilayer create mode 100644 unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml create mode 100644 unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml create mode 100644 unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml create mode 100644 unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml diff --git a/unittest/force-styles/tests/data.bilayer b/unittest/force-styles/tests/data.bilayer new file mode 100644 index 0000000000..101bb02480 --- /dev/null +++ b/unittest/force-styles/tests/data.bilayer @@ -0,0 +1,72 @@ +LAMMPS data file. CGCMM style. atom_style full generated by VMD/TopoTools v1.8 on Sun Aug 15 17:12:56 EDT 2021 + 48 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + 3 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + 0 7.38 xlo xhi + 0 8.58 ylo yhi + 0 10.0 zlo zhi + + Masses + + 1 11.000000 # 1 + 2 14.000000 # 2 + 3 12.000000 # 3 + + Atoms # full + +1 1 2 -0.420000 0.000000 0.715000 0.000000 # 2 +2 1 1 0.420000 0.000000 2.145000 0.000000 # 1 +3 1 2 -0.420000 1.238416 2.860000 0.000000 # 2 +4 1 1 0.420000 1.238416 4.290000 0.000000 # 1 +5 1 2 -0.420000 0.000000 5.005000 0.000000 # 2 +6 1 1 0.420000 0.000000 6.435000 0.000000 # 1 +7 1 2 -0.420000 1.238416 7.150000 0.000000 # 2 +8 1 1 0.420000 1.238416 8.580000 0.000000 # 1 +9 1 2 -0.420000 2.476833 0.715000 0.000000 # 2 +10 1 1 0.420000 2.476833 2.145000 0.000000 # 1 +11 1 2 -0.420000 3.715249 2.860000 0.000000 # 2 +12 1 1 0.420000 3.715249 4.290000 0.000000 # 1 +13 1 2 -0.420000 2.476833 5.005000 0.000000 # 2 +14 1 1 0.420000 2.476833 6.435000 0.000000 # 1 +15 1 2 -0.420000 3.715249 7.150000 0.000000 # 2 +16 1 1 0.420000 3.715249 8.580000 0.000000 # 1 +17 1 2 -0.420000 4.953665 0.715000 0.000000 # 2 +18 1 1 0.420000 4.953665 2.145000 0.000000 # 1 +19 1 2 -0.420000 6.192081 2.860000 0.000000 # 2 +20 1 1 0.420000 6.192081 4.290000 0.000000 # 1 +21 1 2 -0.420000 4.953665 5.005000 0.000000 # 2 +22 1 1 0.420000 4.953665 6.435000 0.000000 # 1 +23 1 2 -0.420000 6.192081 7.150000 0.000000 # 2 +24 1 1 0.420000 6.192081 8.580000 0.000000 # 1 +25 2 3 0.000000 1.238416 1.430000 3.330000 # 3 +26 2 3 0.000000 0.000000 2.145000 3.330000 # 3 +27 2 3 0.000000 0.000000 3.575000 3.330000 # 3 +28 2 3 0.000000 1.238416 4.290000 3.330000 # 3 +29 2 3 0.000000 1.238416 5.720000 3.330000 # 3 +30 2 3 0.000000 0.000000 6.435000 3.330000 # 3 +31 2 3 0.000000 0.000000 7.865000 3.330000 # 3 +32 2 3 0.000000 1.238416 8.580000 3.330000 # 3 +33 2 3 0.000000 3.715249 1.430000 3.330000 # 3 +34 2 3 0.000000 2.476833 2.145000 3.330000 # 3 +35 2 3 0.000000 2.476833 3.575000 3.330000 # 3 +36 2 3 0.000000 3.715249 4.290000 3.330000 # 3 +37 2 3 0.000000 3.715249 5.720000 3.330000 # 3 +38 2 3 0.000000 2.476833 6.435000 3.330000 # 3 +39 2 3 0.000000 2.476833 7.865000 3.330000 # 3 +40 2 3 0.000000 3.715249 8.580000 3.330000 # 3 +41 2 3 0.000000 6.192081 1.430000 3.330000 # 3 +42 2 3 0.000000 4.953665 2.145000 3.330000 # 3 +43 2 3 0.000000 4.953665 3.575000 3.330000 # 3 +44 2 3 0.000000 6.192081 4.290000 3.330000 # 3 +45 2 3 0.000000 6.192081 5.720000 3.330000 # 3 +46 2 3 0.000000 4.953665 6.435000 3.330000 # 3 +47 2 3 0.000000 4.953665 7.865000 3.330000 # 3 +48 2 3 0.000000 6.192081 8.580000 3.330000 # 3 + diff --git a/unittest/force-styles/tests/in.bilayer b/unittest/force-styles/tests/in.bilayer new file mode 100644 index 0000000000..6ce26ecc71 --- /dev/null +++ b/unittest/force-styles/tests/in.bilayer @@ -0,0 +1,16 @@ +variable newton_pair index on +variable newton_bond index on +variable units index metal +variable input_dir index . +variable data_file index ${input_dir}/data.bilayer +variable pair_style index 'zero 8.0' + +atom_style full +atom_modify map array +neigh_modify delay 2 every 2 check no +units ${units} +timestep 0.0001 +newton ${newton_pair} ${newton_bond} + +pair_style ${pair_style} +read_data ${data_file} diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml new file mode 100644 index 0000000000..b2986e4d02 --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml @@ -0,0 +1,126 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 15 17:37:13 2021 +epsilon: 5e-12 +skip_tests: single +prerequisites: ! | + pair ilp/graphene/hbn + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on + comm_modify cutoff 16.0 +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay ilp/graphene/hbn 16.0 1 +pair_coeff: ! | + * * ilp/graphene/hbn BNCH.ILP B N C +extract: ! "" +natoms: 48 +init_vdwl: -1.387500902597699 +init_coul: 0 +init_stress: ! |- + -1.0950745163741815e+00 -1.0965448791525116e+00 -5.5691185658268150e-01 0.0 0.0 -1.1949269093120441e-03 +init_forces: ! |2 + 1 2.0033364707962020e-03 3.2526065174565133e-18 -4.7626541030897668e-02 + 2 -1.1368359972830505e-05 9.1814113875668727e-05 4.2488212564737199e-02 + 3 -5.5278100417535583e-05 -1.1058862159352145e-17 -4.4732824814754067e-02 + 4 -2.3915922842134181e-04 2.2249364734195330e-06 4.0890453270282665e-02 + 5 2.0033364707962020e-03 4.1199682554449168e-18 -4.7626541030897619e-02 + 6 -1.1368359972813158e-05 9.1814113875680762e-05 4.2488212564737102e-02 + 7 -5.5278100417523006e-05 -3.7404974950749903e-17 -4.4732824814753921e-02 + 8 -2.3915922842133140e-04 2.2249364733897175e-06 4.0890453270282998e-02 + 9 -5.2020828171993284e-05 -2.0193265462542520e-18 -4.4737801821738435e-02 + 10 -1.2511640292790002e-04 -4.3335410390344704e-06 4.1581628715790360e-02 + 11 5.1983198952135928e-05 -1.1150341717655610e-17 -4.4737856331164172e-02 + 12 1.2512171341779051e-04 -4.3318158884542686e-06 4.1581659199143604e-02 + 13 -5.2020828171995019e-05 -1.0299920638612292e-18 -4.4737801821738400e-02 + 14 -1.2511640292792257e-04 -4.3335410390036926e-06 4.1581628715790221e-02 + 15 5.1983198952134085e-05 -2.2639496614212939e-17 -4.4737856331164047e-02 + 16 1.2512171341781285e-04 -4.3318158884359524e-06 4.1581659199143896e-02 + 17 5.5317942397928804e-05 -1.3694193416497087e-17 -4.4732879184470137e-02 + 18 2.3916128102602216e-04 2.2268062502434974e-06 4.0890470745578923e-02 + 19 -2.0033386835566994e-03 5.0537162006743762e-18 -4.7626540891187855e-02 + 20 1.1360996878247132e-05 9.1814258501936069e-05 4.2488199556680040e-02 + 21 5.5317942397930972e-05 2.0466433588032032e-18 -4.4732879184470033e-02 + 22 2.3916128102602656e-04 2.2268062502461309e-06 4.0890470745578937e-02 + 23 -2.0033386835567038e-03 -4.0058358597583202e-17 -4.7626540891187820e-02 + 24 1.1360996878233309e-05 9.1814258501946586e-05 4.2488199556680414e-02 + 25 -1.6486800709624230e-04 -1.8127313551345855e-05 -1.0796056549805585e-03 + 26 9.7415698381275641e-04 -8.3284301802344016e-04 5.3751455194570915e-03 + 27 1.0178111270105904e-03 7.4102890414775549e-04 -6.3746876686657586e-04 + 28 -1.2956932174262685e-04 1.5902377077926376e-05 5.3232551286718586e-03 + 29 -1.6486800709624447e-04 -1.8127313551316636e-05 -1.0796056549805698e-03 + 30 9.7415698381273170e-04 -8.3284301802343886e-04 5.3751455194570958e-03 + 31 1.0178111270106190e-03 7.4102890414773901e-04 -6.3746876686670770e-04 + 32 -1.2956932174261818e-04 1.5902377077917892e-05 5.3232551286718872e-03 + 33 9.2654152308404886e-05 4.0850279627708816e-06 -1.6053564303655610e-03 + 34 -8.4466761317455313e-05 2.6270005211736469e-07 4.7609191024683460e-03 + 35 -9.2670469782459453e-05 4.0708409869095536e-06 -1.6053645864696963e-03 + 36 8.4450760061533046e-05 2.4678792568258345e-07 4.7609196893467782e-03 + 37 9.2654152308405103e-05 4.0850279628000907e-06 -1.6053564303655061e-03 + 38 -8.4466761317482635e-05 2.6270005213547426e-07 4.7609191024683400e-03 + 39 -9.2670469782453165e-05 4.0708409868783421e-06 -1.6053645864697198e-03 + 40 8.4450760061528275e-05 2.4678792566386402e-07 4.7609196893469690e-03 + 41 -1.0178163233209149e-03 7.4102846801620556e-04 -6.3745882808595152e-04 + 42 1.2958970254336804e-04 1.5886756456806513e-05 5.3232663025057810e-03 + 43 1.6488952088059271e-04 -1.8113562707041957e-05 -1.0795875600957813e-03 + 44 -9.7416136335758238e-04 -8.3284272651813762e-04 5.3751561064124811e-03 + 45 -1.0178163233209125e-03 7.4102846801622031e-04 -6.3745882808583789e-04 + 46 1.2958970254337579e-04 1.5886756456791148e-05 5.3232663025058772e-03 + 47 1.6488952088058748e-04 -1.8113562707049496e-05 -1.0795875600958203e-03 + 48 -9.7416136335759366e-04 -8.3284272651814803e-04 5.3751561064124855e-03 +run_vdwl: -1.3875037702379507 +run_coul: 0 +run_stress: ! |- + -1.0950798483072388e+00 -1.0965501776879543e+00 -5.5691866561084535e-01 -7.8353909283032197e-16 -7.5145250540648381e-15 -1.1949322419481606e-03 +run_forces: ! |2 + 1 2.0033030003525137e-03 8.9435705391029130e-10 -4.7625968392020532e-02 + 2 -1.1367384359795837e-05 9.1815719224718032e-05 4.2487909883465465e-02 + 3 -5.5282089115551557e-05 -2.6135646989168017e-09 -4.4732313434801885e-02 + 4 -2.3915909829547773e-04 2.2249799837368439e-06 4.0890200928313990e-02 + 5 2.0033030003524860e-03 8.9435706106602564e-10 -4.7625968392020428e-02 + 6 -1.1367384359823613e-05 9.1815719224701660e-05 4.2487909883465430e-02 + 7 -5.5282089115578446e-05 -2.6135647671131183e-09 -4.4732313434801836e-02 + 8 -2.3915909829547773e-04 2.2249799837172199e-06 4.0890200928314566e-02 + 9 -5.2020641072548406e-05 6.7005638625767475e-10 -4.4737290402994602e-02 + 10 -1.2511670468712049e-04 -4.3337535831548628e-06 4.1581350530843775e-02 + 11 5.1983012539478048e-05 6.7012239660759799e-10 -4.4737344911317957e-02 + 12 1.2512201515433533e-04 -4.3320284013805789e-06 4.1581381013272169e-02 + 13 -5.2020641072554044e-05 6.7005629369391428e-10 -4.4737290402994609e-02 + 14 -1.2511670468714348e-04 -4.3337535831713291e-06 4.1581350530843830e-02 + 15 5.1983012539505370e-05 6.7012235105247202e-10 -4.4737344911317853e-02 + 16 1.2512201515432167e-04 -4.3320284013572685e-06 4.1581381013272294e-02 + 17 5.5321930482132663e-05 -2.6135608037222913e-09 -4.4732367803430914e-02 + 18 2.3916115092586794e-04 2.2268497947506605e-06 4.0890218403155591e-02 + 19 -2.0033052131855867e-03 8.9429471662265853e-10 -4.7625968252325866e-02 + 20 1.1360021262163687e-05 9.1815863853997803e-05 4.2487896875878589e-02 + 21 5.5321930482154889e-05 -2.6135608655374853e-09 -4.4732367803430817e-02 + 22 2.3916115092584907e-04 2.2268497947312516e-06 4.0890218403155654e-02 + 23 -2.0033052131855616e-03 8.9429479706876566e-10 -4.7625968252325804e-02 + 24 1.1360021262174096e-05 9.1815863853997342e-05 4.2487896875878825e-02 + 25 -1.6486945106528091e-04 -1.8126101379958718e-05 -1.0797429438547676e-03 + 26 9.7414016722233848e-04 -8.3283489942476445e-04 5.3750161101709729e-03 + 27 1.0177937442917731e-03 7.4101905540415944e-04 -6.3761022896437550e-04 + 28 -1.2957001720401498e-04 1.5902818724243767e-05 5.3231291183569798e-03 + 29 -1.6486945106529950e-04 -1.8126101379940937e-05 -1.0797429438548231e-03 + 30 9.7414016722235670e-04 -8.3283489942476228e-04 5.3750161101709625e-03 + 31 1.0177937442917692e-03 7.4101905540416161e-04 -6.3761022896433907e-04 + 32 -1.2957001720399937e-04 1.5902818724231570e-05 5.3231291183569417e-03 + 33 9.2652190820307180e-05 4.0847599754035413e-06 -1.6054772616410785e-03 + 34 -8.4465929960344556e-05 2.6265700116475746e-07 4.7608118750052195e-03 + 35 -9.2668507953961839e-05 4.0705731901608693e-06 -1.6054854176848882e-03 + 36 8.4449929025630626e-05 2.4674500177709956e-07 4.7608124618308432e-03 + 37 9.2652190820296772e-05 4.0847599754594472e-06 -1.6054772616411949e-03 + 38 -8.4465929960378383e-05 2.6265700123594889e-07 4.7608118750052542e-03 + 39 -9.2668507953971814e-05 4.0705731901478047e-06 -1.6054854176848756e-03 + 40 8.4449929025618483e-05 2.4674500176496539e-07 4.7608124618310956e-03 + 41 -1.0177989405882203e-03 7.4101861929748436e-04 -6.3760029049130570e-04 + 42 1.2959039767826896e-04 1.5887198241880077e-05 5.3231402917910302e-03 + 43 1.6489096449514255e-04 -1.8112350701529705e-05 -1.0797248493375658e-03 + 44 -9.7414454676205060e-04 -8.3283460790769116e-04 5.3750266967793276e-03 + 45 -1.0177989405881721e-03 7.4101861929751580e-04 -6.3760029049122590e-04 + 46 1.2959039767822169e-04 1.5887198241890099e-05 5.3231402917910502e-03 + 47 1.6489096449514865e-04 -1.8112350701541984e-05 -1.0797248493375228e-03 + 48 -9.7414454676203553e-04 -8.3283460790775058e-04 5.3750266967792192e-03 +... diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml new file mode 100644 index 0000000000..dae0e501ca --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml @@ -0,0 +1,126 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 15 18:41:00 2021 +epsilon: 5e-12 +skip_tests: single +prerequisites: ! | + pair ilp/graphene/hbn + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on + comm_modify cutoff 16.0 +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay ilp/graphene/hbn 16.0 0 +pair_coeff: ! | + * * ilp/graphene/hbn BNCH.ILP B N C +extract: ! "" +natoms: 48 +init_vdwl: -1.743417069575419 +init_coul: 0 +init_stress: ! |- + -1.4159677678324094e+00 -1.4175957592828763e+00 -8.2079275196077894e-01 0.0 0.0 -1.2386435158561861e-03 +init_forces: ! |2 + 1 2.0850484065019883e-03 3.6862873864507151e-18 -5.0318618251118635e-02 + 2 -6.3446817540543932e-06 9.5024077809279612e-05 4.2760561141837801e-02 + 3 -4.9554482434026152e-05 -8.1315162936412833e-18 -4.7333694009245655e-02 + 4 -2.3873708476733480e-04 1.4944038076278483e-06 4.1104339963197040e-02 + 5 2.0850484065019900e-03 3.0357660829594124e-18 -5.0318618251118601e-02 + 6 -6.3446817540370459e-06 9.5024077809283949e-05 4.2760561141837863e-02 + 7 -4.9554482434004034e-05 -2.0003530082357557e-17 -4.7333694009245551e-02 + 8 -2.3873708476732872e-04 1.4944038076165726e-06 4.1104339963197123e-02 + 9 -5.1133673114476565e-05 -4.2825985813177425e-18 -4.7328374000982235e-02 + 10 -1.2855382161618828e-04 -3.5892733150040340e-06 4.1845863048816843e-02 + 11 5.1094314571888079e-05 -9.2394353886499081e-18 -4.7328430254607333e-02 + 12 1.2855900637380436e-04 -3.5874635791496971e-06 4.1845894619109855e-02 + 13 -5.1133673114468758e-05 5.4210108624275222e-20 -4.7328374000982200e-02 + 14 -1.2855382161621300e-04 -3.5892733149839627e-06 4.1845863048816802e-02 + 15 5.1094314571888079e-05 -1.8460236052460222e-17 -4.7328430254607312e-02 + 16 1.2855900637382496e-04 -3.5874635791107064e-06 4.1845894619109890e-02 + 17 4.9595925523595848e-05 -4.7802304378296440e-18 -4.7333750316999074e-02 + 18 2.3873932915433548e-04 1.4963296466885558e-06 4.1104357563481929e-02 + 19 -2.0850504910489491e-03 1.0522849122417783e-17 -5.0318618305247004e-02 + 20 6.3372526094387688e-06 9.5024193912500820e-05 4.2760547171829859e-02 + 21 4.9595925523599209e-05 1.0509561293057731e-18 -4.7333750316998997e-02 + 22 2.3873932915433646e-04 1.4963296466837175e-06 4.1104357563481873e-02 + 23 -2.0850504910489630e-03 -4.2831809164689798e-17 -5.0318618305246844e-02 + 24 6.3372526094248910e-06 9.5024193912522829e-05 4.2760547171829762e-02 + 25 -1.6288457344696859e-04 -1.8238152247257184e-05 9.5379191188832164e-05 + 26 1.0182995551939961e-03 -8.6641525713797730e-04 6.5970295316636436e-03 + 27 1.0604041695539059e-03 7.7139117932867849e-04 5.4135994220887943e-04 + 28 -1.2540699375438325e-04 1.6743748439636654e-05 6.5543328981639889e-03 + 29 -1.6288457344698247e-04 -1.8238152247225959e-05 9.5379191188821322e-05 + 30 1.0182995551939649e-03 -8.6641525713797123e-04 6.5970295316634528e-03 + 31 1.0604041695539443e-03 7.7139117932868467e-04 5.4135994220893408e-04 + 32 -1.2540699375435983e-04 1.6743748439636546e-05 6.5543328981640713e-03 + 33 9.3725416939480027e-05 3.9426681303011716e-06 -4.6805765375060782e-04 + 34 -8.5944868650094253e-05 -3.3863756950810271e-07 5.9498944235440096e-03 + 35 -9.3742626080580566e-05 3.9279108845123400e-06 -4.6806588898556445e-04 + 36 8.5927904006221408e-05 -3.5520455114131738e-07 5.9498948560586119e-03 + 37 9.3725416939479159e-05 3.9426681303317868e-06 -4.6805765375057583e-04 + 38 -8.5944868650128080e-05 -3.3863756950880066e-07 5.9498944235437754e-03 + 39 -9.3742626080576229e-05 3.9279108844955619e-06 -4.6806588898545658e-04 + 40 8.5927904006218372e-05 -3.5520455114406897e-07 5.9498948560586301e-03 + 41 -1.0604093518345942e-03 7.7139074370169154e-04 5.4137060014462714e-04 + 42 1.2542828980921278e-04 1.6727500981786547e-05 6.5543447221730429e-03 + 43 1.6290696486873053e-04 -1.8223830628457046e-05 9.5398084359375981e-05 + 44 -1.0183038866049599e-03 -8.6641493761418803e-04 6.5970409231580918e-03 + 45 -1.0604093518345931e-03 7.7139074370171051e-04 5.4137060014457867e-04 + 46 1.2542828980922080e-04 1.6727500981764446e-05 6.5543447221731157e-03 + 47 1.6290696486873449e-04 -1.8223830628478516e-05 9.5398084359388924e-05 + 48 -1.0183038866049608e-03 -8.6641493761419497e-04 6.5970409231580329e-03 +run_vdwl: -1.7434201284130086 +run_coul: 0 +run_stress: ! |- + -1.4159735399871292e+00 -1.4176014949571309e+00 -8.2080149187142926e-01 -2.1449500026615373e-16 -1.7714821647888020e-15 -1.2386484789055200e-03 +run_forces: ! |2 + 1 2.0850117908114097e-03 1.0161463491389217e-09 -5.0317981439628325e-02 + 2 -6.3437194577726987e-06 9.5025701239061859e-05 4.2760248404172425e-02 + 3 -4.9558828649647491e-05 -2.8627617254290035e-09 -4.7333123186150738e-02 + 4 -2.3873691985811830e-04 1.4944553106552229e-06 4.1104081968794406e-02 + 5 2.0850117908114453e-03 1.0161464421634681e-09 -5.0317981439628387e-02 + 6 -6.3437194577657598e-06 9.5025701239022950e-05 4.2760248404172314e-02 + 7 -4.9558828649683053e-05 -2.8627618450165031e-09 -4.7333123186150801e-02 + 8 -2.3873691985809662e-04 1.4944553106461156e-06 4.1104081968794330e-02 + 9 -5.1133422593300278e-05 7.5547760714921204e-10 -4.7327803360874096e-02 + 10 -1.2855412188890643e-04 -3.5895010384140685e-06 4.1845576403891582e-02 + 11 5.1094064803271807e-05 7.5555079194951369e-10 -4.7327859613308917e-02 + 12 1.2855930662305235e-04 -3.5876912710547494e-06 4.1845607973177879e-02 + 13 -5.1133422593287268e-05 7.5547762723405729e-10 -4.7327803360874242e-02 + 14 -1.2855412188890339e-04 -3.5895010383977919e-06 4.1845576403891596e-02 + 15 5.1094064803272566e-05 7.5555075467328774e-10 -4.7327859613308966e-02 + 16 1.2855930662306232e-04 -3.5876912710024113e-06 4.1845607973177948e-02 + 17 4.9600271065325580e-05 -2.8627573902157001e-09 -4.7333179492726606e-02 + 18 2.3873916427060956e-04 1.4963811844738990e-06 4.1104099568595440e-02 + 19 -2.0850138754365875e-03 1.0160778065162400e-09 -5.0317981493768628e-02 + 20 6.3362903110811795e-06 9.5025817345494392e-05 4.2760234434687100e-02 + 21 4.9600271065314522e-05 -2.8627574752175739e-09 -4.7333179492726564e-02 + 22 2.3873916427059666e-04 1.4963811844658860e-06 4.1104099568595440e-02 + 23 -2.0850138754366235e-03 1.0160777921810544e-09 -5.0317981493768635e-02 + 24 6.3362903110742406e-06 9.5025817345493959e-05 4.2760234434687017e-02 + 25 -1.6288606984034650e-04 -1.8236722175475704e-05 9.5216967993063707e-05 + 26 1.0182812312861281e-03 -8.6640626373293709e-04 6.5968711299294047e-03 + 27 1.0603851126650126e-03 7.7138037180120864e-04 5.4119317677753243e-04 + 28 -1.2540771098643044e-04 1.6744137902604281e-05 6.5541778235511557e-03 + 29 -1.6288606984038928e-04 -1.8236722175416289e-05 9.5216967993082789e-05 + 30 1.0182812312861922e-03 -8.6640626373294402e-04 6.5968711299294082e-03 + 31 1.0603851126649892e-03 7.7138037180129147e-04 5.4119317677749253e-04 + 32 -1.2540771098645993e-04 1.6744137902621953e-05 6.5541778235512944e-03 + 33 9.3723257649716975e-05 3.9423316345507744e-06 -4.6820173818218168e-04 + 34 -8.5943962571135429e-05 -3.3866278074822816e-07 5.9497600753296263e-03 + 35 -9.3740466418232955e-05 3.9275746001192263e-06 -4.6820997335027752e-04 + 36 8.5926998277192305e-05 -3.5522961929919531e-07 5.9497605077923395e-03 + 37 9.3723257649690628e-05 3.9423316345445131e-06 -4.6820173818211392e-04 + 38 -8.5943962571131960e-05 -3.3866278074772671e-07 5.9497600753297061e-03 + 39 -9.3740466418205850e-05 3.9275746001722167e-06 -4.6820997335035645e-04 + 40 8.5926998277160646e-05 -3.5522961930283416e-07 5.9497605077923222e-03 + 41 -1.0603902949286239e-03 7.7137993620434483e-04 5.4120383437409529e-04 + 42 1.2542900668491156e-04 1.6727890598687433e-05 6.5541896471255070e-03 + 43 1.6290846087229721e-04 -1.8222400738173032e-05 9.5235860757960438e-05 + 44 -1.0182855626908293e-03 -8.6640594419860580e-04 6.5968825210400628e-03 + 45 -1.0603902949286009e-03 7.7137993620434917e-04 5.4120383437400075e-04 + 46 1.2542900668490961e-04 1.6727890598721233e-05 6.5541896471255886e-03 + 47 1.6290846087231749e-04 -1.8222400738211376e-05 9.5235860757975237e-05 + 48 -1.0182855626908007e-03 -8.6640594419857295e-04 6.5968825210402865e-03 +... diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml new file mode 100644 index 0000000000..42d31227d9 --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml @@ -0,0 +1,126 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 15 19:01:13 2021 +epsilon: 5e-12 +skip_tests: single +prerequisites: ! | + pair kolmogorov/crespi/full + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on + comm_modify cutoff 16.0 +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay kolmogorov/crespi/full 16.0 1 +pair_coeff: ! | + * * kolmogorov/crespi/full CH_taper.KC C C C +extract: ! "" +natoms: 48 +init_vdwl: -1.2500397419624312 +init_coul: 0 +init_stress: ! |- + -1.0004429195951223e+00 -1.0032930381066463e+00 4.3070815061895146e-01 0.0 0.0 -1.7133324489474716e-02 +init_forces: ! |2 + 1 2.8687289997477317e-03 -7.8062556418956319e-18 3.6613830361686965e-02 + 2 1.3226962450822509e-03 1.2611200091842689e-03 -6.4703224388507563e-02 + 3 -3.4774444393605684e-04 -1.3010426069826053e-17 3.8050724789394384e-02 + 4 -3.4400661847007637e-04 3.0925839103697773e-05 -6.5875665183461635e-02 + 5 2.8687289997477005e-03 -1.5612511283791264e-17 3.6613830361687000e-02 + 6 1.3226962450822808e-03 1.2611200091843045e-03 -6.4703224388507549e-02 + 7 -3.4774444393598919e-04 -5.2150124496552763e-17 3.8050724789394412e-02 + 8 -3.4400661847007550e-04 3.0925839103693002e-05 -6.5875665183461662e-02 + 9 -1.2644907900887740e-04 -8.1315162936412833e-18 3.8649557617062728e-02 + 10 -1.1324543171146572e-04 -5.6284413155996182e-06 -6.5027903599930381e-02 + 11 1.2639947077019444e-04 -2.2215980140585789e-17 3.8649533308935571e-02 + 12 1.1322659571519420e-04 -5.6051326608156769e-06 -6.5027878367048986e-02 + 13 -1.2644907900885008e-04 2.3256136599814070e-17 3.8649557617062749e-02 + 14 -1.1324543171150085e-04 -5.6284413155611291e-06 -6.5027903599930395e-02 + 15 1.2639947077014381e-04 -7.0749273952362690e-17 3.8649533308935564e-02 + 16 1.1322659571522879e-04 -5.6051326608175471e-06 -6.5027878367048930e-02 + 17 3.4780347512676035e-04 3.1573153108904045e-19 3.8050688506524509e-02 + 18 3.4403466466237793e-04 3.0949865189355873e-05 -6.5875656847228403e-02 + 19 -2.8687384226996960e-03 1.2450087305437732e-17 3.6613818386944344e-02 + 20 -1.3227054552782821e-03 1.2611207266151373e-03 -6.4703241285155699e-02 + 21 3.4780347512675867e-04 2.4633623930286376e-17 3.8050688506524544e-02 + 22 3.4403466466237533e-04 3.0949865189391902e-05 -6.5875656847228389e-02 + 23 -2.8687384226997285e-03 -1.2114236094873442e-16 3.6613818386944393e-02 + 24 -1.3227054552782968e-03 1.2611207266151575e-03 -6.4703241285155685e-02 + 25 -3.4774444393599700e-04 -9.2157184661267877e-18 -3.8050724789394322e-02 + 26 1.3226962450822511e-03 -1.2611200091842659e-03 6.4703224388507466e-02 + 27 2.8687289997476766e-03 -2.1250362580715887e-17 -3.6613830361686889e-02 + 28 -3.4400661847007550e-04 -3.0925839103686985e-05 6.5875665183461676e-02 + 29 -3.4774444393599092e-04 3.0357660829594124e-17 -3.8050724789394301e-02 + 30 1.3226962450822149e-03 -1.2611200091842295e-03 6.4703224388507424e-02 + 31 2.8687289997477408e-03 -3.0791341698588326e-17 -3.6613830361686910e-02 + 32 -3.4400661847004514e-04 -3.0925839103694330e-05 6.5875665183461649e-02 + 33 1.2639947077014197e-04 1.9363173174233306e-17 -3.8649533308935488e-02 + 34 -1.1324543171148133e-04 5.6284413156027252e-06 6.5027903599930423e-02 + 35 -1.2644907900888000e-04 -9.8391347153059527e-18 -3.8649557617062437e-02 + 36 1.1322659571522738e-04 5.6051326608073988e-06 6.5027878367048986e-02 + 37 1.2639947077014413e-04 4.6109085516735093e-17 -3.8649533308935564e-02 + 38 -1.1324543171150865e-04 5.6284413156129404e-06 6.5027903599930312e-02 + 39 -1.2644907900887783e-04 -5.0401848493419887e-17 -3.8649557617062492e-02 + 40 1.1322659571519420e-04 5.6051326607950474e-06 6.5027878367048930e-02 + 41 -2.8687384226997710e-03 4.7556214837339464e-17 -3.6613818386944108e-02 + 42 3.4403466466238080e-04 -3.0949865189344834e-05 6.5875656847228375e-02 + 43 3.4780347512678995e-04 2.7966275061258421e-17 -3.8050688506524606e-02 + 44 -1.3227054552783079e-03 -1.2611207266151391e-03 6.4703241285155699e-02 + 45 -2.8687384226997693e-03 3.0234814582462649e-17 -3.6613818386944066e-02 + 46 3.4403466466241371e-04 -3.0949865189357960e-05 6.5875656847228403e-02 + 47 3.4780347512675510e-04 -4.1431557823760033e-17 -3.8050688506524565e-02 + 48 -1.3227054552782990e-03 -1.2611207266151820e-03 6.4703241285155616e-02 +run_vdwl: -1.250048655581655 +run_coul: 0 +run_stress: ! |- + -1.0004370065912216e+00 -1.0032870501278353e+00 4.3059909389948547e-01 -3.0512762156502117e-16 1.4810330715847770e-15 -1.7133053394138682e-02 +run_forces: ! |2 + 1 2.8687040337510585e-03 -2.1727982419360303e-08 3.6613767230361242e-02 + 2 1.3226761216838419e-03 1.2611192610103965e-03 -6.4700278384581700e-02 + 3 -3.4774048959829596e-04 -6.5329695842506266e-09 3.8050693623452148e-02 + 4 -3.4399690449135600e-04 3.0931288630288282e-05 -6.5872679966618428e-02 + 5 2.8687040337509414e-03 -2.1727982416324537e-08 3.6613767230361215e-02 + 6 1.3226761216838328e-03 1.2611192610103637e-03 -6.4700278384581755e-02 + 7 -3.4774048959831157e-04 -6.5329697417852023e-09 3.8050693623452293e-02 + 8 -3.4399690449132131e-04 3.0931288630341516e-05 -6.5872679966618358e-02 + 9 -1.2644870195377845e-04 -9.8156702533244537e-11 3.8649526065561227e-02 + 10 -1.1324486560407342e-04 -5.6284938931148765e-06 -6.5024950822206537e-02 + 11 1.2639909409585960e-04 -9.8445711624968110e-11 3.8649501756815911e-02 + 12 1.1322602979076438e-04 -5.6051853390437709e-06 -6.5024925590218899e-02 + 13 -1.2644870195375113e-04 -9.8156632886807482e-11 3.8649526065561317e-02 + 14 -1.1324486560405911e-04 -5.6284938930792740e-06 -6.5024950822206565e-02 + 15 1.2639909409583455e-04 -9.8445744733791953e-11 3.8649501756815870e-02 + 16 1.1322602979075462e-04 -5.6051853390539302e-06 -6.5024925590218899e-02 + 17 3.4779952031141985e-04 -6.5333858894565295e-09 3.8050657339932729e-02 + 18 3.4402495029270961e-04 3.0955314710129699e-05 -6.5872671630637689e-02 + 19 -2.8687134566054494e-03 -2.1728110080698652e-08 3.6613755255587549e-02 + 20 -1.3226853316725558e-03 1.2611199785361846e-03 -6.4700295280588876e-02 + 21 3.4779952031157007e-04 -6.5333859204723350e-09 3.8050657339932889e-02 + 22 3.4402495029267491e-04 3.0955314710011826e-05 -6.5872671630637619e-02 + 23 -2.8687134566054233e-03 -2.1728109989627787e-08 3.6613755255587500e-02 + 24 -1.3226853316725203e-03 1.2611199785360946e-03 -6.4700295280588946e-02 + 25 -3.4774026620067611e-04 5.4788299566664936e-09 -3.8050694958508775e-02 + 26 1.3226758258096682e-03 -1.2611202352806649e-03 6.4700279759489457e-02 + 27 2.8687023920407370e-03 2.3305742741057400e-08 -3.6613767021966469e-02 + 28 -3.4399811208785710e-04 -3.0930750484966575e-05 6.5872680514205861e-02 + 29 -3.4774026620052866e-04 5.4788301344756499e-09 -3.8050694958508983e-02 + 30 1.3226758258096626e-03 -1.2611202352806358e-03 6.4700279759489457e-02 + 31 2.8687023920407314e-03 2.3305742749297337e-08 -3.6613767021966427e-02 + 32 -3.4399811208790654e-04 -3.0930750484980141e-05 6.5872680514205958e-02 + 33 1.2639885814274838e-04 1.7430860588435232e-10 -3.8649502722412493e-02 + 34 -1.1324494267667476e-04 5.6283305711724153e-06 6.5024950991958153e-02 + 35 -1.2644846597469278e-04 1.7397032093721936e-10 -3.8649527031188770e-02 + 36 1.1322610689165884e-04 5.6050219889952428e-06 6.5024925759978203e-02 + 37 1.2639885814283360e-04 1.7430877254486095e-10 -3.8649502722412549e-02 + 38 -1.1324494267669341e-04 5.6283305709431489e-06 6.5024950991958139e-02 + 39 -1.2644846597468064e-04 1.7397049817716951e-10 -3.8649527031188825e-02 + 40 1.1322610689166047e-04 5.6050219889600113e-06 6.5024925759978369e-02 + 41 -2.8687118148861238e-03 2.3305846951219172e-08 -3.6613755047197015e-02 + 42 3.4402615788549601e-04 -3.0954776578351879e-05 6.5872672178240693e-02 + 43 3.4779929687850922e-04 5.4792724940850910e-09 -3.8050658674962379e-02 + 44 -1.3226850358229400e-03 -1.2611209527917432e-03 6.4700296655504905e-02 + 45 -2.8687118148861242e-03 2.3305846874457658e-08 -3.6613755047197084e-02 + 46 3.4402615788544478e-04 -3.0954776578295039e-05 6.5872672178240735e-02 + 47 3.4779929687843897e-04 5.4792724213126788e-09 -3.8050658674962212e-02 + 48 -1.3226850358228897e-03 -1.2611209527918239e-03 6.4700296655504780e-02 +... diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml new file mode 100644 index 0000000000..e2e95b8c9b --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml @@ -0,0 +1,126 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Sun Aug 15 19:06:34 2021 +epsilon: 5e-12 +skip_tests: single +prerequisites: ! | + pair kolmogorov/crespi/full + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on + comm_modify cutoff 16.0 +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay kolmogorov/crespi/full 16.0 0 +pair_coeff: ! | + * * kolmogorov/crespi/full CH.KC C C C +extract: ! "" +natoms: 48 +init_vdwl: -1.2319861234762621 +init_coul: 0 +init_stress: ! |- + -1.1008420461559216e+00 -1.1059574121005133e+00 1.9501897055379741e-01 0.0 0.0 -1.5182584087439038e-02 +init_forces: ! |2 + 1 2.7578315641555162e-03 -3.0357660829594124e-18 4.1533172062176493e-02 + 2 1.2588944124766973e-03 1.1188632453424979e-03 -6.5272327121384435e-02 + 3 -2.7478683204608390e-04 -8.0230960763927328e-18 4.2197936430518210e-02 + 4 -2.9454797299274370e-04 2.5016995713589751e-05 -6.6888523602123898e-02 + 5 2.7578315641554889e-03 -1.5178830414797062e-17 4.1533172062176521e-02 + 6 1.2588944124767164e-03 1.1188632453425370e-03 -6.5272327121384408e-02 + 7 -2.7478683204601537e-04 -5.8221656662471588e-17 4.2197936430518279e-02 + 8 -2.9454797299274544e-04 2.5016995713579072e-05 -6.6888523602123925e-02 + 9 -9.9550461818177349e-05 -4.5672016515951874e-18 4.2881244934310968e-02 + 10 -8.9376686817712898e-05 -3.9953386427702976e-06 -6.5900411970681708e-02 + 11 9.9502582131880363e-05 -1.8143445730187113e-17 4.2881235234728650e-02 + 12 8.9358399770402756e-05 -3.9749130157838919e-06 -6.5900379165394929e-02 + 13 -9.9550461818153496e-05 2.3418766925686896e-17 4.2881244934310996e-02 + 14 -8.9376686817732847e-05 -3.9953386427169006e-06 -6.5900411970681708e-02 + 15 9.9502582131827562e-05 -7.7708496647004022e-17 4.2881235234728796e-02 + 16 8.9358399770424440e-05 -3.9749130157734564e-06 -6.5900379165394957e-02 + 17 2.7484214272895964e-04 -4.4452289071905682e-18 4.2197913495242940e-02 + 18 2.9457391733397659e-04 2.5037988057733265e-05 -6.6888509865507970e-02 + 19 -2.7578389951520565e-03 1.2809996898682004e-17 4.1533158826483590e-02 + 20 -1.2589020697706256e-03 1.1188638120596694e-03 -6.5272346190055328e-02 + 21 2.7484214272896311e-04 2.3479753297889205e-17 4.2197913495243079e-02 + 22 2.9457391733397653e-04 2.5037988057775138e-05 -6.6888509865507970e-02 + 23 -2.7578389951520709e-03 -1.2185643619304939e-16 4.1533158826483604e-02 + 24 -1.2589020697706512e-03 1.1188638120596733e-03 -6.5272346190055328e-02 + 25 -2.7478683204603272e-04 -1.2468324983583301e-18 -4.2197936430518238e-02 + 26 1.2588944124767121e-03 -1.1188632453425023e-03 6.5272327121384421e-02 + 27 2.7578315641554356e-03 -2.6020852139652106e-17 -4.1533172062176479e-02 + 28 -2.9454797299273850e-04 -2.5016995713583283e-05 6.6888523602123814e-02 + 29 -2.7478683204602925e-04 3.7892865928368380e-17 -4.2197936430518307e-02 + 30 1.2588944124766739e-03 -1.1188632453424724e-03 6.5272327121384463e-02 + 31 2.7578315641555275e-03 -4.0115480381963664e-17 -4.1533172062176452e-02 + 32 -2.9454797299271942e-04 -2.5016995713586458e-05 6.6888523602123898e-02 + 33 9.9502582131834392e-05 -3.7269449679189215e-20 -4.2881235234728567e-02 + 34 -8.9376686817722005e-05 3.9953386427603932e-06 6.5900411970681694e-02 + 35 -9.9550461818180818e-05 -1.3674499900473425e-17 -4.2881244934310996e-02 + 36 8.9358399770429102e-05 3.9749130157800633e-06 6.5900379165395040e-02 + 37 9.9502582131827453e-05 5.1780818131549888e-17 -4.2881235234728608e-02 + 38 -8.9376686817744123e-05 3.9953386427840043e-06 6.5900411970681763e-02 + 39 -9.9550461818177349e-05 -5.0740661672321608e-17 -4.2881244934311093e-02 + 40 8.9358399770403624e-05 3.9749130157660754e-06 6.5900379165395012e-02 + 41 -2.7578389951520938e-03 4.5756190415085270e-17 -4.1533158826483570e-02 + 42 2.9457391733397973e-04 -2.5037988057731659e-05 6.6888509865507983e-02 + 43 2.7484214272898382e-04 2.2246473326686944e-17 -4.2197913495242927e-02 + 44 -1.2589020697706568e-03 -1.1188638120596731e-03 6.5272346190055355e-02 + 45 -2.7578389951520886e-03 4.0782412948808019e-17 -4.1533158826483549e-02 + 46 2.9457391733400050e-04 -2.5037988057726919e-05 6.6888509865508053e-02 + 47 2.7484214272895785e-04 -3.1658915194813543e-17 -4.2197913495243017e-02 + 48 -1.2589020697706581e-03 -1.1188638120597041e-03 6.5272346190055328e-02 +run_vdwl: -1.23199571764252 +run_coul: 0 +run_stress: ! |- + -1.1008368563459114e+00 -1.1059521765455493e+00 1.9490358494782456e-01 -4.4881817801889771e-16 -1.4762912608595250e-15 -1.5182325192586004e-02 +run_forces: ! |2 + 1 2.7578115049012742e-03 -1.9626239461520076e-08 4.1533149398200540e-02 + 2 1.2588780003755895e-03 1.1188632817004094e-03 -6.5269251575709356e-02 + 3 -2.7478278369621328e-04 -8.0919896562527821e-09 4.2197938643984578e-02 + 4 -2.9453830408723066e-04 2.5020943380932455e-05 -6.6885376194640786e-02 + 5 2.7578115049012399e-03 -1.9626239401238435e-08 4.1533149398200533e-02 + 6 1.2588780003755804e-03 1.1188632817005241e-03 -6.5269251575709369e-02 + 7 -2.7478278369620027e-04 -8.0919897266175031e-09 4.2197938643984703e-02 + 8 -2.9453830408726275e-04 2.5020943380984985e-05 -6.6885376194640717e-02 + 9 -9.9547742435301782e-05 5.3780414950783170e-10 4.2881247142594836e-02 + 10 -8.9376031411733843e-05 -3.9945836714521966e-06 -6.5897312884941883e-02 + 11 9.9499863028555701e-05 5.3758629572208002e-10 4.2881237442533686e-02 + 12 8.9357744478893550e-05 -3.9741580967872346e-06 -6.5897280081132562e-02 + 13 -9.9547742435326502e-05 5.3780415244873009e-10 4.2881247142594815e-02 + 14 -8.9376031411742083e-05 -3.9945836714029874e-06 -6.5897312884941855e-02 + 15 9.9499863028584324e-05 5.3758624475780164e-10 4.2881237442533790e-02 + 16 8.9357744478909922e-05 -3.9741580967885712e-06 -6.5897280081132506e-02 + 17 2.7483809396297375e-04 -8.0923733428147151e-09 4.2197915708206225e-02 + 18 2.9456424811194113e-04 2.5041935720938094e-05 -6.6885362458577291e-02 + 19 -2.7578189357608937e-03 -1.9626405105166717e-08 4.1533136162484115e-02 + 20 -1.2588856574676647e-03 1.1188638484657578e-03 -6.5269270643456764e-02 + 21 2.7483809396295635e-04 -8.0923732598465674e-09 4.2197915708206198e-02 + 22 2.9456424811196807e-04 2.5041935720825544e-05 -6.6885362458577347e-02 + 23 -2.7578189357608239e-03 -1.9626405201000025e-08 4.1533136162484163e-02 + 24 -1.2588856574676222e-03 1.1188638484657888e-03 -6.5269270643456764e-02 + 25 -2.7478267042781689e-04 7.1340099726084627e-09 -4.2197938717095443e-02 + 26 1.2588775889140107e-03 -1.1188640762445925e-03 6.5269251688086116e-02 + 27 2.7578100488037834e-03 2.0885614337388253e-08 -4.1533148778323065e-02 + 28 -2.9453931478136321e-04 -2.5020438627362798e-05 6.6885376801770646e-02 + 29 -2.7478267042784551e-04 7.1340098782286636e-09 -4.2197938717095346e-02 + 30 1.2588775889140823e-03 -1.1188640762446068e-03 6.5269251688086075e-02 + 31 2.7578100488038111e-03 2.0885614449061077e-08 -4.1533148778323238e-02 + 32 -2.9453931478134934e-04 -2.5020438627452736e-05 6.6885376801770674e-02 + 33 9.9499775923898881e-05 -4.3747681398428797e-10 -4.2881238156016258e-02 + 34 -8.9376188707950260e-05 3.9944719903915248e-06 6.5897312332129893e-02 + 35 -9.9547655306991140e-05 -4.3773580745386231e-10 -4.2881247856090716e-02 + 36 8.9357901801402086e-05 3.9740463921778550e-06 6.5897279528304625e-02 + 37 9.9499775923880232e-05 -4.3747670817970846e-10 -4.2881238156016264e-02 + 38 -8.9376188707982352e-05 3.9944719903545984e-06 6.5897312332129851e-02 + 39 -9.9547655306996777e-05 -4.3773581847206689e-10 -4.2881247856090876e-02 + 40 8.9357901801374873e-05 3.9740463922260334e-06 6.5897279528304431e-02 + 41 -2.7578174796584810e-03 2.0885758518950235e-08 -4.1533135542592893e-02 + 42 2.9456525880115910e-04 -2.5041430978732462e-05 6.6885363065714659e-02 + 43 2.7483798066595783e-04 7.1344129854552851e-09 -4.2197915781289633e-02 + 44 -1.2588852460277825e-03 -1.1188646429977976e-03 6.5269270755856881e-02 + 45 -2.7578174796584042e-03 2.0885758549338389e-08 -4.1533135542592900e-02 + 46 2.9456525880111129e-04 -2.5041430978583333e-05 6.6885363065714618e-02 + 47 2.7483798066597242e-04 7.1344129112194118e-09 -4.2197915781289751e-02 + 48 -1.2588852460277678e-03 -1.1188646429978574e-03 6.5269270755856937e-02 +... From 6f46ac57b937bd4ee7f0f2bdd6388eee315749aa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Aug 2021 13:50:43 -0400 Subject: [PATCH 285/352] plug small memory leak in pppm/gpu --- src/GPU/pppm_gpu.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/GPU/pppm_gpu.cpp b/src/GPU/pppm_gpu.cpp index b98b105045..8e3ec2ace8 100644 --- a/src/GPU/pppm_gpu.cpp +++ b/src/GPU/pppm_gpu.cpp @@ -106,6 +106,8 @@ PPPMGPU::PPPMGPU(LAMMPS *lmp) : PPPM(lmp) PPPMGPU::~PPPMGPU() { PPPM_GPU_API(clear)(poisson_time); + destroy_3d_offset(density_brick_gpu,nzlo_out,nylo_out); + destroy_3d_offset(vd_brick,nzlo_out,nylo_out); } /* ---------------------------------------------------------------------- From 56a74bbe3dd9820797cba7a94e517ae4e61e3fb2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Aug 2021 15:21:38 -0400 Subject: [PATCH 286/352] refactor file reader code --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 180 +++++++++-------------- src/INTERLAYER/pair_ilp_graphene_hbn.h | 2 + 2 files changed, 75 insertions(+), 107 deletions(-) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 3aa5ae7bf5..2e424539b4 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -33,6 +33,8 @@ #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" +#include "potential_file_reader.h" +#include "tokenizer.h" #include #include @@ -183,138 +185,103 @@ double PairILPGrapheneHBN::init_one(int i, int j) void PairILPGrapheneHBN::read_file(char *filename) { - int params_per_line = 13; - char **words = new char*[params_per_line+1]; memory->sfree(params); params = nullptr; nparams = maxparam = 0; // open file on proc 0 - FILE *fp; if (comm->me == 0) { - fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) - error->one(FLERR,"Cannot open ILP potential file {}: {}",filename,utils::getsyserror()); - } + PotentialFileReader reader(lmp, filename, "ilp/graphene/hbn", unit_convert_flag); + char *line; - // read each line out of file, skipping blank lines or leading '#' - // store line of params if all 3 element tags are in element list + while ((line = reader.next_line(NPARAMS_PER_LINE))) { - int i,j,n,m,nwords,ielement,jelement; - char line[MAXLINE],*ptr; - int eof = 0; + try { + ValueTokenizer values(line); - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); + std::string iname = values.next_string(); + std::string jname = values.next_string(); - // strip comment, skip line if blank + // ielement,jelement = 1st args + // if both args are in element list, then parse this line + // else skip to next entry in file + int ielement, jelement; - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + for (ielement = 0; ielement < nelements; ielement++) + if (iname == elements[ielement]) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (jname == elements[jelement]) break; + if (jelement == nelements) continue; - // concatenate additional lines until have params_per_line words + // expand storage, if needed - while (nwords < params_per_line) { - n = strlen(line); - if (comm->me == 0) { - ptr = fgets(&line[n],MAXLINE-n,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + + // make certain all addional allocated storage is initialized + // to avoid false positives when checking with valgrind + + memset(params + nparams, 0, DELTA*sizeof(Param)); + } + + // load up parameter settings and error check their values + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].z0 = values.next_double(); + params[nparams].alpha = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].epsilon = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].d = values.next_double(); + params[nparams].sR = values.next_double(); + params[nparams].reff = values.next_double(); + params[nparams].C6 = values.next_double(); + // S provides a convenient scaling of all energies + params[nparams].S = values.next_double(); + params[nparams].rcut = values.next_double(); + + } catch (TokenizerException &e) { + error->one(FLERR, e.what()); } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); + + // energies in meV further scaled by S + // S = 43.3634 meV = 1 kcal/mol + const double meV = 1e-3*params[nparams].S; + params[nparams].C *= meV; + params[nparams].C6 *= meV; + params[nparams].epsilon *= meV; + + // precompute some quantities + params[nparams].delta2inv = pow(params[nparams].delta,-2.0); + params[nparams].lambda = params[nparams].alpha/params[nparams].z0; + params[nparams].seff = params[nparams].sR * params[nparams].reff; + + nparams++; } - if (nwords != params_per_line) - error->all(FLERR,"Insufficient format in ILP potential file"); + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - // words = ptrs to all words in line - - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; - - // ielement,jelement = 1st args - // if these 2 args are in element list, then parse this line - // else skip to next line (continue) - - for (ielement = 0; ielement < nelements; ielement++) - if (strcmp(words[0],elements[ielement]) == 0) break; - if (ielement == nelements) continue; - for (jelement = 0; jelement < nelements; jelement++) - if (strcmp(words[1],elements[jelement]) == 0) break; - if (jelement == nelements) continue; - - // load up parameter settings and error check their values - - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); - - // make certain all addional allocated storage is initialized - // to avoid false positives when checking with valgrind - - memset(params + nparams, 0, DELTA*sizeof(Param)); + if (comm->me != 0) { + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); } - params[nparams].ielement = ielement; - params[nparams].jelement = jelement; - params[nparams].z0 = atof(words[2]); - params[nparams].alpha = atof(words[3]); - params[nparams].delta = atof(words[4]); - params[nparams].epsilon = atof(words[5]); - params[nparams].C = atof(words[6]); - params[nparams].d = atof(words[7]); - params[nparams].sR = atof(words[8]); - params[nparams].reff = atof(words[9]); - params[nparams].C6 = atof(words[10]); - // S provides a convenient scaling of all energies - params[nparams].S = atof(words[11]); - params[nparams].rcut = atof(words[12]); - - // energies in meV further scaled by S - // S = 43.3634 meV = 1 kcal/mol - double meV = 1e-3*params[nparams].S; - params[nparams].C *= meV; - params[nparams].C6 *= meV; - params[nparams].epsilon *= meV; - - // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2.0); - params[nparams].lambda = params[nparams].alpha/params[nparams].z0; - params[nparams].seff = params[nparams].sR * params[nparams].reff; - - nparams++; + MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); memory->destroy(cutILPsq); memory->create(elem2param,nelements,nelements,"pair:elem2param"); memory->create(cutILPsq,nelements,nelements,"pair:cutILPsq"); - for (i = 0; i < nelements; i++) { - for (j = 0; j < nelements; j++) { - n = -1; - for (m = 0; m < nparams; m++) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + int n = -1; + for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR,"ILP Potential file has duplicate entry"); n = m; } } @@ -323,7 +290,6 @@ void PairILPGrapheneHBN::read_file(char *filename) cutILPsq[i][j] = params[n].rcut*params[n].rcut; } } - delete [] words; } /* ---------------------------------------------------------------------- diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.h b/src/INTERLAYER/pair_ilp_graphene_hbn.h index 952d6edb9b..5cae119905 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.h +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.h @@ -40,6 +40,8 @@ class PairILPGrapheneHBN : public Pair { void calc_FvdW(int, int); double single(int, int, int, int, double, double, double, double &); + static constexpr int NPARAMS_PER_LINE = 13; + protected: int me; int maxlocal; // size of numneigh, firstneigh arrays From 9e559de601a0a666482c3e2b62f45bc55b863339 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Aug 2021 15:21:51 -0400 Subject: [PATCH 287/352] pretty --- src/MANYBODY/pair_sw.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/MANYBODY/pair_sw.cpp b/src/MANYBODY/pair_sw.cpp index 75ece1dc71..fcdda9ef9e 100644 --- a/src/MANYBODY/pair_sw.cpp +++ b/src/MANYBODY/pair_sw.cpp @@ -293,7 +293,7 @@ void PairSW::read_file(char *file) if (comm->me == 0) { PotentialFileReader reader(lmp, file, "sw", unit_convert_flag); - char * line; + char *line; // transparently convert units for supported conversions @@ -328,8 +328,7 @@ void PairSW::read_file(char *file) if (nparams == maxparam) { maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param),"pair:params"); // make certain all addional allocated storage is initialized // to avoid false positives when checking with valgrind From 436d200a9abf85e0525ea098b41bbc2d8aba96ac Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 16 Aug 2021 15:29:43 -0400 Subject: [PATCH 288/352] refactor file reader code --- .../pair_kolmogorov_crespi_full.cpp | 180 +++++++----------- src/INTERLAYER/pair_kolmogorov_crespi_full.h | 1 + 2 files changed, 74 insertions(+), 107 deletions(-) diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index 21ef996a3c..8387703025 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -33,6 +33,8 @@ #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" +#include "potential_file_reader.h" +#include "tokenizer.h" #include #include @@ -183,138 +185,103 @@ double PairKolmogorovCrespiFull::init_one(int i, int j) void PairKolmogorovCrespiFull::read_file(char *filename) { - int params_per_line = 12; - char **words = new char*[params_per_line+1]; memory->sfree(params); params = nullptr; nparams = maxparam = 0; // open file on proc 0 - FILE *fp; if (comm->me == 0) { - fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) - error->one(FLERR,"Cannot open KC potential file {}: {}",filename,utils::getsyserror()); - } + PotentialFileReader reader(lmp, filename, "kolmogorov/crespi/full", unit_convert_flag); + char *line; - // read each line out of file, skipping blank lines or leading '#' - // store line of params if all 3 element tags are in element list + while ((line = reader.next_line(NPARAMS_PER_LINE))) { - int i,j,n,m,nwords,ielement,jelement; - char line[MAXLINE],*ptr; - int eof = 0; + try { + ValueTokenizer values(line); - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); + std::string iname = values.next_string(); + std::string jname = values.next_string(); - // strip comment, skip line if blank + // ielement,jelement = 1st args + // if both args are in element list, then parse this line + // else skip to next entry in file + int ielement, jelement; - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + for (ielement = 0; ielement < nelements; ielement++) + if (iname == elements[ielement]) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (jname == elements[jelement]) break; + if (jelement == nelements) continue; - // concatenate additional lines until have params_per_line words + // expand storage, if needed - while (nwords < params_per_line) { - n = strlen(line); - if (comm->me == 0) { - ptr = fgets(&line[n],MAXLINE-n,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + + // make certain all addional allocated storage is initialized + // to avoid false positives when checking with valgrind + + memset(params + nparams, 0, DELTA*sizeof(Param)); + } + + // load up parameter settings and error check their values + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].z0 = values.next_double(); + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].lambda = values.next_double(); + params[nparams].A = values.next_double(); + // S provides a convenient scaling of all energies + params[nparams].S = values.next_double(); + params[nparams].rcut = values.next_double(); + + } catch (TokenizerException &e) { + error->one(FLERR, e.what()); } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); + + // energies in meV further scaled by S + const double meV = 1.0e-3*params[nparams].S; + params[nparams].C *= meV; + params[nparams].A *= meV; + params[nparams].C0 *= meV; + params[nparams].C2 *= meV; + params[nparams].C4 *= meV; + + // precompute some quantities + params[nparams].delta2inv = pow(params[nparams].delta,-2); + params[nparams].z06 = pow(params[nparams].z0,6); + + nparams++; } - if (nwords != params_per_line) - error->all(FLERR,"Insufficient format in KC potential file"); + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - // words = ptrs to all words in line - - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; - - // ielement,jelement = 1st args - // if these 2 args are in element list, then parse this line - // else skip to next line (continue) - - for (ielement = 0; ielement < nelements; ielement++) - if (strcmp(words[0],elements[ielement]) == 0) break; - if (ielement == nelements) continue; - for (jelement = 0; jelement < nelements; jelement++) - if (strcmp(words[1],elements[jelement]) == 0) break; - if (jelement == nelements) continue; - - // load up parameter settings and error check their values - - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); - - // make certain all addional allocated storage is initialized - // to avoid false positives when checking with valgrind - - memset(params + nparams, 0, DELTA*sizeof(Param)); + if (comm->me != 0) { + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); } - params[nparams].ielement = ielement; - params[nparams].jelement = jelement; - params[nparams].z0 = atof(words[2]); - params[nparams].C0 = atof(words[3]); - params[nparams].C2 = atof(words[4]); - params[nparams].C4 = atof(words[5]); - params[nparams].C = atof(words[6]); - params[nparams].delta = atof(words[7]); - params[nparams].lambda = atof(words[8]); - params[nparams].A = atof(words[9]); - // S provides a convenient scaling of all energies - params[nparams].S = atof(words[10]); - params[nparams].rcut = atof(words[11]); - - // energies in meV further scaled by S - double meV = 1.0e-3*params[nparams].S; - params[nparams].C *= meV; - params[nparams].A *= meV; - params[nparams].C0 *= meV; - params[nparams].C2 *= meV; - params[nparams].C4 *= meV; - - // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2); - params[nparams].z06 = pow(params[nparams].z0,6); - - nparams++; - //if(nparams >= pow(atom->ntypes,3)) break; + MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); } + memory->destroy(elem2param); memory->destroy(cutKCsq); memory->create(elem2param,nelements,nelements,"pair:elem2param"); memory->create(cutKCsq,nelements,nelements,"pair:cutKCsq"); - for (i = 0; i < nelements; i++) { - for (j = 0; j < nelements; j++) { - n = -1; - for (m = 0; m < nparams; m++) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + int n = -1; + for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR,"KC Potential file has duplicate entry"); n = m; } } @@ -323,7 +290,6 @@ void PairKolmogorovCrespiFull::read_file(char *filename) cutKCsq[i][j] = params[n].rcut*params[n].rcut; } } - delete [] words; } /* ---------------------------------------------------------------------- diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.h b/src/INTERLAYER/pair_kolmogorov_crespi_full.h index a87e8374ad..4744375302 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.h +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.h @@ -39,6 +39,7 @@ class PairKolmogorovCrespiFull : public Pair { void calc_FRep(int, int); void calc_FvdW(int, int); double single(int, int, int, int, double, double, double, double &); + static constexpr int NPARAMS_PER_LINE = 12; protected: int me; From e91185869d3494263fa4f633de73d305b52bbc48 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 09:25:25 -0400 Subject: [PATCH 289/352] fix bug in utils::fgets_trunc(). closes #2878 --- src/utils.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index c0c15d0f3b..6a33fc044b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -176,20 +176,23 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp) char dummy[MAXDUMMY]; char *ptr = fgets(buf, size, fp); - // EOF + // EOF? if (!ptr) return nullptr; int n = strlen(buf); - // line is shorter than buffer, append newline if needed, - if (n < size - 2) { + // check the string being read in: + // - if string is shorter than the buffer make sure it has a final newline and return + // - if string is exactly the size of the buffer and has a final newline return + // - otherwise truncate with final newline and read into dummy buffer until EOF or newline is found + if (n < size - 1) { if (buf[n - 1] != '\n') { buf[n] = '\n'; buf[n + 1] = '\0'; } return buf; - - // line fits exactly. overwrite last but one character. + } else if (buf[n - 1] == '\n') { + return buf; } else buf[size - 2] = '\n'; @@ -202,7 +205,7 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp) n = 0; } while (n == MAXDUMMY - 1 && ptr[MAXDUMMY - 1] != '\n'); - // return first chunk + // return truncated chunk return buf; } From f24054f7b3c480f23354c5bf9b7acc44e6dd0aff Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 09:41:19 -0400 Subject: [PATCH 290/352] test utils::fgets_trunc() with buffer size of exactly the length of string --- unittest/formats/test_file_operations.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unittest/formats/test_file_operations.cpp b/unittest/formats/test_file_operations.cpp index af2023cebb..5cb0b688a8 100644 --- a/unittest/formats/test_file_operations.cpp +++ b/unittest/formats/test_file_operations.cpp @@ -119,13 +119,15 @@ TEST_F(FileOperationsTest, fgets_trunc) FILE *fp = fopen("safe_file_read_test.txt", "rb"); ASSERT_NE(fp, nullptr); + // read line shorter than buffer memset(buf, 0, MAX_BUF_SIZE); ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp); ASSERT_THAT(buf, StrEq("one line\n")); ASSERT_NE(ptr,nullptr); + // read line of exactly the buffer length memset(buf, 0, MAX_BUF_SIZE); - ptr = utils::fgets_trunc(buf, MAX_BUF_SIZE, fp); + ptr = utils::fgets_trunc(buf, sizeof("two_lines\n"), fp); ASSERT_THAT(buf, StrEq("two_lines\n")); ASSERT_NE(ptr,nullptr); From 0dbcb5dd663225d98a19419c9ce927578ed3f29d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 09:42:08 -0400 Subject: [PATCH 291/352] replace #define with constrexpr for better compiler error reports on integer constants --- src/utils.cpp | 16 +++++++--------- unittest/formats/test_file_operations.cpp | 5 ++--- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 6a33fc044b..d70ae6f000 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -209,11 +209,11 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp) return buf; } -#define MAXPATHLENBUF 1024 /* like fgets() but aborts with an error or EOF is encountered */ void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp, const char *filename, Error *error) { + constexpr int MAXPATHLENBUF=1024; char *rv = fgets(s, size, fp); if (rv == nullptr) { // something went wrong char buf[MAXPATHLENBUF]; @@ -242,6 +242,7 @@ void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp void utils::sfread(const char *srcname, int srcline, void *s, size_t size, size_t num, FILE *fp, const char *filename, Error *error) { + constexpr int MAXPATHLENBUF=1024; size_t rv = fread(s, size, num, fp); if (rv != num) { // something went wrong char buf[MAXPATHLENBUF]; @@ -1029,11 +1030,6 @@ bool utils::file_is_readable(const std::string &path) search current directory and the LAMMPS_POTENTIALS directory if specified ------------------------------------------------------------------------- */ -#if defined(_WIN32) -#define OS_PATH_VAR_SEP ";" -#else -#define OS_PATH_VAR_SEP ":" -#endif std::string utils::get_potential_file_path(const std::string &path) { @@ -1047,8 +1043,11 @@ std::string utils::get_potential_file_path(const std::string &path) const char *var = getenv("LAMMPS_POTENTIALS"); if (var != nullptr) { - Tokenizer dirs(var, OS_PATH_VAR_SEP); - +#if defined(_WIN32) + Tokenizer dirs(var, ";"); +#else + Tokenizer dirs(var, ":"); +#endif while (dirs.has_next()) { auto pot = utils::path_basename(filepath); auto dir = dirs.next(); @@ -1060,7 +1059,6 @@ std::string utils::get_potential_file_path(const std::string &path) } return ""; } -#undef OS_PATH_VAR_SEP /* ---------------------------------------------------------------------- read first line of potential file diff --git a/unittest/formats/test_file_operations.cpp b/unittest/formats/test_file_operations.cpp index 5cb0b688a8..0f7362674c 100644 --- a/unittest/formats/test_file_operations.cpp +++ b/unittest/formats/test_file_operations.cpp @@ -74,7 +74,8 @@ protected: } }; -#define MAX_BUF_SIZE 128 +static constexpr int MAX_BUF_SIZE=128; + TEST_F(FileOperationsTest, safe_fgets) { char buf[MAX_BUF_SIZE]; @@ -110,7 +111,6 @@ TEST_F(FileOperationsTest, safe_fgets) fclose(fp); } -#define MAX_BUF_SIZE 128 TEST_F(FileOperationsTest, fgets_trunc) { char buf[MAX_BUF_SIZE]; @@ -174,7 +174,6 @@ TEST_F(FileOperationsTest, fgets_trunc) fclose(fp); } -#define MAX_BUF_SIZE 128 TEST_F(FileOperationsTest, safe_fread) { char buf[MAX_BUF_SIZE]; From 42fadf55cf4058eaaa9aa9fddae5ab86f6489040 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 10:05:58 -0400 Subject: [PATCH 292/352] fix typos --- src/ASPHERE/pair_resquared.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ASPHERE/pair_resquared.cpp b/src/ASPHERE/pair_resquared.cpp index 4210818c61..c271f27237 100644 --- a/src/ASPHERE/pair_resquared.cpp +++ b/src/ASPHERE/pair_resquared.cpp @@ -728,7 +728,7 @@ double PairRESquared::resquared_analytic(const int i, const int j, u[0] = -rhat[m]*rhat[0]; u[1] = -rhat[m]*rhat[1]; u[2] = -rhat[m]*rhat[2]; - u[i] += 1.0; + u[m] += 1.0; u[0] /= rnorm; u[1] /= rnorm; u[2] /= rnorm; @@ -750,7 +750,7 @@ double PairRESquared::resquared_analytic(const int i, const int j, deta -= ddH*tdH; deta -= dsigma1*teta1+dsigma2*teta2; dchi = MathExtra::dot3(u,fourw); - dh12 = rhat[i]+MathExtra::dot3(u,spr); + dh12 = rhat[m]+MathExtra::dot3(u,spr); dUa = pbsu*(eta*dchi+deta*chi)-dh12*dspu; dUr = pbsr*(eta*dchi+deta*chi)-dh12*dspr; fforce[m]=dUr*Ur+dUa*Ua; From 6ccdeafa78ee56404500b08c8a5cc9c814961218 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 10:21:02 -0400 Subject: [PATCH 293/352] reformat with clang-format --- src/ASPHERE/pair_resquared.cpp | 1026 ++++++++++++++++---------------- 1 file changed, 504 insertions(+), 522 deletions(-) diff --git a/src/ASPHERE/pair_resquared.cpp b/src/ASPHERE/pair_resquared.cpp index c271f27237..23ec79fa98 100644 --- a/src/ASPHERE/pair_resquared.cpp +++ b/src/ASPHERE/pair_resquared.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -18,32 +17,31 @@ #include "pair_resquared.h" -#include -#include "math_extra.h" #include "atom.h" #include "atom_vec_ellipsoid.h" #include "comm.h" -#include "force.h" -#include "neighbor.h" -#include "neigh_list.h" -#include "memory.h" #include "error.h" +#include "force.h" +#include "math_extra.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" +#include using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairRESquared::PairRESquared(LAMMPS *lmp) : Pair(lmp), - cr60(pow(60.0,1.0/3.0)), - b_alpha(45.0/56.0) +PairRESquared::PairRESquared(LAMMPS *lmp) : + Pair(lmp), cr60(pow(60.0, 1.0 / 3.0)), b_alpha(45.0 / 56.0) { single_enable = 0; - cr60 = pow(60.0,1.0/3.0); - b_alpha = 45.0/56.0; - solv_f_a = 3.0/(16.0*atan(1.0)*-36.0); - solv_f_r = 3.0/(16.0*atan(1.0)*2025.0); + cr60 = pow(60.0, 1.0 / 3.0); + b_alpha = 45.0 / 56.0; + solv_f_a = 3.0 / (16.0 * atan(1.0) * -36.0); + solv_f_r = 3.0 / (16.0 * atan(1.0) * 2025.0); } /* ---------------------------------------------------------------------- @@ -68,8 +66,8 @@ PairRESquared::~PairRESquared() memory->destroy(lj3); memory->destroy(lj4); memory->destroy(offset); - delete [] lshape; - delete [] setwell; + delete[] lshape; + delete[] setwell; } } @@ -77,14 +75,14 @@ PairRESquared::~PairRESquared() void PairRESquared::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double evdwl,one_eng,rsq,r2inv,r6inv,forcelj,factor_lj; - double fforce[3],ttor[3],rtor[3],r12[3]; - int *ilist,*jlist,*numneigh,**firstneigh; - RE2Vars wi,wj; + int i, j, ii, jj, inum, jnum, itype, jtype; + double evdwl, one_eng, rsq, r2inv, r6inv, forcelj, factor_lj; + double fforce[3], ttor[3], rtor[3], r12[3]; + int *ilist, *jlist, *numneigh, **firstneigh; + RE2Vars wi, wj; evdwl = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -107,7 +105,7 @@ void PairRESquared::compute(int eflag, int vflag) // not a LJ sphere - if (lshape[itype] != 0.0) precompute_i(i,wi); + if (lshape[itype] != 0.0) precompute_i(i, wi); jlist = firstneigh[i]; jnum = numneigh[i]; @@ -119,10 +117,10 @@ void PairRESquared::compute(int eflag, int vflag) // r12 = center to center vector - r12[0] = x[j][0]-x[i][0]; - r12[1] = x[j][1]-x[i][1]; - r12[2] = x[j][2]-x[i][2]; - rsq = MathExtra::dot3(r12,r12); + r12[0] = x[j][0] - x[i][0]; + r12[1] = x[j][1] - x[i][1]; + r12[2] = x[j][2] - x[i][2]; + rsq = MathExtra::dot3(r12, r12); jtype = type[j]; // compute if less than cutoff @@ -132,49 +130,50 @@ void PairRESquared::compute(int eflag, int vflag) switch (form[itype][jtype]) { - case SPHERE_SPHERE: - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); - forcelj *= -r2inv; - if (eflag) one_eng = - r6inv*(r6inv*lj3[itype][jtype]-lj4[itype][jtype]) - - offset[itype][jtype]; - fforce[0] = r12[0]*forcelj; - fforce[1] = r12[1]*forcelj; - fforce[2] = r12[2]*forcelj; - break; + case SPHERE_SPHERE: + r2inv = 1.0 / rsq; + r6inv = r2inv * r2inv * r2inv; + forcelj = r6inv * (lj1[itype][jtype] * r6inv - lj2[itype][jtype]); + forcelj *= -r2inv; + if (eflag) { + one_eng = r6inv * (r6inv * lj3[itype][jtype] - lj4[itype][jtype]); + one_eng -= offset[itype][jtype]; + } + fforce[0] = r12[0] * forcelj; + fforce[1] = r12[1] * forcelj; + fforce[2] = r12[2] * forcelj; + break; - case SPHERE_ELLIPSE: - precompute_i(j,wj); - if (newton_pair || j < nlocal) { - one_eng = resquared_lj(j,i,wj,r12,rsq,fforce,rtor,true); - tor[j][0] += rtor[0]*factor_lj; - tor[j][1] += rtor[1]*factor_lj; - tor[j][2] += rtor[2]*factor_lj; - } else - one_eng = resquared_lj(j,i,wj,r12,rsq,fforce,rtor,false); - break; + case SPHERE_ELLIPSE: + precompute_i(j, wj); + if (newton_pair || j < nlocal) { + one_eng = resquared_lj(j, i, wj, r12, rsq, fforce, rtor, true); + tor[j][0] += rtor[0] * factor_lj; + tor[j][1] += rtor[1] * factor_lj; + tor[j][2] += rtor[2] * factor_lj; + } else + one_eng = resquared_lj(j, i, wj, r12, rsq, fforce, rtor, false); + break; - case ELLIPSE_SPHERE: - one_eng = resquared_lj(i,j,wi,r12,rsq,fforce,ttor,true); - tor[i][0] += ttor[0]*factor_lj; - tor[i][1] += ttor[1]*factor_lj; - tor[i][2] += ttor[2]*factor_lj; - break; + case ELLIPSE_SPHERE: + one_eng = resquared_lj(i, j, wi, r12, rsq, fforce, ttor, true); + tor[i][0] += ttor[0] * factor_lj; + tor[i][1] += ttor[1] * factor_lj; + tor[i][2] += ttor[2] * factor_lj; + break; - default: - precompute_i(j,wj); - one_eng = resquared_analytic(i,j,wi,wj,r12,rsq,fforce,ttor,rtor); - tor[i][0] += ttor[0]*factor_lj; - tor[i][1] += ttor[1]*factor_lj; - tor[i][2] += ttor[2]*factor_lj; - if (newton_pair || j < nlocal) { - tor[j][0] += rtor[0]*factor_lj; - tor[j][1] += rtor[1]*factor_lj; - tor[j][2] += rtor[2]*factor_lj; - } - break; + default: + precompute_i(j, wj); + one_eng = resquared_analytic(i, j, wi, wj, r12, rsq, fforce, ttor, rtor); + tor[i][0] += ttor[0] * factor_lj; + tor[i][1] += ttor[1] * factor_lj; + tor[i][2] += ttor[2] * factor_lj; + if (newton_pair || j < nlocal) { + tor[j][0] += rtor[0] * factor_lj; + tor[j][1] += rtor[1] * factor_lj; + tor[j][2] += rtor[2] * factor_lj; + } + break; } fforce[0] *= factor_lj; @@ -190,11 +189,11 @@ void PairRESquared::compute(int eflag, int vflag) f[j][2] -= fforce[2]; } - if (eflag) evdwl = factor_lj*one_eng; + if (eflag) evdwl = factor_lj * one_eng; - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,0.0,fforce[0],fforce[1],fforce[2], - -r12[0],-r12[1],-r12[2]); + if (evflag) + ev_tally_xyz(i, j, nlocal, newton_pair, evdwl, 0.0, fforce[0], fforce[1], fforce[2], + -r12[0], -r12[1], -r12[2]); } } } @@ -209,31 +208,30 @@ void PairRESquared::compute(int eflag, int vflag) void PairRESquared::allocate() { allocated = 1; - int n = atom->ntypes; + const int n = atom->ntypes + 1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; + memory->create(setflag, n, n, "pair:setflag"); + for (int i = 1; i < n; i++) + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutsq, n, n, "pair:cutsq"); - memory->create(form,n+1,n+1,"pair:form"); - memory->create(epsilon,n+1,n+1,"pair:epsilon"); - memory->create(sigma,n+1,n+1,"pair:sigma"); - memory->create(shape1,n+1,3,"pair:shape1"); - memory->create(shape2,n+1,3,"pair:shape2"); - memory->create(well,n+1,3,"pair:well"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(lj1,n+1,n+1,"pair:lj1"); - memory->create(lj2,n+1,n+1,"pair:lj2"); - memory->create(lj3,n+1,n+1,"pair:lj3"); - memory->create(lj4,n+1,n+1,"pair:lj4"); - memory->create(offset,n+1,n+1,"pair:offset"); + memory->create(form, n, n, "pair:form"); + memory->create(epsilon, n, n, "pair:epsilon"); + memory->create(sigma, n, n, "pair:sigma"); + memory->create(shape1, n, 3, "pair:shape1"); + memory->create(shape2, n, 3, "pair:shape2"); + memory->create(well, n, 3, "pair:well"); + memory->create(cut, n, n, "pair:cut"); + memory->create(lj1, n, n, "pair:lj1"); + memory->create(lj2, n, n, "pair:lj2"); + memory->create(lj3, n, n, "pair:lj3"); + memory->create(lj4, n, n, "pair:lj4"); + memory->create(offset, n, n, "pair:offset"); - lshape = new double[n+1]; - setwell = new int[n+1]; - for (int i = 1; i <= n; i++) setwell[i] = 0; + lshape = new double[n]; + setwell = new int[n]; + for (int i = 1; i < n; i++) setwell[i] = 0; } /* ---------------------------------------------------------------------- @@ -242,14 +240,14 @@ void PairRESquared::allocate() void PairRESquared::settings(int narg, char **arg) { - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + if (narg != 1) error->all(FLERR, "Illegal pair_style command"); - cut_global = utils::numeric(FLERR,arg[0],false,lmp); + cut_global = utils::numeric(FLERR, arg[0], false, lmp); // reset cutoffs that have been explicitly set if (allocated) { - int i,j; + int i, j; for (i = 1; i <= atom->ntypes; i++) for (j = i; j <= atom->ntypes; j++) if (setflag[i][j]) cut[i][j] = cut_global; @@ -262,29 +260,28 @@ void PairRESquared::settings(int narg, char **arg) void PairRESquared::coeff(int narg, char **arg) { - if (narg < 10 || narg > 11) - error->all(FLERR,"Incorrect args for pair coefficients"); + if (narg < 10 || narg > 11) error->all(FLERR, "Incorrect args for pair coefficients"); 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 epsilon_one = utils::numeric(FLERR,arg[2],false,lmp); - double sigma_one = utils::numeric(FLERR,arg[3],false,lmp); - double eia_one = utils::numeric(FLERR,arg[4],false,lmp); - double eib_one = utils::numeric(FLERR,arg[5],false,lmp); - double eic_one = utils::numeric(FLERR,arg[6],false,lmp); - double eja_one = utils::numeric(FLERR,arg[7],false,lmp); - double ejb_one = utils::numeric(FLERR,arg[8],false,lmp); - double ejc_one = utils::numeric(FLERR,arg[9],false,lmp); + double epsilon_one = utils::numeric(FLERR, arg[2], false, lmp); + double sigma_one = utils::numeric(FLERR, arg[3], false, lmp); + double eia_one = utils::numeric(FLERR, arg[4], false, lmp); + double eib_one = utils::numeric(FLERR, arg[5], false, lmp); + double eic_one = utils::numeric(FLERR, arg[6], false, lmp); + double eja_one = utils::numeric(FLERR, arg[7], false, lmp); + double ejb_one = utils::numeric(FLERR, arg[8], false, lmp); + double ejc_one = utils::numeric(FLERR, arg[9], false, lmp); double cut_one = cut_global; - if (narg == 11) cut_one = utils::numeric(FLERR,arg[10],false,lmp); + if (narg == 11) cut_one = utils::numeric(FLERR, arg[10], false, lmp); int count = 0; for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { epsilon[i][j] = epsilon_one; sigma[i][j] = sigma_one; cut[i][j] = cut_one; @@ -292,22 +289,26 @@ void PairRESquared::coeff(int narg, char **arg) well[i][0] = eia_one; well[i][1] = eib_one; well[i][2] = eic_one; - if (eia_one == 1.0 && eib_one == 1.0 && eic_one == 1.0) setwell[i] = 2; - else setwell[i] = 1; + if (eia_one == 1.0 && eib_one == 1.0 && eic_one == 1.0) + setwell[i] = 2; + else + setwell[i] = 1; } if (eja_one != 0.0 || ejb_one != 0.0 || ejc_one != 0.0) { well[j][0] = eja_one; well[j][1] = ejb_one; well[j][2] = ejc_one; - if (eja_one == 1.0 && ejb_one == 1.0 && ejc_one == 1.0) setwell[j] = 2; - else setwell[j] = 1; + if (eja_one == 1.0 && ejb_one == 1.0 && ejc_one == 1.0) + setwell[j] = 2; + else + setwell[j] = 1; } setflag[i][j] = 1; count++; } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } /* ---------------------------------------------------------------------- @@ -317,21 +318,21 @@ void PairRESquared::coeff(int narg, char **arg) void PairRESquared::init_style() { avec = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); - if (!avec) error->all(FLERR,"Pair resquared requires atom style ellipsoid"); + if (!avec) error->all(FLERR, "Pair resquared requires atom style ellipsoid"); - neighbor->request(this,instance_me); + neighbor->request(this, instance_me); // per-type shape precalculations // require that atom shapes are identical within each type for (int i = 1; i <= atom->ntypes; i++) { - if (!atom->shape_consistency(i,shape1[i][0],shape1[i][1],shape1[i][2])) - error->all(FLERR,"Pair resquared requires atoms with same type have same shape"); + if (!atom->shape_consistency(i, shape1[i][0], shape1[i][1], shape1[i][2])) + error->all(FLERR, "Pair resquared requires atoms with same type have same shape"); if (setwell[i]) { - shape2[i][0] = shape1[i][0]*shape1[i][0]; - shape2[i][1] = shape1[i][1]*shape1[i][1]; - shape2[i][2] = shape1[i][2]*shape1[i][2]; - lshape[i] = shape1[i][0]*shape1[i][1]*shape1[i][2]; + shape2[i][0] = shape1[i][0] * shape1[i][0]; + shape2[i][1] = shape1[i][1] * shape1[i][1]; + shape2[i][2] = shape1[i][2] * shape1[i][2]; + lshape[i] = shape1[i][0] * shape1[i][1] * shape1[i][2]; } } } @@ -343,14 +344,12 @@ void PairRESquared::init_style() double PairRESquared::init_one(int i, int j) { if (setwell[i] == 0 || setwell[j] == 0) - error->all(FLERR,"Pair resquared epsilon a,b,c coeffs are not all set"); + error->all(FLERR, "Pair resquared epsilon a,b,c coeffs are not all set"); int ishape = 0; - if (shape1[i][0] != 0.0 && shape1[i][1] != 0.0 && shape1[i][2] != 0.0) - ishape = 1; + if (shape1[i][0] != 0.0 && shape1[i][1] != 0.0 && shape1[i][2] != 0.0) ishape = 1; int jshape = 0; - if (shape1[j][0] != 0.0 && shape1[j][1] != 0.0 && shape1[j][2] != 0.0) - jshape = 1; + if (shape1[j][0] != 0.0 && shape1[j][1] != 0.0 && shape1[j][2] != 0.0) jshape = 1; if (ishape == 0 && jshape == 0) { form[i][j] = SPHERE_SPHERE; @@ -371,28 +370,27 @@ double PairRESquared::init_one(int i, int j) if (setflag[i][j] == 0) { if (setflag[j][i] == 0) { if (ishape == 0 && jshape == 0) { - epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], - sigma[i][i],sigma[j][j]); - sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]); - cut[i][j] = mix_distance(cut[i][i],cut[j][j]); + epsilon[i][j] = mix_energy(epsilon[i][i], epsilon[j][j], sigma[i][i], sigma[j][j]); + sigma[i][j] = mix_distance(sigma[i][i], sigma[j][j]); + cut[i][j] = mix_distance(cut[i][i], cut[j][j]); } else - error->all(FLERR, - "Pair resquared epsilon and sigma coeffs are not all set"); + error->all(FLERR, "Pair resquared epsilon and sigma coeffs are not all set"); } epsilon[i][j] = epsilon[j][i]; sigma[i][j] = sigma[j][i]; cut[i][j] = cut[j][i]; } - lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0); - lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0); - lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0); - lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0); + lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j], 12.0); + lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j], 6.0); + lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j], 12.0); + lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j], 6.0); if (offset_flag && (cut[i][j] > 0.0)) { double ratio = sigma[i][j] / cut[i][j]; - offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0)); - } else offset[i][j] = 0.0; + offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio, 12.0) - pow(ratio, 6.0)); + } else + offset[i][j] = 0.0; epsilon[j][i] = epsilon[i][j]; sigma[j][i] = sigma[i][j]; @@ -413,16 +411,16 @@ void PairRESquared::write_restart(FILE *fp) { write_restart_settings(fp); - int i,j; + int i, j; for (i = 1; i <= atom->ntypes; i++) { - fwrite(&setwell[i],sizeof(int),1,fp); - if (setwell[i]) fwrite(&well[i][0],sizeof(double),3,fp); + fwrite(&setwell[i], sizeof(int), 1, fp); + if (setwell[i]) fwrite(&well[i][0], sizeof(double), 3, fp); for (j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); + fwrite(&setflag[i][j], sizeof(int), 1, fp); if (setflag[i][j]) { - fwrite(&epsilon[i][j],sizeof(double),1,fp); - fwrite(&sigma[i][j],sizeof(double),1,fp); - fwrite(&cut[i][j],sizeof(double),1,fp); + fwrite(&epsilon[i][j], sizeof(double), 1, fp); + fwrite(&sigma[i][j], sizeof(double), 1, fp); + fwrite(&cut[i][j], sizeof(double), 1, fp); } } } @@ -437,27 +435,27 @@ void PairRESquared::read_restart(FILE *fp) read_restart_settings(fp); allocate(); - int i,j; + int i, j; int me = comm->me; for (i = 1; i <= atom->ntypes; i++) { - if (me == 0) utils::sfread(FLERR,&setwell[i],sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&setwell[i],1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &setwell[i], sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&setwell[i], 1, MPI_INT, 0, world); if (setwell[i]) { - if (me == 0) utils::sfread(FLERR,&well[i][0],sizeof(double),3,fp,nullptr,error); - MPI_Bcast(&well[i][0],3,MPI_DOUBLE,0,world); + if (me == 0) utils::sfread(FLERR, &well[i][0], sizeof(double), 3, fp, nullptr, error); + MPI_Bcast(&well[i][0], 3, MPI_DOUBLE, 0, world); } for (j = i; j <= atom->ntypes; j++) { - if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world); if (setflag[i][j]) { if (me == 0) { - utils::sfread(FLERR,&epsilon[i][j],sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&sigma[i][j],sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&cut[i][j],sizeof(double),1,fp,nullptr,error); + utils::sfread(FLERR, &epsilon[i][j], sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &sigma[i][j], sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &cut[i][j], sizeof(double), 1, fp, nullptr, error); } - MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); - MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&epsilon[i][j], 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&sigma[i][j], 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&cut[i][j], 1, MPI_DOUBLE, 0, world); } } } @@ -469,8 +467,8 @@ void PairRESquared::read_restart(FILE *fp) void PairRESquared::write_restart_settings(FILE *fp) { - fwrite(&cut_global,sizeof(double),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); + fwrite(&cut_global, sizeof(double), 1, fp); + fwrite(&mix_flag, sizeof(int), 1, fp); } /* ---------------------------------------------------------------------- @@ -481,34 +479,34 @@ void PairRESquared::read_restart_settings(FILE *fp) { int me = comm->me; if (me == 0) { - utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR, &cut_global, sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &mix_flag, sizeof(int), 1, fp, nullptr, error); } - MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); + MPI_Bcast(&cut_global, 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&mix_flag, 1, MPI_INT, 0, world); } /* ---------------------------------------------------------------------- Precompute per-particle temporaries for RE-squared calculation ------------------------------------------------------------------------- */ -void PairRESquared::precompute_i(const int i,RE2Vars &ws) +void PairRESquared::precompute_i(const int i, RE2Vars &ws) { - double aTs[3][3]; // A1'*S1^2 + double aTs[3][3]; // A1'*S1^2 int *ellipsoid = atom->ellipsoid; AtomVecEllipsoid::Bonus *bonus = avec->bonus; - MathExtra::quat_to_mat_trans(bonus[ellipsoid[i]].quat,ws.A); - MathExtra::transpose_diag3(ws.A,well[atom->type[i]],ws.aTe); - MathExtra::transpose_diag3(ws.A,shape2[atom->type[i]],aTs); - MathExtra::diag_times3(shape2[atom->type[i]],ws.A,ws.sa); - MathExtra::times3(aTs,ws.A,ws.gamma); - MathExtra::rotation_generator_x(ws.A,ws.lA[0]); - MathExtra::rotation_generator_y(ws.A,ws.lA[1]); - MathExtra::rotation_generator_z(ws.A,ws.lA[2]); - for (int m=0; m<3; m++) { - MathExtra::times3(aTs,ws.lA[m],ws.lAtwo[m]); - MathExtra::transpose_times3(ws.lA[m],ws.sa,ws.lAsa[m]); - MathExtra::plus3(ws.lAsa[m],ws.lAtwo[m],ws.lAsa[m]); + MathExtra::quat_to_mat_trans(bonus[ellipsoid[i]].quat, ws.A); + MathExtra::transpose_diag3(ws.A, well[atom->type[i]], ws.aTe); + MathExtra::transpose_diag3(ws.A, shape2[atom->type[i]], aTs); + MathExtra::diag_times3(shape2[atom->type[i]], ws.A, ws.sa); + MathExtra::times3(aTs, ws.A, ws.gamma); + MathExtra::rotation_generator_x(ws.A, ws.lA[0]); + MathExtra::rotation_generator_y(ws.A, ws.lA[1]); + MathExtra::rotation_generator_z(ws.A, ws.lA[2]); + for (int m = 0; m < 3; m++) { + MathExtra::times3(aTs, ws.lA[m], ws.lAtwo[m]); + MathExtra::transpose_times3(ws.lA[m], ws.sa, ws.lAsa[m]); + MathExtra::plus3(ws.lAsa[m], ws.lAtwo[m], ws.lAsa[m]); } } @@ -517,6 +515,7 @@ void PairRESquared::precompute_i(const int i,RE2Vars &ws) derivative of m (m2) ------------------------------------------------------------------------- */ +// clang-format off double PairRESquared::det_prime(const double m[3][3], const double m2[3][3]) { double ans; @@ -531,458 +530,441 @@ double PairRESquared::det_prime(const double m[3][3], const double m2[3][3]) m2[2][0]*m[0][1]*m[1][2] - m2[2][0]*m[0][2]*m[1][1]; return ans; } +// clang-format on /* ---------------------------------------------------------------------- Compute the energy, force, torque for a pair (INTEGRATED-INTEGRATED) ------------------------------------------------------------------------- */ -double PairRESquared::resquared_analytic(const int i, const int j, - const RE2Vars &wi, const RE2Vars &wj, - const double *r, const double rsq, - double *fforce, double *ttor, - double *rtor) +double PairRESquared::resquared_analytic(const int i, const int j, const RE2Vars &wi, + const RE2Vars &wj, const double *r, const double rsq, + double *fforce, double *ttor, double *rtor) { int *type = atom->type; // pair computations for energy, force, torque - double z1[3],z2[3]; // A1*rhat # don't need to store - double v1[3],v2[3]; // inv(S1^2)*z1 # don't need to store - double sigma1,sigma2; // 1/sqrt(z1'*v1) - double sigma1p2,sigma2p2; // sigma1^2 - double rnorm; // L2 norm of r - double rhat[3]; // r/rnorm - double s[3]; // inv(gamma1+gamma2)*rhat - double sigma12; // 1/sqrt(0.5*s'*rhat) - double H12[3][3]; // gamma1/sigma1+gamma2/sigma2 - double dH; // det(H12) - double lambda; // dS1/sigma1p2+dS2/sigma2p2 - double nu; // sqrt(dH/(sigma1+sigma2)) - double w[3]; // inv(A1'*E1*A1+A2'*E2*A2)*rhat - double h12; // rnorm-sigma12; - double eta; // lambda/nu - double chi; // 2*rhat'*w - double sprod; // dS1*dS2 - double sigh; // sigma/h12 - double tprod; // eta*chi*sigh - double Ua,Ur; // attractive/repulsive parts of potential + double z1[3], z2[3]; // A1*rhat # don't need to store + double v1[3], v2[3]; // inv(S1^2)*z1 # don't need to store + double sigma1, sigma2; // 1/sqrt(z1'*v1) + double sigma1p2, sigma2p2; // sigma1^2 + double rnorm; // L2 norm of r + double rhat[3]; // r/rnorm + double s[3]; // inv(gamma1+gamma2)*rhat + double sigma12; // 1/sqrt(0.5*s'*rhat) + double H12[3][3]; // gamma1/sigma1+gamma2/sigma2 + double dH; // det(H12) + double lambda; // dS1/sigma1p2+dS2/sigma2p2 + double nu; // sqrt(dH/(sigma1+sigma2)) + double w[3]; // inv(A1'*E1*A1+A2'*E2*A2)*rhat + double h12; // rnorm-sigma12; + double eta; // lambda/nu + double chi; // 2*rhat'*w + double sprod; // dS1*dS2 + double sigh; // sigma/h12 + double tprod; // eta*chi*sigh + double Ua, Ur; // attractive/repulsive parts of potential // pair computations for force, torque - double sec; // sigma*eta*chi - double sigma1p3, sigma2p3; // sigma1^3 - double vsigma1[3], vsigma2[3]; // sigma1^3*v1; - double sigma12p3; // sigma12^3 - double gsigma1[3][3], gsigma2[3][3]; // -gamma1/sigma1^2 - double tsig1sig2; // eta/(2*(sigma1+sigma2)) - double tdH; // eta/(2*dH) - double teta1,teta2; // 2*eta/lambda*dS1/sigma1p3 - double fourw[3]; // 4*w; - double spr[3]; // 0.5*sigma12^3*s - double hsec; // h12+[3,b_alpha]*sec - double dspu; // 1/h12 - 1/hsec + temp - double pbsu; // 3*sigma/hsec - double dspr; // 7/h12-1/hsec+temp - double pbsr; // b_alpha*sigma/hsec; - double u[3]; // (-rhat(i)*rhat+eye(:,i))/rnorm - double u1[3],u2[3]; // A1*u - double dsigma1,dsigma2; // u1'*vsigma1 (force) p'*vsigma1 (tor) - double dH12[3][3]; // dsigma1*gsigma1 + dsigma2*gsigma2 - double ddH; // derivative of det(H12) - double deta,dchi,dh12; // derivatives of eta,chi,h12 - double dUr,dUa; // derivatives of Ua,Ur + double sec; // sigma*eta*chi + double sigma1p3, sigma2p3; // sigma1^3 + double vsigma1[3], vsigma2[3]; // sigma1^3*v1; + double sigma12p3; // sigma12^3 + double gsigma1[3][3], gsigma2[3][3]; // -gamma1/sigma1^2 + double tsig1sig2; // eta/(2*(sigma1+sigma2)) + double tdH; // eta/(2*dH) + double teta1, teta2; // 2*eta/lambda*dS1/sigma1p3 + double fourw[3]; // 4*w; + double spr[3]; // 0.5*sigma12^3*s + double hsec; // h12+[3,b_alpha]*sec + double dspu; // 1/h12 - 1/hsec + temp + double pbsu; // 3*sigma/hsec + double dspr; // 7/h12-1/hsec+temp + double pbsr; // b_alpha*sigma/hsec; + double u[3]; // (-rhat(i)*rhat+eye(:,i))/rnorm + double u1[3], u2[3]; // A1*u + double dsigma1, dsigma2; // u1'*vsigma1 (force) p'*vsigma1 (tor) + double dH12[3][3]; // dsigma1*gsigma1 + dsigma2*gsigma2 + double ddH; // derivative of det(H12) + double deta, dchi, dh12; // derivatives of eta,chi,h12 + double dUr, dUa; // derivatives of Ua,Ur // pair computations for torque - double fwae[3]; // -fourw'*aTe - double p[3]; // lA*rhat + double fwae[3]; // -fourw'*aTe + double p[3]; // lA*rhat rnorm = sqrt(rsq); - rhat[0] = r[0]/rnorm; - rhat[1] = r[1]/rnorm; - rhat[2] = r[2]/rnorm; + rhat[0] = r[0] / rnorm; + rhat[1] = r[1] / rnorm; + rhat[2] = r[2] / rnorm; // energy double temp[3][3]; - MathExtra::plus3(wi.gamma,wj.gamma,temp); - int ierror = MathExtra::mldivide3(temp,rhat,s); - if (ierror) error->all(FLERR,"Bad matrix inversion in mldivide3"); + MathExtra::plus3(wi.gamma, wj.gamma, temp); + int ierror = MathExtra::mldivide3(temp, rhat, s); + if (ierror) error->all(FLERR, "Bad matrix inversion in mldivide3"); - sigma12 = 1.0/sqrt(0.5*MathExtra::dot3(s,rhat)); - MathExtra::matvec(wi.A,rhat,z1); - MathExtra::matvec(wj.A,rhat,z2); - v1[0] = z1[0]/shape2[type[i]][0]; - v1[1] = z1[1]/shape2[type[i]][1]; - v1[2] = z1[2]/shape2[type[i]][2]; - v2[0] = z2[0]/shape2[type[j]][0]; - v2[1] = z2[1]/shape2[type[j]][1]; - v2[2] = z2[2]/shape2[type[j]][2]; - sigma1 = 1.0/sqrt(MathExtra::dot3(z1,v1)); - sigma2 = 1.0/sqrt(MathExtra::dot3(z2,v2)); - H12[0][0] = wi.gamma[0][0]/sigma1+wj.gamma[0][0]/sigma2; - H12[0][1] = wi.gamma[0][1]/sigma1+wj.gamma[0][1]/sigma2; - H12[0][2] = wi.gamma[0][2]/sigma1+wj.gamma[0][2]/sigma2; - H12[1][0] = wi.gamma[1][0]/sigma1+wj.gamma[1][0]/sigma2; - H12[1][1] = wi.gamma[1][1]/sigma1+wj.gamma[1][1]/sigma2; - H12[1][2] = wi.gamma[1][2]/sigma1+wj.gamma[1][2]/sigma2; - H12[2][0] = wi.gamma[2][0]/sigma1+wj.gamma[2][0]/sigma2; - H12[2][1] = wi.gamma[2][1]/sigma1+wj.gamma[2][1]/sigma2; - H12[2][2] = wi.gamma[2][2]/sigma1+wj.gamma[2][2]/sigma2; - dH=MathExtra::det3(H12); - sigma1p2 = sigma1*sigma1; - sigma2p2 = sigma2*sigma2; - lambda = lshape[type[i]]/sigma1p2 + lshape[type[j]]/sigma2p2; - nu = sqrt(dH/(sigma1+sigma2)); - MathExtra::times3(wi.aTe,wi.A,temp); + sigma12 = 1.0 / sqrt(0.5 * MathExtra::dot3(s, rhat)); + MathExtra::matvec(wi.A, rhat, z1); + MathExtra::matvec(wj.A, rhat, z2); + v1[0] = z1[0] / shape2[type[i]][0]; + v1[1] = z1[1] / shape2[type[i]][1]; + v1[2] = z1[2] / shape2[type[i]][2]; + v2[0] = z2[0] / shape2[type[j]][0]; + v2[1] = z2[1] / shape2[type[j]][1]; + v2[2] = z2[2] / shape2[type[j]][2]; + sigma1 = 1.0 / sqrt(MathExtra::dot3(z1, v1)); + sigma2 = 1.0 / sqrt(MathExtra::dot3(z2, v2)); + H12[0][0] = wi.gamma[0][0] / sigma1 + wj.gamma[0][0] / sigma2; + H12[0][1] = wi.gamma[0][1] / sigma1 + wj.gamma[0][1] / sigma2; + H12[0][2] = wi.gamma[0][2] / sigma1 + wj.gamma[0][2] / sigma2; + H12[1][0] = wi.gamma[1][0] / sigma1 + wj.gamma[1][0] / sigma2; + H12[1][1] = wi.gamma[1][1] / sigma1 + wj.gamma[1][1] / sigma2; + H12[1][2] = wi.gamma[1][2] / sigma1 + wj.gamma[1][2] / sigma2; + H12[2][0] = wi.gamma[2][0] / sigma1 + wj.gamma[2][0] / sigma2; + H12[2][1] = wi.gamma[2][1] / sigma1 + wj.gamma[2][1] / sigma2; + H12[2][2] = wi.gamma[2][2] / sigma1 + wj.gamma[2][2] / sigma2; + dH = MathExtra::det3(H12); + sigma1p2 = sigma1 * sigma1; + sigma2p2 = sigma2 * sigma2; + lambda = lshape[type[i]] / sigma1p2 + lshape[type[j]] / sigma2p2; + nu = sqrt(dH / (sigma1 + sigma2)); + MathExtra::times3(wi.aTe, wi.A, temp); double temp2[3][3]; - MathExtra::times3(wj.aTe,wj.A,temp2); - MathExtra::plus3(temp,temp2,temp); - ierror = MathExtra::mldivide3(temp,rhat,w); - if (ierror) error->all(FLERR,"Bad matrix inversion in mldivide3"); + MathExtra::times3(wj.aTe, wj.A, temp2); + MathExtra::plus3(temp, temp2, temp); + ierror = MathExtra::mldivide3(temp, rhat, w); + if (ierror) error->all(FLERR, "Bad matrix inversion in mldivide3"); - h12 = rnorm-sigma12; - eta = lambda/nu; - chi = 2.0*MathExtra::dot3(rhat,w); + h12 = rnorm - sigma12; + eta = lambda / nu; + chi = 2.0 * MathExtra::dot3(rhat, w); sprod = lshape[type[i]] * lshape[type[j]]; - sigh = sigma[type[i]][type[j]]/h12; - tprod = eta*chi*sigh; + sigh = sigma[type[i]][type[j]] / h12; + tprod = eta * chi * sigh; - double stemp = h12/2.0; - Ua = (shape1[type[i]][0]+stemp)*(shape1[type[i]][1]+stemp)* - (shape1[type[i]][2]+stemp)*(shape1[type[j]][0]+stemp)* - (shape1[type[j]][1]+stemp)*(shape1[type[j]][2]+stemp); - Ua = (1.0+3.0*tprod)*sprod/Ua; - Ua = epsilon[type[i]][type[j]]*Ua/-36.0; + double stemp = h12 / 2.0; + Ua = (shape1[type[i]][0] + stemp) * (shape1[type[i]][1] + stemp) * (shape1[type[i]][2] + stemp) * + (shape1[type[j]][0] + stemp) * (shape1[type[j]][1] + stemp) * (shape1[type[j]][2] + stemp); + Ua = (1.0 + 3.0 * tprod) * sprod / Ua; + Ua = epsilon[type[i]][type[j]] * Ua / -36.0; - stemp = h12/cr60; - Ur = (shape1[type[i]][0]+stemp)*(shape1[type[i]][1]+stemp)* - (shape1[type[i]][2]+stemp)*(shape1[type[j]][0]+stemp)* - (shape1[type[j]][1]+stemp)*(shape1[type[j]][2]+stemp); - Ur = (1.0+b_alpha*tprod)*sprod/Ur; - Ur = epsilon[type[i]][type[j]]*Ur*pow(sigh,6.0)/2025.0; + stemp = h12 / cr60; + Ur = (shape1[type[i]][0] + stemp) * (shape1[type[i]][1] + stemp) * (shape1[type[i]][2] + stemp) * + (shape1[type[j]][0] + stemp) * (shape1[type[j]][1] + stemp) * (shape1[type[j]][2] + stemp); + Ur = (1.0 + b_alpha * tprod) * sprod / Ur; + Ur = epsilon[type[i]][type[j]] * Ur * pow(sigh, 6.0) / 2025.0; // force - sec = sigma[type[i]][type[j]]*eta*chi; - sigma12p3 = pow(sigma12,3.0); - sigma1p3 = sigma1p2*sigma1; - sigma2p3 = sigma2p2*sigma2; - vsigma1[0] = -sigma1p3*v1[0]; - vsigma1[1] = -sigma1p3*v1[1]; - vsigma1[2] = -sigma1p3*v1[2]; - vsigma2[0] = -sigma2p3*v2[0]; - vsigma2[1] = -sigma2p3*v2[1]; - vsigma2[2] = -sigma2p3*v2[2]; - gsigma1[0][0] = -wi.gamma[0][0]/sigma1p2; - gsigma1[0][1] = -wi.gamma[0][1]/sigma1p2; - gsigma1[0][2] = -wi.gamma[0][2]/sigma1p2; - gsigma1[1][0] = -wi.gamma[1][0]/sigma1p2; - gsigma1[1][1] = -wi.gamma[1][1]/sigma1p2; - gsigma1[1][2] = -wi.gamma[1][2]/sigma1p2; - gsigma1[2][0] = -wi.gamma[2][0]/sigma1p2; - gsigma1[2][1] = -wi.gamma[2][1]/sigma1p2; - gsigma1[2][2] = -wi.gamma[2][2]/sigma1p2; - gsigma2[0][0] = -wj.gamma[0][0]/sigma2p2; - gsigma2[0][1] = -wj.gamma[0][1]/sigma2p2; - gsigma2[0][2] = -wj.gamma[0][2]/sigma2p2; - gsigma2[1][0] = -wj.gamma[1][0]/sigma2p2; - gsigma2[1][1] = -wj.gamma[1][1]/sigma2p2; - gsigma2[1][2] = -wj.gamma[1][2]/sigma2p2; - gsigma2[2][0] = -wj.gamma[2][0]/sigma2p2; - gsigma2[2][1] = -wj.gamma[2][1]/sigma2p2; - gsigma2[2][2] = -wj.gamma[2][2]/sigma2p2; - tsig1sig2 = eta/(2.0*(sigma1+sigma2)); - tdH = eta/(2.0*dH); - teta1 = 2.0*eta/lambda; - teta2 = teta1*lshape[type[j]]/sigma2p3; - teta1 = teta1*lshape[type[i]]/sigma1p3; - fourw[0] = 4.0*w[0]; - fourw[1] = 4.0*w[1]; - fourw[2] = 4.0*w[2]; - spr[0] = 0.5*sigma12p3*s[0]; - spr[1] = 0.5*sigma12p3*s[1]; - spr[2] = 0.5*sigma12p3*s[2]; + sec = sigma[type[i]][type[j]] * eta * chi; + sigma12p3 = pow(sigma12, 3.0); + sigma1p3 = sigma1p2 * sigma1; + sigma2p3 = sigma2p2 * sigma2; + vsigma1[0] = -sigma1p3 * v1[0]; + vsigma1[1] = -sigma1p3 * v1[1]; + vsigma1[2] = -sigma1p3 * v1[2]; + vsigma2[0] = -sigma2p3 * v2[0]; + vsigma2[1] = -sigma2p3 * v2[1]; + vsigma2[2] = -sigma2p3 * v2[2]; + gsigma1[0][0] = -wi.gamma[0][0] / sigma1p2; + gsigma1[0][1] = -wi.gamma[0][1] / sigma1p2; + gsigma1[0][2] = -wi.gamma[0][2] / sigma1p2; + gsigma1[1][0] = -wi.gamma[1][0] / sigma1p2; + gsigma1[1][1] = -wi.gamma[1][1] / sigma1p2; + gsigma1[1][2] = -wi.gamma[1][2] / sigma1p2; + gsigma1[2][0] = -wi.gamma[2][0] / sigma1p2; + gsigma1[2][1] = -wi.gamma[2][1] / sigma1p2; + gsigma1[2][2] = -wi.gamma[2][2] / sigma1p2; + gsigma2[0][0] = -wj.gamma[0][0] / sigma2p2; + gsigma2[0][1] = -wj.gamma[0][1] / sigma2p2; + gsigma2[0][2] = -wj.gamma[0][2] / sigma2p2; + gsigma2[1][0] = -wj.gamma[1][0] / sigma2p2; + gsigma2[1][1] = -wj.gamma[1][1] / sigma2p2; + gsigma2[1][2] = -wj.gamma[1][2] / sigma2p2; + gsigma2[2][0] = -wj.gamma[2][0] / sigma2p2; + gsigma2[2][1] = -wj.gamma[2][1] / sigma2p2; + gsigma2[2][2] = -wj.gamma[2][2] / sigma2p2; + tsig1sig2 = eta / (2.0 * (sigma1 + sigma2)); + tdH = eta / (2.0 * dH); + teta1 = 2.0 * eta / lambda; + teta2 = teta1 * lshape[type[j]] / sigma2p3; + teta1 = teta1 * lshape[type[i]] / sigma1p3; + fourw[0] = 4.0 * w[0]; + fourw[1] = 4.0 * w[1]; + fourw[2] = 4.0 * w[2]; + spr[0] = 0.5 * sigma12p3 * s[0]; + spr[1] = 0.5 * sigma12p3 * s[1]; + spr[2] = 0.5 * sigma12p3 * s[2]; - stemp = 1.0/(shape1[type[i]][0]*2.0+h12)+ - 1.0/(shape1[type[i]][1]*2.0+h12)+ - 1.0/(shape1[type[i]][2]*2.0+h12)+ - 1.0/(shape1[type[j]][0]*2.0+h12)+ - 1.0/(shape1[type[j]][1]*2.0+h12)+ - 1.0/(shape1[type[j]][2]*2.0+h12); - hsec = h12+3.0*sec; - dspu = 1.0/h12-1.0/hsec+stemp; - pbsu = 3.0*sigma[type[i]][type[j]]/hsec; + stemp = 1.0 / (shape1[type[i]][0] * 2.0 + h12) + 1.0 / (shape1[type[i]][1] * 2.0 + h12) + + 1.0 / (shape1[type[i]][2] * 2.0 + h12) + 1.0 / (shape1[type[j]][0] * 2.0 + h12) + + 1.0 / (shape1[type[j]][1] * 2.0 + h12) + 1.0 / (shape1[type[j]][2] * 2.0 + h12); + hsec = h12 + 3.0 * sec; + dspu = 1.0 / h12 - 1.0 / hsec + stemp; + pbsu = 3.0 * sigma[type[i]][type[j]] / hsec; - stemp = 1.0/(shape1[type[i]][0]*cr60+h12)+ - 1.0/(shape1[type[i]][1]*cr60+h12)+ - 1.0/(shape1[type[i]][2]*cr60+h12)+ - 1.0/(shape1[type[j]][0]*cr60+h12)+ - 1.0/(shape1[type[j]][1]*cr60+h12)+ - 1.0/(shape1[type[j]][2]*cr60+h12); - hsec = h12+b_alpha*sec; - dspr = 7.0/h12-1.0/hsec+stemp; - pbsr = b_alpha*sigma[type[i]][type[j]]/hsec; + stemp = 1.0 / (shape1[type[i]][0] * cr60 + h12) + 1.0 / (shape1[type[i]][1] * cr60 + h12) + + 1.0 / (shape1[type[i]][2] * cr60 + h12) + 1.0 / (shape1[type[j]][0] * cr60 + h12) + + 1.0 / (shape1[type[j]][1] * cr60 + h12) + 1.0 / (shape1[type[j]][2] * cr60 + h12); + hsec = h12 + b_alpha * sec; + dspr = 7.0 / h12 - 1.0 / hsec + stemp; + pbsr = b_alpha * sigma[type[i]][type[j]] / hsec; - for (int m=0; m<3; m++) { - u[0] = -rhat[m]*rhat[0]; - u[1] = -rhat[m]*rhat[1]; - u[2] = -rhat[m]*rhat[2]; + for (int m = 0; m < 3; m++) { + u[0] = -rhat[m] * rhat[0]; + u[1] = -rhat[m] * rhat[1]; + u[2] = -rhat[m] * rhat[2]; u[m] += 1.0; u[0] /= rnorm; u[1] /= rnorm; u[2] /= rnorm; - MathExtra::matvec(wi.A,u,u1); - MathExtra::matvec(wj.A,u,u2); - dsigma1=MathExtra::dot3(u1,vsigma1); - dsigma2=MathExtra::dot3(u2,vsigma2); - dH12[0][0] = dsigma1*gsigma1[0][0]+dsigma2*gsigma2[0][0]; - dH12[0][1] = dsigma1*gsigma1[0][1]+dsigma2*gsigma2[0][1]; - dH12[0][2] = dsigma1*gsigma1[0][2]+dsigma2*gsigma2[0][2]; - dH12[1][0] = dsigma1*gsigma1[1][0]+dsigma2*gsigma2[1][0]; - dH12[1][1] = dsigma1*gsigma1[1][1]+dsigma2*gsigma2[1][1]; - dH12[1][2] = dsigma1*gsigma1[1][2]+dsigma2*gsigma2[1][2]; - dH12[2][0] = dsigma1*gsigma1[2][0]+dsigma2*gsigma2[2][0]; - dH12[2][1] = dsigma1*gsigma1[2][1]+dsigma2*gsigma2[2][1]; - dH12[2][2] = dsigma1*gsigma1[2][2]+dsigma2*gsigma2[2][2]; - ddH = det_prime(H12,dH12); - deta = (dsigma1+dsigma2)*tsig1sig2; - deta -= ddH*tdH; - deta -= dsigma1*teta1+dsigma2*teta2; - dchi = MathExtra::dot3(u,fourw); - dh12 = rhat[m]+MathExtra::dot3(u,spr); - dUa = pbsu*(eta*dchi+deta*chi)-dh12*dspu; - dUr = pbsr*(eta*dchi+deta*chi)-dh12*dspr; - fforce[m]=dUr*Ur+dUa*Ua; + MathExtra::matvec(wi.A, u, u1); + MathExtra::matvec(wj.A, u, u2); + dsigma1 = MathExtra::dot3(u1, vsigma1); + dsigma2 = MathExtra::dot3(u2, vsigma2); + dH12[0][0] = dsigma1 * gsigma1[0][0] + dsigma2 * gsigma2[0][0]; + dH12[0][1] = dsigma1 * gsigma1[0][1] + dsigma2 * gsigma2[0][1]; + dH12[0][2] = dsigma1 * gsigma1[0][2] + dsigma2 * gsigma2[0][2]; + dH12[1][0] = dsigma1 * gsigma1[1][0] + dsigma2 * gsigma2[1][0]; + dH12[1][1] = dsigma1 * gsigma1[1][1] + dsigma2 * gsigma2[1][1]; + dH12[1][2] = dsigma1 * gsigma1[1][2] + dsigma2 * gsigma2[1][2]; + dH12[2][0] = dsigma1 * gsigma1[2][0] + dsigma2 * gsigma2[2][0]; + dH12[2][1] = dsigma1 * gsigma1[2][1] + dsigma2 * gsigma2[2][1]; + dH12[2][2] = dsigma1 * gsigma1[2][2] + dsigma2 * gsigma2[2][2]; + ddH = det_prime(H12, dH12); + deta = (dsigma1 + dsigma2) * tsig1sig2; + deta -= ddH * tdH; + deta -= dsigma1 * teta1 + dsigma2 * teta2; + dchi = MathExtra::dot3(u, fourw); + dh12 = rhat[m] + MathExtra::dot3(u, spr); + dUa = pbsu * (eta * dchi + deta * chi) - dh12 * dspu; + dUr = pbsr * (eta * dchi + deta * chi) - dh12 * dspr; + fforce[m] = dUr * Ur + dUa * Ua; } // torque on i - MathExtra::vecmat(fourw,wi.aTe,fwae); + MathExtra::vecmat(fourw, wi.aTe, fwae); - for (int i=0; i<3; i++) { - MathExtra::matvec(wi.lA[i],rhat,p); - dsigma1 = MathExtra::dot3(p,vsigma1); - dH12[0][0] = wi.lAsa[i][0][0]/sigma1+dsigma1*gsigma1[0][0]; - dH12[0][1] = wi.lAsa[i][0][1]/sigma1+dsigma1*gsigma1[0][1]; - dH12[0][2] = wi.lAsa[i][0][2]/sigma1+dsigma1*gsigma1[0][2]; - dH12[1][0] = wi.lAsa[i][1][0]/sigma1+dsigma1*gsigma1[1][0]; - dH12[1][1] = wi.lAsa[i][1][1]/sigma1+dsigma1*gsigma1[1][1]; - dH12[1][2] = wi.lAsa[i][1][2]/sigma1+dsigma1*gsigma1[1][2]; - dH12[2][0] = wi.lAsa[i][2][0]/sigma1+dsigma1*gsigma1[2][0]; - dH12[2][1] = wi.lAsa[i][2][1]/sigma1+dsigma1*gsigma1[2][1]; - dH12[2][2] = wi.lAsa[i][2][2]/sigma1+dsigma1*gsigma1[2][2]; - ddH = det_prime(H12,dH12); - deta = tsig1sig2*dsigma1-tdH*ddH; - deta -= teta1*dsigma1; + for (int i = 0; i < 3; i++) { + MathExtra::matvec(wi.lA[i], rhat, p); + dsigma1 = MathExtra::dot3(p, vsigma1); + dH12[0][0] = wi.lAsa[i][0][0] / sigma1 + dsigma1 * gsigma1[0][0]; + dH12[0][1] = wi.lAsa[i][0][1] / sigma1 + dsigma1 * gsigma1[0][1]; + dH12[0][2] = wi.lAsa[i][0][2] / sigma1 + dsigma1 * gsigma1[0][2]; + dH12[1][0] = wi.lAsa[i][1][0] / sigma1 + dsigma1 * gsigma1[1][0]; + dH12[1][1] = wi.lAsa[i][1][1] / sigma1 + dsigma1 * gsigma1[1][1]; + dH12[1][2] = wi.lAsa[i][1][2] / sigma1 + dsigma1 * gsigma1[1][2]; + dH12[2][0] = wi.lAsa[i][2][0] / sigma1 + dsigma1 * gsigma1[2][0]; + dH12[2][1] = wi.lAsa[i][2][1] / sigma1 + dsigma1 * gsigma1[2][1]; + dH12[2][2] = wi.lAsa[i][2][2] / sigma1 + dsigma1 * gsigma1[2][2]; + ddH = det_prime(H12, dH12); + deta = tsig1sig2 * dsigma1 - tdH * ddH; + deta -= teta1 * dsigma1; double tempv[3]; - MathExtra::matvec(wi.lA[i],w,tempv); - dchi = -MathExtra::dot3(fwae,tempv); - MathExtra::matvec(wi.lAtwo[i],spr,tempv); - dh12 = -MathExtra::dot3(s,tempv); + MathExtra::matvec(wi.lA[i], w, tempv); + dchi = -MathExtra::dot3(fwae, tempv); + MathExtra::matvec(wi.lAtwo[i], spr, tempv); + dh12 = -MathExtra::dot3(s, tempv); - dUa = pbsu*(eta*dchi + deta*chi)-dh12*dspu; - dUr = pbsr*(eta*dchi + deta*chi)-dh12*dspr; - ttor[i] = -(dUa*Ua+dUr*Ur); + dUa = pbsu * (eta * dchi + deta * chi) - dh12 * dspu; + dUr = pbsr * (eta * dchi + deta * chi) - dh12 * dspr; + ttor[i] = -(dUa * Ua + dUr * Ur); } // torque on j - if (!(force->newton_pair || j < atom->nlocal)) - return Ua+Ur; + if (!(force->newton_pair || j < atom->nlocal)) return Ua + Ur; - MathExtra::vecmat(fourw,wj.aTe,fwae); + MathExtra::vecmat(fourw, wj.aTe, fwae); - for (int i=0; i<3; i++) { - MathExtra::matvec(wj.lA[i],rhat,p); - dsigma2 = MathExtra::dot3(p,vsigma2); - dH12[0][0] = wj.lAsa[i][0][0]/sigma2+dsigma2*gsigma2[0][0]; - dH12[0][1] = wj.lAsa[i][0][1]/sigma2+dsigma2*gsigma2[0][1]; - dH12[0][2] = wj.lAsa[i][0][2]/sigma2+dsigma2*gsigma2[0][2]; - dH12[1][0] = wj.lAsa[i][1][0]/sigma2+dsigma2*gsigma2[1][0]; - dH12[1][1] = wj.lAsa[i][1][1]/sigma2+dsigma2*gsigma2[1][1]; - dH12[1][2] = wj.lAsa[i][1][2]/sigma2+dsigma2*gsigma2[1][2]; - dH12[2][0] = wj.lAsa[i][2][0]/sigma2+dsigma2*gsigma2[2][0]; - dH12[2][1] = wj.lAsa[i][2][1]/sigma2+dsigma2*gsigma2[2][1]; - dH12[2][2] = wj.lAsa[i][2][2]/sigma2+dsigma2*gsigma2[2][2]; - ddH = det_prime(H12,dH12); - deta = tsig1sig2*dsigma2-tdH*ddH; - deta -= teta2*dsigma2; + for (int i = 0; i < 3; i++) { + MathExtra::matvec(wj.lA[i], rhat, p); + dsigma2 = MathExtra::dot3(p, vsigma2); + dH12[0][0] = wj.lAsa[i][0][0] / sigma2 + dsigma2 * gsigma2[0][0]; + dH12[0][1] = wj.lAsa[i][0][1] / sigma2 + dsigma2 * gsigma2[0][1]; + dH12[0][2] = wj.lAsa[i][0][2] / sigma2 + dsigma2 * gsigma2[0][2]; + dH12[1][0] = wj.lAsa[i][1][0] / sigma2 + dsigma2 * gsigma2[1][0]; + dH12[1][1] = wj.lAsa[i][1][1] / sigma2 + dsigma2 * gsigma2[1][1]; + dH12[1][2] = wj.lAsa[i][1][2] / sigma2 + dsigma2 * gsigma2[1][2]; + dH12[2][0] = wj.lAsa[i][2][0] / sigma2 + dsigma2 * gsigma2[2][0]; + dH12[2][1] = wj.lAsa[i][2][1] / sigma2 + dsigma2 * gsigma2[2][1]; + dH12[2][2] = wj.lAsa[i][2][2] / sigma2 + dsigma2 * gsigma2[2][2]; + ddH = det_prime(H12, dH12); + deta = tsig1sig2 * dsigma2 - tdH * ddH; + deta -= teta2 * dsigma2; double tempv[3]; - MathExtra::matvec(wj.lA[i],w,tempv); - dchi = -MathExtra::dot3(fwae,tempv); - MathExtra::matvec(wj.lAtwo[i],spr,tempv); - dh12 = -MathExtra::dot3(s,tempv); + MathExtra::matvec(wj.lA[i], w, tempv); + dchi = -MathExtra::dot3(fwae, tempv); + MathExtra::matvec(wj.lAtwo[i], spr, tempv); + dh12 = -MathExtra::dot3(s, tempv); - dUa = pbsu*(eta*dchi + deta*chi)-dh12*dspu; - dUr = pbsr*(eta*dchi + deta*chi)-dh12*dspr; - rtor[i] = -(dUa*Ua+dUr*Ur); + dUa = pbsu * (eta * dchi + deta * chi) - dh12 * dspu; + dUr = pbsr * (eta * dchi + deta * chi) - dh12 * dspr; + rtor[i] = -(dUa * Ua + dUr * Ur); } - return Ua+Ur; + return Ua + Ur; } /* ---------------------------------------------------------------------- Compute the energy, force, torque for a pair (INTEGRATED-LJ) ------------------------------------------------------------------------- */ -double PairRESquared::resquared_lj(const int i, const int j, - const RE2Vars &wi, const double *r, - const double rsq, double *fforce, - double *ttor, bool calc_torque) +double PairRESquared::resquared_lj(const int i, const int j, const RE2Vars &wi, const double *r, + const double rsq, double *fforce, double *ttor, bool calc_torque) { int *type = atom->type; // pair computations for energy, force, torque - double rnorm; // L2 norm of r - double rhat[3]; // r/rnorm - double s[3]; // inv(gamma1)*rhat - double sigma12; // 1/sqrt(0.5*s'*rhat) - double w[3]; // inv(A1'*E1*A1+I)*rhat - double h12; // rnorm-sigma12; - double chi; // 2*rhat'*w - double sigh; // sigma/h12 - double tprod; // chi*sigh - double Ua,Ur; // attractive/repulsive parts of potential + double rnorm; // L2 norm of r + double rhat[3]; // r/rnorm + double s[3]; // inv(gamma1)*rhat + double sigma12; // 1/sqrt(0.5*s'*rhat) + double w[3]; // inv(A1'*E1*A1+I)*rhat + double h12; // rnorm-sigma12; + double chi; // 2*rhat'*w + double sigh; // sigma/h12 + double tprod; // chi*sigh + double Ua, Ur; // attractive/repulsive parts of potential // pair computations for force, torque - double sec; // sigma*chi - double sigma12p3; // sigma12^3 - double fourw[3]; // 4*w; - double spr[3]; // 0.5*sigma12^3*s - double hsec; // h12+[3,b_alpha]*sec - double dspu; // 1/h12 - 1/hsec + temp - double pbsu; // 3*sigma/hsec - double dspr; // 7/h12-1/hsec+temp - double pbsr; // b_alpha*sigma/hsec; - double u[3]; // (-rhat(i)*rhat+eye(:,i))/rnorm - double dchi,dh12; // derivatives of chi,h12 - double dUr,dUa; // derivatives of Ua,Ur - double h12p3; // h12^3 + double sec; // sigma*chi + double sigma12p3; // sigma12^3 + double fourw[3]; // 4*w; + double spr[3]; // 0.5*sigma12^3*s + double hsec; // h12+[3,b_alpha]*sec + double dspu; // 1/h12 - 1/hsec + temp + double pbsu; // 3*sigma/hsec + double dspr; // 7/h12-1/hsec+temp + double pbsr; // b_alpha*sigma/hsec; + double u[3]; // (-rhat(i)*rhat+eye(:,i))/rnorm + double dchi, dh12; // derivatives of chi,h12 + double dUr, dUa; // derivatives of Ua,Ur + double h12p3; // h12^3 // pair computations for torque - double fwae[3]; // -fourw'*aTe - double p[3]; // lA*rhat + double fwae[3]; // -fourw'*aTe + double p[3]; // lA*rhat // distance of closest approach correction - double aTs[3][3]; // A1'*S1^2 - double gamma[3][3]; // A1'*S1^2*A - double lAtwo[3][3][3]; // A1'*S1^2*wi.lA + double aTs[3][3]; // A1'*S1^2 + double gamma[3][3]; // A1'*S1^2*A + double lAtwo[3][3][3]; // A1'*S1^2*wi.lA double scorrect[3]; - double half_sigma=sigma[type[i]][type[j]] / 2.0; - scorrect[0] = shape1[type[i]][0]+half_sigma; - scorrect[1] = shape1[type[i]][1]+half_sigma; - scorrect[2] = shape1[type[i]][2]+half_sigma; + double half_sigma = sigma[type[i]][type[j]] / 2.0; + scorrect[0] = shape1[type[i]][0] + half_sigma; + scorrect[1] = shape1[type[i]][1] + half_sigma; + scorrect[2] = shape1[type[i]][2] + half_sigma; scorrect[0] = scorrect[0] * scorrect[0] / 2.0; scorrect[1] = scorrect[1] * scorrect[1] / 2.0; scorrect[2] = scorrect[2] * scorrect[2] / 2.0; - MathExtra::transpose_diag3(wi.A,scorrect,aTs); - MathExtra::times3(aTs,wi.A,gamma); - for (int ii=0; ii<3; ii++) - MathExtra::times3(aTs,wi.lA[ii],lAtwo[ii]); + MathExtra::transpose_diag3(wi.A, scorrect, aTs); + MathExtra::times3(aTs, wi.A, gamma); + for (int ii = 0; ii < 3; ii++) MathExtra::times3(aTs, wi.lA[ii], lAtwo[ii]); - rnorm=sqrt(rsq); - rhat[0] = r[0]/rnorm; - rhat[1] = r[1]/rnorm; - rhat[2] = r[2]/rnorm; + rnorm = sqrt(rsq); + rhat[0] = r[0] / rnorm; + rhat[1] = r[1] / rnorm; + rhat[2] = r[2] / rnorm; // energy - int ierror = MathExtra::mldivide3(gamma,rhat,s); - if (ierror) error->all(FLERR,"Bad matrix inversion in mldivide3"); + int ierror = MathExtra::mldivide3(gamma, rhat, s); + if (ierror) error->all(FLERR, "Bad matrix inversion in mldivide3"); - sigma12 = 1.0/sqrt(0.5*MathExtra::dot3(s,rhat)); + sigma12 = 1.0 / sqrt(0.5 * MathExtra::dot3(s, rhat)); double temp[3][3]; - MathExtra::times3(wi.aTe,wi.A,temp); + MathExtra::times3(wi.aTe, wi.A, temp); temp[0][0] += 1.0; temp[1][1] += 1.0; temp[2][2] += 1.0; - ierror = MathExtra::mldivide3(temp,rhat,w); - if (ierror) error->all(FLERR,"Bad matrix inversion in mldivide3"); + ierror = MathExtra::mldivide3(temp, rhat, w); + if (ierror) error->all(FLERR, "Bad matrix inversion in mldivide3"); - h12 = rnorm-sigma12; - chi = 2.0*MathExtra::dot3(rhat,w); - sigh = sigma[type[i]][type[j]]/h12; - tprod = chi*sigh; + h12 = rnorm - sigma12; + chi = 2.0 * MathExtra::dot3(rhat, w); + sigh = sigma[type[i]][type[j]] / h12; + tprod = chi * sigh; - h12p3 = pow(h12,3.0); - double sigmap3 = pow(sigma[type[i]][type[j]],3.0); - double stemp = h12/2.0; - Ua = (shape1[type[i]][0]+stemp)*(shape1[type[i]][1]+stemp)* - (shape1[type[i]][2]+stemp)*h12p3/8.0; - Ua = (1.0+3.0*tprod)*lshape[type[i]]/Ua; - Ua = epsilon[type[i]][type[j]]*Ua*sigmap3*solv_f_a; + h12p3 = pow(h12, 3.0); + double sigmap3 = pow(sigma[type[i]][type[j]], 3.0); + double stemp = h12 / 2.0; + Ua = (shape1[type[i]][0] + stemp) * (shape1[type[i]][1] + stemp) * (shape1[type[i]][2] + stemp) * + h12p3 / 8.0; + Ua = (1.0 + 3.0 * tprod) * lshape[type[i]] / Ua; + Ua = epsilon[type[i]][type[j]] * Ua * sigmap3 * solv_f_a; - stemp = h12/cr60; - Ur = (shape1[type[i]][0]+stemp)*(shape1[type[i]][1]+stemp)* - (shape1[type[i]][2]+stemp)*h12p3/60.0; - Ur = (1.0+b_alpha*tprod)*lshape[type[i]]/Ur; - Ur = epsilon[type[i]][type[j]]*Ur*sigmap3*pow(sigh,6.0)*solv_f_r; + stemp = h12 / cr60; + Ur = (shape1[type[i]][0] + stemp) * (shape1[type[i]][1] + stemp) * (shape1[type[i]][2] + stemp) * + h12p3 / 60.0; + Ur = (1.0 + b_alpha * tprod) * lshape[type[i]] / Ur; + Ur = epsilon[type[i]][type[j]] * Ur * sigmap3 * pow(sigh, 6.0) * solv_f_r; // force - sec = sigma[type[i]][type[j]]*chi; - sigma12p3 = pow(sigma12,3.0); - fourw[0] = 4.0*w[0]; - fourw[1] = 4.0*w[1]; - fourw[2] = 4.0*w[2]; - spr[0] = 0.5*sigma12p3*s[0]; - spr[1] = 0.5*sigma12p3*s[1]; - spr[2] = 0.5*sigma12p3*s[2]; + sec = sigma[type[i]][type[j]] * chi; + sigma12p3 = pow(sigma12, 3.0); + fourw[0] = 4.0 * w[0]; + fourw[1] = 4.0 * w[1]; + fourw[2] = 4.0 * w[2]; + spr[0] = 0.5 * sigma12p3 * s[0]; + spr[1] = 0.5 * sigma12p3 * s[1]; + spr[2] = 0.5 * sigma12p3 * s[2]; - stemp = 1.0/(shape1[type[i]][0]*2.0+h12)+ - 1.0/(shape1[type[i]][1]*2.0+h12)+ - 1.0/(shape1[type[i]][2]*2.0+h12)+ - 3.0/h12; - hsec = h12+3.0*sec; - dspu = 1.0/h12-1.0/hsec+stemp; - pbsu = 3.0*sigma[type[i]][type[j]]/hsec; + stemp = 1.0 / (shape1[type[i]][0] * 2.0 + h12) + 1.0 / (shape1[type[i]][1] * 2.0 + h12) + + 1.0 / (shape1[type[i]][2] * 2.0 + h12) + 3.0 / h12; + hsec = h12 + 3.0 * sec; + dspu = 1.0 / h12 - 1.0 / hsec + stemp; + pbsu = 3.0 * sigma[type[i]][type[j]] / hsec; - stemp = 1.0/(shape1[type[i]][0]*cr60+h12)+ - 1.0/(shape1[type[i]][1]*cr60+h12)+ - 1.0/(shape1[type[i]][2]*cr60+h12)+ - 3.0/h12; - hsec = h12+b_alpha*sec; - dspr = 7.0/h12-1.0/hsec+stemp; - pbsr = b_alpha*sigma[type[i]][type[j]]/hsec; + stemp = 1.0 / (shape1[type[i]][0] * cr60 + h12) + 1.0 / (shape1[type[i]][1] * cr60 + h12) + + 1.0 / (shape1[type[i]][2] * cr60 + h12) + 3.0 / h12; + hsec = h12 + b_alpha * sec; + dspr = 7.0 / h12 - 1.0 / hsec + stemp; + pbsr = b_alpha * sigma[type[i]][type[j]] / hsec; - for (int m=0; m<3; m++) { - u[0] = -rhat[m]*rhat[0]; - u[1] = -rhat[m]*rhat[1]; - u[2] = -rhat[m]*rhat[2]; + for (int m = 0; m < 3; m++) { + u[0] = -rhat[m] * rhat[0]; + u[1] = -rhat[m] * rhat[1]; + u[2] = -rhat[m] * rhat[2]; u[m] += 1.0; u[0] /= rnorm; u[1] /= rnorm; u[2] /= rnorm; - dchi = MathExtra::dot3(u,fourw); - dh12 = rhat[m]+MathExtra::dot3(u,spr); - dUa = pbsu*dchi-dh12*dspu; - dUr = pbsr*dchi-dh12*dspr; - fforce[m]=dUr*Ur+dUa*Ua; + dchi = MathExtra::dot3(u, fourw); + dh12 = rhat[m] + MathExtra::dot3(u, spr); + dUa = pbsu * dchi - dh12 * dspu; + dUr = pbsr * dchi - dh12 * dspr; + fforce[m] = dUr * Ur + dUa * Ua; } // torque on i if (calc_torque) { - MathExtra::vecmat(fourw,wi.aTe,fwae); + MathExtra::vecmat(fourw, wi.aTe, fwae); - for (int m=0; m<3; m++) { - MathExtra::matvec(wi.lA[m],rhat,p); + for (int m = 0; m < 3; m++) { + MathExtra::matvec(wi.lA[m], rhat, p); double tempv[3]; - MathExtra::matvec(wi.lA[m],w,tempv); - dchi = -MathExtra::dot3(fwae,tempv); - MathExtra::matvec(lAtwo[m],spr,tempv); - dh12 = -MathExtra::dot3(s,tempv); + MathExtra::matvec(wi.lA[m], w, tempv); + dchi = -MathExtra::dot3(fwae, tempv); + MathExtra::matvec(lAtwo[m], spr, tempv); + dh12 = -MathExtra::dot3(s, tempv); - dUa = pbsu*dchi-dh12*dspu; - dUr = pbsr*dchi-dh12*dspr; - ttor[m] = -(dUa*Ua+dUr*Ur); + dUa = pbsu * dchi - dh12 * dspu; + dUr = pbsr * dchi - dh12 * dspr; + ttor[m] = -(dUa * Ua + dUr * Ur); } } - return Ua+Ur; + return Ua + Ur; } From 01503535f4b229b2070ad26bd4cd1c948f6a6dc1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 10:48:09 -0400 Subject: [PATCH 294/352] remove unused symlinks --- examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full | 1 - examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC | 1 - 2 files changed, 2 deletions(-) delete mode 120000 examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full delete mode 120000 examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC diff --git a/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full deleted file mode 120000 index 6b829c2157..0000000000 --- a/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CC.KC-full +++ /dev/null @@ -1 +0,0 @@ -../../../../potentials/CC.KC-full \ No newline at end of file diff --git a/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC b/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC deleted file mode 120000 index 74f7f340e5..0000000000 --- a/examples/PACKAGES/interlayer/kolmogorov_crespi_full/CH.KC +++ /dev/null @@ -1 +0,0 @@ -../../../../potentials/CH.KC \ No newline at end of file From 95a2041df30973f3a4b2344fe2f9445f6fb0c50f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 10:48:51 -0400 Subject: [PATCH 295/352] reformat potential file headers to comply with LAMMPS' conventions --- potentials/BNCH-old.ILP | 2 +- potentials/BNCH.ILP | 2 +- potentials/BNC_MBD_bulk.ILP | 2 +- potentials/BNC_TS_bulk.ILP | 2 +- potentials/CC.KC-full | 5 +---- potentials/CH.KC | 3 +-- potentials/CH_taper.KC | 11 +++++------ 7 files changed, 11 insertions(+), 16 deletions(-) diff --git a/potentials/BNCH-old.ILP b/potentials/BNCH-old.ILP index 2830172a86..2f98de2261 100644 --- a/potentials/BNCH-old.ILP +++ b/potentials/BNCH-old.ILP @@ -1,6 +1,6 @@ +# DATE: 2020-01-16 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: J. Chem.Theory Comput. 2016, 12, 2896-905 and J. Phys. Chem. C 2017, 121, 22826-22835 # Interlayer Potential (ILP) for bilayer graphene/graphene, graphene/hBN and hBN/hBN junctions # The parameters below are fitted against the HSE + MBD DFT reference data from 3.1 A to 15 A. -# Cite J. Chem.Theory Comput. 2016, 12, 2896-905 and J. Phys. Chem. C 2017, 121, 22826-22835. # beta alpha delta epsilon C d sR reff C6 S rcut C C 3.22 9.200 1.20 0.010 0.800 15.0 0.704 3.586 522.915 43.363442016573508 2.0 diff --git a/potentials/BNCH.ILP b/potentials/BNCH.ILP index eb15c35e0b..3c097d91bf 100644 --- a/potentials/BNCH.ILP +++ b/potentials/BNCH.ILP @@ -1,6 +1,6 @@ +# DATE: 2020-01-16 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: Ouyang, Mandelli, Urbakh, Hod, Nano Letters 18, 6009-6016 (2018). # Interlayer Potential (ILP) for bilayer graphene/graphene, graphene/hBN and hBN/hBN junctions # The parameters below are fitted against the HSE + MBD DFT reference data from 2.5 A to 15 A. -# Cite as W. Ouyang, D. Mandelli, M. Urbakh and O. Hod, Nano Letters 18, 6009-6016 (2018). # # ----------------- Repulsion Potential ------------------++++++++++++++ Vdw Potential ++++++++++++++++************ # beta(A) alpha delta(A) epsilon(meV) C(meV) d sR reff(A) C6(meV*A^6) S rcut diff --git a/potentials/BNC_MBD_bulk.ILP b/potentials/BNC_MBD_bulk.ILP index 9093f01447..381cb0359a 100644 --- a/potentials/BNC_MBD_bulk.ILP +++ b/potentials/BNC_MBD_bulk.ILP @@ -1,6 +1,6 @@ +# DATE: 2020-01-16 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: W. Ouyang et al., J. Chem. Theory Comput. 16(1), 666-676 (2020) # Interlayer Potential (ILP) for graphite, bulk-hBN and their heterojunctions # The parameters below are fitted against the HSE + MBD DFT reference data from 2 A to 10 A. -# Cite as W. Ouyang et al., J. Chem. Theory Comput. 16(1), 666-676 (2020). # # ------------------------------ Repulsion Potential --------------------++++++++++++++ Vdw Potential ++++++++++++++++************ # MBD-HSE beta(A) alpha delta(A) epsilon(meV) C(meV) d sR reff(A) C6(meV*A^6) S rcut diff --git a/potentials/BNC_TS_bulk.ILP b/potentials/BNC_TS_bulk.ILP index 13de8b25fc..b0bf3cd800 100644 --- a/potentials/BNC_TS_bulk.ILP +++ b/potentials/BNC_TS_bulk.ILP @@ -1,6 +1,6 @@ +# DATE: 2020-01-16 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: W. Ouyang et al., J. Chem. Theory Comput. 16(1), 666-676 (2020) # Interlayer Potential (ILP) for graphite, bulk-hBN and their heterojunctions # The parameters below are fitted against the HSE + TS DFT reference data from 2 A to 10 A. -# Cite as W. Ouyang et al., J. Chem. Theory Comput. 16(1), 666-676 (2020). # # ------------------------------ Repulsion Potential ------------------++++++++++++++ Vdw Potential ++++++++++++++++************ # TS-HSE beta(A) alpha delta(A) epsilon(meV) C(meV) d sR reff(A) C6(meV*A^6) S rcut diff --git a/potentials/CC.KC-full b/potentials/CC.KC-full index a3bf302fe0..fee2f6a5ef 100644 --- a/potentials/CC.KC-full +++ b/potentials/CC.KC-full @@ -1,8 +1,5 @@ +# DATE: 2018-03-23 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: Kolmogorov, Crespi, Physical Review B 71, 235415 (2005) # Kolmogorov-Crespi Potential # -# Cite as A.N. Kolmogorov & V. H. Crespi, -# Registry-dependent interlayer potential for graphitic systems -# Physical Review B 71, 235415 (2005) -# # z0 C0 C2 C4 C delta lambda A S rcut C C 3.34 15.71 12.29 4.933 3.030 0.578 3.629 10.238 1.0 2.0 diff --git a/potentials/CH.KC b/potentials/CH.KC index 029f682f34..bfab2954df 100644 --- a/potentials/CH.KC +++ b/potentials/CH.KC @@ -1,7 +1,6 @@ +# DATE: 2018-09-12 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: Ouyang, Mandelli, Urbakh, Hod, Nano Letters 18, 6009-6016 (2018). # Refined parameters for Kolmogorov-Crespi Potential without taper function # -# Cite as W. Ouyang, D. Mandelli, M. Urbakh and O. Hod, Nano Letters 18, 6009-6016 (2018). -# # z0 C0 C2 C4 C delta lambda A S rcut C C 3.328819 21.847167 12.060173 4.711099 6.678908e-4 0.7718101 3.143921 12.660270 1.0 2.0 C H 3.156492 37.400478 8.3910462e-3 55.06177 5.176215e-5 0.4437309 2.508847 11.479055 1.0 1.5 diff --git a/potentials/CH_taper.KC b/potentials/CH_taper.KC index 0f08b2e6dd..0043b1b9d0 100644 --- a/potentials/CH_taper.KC +++ b/potentials/CH_taper.KC @@ -1,10 +1,9 @@ +# DATE: 2018-09-12 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: W. Ouyang, D. Mandelli, M. Urbakh and O. Hod, Nano Letters 18, 6009-6016 (2018). # Refined parameters for Kolmogorov-Crespi Potential with taper function # -# Cite as W. Ouyang, D. Mandelli, M. Urbakh and O. Hod, Nano Letters 18, 6009-6016 (2018). -# # z0 C0 C2 C4 C delta lambda A S rcut -C C 3.416084 20.021583 10.9055107 4.2756354 1.0010836E-2 0.8447122 2.9360584 14.3132588 1.0 2.0 -C H 2.849054 72.557245 1.0164169E-2 65.923312 8.7962504E-5 0.3349237 3.0402632 14.7533201 1.0 1.5 -H H 2.187478 3.915802E-5 5.0896431E-5 3.6657827 1.5373722446 0.9633581 0.4249989 1.570737E-4 1.0 1.2 -H C 2.849054 72.557245 1.0164169E-2 65.923312 8.7962504E-5 0.3349237 3.0402632 14.7533201 1.0 2.2 +C C 3.416084 20.021583 10.9055107 4.2756354 1.0010836E-2 0.8447122 2.9360584 14.3132588 1.0 2.0 +C H 2.849054 72.557245 1.0164169E-2 65.923312 8.7962504E-5 0.3349237 3.0402632 14.7533201 1.0 1.5 +H H 2.187478 3.915802E-5 5.0896431E-5 3.6657827 1.5373722446 0.9633581 0.4249989 1.570737E-4 1.0 1.2 +H C 2.849054 72.557245 1.0164169E-2 65.923312 8.7962504E-5 0.3349237 3.0402632 14.7533201 1.0 2.2 From 18cc43a560f4b481e7fb6f1a90d9e836460041a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 12:04:58 -0400 Subject: [PATCH 296/352] extend ArgInfo class to also accept "i2_name" and "d2_name" --- doc/src/Developer_utils.rst | 9 ++-- src/arg_info.cpp | 10 +++-- unittest/utils/test_argutils.cpp | 70 ++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 8 deletions(-) diff --git a/doc/src/Developer_utils.rst b/doc/src/Developer_utils.rst index 44210218c0..60eded42e0 100644 --- a/doc/src/Developer_utils.rst +++ b/doc/src/Developer_utils.rst @@ -334,10 +334,11 @@ arguments of commands in LAMMPS are parsed and to make abstractions of repetitive tasks. The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction -for parsing references to compute or fix styles or variables. These -would start with a "c\_", "f\_", "v\_" followed by the ID or name of -than instance and may be postfixed with one or two array indices -"[]" with numbers > 0. +for parsing references to compute or fix styles, variables or custom +integer or double properties handled by :doc:`fix property/atom `. +These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2_" +followed by the ID or name of than instance and may be postfixed with +one or two array indices "[]" with numbers > 0. A typical code segment would look like this: diff --git a/src/arg_info.cpp b/src/arg_info.cpp index a274b47b92..5063b6b471 100644 --- a/src/arg_info.cpp +++ b/src/arg_info.cpp @@ -30,7 +30,8 @@ using namespace LAMMPS_NS; ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), index1(-1), index2(-1) { - if ((arg.size() > 2) && (arg[1] == '_')) { + if (((arg.size() > 3) && (arg[1] == '2') && (arg[2] == '_')) + || ((arg.size() > 2) && (arg[1] == '_'))) { if ((arg[0] == 'c') && (allowed & COMPUTE)) type = COMPUTE; else if ((arg[0] == 'f') && (allowed & FIX)) @@ -46,10 +47,11 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde name = arg; return; } + const int offset = (arg[1] == '_') ? 2 : 3; - std::size_t has_idx1 = arg.find('[', 2); + std::size_t has_idx1 = arg.find('[', offset); if (has_idx1 != std::string::npos) { - name = arg.substr(2, has_idx1 - 2); + name = arg.substr(offset, has_idx1 - offset); dim = 1; std::size_t has_idx2 = arg.find('[', has_idx1 + 1); @@ -79,7 +81,7 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), inde } } else { index1 = 0; - name = arg.substr(2); + name = arg.substr(offset); } } else { index1 = 0; diff --git a/unittest/utils/test_argutils.cpp b/unittest/utils/test_argutils.cpp index a527df6fe7..c5ef19bc10 100644 --- a/unittest/utils/test_argutils.cpp +++ b/unittest/utils/test_argutils.cpp @@ -169,6 +169,16 @@ TEST(ArgInfo, variable2) ASSERT_THAT(arg.get_name(), StrEq("x")); } +TEST(ArgInfo, variable3) +{ + ArgInfo arg("v_x[11][5]"); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::VARIABLE); + ASSERT_EQ(arg.get_index1(), 11); + ASSERT_EQ(arg.get_index2(), 5); + ASSERT_THAT(arg.get_name(), StrEq("x")); +} + TEST(ArgInfo, dname0) { ArgInfo arg("d_text", ArgInfo::DNAME); @@ -179,6 +189,36 @@ TEST(ArgInfo, dname0) ASSERT_THAT(arg.get_name(), StrEq("text")); } +TEST(ArgInfo, dname1) +{ + ArgInfo arg("d2_text", ArgInfo::DNAME | ArgInfo::INAME); + ASSERT_EQ(arg.get_dim(), 0); + ASSERT_EQ(arg.get_type(), ArgInfo::DNAME); + ASSERT_EQ(arg.get_index1(), 0); + ASSERT_EQ(arg.get_index2(), -1); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, dname2) +{ + ArgInfo arg("d2_text[11]", ArgInfo::DNAME); + ASSERT_EQ(arg.get_dim(), 1); + ASSERT_EQ(arg.get_type(), ArgInfo::DNAME); + ASSERT_EQ(arg.get_index1(), 11); + ASSERT_EQ(arg.get_index2(), -1); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, dname3) +{ + ArgInfo arg("d2_text[24][11]", ArgInfo::DNAME); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::DNAME); + ASSERT_EQ(arg.get_index1(), 24); + ASSERT_EQ(arg.get_index2(), 11); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + TEST(ArgInfo, iname0) { ArgInfo arg("i_text", ArgInfo::INAME); @@ -189,6 +229,36 @@ TEST(ArgInfo, iname0) ASSERT_THAT(arg.get_name(), StrEq("text")); } +TEST(ArgInfo, iname1) +{ + ArgInfo arg("i2_text", ArgInfo::INAME); + ASSERT_EQ(arg.get_dim(), 0); + ASSERT_EQ(arg.get_type(), ArgInfo::INAME); + ASSERT_EQ(arg.get_index1(), 0); + ASSERT_EQ(arg.get_index2(), -1); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, iname2) +{ + ArgInfo arg("i2_text[2]", ArgInfo::INAME | ArgInfo::DNAME); + ASSERT_EQ(arg.get_dim(), 1); + ASSERT_EQ(arg.get_type(), ArgInfo::INAME); + ASSERT_EQ(arg.get_index1(), 2); + ASSERT_EQ(arg.get_index2(), -1); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + +TEST(ArgInfo, iname3) +{ + ArgInfo arg("i2_text[2][100]", ArgInfo::INAME | ArgInfo::DNAME); + ASSERT_EQ(arg.get_dim(), 2); + ASSERT_EQ(arg.get_type(), ArgInfo::INAME); + ASSERT_EQ(arg.get_index1(), 2); + ASSERT_EQ(arg.get_index2(), 100); + ASSERT_THAT(arg.get_name(), StrEq("text")); +} + TEST(ArgInfo, unsupported1) { ArgInfo arg("v_text[02][05]", ArgInfo::COMPUTE | ArgInfo::FIX); From 9fa255b3ff6030615d647fc834a97b4f0ba95238 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Aug 2021 10:09:39 -0600 Subject: [PATCH 297/352] Fix issue when building Kokkos with CMake --- cmake/Modules/Packages/KOKKOS.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index aea766b79c..a557c42438 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -74,7 +74,7 @@ else() target_link_libraries(lammps PRIVATE kokkos) target_link_libraries(lmp PRIVATE kokkos) endif() -target_compile_definitions(lammps PRIVATE -DLMP_KOKKOS) +target_compile_definitions(lammps PUBLIC -DLMP_KOKKOS) set(KOKKOS_PKG_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/KOKKOS) set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp @@ -127,4 +127,4 @@ endif() get_property(KOKKOS_PKG_SOURCES GLOBAL PROPERTY KOKKOS_PKG_SOURCES) target_sources(lammps PRIVATE ${KOKKOS_PKG_SOURCES}) -target_include_directories(lammps PRIVATE ${KOKKOS_PKG_SOURCES_DIR}) +target_include_directories(lammps PUBLIC ${KOKKOS_PKG_SOURCES_DIR}) From d3212029088cf6685a4561604fbf947540732dd6 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 17 Aug 2021 10:27:50 -0600 Subject: [PATCH 298/352] Add change from @junghans --- cmake/Modules/Packages/KOKKOS.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index a557c42438..2a47881706 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -127,4 +127,4 @@ endif() get_property(KOKKOS_PKG_SOURCES GLOBAL PROPERTY KOKKOS_PKG_SOURCES) target_sources(lammps PRIVATE ${KOKKOS_PKG_SOURCES}) -target_include_directories(lammps PUBLIC ${KOKKOS_PKG_SOURCES_DIR}) +target_include_directories(lammps PUBLIC $) From 8b8cce4399d06d30193571ed936655d6d5c2f1de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 14:12:50 -0400 Subject: [PATCH 299/352] add unit test YAML file for DRIP pair style --- .../tests/manybody-pair-drip.yaml | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 unittest/force-styles/tests/manybody-pair-drip.yaml diff --git a/unittest/force-styles/tests/manybody-pair-drip.yaml b/unittest/force-styles/tests/manybody-pair-drip.yaml new file mode 100644 index 0000000000..7a8966cac8 --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-drip.yaml @@ -0,0 +1,125 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Tue Aug 17 14:10:50 2021 +epsilon: 5e-14 +skip_tests: single +prerequisites: ! | + pair drip + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay drip +pair_coeff: ! | + * * drip C.drip C C C +extract: ! "" +natoms: 48 +init_vdwl: -1.1171061429439093 +init_coul: 0 +init_stress: ! |- + -6.9372049706365035e-01 -6.9064113154966333e-01 1.1515233668963607e+00 0.0 0.0 -1.4292420626121039e-02 +init_forces: ! |2 + 1 1.4969082430352958e-03 -3.2939836241196573e-05 -1.3240430862322900e-02 + 2 8.0767187286290179e-04 1.0588928659053852e-03 -3.1123566690577253e-02 + 3 -3.4497099855045673e-04 3.4248846132303140e-05 -1.0175437155229471e-02 + 4 -2.4589156252144417e-04 1.8156645561760292e-05 -2.9695125191752228e-02 + 5 1.4969082430352932e-03 -3.2939836241182343e-05 -1.3240430862323165e-02 + 6 8.0767187286288694e-04 1.0588928659049949e-03 -3.1123566690577420e-02 + 7 -3.4497099855038821e-04 3.4248846132523362e-05 -1.0175437155229110e-02 + 8 -2.4589156252142683e-04 1.8156645561707817e-05 -2.9695125191752388e-02 + 9 -1.3423014800966740e-04 7.4485503462573500e-08 -1.0127230298720345e-02 + 10 -1.2282979196216780e-04 -5.3179137282562149e-06 -2.9857221873835556e-02 + 11 1.3420646745295351e-04 7.2570324572774139e-08 -1.0127289412755367e-02 + 12 1.2281957667447806e-04 -5.2981576756526129e-06 -2.9857246714720800e-02 + 13 -1.3423014800966089e-04 7.4485503475472118e-08 -1.0127230298720606e-02 + 14 -1.2282979196215913e-04 -5.3179137286977698e-06 -2.9857221873835549e-02 + 15 1.3420646745295687e-04 7.2570324835217239e-08 -1.0127289412755180e-02 + 16 1.2281957667447502e-04 -5.2981576756378754e-06 -2.9857246714720957e-02 + 17 3.4500424726267094e-04 3.4247597717764226e-05 -1.0175497243327751e-02 + 18 2.4590943990438825e-04 1.8176873676577221e-05 -2.9695147824251051e-02 + 19 -1.4969178111888977e-03 -3.2939169475935731e-05 -1.3240431836380913e-02 + 20 -8.0767953495986997e-04 1.0588933379664879e-03 -3.1123564482199977e-02 + 21 3.4500424726266232e-04 3.4247597717770589e-05 -1.0175497243328002e-02 + 22 2.4590943990438212e-04 1.8176873676178533e-05 -2.9695147824251072e-02 + 23 -1.4969178111887745e-03 -3.2939169475980779e-05 -1.3240431836380712e-02 + 24 -8.0767953495988450e-04 1.0588933379664870e-03 -3.1123564482199943e-02 + 25 -3.4497099855045933e-04 -3.4248846132324567e-05 1.0175437155229457e-02 + 26 8.0767187286290309e-04 -1.0588928659053826e-03 3.1123566690577247e-02 + 27 1.4969082430351102e-03 3.2939836241083992e-05 1.3240430862322843e-02 + 28 -2.4589156252142509e-04 -1.8156645561688708e-05 2.9695125191752263e-02 + 29 -3.4497099855046193e-04 -3.4248846132538534e-05 1.0175437155229280e-02 + 30 8.0767187286257902e-04 -1.0588928659051909e-03 3.1123566690576712e-02 + 31 1.4969082430352915e-03 3.2939836241593784e-05 1.3240430862323165e-02 + 32 -2.4589156252143897e-04 -1.8156645561741183e-05 2.9695125191752519e-02 + 33 1.3420646745296197e-04 -7.2570324595813435e-08 1.0127289412755341e-02 + 34 -1.2282979196217170e-04 5.3179137282585121e-06 2.9857221873835549e-02 + 35 -1.3423014800966349e-04 -7.4485503448870201e-08 1.0127230298720332e-02 + 36 1.2281957667447611e-04 5.2981576756533134e-06 2.9857246714720946e-02 + 37 1.3420646745295709e-04 -7.2570324815599003e-08 1.0127289412755423e-02 + 38 -1.2282979196223502e-04 5.3179137282683716e-06 2.9857221873835008e-02 + 39 -1.3423014800966436e-04 -7.4485503047341829e-08 1.0127230298720473e-02 + 40 1.2281957667448912e-04 5.2981576756629069e-06 2.9857246714721068e-02 + 41 -1.4969178111890833e-03 3.2939169476025510e-05 1.3240431836380942e-02 + 42 2.4590943990438738e-04 -1.8176873676568727e-05 2.9695147824251211e-02 + 43 3.4500424726266921e-04 -3.4247597717747861e-05 1.0175497243327740e-02 + 44 -8.0767953495988342e-04 -1.0588933379665052e-03 3.1123564482200137e-02 + 45 -1.4969178111890772e-03 3.2939169475814605e-05 1.3240431836381151e-02 + 46 2.4590943990439947e-04 -1.8176873676638302e-05 2.9695147824250822e-02 + 47 3.4500424726267181e-04 -3.4247597717339300e-05 1.0175497243327872e-02 + 48 -8.0767953495988081e-04 -1.0588933379665191e-03 3.1123564482200175e-02 +run_vdwl: -1.117107802396835 +run_coul: 0 +run_stress: ! |- + -6.9372331738514981e-01 -6.9064389597684106e-01 1.1514755915204005e+00 0.0 0.0 -1.4292266024218578e-02 +run_forces: ! |2 + 1 1.4968783498999268e-03 -3.2942052376323016e-05 -1.3240066826206463e-02 + 2 8.0765258918550525e-04 1.0588876993623385e-03 -3.1122680612106914e-02 + 3 -3.4497601095719033e-04 3.4248722599748424e-05 -1.0175117216209249e-02 + 4 -2.4589406964898274e-04 1.8152777475380989e-05 -2.9694273916151235e-02 + 5 1.4968783498999624e-03 -3.2942052376244425e-05 -1.3240066826206844e-02 + 6 8.0765258918545808e-04 1.0588876993621239e-03 -3.1122680612107538e-02 + 7 -3.4497601095719900e-04 3.4248722599828465e-05 -1.0175117216209020e-02 + 8 -2.4589406964903478e-04 1.8152777475390449e-05 -2.9694273916151363e-02 + 9 -1.3423039571159017e-04 7.4352071961005858e-08 -1.0126910355491514e-02 + 10 -1.2282852371682442e-04 -5.3193547176900636e-06 -2.9856374341201718e-02 + 11 1.3420671579929917e-04 7.2436845184776077e-08 -1.0126969468728588e-02 + 12 1.2281830883230783e-04 -5.2995986749039537e-06 -2.9856399181457216e-02 + 13 -1.3423039571157673e-04 7.4352071584718248e-08 -1.0126910355491585e-02 + 14 -1.2282852371668521e-04 -5.3193547179922104e-06 -2.9856374341201371e-02 + 15 1.3420671579938970e-04 7.2436845150855372e-08 -1.0126969468727908e-02 + 16 1.2281830883232204e-04 -5.2995986749016624e-06 -2.9856399181457466e-02 + 17 3.4500925912102327e-04 3.4247474141055654e-05 -1.0175177303529336e-02 + 18 2.4591194664583894e-04 1.8173005537505662e-05 -2.9694296547973523e-02 + 19 -1.4968879181501723e-03 -3.2941385606868446e-05 -1.3240067800288987e-02 + 20 -8.0766025129906183e-04 1.0588881713794161e-03 -3.1122678403683279e-02 + 21 3.4500925912095290e-04 3.4247474141253548e-05 -1.0175177303529138e-02 + 22 2.4591194664620069e-04 1.8173005537513167e-05 -2.9694296547973627e-02 + 23 -1.4968879181501166e-03 -3.2941385606789733e-05 -1.3240067800288646e-02 + 24 -8.0766025129901347e-04 1.0588881713797244e-03 -3.1122678403683594e-02 + 25 -3.4497543410367832e-04 -3.4248542243049007e-05 1.0175095227569254e-02 + 26 8.0765525409005174e-04 -1.0588882853031821e-03 3.1122706902410268e-02 + 27 1.4968776819200879e-03 3.2942887158314040e-05 1.3240038417764373e-02 + 28 -2.4589307728119323e-04 -1.8153131107501511e-05 2.9694296702257997e-02 + 29 -3.4497543410356470e-04 -3.4248542242962311e-05 1.0175095227569283e-02 + 30 8.0765525408991665e-04 -1.0588882853032810e-03 3.1122706902410369e-02 + 31 1.4968776819200670e-03 3.2942887158584385e-05 1.3240038417764520e-02 + 32 -2.4589307728105619e-04 -1.8153131107580197e-05 2.9694296702258274e-02 + 33 1.3420649407712329e-04 -7.2457679971971299e-08 1.0126947778852728e-02 + 34 -1.2282857182875856e-04 5.3192999898934757e-06 2.9856397351700922e-02 + 35 -1.3423017399030691e-04 -7.4372916307303659e-08 1.0126888665729796e-02 + 36 1.2281835687551147e-04 5.2995439452943477e-06 2.9856422192021229e-02 + 37 1.3420649407688346e-04 -7.2457680016867857e-08 1.0126947778853273e-02 + 38 -1.2282857182861024e-04 5.3192999901346361e-06 2.9856397351700859e-02 + 39 -1.3423017399036286e-04 -7.4372916328267513e-08 1.0126888665730093e-02 + 40 1.2281835687550854e-04 5.2995439452834599e-06 2.9856422192021292e-02 + 41 -1.4968872501543050e-03 3.2942220392413755e-05 1.3240039391837519e-02 + 42 2.4591095432896623e-04 -1.8173359176526104e-05 2.9694319334136906e-02 + 43 3.4500868225182334e-04 -3.4247293770650532e-05 1.0175155314768796e-02 + 44 -8.0766291618553391e-04 -1.0588887573257195e-03 3.1122704693977713e-02 + 45 -1.4968872501544524e-03 3.2942220392554349e-05 1.3240039391837150e-02 + 46 2.4591095432885027e-04 -1.8173359176560751e-05 2.9694319334136628e-02 + 47 3.4500868225184405e-04 -3.4247293770696435e-05 1.0175155314768848e-02 + 48 -8.0766291618553099e-04 -1.0588887573256150e-03 3.1122704693978008e-02 +... From 6d53cd1986cf604dda5cbfc31f13dbc854747d74 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 14:50:15 -0400 Subject: [PATCH 300/352] refactor potential file reader in pair style drip --- src/INTERLAYER/pair_drip.cpp | 268 +++++++++++++++-------------------- src/INTERLAYER/pair_drip.h | 5 +- 2 files changed, 119 insertions(+), 154 deletions(-) diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index 71281623ac..12af4eb9c8 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -31,6 +31,8 @@ #include "neigh_list.h" #include "neigh_request.h" #include "neighbor.h" +#include "potential_file_reader.h" +#include "tokenizer.h" #include #include @@ -94,11 +96,11 @@ void PairDRIP::init_style() void PairDRIP::allocate() { allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes+1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - map = new int[n+1]; + memory->create(setflag,n,n,"pair:setflag"); + memory->create(cutsq,n,n,"pair:cutsq"); + map = new int[n]; } /* ---------------------------------------------------------------------- @@ -150,129 +152,92 @@ double PairDRIP::init_one(int i, int j) void PairDRIP::read_file(char *filename) { - int params_per_line = 15; - char **words = new char*[params_per_line+1]; memory->sfree(params); - int nparams = 0; - int maxparam = 0; + params = nullptr; + nparams = maxparam = 0; // open file on proc 0 - FILE *fp; if (comm->me == 0) { - fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) - error->one(FLERR,"Cannot open DRIP potential file {}: {}",filename,utils::getsyserror()); - } + PotentialFileReader reader(lmp, filename, "drip", unit_convert_flag); + char *line; - // read each line out of file, skipping blank lines or leading '#' - // store line of params if all 3 element tags are in element list + while ((line = reader.next_line(NPARAMS_PER_LINE))) { - int i,j,n,m,nwords,ielement,jelement; - char line[MAXLINE],*ptr; - int eof = 0; + try { + ValueTokenizer values(line); - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); + std::string iname = values.next_string(); + std::string jname = values.next_string(); - // strip comment, skip line if blank + // ielement,jelement = 1st args + // if both args are in element list, then parse this line + // else skip to next entry in file + int ielement, jelement; - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + for (ielement = 0; ielement < nelements; ielement++) + if (iname == elements[ielement]) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (jname == elements[jelement]) break; + if (jelement == nelements) continue; - // concatenate additional lines until have params_per_line words + // expand storage, if needed - while (nwords < params_per_line) { - n = strlen(line); - if (comm->me == 0) { - ptr = fgets(&line[n],MAXLINE-n,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + + // make certain all addional allocated storage is initialized + // to avoid false positives when checking with valgrind + + memset(params + nparams, 0, DELTA*sizeof(Param)); + } + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].lambda = values.next_double(); + params[nparams].A = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].B = values.next_double(); + params[nparams].eta = values.next_double(); + params[nparams].rhocut = values.next_double(); + params[nparams].rcut = values.next_double(); + params[nparams].ncut = values.next_double(); + + } catch (TokenizerException &e) { + error->one(FLERR, e.what()); } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); + + // convenient precomputations + params[nparams].rhocutsq = params[nparams].rhocut * params[nparams].rhocut; + params[nparams].rcutsq = params[nparams].rcut * params[nparams].rcut; + params[nparams].ncutsq = params[nparams].ncut * params[nparams].ncut; + + nparams++; } - if (nwords != params_per_line) - error->all(FLERR,"Insufficient format in DRIP potential file"); + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - // words = ptrs to all words in line - - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; - - // ielement,jelement = 1st args - // if these 2 args are in element list, then parse this line - // else skip to next line (continue) - - for (ielement = 0; ielement < nelements; ielement++) - if (strcmp(words[0],elements[ielement]) == 0) break; - if (ielement == nelements) continue; - for (jelement = 0; jelement < nelements; jelement++) - if (strcmp(words[1],elements[jelement]) == 0) break; - if (jelement == nelements) continue; - - // load up parameter settings and error check their values - - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); - - // make certain all addional allocated storage is initialized - // to avoid false positives when checking with valgrind - - memset(params + nparams, 0, DELTA*sizeof(Param)); + if (comm->me != 0) { + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); } - params[nparams].ielement = ielement; - params[nparams].jelement = jelement; - params[nparams].C0 = atof(words[2]); - params[nparams].C2 = atof(words[3]); - params[nparams].C4 = atof(words[4]); - params[nparams].C = atof(words[5]); - params[nparams].delta = atof(words[6]); - params[nparams].lambda = atof(words[7]); - params[nparams].A = atof(words[8]); - params[nparams].z0 = atof(words[9]); - params[nparams].B = atof(words[10]); - params[nparams].eta = atof(words[11]); - params[nparams].rhocut = atof(words[12]); - params[nparams].rcut = atof(words[13]); - params[nparams].ncut = atof(words[14]); - - // convenient precomputations - params[nparams].rhocutsq = params[nparams].rhocut * params[nparams].rhocut; - params[nparams].rcutsq = params[nparams].rcut * params[nparams].rcut; - params[nparams].ncutsq = params[nparams].ncut * params[nparams].ncut; - - nparams++; + MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); memory->create(elem2param,nelements,nelements,"pair:elem2param"); - for (i = 0; i < nelements; i++) { - for (j = 0; j < nelements; j++) { - n = -1; - for (m = 0; m < nparams; m++) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + int n = -1; + for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); n = m; @@ -282,7 +247,6 @@ void PairDRIP::read_file(char *filename) elem2param[i][j] = n; } } - delete [] words; } /* ---------------------------------------------------------------------- */ @@ -293,9 +257,9 @@ void PairDRIP::compute(int eflag, int vflag) double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,rsq; int *ilist,*jlist,*numneigh,**firstneigh; - double ni[DIM]; - double dni_dri[DIM][DIM], dni_drnb1[DIM][DIM]; - double dni_drnb2[DIM][DIM], dni_drnb3[DIM][DIM]; + double ni[3]; + double dni_dri[3][3], dni_drnb1[3][3]; + double dni_drnb2[3][3], dni_drnb3[3][3]; ev_init(eflag,vflag); @@ -327,7 +291,7 @@ void PairDRIP::compute(int eflag, int vflag) // normal and its derivatives w.r.t. atom i and its 3 nearest neighbors calc_normal(i, ni, dni_dri,dni_drnb1, dni_drnb2, dni_drnb3); - double fi[DIM] = {0., 0., 0.}; + double fi[3] = {0., 0., 0.}; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; @@ -348,8 +312,8 @@ void PairDRIP::compute(int eflag, int vflag) // only include the interaction between different layers if (rsq < rcutsq && atom->molecule[i] != atom->molecule[j]) { - double fj[DIM] = {0., 0., 0.}; - double rvec[DIM] = {delx, dely, delz}; + double fj[3] = {0., 0., 0.}; + double rvec[3] = {delx, dely, delz}; double phi_attr = calc_attractive(p, rsq, rvec, fi, fj); @@ -441,12 +405,12 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, int nbj2 = nearest3neigh[j][1]; int nbj3 = nearest3neigh[j][2]; - double fnbi1[DIM]; - double fnbi2[DIM]; - double fnbi3[DIM]; - double fnbj1[DIM]; - double fnbj2[DIM]; - double fnbj3[DIM]; + double fnbi1[3]; + double fnbi2[3]; + double fnbi3[3]; + double fnbj1[3]; + double fnbj2[3]; + double fnbj3[3]; V3 dgij_dri; V3 dgij_drj; V3 dgij_drk1; @@ -490,7 +454,7 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, // total energy double phi = tp * V1 * V2; - for (int k = 0; k < DIM; k++) { + for (int k = 0; k < 3; k++) { // forces due to derivatives of tap and V1 double tmp = HALF * (dtp * V1 + tp * dV1) * V2 * rvec[k] / r; fi[k] += tmp; @@ -511,7 +475,7 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, fnbj3[k] = -HALF * tp * V1 * dgij_drl3[k]; } - for (int k = 0; k < DIM; k++) { + for (int k = 0; k < 3; k++) { f[nbi1][k] += fnbi1[k]; f[nbi2][k] += fnbi2[k]; f[nbi3][k] += fnbi3[k]; @@ -650,8 +614,8 @@ void PairDRIP::calc_normal(int const i, double *const normal, int k3 = nearest3neigh[i][2]; // normal does not depend on i, setting to zero - for (int j = 0; j < DIM; j++) { - for (int k = 0; k < DIM; k++) { + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { dn_dri[j][k] = 0.0; } } @@ -671,10 +635,10 @@ void PairDRIP::get_drhosqij(double const *rij, double const *ni, { int k; double ni_dot_rij = 0; - double dni_dri_dot_rij[DIM]; - double dni_drn1_dot_rij[DIM]; - double dni_drn2_dot_rij[DIM]; - double dni_drn3_dot_rij[DIM]; + double dni_dri_dot_rij[3]; + double dni_drn1_dot_rij[3]; + double dni_drn2_dot_rij[3]; + double dni_drn3_dot_rij[3]; ni_dot_rij = dot(ni, rij); mat_dot_vec(dni_dri, rij, dni_dri_dot_rij); @@ -682,7 +646,7 @@ void PairDRIP::get_drhosqij(double const *rij, double const *ni, mat_dot_vec(dni_drn2, rij, dni_drn2_dot_rij); mat_dot_vec(dni_drn3, rij, dni_drn3_dot_rij); - for (k = 0; k < DIM; k++) { + for (k = 0; k < 3; k++) { drhosq_dri[k] = -2*rij[k] - 2 * ni_dot_rij * (-ni[k] + dni_dri_dot_rij[k]); drhosq_drj[k] = 2 * rij[k] - 2 * ni_dot_rij * ni[k]; drhosq_drn1[k] = -2 * ni_dot_rij * dni_drn1_dot_rij[k]; @@ -736,14 +700,14 @@ double PairDRIP::dihedral(const int i, const int j, Param& p, // local vars double cos_kl[3][3]; // cos_omega_k1ijl1, cos_omega_k1ijl2 ... double d_dcos_kl[3][3]; // deriv of dihedral w.r.t to cos_omega_kijl - double dcos_kl[3][3][4][DIM]; // 4 indicates k, i, j, l. e.g. dcoskl[0][1][0] + double dcos_kl[3][3][4][3]; // 4 indicates k, i, j, l. e.g. dcoskl[0][1][0] // means dcos_omega_k1ijl2 / drk // if larger than cutoff of rho, return 0 if (rhosq >= cut_rhosq) { d_drhosq = 0; - for (int dim = 0; dim < DIM; dim++) { + for (int dim = 0; dim < 3; dim++) { d_dri[dim] = 0; d_drj[dim] = 0; d_drk1[dim] = 0; @@ -800,7 +764,7 @@ double PairDRIP::dihedral(const int i, const int j, Param& p, d_dcos_kl[2][2] = -D0 * epart3 * eta * cos_kl[2][0] * cos_kl[2][1]; // initialization to be zero and later add values - for (int dim = 0; dim < DIM; dim++) { + for (int dim = 0; dim < 3; dim++) { d_drk1[dim] = 0.; d_drk2[dim] = 0.; d_drk3[dim] = 0.; @@ -839,16 +803,16 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, double const *rj, double const *rl, double *const dcos_drk, double *const dcos_dri, double *const dcos_drj, double *const dcos_drl) { - double ejik[DIM]; - double eijl[DIM]; - double tmp1[DIM]; - double tmp2[DIM]; - double dejik_dri[DIM][DIM]; - double dejik_drj[DIM][DIM]; - double dejik_drk[DIM][DIM]; - double deijl_dri[DIM][DIM]; - double deijl_drj[DIM][DIM]; - double deijl_drl[DIM][DIM]; + double ejik[3]; + double eijl[3]; + double tmp1[3]; + double tmp2[3]; + double dejik_dri[3][3]; + double dejik_drj[3][3]; + double dejik_drk[3][3]; + double deijl_dri[3][3]; + double deijl_drj[3][3]; + double deijl_drl[3][3]; // ejik and derivatives @@ -857,9 +821,9 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, // flip sign // deriv_cross computes rij cross rik, here we need rji cross rik - for (int m = 0; m < DIM; m++) { + for (int m = 0; m < 3; m++) { ejik[m] = -ejik[m]; - for (int n = 0; n < DIM; n++) { + for (int n = 0; n < 3; n++) { dejik_dri[m][n] = -dejik_dri[m][n]; dejik_drj[m][n] = -dejik_drj[m][n]; dejik_drk[m][n] = -dejik_drk[m][n]; @@ -869,9 +833,9 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, // eijl and derivatives deriv_cross(rj, ri, rl, eijl, deijl_drj, deijl_dri, deijl_drl); // flip sign - for (int m = 0; m < DIM; m++) { + for (int m = 0; m < 3; m++) { eijl[m] = -eijl[m]; - for (int n = 0; n < DIM; n++) { + for (int n = 0; n < 3; n++) { deijl_drj[m][n] = -deijl_drj[m][n]; deijl_dri[m][n] = -deijl_dri[m][n]; deijl_drl[m][n] = -deijl_drl[m][n]; @@ -883,13 +847,13 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, // dcos_dri mat_dot_vec(dejik_dri, eijl, tmp1); mat_dot_vec(deijl_dri, ejik, tmp2); - for (int m = 0; m < DIM; m++) { + for (int m = 0; m < 3; m++) { dcos_dri[m] = tmp1[m] + tmp2[m]; } // dcos_drj mat_dot_vec(dejik_drj, eijl, tmp1); mat_dot_vec(deijl_drj, ejik, tmp2); - for (int m = 0; m < DIM; m++) { + for (int m = 0; m < 3; m++) { dcos_drj[m] = tmp1[m] + tmp2[m]; } // dcos drl @@ -952,9 +916,9 @@ void PairDRIP::deriv_cross(double const *rk, double const *rl, double const *rm, double *const cross, V3 *const dcross_drk, V3 *const dcross_drl, V3 *const dcross_drm) { - double x[DIM]; - double y[DIM]; - double p[DIM]; + double x[3]; + double y[3]; + double p[3]; double q; double q_cubic; double d_invq_d_x0; @@ -968,7 +932,7 @@ void PairDRIP::deriv_cross(double const *rk, double const *rl, // get x = rkl and y = rkm - for (i = 0; i < DIM; i++) { + for (i = 0; i < 3; i++) { x[i] = rl[i] - rk[i]; y[i] = rm[i] - rk[i]; } @@ -1022,8 +986,8 @@ void PairDRIP::deriv_cross(double const *rk, double const *rl, dcross_drm[2][2] = p[2] * d_invq_d_y2; // dcross/drk transposed - for (i = 0; i < DIM; i++) { - for (j = 0; j < DIM; j++) { + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { dcross_drk[i][j] = -(dcross_drl[i][j] + dcross_drm[i][j]); } } diff --git a/src/INTERLAYER/pair_drip.h b/src/INTERLAYER/pair_drip.h index bd719e0b57..cd385e720a 100644 --- a/src/INTERLAYER/pair_drip.h +++ b/src/INTERLAYER/pair_drip.h @@ -33,8 +33,6 @@ PairStyle(drip, PairDRIP); namespace LAMMPS_NS { -#define DIM 3 -typedef double V3[3]; class PairDRIP : public Pair { public: @@ -47,7 +45,10 @@ class PairDRIP : public Pair { double init_one(int, int); void init_style(); + static constexpr int NPARAMS_PER_LINE = 15; + protected: + typedef double V3[3]; struct Param { int ielement, jelement; double C0, C2, C4, C, delta, lambda, A, z0, B, eta, rhocut, rcut, ncut; From 4f9941e18daa2300d706cc1299db52598746343d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 15:05:23 -0400 Subject: [PATCH 301/352] support metal2real unit conversion in pair style drip --- potentials/C.drip | 6 +- src/INTERLAYER/pair_drip.cpp | 15 +++ .../tests/manybody-pair-drip_real.yaml | 126 ++++++++++++++++++ 3 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 unittest/force-styles/tests/manybody-pair-drip_real.yaml diff --git a/potentials/C.drip b/potentials/C.drip index 435efe40a9..afde83a786 100644 --- a/potentials/C.drip +++ b/potentials/C.drip @@ -1,15 +1,11 @@ -# DATE: 2019-04-19 CONTRIBUTOR: Mingjian Wen, wenxx151@umn.edu +# DATE: 2019-04-19 UNITS: metal CONTRIBUTOR: Mingjian Wen, wenxx151@umn.edu CITATION: Wen, Carr, Fang, Kaxiras, Tadmor, Phys. Rev. B, 98, 235404 (2018). # # Parameters of the Dihedral-angle-corrected registry-dependent interlayer (DRIP) # potential for multilayer graphene structures. -# -# Cite as M. Wen, S. Carr, S. Fang, E. Kaxiras, and E. B. Tadmor, Phys. Rev. B, 98, 235404 (2018). - # C0 C2 C4 C delta lambda A z0 B eta rho_cut r_cut normal_cut C C 1.1598e-02 1.2981e-02 3.2515e-02 7.8151e-03 8.3679e-01 2.7158 2.2216e-02 3.34 7.6799e-03 1.1432 1.562 12.0 3.7 - # C0, C2, C4, C, A, and B in [eV] # delta, z0, eta, rho_cut, r_cut, and normal_cut in [Angstrom] # lambda in [1/Angstrom] diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index 12af4eb9c8..b1e877e3ee 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -51,6 +51,7 @@ PairDRIP::PairDRIP(LAMMPS *lmp) : Pair(lmp) restartinfo = 0; manybody_flag = 1; centroidstressflag = CENTROID_NOTAVAIL; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); params = nullptr; nearest3neigh = nullptr; @@ -162,6 +163,11 @@ void PairDRIP::read_file(char *filename) PotentialFileReader reader(lmp, filename, "drip", unit_convert_flag); char *line; + // transparently convert units for supported conversions + + int unit_convert = reader.get_unit_convert(); + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); + while ((line = reader.next_line(NPARAMS_PER_LINE))) { try { @@ -214,6 +220,15 @@ void PairDRIP::read_file(char *filename) error->one(FLERR, e.what()); } + if (unit_convert) { + params[nparams].C0 *= conversion_factor; + params[nparams].C2 *= conversion_factor; + params[nparams].C4 *= conversion_factor; + params[nparams].C *= conversion_factor; + params[nparams].A *= conversion_factor; + params[nparams].B *= conversion_factor; + } + // convenient precomputations params[nparams].rhocutsq = params[nparams].rhocut * params[nparams].rhocut; params[nparams].rcutsq = params[nparams].rcut * params[nparams].rcut; diff --git a/unittest/force-styles/tests/manybody-pair-drip_real.yaml b/unittest/force-styles/tests/manybody-pair-drip_real.yaml new file mode 100644 index 0000000000..1f8ff8929c --- /dev/null +++ b/unittest/force-styles/tests/manybody-pair-drip_real.yaml @@ -0,0 +1,126 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Tue Aug 17 14:58:02 2021 +epsilon: 1e-13 +skip_tests: single +prerequisites: ! | + pair drip + atom full +pre_commands: ! | + variable newton_pair delete + variable newton_pair index on + variable units index real +post_commands: ! "" +input_file: in.bilayer +pair_style: hybrid/overlay drip +pair_coeff: ! | + * * drip C.drip C C C +extract: ! "" +natoms: 48 +init_vdwl: -25.761080947558458 +init_coul: 0 +init_stress: ! |- + -1.5997575514840701e+01 -1.5926563655516432e+01 2.6554761026958538e+01 0.0 0.0 -3.2959106617730394e-01 +init_forces: ! |2 + 1 3.4519525887018621e-02 -7.5961070769214878e-04 -3.0533160468170939e-01 + 2 1.8625356800076362e-02 2.4418650819961668e-02 -7.1772653472282411e-01 + 3 -7.9552206156518063e-03 7.8979719442743949e-04 -2.3465116711459008e-01 + 4 -5.6703944262123662e-03 4.1870221465274693e-04 -6.8478588954553776e-01 + 5 3.4519525887018870e-02 -7.5961070769172225e-04 -3.0533160468171572e-01 + 6 1.8625356800076116e-02 2.4418650819952412e-02 -7.1772653472282877e-01 + 7 -7.9552206156503213e-03 7.8979719443244851e-04 -2.3465116711458173e-01 + 8 -5.6703944262118111e-03 4.1870221465155517e-04 -6.8478588954554198e-01 + 9 -3.0954209054540674e-03 1.7176766023297568e-06 -2.3353949053792569e-01 + 10 -2.8325224362034315e-03 -1.2263401010803219e-04 -6.8852392802545803e-01 + 11 3.0948748188155822e-03 1.6735115258234307e-06 -2.3354085374002706e-01 + 12 2.8322868660610179e-03 -1.2217842468890391e-04 -6.8852450086990813e-01 + 13 -3.0954209054540466e-03 1.7176766026706842e-06 -2.3353949053793166e-01 + 14 -2.8325224362032025e-03 -1.2263401011821111e-04 -6.8852392802545703e-01 + 15 3.0948748188158390e-03 1.6735115316409009e-06 -2.3354085374002267e-01 + 16 2.8322868660610422e-03 -1.2217842468845727e-04 -6.8852450086991235e-01 + 17 7.9559873492091142e-03 7.8976840530281534e-04 -2.3465255277912508e-01 + 18 5.6708066884776521e-03 4.1916868608569068e-04 -6.8478641146338481e-01 + 19 -3.4519746533893940e-02 -7.5959533171951130e-04 -3.0533162714402262e-01 + 20 -1.8625533492238975e-02 2.4418661705949665e-02 -7.1772648379643234e-01 + 21 7.9559873492090170e-03 7.8976840530288451e-04 -2.3465255277913122e-01 + 22 5.6708066884775948e-03 4.1916868607656490e-04 -6.8478641146338504e-01 + 23 -3.4519746533890970e-02 -7.5959533171988253e-04 -3.0533162714401807e-01 + 24 -1.8625533492239343e-02 2.4418661705949762e-02 -7.1772648379643167e-01 + 25 -7.9552206156520144e-03 -7.8979719442783024e-04 2.3465116711458947e-01 + 26 1.8625356800076404e-02 -2.4418650819961502e-02 7.1772653472282488e-01 + 27 3.4519525887014679e-02 7.5961070768970737e-04 3.0533160468170817e-01 + 28 -5.6703944262120054e-03 -4.1870221465108506e-04 6.8478588954553898e-01 + 29 -7.9552206156520144e-03 -7.8979719443283481e-04 2.3465116711458581e-01 + 30 1.8625356800069229e-02 -2.4418650819957533e-02 7.1772653472281345e-01 + 31 3.4519525887018704e-02 7.5961070770124480e-04 3.0533160468171566e-01 + 32 -5.6703944262122274e-03 -4.1870221465243294e-04 6.8478588954554442e-01 + 33 3.0948748188157731e-03 -1.6735115261055401e-06 2.3354085374002662e-01 + 34 -2.8325224362035009e-03 1.2263401010814570e-04 6.8852392802545770e-01 + 35 -3.0954209054540674e-03 -1.7176766021075496e-06 2.3353949053792544e-01 + 36 2.8322868660609277e-03 1.2217842468872730e-04 6.8852450086991090e-01 + 37 3.0948748188157002e-03 -1.6735115312395288e-06 2.3354085374002845e-01 + 38 -2.8325224362050205e-03 1.2263401010865604e-04 6.8852392802544404e-01 + 39 -3.0954209054541784e-03 -1.7176765926834780e-06 2.3353949053792869e-01 + 40 2.8322868660613752e-03 1.2217842468919974e-04 6.8852450086991468e-01 + 41 -3.4519746533897999e-02 7.5959533172142307e-04 3.0533162714402334e-01 + 42 5.6708066884776503e-03 -4.1916868608571941e-04 6.8478641146338692e-01 + 43 7.9559873492091281e-03 -7.8976840530235466e-04 2.3465255277912495e-01 + 44 -1.8625533492239322e-02 -2.4418661705950095e-02 7.1772648379643567e-01 + 45 -3.4519746533897937e-02 7.5959533171621586e-04 3.0533162714402778e-01 + 46 5.6708066884779687e-03 -4.1916868608703228e-04 6.8478641146337782e-01 + 47 7.9559873492089893e-03 -7.8976840529313373e-04 2.3465255277912772e-01 + 48 -1.8625533492239322e-02 -2.4418661705950414e-02 7.1772648379643678e-01 +run_vdwl: -25.76108094759681 +run_coul: 0 +run_stress: ! |- + -1.5997575514905400e+01 -1.5926563655580109e+01 2.6554761025857829e+01 0.0 0.0 -3.2959106617393824e-01 +run_forces: ! |2 + 1 3.4519525886308772e-02 -7.5961070774262620e-04 -3.0533160467333686e-01 + 2 1.8625356799616053e-02 2.4418650819844623e-02 -7.1772653470240710e-01 + 3 -7.9552206157541827e-03 7.8979719442180435e-04 -2.3465116710721118e-01 + 4 -5.6703944262564421e-03 4.1870221456883055e-04 -6.8478588952590880e-01 + 5 3.4519525886310021e-02 -7.5961070774873795e-04 -3.0533160467333753e-01 + 6 1.8625356799618166e-02 2.4418650819839099e-02 -7.1772653470240300e-01 + 7 -7.9552206157587901e-03 7.8979719441955800e-04 -2.3465116710720937e-01 + 8 -5.6703944262596895e-03 4.1870221457031374e-04 -6.8478588952590624e-01 + 9 -3.0954209054729134e-03 1.7176766005387110e-06 -2.3353949053056158e-01 + 10 -2.8325224361802070e-03 -1.2263401013539680e-04 -6.8852392800592355e-01 + 11 3.0948748188260634e-03 1.6735115258329308e-06 -2.3354085373267006e-01 + 12 2.8322868660322353e-03 -1.2217842471453093e-04 -6.8852450085037853e-01 + 13 -3.0954209054753073e-03 1.7176766069530950e-06 -2.3353949053056008e-01 + 14 -2.8325224361808454e-03 -1.2263401013228948e-04 -6.8852392800592477e-01 + 15 3.0948748188205331e-03 1.6735115311816390e-06 -2.3354085373266414e-01 + 16 2.8322868660327627e-03 -1.2217842471338395e-04 -6.8852450085039274e-01 + 17 7.9559873493214514e-03 7.8976840529372907e-04 -2.3465255277175306e-01 + 18 5.6708066885325613e-03 4.1916868600858607e-04 -6.8478641144376085e-01 + 19 -3.4519746533186305e-02 -7.5959533177047444e-04 -3.0533162713566037e-01 + 20 -1.8625533491780335e-02 2.4418661705826062e-02 -7.1772648377602155e-01 + 21 7.9559873493208408e-03 7.8976840529406105e-04 -2.3465255277176264e-01 + 22 5.6708066885322672e-03 4.1916868600612250e-04 -6.8478641144375973e-01 + 23 -3.4519746533190690e-02 -7.5959533177689758e-04 -3.0533162713565520e-01 + 24 -1.8625533491779738e-02 2.4418661705826118e-02 -7.1772648377601034e-01 + 25 -7.9552206157391669e-03 -7.8979719442920414e-04 2.3465116710670758e-01 + 26 1.8625356799678291e-02 -2.4418650819855600e-02 7.1772653470301284e-01 + 27 3.4519525886291424e-02 7.5961070776537666e-04 3.0533160467268600e-01 + 28 -5.6703944262409822e-03 -4.1870221457090788e-04 6.8478588952643626e-01 + 29 -7.9552206157410682e-03 -7.8979719442770382e-04 2.3465116710671441e-01 + 30 1.8625356799682243e-02 -2.4418650819853061e-02 7.1772653470300518e-01 + 31 3.4519525886292479e-02 7.5961070776900104e-04 3.0533160467267750e-01 + 32 -5.6703944262390393e-03 -4.1870221457093217e-04 6.8478588952643404e-01 + 33 3.0948748188169527e-03 -1.6735115285445503e-06 2.3354085373217337e-01 + 34 -2.8325224361862578e-03 1.2263401013536189e-04 6.8852392800645301e-01 + 35 -3.0954209054732881e-03 -1.7176766016382667e-06 2.3353949053006548e-01 + 36 2.8322868660402949e-03 1.2217842471530459e-04 6.8852450085089545e-01 + 37 3.0948748188168972e-03 -1.6735115254575963e-06 2.3354085373216871e-01 + 38 -2.8325224361834475e-03 1.2263401013282052e-04 6.8852392800645179e-01 + 39 -3.0954209054684656e-03 -1.7176766061726881e-06 2.3353949053006878e-01 + 40 2.8322868660383624e-03 1.2217842471120666e-04 6.8852450085090100e-01 + 41 -3.4519746533171393e-02 7.5959533179549132e-04 3.0533162713500450e-01 + 42 5.6708066885105355e-03 -4.1916868600979897e-04 6.8478641144428143e-01 + 43 7.9559873493117838e-03 -7.8976840530148860e-04 2.3465255277124522e-01 + 44 -1.8625533491841401e-02 -2.4418661705844322e-02 7.1772648377662540e-01 + 45 -3.4519746533172420e-02 7.5959533179765766e-04 3.0533162713500039e-01 + 46 5.6708066885161846e-03 -4.1916868600924408e-04 6.8478641144429175e-01 + 47 7.9559873493104671e-03 -7.8976840529732212e-04 2.3465255277125016e-01 + 48 -1.8625533491844991e-02 -2.4418661705839853e-02 7.1772648377662085e-01 +... From 05bd545cd3f688f30388d18063b57b4309cbe91f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 15:10:46 -0400 Subject: [PATCH 302/352] flush tiny stresses to zero to avoid false positives when testing --- unittest/force-styles/test_pair_style.cpp | 4 ++++ unittest/force-styles/tests/manybody-pair-drip.yaml | 6 +++--- unittest/force-styles/tests/manybody-pair-drip_real.yaml | 6 +++--- .../force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml | 6 +++--- .../tests/manybody-pair-ilp-graphene-hbn_notaper.yaml | 6 +++--- .../tests/manybody-pair-kolmogorov_crespi_full.yaml | 6 +++--- .../tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml | 6 +++--- 7 files changed, 22 insertions(+), 18 deletions(-) diff --git a/unittest/force-styles/test_pair_style.cpp b/unittest/force-styles/test_pair_style.cpp index 23858f93b9..a14e568fb7 100644 --- a/unittest/force-styles/test_pair_style.cpp +++ b/unittest/force-styles/test_pair_style.cpp @@ -278,6 +278,8 @@ void generate_yaml_file(const char *outfile, const TestConfig &config) // init_stress auto stress = lmp->force->pair->virial; + // avoid false positives on tiny stresses. force to zero instead. + for (int i = 0; i < 6; ++i) if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0; block = fmt::format("{:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e}", stress[0], stress[1], stress[2], stress[3], stress[4], stress[5]); writer.emit_block("init_stress", block); @@ -302,6 +304,8 @@ void generate_yaml_file(const char *outfile, const TestConfig &config) // run_stress stress = lmp->force->pair->virial; + // avoid false positives on tiny stresses. force to zero instead. + for (int i = 0; i < 6; ++i) if (fabs(stress[i]) < 1.0e-13) stress[i] = 0.0; block = fmt::format("{:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e} {:23.16e}", stress[0], stress[1], stress[2], stress[3], stress[4], stress[5]); writer.emit_block("run_stress", block); diff --git a/unittest/force-styles/tests/manybody-pair-drip.yaml b/unittest/force-styles/tests/manybody-pair-drip.yaml index 7a8966cac8..e5d4915c4d 100644 --- a/unittest/force-styles/tests/manybody-pair-drip.yaml +++ b/unittest/force-styles/tests/manybody-pair-drip.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Tue Aug 17 14:10:50 2021 +date_generated: Tue Aug 17 15:09:48 2021 epsilon: 5e-14 skip_tests: single prerequisites: ! | @@ -19,7 +19,7 @@ natoms: 48 init_vdwl: -1.1171061429439093 init_coul: 0 init_stress: ! |- - -6.9372049706365035e-01 -6.9064113154966333e-01 1.1515233668963607e+00 0.0 0.0 -1.4292420626121039e-02 + -6.9372049706365035e-01 -6.9064113154966333e-01 1.1515233668963607e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.4292420626121039e-02 init_forces: ! |2 1 1.4969082430352958e-03 -3.2939836241196573e-05 -1.3240430862322900e-02 2 8.0767187286290179e-04 1.0588928659053852e-03 -3.1123566690577253e-02 @@ -72,7 +72,7 @@ init_forces: ! |2 run_vdwl: -1.117107802396835 run_coul: 0 run_stress: ! |- - -6.9372331738514981e-01 -6.9064389597684106e-01 1.1514755915204005e+00 0.0 0.0 -1.4292266024218578e-02 + -6.9372331738514981e-01 -6.9064389597684106e-01 1.1514755915204005e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.4292266024218578e-02 run_forces: ! |2 1 1.4968783498999268e-03 -3.2942052376323016e-05 -1.3240066826206463e-02 2 8.0765258918550525e-04 1.0588876993623385e-03 -3.1122680612106914e-02 diff --git a/unittest/force-styles/tests/manybody-pair-drip_real.yaml b/unittest/force-styles/tests/manybody-pair-drip_real.yaml index 1f8ff8929c..3f680a8c96 100644 --- a/unittest/force-styles/tests/manybody-pair-drip_real.yaml +++ b/unittest/force-styles/tests/manybody-pair-drip_real.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Tue Aug 17 14:58:02 2021 +date_generated: Tue Aug 17 15:09:48 2021 epsilon: 1e-13 skip_tests: single prerequisites: ! | @@ -20,7 +20,7 @@ natoms: 48 init_vdwl: -25.761080947558458 init_coul: 0 init_stress: ! |- - -1.5997575514840701e+01 -1.5926563655516432e+01 2.6554761026958538e+01 0.0 0.0 -3.2959106617730394e-01 + -1.5997575514840701e+01 -1.5926563655516432e+01 2.6554761026958538e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.2959106617730394e-01 init_forces: ! |2 1 3.4519525887018621e-02 -7.5961070769214878e-04 -3.0533160468170939e-01 2 1.8625356800076362e-02 2.4418650819961668e-02 -7.1772653472282411e-01 @@ -73,7 +73,7 @@ init_forces: ! |2 run_vdwl: -25.76108094759681 run_coul: 0 run_stress: ! |- - -1.5997575514905400e+01 -1.5926563655580109e+01 2.6554761025857829e+01 0.0 0.0 -3.2959106617393824e-01 + -1.5997575514905400e+01 -1.5926563655580109e+01 2.6554761025857829e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.2959106617393824e-01 run_forces: ! |2 1 3.4519525886308772e-02 -7.5961070774262620e-04 -3.0533160467333686e-01 2 1.8625356799616053e-02 2.4418650819844623e-02 -7.1772653470240710e-01 diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml index b2986e4d02..81f39c1d1d 100644 --- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml +++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sun Aug 15 17:37:13 2021 +date_generated: Tue Aug 17 15:09:49 2021 epsilon: 5e-12 skip_tests: single prerequisites: ! | @@ -20,7 +20,7 @@ natoms: 48 init_vdwl: -1.387500902597699 init_coul: 0 init_stress: ! |- - -1.0950745163741815e+00 -1.0965448791525116e+00 -5.5691185658268150e-01 0.0 0.0 -1.1949269093120441e-03 + -1.0950745163741815e+00 -1.0965448791525116e+00 -5.5691185658268150e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.1949269093120441e-03 init_forces: ! |2 1 2.0033364707962020e-03 3.2526065174565133e-18 -4.7626541030897668e-02 2 -1.1368359972830505e-05 9.1814113875668727e-05 4.2488212564737199e-02 @@ -73,7 +73,7 @@ init_forces: ! |2 run_vdwl: -1.3875037702379507 run_coul: 0 run_stress: ! |- - -1.0950798483072388e+00 -1.0965501776879543e+00 -5.5691866561084535e-01 -7.8353909283032197e-16 -7.5145250540648381e-15 -1.1949322419481606e-03 + -1.0950798483072388e+00 -1.0965501776879543e+00 -5.5691866561084535e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.1949322419481606e-03 run_forces: ! |2 1 2.0033030003525137e-03 8.9435705391029130e-10 -4.7625968392020532e-02 2 -1.1367384359795837e-05 9.1815719224718032e-05 4.2487909883465465e-02 diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml index dae0e501ca..f54aa4f85b 100644 --- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml +++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn_notaper.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sun Aug 15 18:41:00 2021 +date_generated: Tue Aug 17 15:09:49 2021 epsilon: 5e-12 skip_tests: single prerequisites: ! | @@ -20,7 +20,7 @@ natoms: 48 init_vdwl: -1.743417069575419 init_coul: 0 init_stress: ! |- - -1.4159677678324094e+00 -1.4175957592828763e+00 -8.2079275196077894e-01 0.0 0.0 -1.2386435158561861e-03 + -1.4159677678324094e+00 -1.4175957592828763e+00 -8.2079275196077894e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.2386435158561861e-03 init_forces: ! |2 1 2.0850484065019883e-03 3.6862873864507151e-18 -5.0318618251118635e-02 2 -6.3446817540543932e-06 9.5024077809279612e-05 4.2760561141837801e-02 @@ -73,7 +73,7 @@ init_forces: ! |2 run_vdwl: -1.7434201284130086 run_coul: 0 run_stress: ! |- - -1.4159735399871292e+00 -1.4176014949571309e+00 -8.2080149187142926e-01 -2.1449500026615373e-16 -1.7714821647888020e-15 -1.2386484789055200e-03 + -1.4159735399871292e+00 -1.4176014949571309e+00 -8.2080149187142926e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.2386484789055200e-03 run_forces: ! |2 1 2.0850117908114097e-03 1.0161463491389217e-09 -5.0317981439628325e-02 2 -6.3437194577726987e-06 9.5025701239061859e-05 4.2760248404172425e-02 diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml index 42d31227d9..a166d66af1 100644 --- a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml +++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sun Aug 15 19:01:13 2021 +date_generated: Tue Aug 17 15:09:49 2021 epsilon: 5e-12 skip_tests: single prerequisites: ! | @@ -20,7 +20,7 @@ natoms: 48 init_vdwl: -1.2500397419624312 init_coul: 0 init_stress: ! |- - -1.0004429195951223e+00 -1.0032930381066463e+00 4.3070815061895146e-01 0.0 0.0 -1.7133324489474716e-02 + -1.0004429195951223e+00 -1.0032930381066463e+00 4.3070815061895146e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.7133324489474716e-02 init_forces: ! |2 1 2.8687289997477317e-03 -7.8062556418956319e-18 3.6613830361686965e-02 2 1.3226962450822509e-03 1.2611200091842689e-03 -6.4703224388507563e-02 @@ -73,7 +73,7 @@ init_forces: ! |2 run_vdwl: -1.250048655581655 run_coul: 0 run_stress: ! |- - -1.0004370065912216e+00 -1.0032870501278353e+00 4.3059909389948547e-01 -3.0512762156502117e-16 1.4810330715847770e-15 -1.7133053394138682e-02 + -1.0004370065912216e+00 -1.0032870501278353e+00 4.3059909389948547e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.7133053394138682e-02 run_forces: ! |2 1 2.8687040337510585e-03 -2.1727982419360303e-08 3.6613767230361242e-02 2 1.3226761216838419e-03 1.2611192610103965e-03 -6.4700278384581700e-02 diff --git a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml index e2e95b8c9b..8049df3f76 100644 --- a/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml +++ b/unittest/force-styles/tests/manybody-pair-kolmogorov_crespi_full_notaper.yaml @@ -1,6 +1,6 @@ --- lammps_version: 30 Jul 2021 -date_generated: Sun Aug 15 19:06:34 2021 +date_generated: Tue Aug 17 15:09:50 2021 epsilon: 5e-12 skip_tests: single prerequisites: ! | @@ -20,7 +20,7 @@ natoms: 48 init_vdwl: -1.2319861234762621 init_coul: 0 init_stress: ! |- - -1.1008420461559216e+00 -1.1059574121005133e+00 1.9501897055379741e-01 0.0 0.0 -1.5182584087439038e-02 + -1.1008420461559216e+00 -1.1059574121005133e+00 1.9501897055379741e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.5182584087439038e-02 init_forces: ! |2 1 2.7578315641555162e-03 -3.0357660829594124e-18 4.1533172062176493e-02 2 1.2588944124766973e-03 1.1188632453424979e-03 -6.5272327121384435e-02 @@ -73,7 +73,7 @@ init_forces: ! |2 run_vdwl: -1.23199571764252 run_coul: 0 run_stress: ! |- - -1.1008368563459114e+00 -1.1059521765455493e+00 1.9490358494782456e-01 -4.4881817801889771e-16 -1.4762912608595250e-15 -1.5182325192586004e-02 + -1.1008368563459114e+00 -1.1059521765455493e+00 1.9490358494782456e-01 0.0000000000000000e+00 0.0000000000000000e+00 -1.5182325192586004e-02 run_forces: ! |2 1 2.7578115049012742e-03 -1.9626239461520076e-08 4.1533149398200540e-02 2 1.2588780003755895e-03 1.1188632817004094e-03 -6.5269251575709356e-02 From 2bf9fa91dba1c91866f5933c1e657c16211e28fb Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Tue, 17 Aug 2021 14:03:58 -0600 Subject: [PATCH 303/352] more changes to merge with current master --- src/compute_property_atom.cpp | 50 ++++---- src/compute_property_atom.h | 4 +- src/dump_custom.cpp | 228 +++++++++++++--------------------- src/fix_property_atom.cpp | 24 ++-- src/fix_store_state.cpp | 175 ++++++++++---------------- src/library.cpp | 4 +- src/set.cpp | 12 +- src/utils.cpp | 5 +- 8 files changed, 202 insertions(+), 300 deletions(-) diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index 3c695ab303..a7eb4bf144 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -380,29 +380,23 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : "atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_nbonds; - } else if (strcmp(arg[iarg],"buckling") == 0) { - if (!atom->mesont_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); - pack_choice[i] = &ComputePropertyAtom::pack_buckling; - // custom per-atom vector } else if (utils::strmatch(arg[iarg],"^i_")) { - int flag,icol; - index[i] = atom->find_custom(&arg[iarg][2],flag,icol); - if (index[i] < 0 || flag || icol) + int flag,cols; + index[i] = atom->find_custom(&arg[iarg][2],flag,cols); + if (index[i] < 0 || flag || cols) error->all(FLERR,"Compute property/atom integer " "vector does not exist"); pack_choice[i] = &ComputePropertyAtom::pack_iname; + } else if (utils::strmatch(arg[iarg],"^d_")) { - int flag; - index[i] = atom->find_custom(&arg[iarg][2],flag,icol); - if (index[i] < 0 || flag || icol1) + int flag,cols; + index[i] = atom->find_custom(&arg[iarg][2],flag,cols); + if (index[i] < 0 || flag || cols) error->all(FLERR,"Compute property/atom floating point " "vector does not exist"); pack_choice[i] = &ComputePropertyAtom::pack_dname; - } // custom per-atom arrays, must include bracketed index // OLDSTYLE code @@ -1203,21 +1197,6 @@ void ComputePropertyAtom::pack_fmz(int n) /* ---------------------------------------------------------------------- */ -void ComputePropertyAtom::pack_nbonds(int n) -{ - int *num_bond = atom->num_bond; - int *mask = atom->mask; - int nlocal = atom->nlocal; - - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) buf[n] = num_bond[i]; - else buf[n] = 0.0; - n += nvalues; - } -} - -/* ---------------------------------------------------------------------- */ - void ComputePropertyAtom::pack_radius(int n) { double *radius = atom->radius; @@ -1853,6 +1832,21 @@ void ComputePropertyAtom::pack_corner3z(int n) /* ---------------------------------------------------------------------- */ +void ComputePropertyAtom::pack_nbonds(int n) +{ + int *num_bond = atom->num_bond; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) buf[n] = num_bond[i]; + else buf[n] = 0.0; + n += nvalues; + } +} + +/* ---------------------------------------------------------------------- */ + void ComputePropertyAtom::pack_iname(int n) { int *ivector = atom->ivector[index[n]]; diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h index 810a12b680..19f8b73451 100644 --- a/src/compute_property_atom.h +++ b/src/compute_property_atom.h @@ -90,8 +90,6 @@ class ComputePropertyAtom : public Compute { void pack_fmy(int); void pack_fmz(int); - void pack_nbonds(int); - void pack_radius(int); void pack_diameter(int); void pack_omegax(int); @@ -129,6 +127,8 @@ class ComputePropertyAtom : public Compute { void pack_corner3y(int); void pack_corner3z(int); + void pack_nbonds(int); + void pack_iname(int); void pack_dname(int); void pack_i2name(int); diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 4a2778e981..68a2ab4a57 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1444,54 +1444,15 @@ int DumpCustom::parse_fields(int narg, char **arg) } else if (strcmp(arg[iarg],"tqz") == 0) { if (!atom->torque_flag) error->all(FLERR,"Dumping an atom property that isn't allocated"); - pack_choice[i] = &DumpCustom::pack_tqz; - vtype[i] = Dump::DOUBLE; - - // custom per-atom array = i2_ID or d2_ID, must include bracketed index - // OLDSTYLE code - remove this after extend ArgInfo for i2/d2 arrays - - } else if (strncmp(arg[iarg],"i2_",3) == 0 || - strncmp(arg[iarg],"d2_",3) == 0) { - int which = 0; - if (arg[iarg][0] == 'd') which = 1; - - pack_choice[i] = &DumpCustom::pack_custom; - if (!which) vtype[i] = Dump::INT; - else vtype[i] = Dump::DOUBLE; - - int n = strlen(arg[iarg]); - char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][3]); - - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump custom command"); - suffix[strlen(suffix)-1] = '\0'; - argindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); - *ptr = '\0'; - } else error->all(FLERR,"Dump custom per-atom custom array is not indexed"); - - int flag,cols; - n = atom->find_custom(suffix,flag,cols); - - if ((!which && (n < 0 || flag || !cols)) || - (which && (n < 0 || !flag || !cols))) - error->all(FLERR,"Dump custom per-atom custom array does not exist"); - if (argindex[i] <= 0 || argindex[i] > cols) - error->all(FLERR, - "Dump custom per-atom custom array is accessed out-of-range"); - - field2index[i] = add_custom(suffix,which); - delete [] suffix; + pack_choice[iarg] = &DumpCustom::pack_tqz; + vtype[iarg] = Dump::DOUBLE; // compute or fix or variable or custom vector/array - // NEWSTYLE code - add ArgInfo returns for IVEC, DVEC, IARRAY, DARRAY } else { - int n,tmp; + int n,flag,cols; ArgInfo argi(arg[iarg],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE - |ArgInfo::DVEC|ArgInfo::IVEC); + |ArgInfo::DNAME|ArgInfo::INAME); argindex[iarg] = argi.get_index1(); auto name = argi.get_name(); @@ -1559,50 +1520,58 @@ int DumpCustom::parse_fields(int narg, char **arg) field2index[iarg] = add_variable(name); break; - // custom per-atom floating point vector = d_ID + // custom per-atom floating point vector or array - case ArgInfo::DVEC: + case ArgInfo::DNAME: pack_choice[iarg] = &DumpCustom::pack_custom; vtype[iarg] = Dump::DOUBLE; - tmp = -1; - n = atom->find_custom(name,tmp); + n = atom->find_custom(name,flag,cols); + if (n < 0) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); - - if (tmp != 1) - error->all(FLERR,"Custom per-atom property ID {} is not floating point", name); + if (argindex[iarg] == 0) { + if (!flag || cols) + error->all(FLERR, + "Property double vector for dump custom does not exist"); + } else { + if (!flag || !cols) + error->all(FLERR, + "Property double array for dump custom does not exist"); + if (argindex[iarg] > atom->dcols[n]) + error->all(FLERR, + "Dump custom property array is accessed out-of-range"); + } field2index[iarg] = add_custom(name,1); break; - // custom per-atom integer vector = i_ID + // custom per-atom integer vector or array - case ArgInfo::IVEC: + case ArgInfo::INAME: pack_choice[iarg] = &DumpCustom::pack_custom; vtype[iarg] = Dump::INT; - tmp = -1; - n = atom->find_custom(name,tmp); + n = atom->find_custom(name,flag,cols); + if (n < 0) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); - - if (tmp != 0) - error->all(FLERR,"Custom per-atom property ID {} is not integer", name); + if (argindex[iarg] == 0) { + if (flag || cols) + error->all(FLERR, + "Property integer vector for dump custom does not exist"); + } else { + if (flag || !cols) + error->all(FLERR, + "Property integer array for dump custom does not exist"); + if (argindex[iarg] > atom->icols[n]) + error->all(FLERR, + "Dump custom property array is accessed out-of-range"); + } field2index[iarg] = add_custom(name,0); break; - // custom per-atom floating point array = d2_ID - - case ArgInfo::DARRAY: - return iarg; - - // custom per-atom integer array = i2_ID - - case ArgInfo::IARRAY: - return iarg; - // no match default: @@ -1915,55 +1884,16 @@ int DumpCustom::modify_param(int narg, char **arg) else if (strcmp(arg[1],"tqy") == 0) thresh_array[nthresh] = TQY; else if (strcmp(arg[1],"tqz") == 0) thresh_array[nthresh] = TQZ; - // custom per-atom array = i2_ID or d2_ID, must include bracketed index - // OLDSTYLE code - remove this after extend ArgInfo for i2/d2 arrays - - else if (strncmp(arg[1],"i2_",3) == 0 || strncmp(arg[1],"d2_",3) == 0) { - int which = 0; - if (arg[1][0] == 'd') which = 1; - - if (!which) thresh_array[nthresh] = IARRAY; - else thresh_array[nthresh] = DARRAY; - memory->grow(field2index,nfield+nthresh+1,"dump:field2index"); - memory->grow(argindex,nfield+nthresh+1,"dump:argindex"); - - int n = strlen(arg[1]); - char *suffix = new char[n]; - strcpy(suffix,&arg[1][3]); - - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in dump custom command"); - suffix[strlen(suffix)-1] = '\0'; - argindex[nfield+nthresh] = utils::inumeric(FLERR,ptr+1,true,lmp); - *ptr = '\0'; - } else error->all(FLERR,"Dump_modify per-atom custom array is not indexed"); - - int flag,cols; - n = atom->find_custom(suffix,flag,cols); - - if ((!which && (n < 0 || flag || !cols)) || - (which && (n < 0 || !flag || !cols))) - error->all(FLERR,"Could not find dump_modify per-atom custom array"); - if (argindex[nfield+nthresh] <= 0 || argindex[nfield+nthresh] > cols) - error->all(FLERR, - "Dump_modify per-atom custom array is accessed out-of-range"); - - field2index[nfield+nthresh] = add_custom(suffix,which); - delete [] suffix; - // compute or fix or variable or custom vector/array - // NEWSTYLE code - add ArgInfo returns for IVEC, DVEC, IARRAY, DARRAY // must grow field2index and argindex arrays, since access is beyond nfield - } else { + else { memory->grow(field2index,nfield+nthresh+1,"dump:field2index"); memory->grow(argindex,nfield+nthresh+1,"dump:argindex"); - int n,tmp; + int n,flag,cols; ArgInfo argi(arg[1],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE - |ArgInfo::DVEC|ArgInfo::IVEC); + |ArgInfo::DNAME|ArgInfo::INAME); argindex[nfield+nthresh] = argi.get_index1(); auto name = argi.get_name(); @@ -2026,39 +1956,55 @@ int DumpCustom::modify_param(int narg, char **arg) field2index[nfield+nthresh] = add_variable(name); break; - // custom per atom floating point value = d_ID + // custom per atom floating point vector or array - case ArgInfo::DVEC: - thresh_array[nthresh] = DVEC; - tmp = -1; - n = atom->find_custom(name,tmp); - if ((n < 0) || (tmp != 1)) - error->all(FLERR,"Could not find dump modify custom atom floating point property ID: {}",name); - - field2index[nfield+nthresh] = add_custom(name,1); - break; - - // custom per atom integer value = i_ID - - case ArgInfo::IVEC: - thresh_array[nthresh] = IVEC; - tmp = -1; - n = atom->find_custom(name,tmp); - if ((n < 0) || (tmp != 0)) - error->all(FLERR,"Could not find dump modify custom atom integer property ID: {}",name); + case ArgInfo::DNAME: + n = atom->find_custom(name,flag,cols); + if (n < 0) + error->all(FLERR,"Could not find custom per-atom property ID: {}", name); + if (argindex[nfield+nthresh] == 0) { + if (flag || cols) + error->all(FLERR, + "Property double vector for dump custom does not exist"); + thresh_array[nthresh] = DVEC; + } else { + if (flag || !cols) + error->all(FLERR, + "Property double array for dump custom does not exist"); + if (argindex[nfield+nthresh] > atom->dcols[n]) + error->all(FLERR, + "Dump custom property array is accessed out-of-range"); + thresh_array[nthresh] = DARRAY; + } + field2index[nfield+nthresh] = add_custom(name,0); break; - // custom per-atom floating point array = d2_ID + // custom per atom integer vector or array + + case ArgInfo::INAME: + n = atom->find_custom(name,flag,cols); - case ArgInfo::DARRAY: - return iarg; + if (n < 0) + error->all(FLERR,"Could not find custom per-atom property ID: {}", name); + if (argindex[nfield+nthresh] == 0) { + if (flag || cols) + error->all(FLERR, + "Property integer vector for dump custom does not exist"); + thresh_array[nthresh] = IVEC; + } else { + if (flag || !cols) + error->all(FLERR, + "Property integer array for dump custom does not exist"); + if (argindex[nfield+nthresh] > atom->icols[n]) + error->all(FLERR, + "Dump custom property array is accessed out-of-range"); + thresh_array[nthresh] = IARRAY; + } - // custom per-atom integer array = i2_ID - - case ArgInfo::IARRAY: - return iarg; + field2index[nfield+nthresh] = add_custom(name,0); + break; // no match @@ -2069,7 +2015,7 @@ int DumpCustom::modify_param(int narg, char **arg) } // set operation type of threshold - + if (strcmp(arg[2],"<") == 0) thresh_op[nthresh] = LT; else if (strcmp(arg[2],"<=") == 0) thresh_op[nthresh] = LE; else if (strcmp(arg[2],">") == 0) thresh_op[nthresh] = GT; @@ -2078,11 +2024,11 @@ int DumpCustom::modify_param(int narg, char **arg) else if (strcmp(arg[2],"!=") == 0) thresh_op[nthresh] = NEQ; else if (strcmp(arg[2],"|^") == 0) thresh_op[nthresh] = XOR; else error->all(FLERR,"Invalid dump_modify thresh operator"); - + // set threshold value as number or special LAST keyword // create FixStore to hold LAST values, should work with restart // id = dump-ID + nthreshlast + DUMP_STORE, fix group = dump group - + if (strcmp(arg[3],"LAST") != 0) { thresh_value[nthresh] = utils::numeric(FLERR,arg[3],false,lmp); thresh_last[nthresh] = -1; @@ -2092,17 +2038,17 @@ int DumpCustom::modify_param(int narg, char **arg) thresh_fixID = (char **) memory->srealloc(thresh_fixID,(nthreshlast+1)*sizeof(char *),"dump:thresh_fixID"); memory->grow(thresh_first,(nthreshlast+1),"dump:thresh_first"); - + std::string threshid = fmt::format("{}{}_DUMP_STORE",id,nthreshlast); thresh_fixID[nthreshlast] = utils::strdup(threshid); threshid += fmt::format(" {} STORE peratom 1 1", group->names[igroup]); thresh_fix[nthreshlast] = (FixStore *) modify->add_fix(threshid); - + thresh_last[nthreshlast] = nthreshlast; thresh_first[nthreshlast] = 1; nthreshlast++; } - + nthresh++; return 4; } diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index a45b4768be..47c7475524 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -93,21 +93,21 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : } else if (utils::strmatch(arg[iarg],"^i_")) { style[nvalue] = IVEC; - int tmp; - index[nvalue] = atom->find_custom(&arg[iarg][2],tmp); + int flag,cols; + index[nvalue] = atom->find_custom(&arg[iarg][2],flag,cols); if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom vector name already exists"); - index[nvalue] = atom->add_custom(&arg[iarg][2],0); + index[nvalue] = atom->add_custom(&arg[iarg][2],0,0); nvalue++; - iarg++ + iarg++; } else if (utils::strmatch(arg[iarg],"^d_")) { style[nvalue] = DVEC; - int tmp; - index[nvalue] = atom->find_custom(&arg[iarg][2],tmp); + int flag,ncols; + index[nvalue] = atom->find_custom(&arg[iarg][2],flag,ncols); if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom vector name already exists"); - index[nvalue] = atom->add_custom(&arg[iarg][2],1); + index[nvalue] = atom->add_custom(&arg[iarg][2],1,0); nvalue++; iarg++; @@ -121,8 +121,8 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (arg[iarg][0] == 'd') which = 1; if (which == 0) style[nvalue] = IARRAY; else style[nvalue] = DARRAY; - int tmp1,tmp2; - index[nvalue] = atom->find_custom(&arg[iarg][3],tmp1,tmp2); + int flag,ncols; + index[nvalue] = atom->find_custom(&arg[iarg][3],flag,ncols); if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom array name already exists"); cols[nvalue] = utils::inumeric(FLERR,arg[iarg+1],true,lmp); @@ -418,8 +418,10 @@ void FixPropertyAtom::write_data_section_keyword(int /*mth*/, FILE *fp) if (style[i] == MOLECULE) fputs(" mol",fp); else if (style[i] == CHARGE) fputs(" q",fp); else if (style[i] == RMASS) fputs(" rmass",fp); - else if (style[i] == INTEGER) fprintf(fp," i_%s", atom->iname[index[i]]); - else if (style[i] == DOUBLE) fprintf(fp, " d_%s", atom->dname[index[i]]); + else if (style[i] == IVEC) fprintf(fp," i_%s", atom->ivname[index[i]]); + else if (style[i] == DVEC) fprintf(fp, " d_%s", atom->dvname[index[i]]); + else if (style[i] == IARRAY) fprintf(fp, " i_%s", atom->ianame[index[i]]); + else if (style[i] == DARRAY) fprintf(fp, " d_%s", atom->daname[index[i]]); } fputs("\n\n",fp); } diff --git a/src/fix_store_state.cpp b/src/fix_store_state.cpp index df082f92f6..0d54d2727e 100644 --- a/src/fix_store_state.cpp +++ b/src/fix_store_state.cpp @@ -222,33 +222,6 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : "Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_tqz; - // custom per-atom array - // OLDSTYLE code - - } else if (strncmp(arg[iarg],"i2_",3) == 0 || - strncmp(arg[iarg],"d2_",3) == 0) { - if (strncmp(arg[iarg],"i2_",3) == 0) which[nvalues] = IARRAY; - else if (strncmp(arg[iarg],"d2_",3) == 0) which[nvalues] = DARRAY; - - int n = strlen(arg[iarg]); - char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][3]); - - char *ptr = strchr(suffix,'['); - if (!ptr) error->all(FLERR,"Illegal fix store/state command"); - - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Illegal fix store/state command"); - suffix[strlen(suffix)-1] = '\0'; - argindex[nvalues] = utils::inumeric(FLERR,ptr+1,true,lmp); - *ptr = '\0'; - - n = strlen(suffix) + 1; - ids[nvalues] = new char[n]; - strcpy(ids[nvalues],suffix); - nvalues++; - delete [] suffix; - // compute or fix or variable or custom per-atom vector or array // NEWSTYLE code @@ -293,16 +266,16 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : if (modify->compute[icompute]->peratom_flag == 0) error->all(FLERR,"Fix store/state compute " "does not calculate per-atom values"); - if (argindex[m] == 0 && + if (argindex[i] == 0 && modify->compute[icompute]->size_peratom_cols != 0) error->all(FLERR,"Fix store/state compute does not " "calculate a per-atom vector"); - if (argindex[m] && modify->compute[icompute]->size_peratom_cols == 0) + if (argindex[i] && modify->compute[icompute]->size_peratom_cols == 0) error->all(FLERR, "Fix store/state compute does not " "calculate a per-atom array"); - if (argindex[m] && - argindex[m] > modify->compute[icompute]->size_peratom_cols) + if (argindex[i] && + argindex[i] > modify->compute[icompute]->size_peratom_cols) error->all(FLERR, "Fix store/state compute array is accessed out-of-range"); @@ -314,13 +287,13 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : if (modify->fix[ifix]->peratom_flag == 0) error->all(FLERR, "Fix store/state fix does not calculate per-atom values"); - if (argindex[m] == 0 && modify->fix[ifix]->size_peratom_cols != 0) + if (argindex[i] == 0 && modify->fix[ifix]->size_peratom_cols != 0) error->all(FLERR, "Fix store/state fix does not calculate a per-atom vector"); - if (argindex[m] && modify->fix[ifix]->size_peratom_cols == 0) + if (argindex[i] && modify->fix[ifix]->size_peratom_cols == 0) error->all(FLERR, "Fix store/state fix does not calculate a per-atom array"); - if (argindex[m] && argindex[m] > modify->fix[ifix]->size_peratom_cols) + if (argindex[i] && argindex[i] > modify->fix[ifix]->size_peratom_cols) error->all(FLERR, "Fix store/state fix array is accessed out-of-range"); if (nevery % modify->fix[ifix]->peratom_freq) @@ -334,33 +307,41 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : if (input->variable->atomstyle(ivariable) == 0) error->all(FLERR,"Fix store/state variable is not atom-style variable"); - } else if (which[i] == ArgInfo::INAME) { - int icustom,iflag,cols; - icustom = atom->find_custom(ids[i],iflag,cols); - if ((icustom < 0) || iflag ||,cols) - error->all(FLERR, - "Custom integer vector for fix store/state does not exist"); - } else if (which[i] == ArgInfo::DNAME) { - int icustom,iflag,cols; - icustom = atom->find_custom(ids[i],iflag,cols); - if ((icustom < 0) || iflag ||,cols) - error->all(FLERR, - "Custom floating point vector for fix store/state does not exist"); + int icustom,iflag,icol; + icustom = atom->find_custom(ids[i],iflag,icol); + if (icustom < 0) + error->all(FLERR,"Custom vector/array for fix store/state does not exist"); + if (argindex[i] == 0) { + if (!iflag || icol) + error->all(FLERR, + "Custom double vector for fix store/state does not exist"); + } else { + if (!iflag || !icol) + error->all(FLERR, + "Custom double array for fix store/state does not exist"); + if (argindex[i] > atom->dcols[icustom]) + error->all(FLERR, + "Fix store/state custom array is accessed out-of-range"); + } - } else if (which[i] == ArgInfo::IARRAY) { - int icustom,flag,cols; - icustom = atom->find_custom(ids[i],flag,cols); - if ((icustom < 0) || flag || !cols) - error->all(FLERR, - "Custom integer array for fix store/state does not exist"); - - } else if (which[m] == Arginfo::DARRAY) { - int icustom,flag,cols; - icustom = atom->find_custom(ids[i],flag,cols); - if ((icustom < 0) || !flag || !cols) - error->all(FLERR, - "Custom floating point array for fix store/state does not exist"); + } else if (which[i] == ArgInfo::INAME) { + int icustom,iflag,icol; + icustom = atom->find_custom(ids[i],iflag,icol); + if (icustom < 0) + error->all(FLERR,"Custom vector/array for fix store/state does not exist"); + if (argindex[i] == 0) { + if (iflag || icol) + error->all(FLERR, + "Custom integer vector for fix store/state does not exist"); + } else { + if (iflag || !icol) + error->all(FLERR, + "Custom integer array for fix store/state does not exist"); + if (argindex[i] > atom->icols[icustom]) + error->all(FLERR, + "Fix store/state custom array is accessed out-of-range"); + } } } @@ -450,36 +431,13 @@ void FixStoreState::init() error->all(FLERR,"Variable name for fix store/state does not exist"); value2index[m] = ivariable; - } else if (which[m] == ArgInfo::IVEC) { + } else if (which[m] == ArgInfo::INAME || which[m] == ArgInfo::DNAME) { int icustom,iflag,cols; icustom = atom->find_custom(ids[m],iflag,cols); - if ((icustom < 0) || iflag || cols) - error->all(FLERR, - "Custom integer vector for fix store/state does not exist"); + if (icustom < 0) + error->all(FLERR,"Custom vector/array for fix store/state does not exist"); value2index[m] = icustom; - - } else if (which[m] == ArgInfo::DVEC) { - int icustom,iflag,cols; - icustom = atom->find_custom(ids[m],iflag,cols); - if ((icustom < 0) || iflag || cols) - error->all(FLERR, - "Custom floating point vector for fix store/state does not exist"); - value2index[m] = icustom; - - } else if (which[m] == ArgInfo::IARRAY) { - int icustom,iflag,cols; - icustom = atom->find_custom(ids[m],iflag,cols); - if ((icustom < 0) || iflag || !cols) - error->all(FLERR, - "Custom integer array for fix store/state does not exist"); - value2index[m] = icustom; - - } else if (which[m] == ArgInfo::DARRAY) { - int icustom,iflag,cols; - icustom = atom->find_custom(ids[m],iflag,cols); - if ((icustom < 0) || iflag || !cols) - error->all(FLERR, - "Custom floating point array for fix store/state does not exist"); value2index[m] = icustom; + } } } @@ -566,32 +524,35 @@ void FixStoreState::end_of_step() // evaluate atom-style variable - } else if (which[m] == VARIABLE) { + } else if (which[m] == ArgInfo::VARIABLE) { input->variable->compute_atom(n,igroup,&values[0][m],nvalues,0); - // access custom atom property fields + // access custom atom vector/array fields - } else if (which[m] == ArgInfo::IVEC) { - int *ivector = atom->ivector[n]; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = ivector[i]; + } else if (which[m] == ArgInfo::DNAME) { + if (j == 0) { + double *dvector = atom->dvector[n]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = dvector[i]; + } else { + double **darray = atom->darray[n]; + int jm1 = j - 1; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = darray[i][jm1]; + } - } else if (which[m] == ArgInfo::DVEC) { - double *dvector = atom->dvector[n]; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = dvector[i]; - - } else if (which[m] == ArgInfo::IARRAY) { - int **iarray = atom->iarray[n]; - int jm1 = j - 1; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = iarray[i][jm1]; - } else if (which[m] == ArgInfo::DARRAY) { - double **darray = atom->darray[n]; - int jm1 = j - 1; - for (i = 0; i < nlocal; i++) - if (mask[i] & groupbit) values[i][m] = darray[i][jm1]; + } else if (which[m] == ArgInfo::INAME) { + if (j == 0) { + int *ivector = atom->ivector[n]; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = ivector[i]; + } else { + int **iarray = atom->iarray[n]; + int jm1 = j - 1; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) values[i][m] = iarray[i][jm1]; + } } } } diff --git a/src/library.cpp b/src/library.cpp index d0f5b2b9fb..b6cdd02e9f 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -3127,7 +3127,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d // compute - if (vptr==nullptr && utils::strmatch(name,"^c_")) + if (vptr==nullptr && utils::strmatch(name,"^c_")) { fcid = lmp->modify->find_compute(&name[2]); if (fcid < 0) { @@ -3156,7 +3156,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d else vptr = (void *) lmp->modify->compute[fcid]->array_atom; } - // custom fix property/atom vector or array + // custom per-atom vector or array // OLDSTYLE code if ((vptr==nullptr) && diff --git a/src/set.cpp b/src/set.cpp index c5021120c1..1aa9a479e6 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -576,9 +576,9 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - int flag; - index_custom = atom->find_custom(&arg[iarg][2],flag); - if (index_custom < 0 || flag != 0) + int flag,cols; + index_custom = atom->find_custom(&arg[iarg][2],flag,cols); + if (index_custom < 0 || flag || cols) error->all(FLERR,"Set command integer vector does not exist"); set(IVEC); iarg += 2; @@ -587,9 +587,9 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - int flag; - index_custom = atom->find_custom(&arg[iarg][2],flag); - if (index_custom < 0 || flag != 1) + int flag,cols; + index_custom = atom->find_custom(&arg[iarg][2],flag,cols); + if (index_custom < 0 || flag || cols) error->all(FLERR,"Set command floating point vector does not exist"); set(DVEC); iarg += 2; diff --git a/src/utils.cpp b/src/utils.cpp index 8da2efd03d..fd3170859b 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -609,13 +609,12 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod // only match custom array reference with a '*' wildcard // number range in the first pair of square brackets - // OLDSTYLE code if (strncmp(arg[iarg],"i2_",3) == 0 || strncmp(arg[iarg],"d2_",3) == 0) { - ptr1 = strchr(arg[iarg],'['); + char *ptr1 = strchr(arg[iarg],'['); if (ptr1) { - ptr2 = strchr(ptr1,']'); + char *ptr2 = strchr(ptr1,']'); if (ptr2) { *ptr2 = '\0'; if (strchr(ptr1,'*')) { From 0906e94207627972406b5dec45ed4a72f31356c2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 16:13:01 -0400 Subject: [PATCH 304/352] small fixes --- potentials/CC.Lebedeva | 12 +++++------- src/INTERLAYER/pair_drip.cpp | 4 +--- .../tests/manybody-pair-ilp-graphene-hbn.yaml | 1 - 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/potentials/CC.Lebedeva b/potentials/CC.Lebedeva index 930f7b4328..b5599ee0a6 100644 --- a/potentials/CC.Lebedeva +++ b/potentials/CC.Lebedeva @@ -1,14 +1,12 @@ -# Lebedeva Potential. Original values from Lebedeva. May be played with ;) +# DATE: 2018-11-28 UNITS: metal CONTRIBUTOR: Zbigniew Koziol softquake@gmail.com CITATION: Z. Koziol et al.: https://arxiv.org/abs/1803.05162 # -# Cite as: Irina V. Lebedeva, Andrey A. Knizhnik, Andrey M. Popov, Yurii E. Lozovik, Boris V. Potapkin, -# Modeling of graphene-based NEMS -# Physica E 44 (6), 949 (2012) -# https://doi.org/10.1016/j.physe.2011.07.018 -# -# Parameters must be in this order as here, otherwise their values may be changed. +# Lebedeva Potential. https://doi.org/10.1016/j.physe.2011.07.018 + +# Parameters must be in this order as here, otherwise their values may be changed. # The last one, S, is convenient for scaling the potential amplitude. S is a multiplication factor for A, B, C # A B C z0 alpha D1 D2 lambda1 lambda2 S # These are values according to Levedeva et al #C C 10.510 11.6523.34 35.883 3.34 4.16 -0.86232 0.10049 0.48703 0.46445 1.0 +# # These are values by Z. Koziol et al.: https://arxiv.org/abs/1803.05162 C C 14.558 21.204 1.8 3.198 4.16 -0.862 0.10049 0.6 0.4 1.0 diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index b1e877e3ee..dd5277e88c 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -142,9 +142,7 @@ double PairDRIP::init_one(int i, int j) Param& p = params[iparam_ij]; // max cutoff is the main cutoff plus the normal cutoff such that - double cutmax = p.rcut + p.ncut; - - return cutmax; + return p.rcut + p.ncut; } /* ---------------------------------------------------------------------- diff --git a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml index 81f39c1d1d..81f72ec0a9 100644 --- a/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml +++ b/unittest/force-styles/tests/manybody-pair-ilp-graphene-hbn.yaml @@ -9,7 +9,6 @@ prerequisites: ! | pre_commands: ! | variable newton_pair delete variable newton_pair index on - comm_modify cutoff 16.0 post_commands: ! "" input_file: in.bilayer pair_style: hybrid/overlay ilp/graphene/hbn 16.0 1 From 6dafbd2fbea1bff632a7a0cb221810407afee27f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 16:20:00 -0400 Subject: [PATCH 305/352] support metal2real unit conversion --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 14 +++++++++++++- src/INTERLAYER/pair_kolmogorov_crespi_full.cpp | 13 ++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 2e424539b4..7b6469b705 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -61,6 +61,9 @@ PairILPGrapheneHBN::PairILPGrapheneHBN(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; one_coeff = 1; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); if (lmp->citeme) lmp->citeme->add(cite_ilp); @@ -84,7 +87,8 @@ PairILPGrapheneHBN::PairILPGrapheneHBN(LAMMPS *lmp) : Pair(lmp) // always compute energy offset offset_flag = 1; - // turn on the taper function + + // turn on the taper function by default tap_flag = 1; } @@ -195,6 +199,11 @@ void PairILPGrapheneHBN::read_file(char *filename) PotentialFileReader reader(lmp, filename, "ilp/graphene/hbn", unit_convert_flag); char *line; + // transparently convert units for supported conversions + + int unit_convert = reader.get_unit_convert(); + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); + while ((line = reader.next_line(NPARAMS_PER_LINE))) { try { @@ -250,7 +259,10 @@ void PairILPGrapheneHBN::read_file(char *filename) // energies in meV further scaled by S // S = 43.3634 meV = 1 kcal/mol + const double meV = 1e-3*params[nparams].S; + if (unit_convert) meV *= conversion_factor; + params[nparams].C *= meV; params[nparams].C6 *= meV; params[nparams].epsilon *= meV; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index 8387703025..d27a99098f 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -61,6 +61,9 @@ PairKolmogorovCrespiFull::PairKolmogorovCrespiFull(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; one_coeff = 1; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); if (lmp->citeme) lmp->citeme->add(cite_kc); @@ -85,7 +88,7 @@ PairKolmogorovCrespiFull::PairKolmogorovCrespiFull(LAMMPS *lmp) : Pair(lmp) // always compute energy offset offset_flag = 1; - // turn on the taper function + // turn off the taper function by default tap_flag = 0; } @@ -195,6 +198,11 @@ void PairKolmogorovCrespiFull::read_file(char *filename) PotentialFileReader reader(lmp, filename, "kolmogorov/crespi/full", unit_convert_flag); char *line; + // transparently convert units for supported conversions + + int unit_convert = reader.get_unit_convert(); + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); + while ((line = reader.next_line(NPARAMS_PER_LINE))) { try { @@ -248,7 +256,10 @@ void PairKolmogorovCrespiFull::read_file(char *filename) } // energies in meV further scaled by S + const double meV = 1.0e-3*params[nparams].S; + if (unit_convert) meV *= conversion_factor; + params[nparams].C *= meV; params[nparams].A *= meV; params[nparams].C0 *= meV; From 58a86412ec347c5a1848294754c91f68ce820189 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 16:26:59 -0400 Subject: [PATCH 306/352] recover compilation --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 2 +- src/INTERLAYER/pair_kolmogorov_crespi_full.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index 7b6469b705..e4d72e7fe6 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -260,7 +260,7 @@ void PairILPGrapheneHBN::read_file(char *filename) // energies in meV further scaled by S // S = 43.3634 meV = 1 kcal/mol - const double meV = 1e-3*params[nparams].S; + double meV = 1e-3*params[nparams].S; if (unit_convert) meV *= conversion_factor; params[nparams].C *= meV; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index d27a99098f..99896846df 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -257,7 +257,7 @@ void PairKolmogorovCrespiFull::read_file(char *filename) // energies in meV further scaled by S - const double meV = 1.0e-3*params[nparams].S; + double meV = 1.0e-3*params[nparams].S; if (unit_convert) meV *= conversion_factor; params[nparams].C *= meV; From 62564b0a5c842d239ea1d5e9c65272b7e2b1e9d0 Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Tue, 17 Aug 2021 15:52:09 -0600 Subject: [PATCH 307/352] cmake: only use LMP_KOKKOS define in build interface --- cmake/Modules/Packages/KOKKOS.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Modules/Packages/KOKKOS.cmake b/cmake/Modules/Packages/KOKKOS.cmake index 2a47881706..a1cf680266 100644 --- a/cmake/Modules/Packages/KOKKOS.cmake +++ b/cmake/Modules/Packages/KOKKOS.cmake @@ -74,7 +74,7 @@ else() target_link_libraries(lammps PRIVATE kokkos) target_link_libraries(lmp PRIVATE kokkos) endif() -target_compile_definitions(lammps PUBLIC -DLMP_KOKKOS) +target_compile_definitions(lammps PUBLIC $) set(KOKKOS_PKG_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/KOKKOS) set(KOKKOS_PKG_SOURCES ${KOKKOS_PKG_SOURCES_DIR}/kokkos.cpp From bb3c4797b3904eb9cce8b839a664e7c970761e0c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 21:55:12 -0400 Subject: [PATCH 308/352] update some more interlayer potential files --- potentials/CC.KC | 7 ++----- potentials/CC.Lebedeva | 6 +++--- potentials/CH.KC | 2 +- potentials/CH_taper.KC | 2 +- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/potentials/CC.KC b/potentials/CC.KC index 6559eb4120..5e0bc0d89d 100644 --- a/potentials/CC.KC +++ b/potentials/CC.KC @@ -1,8 +1,5 @@ -# Kolmogorov-Crespi Potential +# DATE: 2017-02-28 UNITS: metal CONTRIBUTOR: Jaap Kroes jaapkroes@gmail.com CITATION: Kolmogorov, Crespi, Physical Review B 71, 235415 (2005) +# Kolmogorov-Crespi Potential for pair style kolmogorov/crespi/z # -# Cite as A.N. Kolmogorov & V. H. Crespi, -# Registry-dependent interlayer potential for graphitic systems -# Physical Review B 71, 235415 (2005) -# # z0 C0 C2 C4 C delta lambda A S C C 3.34 15.71 12.29 4.933 3.030 0.578 3.629 10.238 1.0 diff --git a/potentials/CC.Lebedeva b/potentials/CC.Lebedeva index b5599ee0a6..bc2db03f6b 100644 --- a/potentials/CC.Lebedeva +++ b/potentials/CC.Lebedeva @@ -4,9 +4,9 @@ # Parameters must be in this order as here, otherwise their values may be changed. # The last one, S, is convenient for scaling the potential amplitude. S is a multiplication factor for A, B, C -# A B C z0 alpha D1 D2 lambda1 lambda2 S +# A B C z0 alpha D1 D2 lambda1 lambda2 S # These are values according to Levedeva et al -#C C 10.510 11.6523.34 35.883 3.34 4.16 -0.86232 0.10049 0.48703 0.46445 1.0 +#C C 10.510 11.6523.34 35.883 3.34 4.16 -0.86232 0.10049 0.48703 0.46445 1.0 # # These are values by Z. Koziol et al.: https://arxiv.org/abs/1803.05162 -C C 14.558 21.204 1.8 3.198 4.16 -0.862 0.10049 0.6 0.4 1.0 +C C 14.558 21.204 1.8 3.198 4.16 -0.862 0.10049 0.6 0.4 1.0 diff --git a/potentials/CH.KC b/potentials/CH.KC index bfab2954df..0ec32b8dff 100644 --- a/potentials/CH.KC +++ b/potentials/CH.KC @@ -1,5 +1,5 @@ # DATE: 2018-09-12 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: Ouyang, Mandelli, Urbakh, Hod, Nano Letters 18, 6009-6016 (2018). -# Refined parameters for Kolmogorov-Crespi Potential without taper function +# Refined parameters for Kolmogorov-Crespi Potential without taper function for pair style kolmogorov/crespi/full # # z0 C0 C2 C4 C delta lambda A S rcut C C 3.328819 21.847167 12.060173 4.711099 6.678908e-4 0.7718101 3.143921 12.660270 1.0 2.0 diff --git a/potentials/CH_taper.KC b/potentials/CH_taper.KC index 0043b1b9d0..e7f4b566c8 100644 --- a/potentials/CH_taper.KC +++ b/potentials/CH_taper.KC @@ -1,5 +1,5 @@ # DATE: 2018-09-12 UNITS: metal CONTRIBUTOR: Wengen Ouyang w.g.ouyang@gmail.com CITATION: W. Ouyang, D. Mandelli, M. Urbakh and O. Hod, Nano Letters 18, 6009-6016 (2018). -# Refined parameters for Kolmogorov-Crespi Potential with taper function +# Refined parameters for Kolmogorov-Crespi Potential with taper function for pair style kolmogorov/crespi/full # # z0 C0 C2 C4 C delta lambda A S rcut C C 3.416084 20.021583 10.9055107 4.2756354 1.0010836E-2 0.8447122 2.9360584 14.3132588 1.0 2.0 From 661ec1acc3ce3d81ed1a9a0fb3b9be77e7cd030a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 21:55:22 -0400 Subject: [PATCH 309/352] fix typo --- examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot b/examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot index a598c3e6b1..f401dc5677 100644 --- a/examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot +++ b/examples/PACKAGES/interlayer/lebedeva/lebedeva00.plot @@ -28,7 +28,7 @@ set yrange [-0.002:0.001] #set yrange [*:*] plot \ - "LamppsResult.dat" u 2:5 t "Leb LAMMPS",\ + "LammpsResult.dat" u 2:5 t "Leb LAMMPS",\ "PerlResult.dat" u 1:($4*0.001/2.) w l t "Leb Perl" exit From bbb8adf656fe5235b3429c0ffa6bac3e7980336e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 21:56:17 -0400 Subject: [PATCH 310/352] update kolmogorov/crespi/z and lebedeva/z pair styles to use new file reader and unit conversion --- src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 226 ++++++++------------ src/INTERLAYER/pair_kolmogorov_crespi_z.h | 5 +- src/INTERLAYER/pair_lebedeva_z.cpp | 221 ++++++++----------- src/INTERLAYER/pair_lebedeva_z.h | 5 +- 4 files changed, 192 insertions(+), 265 deletions(-) diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp index 481e9f6604..c28a405adc 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp @@ -30,6 +30,8 @@ #include "force.h" #include "memory.h" #include "neigh_list.h" +#include "potential_file_reader.h" +#include "tokenizer.h" #include #include @@ -45,14 +47,15 @@ PairKolmogorovCrespiZ::PairKolmogorovCrespiZ(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; restartinfo = 0; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); // initialize element to parameter maps nelements = 0; elements = nullptr; nparams = maxparam = 0; params = nullptr; - elem2param = nullptr; - map = nullptr; // always compute energy offset offset_flag = 1; @@ -65,7 +68,6 @@ PairKolmogorovCrespiZ::~PairKolmogorovCrespiZ() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); memory->destroy(offset); } @@ -159,8 +161,7 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag) } if (evflag) { - ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0, - fsum,fsum,fpair,delx,dely,delz); + ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0,fsum,fsum,fpair,delx,dely,delz); } } } @@ -176,17 +177,16 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag) void PairKolmogorovCrespiZ::allocate() { allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes+1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + memory->create(setflag,n,n,"pair:setflag"); + for (int i = 1; i < n; i++) + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(offset,n+1,n+1,"pair:offset"); - map = new int[atom->ntypes+1]; + memory->create(cutsq,n,n,"pair:cutsq"); + memory->create(offset,n,n,"pair:offset"); + map = new int[n]; } /* ---------------------------------------------------------------------- @@ -200,15 +200,6 @@ void PairKolmogorovCrespiZ::settings(int narg, char **arg) error->all(FLERR,"ERROR: requires hybrid/overlay pair_style"); cut_global = utils::numeric(FLERR,arg[0],false,lmp); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } } /* ---------------------------------------------------------------------- @@ -232,7 +223,6 @@ void PairKolmogorovCrespiZ::coeff(int narg, char **arg) for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { if ((map[i] >=0) && (map[j] >= 0)) { - cut[i][j] = cut_global; setflag[i][j] = 1; count++; } @@ -253,14 +243,14 @@ double PairKolmogorovCrespiZ::init_one(int i, int j) if (!offset_flag) error->all(FLERR,"Must use 'pair_modify shift yes' with this pair style"); - if (offset_flag && (cut[i][j] > 0.0)) { + if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; Param& p = params[iparam_ij]; - offset[i][j] = -p.A*pow(p.z0/cut[i][j],6); + offset[i][j] = -p.A*pow(p.z0/cut_global,6); } else offset[i][j] = 0.0; offset[j][i] = offset[i][j]; - return cut[i][j]; + return cut_global; } /* ---------------------------------------------------------------------- @@ -269,133 +259,108 @@ double PairKolmogorovCrespiZ::init_one(int i, int j) void PairKolmogorovCrespiZ::read_file(char *filename) { - int params_per_line = 11; - char **words = new char*[params_per_line+1]; memory->sfree(params); params = nullptr; nparams = maxparam = 0; // open file on proc 0 - FILE *fp; if (comm->me == 0) { - fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) - error->one(FLERR,"Cannot open KC potential file {}: {}",filename, utils::getsyserror()); - } + PotentialFileReader reader(lmp, filename, "kolmogorov/crespi/z", unit_convert_flag); + char *line; - // read each line out of file, skipping blank lines or leading '#' - // store line of params if all 3 element tags are in element list + // transparently convert units for supported conversions - int i,j,n,m,nwords,ielement,jelement; - char line[MAXLINE],*ptr; - int eof = 0; + int unit_convert = reader.get_unit_convert(); + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); + while ((line = reader.next_line(NPARAMS_PER_LINE))) { - // strip comment, skip line if blank + try { + ValueTokenizer values(line); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + std::string iname = values.next_string(); + std::string jname = values.next_string(); - // concatenate additional lines until have params_per_line words + // ielement,jelement = 1st args + // if both args are in element list, then parse this line + // else skip to next entry in file + int ielement, jelement; - while (nwords < params_per_line) { - n = strlen(line); - if (comm->me == 0) { - ptr = fgets(&line[n],MAXLINE-n,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + for (ielement = 0; ielement < nelements; ielement++) + if (iname == elements[ielement]) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (jname == elements[jelement]) break; + if (jelement == nelements) continue; + + // expand storage, if needed + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + + // make certain all addional allocated storage is initialized + // to avoid false positives when checking with valgrind + + memset(params + nparams, 0, DELTA*sizeof(Param)); + } + + // load up parameter settings and error check their values + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].z0 = values.next_double(); + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].lambda = values.next_double(); + params[nparams].A = values.next_double(); + // S provides a convenient scaling of all energies + params[nparams].S = values.next_double(); + + } catch (TokenizerException &e) { + error->one(FLERR, e.what()); } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); + + // energies in meV further scaled by S + // S = 43.3634 meV = 1 kcal/mol + + double meV = 1e-3*params[nparams].S; + if (unit_convert) meV *= conversion_factor; + + params[nparams].C *= meV; + params[nparams].A *= meV; + params[nparams].C0 *= meV; + params[nparams].C2 *= meV; + params[nparams].C4 *= meV; + + // precompute some quantities + params[nparams].delta2inv = pow(params[nparams].delta,-2); + params[nparams].z06 = pow(params[nparams].z0,6); + + nparams++; + if (nparams >= pow(atom->ntypes,3)) break; } - if (nwords != params_per_line) - error->all(FLERR,"Insufficient format in KC potential file"); + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - // words = ptrs to all words in line - - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; - - // ielement,jelement = 1st args - // if these 2 args are in element list, then parse this line - // else skip to next line (continue) - - for (ielement = 0; ielement < nelements; ielement++) - if (strcmp(words[0],elements[ielement]) == 0) break; - if (ielement == nelements) continue; - for (jelement = 0; jelement < nelements; jelement++) - if (strcmp(words[1],elements[jelement]) == 0) break; - if (jelement == nelements) continue; - - // load up parameter settings and error check their values - - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); - - // make certain all addional allocated storage is initialized - // to avoid false positives when checking with valgrind - - memset(params + nparams, 0, DELTA*sizeof(Param)); + if (comm->me != 0) { + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); } - params[nparams].ielement = ielement; - params[nparams].jelement = jelement; - params[nparams].z0 = atof(words[2]); - params[nparams].C0 = atof(words[3]); - params[nparams].C2 = atof(words[4]); - params[nparams].C4 = atof(words[5]); - params[nparams].C = atof(words[6]); - params[nparams].delta = atof(words[7]); - params[nparams].lambda = atof(words[8]); - params[nparams].A = atof(words[9]); - // S provides a convenient scaling of all energies - params[nparams].S = atof(words[10]); - - // energies in meV further scaled by S - double meV = 1.0e-3*params[nparams].S; - params[nparams].C *= meV; - params[nparams].A *= meV; - params[nparams].C0 *= meV; - params[nparams].C2 *= meV; - params[nparams].C4 *= meV; - - // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2); - params[nparams].z06 = pow(params[nparams].z0,6); - - nparams++; - if (nparams >= pow(atom->ntypes,3)) break; + MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); } + memory->destroy(elem2param); memory->create(elem2param,nelements,nelements,"pair:elem2param"); - for (i = 0; i < nelements; i++) { - for (j = 0; j < nelements; j++) { - n = -1; - for (m = 0; m < nparams; m++) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + int n = -1; + for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); n = m; @@ -405,7 +370,6 @@ void PairKolmogorovCrespiZ::read_file(char *filename) elem2param[i][j] = n; } } - delete [] words; } /* ---------------------------------------------------------------------- */ diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.h b/src/INTERLAYER/pair_kolmogorov_crespi_z.h index 9db07b59f7..d036f7bc76 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.h +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.h @@ -34,9 +34,9 @@ class PairKolmogorovCrespiZ : public Pair { void coeff(int, char **); double init_one(int, int); - protected: - int me; + static constexpr int NPARAMS_PER_LINE = 11; +protected: struct Param { double z0, C0, C2, C4, C, delta, lambda, A, S; double delta2inv, z06; @@ -45,7 +45,6 @@ class PairKolmogorovCrespiZ : public Pair { Param *params; // parameter set for I-J interactions double cut_global; - double **cut; double **offset; void read_file(char *); void allocate(); diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp index 13a7797534..e275d7c475 100644 --- a/src/INTERLAYER/pair_lebedeva_z.cpp +++ b/src/INTERLAYER/pair_lebedeva_z.cpp @@ -31,6 +31,8 @@ #include "force.h" #include "memory.h" #include "neigh_list.h" +#include "potential_file_reader.h" +#include "tokenizer.h" #include #include @@ -46,6 +48,9 @@ PairLebedevaZ::PairLebedevaZ(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; restartinfo = 0; + manybody_flag = 1; + centroidstressflag = CENTROID_NOTAVAIL; + unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); // initialize element to parameter maps params = nullptr; @@ -61,7 +66,6 @@ PairLebedevaZ::~PairLebedevaZ() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); memory->destroy(offset); } @@ -167,17 +171,16 @@ void PairLebedevaZ::compute(int eflag, int vflag) void PairLebedevaZ::allocate() { allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes+1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) + memory->create(setflag,n,n,"pair:setflag"); + for (int i = 1; i < n; i++) + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(offset,n+1,n+1,"pair:offset"); - map = new int[atom->ntypes+1]; + memory->create(cutsq,n,n,"pair:cutsq"); + memory->create(offset,n,n,"pair:offset"); + map = new int[n]; } /* ---------------------------------------------------------------------- @@ -191,15 +194,6 @@ void PairLebedevaZ::settings(int narg, char **arg) error->all(FLERR,"Pair style lebedeva/z requires using hybrid/overlay"); cut_global = utils::numeric(FLERR,arg[0],false,lmp); - - // reset cutoffs that have been explicitly set - - if (allocated) { - int i,j; - for (i = 1; i <= atom->ntypes; i++) - for (j = i; j <= atom->ntypes; j++) - if (setflag[i][j]) cut[i][j] = cut_global; - } } /* ---------------------------------------------------------------------- @@ -223,7 +217,6 @@ void PairLebedevaZ::coeff(int narg, char **arg) for (int i = ilo; i <= ihi; i++) { for (int j = MAX(jlo,i); j <= jhi; j++) { if ((map[i] >= 0) && (map[j] >= 0)) { - cut[i][j] = cut_global; setflag[i][j] = 1; count++; } @@ -233,7 +226,6 @@ void PairLebedevaZ::coeff(int narg, char **arg) if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); } - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ @@ -244,14 +236,14 @@ double PairLebedevaZ::init_one(int i, int j) if (!offset_flag) error->all(FLERR,"Must use 'pair_modify shift yes' with this pair style"); - if (offset_flag && (cut[i][j] > 0.0)) { + if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; Param& p = params[iparam_ij]; - offset[i][j] = -p.A*pow(p.z0/cut[i][j],6); + offset[i][j] = -p.A*pow(p.z0/cut_global,6); } else offset[i][j] = 0.0; offset[j][i] = offset[i][j]; - return cut[i][j]; + return cut_global; } /* ---------------------------------------------------------------------- @@ -261,133 +253,107 @@ double PairLebedevaZ::init_one(int i, int j) void PairLebedevaZ::read_file(char *filename) { int params_per_line = 12; - char **words = new char*[params_per_line+1]; memory->sfree(params); params = nullptr; nparams = maxparam = 0; // open file on proc 0 - FILE *fp; if (comm->me == 0) { - fp = utils::open_potential(filename,lmp,nullptr); - if (fp == nullptr) { - char str[128]; - sprintf(str,"Cannot open Lebedeva potential file %s",filename); - error->one(FLERR,str); - } - } + PotentialFileReader reader(lmp, filename, "lebedeva/z", unit_convert_flag); + char *line; - // read each line out of file, skipping blank lines or leading '#' - // store line of params if all 3 element tags are in element list + // transparently convert units for supported conversions - int i,j,n,m,nwords,ielement,jelement; - char line[MAXLINE],*ptr; - int eof = 0; + int unit_convert = reader.get_unit_convert(); + double conversion_factor = utils::get_conversion_factor(utils::ENERGY, unit_convert); - while (1) { - if (comm->me == 0) { - ptr = fgets(line,MAXLINE,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; - } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); + while ((line = reader.next_line(NPARAMS_PER_LINE))) { - // strip comment, skip line if blank + try { + ValueTokenizer values(line); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); - if (nwords == 0) continue; + std::string iname = values.next_string(); + std::string jname = values.next_string(); - // concatenate additional lines until have params_per_line words + // ielement,jelement = 1st args + // if both args are in element list, then parse this line + // else skip to next entry in file + int ielement, jelement; - while (nwords < params_per_line) { - n = strlen(line); - if (comm->me == 0) { - ptr = fgets(&line[n],MAXLINE-n,fp); - if (ptr == nullptr) { - eof = 1; - fclose(fp); - } else n = strlen(line) + 1; + for (ielement = 0; ielement < nelements; ielement++) + if (iname == elements[ielement]) break; + if (ielement == nelements) continue; + for (jelement = 0; jelement < nelements; jelement++) + if (jname == elements[jelement]) break; + if (jelement == nelements) continue; + + // expand storage, if needed + + if (nparams == maxparam) { + maxparam += DELTA; + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + + // make certain all addional allocated storage is initialized + // to avoid false positives when checking with valgrind + + memset(params + nparams, 0, DELTA*sizeof(Param)); + } + + // load up parameter settings and error check their values + + params[nparams].ielement = ielement; + params[nparams].jelement = jelement; + params[nparams].A = values.next_double(); + params[nparams].B = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].alpha = values.next_double(); + params[nparams].D1 = values.next_double(); + params[nparams].D2 = values.next_double(); + params[nparams].lambda1 = values.next_double(); + params[nparams].lambda2 = values.next_double(); + // S provides a convenient scaling of all energies + params[nparams].S = values.next_double(); + + } catch (TokenizerException &e) { + error->one(FLERR, e.what()); } - MPI_Bcast(&eof,1,MPI_INT,0,world); - if (eof) break; - MPI_Bcast(&n,1,MPI_INT,0,world); - MPI_Bcast(line,n,MPI_CHAR,0,world); - if ((ptr = strchr(line,'#'))) *ptr = '\0'; - nwords = utils::count_words(line); + + // energies in meV further scaled by S + // S = 43.3634 meV = 1 kcal/mol + + double meV = 1e-3*params[nparams].S; + if (unit_convert) meV *= conversion_factor; + + params[nparams].A *= meV; + params[nparams].B *= meV; + params[nparams].C *= meV; + + // precompute some quantities. That speeds up later process + params[nparams].z02 = pow(params[nparams].z0,2); + params[nparams].z06 = pow(params[nparams].z0,6); + + nparams++; + if (nparams >= pow(atom->ntypes,3)) break; } - if (nwords != params_per_line) - error->all(FLERR,"Insufficient format in Lebedeva potential file"); + MPI_Bcast(&nparams, 1, MPI_INT, 0, world); + MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); - // words = ptrs to all words in line - - nwords = 0; - words[nwords++] = strtok(line," \t\n\r\f"); - while ((words[nwords++] = strtok(nullptr," \t\n\r\f"))) continue; - - // ielement,jelement = 1st args - // if these 2 args are in element list, then parse this line - // else skip to next line (continue) - - for (ielement = 0; ielement < nelements; ielement++) - if (strcmp(words[0],elements[ielement]) == 0) break; - if (ielement == nelements) continue; - for (jelement = 0; jelement < nelements; jelement++) - if (strcmp(words[1],elements[jelement]) == 0) break; - if (jelement == nelements) continue; - - // load up parameter settings and error check their values - - if (nparams == maxparam) { - maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), - "pair:params"); - - // make certain all addional allocated storage is initialized - // to avoid false positives when checking with valgrind - - memset(params + nparams, 0, DELTA*sizeof(Param)); + if (comm->me != 0) { + params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); } - params[nparams].ielement = ielement; - params[nparams].jelement = jelement; - params[nparams].A = atof(words[2]); - params[nparams].B = atof(words[3]); - params[nparams].C = atof(words[4]); - params[nparams].z0 = atof(words[5]); - params[nparams].alpha = atof(words[6]); - params[nparams].D1 = atof(words[7]); - params[nparams].D2 = atof(words[8]); - params[nparams].lambda1 = atof(words[9]); - params[nparams].lambda2 = atof(words[10]); - // S provides a convenient scaling of all energies - params[nparams].S = atof(words[11]); - // energies in meV further scaled by S - double meV = 1.0e-3*params[nparams].S; - params[nparams].A *= meV; - params[nparams].B *= meV; - params[nparams].C *= meV; - - // precompute some quantities. That speeds up later process - params[nparams].z02 = pow(params[nparams].z0,2); - params[nparams].z06 = pow(params[nparams].z0,6); - - nparams++; - if (nparams >= pow(atom->ntypes,3)) break; + MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); } + memory->destroy(elem2param); memory->create(elem2param,nelements,nelements,"pair:elem2param"); - for (i = 0; i < nelements; i++) { - for (j = 0; j < nelements; j++) { - n = -1; - for (m = 0; m < nparams; m++) { + for (int i = 0; i < nelements; i++) { + for (int j = 0; j < nelements; j++) { + int n = -1; + for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); n = m; @@ -397,7 +363,6 @@ void PairLebedevaZ::read_file(char *filename) elem2param[i][j] = n; } } - delete [] words; } /* ---------------------------------------------------------------------- */ diff --git a/src/INTERLAYER/pair_lebedeva_z.h b/src/INTERLAYER/pair_lebedeva_z.h index afe2ac1b81..9b2fbd56f8 100644 --- a/src/INTERLAYER/pair_lebedeva_z.h +++ b/src/INTERLAYER/pair_lebedeva_z.h @@ -34,9 +34,9 @@ class PairLebedevaZ : public Pair { void coeff(int, char **); double init_one(int, int); - protected: - int me; + static constexpr int NPARAMS_PER_LINE = 12; + protected: struct Param { double z0, A, B, C, alpha, D1, D2, lambda1, lambda2, S; double z02, z06; @@ -45,7 +45,6 @@ class PairLebedevaZ : public Pair { Param *params; // parameter set for I-J interactions double cut_global; - double **cut; double **offset; void read_file(char *); void allocate(); From 96b563dffcc49d11685ccc9a8e0bcb61447a3c62 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 22:34:32 -0400 Subject: [PATCH 311/352] move common taper functions for interlayer potentials to separate header --- src/INTERLAYER/interlayer_taper.h | 67 +++++++++++++++++++ src/INTERLAYER/pair_coul_shield.cpp | 6 +- src/INTERLAYER/pair_coul_shield.h | 42 ------------ src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 2 + src/INTERLAYER/pair_ilp_graphene_hbn.h | 42 ------------ .../pair_kolmogorov_crespi_full.cpp | 2 + src/INTERLAYER/pair_kolmogorov_crespi_full.h | 44 ------------ 7 files changed, 75 insertions(+), 130 deletions(-) create mode 100644 src/INTERLAYER/interlayer_taper.h diff --git a/src/INTERLAYER/interlayer_taper.h b/src/INTERLAYER/interlayer_taper.h new file mode 100644 index 0000000000..a496daca5d --- /dev/null +++ b/src/INTERLAYER/interlayer_taper.h @@ -0,0 +1,67 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +// Common definition of taper function and its derivative for interlayer potentials + +#ifndef LMP_INTERLAYER_TAPER_H +#define LMP_INTERLAYER_TAPER_H + +namespace LAMMPS_NS { +namespace InterLayer { + + static constexpr double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; + + /* ----Calculate the long-range cutoff term */ + static inline double calc_Tap(double r_ij, double Rcut) + { + double Tap, r; + + r = r_ij / Rcut; + if (r >= 1.0) { + Tap = 0.0; + } else { + Tap = Tap_coeff[7] * r + Tap_coeff[6]; + Tap = Tap * r + Tap_coeff[5]; + Tap = Tap * r + Tap_coeff[4]; + Tap = Tap * r + Tap_coeff[3]; + Tap = Tap * r + Tap_coeff[2]; + Tap = Tap * r + Tap_coeff[1]; + Tap = Tap * r + Tap_coeff[0]; + } + + return (Tap); + } + + /* ----Calculate the derivatives of long-range cutoff term */ + static inline double calc_dTap(double r_ij, double Rcut) + { + double dTap, r; + + r = r_ij / Rcut; + if (r >= 1.0) { + dTap = 0.0; + } else { + dTap = 7.0 * Tap_coeff[7] * r + 6.0 * Tap_coeff[6]; + dTap = dTap * r + 5.0 * Tap_coeff[5]; + dTap = dTap * r + 4.0 * Tap_coeff[4]; + dTap = dTap * r + 3.0 * Tap_coeff[3]; + dTap = dTap * r + 2.0 * Tap_coeff[2]; + dTap = dTap * r + Tap_coeff[1]; + dTap = dTap / Rcut; + } + + return (dTap); + } +} // namespace InterLayer +} // namespace LAMMPS_NS +#endif diff --git a/src/INTERLAYER/pair_coul_shield.cpp b/src/INTERLAYER/pair_coul_shield.cpp index dbb12abf2e..da2a2cf2fd 100644 --- a/src/INTERLAYER/pair_coul_shield.cpp +++ b/src/INTERLAYER/pair_coul_shield.cpp @@ -24,6 +24,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "interlayer_taper.h" #include "math_special.h" #include "memory.h" #include "neigh_list.h" @@ -32,6 +33,7 @@ #include using namespace LAMMPS_NS; +using namespace InterLayer; /* ---------------------------------------------------------------------- */ @@ -257,7 +259,7 @@ double PairCoulShield::init_one(int i, int j) r3 = r * r * r; rarg = 1.0 / sigmae[i][j]; th = r3 + MathSpecial::cube(rarg); - epsr = 1.0 / pow(th, 1.0/3.0); + epsr = 1.0 / pow(th, 1.0 / 3.0); offset[i][j] = qqrd2e * q[i] * q[j] * epsr; } else offset[i][j] = 0.0; @@ -362,7 +364,7 @@ double PairCoulShield::single(int i, int j, int itype, int jtype, double rsq, do r3 = rsq * r; rarg = 1.0 / sigmae[itype][jtype]; th = r3 + MathSpecial::cube(rarg); - epsr = 1.0 / pow(th, 1.0/3.0); + epsr = 1.0 / pow(th, 1.0 / 3.0); depsdr = epsr * epsr; depsdr *= depsdr; Vc = qqrd2e * q[i] * q[j] * epsr; diff --git a/src/INTERLAYER/pair_coul_shield.h b/src/INTERLAYER/pair_coul_shield.h index 4413732577..10ace5ebd2 100644 --- a/src/INTERLAYER/pair_coul_shield.h +++ b/src/INTERLAYER/pair_coul_shield.h @@ -46,51 +46,9 @@ class PairCoulShield : public Pair { double cut_global; double **cut; double **sigmae, **offset; - //double a_eps, b_eps, eps_s; int tap_flag; void allocate(); - - /* ----Calculate the long-range cutoff term */ - inline double calc_Tap(double r_ij, double Rcut) - { - double Tap, r; - //int Tap_coeff[8] = {1,0,0,0,-35,84,-70,20}; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - Tap = 0.0; - - Tap = Tap_coeff[7] * r + Tap_coeff[6]; - Tap = Tap * r + Tap_coeff[5]; - Tap = Tap * r + Tap_coeff[4]; - Tap = Tap * r + Tap_coeff[3]; - Tap = Tap * r + Tap_coeff[2]; - Tap = Tap * r + Tap_coeff[1]; - Tap = Tap * r + Tap_coeff[0]; - - return (Tap); - } - - /* ----Calculate the derivatives of long-range cutoff term */ - inline double calc_dTap(double r_ij, double Rcut) - { - double dTap, r; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - dTap = 0.0; - - dTap = 7.0 * Tap_coeff[7] * r + 6.0 * Tap_coeff[6]; - dTap = dTap * r + 5.0 * Tap_coeff[5]; - dTap = dTap * r + 4.0 * Tap_coeff[4]; - dTap = dTap * r + 3.0 * Tap_coeff[3]; - dTap = dTap * r + 2.0 * Tap_coeff[2]; - dTap = dTap * r + Tap_coeff[1]; - dTap = dTap / Rcut; - - return (dTap); - } }; } // namespace LAMMPS_NS diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index e4d72e7fe6..f3bce6dcaf 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -35,11 +35,13 @@ #include "neighbor.h" #include "potential_file_reader.h" #include "tokenizer.h" +#include "interlayer_taper.h" #include #include using namespace LAMMPS_NS; +using namespace InterLayer; #define MAXLINE 1024 #define DELTA 4 diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.h b/src/INTERLAYER/pair_ilp_graphene_hbn.h index 5cae119905..476822ef82 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.h +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.h @@ -71,48 +71,6 @@ class PairILPGrapheneHBN : public Pair { void read_file(char *); void allocate(); - - /* ----Calculate the long-range cutoff term */ - inline double calc_Tap(double r_ij, double Rcut) - { - double Tap, r; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - if (r >= 1.0) { - Tap = 0.0; - } else { - Tap = Tap_coeff[7] * r + Tap_coeff[6]; - Tap = Tap * r + Tap_coeff[5]; - Tap = Tap * r + Tap_coeff[4]; - Tap = Tap * r + Tap_coeff[3]; - Tap = Tap * r + Tap_coeff[2]; - Tap = Tap * r + Tap_coeff[1]; - Tap = Tap * r + Tap_coeff[0]; - } - return (Tap); - } - - /* ----Calculate the derivatives of long-range cutoff term */ - inline double calc_dTap(double r_ij, double Rcut) - { - double dTap, r; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - if (r >= 1.0) { - dTap = 0.0; - } else { - dTap = 7.0 * Tap_coeff[7] * r + 6.0 * Tap_coeff[6]; - dTap = dTap * r + 5.0 * Tap_coeff[5]; - dTap = dTap * r + 4.0 * Tap_coeff[4]; - dTap = dTap * r + 3.0 * Tap_coeff[3]; - dTap = dTap * r + 2.0 * Tap_coeff[2]; - dTap = dTap * r + Tap_coeff[1]; - dTap = dTap / Rcut; - } - return (dTap); - } }; } // namespace LAMMPS_NS diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index 99896846df..cbab6e07d1 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -28,6 +28,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "interlayer_taper.h" #include "memory.h" #include "my_page.h" #include "neigh_list.h" @@ -40,6 +41,7 @@ #include using namespace LAMMPS_NS; +using namespace InterLayer; #define MAXLINE 1024 #define DELTA 4 diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.h b/src/INTERLAYER/pair_kolmogorov_crespi_full.h index 4744375302..fb45a1cb02 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.h +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.h @@ -70,50 +70,6 @@ class PairKolmogorovCrespiFull : public Pair { void read_file(char *); void allocate(); - - /* ----Calculate the long-range cutoff term */ - inline double calc_Tap(double r_ij, double Rcut) - { - double Tap, r; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - if (r >= 1.0) { - Tap = 0.0; - } else { - Tap = Tap_coeff[7] * r + Tap_coeff[6]; - Tap = Tap * r + Tap_coeff[5]; - Tap = Tap * r + Tap_coeff[4]; - Tap = Tap * r + Tap_coeff[3]; - Tap = Tap * r + Tap_coeff[2]; - Tap = Tap * r + Tap_coeff[1]; - Tap = Tap * r + Tap_coeff[0]; - } - - return (Tap); - } - - /* ----Calculate the derivatives of long-range cutoff term */ - inline double calc_dTap(double r_ij, double Rcut) - { - double dTap, r; - double Tap_coeff[8] = {1.0, 0.0, 0.0, 0.0, -35.0, 84.0, -70.0, 20.0}; - - r = r_ij / Rcut; - if (r >= 1.0) { - dTap = 0.0; - } else { - dTap = 7.0 * Tap_coeff[7] * r + 6.0 * Tap_coeff[6]; - dTap = dTap * r + 5.0 * Tap_coeff[5]; - dTap = dTap * r + 4.0 * Tap_coeff[4]; - dTap = dTap * r + 3.0 * Tap_coeff[3]; - dTap = dTap * r + 2.0 * Tap_coeff[2]; - dTap = dTap * r + Tap_coeff[1]; - dTap = dTap / Rcut; - } - - return (dTap); - } }; } // namespace LAMMPS_NS From f470964393354cc8b51ecac34130f50a8d4774bf Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 22:35:05 -0400 Subject: [PATCH 312/352] apply clang-format --- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 592 +++++++++--------- src/INTERLAYER/pair_ilp_graphene_hbn.h | 1 - .../pair_kolmogorov_crespi_full.cpp | 591 +++++++++-------- src/INTERLAYER/pair_kolmogorov_crespi_full.h | 7 +- src/INTERLAYER/pair_kolmogorov_crespi_z.cpp | 141 ++--- src/INTERLAYER/pair_kolmogorov_crespi_z.h | 2 +- src/INTERLAYER/pair_lebedeva_z.cpp | 1 - 7 files changed, 662 insertions(+), 673 deletions(-) diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index f3bce6dcaf..b68ed80486 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -48,14 +47,14 @@ using namespace InterLayer; #define PGDELTA 1 static const char cite_ilp[] = - "@Article{Ouyang2018\n" - " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n" - " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n" - " journal = {Nano Letters},\n" - " volume = 18,\n" - " pages = {6009}\n" - " year = 2018,\n" - "}\n\n"; + "@Article{Ouyang2018\n" + " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n" + " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n" + " journal = {Nano Letters},\n" + " volume = 18,\n" + " pages = {6009}\n" + " year = 2018,\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ @@ -100,8 +99,8 @@ PairILPGrapheneHBN::~PairILPGrapheneHBN() { memory->destroy(ILP_numneigh); memory->sfree(ILP_firstneigh); - delete [] ipage; - delete [] pvector; + delete[] ipage; + delete[] pvector; memory->destroy(normal); memory->destroy(dnormal); memory->destroy(dnormdri); @@ -109,7 +108,6 @@ PairILPGrapheneHBN::~PairILPGrapheneHBN() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); memory->destroy(offset); } @@ -125,17 +123,15 @@ PairILPGrapheneHBN::~PairILPGrapheneHBN() void PairILPGrapheneHBN::allocate() { allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes + 1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; + memory->create(setflag, n, n, "pair:setflag"); + for (int i = 1; i < n; i++) + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(offset,n+1,n+1,"pair:offset"); - map = new int[atom->ntypes+1]; + memory->create(cutsq, n, n, "pair:cutsq"); + memory->create(offset, n, n, "pair:offset"); + map = new int[n]; } /* ---------------------------------------------------------------------- @@ -144,12 +140,12 @@ void PairILPGrapheneHBN::allocate() void PairILPGrapheneHBN::settings(int narg, char **arg) { - if (narg < 1 || narg > 2) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(force->pair_style,"hybrid/overlay")!=0) - error->all(FLERR,"ERROR: requires hybrid/overlay pair_style"); + if (narg < 1 || narg > 2) error->all(FLERR, "Illegal pair_style command"); + if (strcmp(force->pair_style, "hybrid/overlay") != 0) + error->all(FLERR, "ERROR: requires hybrid/overlay pair_style"); - cut_global = utils::numeric(FLERR,arg[0],false,lmp); - if (narg == 2) tap_flag = utils::numeric(FLERR,arg[1],false,lmp); + cut_global = utils::numeric(FLERR, arg[0], false, lmp); + if (narg == 2) tap_flag = utils::numeric(FLERR, arg[1], false, lmp); } /* ---------------------------------------------------------------------- @@ -160,26 +156,26 @@ void PairILPGrapheneHBN::coeff(int narg, char **arg) { if (!allocated) allocate(); - map_element2type(narg-3,arg+3); + map_element2type(narg - 3, arg + 3); read_file(arg[2]); } - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ 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, "All pair coeffs are not set"); + if (!offset_flag) error->all(FLERR, "Must use 'pair_modify shift yes' with this pair style"); - if (offset_flag && (cut_global > 0.0)) { + if (offset_flag && (cut_global > 0.0)) { int iparam_ij = elem2param[map[i]][map[j]]; - Param& p = params[iparam_ij]; - offset[i][j] = -p.C6*pow(1.0/cut_global,6)/(1.0 + exp(-p.d*(cut_global/p.seff - 1.0))); - } else offset[i][j] = 0.0; + Param &p = params[iparam_ij]; + offset[i][j] = + -p.C6 * pow(1.0 / cut_global, 6) / (1.0 + exp(-p.d * (cut_global / p.seff - 1.0))); + } else + offset[i][j] = 0.0; offset[j][i] = offset[i][j]; return cut_global; @@ -230,30 +226,30 @@ void PairILPGrapheneHBN::read_file(char *filename) if (nparams == maxparam) { maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); // make certain all addional allocated storage is initialized // to avoid false positives when checking with valgrind - memset(params + nparams, 0, DELTA*sizeof(Param)); + memset(params + nparams, 0, DELTA * sizeof(Param)); } // load up parameter settings and error check their values params[nparams].ielement = ielement; params[nparams].jelement = jelement; - params[nparams].z0 = values.next_double(); - params[nparams].alpha = values.next_double(); - params[nparams].delta = values.next_double(); - params[nparams].epsilon = values.next_double(); - params[nparams].C = values.next_double(); - params[nparams].d = values.next_double(); - params[nparams].sR = values.next_double(); - params[nparams].reff = values.next_double(); - params[nparams].C6 = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].alpha = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].epsilon = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].d = values.next_double(); + params[nparams].sR = values.next_double(); + params[nparams].reff = values.next_double(); + params[nparams].C6 = values.next_double(); // S provides a convenient scaling of all energies - params[nparams].S = values.next_double(); - params[nparams].rcut = values.next_double(); + params[nparams].S = values.next_double(); + params[nparams].rcut = values.next_double(); } catch (TokenizerException &e) { error->one(FLERR, e.what()); @@ -262,7 +258,7 @@ void PairILPGrapheneHBN::read_file(char *filename) // energies in meV further scaled by S // S = 43.3634 meV = 1 kcal/mol - double meV = 1e-3*params[nparams].S; + double meV = 1e-3 * params[nparams].S; if (unit_convert) meV *= conversion_factor; params[nparams].C *= meV; @@ -270,8 +266,8 @@ void PairILPGrapheneHBN::read_file(char *filename) params[nparams].epsilon *= meV; // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2.0); - params[nparams].lambda = params[nparams].alpha/params[nparams].z0; + params[nparams].delta2inv = pow(params[nparams].delta, -2.0); + params[nparams].lambda = params[nparams].alpha / params[nparams].z0; params[nparams].seff = params[nparams].sR * params[nparams].reff; nparams++; @@ -281,27 +277,27 @@ void PairILPGrapheneHBN::read_file(char *filename) MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); if (comm->me != 0) { - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); } - MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); memory->destroy(cutILPsq); - memory->create(elem2param,nelements,nelements,"pair:elem2param"); - memory->create(cutILPsq,nelements,nelements,"pair:cutILPsq"); + memory->create(elem2param, nelements, nelements, "pair:elem2param"); + memory->create(cutILPsq, nelements, nelements, "pair:cutILPsq"); for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"ILP Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "ILP Potential file has duplicate entry"); n = m; } } - if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + if (n < 0) error->all(FLERR, "Potential file is missing an entry"); elem2param[i][j] = n; - cutILPsq[i][j] = params[n].rcut*params[n].rcut; + cutILPsq[i][j] = params[n].rcut * params[n].rcut; } } } @@ -313,13 +309,13 @@ void PairILPGrapheneHBN::read_file(char *filename) void PairILPGrapheneHBN::init_style() { if (force->newton_pair == 0) - error->all(FLERR,"Pair style ilp/graphene/hbn requires newton pair on"); + error->all(FLERR, "Pair style ilp/graphene/hbn requires newton pair on"); if (!atom->molecule_flag) - error->all(FLERR,"Pair style ilp/graphene/hbn requires atom attribute molecule"); + error->all(FLERR, "Pair style ilp/graphene/hbn requires atom attribute molecule"); // need a full neighbor list, including neighbors of ghosts - int irequest = neighbor->request(this,instance_me); + int irequest = neighbor->request(this, instance_me); neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; neighbor->requests[irequest]->ghost = 1; @@ -333,21 +329,20 @@ void PairILPGrapheneHBN::init_style() if (oneatom != neighbor->oneatom) create = 1; if (create) { - delete [] ipage; + delete[] ipage; pgsize = neighbor->pgsize; oneatom = neighbor->oneatom; - int nmypage= comm->nthreads; + int nmypage = comm->nthreads; ipage = new MyPage[nmypage]; - for (int i = 0; i < nmypage; i++) - ipage[i].init(oneatom,pgsize,PGDELTA); + for (int i = 0; i < nmypage; i++) ipage[i].init(oneatom, pgsize, PGDELTA); } } /* ---------------------------------------------------------------------- */ void PairILPGrapheneHBN::compute(int eflag, int vflag) { - ev_init(eflag,vflag); + ev_init(eflag, vflag); pvector[0] = pvector[1] = 0.0; // Build full neighbor list @@ -355,9 +350,9 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) // Calculate the normals and its derivatives calc_normal(); // Calculate the van der Waals force and energy - calc_FvdW(eflag,vflag); + calc_FvdW(eflag, vflag); // Calculate the repulsive force and energy - calc_FRep(eflag,vflag); + calc_FRep(eflag, vflag); if (vflag_fdotr) virial_fdotr_compute(); } @@ -368,11 +363,11 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) { - int i,j,ii,jj,inum,jnum,itype,jtype; - tagint itag,jtag; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,r,Rcut,r2inv,r6inv,r8inv,Tap,dTap,Vilp,TSvdw,TSvdw2inv,fsum; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype; + tagint itag, jtag; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair; + double rsq, r, Rcut, r2inv, r6inv, r8inv, Tap, dTap, Vilp, TSvdw, TSvdw2inv, fsum; + int *ilist, *jlist, *numneigh, **firstneigh; evdwl = 0.0; double **x = atom->x; @@ -406,9 +401,9 @@ void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) // two-body interactions from full neighbor list, skip half of them if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; + if ((itag + jtag) % 2 == 0) continue; } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; + if ((itag + jtag) % 2 == 1) continue; } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp && x[j][1] < ytmp) continue; @@ -418,43 +413,46 @@ void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; // only include the interaction between different layers if (rsq < cutsq[itype][jtype] && atom->molecule[i] != atom->molecule[j]) { int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r8inv = r6inv*r2inv; + r2inv = 1.0 / rsq; + r6inv = r2inv * r2inv * r2inv; + r8inv = r6inv * r2inv; // turn on/off taper function if (tap_flag) { Rcut = sqrt(cutsq[itype][jtype]); - Tap = calc_Tap(r,Rcut); - dTap = calc_dTap(r,Rcut); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, Rcut); + dTap = calc_dTap(r, Rcut); + } else { + Tap = 1.0; + dTap = 0.0; + } - TSvdw = 1.0 + exp(-p.d*(r/p.seff - 1.0)); - TSvdw2inv = pow(TSvdw,-2.0); - Vilp = -p.C6*r6inv/TSvdw; + TSvdw = 1.0 + exp(-p.d * (r / p.seff - 1.0)); + TSvdw2inv = pow(TSvdw, -2.0); + Vilp = -p.C6 * r6inv / TSvdw; // derivatives - fpair = -6.0*p.C6*r8inv/TSvdw + p.C6*p.d/p.seff*(TSvdw-1.0)*TSvdw2inv*r8inv*r; - fsum = fpair*Tap - Vilp*dTap/r; + fpair = -6.0 * p.C6 * r8inv / TSvdw + + p.C6 * p.d / p.seff * (TSvdw - 1.0) * TSvdw2inv * r8inv * r; + fsum = fpair * Tap - Vilp * dTap / r; - f[i][0] += fsum*delx; - f[i][1] += fsum*dely; - f[i][2] += fsum*delz; - f[j][0] -= fsum*delx; - f[j][1] -= fsum*dely; - f[j][2] -= fsum*delz; + f[i][0] += fsum * delx; + f[i][1] += fsum * dely; + f[i][2] += fsum * delz; + f[j][0] -= fsum * delx; + f[j][1] -= fsum * dely; + f[j][2] -= fsum * delz; - if (eflag) pvector[0] += evdwl = Vilp*Tap; - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fsum,delx,dely,delz); + if (eflag) pvector[0] += evdwl = Vilp * Tap; + if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fsum, delx, dely, delz); } } } @@ -466,12 +464,12 @@ void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */) { - int i,j,ii,jj,inum,jnum,itype,jtype,k,kk; - double prodnorm1,fkcx,fkcy,fkcz; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair,fpair1; - double rsq,r,Rcut,rhosq1,exp0,exp1,Tap,dTap,Vilp; - double frho1,Erep,fsum,rdsq1; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype, k, kk; + double prodnorm1, fkcx, fkcy, fkcz; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair, fpair1; + double rsq, r, Rcut, rhosq1, exp0, exp1, Tap, dTap, Vilp; + double frho1, Erep, fsum, rdsq1; + int *ilist, *jlist, *numneigh, **firstneigh; int *ILP_neighs_i; evdwl = 0.0; @@ -511,57 +509,63 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; // only include the interaction between different layers if (rsq < cutsq[itype][jtype] && atom->molecule[i] != atom->molecule[j]) { int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); // turn on/off taper function if (tap_flag) { Rcut = sqrt(cutsq[itype][jtype]); - Tap = calc_Tap(r,Rcut); - dTap = calc_dTap(r,Rcut); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, Rcut); + dTap = calc_dTap(r, Rcut); + } else { + Tap = 1.0; + dTap = 0.0; + } // Calculate the transverse distance - prodnorm1 = normal[i][0]*delx + normal[i][1]*dely + normal[i][2]*delz; - rhosq1 = rsq - prodnorm1*prodnorm1; // rho_ij - rdsq1 = rhosq1*p.delta2inv; // (rho_ij/delta)^2 + prodnorm1 = normal[i][0] * delx + normal[i][1] * dely + normal[i][2] * delz; + rhosq1 = rsq - prodnorm1 * prodnorm1; // rho_ij + rdsq1 = rhosq1 * p.delta2inv; // (rho_ij/delta)^2 // store exponents - exp0 = exp(-p.lambda*(r-p.z0)); + exp0 = exp(-p.lambda * (r - p.z0)); exp1 = exp(-rdsq1); - frho1 = exp1*p.C; - Erep = 0.5*p.epsilon + frho1; - Vilp = exp0*Erep; + frho1 = exp1 * p.C; + Erep = 0.5 * p.epsilon + frho1; + Vilp = exp0 * Erep; // derivatives - fpair = p.lambda*exp0/r*Erep; - fpair1 = 2.0*exp0*frho1*p.delta2inv; + fpair = p.lambda * exp0 / r * Erep; + fpair1 = 2.0 * exp0 * frho1 * p.delta2inv; fsum = fpair + fpair1; // derivatives of the product of rij and ni, the result is a vector - dprodnorm1[0] = dnormdri[0][0][i]*delx + dnormdri[1][0][i]*dely + dnormdri[2][0][i]*delz; - dprodnorm1[1] = dnormdri[0][1][i]*delx + dnormdri[1][1][i]*dely + dnormdri[2][1][i]*delz; - dprodnorm1[2] = dnormdri[0][2][i]*delx + dnormdri[1][2][i]*dely + dnormdri[2][2][i]*delz; - fp1[0] = prodnorm1*normal[i][0]*fpair1; - fp1[1] = prodnorm1*normal[i][1]*fpair1; - fp1[2] = prodnorm1*normal[i][2]*fpair1; - fprod1[0] = prodnorm1*dprodnorm1[0]*fpair1; - fprod1[1] = prodnorm1*dprodnorm1[1]*fpair1; - fprod1[2] = prodnorm1*dprodnorm1[2]*fpair1; + dprodnorm1[0] = + dnormdri[0][0][i] * delx + dnormdri[1][0][i] * dely + dnormdri[2][0][i] * delz; + dprodnorm1[1] = + dnormdri[0][1][i] * delx + dnormdri[1][1][i] * dely + dnormdri[2][1][i] * delz; + dprodnorm1[2] = + dnormdri[0][2][i] * delx + dnormdri[1][2][i] * dely + dnormdri[2][2][i] * delz; + fp1[0] = prodnorm1 * normal[i][0] * fpair1; + fp1[1] = prodnorm1 * normal[i][1] * fpair1; + fp1[2] = prodnorm1 * normal[i][2] * fpair1; + fprod1[0] = prodnorm1 * dprodnorm1[0] * fpair1; + fprod1[1] = prodnorm1 * dprodnorm1[1] * fpair1; + fprod1[2] = prodnorm1 * dprodnorm1[2] * fpair1; - fkcx = (delx*fsum - fp1[0])*Tap - Vilp*dTap*delx/r; - fkcy = (dely*fsum - fp1[1])*Tap - Vilp*dTap*dely/r; - fkcz = (delz*fsum - fp1[2])*Tap - Vilp*dTap*delz/r; + fkcx = (delx * fsum - fp1[0]) * Tap - Vilp * dTap * delx / r; + fkcy = (dely * fsum - fp1[1]) * Tap - Vilp * dTap * dely / r; + fkcz = (delz * fsum - fp1[2]) * Tap - Vilp * dTap * delz / r; - f[i][0] += fkcx - fprod1[0]*Tap; - f[i][1] += fkcy - fprod1[1]*Tap; - f[i][2] += fkcz - fprod1[2]*Tap; + f[i][0] += fkcx - fprod1[0] * Tap; + f[i][1] += fkcy - fprod1[1] * Tap; + f[i][2] += fkcz - fprod1[2] * Tap; f[j][0] -= fkcx; f[j][1] -= fkcy; f[j][2] -= fkcz; @@ -572,26 +576,32 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */) k = ILP_neighs_i[kk]; if (k == i) continue; // derivatives of the product of rij and ni respect to rk, k=0,1,2, where atom k is the neighbors of atom i - dprodnorm1[0] = dnormal[0][0][kk][i]*delx + dnormal[1][0][kk][i]*dely + dnormal[2][0][kk][i]*delz; - dprodnorm1[1] = dnormal[0][1][kk][i]*delx + dnormal[1][1][kk][i]*dely + dnormal[2][1][kk][i]*delz; - dprodnorm1[2] = dnormal[0][2][kk][i]*delx + dnormal[1][2][kk][i]*dely + dnormal[2][2][kk][i]*delz; - fk[0] = (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; - fk[1] = (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; - fk[2] = (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + dprodnorm1[0] = dnormal[0][0][kk][i] * delx + dnormal[1][0][kk][i] * dely + + dnormal[2][0][kk][i] * delz; + dprodnorm1[1] = dnormal[0][1][kk][i] * delx + dnormal[1][1][kk][i] * dely + + dnormal[2][1][kk][i] * delz; + dprodnorm1[2] = dnormal[0][2][kk][i] * delx + dnormal[1][2][kk][i] * dely + + dnormal[2][2][kk][i] * delz; + fk[0] = (-prodnorm1 * dprodnorm1[0] * fpair1) * Tap; + fk[1] = (-prodnorm1 * dprodnorm1[1] * fpair1) * Tap; + fk[2] = (-prodnorm1 * dprodnorm1[2] * fpair1) * Tap; f[k][0] += fk[0]; f[k][1] += fk[1]; f[k][2] += fk[2]; delkj[0] = x[k][0] - x[j][0]; delkj[1] = x[k][1] - x[j][1]; delkj[2] = x[k][2] - x[j][2]; - if (evflag) ev_tally_xyz(k,j,nlocal,newton_pair,0.0,0.0,fk[0],fk[1],fk[2],delkj[0],delkj[1],delkj[2]); + if (evflag) + ev_tally_xyz(k, j, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delkj[0], + delkj[1], delkj[2]); } - if (eflag) pvector[1] += evdwl = Tap*Vilp; - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0,fkcx,fkcy,fkcz,delx,dely,delz); + if (eflag) pvector[1] += evdwl = Tap * Vilp; + if (evflag) + ev_tally_xyz(i, j, nlocal, newton_pair, evdwl, 0.0, fkcx, fkcy, fkcz, delx, dely, delz); } - } // loop over jj - } // loop over ii + } // loop over jj + } // loop over ii } /* ---------------------------------------------------------------------- @@ -600,9 +610,9 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */) void PairILPGrapheneHBN::ILP_neigh() { - int i,j,ii,jj,n,allnum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,rsq; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, n, allnum, jnum, itype, jtype; + double xtmp, ytmp, ztmp, delx, dely, delz, rsq; + int *ilist, *jlist, *numneigh, **firstneigh; int *neighptr; double **x = atom->x; @@ -612,8 +622,9 @@ void PairILPGrapheneHBN::ILP_neigh() maxlocal = atom->nmax; memory->destroy(ILP_numneigh); memory->sfree(ILP_firstneigh); - memory->create(ILP_numneigh,maxlocal,"ILPGrapheneHBN:numneigh"); - ILP_firstneigh = (int **) memory->smalloc(maxlocal*sizeof(int *),"ILPGrapheneHBN:firstneigh"); + memory->create(ILP_numneigh, maxlocal, "ILPGrapheneHBN:numneigh"); + ILP_firstneigh = + (int **) memory->smalloc(maxlocal * sizeof(int *), "ILPGrapheneHBN:firstneigh"); } allnum = list->inum + list->gnum; @@ -646,20 +657,21 @@ void PairILPGrapheneHBN::ILP_neigh() delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; if (rsq != 0 && rsq < cutILPsq[itype][jtype] && atom->molecule[i] == atom->molecule[j]) { neighptr[n++] = j; } - } // loop over jj + } // loop over jj ILP_firstneigh[i] = neighptr; ILP_numneigh[i] = n; - if (n > 3) error->one(FLERR,"There are too many neighbors for some atoms, please check your configuration"); + if (n > 3) + error->one(FLERR, + "There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); - if (ipage->status()) - error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + if (ipage->status()) error->one(FLERR, "Neighbor list overflow, boost neigh_modify one"); } } @@ -668,12 +680,12 @@ void PairILPGrapheneHBN::ILP_neigh() ------------------------------------------------------------------------- */ void PairILPGrapheneHBN::calc_normal() { - int i,j,ii,jj,inum,jnum; - int cont,id,ip,m; - double nn,xtp,ytp,ztp,delx,dely,delz,nn2; - int *ilist,*jlist; - double pv12[3],pv31[3],pv23[3],n1[3],dni[3],dnn[3][3],vet[3][3],dpvdri[3][3]; - double dn1[3][3][3],dpv12[3][3][3],dpv23[3][3][3],dpv31[3][3][3]; + int i, j, ii, jj, inum, jnum; + int cont, id, ip, m; + double nn, xtp, ytp, ztp, delx, dely, delz, nn2; + int *ilist, *jlist; + double pv12[3], pv31[3], pv23[3], n1[3], dni[3], dnn[3][3], vet[3][3], dpvdri[3][3]; + double dn1[3][3][3], dpv12[3][3][3], dpv23[3][3][3], dpv31[3][3][3]; double **x = atom->x; @@ -684,9 +696,9 @@ void PairILPGrapheneHBN::calc_normal() memory->destroy(dnormal); memory->destroy(dnormdri); nmax = atom->nmax; - memory->create(normal,nmax,3,"ILPGrapheneHBN:normal"); - memory->create(dnormdri,3,3,nmax,"ILPGrapheneHBN:dnormdri"); - memory->create(dnormal,3,3,3,nmax,"ILPGrapheneHBN:dnormal"); + memory->create(normal, nmax, 3, "ILPGrapheneHBN:normal"); + memory->create(dnormdri, 3, 3, nmax, "ILPGrapheneHBN:dnormdri"); + memory->create(dnormal, 3, 3, 3, nmax, "ILPGrapheneHBN:dnormal"); } inum = list->inum; @@ -745,85 +757,78 @@ void PairILPGrapheneHBN::calc_normal() for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { dnormdri[id][ip][i] = 0.0; - for (m = 0; m < 3; m++) { - dnormal[id][ip][m][i] = 0.0; - } + for (m = 0; m < 3; m++) { dnormal[id][ip][m][i] = 0.0; } } } - } - else if (cont == 2) { - pv12[0] = vet[0][1]*vet[1][2] - vet[1][1]*vet[0][2]; - pv12[1] = vet[0][2]*vet[1][0] - vet[1][2]*vet[0][0]; - pv12[2] = vet[0][0]*vet[1][1] - vet[1][0]*vet[0][1]; + } else if (cont == 2) { + pv12[0] = vet[0][1] * vet[1][2] - vet[1][1] * vet[0][2]; + pv12[1] = vet[0][2] * vet[1][0] - vet[1][2] * vet[0][0]; + pv12[2] = vet[0][0] * vet[1][1] - vet[1][0] * vet[0][1]; // derivatives of pv12[0] to ri dpvdri[0][0] = 0.0; - dpvdri[0][1] = vet[0][2]-vet[1][2]; - dpvdri[0][2] = vet[1][1]-vet[0][1]; + dpvdri[0][1] = vet[0][2] - vet[1][2]; + dpvdri[0][2] = vet[1][1] - vet[0][1]; // derivatives of pv12[1] to ri - dpvdri[1][0] = vet[1][2]-vet[0][2]; + dpvdri[1][0] = vet[1][2] - vet[0][2]; dpvdri[1][1] = 0.0; - dpvdri[1][2] = vet[0][0]-vet[1][0]; + dpvdri[1][2] = vet[0][0] - vet[1][0]; // derivatives of pv12[2] to ri - dpvdri[2][0] = vet[0][1]-vet[1][1]; - dpvdri[2][1] = vet[1][0]-vet[0][0]; + dpvdri[2][0] = vet[0][1] - vet[1][1]; + dpvdri[2][1] = vet[1][0] - vet[0][0]; dpvdri[2][2] = 0.0; - dpv12[0][0][0] = 0.0; - dpv12[0][1][0] = vet[1][2]; + dpv12[0][0][0] = 0.0; + dpv12[0][1][0] = vet[1][2]; dpv12[0][2][0] = -vet[1][1]; dpv12[1][0][0] = -vet[1][2]; - dpv12[1][1][0] = 0.0; - dpv12[1][2][0] = vet[1][0]; - dpv12[2][0][0] = vet[1][1]; + dpv12[1][1][0] = 0.0; + dpv12[1][2][0] = vet[1][0]; + dpv12[2][0][0] = vet[1][1]; dpv12[2][1][0] = -vet[1][0]; - dpv12[2][2][0] = 0.0; + dpv12[2][2][0] = 0.0; // derivatives respect to the second neighbor, atom l - dpv12[0][0][1] = 0.0; + dpv12[0][0][1] = 0.0; dpv12[0][1][1] = -vet[0][2]; - dpv12[0][2][1] = vet[0][1]; - dpv12[1][0][1] = vet[0][2]; - dpv12[1][1][1] = 0.0; + dpv12[0][2][1] = vet[0][1]; + dpv12[1][0][1] = vet[0][2]; + dpv12[1][1][1] = 0.0; dpv12[1][2][1] = -vet[0][0]; dpv12[2][0][1] = -vet[0][1]; - dpv12[2][1][1] = vet[0][0]; - dpv12[2][2][1] = 0.0; + dpv12[2][1][1] = vet[0][0]; + dpv12[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n // derivatives of pv12 to rn is zero for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv12[id][ip][2] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv12[id][ip][2] = 0.0; } } n1[0] = pv12[0]; n1[1] = pv12[1]; n1[2] = pv12[2]; // the magnitude of the normal vector - nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; + nn2 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2]; nn = sqrt(nn2); - if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR, "The magnitude of the normal vector is zero"); // the unit normal vector - normal[i][0] = n1[0]/nn; - normal[i][1] = n1[1]/nn; - normal[i][2] = n1[2]/nn; + normal[i][0] = n1[0] / nn; + normal[i][1] = n1[1] / nn; + normal[i][2] = n1[2] / nn; // derivatives of nn, dnn:3x1 vector - dni[0] = (n1[0]*dpvdri[0][0] + n1[1]*dpvdri[1][0] + n1[2]*dpvdri[2][0])/nn; - dni[1] = (n1[0]*dpvdri[0][1] + n1[1]*dpvdri[1][1] + n1[2]*dpvdri[2][1])/nn; - dni[2] = (n1[0]*dpvdri[0][2] + n1[1]*dpvdri[1][2] + n1[2]*dpvdri[2][2])/nn; + dni[0] = (n1[0] * dpvdri[0][0] + n1[1] * dpvdri[1][0] + n1[2] * dpvdri[2][0]) / nn; + dni[1] = (n1[0] * dpvdri[0][1] + n1[1] * dpvdri[1][1] + n1[2] * dpvdri[2][1]) / nn; + dni[2] = (n1[0] * dpvdri[0][2] + n1[1] * dpvdri[1][2] + n1[2] * dpvdri[2][2]) / nn; // derivatives of unit vector ni respect to ri, the result is 3x3 matrix for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormdri[id][ip][i] = dpvdri[id][ip]/nn - n1[id]*dni[ip]/nn2; + dnormdri[id][ip][i] = dpvdri[id][ip] / nn - n1[id] * dni[ip] / nn2; } } // derivatives of non-normalized normal vector, dn1:3x3x3 array for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - for (m = 0; m < 3; m++) { - dn1[id][ip][m] = dpv12[id][ip][m]; - } + for (m = 0; m < 3; m++) { dn1[id][ip][m] = dpv12[id][ip][m]; } } } // derivatives of nn, dnn:3x3 vector @@ -831,7 +836,7 @@ void PairILPGrapheneHBN::calc_normal() // r[id][m]: the id's component of atom m for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { - dnn[id][m] = (n1[0]*dn1[0][id][m] + n1[1]*dn1[1][id][m] + n1[2]*dn1[2][id][m])/nn; + dnn[id][m] = (n1[0] * dn1[0][id][m] + n1[1] * dn1[1][id][m] + n1[2] * dn1[2][id][m]) / nn; } } // dnormal[id][ip][m][i]: the derivative of normal[id] respect to r[ip][m], id,ip=0,1,2 @@ -839,131 +844,123 @@ void PairILPGrapheneHBN::calc_normal() for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormal[id][ip][m][i] = dn1[id][ip][m]/nn - n1[id]*dnn[ip][m]/nn2; + dnormal[id][ip][m][i] = dn1[id][ip][m] / nn - n1[id] * dnn[ip][m] / nn2; } } } } -//############################################################################################## + //############################################################################################## else if (cont == 3) { - pv12[0] = vet[0][1]*vet[1][2] - vet[1][1]*vet[0][2]; - pv12[1] = vet[0][2]*vet[1][0] - vet[1][2]*vet[0][0]; - pv12[2] = vet[0][0]*vet[1][1] - vet[1][0]*vet[0][1]; + pv12[0] = vet[0][1] * vet[1][2] - vet[1][1] * vet[0][2]; + pv12[1] = vet[0][2] * vet[1][0] - vet[1][2] * vet[0][0]; + pv12[2] = vet[0][0] * vet[1][1] - vet[1][0] * vet[0][1]; // derivatives respect to the first neighbor, atom k - dpv12[0][0][0] = 0.0; - dpv12[0][1][0] = vet[1][2]; + dpv12[0][0][0] = 0.0; + dpv12[0][1][0] = vet[1][2]; dpv12[0][2][0] = -vet[1][1]; dpv12[1][0][0] = -vet[1][2]; - dpv12[1][1][0] = 0.0; - dpv12[1][2][0] = vet[1][0]; - dpv12[2][0][0] = vet[1][1]; + dpv12[1][1][0] = 0.0; + dpv12[1][2][0] = vet[1][0]; + dpv12[2][0][0] = vet[1][1]; dpv12[2][1][0] = -vet[1][0]; - dpv12[2][2][0] = 0.0; + dpv12[2][2][0] = 0.0; // derivatives respect to the second neighbor, atom l - dpv12[0][0][1] = 0.0; + dpv12[0][0][1] = 0.0; dpv12[0][1][1] = -vet[0][2]; - dpv12[0][2][1] = vet[0][1]; - dpv12[1][0][1] = vet[0][2]; - dpv12[1][1][1] = 0.0; + dpv12[0][2][1] = vet[0][1]; + dpv12[1][0][1] = vet[0][2]; + dpv12[1][1][1] = 0.0; dpv12[1][2][1] = -vet[0][0]; dpv12[2][0][1] = -vet[0][1]; - dpv12[2][1][1] = vet[0][0]; - dpv12[2][2][1] = 0.0; + dpv12[2][1][1] = vet[0][0]; + dpv12[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv12[id][ip][2] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv12[id][ip][2] = 0.0; } } - pv31[0] = vet[2][1]*vet[0][2] - vet[0][1]*vet[2][2]; - pv31[1] = vet[2][2]*vet[0][0] - vet[0][2]*vet[2][0]; - pv31[2] = vet[2][0]*vet[0][1] - vet[0][0]*vet[2][1]; + pv31[0] = vet[2][1] * vet[0][2] - vet[0][1] * vet[2][2]; + pv31[1] = vet[2][2] * vet[0][0] - vet[0][2] * vet[2][0]; + pv31[2] = vet[2][0] * vet[0][1] - vet[0][0] * vet[2][1]; // derivatives respect to the first neighbor, atom k - dpv31[0][0][0] = 0.0; + dpv31[0][0][0] = 0.0; dpv31[0][1][0] = -vet[2][2]; - dpv31[0][2][0] = vet[2][1]; - dpv31[1][0][0] = vet[2][2]; - dpv31[1][1][0] = 0.0; + dpv31[0][2][0] = vet[2][1]; + dpv31[1][0][0] = vet[2][2]; + dpv31[1][1][0] = 0.0; dpv31[1][2][0] = -vet[2][0]; dpv31[2][0][0] = -vet[2][1]; - dpv31[2][1][0] = vet[2][0]; - dpv31[2][2][0] = 0.0; + dpv31[2][1][0] = vet[2][0]; + dpv31[2][2][0] = 0.0; // derivatives respect to the third neighbor, atom n - dpv31[0][0][2] = 0.0; - dpv31[0][1][2] = vet[0][2]; + dpv31[0][0][2] = 0.0; + dpv31[0][1][2] = vet[0][2]; dpv31[0][2][2] = -vet[0][1]; dpv31[1][0][2] = -vet[0][2]; - dpv31[1][1][2] = 0.0; - dpv31[1][2][2] = vet[0][0]; - dpv31[2][0][2] = vet[0][1]; + dpv31[1][1][2] = 0.0; + dpv31[1][2][2] = vet[0][0]; + dpv31[2][0][2] = vet[0][1]; dpv31[2][1][2] = -vet[0][0]; - dpv31[2][2][2] = 0.0; + dpv31[2][2][2] = 0.0; // derivatives respect to the second neighbor, atom l for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv31[id][ip][1] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv31[id][ip][1] = 0.0; } } - pv23[0] = vet[1][1]*vet[2][2] - vet[2][1]*vet[1][2]; - pv23[1] = vet[1][2]*vet[2][0] - vet[2][2]*vet[1][0]; - pv23[2] = vet[1][0]*vet[2][1] - vet[2][0]*vet[1][1]; + pv23[0] = vet[1][1] * vet[2][2] - vet[2][1] * vet[1][2]; + pv23[1] = vet[1][2] * vet[2][0] - vet[2][2] * vet[1][0]; + pv23[2] = vet[1][0] * vet[2][1] - vet[2][0] * vet[1][1]; // derivatives respect to the second neighbor, atom k for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv23[id][ip][0] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv23[id][ip][0] = 0.0; } } // derivatives respect to the second neighbor, atom l - dpv23[0][0][1] = 0.0; - dpv23[0][1][1] = vet[2][2]; + dpv23[0][0][1] = 0.0; + dpv23[0][1][1] = vet[2][2]; dpv23[0][2][1] = -vet[2][1]; dpv23[1][0][1] = -vet[2][2]; - dpv23[1][1][1] = 0.0; - dpv23[1][2][1] = vet[2][0]; - dpv23[2][0][1] = vet[2][1]; + dpv23[1][1][1] = 0.0; + dpv23[1][2][1] = vet[2][0]; + dpv23[2][0][1] = vet[2][1]; dpv23[2][1][1] = -vet[2][0]; - dpv23[2][2][1] = 0.0; + dpv23[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n - dpv23[0][0][2] = 0.0; + dpv23[0][0][2] = 0.0; dpv23[0][1][2] = -vet[1][2]; - dpv23[0][2][2] = vet[1][1]; - dpv23[1][0][2] = vet[1][2]; - dpv23[1][1][2] = 0.0; + dpv23[0][2][2] = vet[1][1]; + dpv23[1][0][2] = vet[1][2]; + dpv23[1][1][2] = 0.0; dpv23[1][2][2] = -vet[1][0]; dpv23[2][0][2] = -vet[1][1]; - dpv23[2][1][2] = vet[1][0]; - dpv23[2][2][2] = 0.0; + dpv23[2][1][2] = vet[1][0]; + dpv23[2][2][2] = 0.0; -//############################################################################################ + //############################################################################################ // average the normal vectors by using the 3 neighboring planes - n1[0] = (pv12[0] + pv31[0] + pv23[0])/cont; - n1[1] = (pv12[1] + pv31[1] + pv23[1])/cont; - n1[2] = (pv12[2] + pv31[2] + pv23[2])/cont; + n1[0] = (pv12[0] + pv31[0] + pv23[0]) / cont; + n1[1] = (pv12[1] + pv31[1] + pv23[1]) / cont; + n1[2] = (pv12[2] + pv31[2] + pv23[2]) / cont; // the magnitude of the normal vector - nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; + nn2 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2]; nn = sqrt(nn2); - if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR, "The magnitude of the normal vector is zero"); // the unit normal vector - normal[i][0] = n1[0]/nn; - normal[i][1] = n1[1]/nn; - normal[i][2] = n1[2]/nn; + normal[i][0] = n1[0] / nn; + normal[i][1] = n1[1] / nn; + normal[i][2] = n1[2] / nn; // for the central atoms, dnormdri is always zero for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dnormdri[id][ip][i] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dnormdri[id][ip][i] = 0.0; } } // derivatives of non-normalized normal vector, dn1:3x3x3 array for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { for (m = 0; m < 3; m++) { - dn1[id][ip][m] = (dpv12[id][ip][m] + dpv23[id][ip][m] + dpv31[id][ip][m])/cont; + dn1[id][ip][m] = (dpv12[id][ip][m] + dpv23[id][ip][m] + dpv31[id][ip][m]) / cont; } } } @@ -972,7 +969,7 @@ void PairILPGrapheneHBN::calc_normal() // r[id][m]: the id's component of atom m for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { - dnn[id][m] = (n1[0]*dn1[0][id][m] + n1[1]*dn1[1][id][m] + n1[2]*dn1[2][id][m])/nn; + dnn[id][m] = (n1[0] * dn1[0][id][m] + n1[1] * dn1[1][id][m] + n1[2] * dn1[2][id][m]) / nn; } } // dnormal[id][ip][m][i]: the derivative of normal[id] respect to r[ip][m], id,ip=0,1,2 @@ -980,50 +977,51 @@ void PairILPGrapheneHBN::calc_normal() for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormal[id][ip][m][i] = dn1[id][ip][m]/nn - n1[id]*dnn[ip][m]/nn2; + dnormal[id][ip][m][i] = dn1[id][ip][m] / nn - n1[id] * dnn[ip][m] / nn2; } } } - } - else { - error->one(FLERR,"There are too many neighbors for calculating normals"); + } else { + error->one(FLERR, "There are too many neighbors for calculating normals"); } -//############################################################################################## + //############################################################################################## } } /* ---------------------------------------------------------------------- */ double PairILPGrapheneHBN::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, - double /*factor_coul*/, double factor_lj, - double &fforce) + double /*factor_coul*/, double factor_lj, double &fforce) { - double r,r2inv,r6inv,r8inv,forcelj,philj,fpair; - double Tap,dTap,Vilp,TSvdw,TSvdw2inv; + double r, r2inv, r6inv, r8inv, forcelj, philj, fpair; + double Tap, dTap, Vilp, TSvdw, TSvdw2inv; int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); // turn on/off taper function if (tap_flag) { - Tap = calc_Tap(r,sqrt(cutsq[itype][jtype])); - dTap = calc_dTap(r,sqrt(cutsq[itype][jtype])); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, sqrt(cutsq[itype][jtype])); + dTap = calc_dTap(r, sqrt(cutsq[itype][jtype])); + } else { + Tap = 1.0; + dTap = 0.0; + } - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r8inv = r2inv*r6inv; + r2inv = 1.0 / rsq; + r6inv = r2inv * r2inv * r2inv; + r8inv = r2inv * r6inv; - TSvdw = 1.0 + exp(-p.d*(r/p.seff - 1.0)); - TSvdw2inv = pow(TSvdw,-2.0); - Vilp = -p.C6*r6inv/TSvdw; + TSvdw = 1.0 + exp(-p.d * (r / p.seff - 1.0)); + TSvdw2inv = pow(TSvdw, -2.0); + Vilp = -p.C6 * r6inv / TSvdw; // derivatives - fpair = -6.0*p.C6*r8inv/TSvdw + p.d/p.seff*p.C6*(TSvdw - 1.0)*r6inv*TSvdw2inv/r; + fpair = -6.0 * p.C6 * r8inv / TSvdw + p.d / p.seff * p.C6 * (TSvdw - 1.0) * r6inv * TSvdw2inv / r; forcelj = fpair; - fforce = factor_lj*(forcelj*Tap - Vilp*dTap/r); + fforce = factor_lj * (forcelj * Tap - Vilp * dTap / r); - philj = Vilp*Tap; - return factor_lj*philj; + philj = Vilp * Tap; + return factor_lj * philj; } diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.h b/src/INTERLAYER/pair_ilp_graphene_hbn.h index 476822ef82..c89ef47a21 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.h +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.h @@ -62,7 +62,6 @@ class PairILPGrapheneHBN : public Pair { double cut_global; double cut_normal; - double **cut; double **cutILPsq; // mapping the cutoff from element pairs to parameters double **offset; double **normal; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp index cbab6e07d1..e8db858218 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -48,14 +47,14 @@ using namespace InterLayer; #define PGDELTA 1 static const char cite_kc[] = - "@Article{Ouyang2018\n" - " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n" - " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n" - " journal = {Nano Letters},\n" - " volume = 18,\n" - " pages = {6009}\n" - " year = 2018,\n" - "}\n\n"; + "@Article{Ouyang2018\n" + " author = {W. Ouyang, D. Mandelli, M. Urbakh, and O. Hod},\n" + " title = {Nanoserpents: Graphene Nanoribbon Motion on Two-Dimensional Hexagonal Materials},\n" + " journal = {Nano Letters},\n" + " volume = 18,\n" + " pages = {6009}\n" + " year = 2018,\n" + "}\n\n"; /* ---------------------------------------------------------------------- */ @@ -100,8 +99,8 @@ PairKolmogorovCrespiFull::~PairKolmogorovCrespiFull() { memory->destroy(KC_numneigh); memory->sfree(KC_firstneigh); - delete [] ipage; - delete [] pvector; + delete[] ipage; + delete[] pvector; memory->destroy(normal); memory->destroy(dnormal); memory->destroy(dnormdri); @@ -109,7 +108,6 @@ PairKolmogorovCrespiFull::~PairKolmogorovCrespiFull() if (allocated) { memory->destroy(setflag); memory->destroy(cutsq); - memory->destroy(cut); memory->destroy(offset); } @@ -125,17 +123,15 @@ PairKolmogorovCrespiFull::~PairKolmogorovCrespiFull() void PairKolmogorovCrespiFull::allocate() { allocated = 1; - int n = atom->ntypes; + int n = atom->ntypes + 1; - memory->create(setflag,n+1,n+1,"pair:setflag"); - for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; + memory->create(setflag, n, n, "pair:setflag"); + for (int i = 1; i < n; i++) + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); - memory->create(cut,n+1,n+1,"pair:cut"); - memory->create(offset,n+1,n+1,"pair:offset"); - map = new int[atom->ntypes+1]; + memory->create(cutsq, n, n, "pair:cutsq"); + memory->create(offset, n, n, "pair:offset"); + map = new int[n]; } /* ---------------------------------------------------------------------- @@ -144,12 +140,12 @@ void PairKolmogorovCrespiFull::allocate() void PairKolmogorovCrespiFull::settings(int narg, char **arg) { - if (narg < 1 || narg > 2) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(force->pair_style,"hybrid/overlay")!=0) - error->all(FLERR,"ERROR: requires hybrid/overlay pair_style"); + if (narg < 1 || narg > 2) error->all(FLERR, "Illegal pair_style command"); + if (strcmp(force->pair_style, "hybrid/overlay") != 0) + error->all(FLERR, "ERROR: requires hybrid/overlay pair_style"); - cut_global = utils::numeric(FLERR,arg[0],false,lmp); - if (narg == 2) tap_flag = utils::numeric(FLERR,arg[1],false,lmp); + cut_global = utils::numeric(FLERR, arg[0], false, lmp); + if (narg == 2) tap_flag = utils::numeric(FLERR, arg[1], false, lmp); } /* ---------------------------------------------------------------------- @@ -159,26 +155,25 @@ void PairKolmogorovCrespiFull::settings(int narg, char **arg) void PairKolmogorovCrespiFull::coeff(int narg, char **arg) { if (!allocated) allocate(); - map_element2type(narg-3,arg+3); + map_element2type(narg - 3, arg + 3); read_file(arg[2]); } - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ 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, "All pair coeffs are not set"); + if (!offset_flag) error->all(FLERR, "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]]; - Param& p = params[iparam_ij]; - offset[i][j] = -p.A*pow(p.z0/cut_global,6); - } else offset[i][j] = 0.0; + Param &p = params[iparam_ij]; + offset[i][j] = -p.A * pow(p.z0 / cut_global, 6); + } else + offset[i][j] = 0.0; offset[j][i] = offset[i][j]; return cut_global; @@ -229,29 +224,29 @@ void PairKolmogorovCrespiFull::read_file(char *filename) if (nparams == maxparam) { maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); // make certain all addional allocated storage is initialized // to avoid false positives when checking with valgrind - memset(params + nparams, 0, DELTA*sizeof(Param)); + memset(params + nparams, 0, DELTA * sizeof(Param)); } // load up parameter settings and error check their values params[nparams].ielement = ielement; params[nparams].jelement = jelement; - params[nparams].z0 = values.next_double(); - params[nparams].C0 = values.next_double(); - params[nparams].C2 = values.next_double(); - params[nparams].C4 = values.next_double(); - params[nparams].C = values.next_double(); - params[nparams].delta = values.next_double(); - params[nparams].lambda = values.next_double(); - params[nparams].A = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].lambda = values.next_double(); + params[nparams].A = values.next_double(); // S provides a convenient scaling of all energies - params[nparams].S = values.next_double(); - params[nparams].rcut = values.next_double(); + params[nparams].S = values.next_double(); + params[nparams].rcut = values.next_double(); } catch (TokenizerException &e) { error->one(FLERR, e.what()); @@ -259,7 +254,7 @@ void PairKolmogorovCrespiFull::read_file(char *filename) // energies in meV further scaled by S - double meV = 1.0e-3*params[nparams].S; + double meV = 1.0e-3 * params[nparams].S; if (unit_convert) meV *= conversion_factor; params[nparams].C *= meV; @@ -269,8 +264,8 @@ void PairKolmogorovCrespiFull::read_file(char *filename) params[nparams].C4 *= meV; // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2); - params[nparams].z06 = pow(params[nparams].z0,6); + params[nparams].delta2inv = pow(params[nparams].delta, -2); + params[nparams].z06 = pow(params[nparams].z0, 6); nparams++; } @@ -279,28 +274,28 @@ void PairKolmogorovCrespiFull::read_file(char *filename) MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); if (comm->me != 0) { - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); } - MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); memory->destroy(cutKCsq); - memory->create(elem2param,nelements,nelements,"pair:elem2param"); - memory->create(cutKCsq,nelements,nelements,"pair:cutKCsq"); + memory->create(elem2param, nelements, nelements, "pair:elem2param"); + memory->create(cutKCsq, nelements, nelements, "pair:cutKCsq"); for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"KC Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "KC Potential file has duplicate entry"); n = m; } } - if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + if (n < 0) error->all(FLERR, "Potential file is missing an entry"); elem2param[i][j] = n; - cutKCsq[i][j] = params[n].rcut*params[n].rcut; + cutKCsq[i][j] = params[n].rcut * params[n].rcut; } } } @@ -312,13 +307,13 @@ void PairKolmogorovCrespiFull::read_file(char *filename) void PairKolmogorovCrespiFull::init_style() { if (force->newton_pair == 0) - error->all(FLERR,"Pair style kolmolgorov/crespi/full requires newton pair on"); + error->all(FLERR, "Pair style kolmolgorov/crespi/full requires newton pair on"); if (!atom->molecule_flag) - error->all(FLERR,"Pair style kolmolgorov/crespi/full requires atom attribute molecule"); + error->all(FLERR, "Pair style kolmolgorov/crespi/full requires atom attribute molecule"); // need a full neighbor list, including neighbors of ghosts - int irequest = neighbor->request(this,instance_me); + int irequest = neighbor->request(this, instance_me); neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; neighbor->requests[irequest]->ghost = 1; @@ -332,14 +327,13 @@ void PairKolmogorovCrespiFull::init_style() if (oneatom != neighbor->oneatom) create = 1; if (create) { - delete [] ipage; + delete[] ipage; pgsize = neighbor->pgsize; oneatom = neighbor->oneatom; - int nmypage= comm->nthreads; + int nmypage = comm->nthreads; ipage = new MyPage[nmypage]; - for (int i = 0; i < nmypage; i++) - ipage[i].init(oneatom,pgsize,PGDELTA); + for (int i = 0; i < nmypage; i++) ipage[i].init(oneatom, pgsize, PGDELTA); } } @@ -347,7 +341,7 @@ void PairKolmogorovCrespiFull::init_style() void PairKolmogorovCrespiFull::compute(int eflag, int vflag) { - ev_init(eflag,vflag); + ev_init(eflag, vflag); pvector[0] = pvector[1] = 0.0; // Build full neighbor list @@ -355,9 +349,9 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) // Calculate the normals and its derivatives calc_normal(); // Calculate the van der Waals force and energy - calc_FvdW(eflag,vflag); + calc_FvdW(eflag, vflag); // Calculate the repulsive force and energy - calc_FRep(eflag,vflag); + calc_FRep(eflag, vflag); if (vflag_fdotr) virial_fdotr_compute(); } @@ -368,11 +362,11 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) { - int i,j,ii,jj,inum,jnum,itype,jtype; - tagint itag,jtag; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,r,Rcut,r2inv,r6inv,r8inv,Tap,dTap,Vkc,fsum; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype; + tagint itag, jtag; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair; + double rsq, r, Rcut, r2inv, r6inv, r8inv, Tap, dTap, Vkc, fsum; + int *ilist, *jlist, *numneigh, **firstneigh; evdwl = 0.0; double **x = atom->x; @@ -406,9 +400,9 @@ void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) // two-body interactions from full neighbor list, skip half of them if (itag > jtag) { - if ((itag+jtag) % 2 == 0) continue; + if ((itag + jtag) % 2 == 0) continue; } else if (itag < jtag) { - if ((itag+jtag) % 2 == 1) continue; + if ((itag + jtag) % 2 == 1) continue; } else { if (x[j][2] < ztmp) continue; if (x[j][2] == ztmp && x[j][1] < ytmp) continue; @@ -418,41 +412,43 @@ void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; // only include the interaction between different layers if (rsq < cutsq[itype][jtype] && atom->molecule[i] != atom->molecule[j]) { int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r8inv = r6inv*r2inv; + r2inv = 1.0 / rsq; + r6inv = r2inv * r2inv * r2inv; + r8inv = r6inv * r2inv; // turn on/off taper function if (tap_flag) { Rcut = sqrt(cutsq[itype][jtype]); - Tap = calc_Tap(r,Rcut); - dTap = calc_dTap(r,Rcut); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, Rcut); + dTap = calc_dTap(r, Rcut); + } else { + Tap = 1.0; + dTap = 0.0; + } - Vkc = -p.A*p.z06*r6inv; + Vkc = -p.A * p.z06 * r6inv; // derivatives - fpair = -6.0*p.A*p.z06*r8inv; - fsum = fpair*Tap - Vkc*dTap/r; + fpair = -6.0 * p.A * p.z06 * r8inv; + fsum = fpair * Tap - Vkc * dTap / r; - f[i][0] += fsum*delx; - f[i][1] += fsum*dely; - f[i][2] += fsum*delz; - f[j][0] -= fsum*delx; - f[j][1] -= fsum*dely; - f[j][2] -= fsum*delz; + f[i][0] += fsum * delx; + f[i][1] += fsum * dely; + f[i][2] += fsum * delz; + f[j][0] -= fsum * delx; + f[j][1] -= fsum * dely; + f[j][2] -= fsum * delz; - if (eflag) pvector[0] += evdwl = Vkc*Tap; - if (evflag) ev_tally(i,j,nlocal,newton_pair, - evdwl,0.0,fsum,delx,dely,delz); + if (eflag) pvector[0] += evdwl = Vkc * Tap; + if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, fsum, delx, dely, delz); } } } @@ -464,12 +460,12 @@ void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) { - int i,j,ii,jj,inum,jnum,itype,jtype,k,kk; - double prodnorm1,fkcx,fkcy,fkcz; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair,fpair1; - double rsq,r,rhosq1,exp0,exp1,Tap,dTap,Vkc; - double frho_ij,sumC1,sumC11,sumCff,fsum,rho_ij; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype, k, kk; + double prodnorm1, fkcx, fkcy, fkcz; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair, fpair1; + double rsq, r, rhosq1, exp0, exp1, Tap, dTap, Vkc; + double frho_ij, sumC1, sumC11, sumCff, fsum, rho_ij; + int *ilist, *jlist, *numneigh, **firstneigh; int *KC_neighs_i; evdwl = 0.0; @@ -509,58 +505,64 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; // only include the interaction between different layers if (rsq < cutsq[itype][jtype] && atom->molecule[i] != atom->molecule[j]) { int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); // turn on/off taper function if (tap_flag) { - Tap = calc_Tap(r,sqrt(cutsq[itype][jtype])); - dTap = calc_dTap(r,sqrt(cutsq[itype][jtype])); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, sqrt(cutsq[itype][jtype])); + dTap = calc_dTap(r, sqrt(cutsq[itype][jtype])); + } else { + Tap = 1.0; + dTap = 0.0; + } // Calculate the transverse distance - prodnorm1 = normal[i][0]*delx + normal[i][1]*dely + normal[i][2]*delz; - rhosq1 = rsq - prodnorm1*prodnorm1; // rho_ij - rho_ij = rhosq1*p.delta2inv; // (rho_ij/delta)^2 + prodnorm1 = normal[i][0] * delx + normal[i][1] * dely + normal[i][2] * delz; + rhosq1 = rsq - prodnorm1 * prodnorm1; // rho_ij + rho_ij = rhosq1 * p.delta2inv; // (rho_ij/delta)^2 // store exponents - exp0 = exp(-p.lambda*(r-p.z0)); + exp0 = exp(-p.lambda * (r - p.z0)); exp1 = exp(-rho_ij); - sumC1 = p.C0 + p.C2*rho_ij + p.C4*rho_ij*rho_ij; - sumC11 = (p.C2 + 2.0*p.C4*rho_ij)*p.delta2inv; - frho_ij = exp1*sumC1; - sumCff = 0.5*p.C + frho_ij; - Vkc = exp0*sumCff; + sumC1 = p.C0 + p.C2 * rho_ij + p.C4 * rho_ij * rho_ij; + sumC11 = (p.C2 + 2.0 * p.C4 * rho_ij) * p.delta2inv; + frho_ij = exp1 * sumC1; + sumCff = 0.5 * p.C + frho_ij; + Vkc = exp0 * sumCff; // derivatives - fpair = p.lambda*exp0/r*sumCff; - fpair1 = 2.0*exp0*exp1*(p.delta2inv*sumC1 - sumC11); + fpair = p.lambda * exp0 / r * sumCff; + fpair1 = 2.0 * exp0 * exp1 * (p.delta2inv * sumC1 - sumC11); fsum = fpair + fpair1; // derivatives of the product of rij and ni, the result is a vector - dprodnorm1[0] = dnormdri[0][0][i]*delx + dnormdri[1][0][i]*dely + dnormdri[2][0][i]*delz; - dprodnorm1[1] = dnormdri[0][1][i]*delx + dnormdri[1][1][i]*dely + dnormdri[2][1][i]*delz; - dprodnorm1[2] = dnormdri[0][2][i]*delx + dnormdri[1][2][i]*dely + dnormdri[2][2][i]*delz; - fp1[0] = prodnorm1*normal[i][0]*fpair1; - fp1[1] = prodnorm1*normal[i][1]*fpair1; - fp1[2] = prodnorm1*normal[i][2]*fpair1; - fprod1[0] = prodnorm1*dprodnorm1[0]*fpair1; - fprod1[1] = prodnorm1*dprodnorm1[1]*fpair1; - fprod1[2] = prodnorm1*dprodnorm1[2]*fpair1; - fkcx = (delx*fsum - fp1[0])*Tap - Vkc*dTap*delx/r; - fkcy = (dely*fsum - fp1[1])*Tap - Vkc*dTap*dely/r; - fkcz = (delz*fsum - fp1[2])*Tap - Vkc*dTap*delz/r; + dprodnorm1[0] = + dnormdri[0][0][i] * delx + dnormdri[1][0][i] * dely + dnormdri[2][0][i] * delz; + dprodnorm1[1] = + dnormdri[0][1][i] * delx + dnormdri[1][1][i] * dely + dnormdri[2][1][i] * delz; + dprodnorm1[2] = + dnormdri[0][2][i] * delx + dnormdri[1][2][i] * dely + dnormdri[2][2][i] * delz; + fp1[0] = prodnorm1 * normal[i][0] * fpair1; + fp1[1] = prodnorm1 * normal[i][1] * fpair1; + fp1[2] = prodnorm1 * normal[i][2] * fpair1; + fprod1[0] = prodnorm1 * dprodnorm1[0] * fpair1; + fprod1[1] = prodnorm1 * dprodnorm1[1] * fpair1; + fprod1[2] = prodnorm1 * dprodnorm1[2] * fpair1; + fkcx = (delx * fsum - fp1[0]) * Tap - Vkc * dTap * delx / r; + fkcy = (dely * fsum - fp1[1]) * Tap - Vkc * dTap * dely / r; + fkcz = (delz * fsum - fp1[2]) * Tap - Vkc * dTap * delz / r; - f[i][0] += fkcx - fprod1[0]*Tap; - f[i][1] += fkcy - fprod1[1]*Tap; - f[i][2] += fkcz - fprod1[2]*Tap; + f[i][0] += fkcx - fprod1[0] * Tap; + f[i][1] += fkcy - fprod1[1] * Tap; + f[i][2] += fkcz - fprod1[2] * Tap; f[j][0] -= fkcx; f[j][1] -= fkcy; f[j][2] -= fkcz; @@ -571,29 +573,37 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) k = KC_neighs_i[kk]; if (k == i) continue; // derivatives of the product of rij and ni respect to rk, k=0,1,2, where atom k is the neighbors of atom i - dprodnorm1[0] = dnormal[0][0][kk][i]*delx + dnormal[1][0][kk][i]*dely + dnormal[2][0][kk][i]*delz; - dprodnorm1[1] = dnormal[0][1][kk][i]*delx + dnormal[1][1][kk][i]*dely + dnormal[2][1][kk][i]*delz; - dprodnorm1[2] = dnormal[0][2][kk][i]*delx + dnormal[1][2][kk][i]*dely + dnormal[2][2][kk][i]*delz; - fk[0] = (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; - fk[1] = (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; - fk[2] = (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + dprodnorm1[0] = dnormal[0][0][kk][i] * delx + dnormal[1][0][kk][i] * dely + + dnormal[2][0][kk][i] * delz; + dprodnorm1[1] = dnormal[0][1][kk][i] * delx + dnormal[1][1][kk][i] * dely + + dnormal[2][1][kk][i] * delz; + dprodnorm1[2] = dnormal[0][2][kk][i] * delx + dnormal[1][2][kk][i] * dely + + dnormal[2][2][kk][i] * delz; + fk[0] = (-prodnorm1 * dprodnorm1[0] * fpair1) * Tap; + fk[1] = (-prodnorm1 * dprodnorm1[1] * fpair1) * Tap; + fk[2] = (-prodnorm1 * dprodnorm1[2] * fpair1) * Tap; f[k][0] += fk[0]; f[k][1] += fk[1]; f[k][2] += fk[2]; delkj[0] = x[k][0] - x[j][0]; delkj[1] = x[k][1] - x[j][1]; delkj[2] = x[k][2] - x[j][2]; - if (evflag) ev_tally_xyz(k,j,nlocal,newton_pair,0.0,0.0,fk[0],fk[1],fk[2],delkj[0],delkj[1],delkj[2]); + if (evflag) + ev_tally_xyz(k, j, nlocal, newton_pair, 0.0, 0.0, fk[0], fk[1], fk[2], delkj[0], + delkj[1], delkj[2]); } if (eflag) { - if (tap_flag) pvector[1] += evdwl = Tap*Vkc; - else pvector[1] += evdwl = Vkc - offset[itype][jtype]; + if (tap_flag) + pvector[1] += evdwl = Tap * Vkc; + else + pvector[1] += evdwl = Vkc - offset[itype][jtype]; } - if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0,fkcx,fkcy,fkcz,delx,dely,delz); + if (evflag) + ev_tally_xyz(i, j, nlocal, newton_pair, evdwl, 0.0, fkcx, fkcy, fkcz, delx, dely, delz); } - } // loop over jj - } // loop over ii + } // loop over jj + } // loop over ii } /* ---------------------------------------------------------------------- @@ -602,9 +612,9 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) void PairKolmogorovCrespiFull::KC_neigh() { - int i,j,ii,jj,n,allnum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,rsq; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, n, allnum, jnum, itype, jtype; + double xtmp, ytmp, ztmp, delx, dely, delz, rsq; + int *ilist, *jlist, *numneigh, **firstneigh; int *neighptr; double **x = atom->x; @@ -614,9 +624,9 @@ void PairKolmogorovCrespiFull::KC_neigh() maxlocal = atom->nmax; memory->destroy(KC_numneigh); memory->sfree(KC_firstneigh); - memory->create(KC_numneigh,maxlocal,"KolmogorovCrespiFull:numneigh"); - KC_firstneigh = (int **) memory->smalloc(maxlocal*sizeof(int *), - "KolmogorovCrespiFull:firstneigh"); + memory->create(KC_numneigh, maxlocal, "KolmogorovCrespiFull:numneigh"); + KC_firstneigh = + (int **) memory->smalloc(maxlocal * sizeof(int *), "KolmogorovCrespiFull:firstneigh"); } allnum = list->inum + list->gnum; @@ -649,7 +659,7 @@ void PairKolmogorovCrespiFull::KC_neigh() delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; if (rsq != 0 && rsq < cutKCsq[itype][jtype] && atom->molecule[i] == atom->molecule[j]) { neighptr[n++] = j; @@ -658,11 +668,12 @@ void PairKolmogorovCrespiFull::KC_neigh() KC_firstneigh[i] = neighptr; KC_numneigh[i] = n; - if (n > 3) error->one(FLERR,"There are too many neighbors for some atoms, please check your configuration"); + if (n > 3) + error->one(FLERR, + "There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); - if (ipage->status()) - error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); + if (ipage->status()) error->one(FLERR, "Neighbor list overflow, boost neigh_modify one"); } } @@ -671,12 +682,12 @@ void PairKolmogorovCrespiFull::KC_neigh() ------------------------------------------------------------------------- */ void PairKolmogorovCrespiFull::calc_normal() { - int i,j,ii,jj,inum,jnum; - int cont,id,ip,m; - double nn,xtp,ytp,ztp,delx,dely,delz,nn2; - int *ilist,*jlist; - double pv12[3],pv31[3],pv23[3],n1[3],dni[3],dnn[3][3],vet[3][3],dpvdri[3][3]; - double dn1[3][3][3],dpv12[3][3][3],dpv23[3][3][3],dpv31[3][3][3]; + int i, j, ii, jj, inum, jnum; + int cont, id, ip, m; + double nn, xtp, ytp, ztp, delx, dely, delz, nn2; + int *ilist, *jlist; + double pv12[3], pv31[3], pv23[3], n1[3], dni[3], dnn[3][3], vet[3][3], dpvdri[3][3]; + double dn1[3][3][3], dpv12[3][3][3], dpv23[3][3][3], dpv31[3][3][3]; double **x = atom->x; @@ -687,9 +698,9 @@ void PairKolmogorovCrespiFull::calc_normal() memory->destroy(dnormal); memory->destroy(dnormdri); nmax = atom->nmax; - memory->create(normal,nmax,3,"KolmogorovCrespiFull:normal"); - memory->create(dnormdri,3,3,nmax,"KolmogorovCrespiFull:dnormdri"); - memory->create(dnormal,3,3,3,nmax,"KolmogorovCrespiFull:dnormal"); + memory->create(normal, nmax, 3, "KolmogorovCrespiFull:normal"); + memory->create(dnormdri, 3, 3, nmax, "KolmogorovCrespiFull:dnormdri"); + memory->create(dnormal, 3, 3, 3, nmax, "KolmogorovCrespiFull:dnormal"); } inum = list->inum; @@ -749,84 +760,77 @@ void PairKolmogorovCrespiFull::calc_normal() for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { dnormdri[id][ip][i] = 0.0; - for (m = 0; m < 3; m++) { - dnormal[id][ip][m][i] = 0.0; - } + for (m = 0; m < 3; m++) { dnormal[id][ip][m][i] = 0.0; } } } - } - else if (cont == 2) { + } else if (cont == 2) { // for the atoms at the edge who has only two neighbor atoms - pv12[0] = vet[0][1]*vet[1][2] - vet[1][1]*vet[0][2]; - pv12[1] = vet[0][2]*vet[1][0] - vet[1][2]*vet[0][0]; - pv12[2] = vet[0][0]*vet[1][1] - vet[1][0]*vet[0][1]; + pv12[0] = vet[0][1] * vet[1][2] - vet[1][1] * vet[0][2]; + pv12[1] = vet[0][2] * vet[1][0] - vet[1][2] * vet[0][0]; + pv12[2] = vet[0][0] * vet[1][1] - vet[1][0] * vet[0][1]; dpvdri[0][0] = 0.0; - dpvdri[0][1] = vet[0][2]-vet[1][2]; - dpvdri[0][2] = vet[1][1]-vet[0][1]; - dpvdri[1][0] = vet[1][2]-vet[0][2]; + dpvdri[0][1] = vet[0][2] - vet[1][2]; + dpvdri[0][2] = vet[1][1] - vet[0][1]; + dpvdri[1][0] = vet[1][2] - vet[0][2]; dpvdri[1][1] = 0.0; - dpvdri[1][2] = vet[0][0]-vet[1][0]; - dpvdri[2][0] = vet[0][1]-vet[1][1]; - dpvdri[2][1] = vet[1][0]-vet[0][0]; + dpvdri[1][2] = vet[0][0] - vet[1][0]; + dpvdri[2][0] = vet[0][1] - vet[1][1]; + dpvdri[2][1] = vet[1][0] - vet[0][0]; dpvdri[2][2] = 0.0; // derivatives respect to the first neighbor, atom k - dpv12[0][0][0] = 0.0; - dpv12[0][1][0] = vet[1][2]; + dpv12[0][0][0] = 0.0; + dpv12[0][1][0] = vet[1][2]; dpv12[0][2][0] = -vet[1][1]; dpv12[1][0][0] = -vet[1][2]; - dpv12[1][1][0] = 0.0; - dpv12[1][2][0] = vet[1][0]; - dpv12[2][0][0] = vet[1][1]; + dpv12[1][1][0] = 0.0; + dpv12[1][2][0] = vet[1][0]; + dpv12[2][0][0] = vet[1][1]; dpv12[2][1][0] = -vet[1][0]; - dpv12[2][2][0] = 0.0; + dpv12[2][2][0] = 0.0; // derivatives respect to the second neighbor, atom l - dpv12[0][0][1] = 0.0; + dpv12[0][0][1] = 0.0; dpv12[0][1][1] = -vet[0][2]; - dpv12[0][2][1] = vet[0][1]; - dpv12[1][0][1] = vet[0][2]; - dpv12[1][1][1] = 0.0; + dpv12[0][2][1] = vet[0][1]; + dpv12[1][0][1] = vet[0][2]; + dpv12[1][1][1] = 0.0; dpv12[1][2][1] = -vet[0][0]; dpv12[2][0][1] = -vet[0][1]; - dpv12[2][1][1] = vet[0][0]; - dpv12[2][2][1] = 0.0; + dpv12[2][1][1] = vet[0][0]; + dpv12[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv12[id][ip][2] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv12[id][ip][2] = 0.0; } } n1[0] = pv12[0]; n1[1] = pv12[1]; n1[2] = pv12[2]; // the magnitude of the normal vector - nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; + nn2 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2]; nn = sqrt(nn2); - if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR, "The magnitude of the normal vector is zero"); // the unit normal vector - normal[i][0] = n1[0]/nn; - normal[i][1] = n1[1]/nn; - normal[i][2] = n1[2]/nn; + normal[i][0] = n1[0] / nn; + normal[i][1] = n1[1] / nn; + normal[i][2] = n1[2] / nn; // derivatives of nn, dnn:3x1 vector - dni[0] = (n1[0]*dpvdri[0][0] + n1[1]*dpvdri[1][0] + n1[2]*dpvdri[2][0])/nn; - dni[1] = (n1[0]*dpvdri[0][1] + n1[1]*dpvdri[1][1] + n1[2]*dpvdri[2][1])/nn; - dni[2] = (n1[0]*dpvdri[0][2] + n1[1]*dpvdri[1][2] + n1[2]*dpvdri[2][2])/nn; + dni[0] = (n1[0] * dpvdri[0][0] + n1[1] * dpvdri[1][0] + n1[2] * dpvdri[2][0]) / nn; + dni[1] = (n1[0] * dpvdri[0][1] + n1[1] * dpvdri[1][1] + n1[2] * dpvdri[2][1]) / nn; + dni[2] = (n1[0] * dpvdri[0][2] + n1[1] * dpvdri[1][2] + n1[2] * dpvdri[2][2]) / nn; // derivatives of unit vector ni respect to ri, the result is 3x3 matrix for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormdri[id][ip][i] = dpvdri[id][ip]/nn - n1[id]*dni[ip]/nn2; + dnormdri[id][ip][i] = dpvdri[id][ip] / nn - n1[id] * dni[ip] / nn2; } } // derivatives of non-normalized normal vector, dn1:3x3x3 array for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - for (m = 0; m < 3; m++) { - dn1[id][ip][m] = dpv12[id][ip][m]; - } + for (m = 0; m < 3; m++) { dn1[id][ip][m] = dpv12[id][ip][m]; } } } // derivatives of nn, dnn:3x3 vector @@ -834,7 +838,7 @@ void PairKolmogorovCrespiFull::calc_normal() // r[id][m]: the id's component of atom m for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { - dnn[id][m] = (n1[0]*dn1[0][id][m] + n1[1]*dn1[1][id][m] + n1[2]*dn1[2][id][m])/nn; + dnn[id][m] = (n1[0] * dn1[0][id][m] + n1[1] * dn1[1][id][m] + n1[2] * dn1[2][id][m]) / nn; } } // dnormal[id][ip][m][i]: the derivative of normal[id] respect to r[ip][m], id,ip=0,1,2 @@ -842,135 +846,127 @@ void PairKolmogorovCrespiFull::calc_normal() for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormal[id][ip][m][i] = dn1[id][ip][m]/nn - n1[id]*dnn[ip][m]/nn2; + dnormal[id][ip][m][i] = dn1[id][ip][m] / nn - n1[id] * dnn[ip][m] / nn2; } } } } -//############################################################################################## + //############################################################################################## else if (cont == 3) { // for the atoms at the edge who has only two neighbor atoms - pv12[0] = vet[0][1]*vet[1][2] - vet[1][1]*vet[0][2]; - pv12[1] = vet[0][2]*vet[1][0] - vet[1][2]*vet[0][0]; - pv12[2] = vet[0][0]*vet[1][1] - vet[1][0]*vet[0][1]; + pv12[0] = vet[0][1] * vet[1][2] - vet[1][1] * vet[0][2]; + pv12[1] = vet[0][2] * vet[1][0] - vet[1][2] * vet[0][0]; + pv12[2] = vet[0][0] * vet[1][1] - vet[1][0] * vet[0][1]; // derivatives respect to the first neighbor, atom k - dpv12[0][0][0] = 0.0; - dpv12[0][1][0] = vet[1][2]; + dpv12[0][0][0] = 0.0; + dpv12[0][1][0] = vet[1][2]; dpv12[0][2][0] = -vet[1][1]; dpv12[1][0][0] = -vet[1][2]; - dpv12[1][1][0] = 0.0; - dpv12[1][2][0] = vet[1][0]; - dpv12[2][0][0] = vet[1][1]; + dpv12[1][1][0] = 0.0; + dpv12[1][2][0] = vet[1][0]; + dpv12[2][0][0] = vet[1][1]; dpv12[2][1][0] = -vet[1][0]; - dpv12[2][2][0] = 0.0; + dpv12[2][2][0] = 0.0; // derivatives respect to the second neighbor, atom l - dpv12[0][0][1] = 0.0; + dpv12[0][0][1] = 0.0; dpv12[0][1][1] = -vet[0][2]; - dpv12[0][2][1] = vet[0][1]; - dpv12[1][0][1] = vet[0][2]; - dpv12[1][1][1] = 0.0; + dpv12[0][2][1] = vet[0][1]; + dpv12[1][0][1] = vet[0][2]; + dpv12[1][1][1] = 0.0; dpv12[1][2][1] = -vet[0][0]; dpv12[2][0][1] = -vet[0][1]; - dpv12[2][1][1] = vet[0][0]; - dpv12[2][2][1] = 0.0; + dpv12[2][1][1] = vet[0][0]; + dpv12[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv12[id][ip][2] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv12[id][ip][2] = 0.0; } } - pv31[0] = vet[2][1]*vet[0][2] - vet[0][1]*vet[2][2]; - pv31[1] = vet[2][2]*vet[0][0] - vet[0][2]*vet[2][0]; - pv31[2] = vet[2][0]*vet[0][1] - vet[0][0]*vet[2][1]; + pv31[0] = vet[2][1] * vet[0][2] - vet[0][1] * vet[2][2]; + pv31[1] = vet[2][2] * vet[0][0] - vet[0][2] * vet[2][0]; + pv31[2] = vet[2][0] * vet[0][1] - vet[0][0] * vet[2][1]; // derivatives respect to the first neighbor, atom k - dpv31[0][0][0] = 0.0; + dpv31[0][0][0] = 0.0; dpv31[0][1][0] = -vet[2][2]; - dpv31[0][2][0] = vet[2][1]; - dpv31[1][0][0] = vet[2][2]; - dpv31[1][1][0] = 0.0; + dpv31[0][2][0] = vet[2][1]; + dpv31[1][0][0] = vet[2][2]; + dpv31[1][1][0] = 0.0; dpv31[1][2][0] = -vet[2][0]; dpv31[2][0][0] = -vet[2][1]; - dpv31[2][1][0] = vet[2][0]; - dpv31[2][2][0] = 0.0; + dpv31[2][1][0] = vet[2][0]; + dpv31[2][2][0] = 0.0; // derivatives respect to the third neighbor, atom n - dpv31[0][0][2] = 0.0; - dpv31[0][1][2] = vet[0][2]; + dpv31[0][0][2] = 0.0; + dpv31[0][1][2] = vet[0][2]; dpv31[0][2][2] = -vet[0][1]; // derivatives of pv13[1] to rn dpv31[1][0][2] = -vet[0][2]; - dpv31[1][1][2] = 0.0; - dpv31[1][2][2] = vet[0][0]; + dpv31[1][1][2] = 0.0; + dpv31[1][2][2] = vet[0][0]; // derivatives of pv13[2] to rn - dpv31[2][0][2] = vet[0][1]; + dpv31[2][0][2] = vet[0][1]; dpv31[2][1][2] = -vet[0][0]; - dpv31[2][2][2] = 0.0; + dpv31[2][2][2] = 0.0; // derivatives respect to the second neighbor, atom l for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv31[id][ip][1] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv31[id][ip][1] = 0.0; } } - pv23[0] = vet[1][1]*vet[2][2] - vet[2][1]*vet[1][2]; - pv23[1] = vet[1][2]*vet[2][0] - vet[2][2]*vet[1][0]; - pv23[2] = vet[1][0]*vet[2][1] - vet[2][0]*vet[1][1]; + pv23[0] = vet[1][1] * vet[2][2] - vet[2][1] * vet[1][2]; + pv23[1] = vet[1][2] * vet[2][0] - vet[2][2] * vet[1][0]; + pv23[2] = vet[1][0] * vet[2][1] - vet[2][0] * vet[1][1]; // derivatives respect to the second neighbor, atom k for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dpv23[id][ip][0] = 0.0; - } + for (ip = 0; ip < 3; ip++) { dpv23[id][ip][0] = 0.0; } } // derivatives respect to the second neighbor, atom l - dpv23[0][0][1] = 0.0; - dpv23[0][1][1] = vet[2][2]; + dpv23[0][0][1] = 0.0; + dpv23[0][1][1] = vet[2][2]; dpv23[0][2][1] = -vet[2][1]; dpv23[1][0][1] = -vet[2][2]; - dpv23[1][1][1] = 0.0; - dpv23[1][2][1] = vet[2][0]; - dpv23[2][0][1] = vet[2][1]; + dpv23[1][1][1] = 0.0; + dpv23[1][2][1] = vet[2][0]; + dpv23[2][0][1] = vet[2][1]; dpv23[2][1][1] = -vet[2][0]; - dpv23[2][2][1] = 0.0; + dpv23[2][2][1] = 0.0; // derivatives respect to the third neighbor, atom n - dpv23[0][0][2] = 0.0; + dpv23[0][0][2] = 0.0; dpv23[0][1][2] = -vet[1][2]; - dpv23[0][2][2] = vet[1][1]; - dpv23[1][0][2] = vet[1][2]; - dpv23[1][1][2] = 0.0; + dpv23[0][2][2] = vet[1][1]; + dpv23[1][0][2] = vet[1][2]; + dpv23[1][1][2] = 0.0; dpv23[1][2][2] = -vet[1][0]; dpv23[2][0][2] = -vet[1][1]; - dpv23[2][1][2] = vet[1][0]; - dpv23[2][2][2] = 0.0; + dpv23[2][1][2] = vet[1][0]; + dpv23[2][2][2] = 0.0; -//############################################################################################ + //############################################################################################ // average the normal vectors by using the 3 neighboring planes - n1[0] = (pv12[0] + pv31[0] + pv23[0])/cont; - n1[1] = (pv12[1] + pv31[1] + pv23[1])/cont; - n1[2] = (pv12[2] + pv31[2] + pv23[2])/cont; + n1[0] = (pv12[0] + pv31[0] + pv23[0]) / cont; + n1[1] = (pv12[1] + pv31[1] + pv23[1]) / cont; + n1[2] = (pv12[2] + pv31[2] + pv23[2]) / cont; // the magnitude of the normal vector - nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; + nn2 = n1[0] * n1[0] + n1[1] * n1[1] + n1[2] * n1[2]; nn = sqrt(nn2); - if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR, "The magnitude of the normal vector is zero"); // the unit normal vector - normal[i][0] = n1[0]/nn; - normal[i][1] = n1[1]/nn; - normal[i][2] = n1[2]/nn; + normal[i][0] = n1[0] / nn; + normal[i][1] = n1[1] / nn; + normal[i][2] = n1[2] / nn; // for the central atoms, dnormdri is always zero for (id = 0; id < 3; id++) { - for (ip = 0; ip < 3; ip++) { - dnormdri[id][ip][i] = 0.0; - } - } // end of derivatives of normals respect to atom i + for (ip = 0; ip < 3; ip++) { dnormdri[id][ip][i] = 0.0; } + } // end of derivatives of normals respect to atom i // derivatives of non-normalized normal vector, dn1:3x3x3 array for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { for (m = 0; m < 3; m++) { - dn1[id][ip][m] = (dpv12[id][ip][m] + dpv23[id][ip][m] + dpv31[id][ip][m])/cont; + dn1[id][ip][m] = (dpv12[id][ip][m] + dpv23[id][ip][m] + dpv31[id][ip][m]) / cont; } } } @@ -979,7 +975,7 @@ void PairKolmogorovCrespiFull::calc_normal() // r[id][m]: the id's component of atom m for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { - dnn[id][m] = (n1[0]*dn1[0][id][m] + n1[1]*dn1[1][id][m] + n1[2]*dn1[2][id][m])/nn; + dnn[id][m] = (n1[0] * dn1[0][id][m] + n1[1] * dn1[1][id][m] + n1[2] * dn1[2][id][m]) / nn; } } // dnormal[id][ip][m][i]: the derivative of normal[id] respect to r[ip][m], id,ip=0,1,2 @@ -987,49 +983,52 @@ void PairKolmogorovCrespiFull::calc_normal() for (m = 0; m < 3; m++) { for (id = 0; id < 3; id++) { for (ip = 0; ip < 3; ip++) { - dnormal[id][ip][m][i] = dn1[id][ip][m]/nn - n1[id]*dnn[ip][m]/nn2; + dnormal[id][ip][m][i] = dn1[id][ip][m] / nn - n1[id] * dnn[ip][m] / nn2; } } } - } - else { - error->one(FLERR,"There are too many neighbors for calculating normals"); + } else { + error->one(FLERR, "There are too many neighbors for calculating normals"); } -//############################################################################################## + //############################################################################################## } } /* ---------------------------------------------------------------------- */ double PairKolmogorovCrespiFull::single(int /*i*/, int /*j*/, int itype, int jtype, double rsq, - double /*factor_coul*/, double factor_lj, - double &fforce) + double /*factor_coul*/, double factor_lj, double &fforce) { - double r,r2inv,r6inv,r8inv,forcelj,philj; - double Tap,dTap,Vkc,fpair; + double r, r2inv, r6inv, r8inv, forcelj, philj; + double Tap, dTap, Vkc, fpair; int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); // turn on/off taper function if (tap_flag) { - Tap = calc_Tap(r,sqrt(cutsq[itype][jtype])); - dTap = calc_dTap(r,sqrt(cutsq[itype][jtype])); - } else {Tap = 1.0; dTap = 0.0;} + Tap = calc_Tap(r, sqrt(cutsq[itype][jtype])); + dTap = calc_dTap(r, sqrt(cutsq[itype][jtype])); + } else { + Tap = 1.0; + dTap = 0.0; + } - r2inv = 1.0/rsq; - r6inv = r2inv*r2inv*r2inv; - r8inv = r2inv*r6inv; + r2inv = 1.0 / rsq; + r6inv = r2inv * r2inv * r2inv; + r8inv = r2inv * r6inv; - Vkc = -p.A*p.z06*r6inv; + Vkc = -p.A * p.z06 * r6inv; // derivatives - fpair = -6.0*p.A*p.z06*r8inv; + fpair = -6.0 * p.A * p.z06 * r8inv; forcelj = fpair; - fforce = factor_lj*(forcelj*Tap - Vkc*dTap/r); + fforce = factor_lj * (forcelj * Tap - Vkc * dTap / r); - if (tap_flag) philj = Vkc*Tap; - else philj = Vkc - offset[itype][jtype]; - return factor_lj*philj; + if (tap_flag) + philj = Vkc * Tap; + else + philj = Vkc - offset[itype][jtype]; + return factor_lj * philj; } diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_full.h b/src/INTERLAYER/pair_kolmogorov_crespi_full.h index fb45a1cb02..b7264a0883 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_full.h +++ b/src/INTERLAYER/pair_kolmogorov_crespi_full.h @@ -17,8 +17,8 @@ PairStyle(kolmogorov/crespi/full,PairKolmogorovCrespiFull); // clang-format on #else -#ifndef LMP_PAIR_KolmogorovCrespi_FULL_H -#define LMP_PAIR_KolmogorovCrespi_FULL_H +#ifndef LMP_PAIR_KOLMOGOROV_CRESPI_FULL_H +#define LMP_PAIR_KOLMOGOROV_CRESPI_FULL_H #include "pair.h" @@ -39,10 +39,10 @@ class PairKolmogorovCrespiFull : public Pair { void calc_FRep(int, int); void calc_FvdW(int, int); double single(int, int, int, int, double, double, double, double &); + static constexpr int NPARAMS_PER_LINE = 12; protected: - int me; int maxlocal; // size of numneigh, firstneigh arrays int pgsize; // size of neighbor page int oneatom; // max # of neighbors for one atom @@ -61,7 +61,6 @@ class PairKolmogorovCrespiFull : public Pair { double cut_global; double cut_normal; - double **cut; double **cutKCsq; double **offset; double **normal; diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp index c28a405adc..70672ac670 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -79,14 +78,14 @@ PairKolmogorovCrespiZ::~PairKolmogorovCrespiZ() void PairKolmogorovCrespiZ::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair, fpair1; - double rsq,r,rhosq,exp1,exp2,r6,r8; - double frho,sumC,sumC2,sumCff,fsum,rdsq; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair, fpair1; + double rsq, r, rhosq, exp1, exp2, r6, r8; + double frho, sumC, sumC2, sumCff, fsum, rdsq; + int *ilist, *jlist, *numneigh, **firstneigh; evdwl = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -117,51 +116,49 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag) dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; // rho^2 = r^2 - (n,r) = r^2 - z^2 - rhosq = delx*delx + dely*dely; - rsq = rhosq + delz*delz; + rhosq = delx * delx + dely * dely; + rsq = rhosq + delz * delz; if (rsq < cutsq[itype][jtype]) { int iparam_ij = elem2param[map[itype]][map[jtype]]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; r = sqrt(rsq); - r6 = rsq*rsq*rsq; - r8 = r6*rsq; - rdsq = rhosq*p.delta2inv; // (rho/delta)^2 + r6 = rsq * rsq * rsq; + r8 = r6 * rsq; + rdsq = rhosq * p.delta2inv; // (rho/delta)^2 // store exponents - exp1 = exp(-p.lambda*(r-p.z0)); + exp1 = exp(-p.lambda * (r - p.z0)); exp2 = exp(-rdsq); // note that f(rho_ij) equals f(rho_ji) as normals are all along z - sumC = p.C0+p.C2*rdsq+p.C4*rdsq*rdsq; - sumC2 = (2*p.C2+4*p.C4*rdsq)*p.delta2inv; - frho = exp2*sumC; - sumCff = p.C + 2*frho; + sumC = p.C0 + p.C2 * rdsq + p.C4 * rdsq * rdsq; + sumC2 = (2 * p.C2 + 4 * p.C4 * rdsq) * p.delta2inv; + frho = exp2 * sumC; + sumCff = p.C + 2 * frho; // derivatives - fpair = -6.0*p.A*p.z06/r8+p.lambda*exp1/r*sumCff; - fpair1 = exp1*exp2*(4.0*p.delta2inv*sumC-2.0*sumC2); + fpair = -6.0 * p.A * p.z06 / r8 + p.lambda * exp1 / r * sumCff; + fpair1 = exp1 * exp2 * (4.0 * p.delta2inv * sumC - 2.0 * sumC2); fsum = fpair + fpair1; - f[i][0] += delx*fsum; - f[i][1] += dely*fsum; + f[i][0] += delx * fsum; + f[i][1] += dely * fsum; // fi_z does not contain contributions from df/dr // because rho_ij does not depend on z_i or z_j - f[i][2] += delz*fpair; + f[i][2] += delz * fpair; if (newton_pair || j < nlocal) { - f[j][0] -= delx*fsum; - f[j][1] -= dely*fsum; - f[j][2] -= delz*fpair; + f[j][0] -= delx * fsum; + f[j][1] -= dely * fsum; + f[j][2] -= delz * fpair; } - if (eflag) { - evdwl = -p.A*p.z06/r6+ exp1*sumCff - offset[itype][jtype]; - } + if (eflag) { evdwl = -p.A * p.z06 / r6 + exp1 * sumCff - offset[itype][jtype]; } if (evflag) { - ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0,fsum,fsum,fpair,delx,dely,delz); + ev_tally_xyz(i, j, nlocal, newton_pair, evdwl, 0, fsum, fsum, fpair, delx, dely, delz); } } } @@ -177,15 +174,14 @@ void PairKolmogorovCrespiZ::compute(int eflag, int vflag) void PairKolmogorovCrespiZ::allocate() { allocated = 1; - int n = atom->ntypes+1; + int n = atom->ntypes + 1; - memory->create(setflag,n,n,"pair:setflag"); + memory->create(setflag, n, n, "pair:setflag"); for (int i = 1; i < n; i++) - for (int j = i; j < n; j++) - setflag[i][j] = 0; + for (int j = i; j < n; j++) setflag[i][j] = 0; - memory->create(cutsq,n,n,"pair:cutsq"); - memory->create(offset,n,n,"pair:offset"); + memory->create(cutsq, n, n, "pair:cutsq"); + memory->create(offset, n, n, "pair:offset"); map = new int[n]; } @@ -195,11 +191,11 @@ void PairKolmogorovCrespiZ::allocate() void PairKolmogorovCrespiZ::settings(int narg, char **arg) { - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); - if (strcmp(force->pair_style,"hybrid/overlay")!=0) - error->all(FLERR,"ERROR: requires hybrid/overlay pair_style"); + if (narg != 1) error->all(FLERR, "Illegal pair_style command"); + if (strcmp(force->pair_style, "hybrid/overlay") != 0) + error->all(FLERR, "ERROR: requires hybrid/overlay pair_style"); - cut_global = utils::numeric(FLERR,arg[0],false,lmp); + cut_global = utils::numeric(FLERR, arg[0], false, lmp); } /* ---------------------------------------------------------------------- @@ -210,44 +206,43 @@ void PairKolmogorovCrespiZ::coeff(int narg, char **arg) { 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); - map_element2type(narg-3,arg+3,false); + map_element2type(narg - 3, arg + 3, false); read_file(arg[2]); // set setflag only for i,j pairs where both are mapped to elements int count = 0; for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - if ((map[i] >=0) && (map[j] >= 0)) { + for (int j = MAX(jlo, i); j <= jhi; j++) { + if ((map[i] >= 0) && (map[j] >= 0)) { setflag[i][j] = 1; count++; } } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ 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, "All pair coeffs are not set"); + if (!offset_flag) error->all(FLERR, "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]]; - Param& p = params[iparam_ij]; - offset[i][j] = -p.A*pow(p.z0/cut_global,6); - } else offset[i][j] = 0.0; + Param &p = params[iparam_ij]; + offset[i][j] = -p.A * pow(p.z0 / cut_global, 6); + } else + offset[i][j] = 0.0; offset[j][i] = offset[i][j]; return cut_global; @@ -298,28 +293,28 @@ void PairKolmogorovCrespiZ::read_file(char *filename) if (nparams == maxparam) { maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); // make certain all addional allocated storage is initialized // to avoid false positives when checking with valgrind - memset(params + nparams, 0, DELTA*sizeof(Param)); + memset(params + nparams, 0, DELTA * sizeof(Param)); } // load up parameter settings and error check their values params[nparams].ielement = ielement; params[nparams].jelement = jelement; - params[nparams].z0 = values.next_double(); - params[nparams].C0 = values.next_double(); - params[nparams].C2 = values.next_double(); - params[nparams].C4 = values.next_double(); - params[nparams].C = values.next_double(); - params[nparams].delta = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); params[nparams].lambda = values.next_double(); - params[nparams].A = values.next_double(); + params[nparams].A = values.next_double(); // S provides a convenient scaling of all energies - params[nparams].S = values.next_double(); + params[nparams].S = values.next_double(); } catch (TokenizerException &e) { error->one(FLERR, e.what()); @@ -328,7 +323,7 @@ void PairKolmogorovCrespiZ::read_file(char *filename) // energies in meV further scaled by S // S = 43.3634 meV = 1 kcal/mol - double meV = 1e-3*params[nparams].S; + double meV = 1e-3 * params[nparams].S; if (unit_convert) meV *= conversion_factor; params[nparams].C *= meV; @@ -338,35 +333,35 @@ void PairKolmogorovCrespiZ::read_file(char *filename) params[nparams].C4 *= meV; // precompute some quantities - params[nparams].delta2inv = pow(params[nparams].delta,-2); - params[nparams].z06 = pow(params[nparams].z0,6); + params[nparams].delta2inv = pow(params[nparams].delta, -2); + params[nparams].z06 = pow(params[nparams].z0, 6); nparams++; - if (nparams >= pow(atom->ntypes,3)) break; + if (nparams >= pow(atom->ntypes, 3)) break; } MPI_Bcast(&nparams, 1, MPI_INT, 0, world); MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); if (comm->me != 0) { - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); } - MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); - memory->create(elem2param,nelements,nelements,"pair:elem2param"); + memory->create(elem2param, nelements, nelements, "pair:elem2param"); for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "Potential file has duplicate entry"); n = m; } } - if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + if (n < 0) error->all(FLERR, "Potential file is missing an entry"); elem2param[i][j] = n; } } diff --git a/src/INTERLAYER/pair_kolmogorov_crespi_z.h b/src/INTERLAYER/pair_kolmogorov_crespi_z.h index d036f7bc76..fc07dcb96e 100644 --- a/src/INTERLAYER/pair_kolmogorov_crespi_z.h +++ b/src/INTERLAYER/pair_kolmogorov_crespi_z.h @@ -36,7 +36,7 @@ class PairKolmogorovCrespiZ : public Pair { static constexpr int NPARAMS_PER_LINE = 11; -protected: + protected: struct Param { double z0, C0, C2, C4, C, delta, lambda, A, S; double delta2inv, z06; diff --git a/src/INTERLAYER/pair_lebedeva_z.cpp b/src/INTERLAYER/pair_lebedeva_z.cpp index e275d7c475..d78c4bfbbc 100644 --- a/src/INTERLAYER/pair_lebedeva_z.cpp +++ b/src/INTERLAYER/pair_lebedeva_z.cpp @@ -252,7 +252,6 @@ double PairLebedevaZ::init_one(int i, int j) void PairLebedevaZ::read_file(char *filename) { - int params_per_line = 12; memory->sfree(params); params = nullptr; nparams = maxparam = 0; From a1dd2c7655e778aaf18b3161c1116553b7f54705 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 17 Aug 2021 22:35:22 -0400 Subject: [PATCH 313/352] move inline functions from header to cpp file --- src/INTERLAYER/pair_drip.cpp | 283 +++++++++++------------ src/INTERLAYER/pair_drip.h | 14 +- src/INTERLAYER/pair_ilp_graphene_hbn.cpp | 2 +- 3 files changed, 133 insertions(+), 166 deletions(-) diff --git a/src/INTERLAYER/pair_drip.cpp b/src/INTERLAYER/pair_drip.cpp index dd5277e88c..e9d32bdb8b 100644 --- a/src/INTERLAYER/pair_drip.cpp +++ b/src/INTERLAYER/pair_drip.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -43,6 +42,17 @@ using namespace LAMMPS_NS; #define DELTA 4 #define HALF 0.5 +// inline functions +static inline double dot(double const *x, double const *y) +{ + return x[0] * y[0] + x[1] * y[1] + x[2] * y[2]; +} + +static inline void mat_dot_vec(PairDRIP::V3 const *X, double const *y, double *const z) +{ + for (int k = 0; k < 3; k++) { z[k] = X[k][0] * y[0] + X[k][1] * y[1] + X[k][2] * y[2]; } +} + /* ---------------------------------------------------------------------- */ PairDRIP::PairDRIP(LAMMPS *lmp) : Pair(lmp) @@ -78,13 +88,11 @@ PairDRIP::~PairDRIP() void PairDRIP::init_style() { - if (force->newton_pair == 0) - error->all(FLERR,"Pair style drip requires newton pair on"); - if (!atom->molecule_flag) - error->all(FLERR,"Pair style drip requires atom attribute molecule"); + if (force->newton_pair == 0) error->all(FLERR, "Pair style drip requires newton pair on"); + if (!atom->molecule_flag) error->all(FLERR, "Pair style drip requires atom attribute molecule"); // need a full neighbor list, including neighbors of ghosts - int irequest = neighbor->request(this,instance_me); + int irequest = neighbor->request(this, instance_me); neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; neighbor->requests[irequest]->ghost = 1; @@ -97,10 +105,10 @@ void PairDRIP::init_style() void PairDRIP::allocate() { allocated = 1; - int n = atom->ntypes+1; + int n = atom->ntypes + 1; - memory->create(setflag,n,n,"pair:setflag"); - memory->create(cutsq,n,n,"pair:cutsq"); + memory->create(setflag, n, n, "pair:setflag"); + memory->create(cutsq, n, n, "pair:cutsq"); map = new int[n]; } @@ -110,9 +118,9 @@ void PairDRIP::allocate() void PairDRIP::settings(int narg, char ** /* arg */) { - if (narg != 0) error->all(FLERR,"Illegal pair_style command"); - if (!utils::strmatch(force->pair_style,"^hybrid/overlay")) - error->all(FLERR,"Pair style drip must be used as sub-style with hybrid/overlay"); + if (narg != 0) error->all(FLERR, "Illegal pair_style command"); + if (!utils::strmatch(force->pair_style, "^hybrid/overlay")) + error->all(FLERR, "Pair style drip must be used as sub-style with hybrid/overlay"); } /* ---------------------------------------------------------------------- @@ -123,23 +131,22 @@ void PairDRIP::coeff(int narg, char **arg) { if (!allocated) allocate(); - map_element2type(narg-3,arg+3); + map_element2type(narg - 3, arg + 3); read_file(arg[2]); } - /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ 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, "All pair coeffs are not set"); int itype = map[i]; int jtype = map[j]; int iparam_ij = elem2param[itype][jtype]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; // max cutoff is the main cutoff plus the normal cutoff such that return p.rcut + p.ncut; @@ -190,29 +197,29 @@ void PairDRIP::read_file(char *filename) if (nparams == maxparam) { maxparam += DELTA; - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); // make certain all addional allocated storage is initialized // to avoid false positives when checking with valgrind - memset(params + nparams, 0, DELTA*sizeof(Param)); + memset(params + nparams, 0, DELTA * sizeof(Param)); } params[nparams].ielement = ielement; params[nparams].jelement = jelement; - params[nparams].C0 = values.next_double(); - params[nparams].C2 = values.next_double(); - params[nparams].C4 = values.next_double(); - params[nparams].C = values.next_double(); - params[nparams].delta = values.next_double(); - params[nparams].lambda = values.next_double(); - params[nparams].A = values.next_double(); - params[nparams].z0 = values.next_double(); - params[nparams].B = values.next_double(); - params[nparams].eta = values.next_double(); - params[nparams].rhocut = values.next_double(); - params[nparams].rcut = values.next_double(); - params[nparams].ncut = values.next_double(); + params[nparams].C0 = values.next_double(); + params[nparams].C2 = values.next_double(); + params[nparams].C4 = values.next_double(); + params[nparams].C = values.next_double(); + params[nparams].delta = values.next_double(); + params[nparams].lambda = values.next_double(); + params[nparams].A = values.next_double(); + params[nparams].z0 = values.next_double(); + params[nparams].B = values.next_double(); + params[nparams].eta = values.next_double(); + params[nparams].rhocut = values.next_double(); + params[nparams].rcut = values.next_double(); + params[nparams].ncut = values.next_double(); } catch (TokenizerException &e) { error->one(FLERR, e.what()); @@ -222,15 +229,15 @@ void PairDRIP::read_file(char *filename) params[nparams].C0 *= conversion_factor; params[nparams].C2 *= conversion_factor; params[nparams].C4 *= conversion_factor; - params[nparams].C *= conversion_factor; - params[nparams].A *= conversion_factor; - params[nparams].B *= conversion_factor; + params[nparams].C *= conversion_factor; + params[nparams].A *= conversion_factor; + params[nparams].B *= conversion_factor; } // convenient precomputations params[nparams].rhocutsq = params[nparams].rhocut * params[nparams].rhocut; - params[nparams].rcutsq = params[nparams].rcut * params[nparams].rcut; - params[nparams].ncutsq = params[nparams].ncut * params[nparams].ncut; + params[nparams].rcutsq = params[nparams].rcut * params[nparams].rcut; + params[nparams].ncutsq = params[nparams].ncut * params[nparams].ncut; nparams++; } @@ -239,24 +246,24 @@ void PairDRIP::read_file(char *filename) MPI_Bcast(&maxparam, 1, MPI_INT, 0, world); if (comm->me != 0) { - params = (Param *) memory->srealloc(params,maxparam*sizeof(Param), "pair:params"); + params = (Param *) memory->srealloc(params, maxparam * sizeof(Param), "pair:params"); } - MPI_Bcast(params, maxparam*sizeof(Param), MPI_BYTE, 0, world); + MPI_Bcast(params, maxparam * sizeof(Param), MPI_BYTE, 0, world); } memory->destroy(elem2param); - memory->create(elem2param,nelements,nelements,"pair:elem2param"); + memory->create(elem2param, nelements, nelements, "pair:elem2param"); for (int i = 0; i < nelements; i++) { for (int j = 0; j < nelements; j++) { int n = -1; for (int m = 0; m < nparams; m++) { if (i == params[m].ielement && j == params[m].jelement) { - if (n >= 0) error->all(FLERR,"Potential file has duplicate entry"); + if (n >= 0) error->all(FLERR, "Potential file has duplicate entry"); n = m; } } - if (n < 0) error->all(FLERR,"Potential file is missing an entry"); + if (n < 0) error->all(FLERR, "Potential file is missing an entry"); elem2param[i][j] = n; } } @@ -266,15 +273,15 @@ void PairDRIP::read_file(char *filename) void PairDRIP::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,rsq; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itype, jtype; + double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, rsq; + int *ilist, *jlist, *numneigh, **firstneigh; double ni[3]; double dni_dri[3][3], dni_drnb1[3][3]; double dni_drnb2[3][3], dni_drnb3[3][3]; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -291,9 +298,7 @@ void PairDRIP::compute(int eflag, int vflag) for (ii = 0; ii < inum; ii++) { i = ilist[ii]; - if (nearest3neigh[i][0] == -1) { - continue; - } + if (nearest3neigh[i][0] == -1) { continue; } xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; @@ -302,24 +307,22 @@ void PairDRIP::compute(int eflag, int vflag) jnum = numneigh[i]; // normal and its derivatives w.r.t. atom i and its 3 nearest neighbors - calc_normal(i, ni, dni_dri,dni_drnb1, dni_drnb2, dni_drnb3); + calc_normal(i, ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3); double fi[3] = {0., 0., 0.}; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; - if (nearest3neigh[j][0] == -1) { - continue; - } + if (nearest3neigh[j][0] == -1) { continue; } jtype = map[type[j]]; delx = x[j][0] - xtmp; dely = x[j][1] - ytmp; delz = x[j][2] - ztmp; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; int iparam_ij = elem2param[itype][jtype]; - Param& p = params[iparam_ij]; + Param &p = params[iparam_ij]; double rcutsq = p.rcutsq; // only include the interaction between different layers @@ -330,40 +333,38 @@ void PairDRIP::compute(int eflag, int vflag) double phi_attr = calc_attractive(p, rsq, rvec, fi, fj); - double phi_repul = calc_repulsive(i, j, p, rsq, rvec, - ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3, fi, fj); + double phi_repul = calc_repulsive(i, j, p, rsq, rvec, ni, dni_dri, dni_drnb1, dni_drnb2, + dni_drnb3, fi, fj); - if (eflag) evdwl = HALF * (phi_repul + phi_attr); - else evdwl = 0.0; - if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,0,0,0,0); + if (eflag) + evdwl = HALF * (phi_repul + phi_attr); + else + evdwl = 0.0; + if (evflag) ev_tally(i, j, nlocal, newton_pair, evdwl, 0.0, 0, 0, 0, 0); f[j][0] += fj[0]; f[j][1] += fj[1]; f[j][2] += fj[2]; if (vflag_either) v_tally2_newton(j, fj, x[j]); - } - } //loop over jj + } //loop over jj f[i][0] += fi[0]; f[i][1] += fi[1]; f[i][2] += fi[2]; if (vflag_either) v_tally2_newton(i, fi, x[i]); - } // loop over ii - - -if (vflag_fdotr) - virial_fdotr_compute(); + } // loop over ii + if (vflag_fdotr) virial_fdotr_compute(); } /* ---------------------------------------------------------------------- Attractive part, i.e. the r^(-6) part ------------------------------------------------------------------------- */ -double PairDRIP::calc_attractive(Param& p, double const rsq, double const *rvec, - double *const fi, double *const fj) +double PairDRIP::calc_attractive(Param &p, double const rsq, double const *rvec, double *const fi, + double *const fj) { double const z0 = p.z0; double const A = p.A; @@ -393,10 +394,10 @@ double PairDRIP::calc_attractive(Param& p, double const rsq, double const *rvec, Repulsive part that depends on transverse distance and dihedral angle ------------------------------------------------------------------------- */ -double PairDRIP::calc_repulsive(int const i, int const j, Param& p, - double const rsq, double const *rvec, double const *ni, - V3 const *dni_dri, V3 const *dni_drnb1, V3 const *dni_drnb2, - V3 const *dni_drnb3, double *const fi, double *const fj) +double PairDRIP::calc_repulsive(int const i, int const j, Param &p, double const rsq, + double const *rvec, double const *ni, V3 const *dni_dri, + V3 const *dni_drnb1, V3 const *dni_drnb2, V3 const *dni_drnb3, + double *const fi, double *const fj) { double **f = atom->f; double **x = atom->x; @@ -441,8 +442,8 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, double r = sqrt(rsq); // derivative of rhosq w.r.t. atoms i j and the nearests 3 neighs of i - get_drhosqij(rvec, ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3, drhosqij_dri, - drhosqij_drj, drhosqij_drnb1, drhosqij_drnb2, drhosqij_drnb3); + get_drhosqij(rvec, ni, dni_dri, dni_drnb1, dni_drnb2, dni_drnb3, drhosqij_dri, drhosqij_drj, + drhosqij_drnb1, drhosqij_drnb2, drhosqij_drnb3); // transverse decay function f(rho) and its derivative w.r.t. rhosq double rhosqij; @@ -451,8 +452,8 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, // dihedral angle function and its derivateives double dgij_drhosq; - double gij = dihedral(i, j, p, rhosqij, dgij_drhosq, dgij_dri, dgij_drj, - dgij_drk1, dgij_drk2, dgij_drk3, dgij_drl1, dgij_drl2, dgij_drl3); + double gij = dihedral(i, j, p, rhosqij, dgij_drhosq, dgij_dri, dgij_drj, dgij_drk1, dgij_drk2, + dgij_drk3, dgij_drl1, dgij_drl2, dgij_drl3); double V2 = C + tdij + gij; @@ -476,12 +477,12 @@ double PairDRIP::calc_repulsive(int const i, int const j, Param& p, // contributions from transverse decay part tdij and the dihedral part gij // derivative of V2 contribute to atoms i, j - fi[k] -= HALF*tp*V1*((dtdij+dgij_drhosq)*drhosqij_dri[k]+dgij_dri[k]); - fj[k] -= HALF*tp*V1*((dtdij+dgij_drhosq)*drhosqij_drj[k]+dgij_drj[k]); + fi[k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_dri[k] + dgij_dri[k]); + fj[k] -= HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drj[k] + dgij_drj[k]); // derivative of V2 contribute to nearest 3 neighs of atom i - fnbi1[k] = -HALF*tp*V1*((dtdij+dgij_drhosq)*drhosqij_drnb1[k]+dgij_drk1[k]); - fnbi2[k] = -HALF*tp*V1*((dtdij+dgij_drhosq)*drhosqij_drnb2[k]+dgij_drk2[k]); - fnbi3[k] = -HALF*tp*V1*((dtdij+dgij_drhosq)*drhosqij_drnb3[k]+dgij_drk3[k]); + fnbi1[k] = -HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb1[k] + dgij_drk1[k]); + fnbi2[k] = -HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb2[k] + dgij_drk2[k]); + fnbi3[k] = -HALF * tp * V1 * ((dtdij + dgij_drhosq) * drhosqij_drnb3[k] + dgij_drk3[k]); // derivative of V2 contribute to nearest 3 neighs of atom j fnbj1[k] = -HALF * tp * V1 * dgij_drl1[k]; fnbj2[k] = -HALF * tp * V1 * dgij_drl2[k]; @@ -520,7 +521,6 @@ void PairDRIP::find_nearest3neigh() double **x = atom->x; int *type = atom->type; - allnum = list->inum + list->gnum; inum = list->inum; ilist = list->ilist; @@ -536,7 +536,7 @@ void PairDRIP::find_nearest3neigh() // If "NULL" used in pair_coeff, i could be larger than allnum if (i >= size) { - size = i+1; + size = i + 1; memory->grow(nearest3neigh, size, 3, "pair:nearest3neigh"); } @@ -577,26 +577,24 @@ void PairDRIP::find_nearest3neigh() nb3_rsq = nb2_rsq; nb2_rsq = nb1_rsq; nb1_rsq = rsq; - } - else if (rsq < nb2_rsq) { + } else if (rsq < nb2_rsq) { nb3 = nb2; nb2 = j; nb3_rsq = nb2_rsq; nb2_rsq = rsq; - } - else if (rsq < nb3_rsq) { + } else if (rsq < nb3_rsq) { nb3 = j; nb3_rsq = rsq; } - } - } // loop over jj + } // loop over jj // store neighbors to be used later to compute normal if (nb3_rsq >= 1.0e10) { - if (ione(FLERR, "No enough neighbors to construct normal. Check the " - "configuration to see whether atoms fly away."); + if (i < inum) { + error->one(FLERR, + "No enough neighbors to construct normal. Check the " + "configuration to see whether atoms fly away."); } else { // This only happens for ghost atoms that are near the boundary of the // domain (i.e. r > r_cut + n_cut). These ghost atoms will not be @@ -607,20 +605,18 @@ void PairDRIP::find_nearest3neigh() nearest3neigh[i][1] = -1; nearest3neigh[i][2] = -1; } - } - else{ + } else { nearest3neigh[i][0] = nb1; nearest3neigh[i][1] = nb2; nearest3neigh[i][2] = nb3; } - } // loop over ii - + } // loop over ii } /* ---------------------------------------------------------------------- */ -void PairDRIP::calc_normal(int const i, double *const normal, - V3 *const dn_dri, V3 *const dn_drk1, V3 *const dn_drk2, V3 *const dn_drk3) +void PairDRIP::calc_normal(int const i, double *const normal, V3 *const dn_dri, V3 *const dn_drk1, + V3 *const dn_drk2, V3 *const dn_drk3) { int k1 = nearest3neigh[i][0]; int k2 = nearest3neigh[i][1]; @@ -628,9 +624,7 @@ void PairDRIP::calc_normal(int const i, double *const normal, // normal does not depend on i, setting to zero for (int j = 0; j < 3; j++) { - for (int k = 0; k < 3; k++) { - dn_dri[j][k] = 0.0; - } + for (int k = 0; k < 3; k++) { dn_dri[j][k] = 0.0; } } // get normal and derives of normal w.r.t to its 3 nearest neighbors @@ -640,11 +634,11 @@ void PairDRIP::calc_normal(int const i, double *const normal, /* ---------------------------------------------------------------------- */ -void PairDRIP::get_drhosqij(double const *rij, double const *ni, - V3 const *dni_dri, V3 const *dni_drn1, V3 const *dni_drn2, - V3 const *dni_drn3, double *const drhosq_dri, double *const drhosq_drj, - double *const drhosq_drn1, double *const drhosq_drn2, - double *const drhosq_drn3) +void PairDRIP::get_drhosqij(double const *rij, double const *ni, V3 const *dni_dri, + V3 const *dni_drn1, V3 const *dni_drn2, V3 const *dni_drn3, + double *const drhosq_dri, double *const drhosq_drj, + double *const drhosq_drn1, double *const drhosq_drn2, + double *const drhosq_drn3) { int k; double ni_dot_rij = 0; @@ -660,7 +654,7 @@ void PairDRIP::get_drhosqij(double const *rij, double const *ni, mat_dot_vec(dni_drn3, rij, dni_drn3_dot_rij); for (k = 0; k < 3; k++) { - drhosq_dri[k] = -2*rij[k] - 2 * ni_dot_rij * (-ni[k] + dni_dri_dot_rij[k]); + drhosq_dri[k] = -2 * rij[k] - 2 * ni_dot_rij * (-ni[k] + dni_dri_dot_rij[k]); drhosq_drj[k] = 2 * rij[k] - 2 * ni_dot_rij * ni[k]; drhosq_drn1[k] = -2 * ni_dot_rij * dni_drn1_dot_rij[k]; drhosq_drn2[k] = -2 * ni_dot_rij * dni_drn2_dot_rij[k]; @@ -672,18 +666,15 @@ void PairDRIP::get_drhosqij(double const *rij, double const *ni, derivartive of transverse decay function f(rho) w.r.t. rho ------------------------------------------------------------------------- */ -double PairDRIP::td(double C0, double C2, double C4, double delta, - double const *const rvec, double r, const double *const n, - double& rho_sq, double& dtd) +double PairDRIP::td(double C0, double C2, double C4, double delta, double const *const rvec, + double r, const double *const n, double &rho_sq, double &dtd) { double n_dot_r = dot(n, rvec); rho_sq = r * r - n_dot_r * n_dot_r; // in case n is [0, 0, 1] and rho_sq is negative due to numerical error - if (rho_sq < 0) { - rho_sq = 0; - } + if (rho_sq < 0) { rho_sq = 0; } double del_sq = delta * delta; double rod_sq = rho_sq / del_sq; @@ -697,11 +688,10 @@ double PairDRIP::td(double C0, double C2, double C4, double delta, derivartive of dihedral angle func gij w.r.t rho, and atom positions ------------------------------------------------------------------------- */ -double PairDRIP::dihedral(const int i, const int j, Param& p, - double const rhosq, double& d_drhosq, - double *const d_dri, double *const d_drj, - double *const d_drk1, double *const d_drk2, double *const d_drk3, - double *const d_drl1, double *const d_drl2, double *const d_drl3) +double PairDRIP::dihedral(const int i, const int j, Param &p, double const rhosq, double &d_drhosq, + double *const d_dri, double *const d_drj, double *const d_drk1, + double *const d_drk2, double *const d_drk3, double *const d_drl1, + double *const d_drl2, double *const d_drl3) { double **x = atom->x; @@ -711,11 +701,10 @@ double PairDRIP::dihedral(const int i, const int j, Param& p, double cut_rhosq = p.rhocutsq; // local vars - double cos_kl[3][3]; // cos_omega_k1ijl1, cos_omega_k1ijl2 ... - double d_dcos_kl[3][3]; // deriv of dihedral w.r.t to cos_omega_kijl - double dcos_kl[3][3][4][3]; // 4 indicates k, i, j, l. e.g. dcoskl[0][1][0] - // means dcos_omega_k1ijl2 / drk - + double cos_kl[3][3]; // cos_omega_k1ijl1, cos_omega_k1ijl2 ... + double d_dcos_kl[3][3]; // deriv of dihedral w.r.t to cos_omega_kijl + double dcos_kl[3][3][4][3]; // 4 indicates k, i, j, l. e.g. dcoskl[0][1][0] + // means dcos_omega_k1ijl2 / drk // if larger than cutoff of rho, return 0 if (rhosq >= cut_rhosq) { @@ -744,9 +733,8 @@ double PairDRIP::dihedral(const int i, const int j, Param& p, // cos_omega_kijl and the derivatives w.r.t coordinates for (int m = 0; m < 3; m++) { for (int n = 0; n < 3; n++) { - cos_kl[m][n] = deriv_cos_omega(x[k[m]], x[i], x[j], x[l[n]], - dcos_kl[m][n][0], dcos_kl[m][n][1], - dcos_kl[m][n][2], dcos_kl[m][n][3]); + cos_kl[m][n] = deriv_cos_omega(x[k[m]], x[i], x[j], x[l[n]], dcos_kl[m][n][0], + dcos_kl[m][n][1], dcos_kl[m][n][2], dcos_kl[m][n][3]); } } @@ -812,9 +800,9 @@ double PairDRIP::dihedral(const int i, const int j, Param& p, compute cos(omega_kijl) and the derivateives ------------------------------------------------------------------------- */ -double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, - double const *rj, double const *rl, double *const dcos_drk, - double *const dcos_dri, double *const dcos_drj, double *const dcos_drl) +double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, double const *rj, + double const *rl, double *const dcos_drk, double *const dcos_dri, + double *const dcos_drj, double *const dcos_drl) { double ejik[3]; double eijl[3]; @@ -827,7 +815,6 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, double deijl_drj[3][3]; double deijl_drl[3][3]; - // ejik and derivatives // Note the returned dejik_dri ... are actually the transpose deriv_cross(ri, rj, rk, ejik, dejik_dri, dejik_drj, dejik_drk); @@ -860,15 +847,11 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, // dcos_dri mat_dot_vec(dejik_dri, eijl, tmp1); mat_dot_vec(deijl_dri, ejik, tmp2); - for (int m = 0; m < 3; m++) { - dcos_dri[m] = tmp1[m] + tmp2[m]; - } + for (int m = 0; m < 3; m++) { dcos_dri[m] = tmp1[m] + tmp2[m]; } // dcos_drj mat_dot_vec(dejik_drj, eijl, tmp1); mat_dot_vec(deijl_drj, ejik, tmp2); - for (int m = 0; m < 3; m++) { - dcos_drj[m] = tmp1[m] + tmp2[m]; - } + for (int m = 0; m < 3; m++) { dcos_drj[m] = tmp1[m] + tmp2[m]; } // dcos drl mat_dot_vec(deijl_drl, ejik, dcos_drl); @@ -880,7 +863,7 @@ double PairDRIP::deriv_cos_omega(double const *rk, double const *ri, /* ---------------------------------------------------------------------- */ -double PairDRIP::tap(double r, double cutoff, double& dtap) +double PairDRIP::tap(double r, double cutoff, double &dtap) { double t; double r_min = 0; @@ -888,13 +871,12 @@ double PairDRIP::tap(double r, double cutoff, double& dtap) if (r <= r_min) { t = 1; dtap = 0; - } - else { + } else { double roc = (r - r_min) / (cutoff - r_min); double roc_sq = roc * roc; - t = roc_sq*roc_sq*(-35.0 + 84.0 * roc + roc_sq * (-70.0 + 20.0 * roc)) + 1; - dtap = roc_sq * roc / (cutoff - r_min) - * (-140.0 + 420.0 * roc + roc_sq * (-420.0 + 140.0 * roc)); + t = roc_sq * roc_sq * (-35.0 + 84.0 * roc + roc_sq * (-70.0 + 20.0 * roc)) + 1; + dtap = + roc_sq * roc / (cutoff - r_min) * (-140.0 + 420.0 * roc + roc_sq * (-420.0 + 140.0 * roc)); } return t; @@ -902,7 +884,7 @@ double PairDRIP::tap(double r, double cutoff, double& dtap) /* ---------------------------------------------------------------------- */ -double PairDRIP::tap_rho(double rhosq, double cut_rhosq, double& drhosq) +double PairDRIP::tap_rho(double rhosq, double cut_rhosq, double &drhosq) { double roc_sq; double roc; @@ -910,10 +892,10 @@ double PairDRIP::tap_rho(double rhosq, double cut_rhosq, double& drhosq) roc_sq = rhosq / cut_rhosq; roc = sqrt(roc_sq); - t = roc_sq*roc_sq*(-35.0 + 84.0 * roc + roc_sq * (-70.0 + 20.0 * roc)) + 1; + t = roc_sq * roc_sq * (-35.0 + 84.0 * roc + roc_sq * (-70.0 + 20.0 * roc)) + 1; // Note this dtap/drho_sq not dtap/drho - drhosq = roc_sq/cut_rhosq*(-70.0 + 210.0*roc + roc_sq*(-210.0 + 70.0*roc)); + drhosq = roc_sq / cut_rhosq * (-70.0 + 210.0 * roc + roc_sq * (-210.0 + 70.0 * roc)); return t; } @@ -925,9 +907,9 @@ double PairDRIP::tap_rho(double rhosq, double cut_rhosq, double& drhosq) transpose. ------------------------------------------------------------------------- */ -void PairDRIP::deriv_cross(double const *rk, double const *rl, - double const *rm, double *const cross, - V3 *const dcross_drk, V3 *const dcross_drl, V3 *const dcross_drm) +void PairDRIP::deriv_cross(double const *rk, double const *rl, double const *rm, + double *const cross, V3 *const dcross_drk, V3 *const dcross_drl, + V3 *const dcross_drm) { double x[3]; double y[3]; @@ -943,7 +925,6 @@ void PairDRIP::deriv_cross(double const *rk, double const *rl, int i, j; - // get x = rkl and y = rkm for (i = 0; i < 3; i++) { x[i] = rl[i] - rk[i]; @@ -1000,8 +981,6 @@ void PairDRIP::deriv_cross(double const *rk, double const *rl, // dcross/drk transposed for (i = 0; i < 3; i++) { - for (j = 0; j < 3; j++) { - dcross_drk[i][j] = -(dcross_drl[i][j] + dcross_drm[i][j]); - } + for (j = 0; j < 3; j++) { dcross_drk[i][j] = -(dcross_drl[i][j] + dcross_drm[i][j]); } } } diff --git a/src/INTERLAYER/pair_drip.h b/src/INTERLAYER/pair_drip.h index cd385e720a..eb854b585b 100644 --- a/src/INTERLAYER/pair_drip.h +++ b/src/INTERLAYER/pair_drip.h @@ -33,7 +33,6 @@ PairStyle(drip, PairDRIP); namespace LAMMPS_NS { - class PairDRIP : public Pair { public: PairDRIP(class LAMMPS *); @@ -46,9 +45,9 @@ class PairDRIP : public Pair { void init_style(); static constexpr int NPARAMS_PER_LINE = 15; + typedef double V3[3]; protected: - typedef double V3[3]; struct Param { int ielement, jelement; double C0, C2, C4, C, delta, lambda, A, z0, B, eta, rhocut, rcut, ncut; @@ -91,17 +90,6 @@ class PairDRIP : public Pair { void deriv_cross(double const *, double const *, double const *, double *const, V3 *const, V3 *const, V3 *const); - - // inline functions - inline double dot(double const *x, double const *y) const - { - return x[0] * y[0] + x[1] * y[1] + x[2] * y[2]; - } - - inline void mat_dot_vec(V3 const *X, double const *y, double *const z) const - { - for (int k = 0; k < 3; k++) { z[k] = X[k][0] * y[0] + X[k][1] * y[1] + X[k][2] * y[2]; } - } }; } // namespace LAMMPS_NS diff --git a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp index b68ed80486..43070c5156 100644 --- a/src/INTERLAYER/pair_ilp_graphene_hbn.cpp +++ b/src/INTERLAYER/pair_ilp_graphene_hbn.cpp @@ -27,6 +27,7 @@ #include "comm.h" #include "error.h" #include "force.h" +#include "interlayer_taper.h" #include "memory.h" #include "my_page.h" #include "neigh_list.h" @@ -34,7 +35,6 @@ #include "neighbor.h" #include "potential_file_reader.h" #include "tokenizer.h" -#include "interlayer_taper.h" #include #include From c57da0661df76c58177d1b981cc57dc78e36976f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 12:49:16 -0400 Subject: [PATCH 314/352] update package name --- doc/src/compute_property_atom.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/compute_property_atom.rst b/doc/src/compute_property_atom.rst index 60e8c5f167..c4657ce82c 100644 --- a/doc/src/compute_property_atom.rst +++ b/doc/src/compute_property_atom.rst @@ -92,8 +92,8 @@ Syntax .. parsed-literal:: - USER-MESONT package per-atom properties: - buckling = buckling flag used in mesoscopic simulation of nanotubes + MESONT package per-atom properties: + buckling = buckling flag used in mesoscopic simulation of nanotubes Examples """""""" From c6819e30cf82e1214feaacb3a5b82dbe6cb46dd2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 12:58:39 -0400 Subject: [PATCH 315/352] simplify --- src/KOKKOS/pair_table_rx_kokkos.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/pair_table_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp index 6603d8d88b..b7b9560bc1 100644 --- a/src/KOKKOS/pair_table_rx_kokkos.cpp +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -1054,14 +1054,10 @@ void PairTableRXKokkos::coeff(int narg, char **arg) if (ispecies == nspecies && strcmp(site1,"1fluid") != 0) error->all(FLERR,"Site1 name not recognized in pair coefficients"); + site2 = utils::strdup(arg[5]); - n = strlen(arg[5]) + 1; - site2 = new char[n]; - strcpy(site2,arg[5]); - - for (ispecies = 0; ispecies < nspecies; ispecies++) { + for (ispecies = 0; ispecies < nspecies; ispecies++) if (strcmp(site2,&atom->dvname[ispecies][0]) == 0) break; - } if (ispecies == nspecies && strcmp(site2,"1fluid") != 0) error->all(FLERR,"Site2 name not recognized in pair coefficients"); From c50abed92b6db7041fcb404d19b157e1c8f6df92 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 12:59:31 -0400 Subject: [PATCH 316/352] recover compilation --- src/REACTION/fix_bond_react.cpp | 4 +-- src/fix_property_atom.cpp | 2 +- unittest/formats/test_atom_styles.cpp | 39 +++++++++++++++++---------- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/REACTION/fix_bond_react.cpp b/src/REACTION/fix_bond_react.cpp index e6828b24ab..0c309b9ead 100644 --- a/src/REACTION/fix_bond_react.cpp +++ b/src/REACTION/fix_bond_react.cpp @@ -2625,8 +2625,8 @@ void FixBondReact::unlimit_bond() // let's now unlimit in terms of i_limit_tags // we just run through all nlocal, looking for > limit_duration // then we return i_limit_tag to 0 (which removes from dynamic group) - int flag,cols - int index1 = atom->find_custom("limit_tags",flag,cols); + int flag, cols; + int index1 = atom->find_custom("limit_tags",flag,cols); int *i_limit_tags = atom->ivector[index1]; int *i_statted_tags; diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 47c7475524..0ca8a75632 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -250,7 +250,7 @@ void FixPropertyAtom::init() void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, tagint id_offset) { - int j,k,m,iword,ncol,nv; + int j,k,m,ncol; tagint itag; char *next; diff --git a/unittest/formats/test_atom_styles.cpp b/unittest/formats/test_atom_styles.cpp index d416074b81..b091360170 100644 --- a/unittest/formats/test_atom_styles.cpp +++ b/unittest/formats/test_atom_styles.cpp @@ -11,6 +11,7 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +#include "../testing/core.h" #include "atom.h" #include "atom_vec_body.h" #include "atom_vec_ellipsoid.h" @@ -24,7 +25,6 @@ #include "utils.h" #include "gmock/gmock.h" #include "gtest/gtest.h" -#include "../testing/core.h" #include #include @@ -48,7 +48,7 @@ using LAMMPS_NS::utils::split_words; -static void create_molecule_files(const std::string & h2o_filename, const std::string & co2_filename) +static void create_molecule_files(const std::string &h2o_filename, const std::string &co2_filename) { // create molecule files const char h2o_file[] = "# Water molecule. SPC/E model.\n\n3 atoms\n2 bonds\n1 angles\n\n" @@ -95,11 +95,10 @@ using ::testing::Eq; class AtomStyleTest : public LAMMPSTest { protected: - static void SetUpTestSuite() { - create_molecule_files("h2o.mol", "co2.mol"); - } + static void SetUpTestSuite() { create_molecule_files("h2o.mol", "co2.mol"); } - static void TearDownTestSuite() { + static void TearDownTestSuite() + { remove("h2o.mol"); remove("co2.mol"); } @@ -237,8 +236,10 @@ struct AtomState { bool has_dihedral = false; bool has_improper = false; - bool has_iname = false; - bool has_dname = false; + bool has_ivname = false; + bool has_dvname = false; + bool has_ianame = false; + bool has_daname = false; bool has_mass = false; bool has_mass_setflag = false; @@ -444,8 +445,10 @@ void ASSERT_ATOM_STATE_EQ(Atom *atom, const AtomState &expected) ASSERT_EQ(atom->nivector, expected.nivector); ASSERT_EQ(atom->ndvector, expected.ndvector); - ASSERT_ARRAY_ALLOCATED(atom->iname, expected.has_iname); - ASSERT_ARRAY_ALLOCATED(atom->dname, expected.has_dname); + ASSERT_ARRAY_ALLOCATED(atom->ivname, expected.has_ivname); + ASSERT_ARRAY_ALLOCATED(atom->dvname, expected.has_dvname); + ASSERT_ARRAY_ALLOCATED(atom->ianame, expected.has_ianame); + ASSERT_ARRAY_ALLOCATED(atom->daname, expected.has_daname); ASSERT_ARRAY_ALLOCATED(atom->mass, expected.has_mass); ASSERT_ARRAY_ALLOCATED(atom->mass_setflag, expected.has_mass_setflag); @@ -4555,7 +4558,8 @@ TEST_F(AtomStyleTest, property_atom) { BEGIN_HIDE_OUTPUT(); command("atom_modify map array"); - command("fix Properties all property/atom i_one d_two mol d_three q rmass ghost yes"); + command("fix Properties all property/atom " + "i_one d_two mol d_three q rmass i2_four 2 d2_five 3 ghost yes"); END_HIDE_OUTPUT(); AtomState expected; @@ -4570,8 +4574,10 @@ TEST_F(AtomStyleTest, property_atom) expected.has_x = true; expected.has_v = true; expected.has_f = true; - expected.has_iname = true; - expected.has_dname = true; + expected.has_ivname = true; + expected.has_dvname = true; + expected.has_ianame = true; + expected.has_daname = true; expected.has_extra_grow = true; expected.has_extra_restart = true; expected.has_extra_border = true; @@ -4614,7 +4620,12 @@ TEST_F(AtomStyleTest, property_atom) command("set atom 2 d_three -1.0"); command("set atom 3 d_three 0.5"); command("set atom 4 d_three 2.0"); - + command("set atom * d2_five[1] -5.9"); + command("set atom * d2_five[2] 1.1e-2"); + command("set atom * d2_five[3] .1"); + command("set atom 1*2 i2_four[1] -2"); + command("set atom 3*4 i2_four[1] -1"); + command("set atom * i2_four[2] 2"); END_HIDE_OUTPUT(); expected.natoms = 4; expected.nlocal = 4; From 300fee043745a890f976aedcd98364e018b75768 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 12:59:56 -0400 Subject: [PATCH 317/352] add some more checks for typical string matches for references to fixes and alike --- unittest/utils/test_utils.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/unittest/utils/test_utils.cpp b/unittest/utils/test_utils.cpp index 08922e648f..44cd865a21 100644 --- a/unittest/utils/test_utils.cpp +++ b/unittest/utils/test_utils.cpp @@ -478,6 +478,17 @@ TEST(Utils, strmatch_opt_char) { ASSERT_TRUE(utils::strmatch("rigid", "^r?igid")); ASSERT_TRUE(utils::strmatch("igid", "^r?igid")); + ASSERT_TRUE(utils::strmatch("c_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("f_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("v_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("i_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("d_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("i2_name","^[cfvid]2?_name")); + ASSERT_TRUE(utils::strmatch("d2_name","^[cfvid]2?_name")); + ASSERT_FALSE(utils::strmatch("d2name","^[cfvid]2?_name")); + ASSERT_FALSE(utils::strmatch("i1_name","^[cfvid]2?_name")); + ASSERT_FALSE(utils::strmatch("V_name","^[cfvid]2?_name")); + ASSERT_FALSE(utils::strmatch("x_name","^[cfvid]2?_name")); } TEST(Utils, strmatch_dot) From f9b32f0eef356e28bc7b19edc36e7834ad54d78c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 13:00:32 -0400 Subject: [PATCH 318/352] use ArgInfo class to process references to custom vectors and arrays --- src/set.cpp | 112 +++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 58 deletions(-) diff --git a/src/set.cpp b/src/set.cpp index 1aa9a479e6..2a36874c8b 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -14,6 +14,7 @@ #include "set.h" +#include "arg_info.h" #include "atom.h" #include "atom_vec.h" #include "atom_vec_body.h" @@ -570,69 +571,64 @@ void Set::command(int narg, char **arg) set(DPDTHETA); iarg += 2; - // custom per-atom vector + } else { - } else if (utils::strmatch(arg[iarg],"^i_")) { - if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); - if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); - else ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - int flag,cols; - index_custom = atom->find_custom(&arg[iarg][2],flag,cols); - if (index_custom < 0 || flag || cols) - error->all(FLERR,"Set command integer vector does not exist"); - set(IVEC); - iarg += 2; - - } else if (utils::strmatch(arg[iarg],"^d_")) { - if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); - if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); - else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - int flag,cols; - index_custom = atom->find_custom(&arg[iarg][2],flag,cols); - if (index_custom < 0 || flag || cols) - error->all(FLERR,"Set command floating point vector does not exist"); - set(DVEC); - iarg += 2; - - // custom per-atom array, must include bracketed index - // OLDSTYLE code - - } else if (strstr(arg[iarg],"i2_") == arg[iarg] || - strstr(arg[iarg],"d2_") == arg[iarg]) { - if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); - int which = 0; - if (arg[iarg][0] == 'd') which = 1; - if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); - else if (!which) ivalue = utils::inumeric(FLERR,arg[iarg+1],false,lmp); - else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); - - int n = strlen(arg[iarg]); - char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][3]); - - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in set command"); - icol_custom = atoi(ptr+1); - *ptr = '\0'; - } else error->all(FLERR,"Set command per-atom custom array is not indexed"); + // set custom per-atom vector or array or error out int flag,cols; - index_custom = atom->find_custom(suffix,flag,cols); - delete [] suffix; + ArgInfo argi(arg[iarg],ArgInfo::DNAME|ArgInfo::INAME); + const char *pname = argi.get_name(); + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + index_custom = atom->find_custom(argi.get_name(),flag,cols); + if (index_custom < 0) error->all(FLERR,"Custom property {} does not exist",pname); - if ((!which && (index_custom < 0 || flag || !cols)) || - (which && (index_custom < 0 || !flag || !cols))) - error->all(FLERR,"Set command per-atom custom array does not exist"); - if (icol_custom <= 0 || icol_custom > cols) - error->all(FLERR,"Set command per-atom custom array is accessed out-of-range"); + switch (argi.get_type()) { - if (!which) set(IARRAY); - else set(DARRAY); + 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,"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); + set(IVEC); + } else if (argi.get_dim() == 1) { + if (cols == 0) + error->all(FLERR,"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); + set(IARRAY); + } else error->all(FLERR,"Illegal set command"); + break; + + case ArgInfo::DNAME: + if (utils::strmatch(arg[iarg+1],"^v_")) varparse(arg[iarg+1],1); + else dvalue = utils::numeric(FLERR,arg[iarg+1],false,lmp); + if (flag != 1) error->all(FLERR,"Custom property {} is not floating-point",argi.get_name()); + + if (argi.get_dim() == 0) { + if (cols > 0) + error->all(FLERR,"Set command custom floating-point property is not a vector"); + set(DVEC); + } else if (argi.get_dim() == 1) { + if (cols == 0) + error->all(FLERR,"Set command custom floating-point property is not an array"); + 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"); + set(DARRAY); + } else error->all(FLERR,"Illegal set command"); + break; + + default: + error->all(FLERR,"Illegal set command"); + break; + } iarg += 2; - - } else error->all(FLERR,"Illegal set command"); + } // statistics // for CC option, include species index @@ -1007,7 +1003,7 @@ void Set::set(int keyword) (((imageint) (zbox + IMGMAX) & IMGMASK) << IMG2BITS); } - // set value for custom vector or array + // set value for custom property vector or array else if (keyword == IVEC) { atom->ivector[index_custom][i] = ivalue; From 4fed16fe8b526434d19c69691beaea865e5440cc Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 13:00:40 -0400 Subject: [PATCH 319/352] pretty --- src/fix_store_state.cpp | 49 ++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/src/fix_store_state.cpp b/src/fix_store_state.cpp index 0d54d2727e..1f302b4ca3 100644 --- a/src/fix_store_state.cpp +++ b/src/fix_store_state.cpp @@ -142,88 +142,71 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"q") == 0) { if (!atom->q_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_q; } else if (strcmp(arg[iarg],"mux") == 0) { if (!atom->mu_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_mux; } else if (strcmp(arg[iarg],"muy") == 0) { if (!atom->mu_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_muy; } else if (strcmp(arg[iarg],"muz") == 0) { if (!atom->mu_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_muz; } else if (strcmp(arg[iarg],"mu") == 0) { if (!atom->mu_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_mu; } else if (strcmp(arg[iarg],"radius") == 0) { if (!atom->radius_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_radius; } else if (strcmp(arg[iarg],"diameter") == 0) { if (!atom->radius_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_diameter; } else if (strcmp(arg[iarg],"omegax") == 0) { if (!atom->omega_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_omegax; } else if (strcmp(arg[iarg],"omegay") == 0) { if (!atom->omega_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_omegay; } else if (strcmp(arg[iarg],"omegaz") == 0) { if (!atom->omega_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_omegaz; } else if (strcmp(arg[iarg],"angmomx") == 0) { if (!atom->angmom_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_angmomx; } else if (strcmp(arg[iarg],"angmomy") == 0) { if (!atom->angmom_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_angmomy; } else if (strcmp(arg[iarg],"angmomz") == 0) { if (!atom->angmom_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_angmomz; } else if (strcmp(arg[iarg],"tqx") == 0) { if (!atom->torque_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_tqx; } else if (strcmp(arg[iarg],"tqy") == 0) { if (!atom->torque_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_tqy; } else if (strcmp(arg[iarg],"tqz") == 0) { if (!atom->torque_flag) - error->all(FLERR, - "Fix store/state for atom property that isn't allocated"); + error->all(FLERR,"Fix store/state for atom property that isn't allocated"); pack_choice[nvalues++] = &FixStoreState::pack_tqz; // compute or fix or variable or custom per-atom vector or array - // NEWSTYLE code } else { ArgInfo argi(arg[iarg],ArgInfo::COMPUTE|ArgInfo::FIX|ArgInfo::VARIABLE From e08c4abb4b3bfa5534b40d03ea0e97376be8f56e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 13:06:00 -0400 Subject: [PATCH 320/352] whitespace fixes --- doc/src/compute_property_atom.rst | 2 +- src/KOKKOS/atom_kokkos.cpp | 12 +++---- src/VTK/dump_vtk.cpp | 6 ++-- src/atom.cpp | 24 +++++++------- src/compute_property_atom.cpp | 14 ++++---- src/compute_property_atom.h | 2 +- src/dump_custom.cpp | 20 ++++++------ src/fix_group.cpp | 8 ++--- src/fix_property_atom.cpp | 22 ++++++------- src/fix_store_state.cpp | 6 ++-- src/library.cpp | 54 +++++++++++++++---------------- src/set.cpp | 4 +-- src/utils.cpp | 6 ++-- 13 files changed, 90 insertions(+), 90 deletions(-) diff --git a/doc/src/compute_property_atom.rst b/doc/src/compute_property_atom.rst index c4657ce82c..fee859d96e 100644 --- a/doc/src/compute_property_atom.rst +++ b/doc/src/compute_property_atom.rst @@ -136,7 +136,7 @@ When that command is used specific names are given to each attribute which are the "name" portion of these attributes. For arrays *i2_name* and *d2_name*, the column of the array must also be included following the name in brackets: e.g. d2_xyz[2], i2_mySpin[3]. - + The additional quantities only accessible via this command, and not directly via the :doc:`dump custom ` command, are as follows. diff --git a/src/KOKKOS/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 3304d638ce..f40b9c324a 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -272,7 +272,7 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), "atom:ivector"); memory->create(ivector[index],nmax,"atom:ivector"); - + } else if (flag == 1 && cols == 0) { index = ndvector; ndvector++; @@ -299,10 +299,10 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), "atom:iarray"); memory->create(iarray[index],nmax,cols,"atom:iarray"); - + icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); icols[index] = cols; - + } else if (flag == 1 && cols) { index = ndarray; ndarray++; @@ -318,7 +318,7 @@ int AtomKokkos::add_custom(const char *name, int flag, int cols) dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); dcols[index] = cols; } - + return index; } @@ -335,7 +335,7 @@ void AtomKokkos::remove_custom(int index, int flag, int cols) ivector[index] = NULL; delete [] ivname[index]; ivname[index] = NULL; - + } else if (flag == 1 && cols == 0) { dvector[index] = NULL; delete [] dvname[index]; @@ -346,7 +346,7 @@ void AtomKokkos::remove_custom(int index, int flag, int cols) iarray[index] = NULL; delete [] ianame[index]; ianame[index] = NULL; - + } else if (flag == 1 && cols) { memory->destroy(darray[index]); darray[index] = NULL; diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index 75092ff204..f94a6957fb 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -757,7 +757,7 @@ int DumpVTK::count() i = ATTRIBUTES + nfield + ithresh; iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols); int *ivector = atom->ivector[iwhich]; - for (i = 0; i < nlocal; i++) + for (i = 0; i < nlocal; i++) dchoose[i] = ivector[i]; ptr = dchoose; nstride = 1; @@ -775,7 +775,7 @@ int DumpVTK::count() iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols); int **iarray = atom->iarray[iwhich]; int icol = argindex[i] - 1; - for (i = 0; i < nlocal; i++) + for (i = 0; i < nlocal; i++) dchoose[i] = iarray[i][icol]; ptr = dchoose; nstride = 1; @@ -1827,7 +1827,7 @@ int DumpVTK::parse_fields(int narg, char **arg) field2index[ATTRIBUTES+i] = add_variable(argi.get_name()); name[ATTRIBUTES+i] = arg[iarg]; break; - + // custom per-atom integer vector = i_ID case ArgInfo::INAME: diff --git a/src/atom.cpp b/src/atom.cpp index 760aba5845..c1cb9e011b 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2481,7 +2481,7 @@ int Atom::add_custom(const char *name, int flag, int cols) ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), "atom:ivector"); memory->create(ivector[index],nmax,"atom:ivector"); - + } else if (flag == 1 && cols == 0) { index = ndvector; ndvector++; @@ -2501,10 +2501,10 @@ int Atom::add_custom(const char *name, int flag, int cols) iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), "atom:iarray"); memory->create(iarray[index],nmax,cols,"atom:iarray"); - + icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); icols[index] = cols; - + } else if (flag == 1 && cols) { index = ndarray; ndarray++; @@ -2518,7 +2518,7 @@ int Atom::add_custom(const char *name, int flag, int cols) dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); dcols[index] = cols; } - + return index; } @@ -2542,7 +2542,7 @@ void Atom::remove_custom(int index, int flag, int cols) ivector[index] = NULL; delete [] ivname[index]; ivname[index] = NULL; - + } else if (flag == 1 && cols == 0) { memory->destroy(dvector[index]); dvector[index] = NULL; @@ -2554,7 +2554,7 @@ void Atom::remove_custom(int index, int flag, int cols) iarray[index] = NULL; delete [] ianame[index]; ianame[index] = NULL; - + } else if (flag == 1 && cols) { memory->destroy(darray[index]); darray[index] = NULL; @@ -2762,7 +2762,7 @@ void *Atom::extract(const char *name) if (strcmp(name, "damage") == 0) return (void *) damage; // DPD-REACT pakage - + if (strcmp(name,"dpdTheta") == 0) return (void *) dpdTheta; // DPD-MESO package @@ -2790,15 +2790,15 @@ void *Atom::extract(const char *name) if (name[0] == 'd') which = 1; int array = 0; if (name[1] == '2') array = 1; - + int index,flag,cols; if (!array) index = find_custom(&name[2],flag,cols); else index = find_custom(&name[3],flag,cols); - + if (index < 0) return NULL; if (which != flag) return NULL; if ((!array && cols) || (array && !cols)) return NULL; - + if (!which && !array) return (void *) ivector[index]; if (which && !array) return (void *) dvector[index]; if (!which && array) return (void *) iarray[index]; @@ -2906,14 +2906,14 @@ int Atom::extract_datatype(const char *name) // custom vectors and arrays // OLDSTYLE code - + if (strstr(name,"i_") == name || strstr(name,"d_") == name || strstr(name,"i2_") == name || strstr(name,"d2_") == name) { int which = 0; if (name[0] == 'd') which = 1; int array = 0; if (name[1] == '2') array = 1; - + int index,flag,cols; if (!array) index = find_custom(&name[2],flag,cols); else index = find_custom(&name[3],flag,cols); diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index a7eb4bf144..e8e1293e28 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -147,8 +147,8 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : pack_choice[i] = &ComputePropertyAtom::pack_mu; // pack magnetic variables - - } else if (strcmp(arg[iarg],"spx") == 0) { + + } else if (strcmp(arg[iarg],"spx") == 0) { if (!atom->sp_flag) error->all(FLERR,"Compute property/atom for " "atom property that isn't allocated"); @@ -185,7 +185,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : pack_choice[i] = &ComputePropertyAtom::pack_fmz; // bond count - + } else if (strcmp(arg[iarg],"nbonds") == 0) { if (!atom->molecule_flag) error->all(FLERR,"Compute property/atom for " @@ -193,7 +193,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : pack_choice[i] = &ComputePropertyAtom::pack_nbonds; // finite-size particles - + } else if (strcmp(arg[iarg],"radius") == 0) { if (!atom->radius_flag) error->all(FLERR,"Compute property/atom for " @@ -401,11 +401,11 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : // custom per-atom arrays, must include bracketed index // OLDSTYLE code - } else if (strstr(arg[iarg],"i2_") == arg[iarg] || + } else if (strstr(arg[iarg],"i2_") == arg[iarg] || strstr(arg[iarg],"d2_") == arg[iarg]) { int which = 0; if (arg[iarg][0] == 'd') which = 1; - + int n = strlen(arg[iarg]); char *suffix = new char[n]; strcpy(suffix,&arg[iarg][3]); @@ -418,7 +418,7 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : colindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); *ptr = '\0'; } else error->all(FLERR,"Compute property/atom custom array is not indexed"); - + int flag,cols; index[i] = atom->find_custom(suffix,flag,cols); delete [] suffix; diff --git a/src/compute_property_atom.h b/src/compute_property_atom.h index 19f8b73451..d8b1cae449 100644 --- a/src/compute_property_atom.h +++ b/src/compute_property_atom.h @@ -109,7 +109,7 @@ class ComputePropertyAtom : public Compute { void pack_tqx(int); void pack_tqy(int); void pack_tqz(int); - + void pack_end1x(int); void pack_end1y(int); void pack_end1z(int); diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 68a2ab4a57..3aac7a3e79 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1046,7 +1046,7 @@ int DumpCustom::count() int iwhich = custom[field2index[i]]; ptr = atom->dvector[iwhich]; nstride = 1; - + } else if (thresh_array[ithresh] == IARRAY) { i = nfield + ithresh; int iwhich = custom[field2index[i]]; @@ -1977,12 +1977,12 @@ int DumpCustom::modify_param(int narg, char **arg) "Dump custom property array is accessed out-of-range"); thresh_array[nthresh] = DARRAY; } - + field2index[nfield+nthresh] = add_custom(name,0); break; // custom per atom integer vector or array - + case ArgInfo::INAME: n = atom->find_custom(name,flag,cols); @@ -2015,7 +2015,7 @@ int DumpCustom::modify_param(int narg, char **arg) } // set operation type of threshold - + if (strcmp(arg[2],"<") == 0) thresh_op[nthresh] = LT; else if (strcmp(arg[2],"<=") == 0) thresh_op[nthresh] = LE; else if (strcmp(arg[2],">") == 0) thresh_op[nthresh] = GT; @@ -2024,11 +2024,11 @@ int DumpCustom::modify_param(int narg, char **arg) else if (strcmp(arg[2],"!=") == 0) thresh_op[nthresh] = NEQ; else if (strcmp(arg[2],"|^") == 0) thresh_op[nthresh] = XOR; else error->all(FLERR,"Invalid dump_modify thresh operator"); - + // set threshold value as number or special LAST keyword // create FixStore to hold LAST values, should work with restart // id = dump-ID + nthreshlast + DUMP_STORE, fix group = dump group - + if (strcmp(arg[3],"LAST") != 0) { thresh_value[nthresh] = utils::numeric(FLERR,arg[3],false,lmp); thresh_last[nthresh] = -1; @@ -2038,17 +2038,17 @@ int DumpCustom::modify_param(int narg, char **arg) thresh_fixID = (char **) memory->srealloc(thresh_fixID,(nthreshlast+1)*sizeof(char *),"dump:thresh_fixID"); memory->grow(thresh_first,(nthreshlast+1),"dump:thresh_first"); - + std::string threshid = fmt::format("{}{}_DUMP_STORE",id,nthreshlast); thresh_fixID[nthreshlast] = utils::strdup(threshid); threshid += fmt::format(" {} STORE peratom 1 1", group->names[igroup]); thresh_fix[nthreshlast] = (FixStore *) modify->add_fix(threshid); - + thresh_last[nthreshlast] = nthreshlast; thresh_first[nthreshlast] = 1; nthreshlast++; } - + nthresh++; return 4; } @@ -2135,7 +2135,7 @@ void DumpCustom::pack_custom(int n) int flag = custom_flag[field2index[n]]; int iwhich = custom[field2index[n]]; int index = argindex[n]; - + if (flag == IVEC) { int *ivector = atom->ivector[iwhich]; for (int i = 0; i < nchoose; i++) { diff --git a/src/fix_group.cpp b/src/fix_group.cpp index 03a046d3bf..c15f2590c5 100644 --- a/src/fix_group.cpp +++ b/src/fix_group.cpp @@ -61,7 +61,7 @@ idregion(nullptr), idvar(nullptr), idprop(nullptr) delete [] idregion; idregion = utils::strdup(arg[iarg+1]); iarg += 2; - + } else if (strcmp(arg[iarg],"var") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); if (input->variable->find(arg[iarg+1]) < 0) @@ -70,19 +70,19 @@ idregion(nullptr), idvar(nullptr), idprop(nullptr) delete [] idvar; idvar = utils::strdup(arg[iarg+1]); iarg += 2; - + } else if (strcmp(arg[iarg],"property") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); int flag,cols; iprop = atom->find_custom(arg[iarg+1],flag,cols); - if (iprop < 1 || cols) + if (iprop < 1 || cols) error->all(FLERR,"Custom per-atom vector for group dynamic " "does not exist"); propflag = 1; delete [] idprop; idprop = utils::strdup(arg[iarg+1]); iarg += 2; - + } else if (strcmp(arg[iarg],"every") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal group command"); nevery = utils::inumeric(FLERR,arg[iarg+1],false,lmp); diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 0ca8a75632..7ec30025bc 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -50,7 +50,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : nvalue = 0; values_peratom = 0; - + while (iarg < narg) { if (strcmp(arg[iarg],"mol") == 0) { if (atom->molecule_flag) @@ -114,7 +114,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : // custom atom array // OLDSTYLE code - } else if (strstr(arg[iarg],"i2_") == arg[iarg] || + } else if (strstr(arg[iarg],"i2_") == arg[iarg] || strstr(arg[iarg],"d2_") == arg[iarg]) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix property/atom command"); int which = 0; @@ -539,7 +539,7 @@ void FixPropertyAtom::grow_arrays(int nmax) void FixPropertyAtom::copy_arrays(int i, int j, int /*delflag*/) { int k,ncol; - + for (int nv = 0; nv < nvalue; nv++) { if (style[nv] == MOLECULE) atom->molecule[j] = atom->molecule[i]; @@ -697,15 +697,15 @@ int FixPropertyAtom::pack_exchange(int i, double *buf) else if (style[nv] == DVEC) buf[m++] = atom->dvector[index[nv]][i]; else if (style[nv] == IARRAY) { ncol = cols[nv]; - for (k = 0; k < ncol; k++) + for (k = 0; k < ncol; k++) buf[m++] = ubuf(atom->iarray[index[nv]][i][k]).d; } else if (style[nv] == DARRAY) { ncol = cols[nv]; - for (k = 0; k < ncol; k++) + for (k = 0; k < ncol; k++) buf[m++] = atom->darray[index[nv]][i][k]; } } - + return m; } @@ -731,15 +731,15 @@ int FixPropertyAtom::unpack_exchange(int nlocal, double *buf) atom->dvector[index[nv]][nlocal] = buf[m++]; else if (style[nv] == IARRAY) { ncol = cols[nv]; - for (k = 0; k < ncol; k++) + for (k = 0; k < ncol; k++) atom->iarray[index[nv]][nlocal][k] = (int) ubuf(buf[m++]).i; } else if (style[nv] == DARRAY) { ncol = cols[nv]; - for (k = 0; k < ncol; k++) + for (k = 0; k < ncol; k++) atom->darray[index[nv]][nlocal][k] = buf[m++]; } } - + return m; } @@ -750,9 +750,9 @@ int FixPropertyAtom::unpack_exchange(int nlocal, double *buf) int FixPropertyAtom::pack_restart(int i, double *buf) { int k,ncol; - + // pack buf[0] this way because other fixes unpack it - + buf[0] = values_peratom+1; int m = 1; diff --git a/src/fix_store_state.cpp b/src/fix_store_state.cpp index 1f302b4ca3..1d3d48a06b 100644 --- a/src/fix_store_state.cpp +++ b/src/fix_store_state.cpp @@ -293,7 +293,7 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : } else if (which[i] == ArgInfo::DNAME) { int icustom,iflag,icol; icustom = atom->find_custom(ids[i],iflag,icol); - if (icustom < 0) + if (icustom < 0) error->all(FLERR,"Custom vector/array for fix store/state does not exist"); if (argindex[i] == 0) { if (!iflag || icol) @@ -311,7 +311,7 @@ FixStoreState::FixStoreState(LAMMPS *lmp, int narg, char **arg) : } else if (which[i] == ArgInfo::INAME) { int icustom,iflag,icol; icustom = atom->find_custom(ids[i],iflag,icol); - if (icustom < 0) + if (icustom < 0) error->all(FLERR,"Custom vector/array for fix store/state does not exist"); if (argindex[i] == 0) { if (iflag || icol) @@ -417,7 +417,7 @@ void FixStoreState::init() } else if (which[m] == ArgInfo::INAME || which[m] == ArgInfo::DNAME) { int icustom,iflag,cols; icustom = atom->find_custom(ids[m],iflag,cols); - if (icustom < 0) + if (icustom < 0) error->all(FLERR,"Custom vector/array for fix store/state does not exist"); value2index[m] = icustom; } diff --git a/src/library.cpp b/src/library.cpp index b6cdd02e9f..1397cf889e 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2834,7 +2834,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) int i,j,offset,fcid,ltype,icol; // error if tags are not defined or not consecutive - + int flag = 0; if (lmp->atom->tag_enable == 0 || lmp->atom->tag_consecutive() == 0) flag = 1; @@ -2849,7 +2849,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) void *vptr = lmp->atom->extract(name); // fix - + if (vptr==nullptr && utils::strmatch(name,"^f_")) { fcid = lmp->modify->find_fix(&name[2]); @@ -2884,7 +2884,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) } // compute - + if (vptr==nullptr && utils::strmatch(name,"^c_")) { fcid = lmp->modify->find_compute(&name[2]); @@ -2913,7 +2913,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) if (count==1) vptr = (void *) lmp->modify->compute[fcid]->vector_atom; else vptr = (void *) lmp->modify->compute[fcid]->array_atom; } - + // custom fix property/atom vector or array // OLDSTYLE code @@ -2930,7 +2930,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) lmp->error->warning(FLERR,"lammps_gather: unknown property/atom id"); return; } - + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather: mismatch property/atom type"); @@ -2950,7 +2950,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; else vptr = (void *) lmp->atom->dvector[fcid]; - } else { + } else { if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; else vptr = (void *) lmp->atom->darray[fcid]; } @@ -2963,11 +2963,11 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) lmp->error->warning(FLERR,"lammps_gather: undefined property name"); return; } - + // copy = Natom length vector of per-atom values // use atom ID to insert each atom's values into copy // MPI_Allreduce with MPI_SUM to merge into data, ordered by atom ID - + if (type==0) { int *vector = nullptr; int **array = nullptr; @@ -3078,7 +3078,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d int i,offset,fcid,ltype,icol; // error if tags are not defined or not consecutive - + int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; @@ -3126,7 +3126,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d } // compute - + if (vptr==nullptr && utils::strmatch(name,"^c_")) { fcid = lmp->modify->find_compute(&name[2]); @@ -3162,7 +3162,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if ((vptr==nullptr) && ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { - + if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); @@ -3173,7 +3173,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d "unknown property/atom id"); return; } - + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_concat: " @@ -3221,7 +3221,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (type == 0) { int *vector = nullptr; int **array = nullptr; - + const int imgunpack = (count == 3) && (strcmp(name,"image") == 0); if ((count == 1) || imgunpack) vector = (int *) vptr; @@ -3345,7 +3345,7 @@ void lammps_gather_subset(void *handle, char *name, tagint id; // error if tags are not defined or not consecutive - + int flag = 0; if (lmp->atom->tag_enable == 0) flag = 1; if (lmp->atom->natoms > MAXSMALLINT) flag = 1; @@ -3358,7 +3358,7 @@ void lammps_gather_subset(void *handle, char *name, void *vptr = lmp->atom->extract(name); // fix - + if (vptr==nullptr && utils::strmatch(name,"^f_")) { fcid = lmp->modify->find_fix(&name[2]); @@ -3391,7 +3391,7 @@ void lammps_gather_subset(void *handle, char *name, } // compute - + if (vptr==nullptr && utils::strmatch(name,"^c_")) { fcid = lmp->modify->find_compute(&name[2]); @@ -3438,7 +3438,7 @@ void lammps_gather_subset(void *handle, char *name, "unknown property/atom id"); return; } - + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_gather_subset: " @@ -3529,7 +3529,7 @@ void lammps_gather_subset(void *handle, char *name, } else { double *vector = nullptr; double **array = nullptr; - + if (count == 1) vector = (double *) vptr; else array = (double **) vptr; @@ -3619,7 +3619,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) void *vptr = lmp->atom->extract(name); // fix - + if (vptr==nullptr && utils::strmatch(name,"^f_")) { fcid = lmp->modify->find_fix(&name[2]); @@ -3647,7 +3647,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) } // compute - + if (vptr==nullptr && utils::strmatch(name,"^c_")) { fcid = lmp->modify->find_compute(&name[2]); @@ -3679,7 +3679,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) // custom fix property/atom vector or array // OLDSTYLE code - + if ((vptr == nullptr) && ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { @@ -3693,7 +3693,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) lmp->error->warning(FLERR,"lammps_scatter: unknown property/atom id"); return; } - + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter: mismatch property/atom type"); @@ -3713,7 +3713,7 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; else vptr = (void *) lmp->atom->dvector[fcid]; - } else { + } else { if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; else vptr = (void *) lmp->atom->darray[fcid]; } @@ -3843,7 +3843,7 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, void *vptr = lmp->atom->extract(name); // fix - + if (vptr==nullptr && utils::strmatch(name,"^f_")) { fcid = lmp->modify->find_fix(&name[2]); @@ -3903,7 +3903,7 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, // custom fix property/atom vector or array // OLDSTYLE code - + if ((vptr == nullptr) && ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { @@ -3918,7 +3918,7 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, "unknown property/atom id"); return; } - + if (ltype != type) { if (lmp->comm->me == 0) lmp->error->warning(FLERR,"lammps_scatter_subset: " @@ -3939,7 +3939,7 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, if (count == 1) { if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; else vptr = (void *) lmp->atom->dvector[fcid]; - } else { + } else { if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; else vptr = (void *) lmp->atom->darray[fcid]; } diff --git a/src/set.cpp b/src/set.cpp index 2a36874c8b..2966106345 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -581,7 +581,7 @@ void Set::command(int narg, char **arg) if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); index_custom = atom->find_custom(argi.get_name(),flag,cols); if (index_custom < 0) error->all(FLERR,"Custom property {} does not exist",pname); - + switch (argi.get_type()) { case ArgInfo::INAME: @@ -1025,7 +1025,7 @@ void Set::set(int keyword) } // update bonus data numbers - + if (keyword == SHAPE) { bigint nlocal_bonus = avec_ellipsoid->nlocal_bonus; MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1, diff --git a/src/utils.cpp b/src/utils.cpp index fd3170859b..5be2b37c34 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -633,15 +633,15 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod expandflag = 1; } } - + } else if (arg[iarg][0] == 'd') { *ptr1 = '\0'; int flag,cols; int icustom = lmp->atom->find_custom(&arg[iarg][3],flag,cols); *ptr1 = '['; - + // check for custom per-atom floating point array - + if (icustom >= 0) { if (mode == 1 && flag && cols) { nmax = cols; From 1e37d1ad7ff2a9beb8d9247072b2577d988315b4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 14:34:03 -0400 Subject: [PATCH 321/352] pretty --- src/atom.cpp | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index c1cb9e011b..a0f7099319 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2472,47 +2472,39 @@ int Atom::add_custom(const char *name, int flag, int cols) { int index; - if (flag == 0 && cols == 0) { + if ((flag == 0) && (cols == 0)) { index = nivector; nivector++; - ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *), - "atom:ivname"); + ivname = (char **) memory->srealloc(ivname,nivector*sizeof(char *),"atom:ivname"); ivname[index] = utils::strdup(name); - ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *), - "atom:ivector"); + ivector = (int **) memory->srealloc(ivector,nivector*sizeof(int *),"atom:ivector"); memory->create(ivector[index],nmax,"atom:ivector"); - } else if (flag == 1 && cols == 0) { + } else if ((flag == 1) && (cols == 0)) { index = ndvector; ndvector++; - dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *), - "atom:dvname"); + dvname = (char **) memory->srealloc(dvname,ndvector*sizeof(char *),"atom:dvname"); dvname[index] = utils::strdup(name); - dvector = (double **) memory->srealloc(dvector,ndvector*sizeof(double *), - "atom:dvector"); + dvector = (double **) memory->srealloc(dvector,ndvector*sizeof(double *),"atom:dvector"); memory->create(dvector[index],nmax,"atom:dvector"); - } else if (flag == 0 && cols) { + } else if ((flag == 0) && (cols > 0)) { index = niarray; niarray++; - ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *), - "atom:ianame"); + ianame = (char **) memory->srealloc(ianame,niarray*sizeof(char *),"atom:ianame"); ianame[index] = utils::strdup(name); - iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **), - "atom:iarray"); + iarray = (int ***) memory->srealloc(iarray,niarray*sizeof(int **),"atom:iarray"); memory->create(iarray[index],nmax,cols,"atom:iarray"); icols = (int *) memory->srealloc(icols,niarray*sizeof(int),"atom:icols"); icols[index] = cols; - } else if (flag == 1 && cols) { + } else if ((flag == 1) && (cols > 0)) { index = ndarray; ndarray++; - daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *), - "atom:daname"); + daname = (char **) memory->srealloc(daname,ndarray*sizeof(char *),"atom:daname"); daname[index] = utils::strdup(name); - darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **), - "atom:darray"); + darray = (double ***) memory->srealloc(darray,ndarray*sizeof(double **),"atom:darray"); memory->create(darray[index],nmax,cols,"atom:darray"); dcols = (int *) memory->srealloc(dcols,ndarray*sizeof(int),"atom:dcols"); From 0a99d338f21b6cebee425a60feae9fc3427ab559 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 14:35:02 -0400 Subject: [PATCH 322/352] update argument parsing --- src/fix_property_atom.cpp | 45 ++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 7ec30025bc..2d122e9b03 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -112,24 +112,29 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : iarg++; // custom atom array - // OLDSTYLE code - } else if (strstr(arg[iarg],"i2_") == arg[iarg] || - strstr(arg[iarg],"d2_") == arg[iarg]) { + } else if (utils::strmatch(arg[iarg],"^[id]2_")) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix property/atom command"); - int which = 0; - if (arg[iarg][0] == 'd') which = 1; - if (which == 0) style[nvalue] = IARRAY; - else style[nvalue] = DARRAY; - int flag,ncols; - index[nvalue] = atom->find_custom(&arg[iarg][3],flag,ncols); - if (index[nvalue] >= 0) - error->all(FLERR,"Fix property/atom array name already exists"); - cols[nvalue] = utils::inumeric(FLERR,arg[iarg+1],true,lmp); - if (cols[nvalue] < 1) - error->all(FLERR,"Invalid array columns in fix property/atom"); - index[nvalue] = atom->add_custom(&arg[iarg][3],which,cols[nvalue]); - values_peratom += cols[nvalue]; + + int which,flag,ncols; + which = atom->find_custom(&arg[iarg][3],flag,ncols); + if (which >= 0) + error->all(FLERR,"Fix property/atom array name {} already exists", &arg[iarg][3]); + + ncols = utils::inumeric(FLERR,arg[iarg+1],true,lmp); + if (ncols < 1) + error->all(FLERR,"Invalid array columns number {} in fix property/atom", ncols); + + if (arg[iarg][0] == 'i') { + which = 0; + style[nvalue] = IARRAY; + } else { + which = 1; + style[nvalue] = DARRAY; + } + index[nvalue] = atom->add_custom(&arg[iarg][3],which,ncols); + cols[nvalue] = ncols; + values_peratom += ncols; nvalue++; iarg += 2; @@ -386,15 +391,15 @@ void FixPropertyAtom::write_data_section_pack(int /*mth*/, double **buf) int **iarray = atom->iarray[index[nv]]; ncol = cols[nv]; for (i = 0; i < nlocal; i++) - for (k = 0; k < ncol; k++) - buf[i][icol+k] = ubuf(iarray[i][k]).d; + for (k = 0; k < ncol; k++) + buf[i][icol+k] = ubuf(iarray[i][k]).d; icol += ncol; } else if (style[nv] == DARRAY) { double **darray = atom->darray[index[nv]]; ncol = cols[nv]; for (i = 0; i < nlocal; i++) - for (k = 0; k < ncol; k++) - buf[i][icol+k] = ubuf(darray[i][k]).d; + for (k = 0; k < ncol; k++) + buf[i][icol+k] = darray[i][k]; icol += ncol; } } From de61b3a547fa0267841e0548877339d26359b7a9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 14:35:27 -0400 Subject: [PATCH 323/352] update utils::expand_args --- src/utils.cpp | 79 ++++++++++++++++----------------------------------- 1 file changed, 24 insertions(+), 55 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 5be2b37c34..66d5bf2af2 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -214,7 +214,7 @@ char *utils::fgets_trunc(char *buf, int size, FILE *fp) void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp, const char *filename, Error *error) { - constexpr int MAXPATHLENBUF=1024; + constexpr int MAXPATHLENBUF = 1024; char *rv = fgets(s, size, fp); if (rv == nullptr) { // something went wrong char buf[MAXPATHLENBUF]; @@ -243,7 +243,7 @@ void utils::sfgets(const char *srcname, int srcline, char *s, int size, FILE *fp void utils::sfread(const char *srcname, int srcline, void *s, size_t size, size_t num, FILE *fp, const char *filename, Error *error) { - constexpr int MAXPATHLENBUF=1024; + constexpr int MAXPATHLENBUF = 1024; size_t rv = fread(s, size, num, fp); if (rv != num) { // something went wrong char buf[MAXPATHLENBUF]; @@ -543,16 +543,21 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod std::string word(arg[iarg]); expandflag = 0; - // only match compute/fix reference with a '*' wildcard + // match compute, fix, or custom property array reference with a '*' wildcard // number range in the first pair of square brackets - if (strmatch(word, "^[cf]_\\w+\\[\\d*\\*\\d*\\]")) { + if (strmatch(word, "^[cf]_\\w+\\[\\d*\\*\\d*\\]") || + strmatch(word, "^[id]2_\\w+\\[\\d*\\*\\d*\\]")) { - // split off the compute/fix ID, the wildcard and trailing text + // split off the compute/fix/property ID, the wildcard and trailing text size_t first = word.find("["); size_t second = word.find("]", first + 1); - id = word.substr(2, first - 2); + if (word[1] == '2') + id = word.substr(3, first - 3); + else + id = word.substr(2, first - 2); + wc = word.substr(first + 1, second - first - 1); tail = word.substr(second + 1); @@ -580,7 +585,7 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } } - // fix + // fix } else if (word[0] == 'f') { int ifix = lmp->modify->find_fix(id); @@ -609,59 +614,20 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod // only match custom array reference with a '*' wildcard // number range in the first pair of square brackets - // OLDSTYLE code - if (strncmp(arg[iarg],"i2_",3) == 0 || strncmp(arg[iarg],"d2_",3) == 0) { - char *ptr1 = strchr(arg[iarg],'['); - if (ptr1) { - char *ptr2 = strchr(ptr1,']'); - if (ptr2) { - *ptr2 = '\0'; - if (strchr(ptr1,'*')) { + if ((word[0] == 'i') || (word[0] == 'd')) { + int flag, cols; + int icustom = lmp->atom->find_custom(id.c_str(), flag, cols); - if (arg[iarg][0] == 'i') { - *ptr1 = '\0'; - int flag,cols; - int icustom = lmp->atom->find_custom(&arg[iarg][3],flag,cols); - *ptr1 = '['; + if ((icustom >= 0) && (mode == 1) && (cols > 0)) { - // check for custom per-atom integer array + // check for custom per-atom array - if (icustom >= 0) { - if (mode == 1 && !flag && cols) { - nmax = cols; - expandflag = 1; - } - } - - } else if (arg[iarg][0] == 'd') { - *ptr1 = '\0'; - int flag,cols; - int icustom = lmp->atom->find_custom(&arg[iarg][3],flag,cols); - *ptr1 = '['; - - // check for custom per-atom floating point array - - if (icustom >= 0) { - if (mode == 1 && flag && cols) { - nmax = cols; - expandflag = 1; - } - } - } - } + if (((word[0] == 'i') && (flag == 0)) || ((word[0] == 'i') && (flag == 1))) { + nmax = cols; + expandflag = 1; } } - - // split off the array name ID, the wildcard and trailing text - - if (expandflag) { - size_t first = word.find("["); - size_t second = word.find("]", first + 1); - id = word.substr(2, first - 2); - wc = word.substr(first + 1, second - first - 1); - tail = word.substr(second + 1); - } } // expansion will take place @@ -678,7 +644,10 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod for (int index = nlo; index <= nhi; index++) { // assemble and duplicate expanded string - earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); + if (word[1] == '2') + earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); + else + earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); newarg++; } From cf25a586bd961c396f1e6c24e71b7bf3dbdd89c1 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 18 Aug 2021 13:07:49 -0600 Subject: [PATCH 324/352] debugging merged version --- doc/src/dump.rst | 33 +++++++++++++++++++-------------- src/dump_custom.cpp | 2 ++ src/utils.cpp | 6 +++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 1b81e23e28..998498d1d4 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -569,10 +569,11 @@ Nprocs-1) that currently owns the atom. *Procp1* is the proc ID+1, which can be convenient in place of a *type* attribute (1 to Ntypes) for coloring atoms in a visualization program. *Type* is the atom type (1 to Ntypes). *Element* is typically the chemical name of an -element, which you must assign to each type via the :doc:`dump_modify element ` command. More generally, it can be any -string you wish to associated with an atom type. *Mass* is the atom -mass. *Vx*, *vy*, *vz*, *fx*, *fy*, *fz*, and *q* are components of -atom velocity and force and atomic charge. +element, which you must assign to each type via the :doc:`dump_modify +element ` command. More generally, it can be any string +you wish to associated with an atom type. *Mass* is the atom mass. +*Vx*, *vy*, *vz*, *fx*, *fy*, *fz*, and *q* are components of atom +velocity and force and atomic charge. There are several options for outputting atom coordinates. The *x*, *y*, *z* attributes write atom coordinates "unscaled", in the @@ -646,11 +647,12 @@ above for how I can be specified with a wildcard asterisk to effectively specify multiple values. The *f_ID* and *f_ID[I]* attributes allow vector or array per-atom -quantities calculated by a :doc:`fix ` to be output. The ID in the -attribute should be replaced by the actual ID of the fix that has been -defined previously in the input script. The :doc:`fix ave/atom ` command is one that calculates per-atom -quantities. Since it can time-average per-atom quantities produced by -any :doc:`compute `, :doc:`fix `, or atom-style +quantities calculated by a :doc:`fix ` to be output. The ID in +the attribute should be replaced by the actual ID of the fix that has +been defined previously in the input script. The :doc:`fix ave/atom +` command is one that calculates per-atom quantities. +Since it can time-average per-atom quantities produced by any +:doc:`compute `, :doc:`fix `, or atom-style :doc:`variable `, this allows those time-averaged results to be written to a dump file. @@ -667,10 +669,10 @@ should be replaced by the actual name of the variable that has been defined previously in the input script. Only an atom-style variable can be referenced, since it is the only style that generates per-atom values. Variables of style *atom* can reference individual atom -attributes, per-atom attributes, thermodynamic keywords, or -invoke other computes, fixes, or variables when they are evaluated, so -this is a very general means of creating quantities to output to a -dump file. +attributes, per-atom attributes, thermodynamic keywords, or invoke +other computes, fixes, or variables when they are evaluated, so this +is a very general means of creating quantities to output to a dump +file. The *i_name*, *d_name*, *i2_name*, *d2_name* attributes refer to per-atom integer and floating-point vectors or arrays that have been @@ -678,7 +680,10 @@ added via the :doc:`fix property/atom ` command. When that command is used specific names are given to each attribute which are the "name" portion of these keywords. For arrays *i2_name* and *d2_name*, the column of the array must also be included following -the name in brackets: e.g. d2_xyz[2], i2_mySpin[3]. +the name in brackets: e.g. d2_xyz[I], i2_mySpin[I], where I is in the +range from 1-M, where M is the number of columns in the custom array. +See the discussion above for how I can be specified with a wildcard +asterisk to effectively specify multiple values. See the :doc:`Modify ` page for information on how to add new compute and fix styles to LAMMPS to calculate per-atom quantities diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 68a2ab4a57..e7ad930019 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1554,6 +1554,8 @@ int DumpCustom::parse_fields(int narg, char **arg) n = atom->find_custom(name,flag,cols); + printf("NAME %s\n",name); + if (n < 0) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[iarg] == 0) { diff --git a/src/utils.cpp b/src/utils.cpp index fd3170859b..d63cd1d1c4 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -693,9 +693,9 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } } - //printf("NEWARG %d\n",newarg); - //for (int i = 0; i < newarg; i++) - // printf(" arg %d: %s\n",i,earg[i]); + printf("NEWARG %d\n",newarg); + for (int i = 0; i < newarg; i++) + printf(" arg %d: %s\n",i,earg[i]); return newarg; } From 104fa4624ec4cfa4dc9357ce976009d20e670b63 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 18:04:44 -0400 Subject: [PATCH 325/352] correct utils::expand_args() --- src/utils.cpp | 70 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 66d5bf2af2..949d6d7793 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -609,56 +609,54 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod expandflag = 1; } } - } - } - // only match custom array reference with a '*' wildcard - // number range in the first pair of square brackets + // only match custom array reference with a '*' wildcard + // number range in the first pair of square brackets - if ((word[0] == 'i') || (word[0] == 'd')) { - int flag, cols; - int icustom = lmp->atom->find_custom(id.c_str(), flag, cols); + } else if ((word[0] == 'i') || (word[0] == 'd')) { + int flag, cols; + int icustom = lmp->atom->find_custom(id.c_str(), flag, cols); - if ((icustom >= 0) && (mode == 1) && (cols > 0)) { + if ((icustom >= 0) && (mode == 1) && (cols > 0)) { - // check for custom per-atom array + // check for custom per-atom array - if (((word[0] == 'i') && (flag == 0)) || ((word[0] == 'i') && (flag == 1))) { - nmax = cols; - expandflag = 1; + if (((word[0] == 'i') && (flag == 0)) || ((word[0] == 'd') && (flag == 1))) { + nmax = cols; + expandflag = 1; + } } } - } - // expansion will take place + // expansion will take place - if (expandflag) { + if (expandflag) { - // expand wild card string to nlo/nhi numbers - utils::bounds(file, line, wc, 1, nmax, nlo, nhi, lmp->error); + // expand wild card string to nlo/nhi numbers + utils::bounds(file, line, wc, 1, nmax, nlo, nhi, lmp->error); - if (newarg + nhi - nlo + 1 > maxarg) { - maxarg += nhi - nlo + 1; - earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); - } + if (newarg + nhi - nlo + 1 > maxarg) { + maxarg += nhi - nlo + 1; + earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); + } - for (int index = nlo; index <= nhi; index++) { - // assemble and duplicate expanded string - if (word[1] == '2') - earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); - else - earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); + for (int index = nlo; index <= nhi; index++) { + // assemble and duplicate expanded string + if (word[1] == '2') + earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); + else + earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); + newarg++; + } + } else { + // no expansion: duplicate original string + if (newarg == maxarg) { + maxarg++; + earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); + } + earg[newarg] = utils::strdup(word); newarg++; } - - } else { - // no expansion: duplicate original string - if (newarg == maxarg) { - maxarg++; - earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); - } - earg[newarg] = utils::strdup(word); - newarg++; } } From f6874af7e5cd21b2958bba3219a26e69334765fe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 18:05:36 -0400 Subject: [PATCH 326/352] pretty --- src/VTK/dump_vtk.cpp | 4 +- src/compute_property_atom.cpp | 141 ++++++++++++---------------------- src/modify.cpp | 15 ++-- 3 files changed, 54 insertions(+), 106 deletions(-) diff --git a/src/VTK/dump_vtk.cpp b/src/VTK/dump_vtk.cpp index f94a6957fb..f323ce820f 100644 --- a/src/VTK/dump_vtk.cpp +++ b/src/VTK/dump_vtk.cpp @@ -785,8 +785,8 @@ int DumpVTK::count() i = ATTRIBUTES + nfield + ithresh; iwhich = atom->find_custom(id_custom[field2index[i]],flag,cols) double **darray = atom->darray[iwhich]; - ptr = &darray[0][argindex[i]-1]; - nstride = atom->dcols[iwhich]; + ptr = &darray[0][argindex[i]-1]; + nstride = atom->dcols[iwhich]; } // unselect atoms that don't meet threshold criterion diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index e8e1293e28..190168db4b 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -122,262 +122,215 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"q") == 0) { if (!atom->q_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_q; } else if (strcmp(arg[iarg],"mux") == 0) { if (!atom->mu_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_mux; } else if (strcmp(arg[iarg],"muy") == 0) { if (!atom->mu_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_muy; } else if (strcmp(arg[iarg],"muz") == 0) { if (!atom->mu_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_muz; } else if (strcmp(arg[iarg],"mu") == 0) { if (!atom->mu_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_mu; // pack magnetic variables } else if (strcmp(arg[iarg],"spx") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_spx; } else if (strcmp(arg[iarg],"spy") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_spy; } else if (strcmp(arg[iarg],"spz") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_spz; } else if (strcmp(arg[iarg],"sp") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_sp; } else if (strcmp(arg[iarg],"fmx") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_fmx; } else if (strcmp(arg[iarg],"fmy") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_fmy; } else if (strcmp(arg[iarg],"fmz") == 0) { if (!atom->sp_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_fmz; // bond count } else if (strcmp(arg[iarg],"nbonds") == 0) { if (!atom->molecule_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_nbonds; // finite-size particles } else if (strcmp(arg[iarg],"radius") == 0) { if (!atom->radius_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_radius; } else if (strcmp(arg[iarg],"diameter") == 0) { if (!atom->radius_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_diameter; } else if (strcmp(arg[iarg],"omegax") == 0) { if (!atom->omega_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_omegax; } else if (strcmp(arg[iarg],"omegay") == 0) { if (!atom->omega_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_omegay; } else if (strcmp(arg[iarg],"omegaz") == 0) { if (!atom->omega_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_omegaz; } else if (strcmp(arg[iarg],"angmomx") == 0) { if (!atom->angmom_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_angmomx; } else if (strcmp(arg[iarg],"angmomy") == 0) { if (!atom->angmom_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_angmomy; } else if (strcmp(arg[iarg],"angmomz") == 0) { if (!atom->angmom_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_angmomz; } else if (strcmp(arg[iarg],"shapex") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); - if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_shapex; } else if (strcmp(arg[iarg],"shapey") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); - if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_shapey; } else if (strcmp(arg[iarg],"shapez") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); - if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_ellipsoid) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_shapez; } else if (strcmp(arg[iarg],"quatw") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); avec_body = (AtomVecBody *) atom->style_match("body"); if (!avec_ellipsoid && !avec_body) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_quatw; } else if (strcmp(arg[iarg],"quati") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); avec_body = (AtomVecBody *) atom->style_match("body"); if (!avec_ellipsoid && !avec_body) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_quati; } else if (strcmp(arg[iarg],"quatj") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); avec_body = (AtomVecBody *) atom->style_match("body"); if (!avec_ellipsoid && !avec_body) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_quatj; } else if (strcmp(arg[iarg],"quatk") == 0) { avec_ellipsoid = (AtomVecEllipsoid *) atom->style_match("ellipsoid"); avec_body = (AtomVecBody *) atom->style_match("body"); if (!avec_ellipsoid && !avec_body) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_quatk; } else if (strcmp(arg[iarg],"tqx") == 0) { if (!atom->torque_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_tqx; } else if (strcmp(arg[iarg],"tqy") == 0) { if (!atom->torque_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_tqy; } else if (strcmp(arg[iarg],"tqz") == 0) { if (!atom->torque_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_tqz; } else if (strcmp(arg[iarg],"end1x") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end1x; } else if (strcmp(arg[iarg],"end1y") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end1y; } else if (strcmp(arg[iarg],"end1z") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end1z; } else if (strcmp(arg[iarg],"end2x") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end2x; } else if (strcmp(arg[iarg],"end2y") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end2y; } else if (strcmp(arg[iarg],"end2z") == 0) { avec_line = (AtomVecLine *) atom->style_match("line"); - if (!avec_line) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_line) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_end2z; } else if (strcmp(arg[iarg],"corner1x") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner1x; } else if (strcmp(arg[iarg],"corner1y") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner1y; } else if (strcmp(arg[iarg],"corner1z") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner1z; } else if (strcmp(arg[iarg],"corner2x") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner2x; } else if (strcmp(arg[iarg],"corner2y") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner2y; } else if (strcmp(arg[iarg],"corner2z") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner2z; } else if (strcmp(arg[iarg],"corner3x") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner3x; } else if (strcmp(arg[iarg],"corner3y") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner3y; } else if (strcmp(arg[iarg],"corner3z") == 0) { avec_tri = (AtomVecTri *) atom->style_match("tri"); - if (!avec_tri) error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + if (!avec_tri) error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_corner3z; } else if (strcmp(arg[iarg],"nbonds") == 0) { if (!atom->molecule_flag) - error->all(FLERR,"Compute property/atom for " - "atom property that isn't allocated"); + error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_nbonds; // custom per-atom vector diff --git a/src/modify.cpp b/src/modify.cpp index 995b3b82ac..eff6ea8337 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -223,16 +223,11 @@ void Modify::init() list_init_energy_global(n_energy_global,list_energy_global); list_init_energy_atom(n_energy_atom,list_energy_atom); - list_init(INITIAL_INTEGRATE_RESPA, - n_initial_integrate_respa,list_initial_integrate_respa); - list_init(POST_INTEGRATE_RESPA, - n_post_integrate_respa,list_post_integrate_respa); - list_init(POST_FORCE_RESPA, - n_post_force_respa,list_post_force_respa); - list_init(PRE_FORCE_RESPA, - n_pre_force_respa,list_pre_force_respa); - list_init(FINAL_INTEGRATE_RESPA, - n_final_integrate_respa,list_final_integrate_respa); + list_init(INITIAL_INTEGRATE_RESPA,n_initial_integrate_respa,list_initial_integrate_respa); + list_init(POST_INTEGRATE_RESPA,n_post_integrate_respa,list_post_integrate_respa); + list_init(POST_FORCE_RESPA,n_post_force_respa,list_post_force_respa); + list_init(PRE_FORCE_RESPA,n_pre_force_respa,list_pre_force_respa); + list_init(FINAL_INTEGRATE_RESPA,n_final_integrate_respa,list_final_integrate_respa); list_init(MIN_PRE_EXCHANGE,n_min_pre_exchange,list_min_pre_exchange); list_init(MIN_PRE_NEIGHBOR,n_min_pre_neighbor,list_min_pre_neighbor); From b19a211d701685390d33e4603f9f06dd674d91ee Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 18:06:21 -0400 Subject: [PATCH 327/352] update code --- src/atom.cpp | 14 +--- src/compute_property_atom.cpp | 84 ++++++++++--------- src/library.cpp | 148 +++++++++++++--------------------- 3 files changed, 101 insertions(+), 145 deletions(-) diff --git a/src/atom.cpp b/src/atom.cpp index a0f7099319..ab044b6c47 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2774,13 +2774,10 @@ void *Atom::extract(const char *name) // -------------------------------------------------------------------- // custom vectors and arrays - // OLDSTYLE code - if (strstr(name,"i_") == name || strstr(name,"d_") == name || - strstr(name,"i2_") == name || strstr(name,"d2_") == name) { - int which = 0; + if (utils::strmatch(name,"^[id]2?_")) { + int which = 0, array = 0; if (name[0] == 'd') which = 1; - int array = 0; if (name[1] == '2') array = 1; int index,flag,cols; @@ -2897,13 +2894,10 @@ int Atom::extract_datatype(const char *name) // -------------------------------------------------------------------- // custom vectors and arrays - // OLDSTYLE code - if (strstr(name,"i_") == name || strstr(name,"d_") == name || - strstr(name,"i2_") == name || strstr(name,"d2_") == name) { - int which = 0; + if (utils::strmatch(name,"^[id]2?_")) { + int which = 0, array = 0; if (name[0] == 'd') which = 1; - int array = 0; if (name[1] == '2') array = 1; int index,flag,cols; diff --git a/src/compute_property_atom.cpp b/src/compute_property_atom.cpp index 190168db4b..d4cec70fe4 100644 --- a/src/compute_property_atom.cpp +++ b/src/compute_property_atom.cpp @@ -14,6 +14,7 @@ #include "compute_property_atom.h" +#include "arg_info.h" #include "atom.h" #include "atom_vec.h" #include "atom_vec_body.h" @@ -333,55 +334,52 @@ ComputePropertyAtom::ComputePropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Compute property/atom for atom property that isn't allocated"); pack_choice[i] = &ComputePropertyAtom::pack_nbonds; - // custom per-atom vector + // custom per-atom vector or array - } else if (utils::strmatch(arg[iarg],"^i_")) { + } else if (utils::strmatch(arg[iarg],"^[id]2?_")) { int flag,cols; - index[i] = atom->find_custom(&arg[iarg][2],flag,cols); - if (index[i] < 0 || flag || cols) - error->all(FLERR,"Compute property/atom integer " - "vector does not exist"); - pack_choice[i] = &ComputePropertyAtom::pack_iname; + ArgInfo argi(arg[iarg], ArgInfo::INAME| ArgInfo::DNAME); + const char *pname = argi.get_name(); - } else if (utils::strmatch(arg[iarg],"^d_")) { - int flag,cols; - index[i] = atom->find_custom(&arg[iarg][2],flag,cols); - if (index[i] < 0 || flag || cols) - error->all(FLERR,"Compute property/atom floating point " - "vector does not exist"); - pack_choice[i] = &ComputePropertyAtom::pack_dname; + index[i] = atom->find_custom(pname,flag,cols); + if (index[i] < 0) + error->all(FLERR,"Compute property/atom property {} does not exist", pname); - // custom per-atom arrays, must include bracketed index - // OLDSTYLE code + // handle vectors + if ((cols == 0) && (arg[iarg][1] == '_')) { + if (argi.get_dim() != 0) + error->all(FLERR,"Compute property/atom custom vector {} is incorrectly indexed",pname); - } else if (strstr(arg[iarg],"i2_") == arg[iarg] || - strstr(arg[iarg],"d2_") == arg[iarg]) { - int which = 0; - if (arg[iarg][0] == 'd') which = 1; + if (arg[iarg][0] == 'i') { + if (argi.get_type() == ArgInfo::INAME) + pack_choice[i] = &ComputePropertyAtom::pack_iname; + else + error->all(FLERR,"Compute property/atom integer vector {} does not exist",pname); + } else if (arg[iarg][0] == 'd') { + if (argi.get_type() == ArgInfo::DNAME) + pack_choice[i] = &ComputePropertyAtom::pack_dname; + else + error->all(FLERR,"Compute property/atom floating-point vector {} does not exist",pname); + } + } + // handle arrays + else if ((cols > 0) && (arg[iarg][1] == '2')) { + if (argi.get_dim() != 1) + error->all(FLERR,"Compute property/atom custom array {} is not indexed",pname); + colindex[i] = argi.get_index1(); - int n = strlen(arg[iarg]); - char *suffix = new char[n]; - strcpy(suffix,&arg[iarg][3]); - - char *ptr = strchr(suffix,'['); - if (ptr) { - if (suffix[strlen(suffix)-1] != ']') - error->all(FLERR,"Invalid attribute in set command"); - suffix[strlen(suffix)-1] = '\0'; - colindex[i] = utils::inumeric(FLERR,ptr+1,true,lmp); - *ptr = '\0'; - } else error->all(FLERR,"Compute property/atom custom array is not indexed"); - - int flag,cols; - index[i] = atom->find_custom(suffix,flag,cols); - delete [] suffix; - - if ((!which && (index[i] < 0 || flag || !cols)) || - (which && (index[i] < 0 || !flag || !cols))) - error->all(FLERR,"Compute property/atom custom array does not exist"); - - if (!which) pack_choice[i] = &ComputePropertyAtom::pack_i2name; - else pack_choice[i] = &ComputePropertyAtom::pack_d2name; + if (arg[iarg][0] == 'i') { + if (argi.get_type() == ArgInfo::INAME) + pack_choice[i] = &ComputePropertyAtom::pack_i2name; + else + error->all(FLERR,"Compute property/atom integer array {} does not exist",pname); + } else if (arg[iarg][0] == 'd') { + if (argi.get_type() == ArgInfo::DNAME) + pack_choice[i] = &ComputePropertyAtom::pack_d2name; + else + error->all(FLERR,"Compute property/atom floating-point array {} does not exist",pname); + } + } else error->all(FLERR,"Inconsistent request for custom property {}", pname); // anything else must be recognized by atom style diff --git a/src/library.cpp b/src/library.cpp index 1397cf889e..db609351f7 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -2829,7 +2829,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) { #if defined(LAMMPS_BIGBIG) lmp->error->all(FLERR,"Library function lammps_gather" - " not compatible with -DLAMMPS_BIGBIG"); + " not compatible with -DLAMMPS_BIGBIG"); #else int i,j,offset,fcid,ltype,icol; @@ -2915,14 +2915,10 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) } // custom fix property/atom vector or array - // OLDSTYLE code - if ((vptr == nullptr) && - ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || - (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { - if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) - fcid = lmp->atom->find_custom(&name[2],ltype,icol); + if (utils::strmatch(name,"^[id]_")) fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { @@ -2948,11 +2944,11 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) } if (count == 1) { - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; } else { - if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; - else vptr = (void *) lmp->atom->darray[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; } } @@ -2960,7 +2956,7 @@ void lammps_gather(void *handle, char *name, int type, int count, void *data) if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather: undefined property name"); + lmp->error->warning(FLERR,"lammps_gather: undefined property name"); return; } @@ -3104,20 +3100,17 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (lmp->modify->fix[fcid]->peratom_flag == 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat:" - " fix does not return peratom data"); + lmp->error->warning(FLERR,"lammps_gather_concat: fix does not return peratom data"); return; } if (count>1 && lmp->modify->fix[fcid]->size_peratom_cols != count) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat:" - " count != values peratom for fix"); + lmp->error->warning(FLERR,"lammps_gather_concat: count != values peratom for fix"); return; } if (lmp->update->ntimestep % lmp->modify->fix[fcid]->peratom_freq) { if (lmp->comm->me == 0) - lmp->error->all(FLERR,"lammps_gather_concat:" - " fix not computed at compatible time"); + lmp->error->all(FLERR,"lammps_gather_concat: fix not computed at compatible time"); return; } @@ -3138,14 +3131,12 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (lmp->modify->compute[fcid]->peratom_flag == 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat:" - " compute does not return peratom data"); + lmp->error->warning(FLERR,"lammps_gather_concat: compute does not return peratom data"); return; } if (count>1 && lmp->modify->compute[fcid]->size_peratom_cols != count) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat:" - " count != values peratom for compute"); + lmp->error->warning(FLERR,"lammps_gather_concat: count != values peratom for compute"); return; } @@ -3157,48 +3148,40 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d } // custom per-atom vector or array - // OLDSTYLE code - if ((vptr==nullptr) && - ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || - (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + if ((vptr==nullptr) && utils::strmatch(name,"^[id]2?_")) { - if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) - fcid = lmp->atom->find_custom(&name[2],ltype,icol); + if (utils::strmatch(name,"^[id]_")) fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: " - "unknown property/atom id"); + lmp->error->warning(FLERR,"lammps_gather_concat: unknown property/atom id"); return; } if (ltype != type) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: " - "mismatch property/atom type"); + lmp->error->warning(FLERR,"lammps_gather_concat: mismatch property/atom type"); return; } if (count == 1 && icol != 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: " - "mismatch property/atom count"); + lmp->error->warning(FLERR,"lammps_gather_concat: mismatch property/atom count"); return; } if (count > 1 && icol != count) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: " - "mismatch property/atom count"); + lmp->error->warning(FLERR,"lammps_gather_concat: mismatch property/atom count"); return; } if (count == 1) { - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; } else { - if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; - else vptr = (void *) lmp->atom->darray[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; } } @@ -3206,7 +3189,7 @@ void lammps_gather_concat(void *handle, char *name, int type, int count, void *d if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_concat: undefined property name"); + lmp->error->warning(FLERR,"lammps_gather_concat: undefined property name"); return; } @@ -3375,14 +3358,12 @@ void lammps_gather_subset(void *handle, char *name, return; } if (count>1 && lmp->modify->fix[fcid]->size_peratom_cols != count) { - lmp->error->warning(FLERR,"lammps_gather_subset:" - " count != values peratom for fix"); + lmp->error->warning(FLERR,"lammps_gather_subset: count != values peratom for fix"); return; } if (lmp->update->ntimestep % lmp->modify->fix[fcid]->peratom_freq) { if (lmp->comm->me == 0) - lmp->error->all(FLERR,"lammps_gather_subset:" - " fix not computed at compatible time"); + lmp->error->all(FLERR,"lammps_gather_subset: fix not computed at compatible time"); return; } @@ -3403,14 +3384,12 @@ void lammps_gather_subset(void *handle, char *name, if (lmp->modify->compute[fcid]->peratom_flag == 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset:" - " compute does not return peratom data"); + lmp->error->warning(FLERR,"lammps_gather_subset: compute does not return peratom data"); return; } if (count>1 && lmp->modify->compute[fcid]->size_peratom_cols != count) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset:" - " count != values peratom for compute"); + lmp->error->warning(FLERR,"lammps_gather_subset: count != values peratom for compute"); return; } @@ -3422,48 +3401,41 @@ void lammps_gather_subset(void *handle, char *name, } // custom fix property/atom vector or array - // OLDSTYLE code - if ((vptr == nullptr) && - ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || - (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { - if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) - fcid = lmp->atom->find_custom(&name[2],ltype,icol); + if (utils::strmatch(name,"^[id]_")) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: " - "unknown property/atom id"); + lmp->error->warning(FLERR,"lammps_gather_subset: unknown property/atom id"); return; } if (ltype != type) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: " - "mismatch property/atom type"); + lmp->error->warning(FLERR,"lammps_gather_subset: mismatch property/atom type"); return; } if (count == 1 && icol != 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: " - "mismatch property/atom count"); + lmp->error->warning(FLERR,"lammps_gather_subset: mismatch property/atom count"); return; } if (count > 1 && icol != count) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: " - "mismatch property/atom count"); + lmp->error->warning(FLERR,"lammps_gather_subset: mismatch property/atom count"); return; } if (count == 1) { - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; } else { - if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; - else vptr = (void *) lmp->atom->darray[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; } } @@ -3471,7 +3443,7 @@ void lammps_gather_subset(void *handle, char *name, if (vptr == nullptr) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_gather_subset: undefined property name"); + lmp->error->warning(FLERR,"lammps_gather_subset: undefined property name"); return; } @@ -3678,14 +3650,11 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) } // custom fix property/atom vector or array - // OLDSTYLE code - if ((vptr == nullptr) && - ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || - (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { - if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) - fcid = lmp->atom->find_custom(&name[2],ltype,icol); + if (utils::strmatch(name,"^[id]_")) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { @@ -3711,11 +3680,11 @@ void lammps_scatter(void *handle, char *name, int type, int count, void *data) } if (count == 1) { - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; } else { - if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; - else vptr = (void *) lmp->atom->darray[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; } } @@ -3902,27 +3871,22 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, } // custom fix property/atom vector or array - // OLDSTYLE code - if ((vptr == nullptr) && - ((strstr(name,"d_") == name) || (strstr(name,"i_") == name) || - (strstr(name,"d2_") == name) || (strstr(name,"i2_") == name))) { + if ((vptr == nullptr) && utils::strmatch(name,"^[id]2?_")) { - if ((strstr(name,"d_") == name) || (strstr(name,"i_") == name)) - fcid = lmp->atom->find_custom(&name[2],ltype,icol); + if (utils::strmatch(name,"^[id]_")) + fcid = lmp->atom->find_custom(&name[2],ltype,icol); else fcid = lmp->atom->find_custom(&name[3],ltype,icol); if (fcid < 0) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_scatter_subset: " - "unknown property/atom id"); + lmp->error->warning(FLERR,"lammps_scatter_subset: unknown property/atom id"); return; } if (ltype != type) { if (lmp->comm->me == 0) - lmp->error->warning(FLERR,"lammps_scatter_subset: " - "mismatch property/atom type"); + lmp->error->warning(FLERR,"lammps_scatter_subset: mismatch property/atom type"); return; } if (count == 1 && icol != 0) { @@ -3937,11 +3901,11 @@ void lammps_scatter_subset(void *handle, char *name,int type, int count, } if (count == 1) { - if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; - else vptr = (void *) lmp->atom->dvector[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->ivector[fcid]; + else vptr = (void *) lmp->atom->dvector[fcid]; } else { - if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; - else vptr = (void *) lmp->atom->darray[fcid]; + if (ltype==0) vptr = (void *) lmp->atom->iarray[fcid]; + else vptr = (void *) lmp->atom->darray[fcid]; } } From 546c9a109ebdf7ec280bea8985e03faede042107 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 20:25:49 -0400 Subject: [PATCH 328/352] fix uninitialized data bug --- src/fix_property_atom.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 2d122e9b03..0744aca7b2 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -93,11 +93,12 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : } else if (utils::strmatch(arg[iarg],"^i_")) { style[nvalue] = IVEC; - int flag,cols; - index[nvalue] = atom->find_custom(&arg[iarg][2],flag,cols); + int flag,ncols; + index[nvalue] = atom->find_custom(&arg[iarg][2],flag,ncols); if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom vector name already exists"); index[nvalue] = atom->add_custom(&arg[iarg][2],0,0); + cols[nvalue] = 0; nvalue++; iarg++; @@ -108,6 +109,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : if (index[nvalue] >= 0) error->all(FLERR,"Fix property/atom vector name already exists"); index[nvalue] = atom->add_custom(&arg[iarg][2],1,0); + cols[nvalue] = 0; nvalue++; iarg++; From d9f3745effafa22f633aa9a383b84a9f4f226af1 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 20:26:01 -0400 Subject: [PATCH 329/352] pretty --- src/dump_custom.cpp | 9 +++------ src/fix_property_atom.cpp | 6 ++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 3aac7a3e79..3f70d242b1 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1532,15 +1532,12 @@ int DumpCustom::parse_fields(int narg, char **arg) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[iarg] == 0) { if (!flag || cols) - error->all(FLERR, - "Property double vector for dump custom does not exist"); + error->all(FLERR,"Property double vector for dump custom does not exist"); } else { if (!flag || !cols) - error->all(FLERR, - "Property double array for dump custom does not exist"); + error->all(FLERR,"Property double array for dump custom does not exist"); if (argindex[iarg] > atom->dcols[n]) - error->all(FLERR, - "Dump custom property array is accessed out-of-range"); + error->all(FLERR,"Dump custom property array is accessed out-of-range"); } field2index[iarg] = add_custom(name,1); diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 0744aca7b2..761f8264d3 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -66,8 +66,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : iarg++; } else if (strcmp(arg[iarg],"q") == 0) { if (atom->q_flag) - error->all(FLERR,"Fix property/atom q when atom_style " - "already has charge attribute"); + error->all(FLERR,"Fix property/atom q when atom_style already has charge attribute"); if (q_flag) error->all(FLERR,"Fix property/atom cannot specify q twice"); style[nvalue] = CHARGE; @@ -78,8 +77,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : iarg++; } else if (strcmp(arg[iarg],"rmass") == 0) { if (atom->rmass_flag) - error->all(FLERR,"Fix property/atom rmass when atom_style " - "already has rmass attribute"); + error->all(FLERR,"Fix property/atom rmass when atom_style already has rmass attribute"); if (rmass_flag) error->all(FLERR,"Fix property/atom cannot specify rmass twice"); style[nvalue] = RMASS; From 04b0f98a5f040598034b1a87ab5cf1a3e7e38e66 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 20:26:51 -0400 Subject: [PATCH 330/352] fix logic bug in utils::expand_args() --- src/utils.cpp | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/utils.cpp b/src/utils.cpp index 949d6d7793..528908807c 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -627,36 +627,32 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } } } + } - // expansion will take place + // expansion will take place - if (expandflag) { + if (expandflag) { - // expand wild card string to nlo/nhi numbers - utils::bounds(file, line, wc, 1, nmax, nlo, nhi, lmp->error); + // expand wild card string to nlo/nhi numbers + utils::bounds(file, line, wc, 1, nmax, nlo, nhi, lmp->error); - if (newarg + nhi - nlo + 1 > maxarg) { - maxarg += nhi - nlo + 1; - earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); - } + if (newarg + nhi - nlo + 1 > maxarg) { + maxarg += nhi - nlo + 1; + earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); + } - for (int index = nlo; index <= nhi; index++) { - // assemble and duplicate expanded string - if (word[1] == '2') - earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); - else - earg[newarg] = utils::strdup(fmt::format("{}_{}[{}]{}", word[0], id, index, tail)); - newarg++; - } - } else { - // no expansion: duplicate original string - if (newarg == maxarg) { - maxarg++; - earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); - } - earg[newarg] = utils::strdup(word); + for (int index = nlo; index <= nhi; index++) { + earg[newarg] = utils::strdup(fmt::format("{}2_{}[{}]{}", word[0], id, index, tail)); newarg++; } + } else { + // no expansion: duplicate original string + if (newarg == maxarg) { + maxarg++; + earg = (char **) lmp->memory->srealloc(earg, maxarg * sizeof(char *), "input:earg"); + } + earg[newarg] = utils::strdup(word); + newarg++; } } From b942c4d122e18331416b11c98a2a3264fb1de819 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 22:31:46 -0400 Subject: [PATCH 331/352] fix data corruption bug affecting write_data --- src/fix_property_atom.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 761f8264d3..0f86d8abc3 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -97,6 +97,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Fix property/atom vector name already exists"); index[nvalue] = atom->add_custom(&arg[iarg][2],0,0); cols[nvalue] = 0; + values_peratom++; nvalue++; iarg++; @@ -108,6 +109,7 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Fix property/atom vector name already exists"); index[nvalue] = atom->add_custom(&arg[iarg][2],1,0); cols[nvalue] = 0; + values_peratom++; nvalue++; iarg++; From c53875421b31e35e7753eb3fe643c9528e3ccd76 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 22:50:42 -0400 Subject: [PATCH 332/352] fix read_data bug --- src/fix_property_atom.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/fix_property_atom.cpp b/src/fix_property_atom.cpp index 0f86d8abc3..1e583a4ec9 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -254,8 +254,7 @@ void FixPropertyAtom::init() id_offset is applied to first atomID field if multiple data files are read ------------------------------------------------------------------------- */ -void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, - tagint id_offset) +void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, tagint id_offset) { int j,k,m,ncol; tagint itag; @@ -280,14 +279,13 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, try { ValueTokenizer values(buf); - if ((int)values.count() != nvalue+1) - error->all(FLERR,"Incorrect format in {} section " - "of data file: {}",keyword,buf); + if ((int)values.count() != values_peratom+1) + error->all(FLERR,"Incorrect format in {} section of data file: {}" + " expected {} and got {}",keyword,buf,values_peratom+1,values.count()); itag = values.next_tagint() + id_offset; if (itag <= 0 || itag > map_tag_max) - error->all(FLERR,"Invalid atom ID {} in {} section of " - "data file",itag, keyword); + error->all(FLERR,"Invalid atom ID {} in {} section of data file",itag, keyword); // assign words in line to per-atom vectors @@ -303,7 +301,6 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, atom->ivector[index[j]][m] = values.next_int(); } else if (style[j] == DVEC) { atom->dvector[index[j]][m] = values.next_double(); - // NOTE: Axel please check these lines of array code } else if (style[j] == IARRAY) { ncol = cols[j]; for (k = 0; k < ncol; k++) @@ -316,8 +313,7 @@ void FixPropertyAtom::read_data_section(char *keyword, int n, char *buf, } } } catch (TokenizerException &e) { - error->all(FLERR,"Invalid format in {} section of data " - "file '{}': {}",keyword, buf,e.what()); + error->all(FLERR,"Invalid format in {} section of data file '{}': {}",keyword, buf,e.what()); } buf = next + 1; } From 5c46c6d3a6c5c046c85dbe6b4f1092d20526e5b4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Aug 2021 22:51:09 -0400 Subject: [PATCH 333/352] update unit test for per-atom arrays and vectors --- unittest/formats/test_atom_styles.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/unittest/formats/test_atom_styles.cpp b/unittest/formats/test_atom_styles.cpp index b091360170..71c1ed882f 100644 --- a/unittest/formats/test_atom_styles.cpp +++ b/unittest/formats/test_atom_styles.cpp @@ -4648,7 +4648,8 @@ TEST_F(AtomStyleTest, property_atom) command("pair_style zero 4.0"); command("units real"); command("atom_modify map array"); - command("fix props all property/atom i_one d_two mol d_three q rmass ghost yes"); + command("fix props all property/atom i_one d_two mol d_three q rmass " + "i2_four 2 d2_five 3 ghost yes"); command("read_data test_atom_styles.data fix props NULL Properties"); command("pair_coeff * *"); END_HIDE_OUTPUT(); @@ -4737,7 +4738,8 @@ TEST_F(AtomStyleTest, property_atom) command("clear"); ASSERT_THAT(std::string(lmp->atom->atom_style), Eq("atomic")); command("read_restart test_atom_styles.restart"); - command("fix props all property/atom i_one d_two mol d_three q rmass ghost yes"); + command("fix props all property/atom i_one d_two mol d_three q rmass " + "i2_four 2 d2_five 3 ghost yes"); END_HIDE_OUTPUT(); expected.natoms = 2; expected.nlocal = 2; @@ -4749,7 +4751,11 @@ TEST_F(AtomStyleTest, property_atom) expected.has_mass_setflag = true; expected.has_sametag = true; expected.has_extra = true; - expected.nextra_store = 7; + expected.has_ivname = true; + expected.has_dvname = true; + expected.has_ianame = true; + expected.has_daname = true; + expected.nextra_store = 12; ASSERT_ATOM_STATE_EQ(lmp->atom, expected); ASSERT_NE(lmp->atom->avec, nullptr); From e149c2fe10fdaa5a791baf1fd1824bc4f982da4d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 04:20:12 -0400 Subject: [PATCH 334/352] function no longer needs to be public --- src/pair.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pair.h b/src/pair.h index 0c082fa1c5..f37c0732ed 100644 --- a/src/pair.h +++ b/src/pair.h @@ -143,8 +143,6 @@ class Pair : protected Pointers { void v_tally2_newton(int, double *, double *); void v_tally3(int, int, int, double *, double *, double *, double *); void v_tally4(int, int, int, int, double *, double *, double *, double *, double *, double *); - void ev_tally_xyz(int, int, int, int, double, double, double, double, double, double, double, - double); // general child-class methods @@ -274,6 +272,8 @@ class Pair : protected Pointers { void ev_tally4(int, int, int, int, double, double *, double *, double *, double *, double *, double *); void ev_tally_tip4p(int, int *, double *, double, double); + void ev_tally_xyz(int, int, int, int, double, double, double, double, double, double, double, + double); void v_tally2(int, int, double, double *); void v_tally_tensor(int, int, int, int, double, double, double, double, double, double); void virial_fdotr_compute(); From 3a7a5d13ef9b9e9be20df8524129219ac8482a77 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 04:22:55 -0400 Subject: [PATCH 335/352] apply clang-format --- src/KSPACE/pair_coul_long.cpp | 216 ++++++++++++++++------------------ 1 file changed, 104 insertions(+), 112 deletions(-) diff --git a/src/KSPACE/pair_coul_long.cpp b/src/KSPACE/pair_coul_long.cpp index 09c820160c..b4b467e6bc 100644 --- a/src/KSPACE/pair_coul_long.cpp +++ b/src/KSPACE/pair_coul_long.cpp @@ -1,4 +1,3 @@ -// clang-format off /* ---------------------------------------------------------------------- LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator https://www.lammps.org/, Sandia National Laboratories @@ -18,27 +17,27 @@ #include "pair_coul_long.h" -#include -#include #include "atom.h" #include "comm.h" +#include "error.h" #include "force.h" #include "kspace.h" -#include "neighbor.h" -#include "neigh_list.h" #include "memory.h" -#include "error.h" +#include "neigh_list.h" +#include "neighbor.h" +#include +#include using namespace LAMMPS_NS; -#define EWALD_F 1.12837917 -#define EWALD_P 0.3275911 -#define A1 0.254829592 -#define A2 -0.284496736 -#define A3 1.421413741 -#define A4 -1.453152027 -#define A5 1.061405429 +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 /* ---------------------------------------------------------------------- */ @@ -69,16 +68,16 @@ PairCoulLong::~PairCoulLong() void PairCoulLong::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itable,itype,jtype; - double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul,fpair; - double fraction,table; - double r,r2inv,forcecoul,factor_coul; - double grij,expm2,prefactor,t,erfc; - int *ilist,*jlist,*numneigh,**firstneigh; + int i, j, ii, jj, inum, jnum, itable, itype, jtype; + double qtmp, xtmp, ytmp, ztmp, delx, dely, delz, ecoul, fpair; + double fraction, table; + double r, r2inv, forcecoul, factor_coul; + double grij, expm2, prefactor, t, erfc; + int *ilist, *jlist, *numneigh, **firstneigh; double rsq; ecoul = 0.0; - ev_init(eflag,vflag); + ev_init(eflag, vflag); double **x = atom->x; double **f = atom->f; @@ -114,58 +113,57 @@ void PairCoulLong::compute(int eflag, int vflag) delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx * delx + dely * dely + delz * delz; jtype = type[j]; if (rsq < cut_coulsq) { - r2inv = 1.0/rsq; + r2inv = 1.0 / rsq; if (!ncoultablebits || rsq <= tabinnersq) { r = sqrt(rsq); grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - prefactor = qqrd2e * scale[itype][jtype] * qtmp*q[j]/r; - forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); - if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + expm2 = exp(-grij * grij); + t = 1.0 / (1.0 + EWALD_P * grij); + erfc = t * (A1 + t * (A2 + t * (A3 + t * (A4 + t * A5)))) * expm2; + prefactor = qqrd2e * scale[itype][jtype] * qtmp * q[j] / r; + forcecoul = prefactor * (erfc + EWALD_F * grij * expm2); + if (factor_coul < 1.0) forcecoul -= (1.0 - factor_coul) * prefactor; } else { union_int_float_t rsq_lookup; rsq_lookup.f = rsq; itable = rsq_lookup.i & ncoulmask; itable >>= ncoulshiftbits; fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; - table = ftable[itable] + fraction*dftable[itable]; - forcecoul = scale[itype][jtype] * qtmp*q[j] * table; + table = ftable[itable] + fraction * dftable[itable]; + forcecoul = scale[itype][jtype] * qtmp * q[j] * table; if (factor_coul < 1.0) { - table = ctable[itable] + fraction*dctable[itable]; - prefactor = scale[itype][jtype] * qtmp*q[j] * table; - forcecoul -= (1.0-factor_coul)*prefactor; + table = ctable[itable] + fraction * dctable[itable]; + prefactor = scale[itype][jtype] * qtmp * q[j] * table; + forcecoul -= (1.0 - factor_coul) * prefactor; } } fpair = forcecoul * r2inv; - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; + f[i][0] += delx * fpair; + f[i][1] += dely * fpair; + f[i][2] += delz * fpair; if (newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; + f[j][0] -= delx * fpair; + f[j][1] -= dely * fpair; + f[j][2] -= delz * fpair; } if (eflag) { if (!ncoultablebits || rsq <= tabinnersq) - ecoul = prefactor*erfc; + ecoul = prefactor * erfc; else { - table = etable[itable] + fraction*detable[itable]; - ecoul = scale[itype][jtype] * qtmp*q[j] * table; + table = etable[itable] + fraction * detable[itable]; + ecoul = scale[itype][jtype] * qtmp * q[j] * table; } - if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor; + if (factor_coul < 1.0) ecoul -= (1.0 - factor_coul) * prefactor; } - if (evflag) ev_tally(i,j,nlocal,newton_pair, - 0.0,ecoul,fpair,delx,dely,delz); + if (evflag) ev_tally(i, j, nlocal, newton_pair, 0.0, ecoul, fpair, delx, dely, delz); } } } @@ -182,14 +180,13 @@ void PairCoulLong::allocate() allocated = 1; int n = atom->ntypes; - memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(setflag, n + 1, n + 1, "pair:setflag"); for (int i = 1; i <= n; i++) - for (int j = i; j <= n; j++) - setflag[i][j] = 0; + for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); + memory->create(cutsq, n + 1, n + 1, "pair:cutsq"); - memory->create(scale,n+1,n+1,"pair:scale"); + memory->create(scale, n + 1, n + 1, "pair:scale"); } /* ---------------------------------------------------------------------- @@ -198,9 +195,9 @@ void PairCoulLong::allocate() void PairCoulLong::settings(int narg, char **arg) { - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + if (narg != 1) error->all(FLERR, "Illegal pair_style command"); - cut_coul = utils::numeric(FLERR,arg[0],false,lmp); + cut_coul = utils::numeric(FLERR, arg[0], false, lmp); } /* ---------------------------------------------------------------------- @@ -209,23 +206,23 @@ void PairCoulLong::settings(int narg, char **arg) void PairCoulLong::coeff(int narg, char **arg) { - if (narg != 2) error->all(FLERR,"Incorrect args for pair coefficients"); + if (narg != 2) error->all(FLERR, "Incorrect args for pair coefficients"); 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); int count = 0; for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { + for (int j = MAX(jlo, i); j <= jhi; j++) { scale[i][j] = 1.0; setflag[i][j] = 1; count++; } } - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + if (count == 0) error->all(FLERR, "Incorrect args for pair coefficients"); } /* ---------------------------------------------------------------------- @@ -234,22 +231,20 @@ void PairCoulLong::coeff(int narg, char **arg) void PairCoulLong::init_style() { - if (!atom->q_flag) - error->all(FLERR,"Pair style lj/cut/coul/long requires atom attribute q"); + if (!atom->q_flag) error->all(FLERR, "Pair style lj/cut/coul/long requires atom attribute q"); - neighbor->request(this,instance_me); + neighbor->request(this, instance_me); cut_coulsq = cut_coul * cut_coul; // insure use of KSpace long-range solver, set g_ewald - if (force->kspace == nullptr) - error->all(FLERR,"Pair style requires a KSpace style"); + if (force->kspace == nullptr) error->all(FLERR, "Pair style requires a KSpace style"); g_ewald = force->kspace->g_ewald; // setup force tables - if (ncoultablebits) init_tables(cut_coul,nullptr); + if (ncoultablebits) init_tables(cut_coul, nullptr); } /* ---------------------------------------------------------------------- @@ -259,7 +254,7 @@ void PairCoulLong::init_style() double PairCoulLong::init_one(int i, int j) { scale[j][i] = scale[i][j]; - return cut_coul+2.0*qdist; + return cut_coul + 2.0 * qdist; } /* ---------------------------------------------------------------------- @@ -272,9 +267,8 @@ void PairCoulLong::write_restart(FILE *fp) for (int i = 1; i <= atom->ntypes; i++) for (int j = i; j <= atom->ntypes; j++) { - fwrite(&setflag[i][j],sizeof(int),1,fp); - if (setflag[i][j]) - fwrite(&scale[i][j],sizeof(double),1,fp); + fwrite(&setflag[i][j], sizeof(int), 1, fp); + if (setflag[i][j]) fwrite(&scale[i][j], sizeof(double), 1, fp); } } @@ -288,15 +282,15 @@ void PairCoulLong::read_restart(FILE *fp) allocate(); - int i,j; + int i, j; int me = comm->me; for (i = 1; i <= atom->ntypes; i++) for (j = i; j <= atom->ntypes; j++) { - if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error); - MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + if (me == 0) utils::sfread(FLERR, &setflag[i][j], sizeof(int), 1, fp, nullptr, error); + MPI_Bcast(&setflag[i][j], 1, MPI_INT, 0, world); if (setflag[i][j]) { - if (me == 0) utils::sfread(FLERR,&scale[i][j],sizeof(double),1,fp,nullptr,error); - MPI_Bcast(&scale[i][j],1,MPI_DOUBLE,0,world); + if (me == 0) utils::sfread(FLERR, &scale[i][j], sizeof(double), 1, fp, nullptr, error); + MPI_Bcast(&scale[i][j], 1, MPI_DOUBLE, 0, world); } } } @@ -307,11 +301,11 @@ void PairCoulLong::read_restart(FILE *fp) void PairCoulLong::write_restart_settings(FILE *fp) { - fwrite(&cut_coul,sizeof(double),1,fp); - fwrite(&offset_flag,sizeof(int),1,fp); - fwrite(&mix_flag,sizeof(int),1,fp); - fwrite(&ncoultablebits,sizeof(int),1,fp); - fwrite(&tabinner,sizeof(double),1,fp); + fwrite(&cut_coul, sizeof(double), 1, fp); + fwrite(&offset_flag, sizeof(int), 1, fp); + fwrite(&mix_flag, sizeof(int), 1, fp); + fwrite(&ncoultablebits, sizeof(int), 1, fp); + fwrite(&tabinner, sizeof(double), 1, fp); } /* ---------------------------------------------------------------------- @@ -321,63 +315,61 @@ void PairCoulLong::write_restart_settings(FILE *fp) void PairCoulLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { - utils::sfread(FLERR,&cut_coul,sizeof(double),1,fp,nullptr,error); - utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error); - utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); - utils::sfread(FLERR,&ncoultablebits,sizeof(int),1,fp,nullptr,error); - utils::sfread(FLERR,&tabinner,sizeof(double),1,fp,nullptr,error); + utils::sfread(FLERR, &cut_coul, sizeof(double), 1, fp, nullptr, error); + utils::sfread(FLERR, &offset_flag, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &mix_flag, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &ncoultablebits, sizeof(int), 1, fp, nullptr, error); + utils::sfread(FLERR, &tabinner, sizeof(double), 1, fp, nullptr, error); } - MPI_Bcast(&cut_coul,1,MPI_DOUBLE,0,world); - MPI_Bcast(&offset_flag,1,MPI_INT,0,world); - MPI_Bcast(&mix_flag,1,MPI_INT,0,world); - MPI_Bcast(&ncoultablebits,1,MPI_INT,0,world); - MPI_Bcast(&tabinner,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_coul, 1, MPI_DOUBLE, 0, world); + MPI_Bcast(&offset_flag, 1, MPI_INT, 0, world); + MPI_Bcast(&mix_flag, 1, MPI_INT, 0, world); + MPI_Bcast(&ncoultablebits, 1, MPI_INT, 0, world); + MPI_Bcast(&tabinner, 1, MPI_DOUBLE, 0, world); } /* ---------------------------------------------------------------------- */ -double PairCoulLong::single(int i, int j, int /*itype*/, int /*jtype*/, - double rsq, - double factor_coul, double /*factor_lj*/, - double &fforce) +double PairCoulLong::single(int i, int j, int /*itype*/, int /*jtype*/, double rsq, + double factor_coul, double /*factor_lj*/, double &fforce) { - double r2inv,r,grij,expm2,t,erfc,prefactor; - double fraction,table,forcecoul,phicoul; + double r2inv, r, grij, expm2, t, erfc, prefactor; + double fraction, table, forcecoul, phicoul; int itable; - r2inv = 1.0/rsq; + r2inv = 1.0 / rsq; if (!ncoultablebits || rsq <= tabinnersq) { r = sqrt(rsq); grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - prefactor = force->qqrd2e * atom->q[i]*atom->q[j]/r; - forcecoul = prefactor * (erfc + EWALD_F*grij*expm2); - if (factor_coul < 1.0) forcecoul -= (1.0-factor_coul)*prefactor; + expm2 = exp(-grij * grij); + t = 1.0 / (1.0 + EWALD_P * grij); + erfc = t * (A1 + t * (A2 + t * (A3 + t * (A4 + t * A5)))) * expm2; + prefactor = force->qqrd2e * atom->q[i] * atom->q[j] / r; + forcecoul = prefactor * (erfc + EWALD_F * grij * expm2); + if (factor_coul < 1.0) forcecoul -= (1.0 - factor_coul) * prefactor; } else { union_int_float_t rsq_lookup; rsq_lookup.f = rsq; itable = rsq_lookup.i & ncoulmask; itable >>= ncoulshiftbits; fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable]; - table = ftable[itable] + fraction*dftable[itable]; - forcecoul = atom->q[i]*atom->q[j] * table; + table = ftable[itable] + fraction * dftable[itable]; + forcecoul = atom->q[i] * atom->q[j] * table; if (factor_coul < 1.0) { - table = ctable[itable] + fraction*dctable[itable]; - prefactor = atom->q[i]*atom->q[j] * table; - forcecoul -= (1.0-factor_coul)*prefactor; + table = ctable[itable] + fraction * dctable[itable]; + prefactor = atom->q[i] * atom->q[j] * table; + forcecoul -= (1.0 - factor_coul) * prefactor; } } fforce = forcecoul * r2inv; if (!ncoultablebits || rsq <= tabinnersq) - phicoul = prefactor*erfc; + phicoul = prefactor * erfc; else { - table = etable[itable] + fraction*detable[itable]; - phicoul = atom->q[i]*atom->q[j] * table; + table = etable[itable] + fraction * detable[itable]; + phicoul = atom->q[i] * atom->q[j] * table; } - if (factor_coul < 1.0) phicoul -= (1.0-factor_coul)*prefactor; + if (factor_coul < 1.0) phicoul -= (1.0 - factor_coul) * prefactor; return phicoul; } @@ -386,11 +378,11 @@ double PairCoulLong::single(int i, int j, int /*itype*/, int /*jtype*/, void *PairCoulLong::extract(const char *str, int &dim) { - if (strcmp(str,"cut_coul") == 0) { + if (strcmp(str, "cut_coul") == 0) { dim = 0; return (void *) &cut_coul; } - if (strcmp(str,"scale") == 0) { + if (strcmp(str, "scale") == 0) { dim = 2; return (void *) scale; } From 89de4eb7c4848c749b8555a4c29caf5692e3ebf6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 04:23:26 -0400 Subject: [PATCH 336/352] make sure that coul/exclude special neighbors are always flagged --- src/neighbor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 5b4b1c4923..b7217926ca 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -528,6 +528,7 @@ void Neighbor::init() for (int isub=0; isub < ph->nstyles; ++isub) { if (force->pair_match("coul/wolf",0,isub) || force->pair_match("coul/dsf",0,isub) + || force->pair_match("coul/exclude",0) || force->pair_match("thole",0,isub)) ++flag; } @@ -536,6 +537,7 @@ void Neighbor::init() } else { if (force->pair_match("coul/wolf",0) || force->pair_match("coul/dsf",0) + || force->pair_match("coul/exclude",0) || force->pair_match("thole",0)) special_flag[1] = special_flag[2] = special_flag[3] = 2; } From 4ce71fd767bde3f228ceb623f3a761975339a5dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 04:23:44 -0400 Subject: [PATCH 337/352] pretty --- src/special.cpp | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/special.cpp b/src/special.cpp index 8a3b991fea..dcc0d0c0ad 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -237,10 +237,8 @@ void Special::onetwo_build_newton() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -371,10 +369,8 @@ void Special::onethree_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -475,10 +471,8 @@ void Special::onefour_build() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -898,10 +892,8 @@ void Special::angle_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1111,10 +1103,8 @@ void Special::dihedral_trim() // perform rendezvous operation char *buf; - int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), - 0,proclist, - rendezvous_pairs,0,buf,sizeof(PairRvous), - (void *) this); + int nreturn = comm->rendezvous(RVOUS,nsend,(char *) inbuf,sizeof(PairRvous), 0,proclist, + rendezvous_pairs,0,buf,sizeof(PairRvous), (void *) this); PairRvous *outbuf = (PairRvous *) buf; memory->destroy(proclist); @@ -1246,9 +1236,8 @@ int Special::rendezvous_ids(int n, char *inbuf, outbuf = same list of N PairRvous datums, routed to different procs ------------------------------------------------------------------------- */ -int Special::rendezvous_pairs(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, - void *ptr) +int Special::rendezvous_pairs(int n, char *inbuf, int &flag, int *&proclist, + char *&outbuf, void *ptr) { Special *sptr = (Special *) ptr; Atom *atom = sptr->atom; From 7d0cdea282420b67d7509095f1b75512309b8f73 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 05:00:11 -0400 Subject: [PATCH 338/352] allow using kspace_style scafacos for molecular systems under certain conditions --- src/SCAFACOS/scafacos.cpp | 23 ++++++++++++++++++++--- src/pair_hybrid.h | 5 +++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/SCAFACOS/scafacos.cpp b/src/SCAFACOS/scafacos.cpp index 451dd7aca9..5e4981663f 100644 --- a/src/SCAFACOS/scafacos.cpp +++ b/src/SCAFACOS/scafacos.cpp @@ -23,6 +23,7 @@ #include "error.h" #include "force.h" #include "memory.h" +#include "pair_hybrid.h" #include #include @@ -108,10 +109,26 @@ void Scafacos::init() if (domain->triclinic) error->all(FLERR, "Cannot use ScaFaCoS with triclinic domain yet"); if (atom->natoms > INT_MAX && sizeof(int) != 8) - error->all(FLERR, "Scafacos atom count exceeds 2B"); + error->all(FLERR, "ScaFaCoS atom count exceeds 2B"); - if (atom->molecular != Atom::ATOMIC) - error->all(FLERR, "Cannot use Scafacos with molecular charged systems yet"); + if ((atom->molecular != Atom::ATOMIC) && (atom->nbonds + atom->nangles + atom->ndihedrals) > 0) { + int flag = 0; + if ((force->special_coul[1] == 1.0) && (force->special_coul[2] == 1.0) && + (force->special_coul[3] == 1.0)) + ++flag; + + PairHybrid *ph = reinterpret_cast(force->pair_match("^hybrid", 0)); + if (ph) { + for (int isub = 0; isub < ph->nstyles; ++isub) + if (force->pair_match("coul/exclude", 0, isub)) ++flag; + } else { + if (force->pair_match("coul/exclude", 0)) ++flag; + } + if (!flag) + error->all(FLERR, + "Must use pair style coul/exclude or 'special_bonds coul 1.0 1.0 1.0'" + "for molecular charged systems with ScaFaCos"); + } FCSResult result; diff --git a/src/pair_hybrid.h b/src/pair_hybrid.h index e3a2b1a562..ab696e279c 100644 --- a/src/pair_hybrid.h +++ b/src/pair_hybrid.h @@ -28,13 +28,14 @@ class PairHybrid : public Pair { friend class ComputeSpin; friend class FixGPU; friend class FixIntel; - friend class FixOMP; friend class FixNVESpin; + friend class FixOMP; friend class Force; friend class Info; friend class Neighbor; - friend class Respa; friend class PairDeprecated; + friend class Respa; + friend class Scafacos; public: PairHybrid(class LAMMPS *); From 8b680d43e5c5a07b518ccac1886787b23db83a4b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 05:00:52 -0400 Subject: [PATCH 339/352] add pair style coul/exclude for use with kspace style scafacos --- src/EXTRA-PAIR/pair_coul_exclude.cpp | 303 +++++++++++++++++++++++++++ src/EXTRA-PAIR/pair_coul_exclude.h | 72 +++++++ 2 files changed, 375 insertions(+) create mode 100644 src/EXTRA-PAIR/pair_coul_exclude.cpp create mode 100644 src/EXTRA-PAIR/pair_coul_exclude.h diff --git a/src/EXTRA-PAIR/pair_coul_exclude.cpp b/src/EXTRA-PAIR/pair_coul_exclude.cpp new file mode 100644 index 0000000000..b9cdca78fa --- /dev/null +++ b/src/EXTRA-PAIR/pair_coul_exclude.cpp @@ -0,0 +1,303 @@ +// clang-format off +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "pair_coul_exclude.h" + +#include "atom.h" +#include "comm.h" +#include "error.h" +#include "force.h" +#include "memory.h" +#include "neigh_list.h" +#include "neighbor.h" + +#include +#include + +using namespace LAMMPS_NS; + +/* ---------------------------------------------------------------------- */ + +PairCoulExclude::PairCoulExclude(LAMMPS *lmp) : Pair(lmp) { + writedata = 1; +} + +/* ---------------------------------------------------------------------- */ + +PairCoulExclude::~PairCoulExclude() +{ + if (copymode) return; + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairCoulExclude::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum; + double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul,fpair; + double rsq,r2inv,rinv,forcecoul,factor_coul; + int *ilist,*jlist,*numneigh,**firstneigh; + + ecoul = 0.0; + ev_init(eflag,vflag); + + double **x = atom->x; + double **f = atom->f; + double *q = atom->q; + int nlocal = atom->nlocal; + double *special_coul = force->special_coul; + int newton_pair = force->newton_pair; + double qqrd2e = force->qqrd2e; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + qtmp = q[i]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + if (sbmask(j) == 0) continue; + factor_coul = special_coul[sbmask(j)] - 1.0; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + forcecoul = qqrd2e * qtmp*q[j]*rinv; + fpair = factor_coul*forcecoul * r2inv; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; + } + + if (eflag) + ecoul = factor_coul * qqrd2e * qtmp*q[j]*rinv; + + if (evflag) ev_tally(i,j,nlocal,newton_pair,0.0,ecoul,fpair,delx,dely,delz); + } + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairCoulExclude::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + memory->create(cutsq,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairCoulExclude::settings(int narg, char **arg) +{ + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + + cut_global = utils::numeric(FLERR,arg[0],false,lmp); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairCoulExclude::coeff(int narg, char **arg) +{ + if (narg != 2) + error->all(FLERR,"Incorrect args for pair coefficients"); + 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 count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairCoulExclude::init_style() +{ + if (!atom->q_flag) + error->all(FLERR,"Pair style coul/exclude requires atom attribute q"); + + neighbor->request(this,instance_me); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairCoulExclude::init_one(int i, int j) +{ + return cut_global; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairCoulExclude::write_restart(FILE *fp) +{ + write_restart_settings(fp); + + int i,j; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + fwrite(&setflag[i][j],sizeof(int),1,fp); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairCoulExclude::read_restart(FILE *fp) +{ + read_restart_settings(fp); + allocate(); + + int i,j; + int me = comm->me; + for (i = 1; i <= atom->ntypes; i++) { + for (j = i; j <= atom->ntypes; j++) { + if (me == 0) { + utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,nullptr,error); + } + MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairCoulExclude::write_restart_settings(FILE *fp) +{ + fwrite(&cut_global,sizeof(double),1,fp); + fwrite(&offset_flag,sizeof(int),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairCoulExclude::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + utils::sfread(FLERR,&cut_global,sizeof(double),1,fp,nullptr,error); + utils::sfread(FLERR,&offset_flag,sizeof(int),1,fp,nullptr,error); + utils::sfread(FLERR,&mix_flag,sizeof(int),1,fp,nullptr,error); + } + MPI_Bcast(&cut_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&offset_flag,1,MPI_INT,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to data file +------------------------------------------------------------------------- */ + +void PairCoulExclude::write_data(FILE *fp) +{ + for (int i = 1; i <= atom->ntypes; i++) + fprintf(fp,"%d\n",i); +} + +/* ---------------------------------------------------------------------- + proc 0 writes all pairs to data file +------------------------------------------------------------------------- */ + +void PairCoulExclude::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\n",i,j); +} + +/* ---------------------------------------------------------------------- */ + +double PairCoulExclude::single(int i, int j, int /*itype*/, int /*jtype*/, + double rsq, double factor_coul, double /*factor_lj*/, + double &fforce) +{ + double r2inv,rinv,forcecoul,phicoul; + + factor_coul -= 1.0; + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + forcecoul = force->qqrd2e * atom->q[i]*atom->q[j]*rinv; + fforce = factor_coul*forcecoul * r2inv; + + phicoul = force->qqrd2e * atom->q[i]*atom->q[j]*rinv; + return factor_coul*phicoul; +} + +/* ---------------------------------------------------------------------- */ + +void *PairCoulExclude::extract(const char *str, int &dim) +{ + dim = 0; + if (strcmp(str,"cut_coul") == 0) return (void *) &cut_global; + return nullptr; +} diff --git a/src/EXTRA-PAIR/pair_coul_exclude.h b/src/EXTRA-PAIR/pair_coul_exclude.h new file mode 100644 index 0000000000..38cd30cbb7 --- /dev/null +++ b/src/EXTRA-PAIR/pair_coul_exclude.h @@ -0,0 +1,72 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef PAIR_CLASS +// clang-format off +PairStyle(coul/exclude,PairCoulExclude); +// clang-format on +#else + +#ifndef LMP_PAIR_COUL_EXCLUDE_H +#define LMP_PAIR_COUL_EXCLUDE_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairCoulExclude : public Pair { + public: + PairCoulExclude(class LAMMPS *); + virtual ~PairCoulExclude(); + virtual void compute(int, int); + virtual void settings(int, char **); + virtual void coeff(int, char **); + void init_style(); + double init_one(int, int); + void write_restart(FILE *); + void read_restart(FILE *); + virtual void write_restart_settings(FILE *); + virtual void read_restart_settings(FILE *); + virtual void write_data(FILE *); + virtual void write_data_all(FILE *); + virtual double single(int, int, int, int, double, double, double, double &); + virtual void *extract(const char *, int &); + + protected: + double cut_global; + + virtual void allocate(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Illegal ... command + +Self-explanatory. Check the input script syntax and compare to the +documentation for the command. You can use -echo screen as a +command-line option when running LAMMPS to see the offending line. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair style coul/cut requires atom attribute q + +The atom style defined does not have these attributes. + +*/ From 093fbfd4b5337937fd4f47d4cd7e41445559103d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 05:25:36 -0400 Subject: [PATCH 340/352] add documentation for pair style coul/exclude --- doc/src/Commands_pair.rst | 1 + doc/src/Developer_utils.rst | 2 +- doc/src/pair_coul.rst | 21 +++++++++++++++++++++ doc/src/pair_style.rst | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/doc/src/Commands_pair.rst b/doc/src/Commands_pair.rst index 184fb25300..7cf4e7635b 100644 --- a/doc/src/Commands_pair.rst +++ b/doc/src/Commands_pair.rst @@ -75,6 +75,7 @@ OPT. * :doc:`coul/debye (gko) ` * :doc:`coul/diel (o) ` * :doc:`coul/dsf (gko) ` + * :doc:`coul/exclude ` * :doc:`coul/long (gko) ` * :doc:`coul/long/cs (g) ` * :doc:`coul/long/dielectric ` diff --git a/doc/src/Developer_utils.rst b/doc/src/Developer_utils.rst index 60eded42e0..e419520edd 100644 --- a/doc/src/Developer_utils.rst +++ b/doc/src/Developer_utils.rst @@ -336,7 +336,7 @@ repetitive tasks. The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction for parsing references to compute or fix styles, variables or custom integer or double properties handled by :doc:`fix property/atom `. -These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2_" +These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2\_" followed by the ID or name of than instance and may be postfixed with one or two array indices "[]" with numbers > 0. diff --git a/doc/src/pair_coul.rst b/doc/src/pair_coul.rst index 990458887d..4e0793467b 100644 --- a/doc/src/pair_coul.rst +++ b/doc/src/pair_coul.rst @@ -10,6 +10,7 @@ .. index:: pair_style coul/dsf/gpu .. index:: pair_style coul/dsf/kk .. index:: pair_style coul/dsf/omp +.. index:: pair_style coul/exclude .. index:: pair_style coul/cut/global .. index:: pair_style coul/cut/global/omp .. index:: pair_style coul/long @@ -42,6 +43,9 @@ pair_style coul/dsf command Accelerator Variants: *coul/dsf/gpu*, *coul/dsf/kk*, *coul/dsf/omp* +pair_style coul/exclude command +=============================== + pair_style coul/cut/global command ================================== @@ -83,6 +87,7 @@ Syntax pair_style coul/cut cutoff pair_style coul/debye kappa cutoff pair_style coul/dsf alpha cutoff + pair_style coul/exclude cutoff pair_style coul/cut/global cutoff pair_style coul/long cutoff pair_style coul/wolf alpha cutoff @@ -110,6 +115,9 @@ Examples pair_style coul/dsf 0.05 10.0 pair_coeff * * + pair_style hybrid/overlay coul/exclude 10.0 ... + pair_coeff * * coul/exclude + pair_style coul/long 10.0 pair_coeff * * @@ -257,6 +265,19 @@ as style *coul/cut* except that it allows only a single global cutoff and thus makes it compatible for use in combination with long-range coulomb styles in :doc:`hybrid pair styles `. +Pair style *coul/exclude* computes Coulombic interactions like *coul/cut* +but **only** applies them to excluded pairs using a scaling factor +of :math:`\gamma - 1.0` with :math:`\gamma` being the factor assigned +to that excluded pair via the :doc:`special_bonds coul ` +setting. With this it is possible to treat Coulomb interactions for +molecular systems with :doc:`kspace style scafacos `, +which always computes the *full* Coulomb interactions without exclusions. +Pair style *coul/exclude* will then *subtract* the excluded interactions +accordingly. So to achieve the same forces as with ``pair_style lj/cut/coul/long 12.0`` +with ``kspace_style pppm 1.0e-6``, one would use +``pair_style hybrid/overlay lj/cut 12.0 coul/exclude 12.0`` with +``kspace_style scafacos p3m 1.0e-6``. + Styles *coul/long* and *coul/msm* compute the same Coulombic interactions as style *coul/cut* except that an additional damping factor is applied so it can be used in conjunction with the diff --git a/doc/src/pair_style.rst b/doc/src/pair_style.rst index 7677cd9535..1cf033ddba 100644 --- a/doc/src/pair_style.rst +++ b/doc/src/pair_style.rst @@ -139,6 +139,7 @@ accelerated styles exist. * :doc:`coul/debye ` - cutoff Coulomb potential with Debye screening * :doc:`coul/diel ` - Coulomb potential with dielectric permittivity * :doc:`coul/dsf ` - Coulomb with damped-shifted-force model +* :doc:`coul/exclude ` - subtract Coulomb potential for excluded pairs * :doc:`coul/long ` - long-range Coulomb potential * :doc:`coul/long/cs ` - long-range Coulomb potential and core/shell * :doc:`coul/long/dielectric ` - From 23231118d1b378becc09ebeeefa4324efeb0d8e7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 05:29:54 -0400 Subject: [PATCH 341/352] add a couple explanatory comments --- src/EXTRA-PAIR/pair_coul_exclude.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/EXTRA-PAIR/pair_coul_exclude.cpp b/src/EXTRA-PAIR/pair_coul_exclude.cpp index b9cdca78fa..404fc9c784 100644 --- a/src/EXTRA-PAIR/pair_coul_exclude.cpp +++ b/src/EXTRA-PAIR/pair_coul_exclude.cpp @@ -83,8 +83,12 @@ void PairCoulExclude::compute(int eflag, int vflag) for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; + + // skip over all non-excluded pairs and subtract excluded coulomb + if (sbmask(j) == 0) continue; factor_coul = special_coul[sbmask(j)] - 1.0; + j &= NEIGHMASK; delx = xtmp - x[j][0]; @@ -283,7 +287,7 @@ double PairCoulExclude::single(int i, int j, int /*itype*/, int /*jtype*/, { double r2inv,rinv,forcecoul,phicoul; - factor_coul -= 1.0; + factor_coul -= 1.0; // we want to subtract the excluded coulomb r2inv = 1.0/rsq; rinv = sqrt(r2inv); forcecoul = force->qqrd2e * atom->q[i]*atom->q[j]*rinv; From 11b4ae641f75b9d70060251e46e12d58ffc63bed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 05:46:12 -0400 Subject: [PATCH 342/352] add unit test for pair style coul/exclude --- .../tests/mol-pair-coul_exclude.yaml | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 unittest/force-styles/tests/mol-pair-coul_exclude.yaml diff --git a/unittest/force-styles/tests/mol-pair-coul_exclude.yaml b/unittest/force-styles/tests/mol-pair-coul_exclude.yaml new file mode 100644 index 0000000000..e3bfb9dfc8 --- /dev/null +++ b/unittest/force-styles/tests/mol-pair-coul_exclude.yaml @@ -0,0 +1,87 @@ +--- +lammps_version: 30 Jul 2021 +date_generated: Thu Aug 19 05:44:56 2021 +epsilon: 5e-14 +skip_tests: +prerequisites: ! | + atom full + pair coul/exclude +pre_commands: ! "" +post_commands: ! | + pair_modify mix arithmetic +input_file: in.fourmol +pair_style: coul/exclude 8.0 +pair_coeff: ! | + * * +extract: ! | + cut_coul 0 +natoms: 29 +init_vdwl: 0 +init_coul: 976.7662140166423 +init_stress: ! |2- + 3.5388948320536065e+02 2.5335487380105781e+02 3.6952185701022364e+02 1.3686424356022002e+02 8.7895961622382046e+01 -5.5657699252762978e+00 +init_forces: ! |2 + 1 -2.1370477255985712e+01 -1.4166598766893758e+01 2.9310440052146326e+01 + 2 2.3264732430469657e+01 1.5692001202883613e+01 -2.8641449819420849e+01 + 3 2.2449042305615680e-01 1.4668967160440745e+00 5.1210039450899436e-01 + 4 -7.0490395531893513e-01 -1.3264719224865684e+00 -8.1217625652904202e-01 + 5 -8.8255242947367551e-01 -2.5499496555354710e+00 -1.1751860565740935e-01 + 6 -2.5789282115617354e+01 2.5922083376147825e+01 3.9284668116535428e+01 + 7 6.5887213922755370e+00 -1.1379710951282684e+01 -4.1569698240745815e+01 + 8 1.0165793608296209e+01 -1.9732745647894593e+01 -3.1168434006878172e+01 + 9 6.2278611600582163e+00 7.5490085322004052e+00 3.6053658984732728e+01 + 10 2.9613956094579899e+00 -6.6704022762728634e+00 7.0753413211731742e-01 + 11 7.6925511893250798e-01 -1.0660633894890499e+00 1.5916232833331401e+00 + 12 -2.6730309790123474e+00 1.0151505797685552e+00 2.4428922002007205e+00 + 13 4.2028736668256519e+00 -2.3945364969381782e+00 2.2608110571641327e-01 + 14 -1.0444805762876637e+00 -2.1692594974964866e-01 -4.5361664712630878e+00 + 15 1.0294632170564109e+00 4.2802145197407322e+00 1.1966180837917026e+00 + 16 1.6139881756442762e+01 -1.2595226879230463e+01 -4.8159451500674258e+01 + 17 -1.9109741071175417e+01 1.6173277008988080e+01 4.3679278548085868e+01 + 18 -5.5233108291167312e+00 -3.1467038458483600e+01 1.1751414157603500e+02 + 19 -4.8039195406996384e+01 -2.8078667518868457e+01 -6.9999907578978252e+01 + 20 5.3562506236113109e+01 5.9545705977352057e+01 -4.7514233997056749e+01 + 21 -3.2000540242879481e+01 -3.9305792536444351e+01 1.1575486824768517e+02 + 22 -4.1655033980718414e+01 -6.9415565144852787e+00 -8.1937970834963011e+01 + 23 7.3655574223597895e+01 4.6247349050929628e+01 -3.3816897412722149e+01 + 24 2.5133287180289841e+01 -1.0428031336996401e+02 6.0768019640810614e+01 + 25 -6.6553531734748447e+01 2.0322561261478373e+01 -5.9750075573899906e+01 + 26 4.1420244554458598e+01 8.3957752108485636e+01 -1.0179440669107107e+00 + 27 1.6184779133783991e+01 -1.1478028188716922e+02 4.0330521475487721e+01 + 28 -6.9426784473130638e+01 4.0320458958275808e+01 -4.9831480196977843e+01 + 29 5.3242005339346647e+01 7.4459822928893402e+01 9.5009587214901217e+00 +run_vdwl: 0 +run_coul: 976.5089740760076 +run_stress: ! |2- + 3.5429311069548726e+02 2.5338890902230719e+02 3.6882695435821336e+02 1.3697994178745301e+02 8.8376897487416215e+01 -4.7604760003034263e+00 +run_forces: ! |2 + 1 -2.1374527865789219e+01 -1.4202468442180830e+01 2.9210793601587412e+01 + 2 2.3263825454132370e+01 1.5734731460617787e+01 -2.8542033985914678e+01 + 3 2.2462585109904795e-01 1.4683529055153852e+00 5.1240421813750503e-01 + 4 -7.0182458619184773e-01 -1.3247801518720248e+00 -8.0930989810165044e-01 + 5 -8.8184812299538406e-01 -2.5499921086303359e+00 -1.1763132809557786e-01 + 6 -2.5769520757000304e+01 2.5925263738943752e+01 3.9219964964514880e+01 + 7 6.5906098601140588e+00 -1.1393221625638784e+01 -4.1479783467188192e+01 + 8 1.0136770975699770e+01 -1.9687788806065537e+01 -3.1157177158436330e+01 + 9 6.2325131117568873e+00 7.5029136682374347e+00 3.6011266563600110e+01 + 10 2.9627918492957752e+00 -6.6677419862633922e+00 7.1111494624978899e-01 + 11 7.6684242658501378e-01 -1.0650907890115915e+00 1.5865397504820036e+00 + 12 -2.6640875675365687e+00 1.0092746068515972e+00 2.4201156771591061e+00 + 13 4.2020911135059107e+00 -2.3836918937522000e+00 2.2652733116436718e-01 + 14 -1.0435191142174847e+00 -2.2501596985534378e-01 -4.5261002002201831e+00 + 15 1.0232065551846687e+00 4.2815515515559763e+00 1.2073921411042297e+00 + 16 1.6133578122629647e+01 -1.2611941628990227e+01 -4.8150714173103566e+01 + 17 -1.9101527306272342e+01 1.6189645470538316e+01 4.3676631017060792e+01 + 18 -5.0679097498234569e+00 -3.0925377041375377e+01 1.1693070865584599e+02 + 19 -4.8160088791916564e+01 -2.8252999531559283e+01 -6.9934716985727633e+01 + 20 5.3227998541740021e+01 5.9178376572934660e+01 -4.6995991670118372e+01 + 21 -3.2023145472732139e+01 -3.9029459539316420e+01 1.1553537552520324e+02 + 22 -4.1759300667456344e+01 -7.0799675491211342e+00 -8.1817190857460076e+01 + 23 7.3782446140188483e+01 4.6109427088437556e+01 -3.3718184667743166e+01 + 24 2.5304219247242145e+01 -1.0428415260557270e+02 6.0810156089628336e+01 + 25 -6.6772835122638725e+01 2.0222909012153103e+01 -5.9945279201780089e+01 + 26 4.1468615875396580e+01 8.4061243593419590e+01 -8.6487688784824801e-01 + 27 1.6328783769519674e+01 -1.1474592950014997e+02 4.0113097823544649e+01 + 28 -6.9456403419277834e+01 4.0310251785996094e+01 -4.9735673433675416e+01 + 29 5.3127619649758152e+01 7.4435677714153883e+01 9.6225756101307667e+00 +... From 7046b758619faa04c76af89614e1ea48150ebb19 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 10:06:34 -0400 Subject: [PATCH 343/352] remove evil tabs --- src/ML-RANN/rann_fingerprint_bond.cpp | 6 +- src/ML-RANN/rann_fingerprint_bondscreened.cpp | 12 +- src/OPENMP/npair_full_multi_omp.cpp | 50 ++++---- src/OPENMP/npair_half_multi_newtoff_omp.cpp | 16 +-- src/OPENMP/npair_half_multi_newton_omp.cpp | 110 +++++++++--------- .../npair_half_multi_newton_tri_omp.cpp | 56 ++++----- .../npair_half_size_multi_newtoff_omp.cpp | 36 +++--- .../npair_half_size_multi_newton_omp.cpp | 80 ++++++------- .../npair_half_size_multi_newton_tri_omp.cpp | 40 +++---- src/nbin_multi.cpp | 4 +- src/npair_full_multi.cpp | 48 ++++---- src/npair_half_multi_newtoff.cpp | 14 +-- src/npair_half_multi_newton.cpp | 110 +++++++++--------- src/npair_half_multi_newton_tri.cpp | 54 ++++----- src/npair_half_size_multi_newtoff.cpp | 34 +++--- src/npair_half_size_multi_newton.cpp | 76 ++++++------ src/npair_half_size_multi_newton_tri.cpp | 40 +++---- src/nstencil.cpp | 4 +- src/nstencil_full_multi_2d.cpp | 2 +- src/nstencil_full_multi_3d.cpp | 4 +- src/nstencil_half_multi_2d.cpp | 4 +- src/nstencil_half_multi_2d_tri.cpp | 6 +- src/nstencil_half_multi_3d.cpp | 12 +- src/nstencil_half_multi_3d_tri.cpp | 6 +- 24 files changed, 412 insertions(+), 412 deletions(-) diff --git a/src/ML-RANN/rann_fingerprint_bond.cpp b/src/ML-RANN/rann_fingerprint_bond.cpp index 4b96a4f39d..f5912324cd 100644 --- a/src/ML-RANN/rann_fingerprint_bond.cpp +++ b/src/ML-RANN/rann_fingerprint_bond.cpp @@ -591,8 +591,8 @@ void Fingerprint_bond::do3bodyfeatureset_doubleneighborloop(double * features,do delz = zn[jj]; rsq = delx*delx + dely*dely + delz*delz; if (rsq>rc*rc) { - expr[jj][0]=0; - continue; + expr[jj][0]=0; + continue; } double r1 = (rsq*((double)res)*cutinv2); int m1 = (int)r1; @@ -603,7 +603,7 @@ void Fingerprint_bond::do3bodyfeatureset_doubleneighborloop(double * features,do double *p2 = &expcuttable[(m1+1)*kmax]; double *p3 = &expcuttable[(m1+2)*kmax]; for (kk=0;kkrc*rc) { - expr[jj][0]=0; - continue; + expr[jj][0]=0; + continue; } double r1 = (rsq*((double)res)*cutinv2); int m1 = (int)r1; @@ -647,8 +647,8 @@ void Fingerprint_bondscreened::do3bodyfeatureset_doubleneighborloop(double * fea double *p2 = &expcuttable[(m1+1)*kmax]; double *p3 = &expcuttable[(m1+2)*kmax]; for (kk=0;kk= 0; j = bins[j]) { - if (i == j) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + if (i == j) continue; jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } } diff --git a/src/OPENMP/npair_half_multi_newtoff_omp.cpp b/src/OPENMP/npair_half_multi_newtoff_omp.cpp index 852f87d5b5..d4a63cb9e8 100644 --- a/src/OPENMP/npair_half_multi_newtoff_omp.cpp +++ b/src/OPENMP/npair_half_multi_newtoff_omp.cpp @@ -102,7 +102,7 @@ void NPairHalfMultiNewtoffOmp::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in other bins in stencil including self // only store pair if i < j @@ -114,16 +114,16 @@ void NPairHalfMultiNewtoffOmp::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - if (j <= i) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + if (j <= i) continue; jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { diff --git a/src/OPENMP/npair_half_multi_newton_omp.cpp b/src/OPENMP/npair_half_multi_newton_omp.cpp index d78df77bec..9ad740a043 100644 --- a/src/OPENMP/npair_half_multi_newton_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_omp.cpp @@ -101,7 +101,7 @@ void NPairHalfMultiNewtonOmp::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // if same size: uses half stencil so check central bin if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -117,41 +117,41 @@ void NPairHalfMultiNewtonOmp::build(NeighList *list) // if j is owned atom, store it if j > i // if j is ghost, only store if j coords are "above and to the right" of i - for (j = js; j >= 0; j = bins[j]) { + for (j = js; j >= 0; j = bins[j]) { if ((icollection != jcollection) && (j < i)) continue; - if (j >= nlocal) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } - } + if (j >= nlocal) { + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } // for all collections, loop over all atoms in other bins in stencil, store every pair @@ -159,38 +159,38 @@ void NPairHalfMultiNewtonOmp::build(NeighList *list) // stencil is half if i same size as j // stencil is full if i smaller than j - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[i] = i; diff --git a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp index a453851c4c..71f1605366 100644 --- a/src/OPENMP/npair_half_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_multi_newton_tri_omp.cpp @@ -102,7 +102,7 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -113,12 +113,12 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { // if same size (same collection), use half stencil if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -133,30 +133,30 @@ void NPairHalfMultiNewtonTriOmp::build(NeighList *list) } jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[i] = i; diff --git a/src/OPENMP/npair_half_size_multi_newtoff_omp.cpp b/src/OPENMP/npair_half_size_multi_newtoff_omp.cpp index c774d4a0a8..da2d7a7590 100644 --- a/src/OPENMP/npair_half_size_multi_newtoff_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newtoff_omp.cpp @@ -92,7 +92,7 @@ void NPairHalfSizeMultiNewtoffOmp::build(NeighList *list) // if same collection use own bin if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in other bins in stencil including self // only store pair if i < j @@ -104,27 +104,27 @@ void NPairHalfSizeMultiNewtoffOmp::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >=0; j = bins[j]) { - if (j <= i) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >=0; j = bins[j]) { + if (j <= i) continue; jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } } } diff --git a/src/OPENMP/npair_half_size_multi_newton_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_omp.cpp index f9e4c95030..cdc68e1b42 100644 --- a/src/OPENMP/npair_half_size_multi_newton_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_omp.cpp @@ -91,7 +91,7 @@ void NPairHalfSizeMultiNewtonOmp::build(NeighList *list) // if same collection use own bin if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // if same size: uses half stencil so check central bin if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -107,33 +107,33 @@ void NPairHalfSizeMultiNewtonOmp::build(NeighList *list) // if j is owned atom, store it if j > i // if j is ghost, only store if j coords are "above and to the right" of i - for (j = js; j >= 0; j = bins[j]) { + for (j = js; j >= 0; j = bins[j]) { if(icollection != jcollection and j < i) continue; - if (j >= nlocal) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } - } + if (j >= nlocal) { + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } } } @@ -142,31 +142,31 @@ void NPairHalfSizeMultiNewtonOmp::build(NeighList *list) // stencil is half if i same size as j // stencil is full if i smaller than j - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { jtype = type[j]; - if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; + if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } + } } ilist[i] = i; diff --git a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp index b9a914078f..d38e52fe18 100644 --- a/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp +++ b/src/OPENMP/npair_half_size_multi_newton_tri_omp.cpp @@ -92,7 +92,7 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) // if same collection use own bin if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil @@ -104,12 +104,12 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { // if same size (same collection), use half stencil if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -126,21 +126,21 @@ void NPairHalfSizeMultiNewtonTriOmp::build(NeighList *list) jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } + } } ilist[i] = i; diff --git a/src/nbin_multi.cpp b/src/nbin_multi.cpp index 1ddb1d69bd..c58f2b9a94 100644 --- a/src/nbin_multi.cpp +++ b/src/nbin_multi.cpp @@ -202,7 +202,7 @@ void NBinMulti::setup_bins(int /*style*/) // test for too many global bins in any dimension due to huge global domain if (bbox[0]*binsizeinv > MAXSMALLINT || bbox[1]*binsizeinv > MAXSMALLINT || - bbox[2]*binsizeinv > MAXSMALLINT) + bbox[2]*binsizeinv > MAXSMALLINT) error->all(FLERR,"Domain too large for neighbor bins"); // create actual bins @@ -233,7 +233,7 @@ void NBinMulti::setup_bins(int /*style*/) bininvz_multi[n] = 1.0 / binsizez_multi[n]; if (binsize_optimal*bininvx_multi[n] > CUT2BIN_RATIO || - binsize_optimal*bininvy_multi[n] > CUT2BIN_RATIO) + binsize_optimal*bininvy_multi[n] > CUT2BIN_RATIO) error->all(FLERR,"Cannot use neighbor bins - box size << cutoff"); if ((dimension == 3) && (binsize_optimal*bininvz_multi[n] > CUT2BIN_RATIO)) error->all(FLERR,"Cannot use neighbor bins - box size << cutoff"); diff --git a/src/npair_full_multi.cpp b/src/npair_full_multi.cpp index 6a9ba8e700..34b7a7bfa8 100644 --- a/src/npair_full_multi.cpp +++ b/src/npair_full_multi.cpp @@ -89,7 +89,7 @@ void NPairFullMulti::build(NeighList *list) // if same collection use own bin if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in surrounding bins in stencil including self // skip i = j @@ -99,34 +99,34 @@ void NPairFullMulti::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - if (i == j) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + if (i == j) continue; jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } } diff --git a/src/npair_half_multi_newtoff.cpp b/src/npair_half_multi_newtoff.cpp index 9aa9628fd6..cef28f4cb4 100644 --- a/src/npair_half_multi_newtoff.cpp +++ b/src/npair_half_multi_newtoff.cpp @@ -91,7 +91,7 @@ void NPairHalfMultiNewtoff::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in other bins in stencil including self // only store pair if i < j @@ -103,16 +103,16 @@ void NPairHalfMultiNewtoff::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - if (j <= i) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + if (j <= i) continue; jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; rsq = delx*delx + dely*dely + delz*delz; if (rsq <= cutneighsq[itype][jtype]) { diff --git a/src/npair_half_multi_newton.cpp b/src/npair_half_multi_newton.cpp index 3b1b34579b..3ee4ce5fde 100644 --- a/src/npair_half_multi_newton.cpp +++ b/src/npair_half_multi_newton.cpp @@ -90,7 +90,7 @@ void NPairHalfMultiNewton::build(NeighList *list) // if same collection use own bin if(icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // if same size: uses half stencil so check central bin if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -106,41 +106,41 @@ void NPairHalfMultiNewton::build(NeighList *list) // if j is owned atom, store it if j > i // if j is ghost, only store if j coords are "above and to the right" of i - for (j = js; j >= 0; j = bins[j]) { + for (j = js; j >= 0; j = bins[j]) { if((icollection != jcollection) && (j < i)) continue; - if (j >= nlocal) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } - } + if (j >= nlocal) { + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } } // for all collections, loop over all atoms in other bins in stencil, store every pair @@ -148,38 +148,38 @@ void NPairHalfMultiNewton::build(NeighList *list) // stencil is half if i same size as j // stencil is full if i smaller than j - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_multi_newton_tri.cpp b/src/npair_half_multi_newton_tri.cpp index 4cc88a3755..4a8bb8e19f 100644 --- a/src/npair_half_multi_newton_tri.cpp +++ b/src/npair_half_multi_newton_tri.cpp @@ -90,7 +90,7 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -101,12 +101,12 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { // if same size (same collection), use half stencil if(cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -123,28 +123,28 @@ void NPairHalfMultiNewtonTri::build(NeighList *list) jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; - if (rsq <= cutneighsq[itype][jtype]) { - if (molecular != Atom::ATOMIC) { - if (!moltemplate) - which = find_special(special[i],nspecial[i],tag[j]); - else if (imol >= 0) - which = find_special(onemols[imol]->special[iatom], - onemols[imol]->nspecial[iatom], - tag[j]-tagprev); - else which = 0; - if (which == 0) neighptr[n++] = j; - else if (domain->minimum_image_check(delx,dely,delz)) - neighptr[n++] = j; - else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); - } else neighptr[n++] = j; - } - } - } + if (rsq <= cutneighsq[itype][jtype]) { + if (molecular != Atom::ATOMIC) { + if (!moltemplate) + which = find_special(special[i],nspecial[i],tag[j]); + else if (imol >= 0) + which = find_special(onemols[imol]->special[iatom], + onemols[imol]->nspecial[iatom], + tag[j]-tagprev); + else which = 0; + if (which == 0) neighptr[n++] = j; + else if (domain->minimum_image_check(delx,dely,delz)) + neighptr[n++] = j; + else if (which > 0) neighptr[n++] = j ^ (which << SBBITS); + } else neighptr[n++] = j; + } + } + } } ilist[inum++] = i; diff --git a/src/npair_half_size_multi_newtoff.cpp b/src/npair_half_size_multi_newtoff.cpp index f11f8c49cc..cb06ddfb6f 100644 --- a/src/npair_half_size_multi_newtoff.cpp +++ b/src/npair_half_size_multi_newtoff.cpp @@ -81,7 +81,7 @@ void NPairHalfSizeMultiNewtoff::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in other bins in stencil including self // only store pair if i < j @@ -93,27 +93,27 @@ void NPairHalfSizeMultiNewtoff::build(NeighList *list) ns = nstencil_multi[icollection][jcollection]; for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { - if (j <= i) continue; + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { + if (j <= i) continue; jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } } } diff --git a/src/npair_half_size_multi_newton.cpp b/src/npair_half_size_multi_newton.cpp index 376bf5f3b4..8af60aa435 100644 --- a/src/npair_half_size_multi_newton.cpp +++ b/src/npair_half_size_multi_newton.cpp @@ -78,7 +78,7 @@ void NPairHalfSizeMultiNewton::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // if same size: uses half stencil so check central bin if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -94,33 +94,33 @@ void NPairHalfSizeMultiNewton::build(NeighList *list) // if j is owned atom, store it if j > i // if j is ghost, only store if j coords are "above and to the right" of i - for (j = js; j >= 0; j = bins[j]) { + for (j = js; j >= 0; j = bins[j]) { if ((icollection != jcollection) && (j < i)) continue; - if (j >= nlocal) { - if (x[j][2] < ztmp) continue; - if (x[j][2] == ztmp) { - if (x[j][1] < ytmp) continue; - if (x[j][1] == ytmp && x[j][0] < xtmp) continue; - } - } + if (j >= nlocal) { + if (x[j][2] < ztmp) continue; + if (x[j][2] == ztmp) { + if (x[j][1] < ytmp) continue; + if (x[j][1] == ytmp && x[j][0] < xtmp) continue; + } + } jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } } } @@ -129,30 +129,30 @@ void NPairHalfSizeMultiNewton::build(NeighList *list) // stencil is half if i same size as j // stencil is full if i smaller than j - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } } } diff --git a/src/npair_half_size_multi_newton_tri.cpp b/src/npair_half_size_multi_newton_tri.cpp index 6b96fd4849..20d4d8b421 100644 --- a/src/npair_half_size_multi_newton_tri.cpp +++ b/src/npair_half_size_multi_newton_tri.cpp @@ -78,7 +78,7 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // if same collection use own bin if (icollection == jcollection) jbin = ibin; - else jbin = coord2bin(x[i], jcollection); + else jbin = coord2bin(x[i], jcollection); // loop over all atoms in bins in stencil // stencil is empty if i larger than j @@ -89,12 +89,12 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) // (equal zyx and j <= i) // latter excludes self-self interaction but allows superposed atoms - s = stencil_multi[icollection][jcollection]; - ns = nstencil_multi[icollection][jcollection]; + s = stencil_multi[icollection][jcollection]; + ns = nstencil_multi[icollection][jcollection]; - for (k = 0; k < ns; k++) { - js = binhead_multi[jcollection][jbin + s[k]]; - for (j = js; j >= 0; j = bins[j]) { + for (k = 0; k < ns; k++) { + js = binhead_multi[jcollection][jbin + s[k]]; + for (j = js; j >= 0; j = bins[j]) { // if same size (same collection), use half stencil if (cutcollectionsq[icollection][icollection] == cutcollectionsq[jcollection][jcollection]){ @@ -111,21 +111,21 @@ void NPairHalfSizeMultiNewtonTri::build(NeighList *list) jtype = type[j]; if (exclude && exclusion(i,j,itype,jtype,mask,molecule)) continue; - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - radsum = radi + radius[j]; - cutdistsq = (radsum+skin) * (radsum+skin); + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + radsum = radi + radius[j]; + cutdistsq = (radsum+skin) * (radsum+skin); - if (rsq <= cutdistsq) { - if (history && rsq < radsum*radsum) - neighptr[n++] = j ^ mask_history; - else - neighptr[n++] = j; - } - } - } + if (rsq <= cutdistsq) { + if (history && rsq < radsum*radsum) + neighptr[n++] = j ^ mask_history; + else + neighptr[n++] = j; + } + } + } } ilist[inum++] = i; diff --git a/src/nstencil.cpp b/src/nstencil.cpp index 3d1f71a890..fdd0ddfb1b 100644 --- a/src/nstencil.cpp +++ b/src/nstencil.cpp @@ -335,7 +335,7 @@ void NStencil::create_setup() for (i = 0; i < n; ++i) { stencil_multi[i] = new int*[n](); for (j = 0; j < n; ++j) { - maxstencil_multi[i][j] = 0; + maxstencil_multi[i][j] = 0; nstencil_multi[i][j] = 0; stencil_multi[i][j] = nullptr; } @@ -390,7 +390,7 @@ void NStencil::create_setup() if(stencil_multi[i][j]) memory->destroy(stencil_multi[i][j]); memory->create(stencil_multi[i][j], smax, - "neighstencil::stencil_multi"); + "neighstencil::stencil_multi"); } } } diff --git a/src/nstencil_full_multi_2d.cpp b/src/nstencil_full_multi_2d.cpp index 7899ce7ad1..893798ce31 100644 --- a/src/nstencil_full_multi_2d.cpp +++ b/src/nstencil_full_multi_2d.cpp @@ -77,7 +77,7 @@ void NStencilFullMulti2d::create() for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i,j,0,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; + stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; nstencil_multi[icollection][jcollection] = ns; } diff --git a/src/nstencil_full_multi_3d.cpp b/src/nstencil_full_multi_3d.cpp index 746906bf47..3265dac884 100644 --- a/src/nstencil_full_multi_3d.cpp +++ b/src/nstencil_full_multi_3d.cpp @@ -80,8 +80,8 @@ void NStencilFullMulti3d::create() for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance_multi(i,j,k,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = + if (bin_distance_multi(i,j,k,bin_collection) < cutsq) + stencil_multi[icollection][jcollection][ns++] = k*mbiny*mbinx + j*mbinx + i; nstencil_multi[icollection][jcollection] = ns; diff --git a/src/nstencil_half_multi_2d.cpp b/src/nstencil_half_multi_2d.cpp index 3428388ef1..ebcf26b290 100644 --- a/src/nstencil_half_multi_2d.cpp +++ b/src/nstencil_half_multi_2d.cpp @@ -92,12 +92,12 @@ void NStencilHalfMulti2d::create() if (j > 0 || (j == 0 && i > 0)) { if (bin_distance_multi(i,j,0,bin_collection) < cutsq) stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; - } + } } else { for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i,j,0,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; + stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; } nstencil_multi[icollection][jcollection] = ns; diff --git a/src/nstencil_half_multi_2d_tri.cpp b/src/nstencil_half_multi_2d_tri.cpp index 5b647902fb..621e033fb6 100644 --- a/src/nstencil_half_multi_2d_tri.cpp +++ b/src/nstencil_half_multi_2d_tri.cpp @@ -90,12 +90,12 @@ void NStencilHalfMulti2dTri::create() for (j = 0; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i,j,0,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; + stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; } else { for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance_multi(i,j,0,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; + if (bin_distance_multi(i,j,0,bin_collection) < cutsq) + stencil_multi[icollection][jcollection][ns++] = j*mbinx + i; } nstencil_multi[icollection][jcollection] = ns; diff --git a/src/nstencil_half_multi_3d.cpp b/src/nstencil_half_multi_3d.cpp index 3623fd14ea..a3392f164a 100644 --- a/src/nstencil_half_multi_3d.cpp +++ b/src/nstencil_half_multi_3d.cpp @@ -92,17 +92,17 @@ void NStencilHalfMulti3d::create() for (k = 0; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (k > 0 || j > 0 || (j == 0 && i > 0)) { - if (bin_distance_multi(i,j,k,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = + if (k > 0 || j > 0 || (j == 0 && i > 0)) { + if (bin_distance_multi(i,j,k,bin_collection) < cutsq) + stencil_multi[icollection][jcollection][ns++] = k*mbiny*mbinx + j*mbinx + i; - } + } } else { for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance_multi(i,j,k,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = + if (bin_distance_multi(i,j,k,bin_collection) < cutsq) + stencil_multi[icollection][jcollection][ns++] = k*mbiny*mbinx + j*mbinx + i; } diff --git a/src/nstencil_half_multi_3d_tri.cpp b/src/nstencil_half_multi_3d_tri.cpp index 9a680cf610..160d04bd61 100644 --- a/src/nstencil_half_multi_3d_tri.cpp +++ b/src/nstencil_half_multi_3d_tri.cpp @@ -93,14 +93,14 @@ void NStencilHalfMulti3dTri::create() for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) if (bin_distance_multi(i,j,k,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = + stencil_multi[icollection][jcollection][ns++] = k*mbiny*mbinx + j*mbinx + i; } else { for (k = -sz; k <= sz; k++) for (j = -sy; j <= sy; j++) for (i = -sx; i <= sx; i++) - if (bin_distance_multi(i,j,k,bin_collection) < cutsq) - stencil_multi[icollection][jcollection][ns++] = + if (bin_distance_multi(i,j,k,bin_collection) < cutsq) + stencil_multi[icollection][jcollection][ns++] = k*mbiny*mbinx + j*mbinx + i; } From 8aeaa829097970b8f15befd4be421f41ae652faa Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 11:08:04 -0400 Subject: [PATCH 344/352] improve error message --- src/pair_hybrid.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index 550f5c6873..0ba16f29fa 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -581,18 +581,17 @@ void PairHybrid::init_style() for (i = 1; i < 4; ++i) { if (((force->special_lj[i] == 0.0) || (force->special_lj[i] == 1.0)) && (force->special_lj[i] != special_lj[istyle][i])) - error->all(FLERR,"Pair_modify special setting for pair hybrid " - "incompatible with global special_bonds setting"); + error->all(FLERR,"Pair_modify special lj 1-{} setting for pair hybrid substyle {} " + "incompatible with global special_bonds setting", i+1, keywords[istyle]); } } if (special_coul[istyle]) { for (i = 1; i < 4; ++i) { - if (((force->special_coul[i] == 0.0) - || (force->special_coul[i] == 1.0)) + if (((force->special_coul[i] == 0.0) || (force->special_coul[i] == 1.0)) && (force->special_coul[i] != special_coul[istyle][i])) - error->all(FLERR,"Pair_modify special setting for pair hybrid " - "incompatible with global special_bonds setting"); + error->all(FLERR,"Pair_modify special coul 1-{} setting for pair hybrid substyle {} " + "incompatible with global special_bonds setting", i+1, keywords[istyle]); } } } From 9470a0eeb669bf308a7d694f71df5a3ff3547ee8 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 11:34:25 -0600 Subject: [PATCH 345/352] clarified doc pages for fix property/atom and read_data --- doc/src/fix_property_atom.rst | 18 +++++++++++------- doc/src/read_data.rst | 22 +++++++++++----------- src/dump_custom.cpp | 2 -- src/read_data.cpp | 33 ++++++++++++++++----------------- src/utils.cpp | 6 +++--- 5 files changed, 41 insertions(+), 40 deletions(-) diff --git a/doc/src/fix_property_atom.rst b/doc/src/fix_property_atom.rst index c7bf3f8c37..b6f6560770 100644 --- a/doc/src/fix_property_atom.rst +++ b/doc/src/fix_property_atom.rst @@ -180,7 +180,9 @@ atom-ID, the next two are a molecule-ID and a floating point value that will be stored in a new property called "flag". If a per-atom array was specified in the fix property/atom commmand then the *N* values for that array must be specified consecutively for that -property on each line. +property on each line. Note that the order of values on each line +corresponds to the order of custom names in the fix property/atom +command. Note that the the lines of per-atom properties can be listed in any order. Also note that all the per-atom properties specified by the @@ -301,12 +303,14 @@ uninterrupted fashion. .. warning:: - When reading data from a restart file, this fix command has to be specified - **exactly** the same way as before. LAMMPS will only check whether a - fix is of the same style and has the same fix ID and in case of a match - will then try to initialize the fix with the data stored in the binary - restart file. If the fix property/atom command does not match exactly, - data can be corrupted or LAMMPS may crash. + When reading data from a restart file, this fix command has to be + specified **exactly** the same was in the input script that created + the restart file. LAMMPS will only check whether a fix is of the + same style and has the same fix ID and in case of a match will then + try to initialize the fix with the data stored in the binary + restart file. If the names and associated date types in the new + fix property/atom command do not match the old one exactly, data + can be corrupted or LAMMPS may crash. None of the :doc:`fix_modify ` options are relevant to this fix. No global or per-atom quantities are stored by this fix for diff --git a/doc/src/read_data.rst b/doc/src/read_data.rst index 18cc24ffff..5b5c951688 100644 --- a/doc/src/read_data.rst +++ b/doc/src/read_data.rst @@ -66,8 +66,8 @@ simulation. The file can be ASCII text or a gzipped text file (detected by a .gz suffix). This is one of 3 ways to specify initial atom coordinates; see the :doc:`read_restart ` and :doc:`create_atoms ` commands for alternative methods. -Also see the explanation of the :doc:`-restart command-line switch ` which can convert a restart file to a data -file. +Also see the explanation of the :doc:`-restart command-line switch +` which can convert a restart file to a data file. This command can be used multiple times to add new atoms and their properties to an existing system by using the *add*, *offset*, and @@ -246,22 +246,22 @@ appear in any order, with a few exceptions as noted below. The keyword *fix* can be used one or more times. Each usage specifies a fix that will be used to process a specific portion of the data -file. Any header line containing *header-string* and any section with -a name containing *section-string* will be passed to the specified +file. Any header line containing *header-string* and any section that +is an exact match to *section-string* will be passed to the specified fix. See the :doc:`fix property/atom ` command for -an example of a fix that operates in this manner. The page for -the fix defines the syntax of the header line(s) and section(s) that -it reads from the data file. Note that the *header-string* can be +an example of a fix that operates in this manner. The doc page for +the fix defines the syntax of the header line(s) and section that it +reads from the data file. Note that the *header-string* can be specified as NULL, in which case no header lines are passed to the -fix. This means that it can infer the length of its Section from +fix. This means the fix can infer the length of its Section from standard header settings, such as the number of atoms. The formatting of individual lines in the data file (indentation, spacing between words and numbers) is not important except that header and section keywords (e.g. atoms, xlo xhi, Masses, Bond Coeffs) must -be capitalized as shown and can't have extra white-space between their -words - e.g. two spaces or a tab between the 2 words in "xlo xhi" or -the 2 words in "Bond Coeffs", is not valid. +be capitalized as shown and cannot have extra white-space between +their words - e.g. two spaces or a tab between the 2 words in "xlo +xhi" or the 2 words in "Bond Coeffs", is not valid. ---------- diff --git a/src/dump_custom.cpp b/src/dump_custom.cpp index 3acaf6535e..3f70d242b1 100644 --- a/src/dump_custom.cpp +++ b/src/dump_custom.cpp @@ -1551,8 +1551,6 @@ int DumpCustom::parse_fields(int narg, char **arg) n = atom->find_custom(name,flag,cols); - printf("NAME %s\n",name); - if (n < 0) error->all(FLERR,"Could not find custom per-atom property ID: {}", name); if (argindex[iarg] == 0) { diff --git a/src/read_data.cpp b/src/read_data.cpp index 12ad6c3b8c..c33c65f676 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -509,21 +509,6 @@ void ReadData::command(int narg, char **arg) while (strlen(keyword)) { - // if special fix matches, it processes section - - if (nfix) { - int i; - for (i = 0; i < nfix; i++) - if (strcmp(keyword,fix_section[i]) == 0) { - if (firstpass) fix(fix_index[i],keyword); - else skip_lines(modify->fix[fix_index[i]]-> - read_data_skip_lines(keyword)); - parse_keyword(0); - break; - } - if (i < nfix) continue; - } - if (strcmp(keyword,"Atoms") == 0) { atomflag = 1; if (firstpass) { @@ -728,8 +713,22 @@ void ReadData::command(int narg, char **arg) if (firstpass) impropercoeffs(1); else skip_lines(nimpropertypes); - } else error->all(FLERR,"Unknown identifier in data file: {}", - keyword); + // if specified fix matches, it processes section + + } else if (nfix) { + int i; + for (i = 0; i < nfix; i++) + if (strcmp(keyword,fix_section[i]) == 0) { + if (firstpass) fix(fix_index[i],keyword); + else skip_lines(modify->fix[fix_index[i]]-> + read_data_skip_lines(keyword)); + parse_keyword(0); + break; + } + if (i == nfix) + error->all(FLERR,"Unknown identifier in data file: {}",keyword); + + } else error->all(FLERR,"Unknown identifier in data file: {}",keyword); parse_keyword(0); } diff --git a/src/utils.cpp b/src/utils.cpp index 7a7a03946e..528908807c 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -656,9 +656,9 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } } - printf("NEWARG %d\n",newarg); - for (int i = 0; i < newarg; i++) - printf(" arg %d: %s\n",i,earg[i]); + //printf("NEWARG %d\n",newarg); + //for (int i = 0; i < newarg; i++) + // printf(" arg %d: %s\n",i,earg[i]); return newarg; } From 7d0c052425bed1e84bec7df2a8ffb50a07d49915 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 19 Aug 2021 14:00:37 -0600 Subject: [PATCH 346/352] Fix deallocation with Kokkos --- src/atom.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/atom.cpp b/src/atom.cpp index ab044b6c47..1476a9ae2f 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -309,7 +309,8 @@ Atom::~Atom() } for (int i = 0; i < ndvector; i++) { delete [] dvname[i]; - memory->destroy(dvector[i]); + if (dvector) + memory->destroy(dvector[i]); } for (int i = 0; i < niarray; i++) { delete [] ianame[i]; From eebbbe9f73c48dc5b32b81bcfac65dae71e07f57 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 14:01:06 -0600 Subject: [PATCH 347/352] support a second usage model with fix bond/swap --- doc/src/fix_bond_swap.rst | 72 ++++++++++++++++++++++++--------------- src/MC/fix_bond_swap.cpp | 6 ++-- 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index da000c98b2..b29091308b 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -27,15 +27,15 @@ Examples Description """"""""""" -In a simulation of polymer chains, this command attempts to swap a -pair of bonds, as illustrated below. This is done via Monte Carlo -rules using the Boltzmann acceptance criterion, typically with the -goal of equilibrating the polymer system more quickly. This fix is -designed for use with idealized bead-spring polymer chains where each -polymer is a linear chain of monomers, but LAMMPS does not check that -is the case for your system. +In a simulation of polymer chains this command attempts to swap a pair +of bonds, as illustrated below. This is done via Monte Carlo rules +using the Boltzmann acceptance criterion, typically with the goal of +equilibrating the polymer system more quickly. This fix is designed +for use with idealized bead-spring polymer chains where each polymer +is a linear chain of monomers, but LAMMPS does not check that is the +case for your system. -Here are two use cases where this fix can be used effectively. +Here are two use cases for this fix. The first use case is for swapping bonds on two different chains, effectively grafting the end of one chain onto the other chain and @@ -62,22 +62,30 @@ undergone a dramatic conformational change. This reference, effectiveness for this use case. The second use case is a collection of polymer chains with some -fraction of their sites identified as "sticker" sites. +fraction of their sites identified as "sticker" sites. Initially each +polymer chain is isolated from the others in a topological sense, and +there is an intra-chain bond between every pair of sticker sites on +the same chain. Over time, bonds swap so that inter-moleculer sticker +bonds are created. This models a vitrification-style process whereby +the polymer chains all become interconnected. For this use case, if +angles are defined they should not include sticker sites. +---------- -The bond swapping operation is invoked every *Nevery* timesteps. If -any bond in the entire system is swapped, a re-build of the neighbor -lists is triggered, since a swap alters the list of which neighbors -are considered for pairwise interaction. At each invocation, each -processor considers a random specified *fraction* of its atoms as -potential swapping monomers for this timestep. Choosing a small -*fraction* value can reduce the likelihood of a reverse swap occurring -soon after an initial swap. +The bond swapping operation is invoked once every *Nevery* timesteps. +If any bond in the entire system is swapped, a re-build of the +neighbor lists is triggered, since a swap alters the list of which +neighbors are considered for pairwise interaction. At each +invocation, each processor considers a random specified *fraction* of +its atoms as potential swapping monomers for this timestep. Choosing +a small *fraction* value can reduce the likelihood of a reverse swap +occurring soon after an initial swap. -For each monomer A1, its neighbors are looped over as B1 monomers. An -additional double loop of bond partners A2 of A1, and bond partners B2 -of B1 a is performed. For each pair of A1-A2 and B1-B2 bonds to be -eligible for swapping, the following 4 criteria must be met: +For each monomer A1, its neighbors are looped over as B1 monomers. +For each A1,B1 an additional double loop of bond partners A2 of A1, +and bond partners B2 of B1 a is performed. For each pair of A1-A2 and +B1-B2 bonds to be eligible for swapping, the following 4 criteria must +be met: (1) All 4 monomers must be in the fix group. @@ -103,15 +111,22 @@ accepted. If the energy increases it is accepted with probability exp(-delta/kT) where delta is the increase in energy, k is the Boltzmann constant, and T is the current temperature of the system. -IMPORTANT: Whether the swap is accepted or rejected, no other swaps -are attempted by this processor on this timestep. +.. note:: + + IMPORTANT: Whether the swap is accepted or rejected, no other swaps + are attempted by this processor on this timestep. No other + eliglble 4-tuples of atoms are considered. This means that each + processor will perform either a single swap or none on timesteps + this fix is invoked. ---------- -The criterion for matching molecule IDs is how bond swaps performed by -this fix conserve chain length. To use this features you must setup -the molecule IDs for your polymer chains in a certain way, typically -in the data file, read by the :doc:`read_data ` command. +The criterion for matching molecule IDs is how the first use case +described above can be simulated while conserving chain lengths. This +is done by setting up the molecule IDs for the polymer chains in a +specific way, typically in the data file, read by the :doc:`read_data +` command. + Consider a system of 6-mer chains. You have 2 choices. If the molecule IDs for monomers on each chain are set to 1,2,3,4,5,6 then swaps will conserve chain length. For a particular monomer there will @@ -140,6 +155,9 @@ ends of a chain swap with each other. running dynamics, but can affect calculation of some diagnostic quantities or the printing of unwrapped coordinates to a dump file. +For the second use case described above, the molecule IDs for all +sticker sites should be the same. + ---------- This fix computes a temperature each time it is invoked for use by the diff --git a/src/MC/fix_bond_swap.cpp b/src/MC/fix_bond_swap.cpp index 0b24f21e2d..5f7ffcbbe5 100644 --- a/src/MC/fix_bond_swap.cpp +++ b/src/MC/fix_bond_swap.cpp @@ -261,12 +261,12 @@ void FixBondSwap::post_integrate() // J must be on-processor (J < nlocal) // I,J must be in fix group // I,J must have same molecule IDs - // use case 1: + // use case 1 (see doc page): // if user defines mol IDs appropriately for linear chains, // this will mean they are same distance from (either) chain end - // use case 2: + // use case 2 (see doc page): // if user defines a unique mol ID for desired bond sites (on any chain) - // and defines the fix group for these sites, + // and defines the fix group as these sites, // this will mean they are eligible bond sites int ntest = static_cast (fraction * neligible); From 845cebaab1d4fcbbbd7c1970428b0ba098f59f36 Mon Sep 17 00:00:00 2001 From: Stan Gerald Moore Date: Thu, 19 Aug 2021 14:02:57 -0600 Subject: [PATCH 348/352] Add comment --- src/atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.cpp b/src/atom.cpp index 1476a9ae2f..4135298673 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -309,7 +309,7 @@ Atom::~Atom() } for (int i = 0; i < ndvector; i++) { delete [] dvname[i]; - if (dvector) + if (dvector) // (needed for Kokkos) memory->destroy(dvector[i]); } for (int i = 0; i < niarray; i++) { From e1c1c663c4fee57faaf7957d4ab61f81b35a02af Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 19 Aug 2021 14:21:15 -0600 Subject: [PATCH 349/352] correction to doc page --- doc/src/fix_bond_swap.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index b29091308b..42ee820c93 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -68,7 +68,8 @@ there is an intra-chain bond between every pair of sticker sites on the same chain. Over time, bonds swap so that inter-moleculer sticker bonds are created. This models a vitrification-style process whereby the polymer chains all become interconnected. For this use case, if -angles are defined they should not include sticker sites. +angles are defined they should not include bonds between sticker +sites. ---------- From bc6e805c990ebf6ace86b1de14d47b65a785146d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 16:53:03 -0400 Subject: [PATCH 350/352] fix doc formatting issues --- doc/src/Developer_utils.rst | 2 +- doc/src/dump.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Developer_utils.rst b/doc/src/Developer_utils.rst index 60eded42e0..e419520edd 100644 --- a/doc/src/Developer_utils.rst +++ b/doc/src/Developer_utils.rst @@ -336,7 +336,7 @@ repetitive tasks. The :cpp:class:`LAMMPS_NS::ArgInfo` class provides an abstraction for parsing references to compute or fix styles, variables or custom integer or double properties handled by :doc:`fix property/atom `. -These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2_" +These would start with a "c\_", "f\_", "v\_", "d\_", "d2\_", "i\_", or "i2\_" followed by the ID or name of than instance and may be postfixed with one or two array indices "[]" with numbers > 0. diff --git a/doc/src/dump.rst b/doc/src/dump.rst index 998498d1d4..c2509e6654 100644 --- a/doc/src/dump.rst +++ b/doc/src/dump.rst @@ -81,7 +81,7 @@ Syntax radius, diameter, omegax, omegay, omegaz, angmomx, angmomy, angmomz, tqx, tqy, tqz, c_ID, c_ID[I], f_ID, f_ID[I], v_name, - i_name, d_name, i2_name[I], d2_name[I] + i_name, d_name, i2_name[I], d2_name[I] .. parsed-literal:: From f7c8b0c88b1ca9051bb4cf284ee26498462c863b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 19 Aug 2021 17:00:46 -0400 Subject: [PATCH 351/352] address spellcheck issues --- doc/src/fix_property_atom.rst | 8 ++++---- doc/utils/sphinx-config/false_positives.txt | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/doc/src/fix_property_atom.rst b/doc/src/fix_property_atom.rst index b6f6560770..cc92c18655 100644 --- a/doc/src/fix_property_atom.rst +++ b/doc/src/fix_property_atom.rst @@ -61,7 +61,7 @@ ones. This can be useful in several scenarios. If the atom style does not define molecule IDs, per-atom charge, or per-atom mass, they can be added using the *mol*\ , *q* or *rmass* -keywords. This ciykd be useful to define "molecules" to use as rigid +keywords. This could be useful to define "molecules" to use as rigid bodies with the :doc:`fix rigid ` command, or to carry around an extra flag with atoms (stored as a molecule ID) that can be used by various commands like :doc:`compute chunk/atom @@ -150,7 +150,7 @@ Per-atom properties that are defined by the :doc:`atom style ` are initialized when atoms are created, e.g. by the :doc:`read_data ` or :doc:`create_atoms ` commands. The per-atom properties defined by this fix are not. So -you need to initialize them explicitly. One way to do thisis +you need to initialize them explicitly. One way to do this is :doc:`read_data ` command, using its *fix* keyword and passing it the fix-ID of this fix. @@ -178,7 +178,7 @@ would allow a data file to have a section like this: where N is the number of atoms, the first field on each line is the atom-ID, the next two are a molecule-ID and a floating point value that will be stored in a new property called "flag". If a per-atom -array was specified in the fix property/atom commmand then the *N* +array was specified in the fix property/atom command then the *N* values for that array must be specified consecutively for that property on each line. Note that the order of values on each line corresponds to the order of custom names in the fix property/atom @@ -222,7 +222,7 @@ values. This means that the values can be used accessed by fixes like :doc:`compute reduce `, or used in :doc:`atom-style variables `. -For example, these commands will output both the instantanous and +For example, these commands will output both the instantaneous and time-averaged values of two new properties to a custom dump file: .. code-block:: LAMMPS diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c866a9409b..6b40fcde71 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -531,6 +531,7 @@ covalently covariance cpp cpu +cradius createatoms createAtoms CreateIDs @@ -1598,6 +1599,7 @@ Kosovan Koster Kosztin Kp +kradius Kraker Kraus Kremer @@ -1993,6 +1995,7 @@ Mj mK mkdir mkv +mlength mliap mliappy mlparks @@ -2049,6 +2052,7 @@ mpiio mpirun mplayer mps +mradius Mrovec Mryglod mscg @@ -2107,6 +2111,7 @@ myIndex mylammps MyPool mysocket +mySpin myTemp myVec na @@ -2317,6 +2322,7 @@ nsub Nswap Nt Ntable +nt ntheta nthreads ntimestep From fcc6cc628e7e04093e2c366a73986f6791f9cd02 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Aug 2021 13:47:24 -0400 Subject: [PATCH 352/352] fix whitespace --- doc/src/fix_bond_swap.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst index 42ee820c93..dbbaceb61f 100644 --- a/doc/src/fix_bond_swap.rst +++ b/doc/src/fix_bond_swap.rst @@ -99,7 +99,7 @@ eligible for swapping on this step. (3) The distances between 4 pairs of atoms -- (A1,A2), (B1,B2), (A1,B2), (B1,A2) -- must all be less thann the specified *cutoff*\ . -(4) The molecule IDs of A1 and B1 must be the same (see below). +(4) The molecule IDs of A1 and B1 must be the same (see below). If an eligible B1 partner is found, the energy change due to swapping the 2 bonds is computed. This includes changes in pairwise, bond, and @@ -126,7 +126,7 @@ The criterion for matching molecule IDs is how the first use case described above can be simulated while conserving chain lengths. This is done by setting up the molecule IDs for the polymer chains in a specific way, typically in the data file, read by the :doc:`read_data -` command. +` command. Consider a system of 6-mer chains. You have 2 choices. If the molecule IDs for monomers on each chain are set to 1,2,3,4,5,6 then