diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 04ec037184..a639c1d993 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -131,7 +131,9 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC") OR (CMAKE_CXX_COMPILER_ID STREQUAL " endif() # silence nvcc warnings -if((PKG_KOKKOS) AND (Kokkos_ENABLE_CUDA) AND NOT (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) +if((PKG_KOKKOS) AND (Kokkos_ENABLE_CUDA) AND NOT + ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") + OR (CMAKE_CXX_COMPILER_ID STREQUAL "XLClang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "CrayClang"))) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Xcudafe --diag_suppress=unrecognized_pragma,--diag_suppress=128") endif() diff --git a/cmake/Modules/Packages/COLVARS.cmake b/cmake/Modules/Packages/COLVARS.cmake index 8fa0d84f01..b4dc738626 100644 --- a/cmake/Modules/Packages/COLVARS.cmake +++ b/cmake/Modules/Packages/COLVARS.cmake @@ -26,6 +26,11 @@ if(BUILD_OMP) target_link_libraries(colvars PRIVATE OpenMP::OpenMP_CXX) endif() +if(BUILD_MPI) + target_compile_definitions(colvars PUBLIC -DCOLVARS_MPI) + target_link_libraries(colvars PUBLIC MPI::MPI_CXX) +endif() + if(COLVARS_DEBUG) # Need to export the define publicly to be valid in interface code target_compile_definitions(colvars PUBLIC -DCOLVARS_DEBUG) diff --git a/cmake/Modules/Packages/MC.cmake b/cmake/Modules/Packages/MC.cmake index f162254558..2a72a895cf 100644 --- a/cmake/Modules/Packages/MC.cmake +++ b/cmake/Modules/Packages/MC.cmake @@ -7,3 +7,13 @@ if(NOT PKG_MANYBODY) list(REMOVE_ITEM LAMMPS_SOURCES ${LAMMPS_SOURCE_DIR}/MC/fix_sgcmc.cpp) set_property(TARGET lammps PROPERTY SOURCES "${LAMMPS_SOURCES}") endif() + +# fix neighbor/swap may only be installed if also the VORONOI package is installed +if(NOT PKG_VORONOI) + get_property(LAMMPS_FIX_HEADERS GLOBAL PROPERTY FIX) + list(REMOVE_ITEM LAMMPS_FIX_HEADERS ${LAMMPS_SOURCE_DIR}/MC/fix_neighbor_swap.h) + set_property(GLOBAL PROPERTY FIX "${LAMMPS_FIX_HEADERS}") + get_target_property(LAMMPS_SOURCES lammps SOURCES) + list(REMOVE_ITEM LAMMPS_SOURCES ${LAMMPS_SOURCE_DIR}/MC/fix_neighbor_swap.cpp) + set_property(TARGET lammps PROPERTY SOURCES "${LAMMPS_SOURCES}") +endif() diff --git a/cmake/Modules/Packages/SCAFACOS.cmake b/cmake/Modules/Packages/SCAFACOS.cmake index 9a5580163f..2905a207b0 100644 --- a/cmake/Modules/Packages/SCAFACOS.cmake +++ b/cmake/Modules/Packages/SCAFACOS.cmake @@ -14,27 +14,16 @@ endif() option(DOWNLOAD_SCAFACOS "Download ScaFaCoS library instead of using an already installed one" ${DOWNLOAD_SCAFACOS_DEFAULT}) if(DOWNLOAD_SCAFACOS) message(STATUS "ScaFaCoS download requested - we will build our own") - set(SCAFACOS_URL "https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz" CACHE STRING "URL for SCAFACOS tarball") - set(SCAFACOS_MD5 "bd46d74e3296bd8a444d731bb10c1738" CACHE STRING "MD5 checksum of SCAFACOS tarball") + set(SCAFACOS_URL "https://github.com/scafacos/scafacos/releases/download/v1.0.4/scafacos-1.0.4.tar.gz" CACHE STRING "URL for SCAFACOS tarball") + set(SCAFACOS_MD5 "23867540ec32e63ce71d6ecc105278d2" CACHE STRING "MD5 checksum of SCAFACOS tarball") mark_as_advanced(SCAFACOS_URL) mark_as_advanced(SCAFACOS_MD5) GetFallbackURL(SCAFACOS_URL SCAFACOS_FALLBACK) - - # version 1.0.1 needs a patch to compile and linke cleanly with GCC 10 and later. - file(DOWNLOAD ${LAMMPS_THIRDPARTY_URL}/scafacos-1.0.1-fix.diff ${CMAKE_CURRENT_BINARY_DIR}/scafacos-1.0.1.fix.diff - EXPECTED_HASH MD5=4baa1333bb28fcce102d505e1992d032) - - find_program(HAVE_PATCH patch) - if(NOT HAVE_PATCH) - message(FATAL_ERROR "The 'patch' program is required to build the ScaFaCoS library") - endif() - include(ExternalProject) ExternalProject_Add(scafacos_build URL ${SCAFACOS_URL} ${SCAFACOS_FALLBACK} URL_MD5 ${SCAFACOS_MD5} - PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_BINARY_DIR}/scafacos-1.0.1.fix.diff CONFIGURE_COMMAND /configure --prefix= --disable-doc --enable-fcs-solvers=fmm,p2nfft,direct,ewald,p3m --with-internal-fftw --with-internal-pfft diff --git a/doc/graphviz/lammps-releases.dot b/doc/graphviz/lammps-releases.dot index f641cac029..fb11f4bd68 100644 --- a/doc/graphviz/lammps-releases.dot +++ b/doc/graphviz/lammps-releases.dot @@ -5,13 +5,13 @@ digraph releases { github -> develop [label="Merge commits"]; { rank = "same"; - work [shape="none" label="Development branches:"] + work [shape="none" label="Development branches:" fontname="bold"] develop [label="'develop' branch" height=0.75]; maintenance [label="'maintenance' branch" height=0.75]; }; { rank = "same"; - upload [shape="none" label="Release branches:"] + upload [shape="none" label="Release branches:" fontname="bold"] release [label="'release' branch" height=0.75]; stable [label="'stable' branch" height=0.75]; }; @@ -22,7 +22,7 @@ digraph releases { maintenance -> stable [label="Updates to stable release"]; { rank = "same"; - tag [shape="none" label="Applied tags:"]; + tag [shape="none" label="Applied tags:" fontname="bold"]; patchtag [shape="box" label="patch_"]; stabletag [shape="box" label="stable_"]; updatetag [shape="box" label="stable__update"]; diff --git a/doc/src/Build.rst b/doc/src/Build.rst index ff09ee5678..c76ce2f434 100644 --- a/doc/src/Build.rst +++ b/doc/src/Build.rst @@ -14,32 +14,10 @@ As an alternative, you can download a package with pre-built executables or automated build trees, as described in the :doc:`Install ` section of the manual. -Prerequisites -------------- - -Which software you need to compile and use LAMMPS strongly depends on -which :doc:`features and settings ` and which -:doc:`optional packages ` you are trying to include. -Common to all is that you need a C++ and C compiler, where the C++ -compiler has to support at least the C++11 standard (note that some -compilers require command-line flag to activate C++11 support). -Furthermore, if you are building with CMake, you need at least CMake -version 3.20 and a compatible build tool (make or ninja-build); if you -are building the the legacy GNU make based build system you need GNU -make (other make variants are not going to work since the build system -uses features unique to GNU make) and a Unix-like build environment with -a Bourne shell, and shell tools like "sed", "grep", "touch", "test", -"tr", "cp", "mv", "rm", "ln", "diff" and so on. Parts of LAMMPS -interface with or use Python version 3.6 or later. - -The LAMMPS developers aim to keep LAMMPS very portable and usable - -at least in parts - on most operating systems commonly used for -running MD simulations. Please see the :doc:`section on portablility -` for more details. - .. toctree:: :maxdepth: 1 + Build_prerequisites Build_cmake Build_make Build_link diff --git a/doc/src/Build_prerequisites.rst b/doc/src/Build_prerequisites.rst new file mode 100644 index 0000000000..105de35102 --- /dev/null +++ b/doc/src/Build_prerequisites.rst @@ -0,0 +1,22 @@ +Prerequisites +------------- + +Which software you need to compile and use LAMMPS strongly depends on +which :doc:`features and settings ` and which +:doc:`optional packages ` you are trying to include. +Common to all is that you need a C++ and C compiler, where the C++ +compiler has to support at least the C++11 standard (note that some +compilers require command-line flag to activate C++11 support). +Furthermore, if you are building with CMake, you need at least CMake +version 3.20 and a compatible build tool (make or ninja-build); if you +are building the the legacy GNU make based build system you need GNU +make (other make variants are not going to work since the build system +uses features unique to GNU make) and a Unix-like build environment with +a Bourne shell, and shell tools like "sed", "grep", "touch", "test", +"tr", "cp", "mv", "rm", "ln", "diff" and so on. Parts of LAMMPS +interface with or use Python version 3.6 or later. + +The LAMMPS developers aim to keep LAMMPS very portable and usable - +at least in parts - on most operating systems commonly used for +running MD simulations. Please see the :doc:`section on portablility +` for more details. diff --git a/doc/src/Commands_fix.rst b/doc/src/Commands_fix.rst index 0638cbe62e..10a805d8e9 100644 --- a/doc/src/Commands_fix.rst +++ b/doc/src/Commands_fix.rst @@ -77,6 +77,7 @@ OPT. * :doc:`flow/gauss ` * :doc:`freeze (k) ` * :doc:`gcmc ` + * :doc:`gjf ` * :doc:`gld ` * :doc:`gle ` * :doc:`gravity (ko) ` @@ -111,6 +112,7 @@ OPT. * :doc:`mvv/tdpd ` * :doc:`neb ` * :doc:`neb/spin ` + * :doc:`neighbor/swap ` * :doc:`nonaffine/displacement ` * :doc:`nph (ko) ` * :doc:`nph/asphere (o) ` diff --git a/doc/src/Commands_removed.rst b/doc/src/Commands_removed.rst index cea964fe79..c92d3d9064 100644 --- a/doc/src/Commands_removed.rst +++ b/doc/src/Commands_removed.rst @@ -1,7 +1,7 @@ Removed commands and packages ============================= -.. contents:: \ +.. contents:: ------ @@ -12,10 +12,21 @@ stop LAMMPS and print a suitable error message in most cases, when a style/command is used that has been removed or will replace the command with the direct alternative (if available) and print a warning. +GJF formulation in fix langevin +------------------------------- + +.. deprecated:: TBD + +The *gjf* keyword in fix langevin is deprecated and will be removed +soon. The GJF functionality has been moved to its own fix style +:doc:`fix gjf ` and it is strongly recommended to use that +fix instead. + + LAMMPS shell ------------ -.. versionchanged:: 29Aug2024 +.. deprecated:: 29Aug2024 The LAMMPS shell has been removed from the LAMMPS distribution. Users are encouraged to use the :ref:`LAMMPS-GUI ` tool instead. @@ -23,7 +34,7 @@ are encouraged to use the :ref:`LAMMPS-GUI ` tool instead. i-PI tool --------- -.. versionchanged:: 27Jun2024 +.. deprecated:: 27Jun2024 The i-PI tool has been removed from the LAMMPS distribution. Instead, instructions to install i-PI from PyPI via pip are provided. diff --git a/doc/src/Errors_details.rst b/doc/src/Errors_details.rst index eba240aef7..4b510f4902 100644 --- a/doc/src/Errors_details.rst +++ b/doc/src/Errors_details.rst @@ -159,13 +159,17 @@ angle, dihedral, or improper with just one atom in the actual sub-domain. Typically, this cutoff is set to the largest cutoff from the :doc:`pair style(s) ` plus the :doc:`neighbor list skin distance ` and will typically be sufficient for all bonded -interactions. But if the pair style cutoff is small, this may not be -enough. LAMMPS will print a warning in this case using some heuristic -based on the equilibrium bond length, but that still may not be -sufficient for cases where the force constants are small and thus bonds -may be stretched very far. The communication cutoff can be adjusted -with :doc:`comm_modify cutoff \ `, but setting this -too large will waste CPU time and memory. +interactions. But if the pair style cutoff is small (e.g. with a +repulsive-only Lennard-Jones potential) this may not be enough. It is +even worse if there is no pair style defined (or the pair style is set +to "none"), since then there will be no ghost atoms created at all. + +The communication cutoff can be set or adjusted with :doc:`comm_modify +cutoff \ `, but setting this too large will waste +CPU time and memory. LAMMPS will print warnings in these cases. For +bonds it uses some heuristic based on the equilibrium bond length, but +that still may not be sufficient for cases where the force constants are +small and thus bonds may be stretched very far. .. _hint09: diff --git a/doc/src/Howto.rst b/doc/src/Howto.rst index ec90472c27..cdc4efd737 100644 --- a/doc/src/Howto.rst +++ b/doc/src/Howto.rst @@ -66,6 +66,7 @@ Force fields howto :name: force_howto :maxdepth: 1 + Howto_FFgeneral Howto_bioFF Howto_amoeba Howto_tip3p diff --git a/doc/src/Howto_FFgeneral.rst b/doc/src/Howto_FFgeneral.rst new file mode 100644 index 0000000000..1b96ae1119 --- /dev/null +++ b/doc/src/Howto_FFgeneral.rst @@ -0,0 +1,55 @@ +Some general force field considerations +======================================= + +A compact summary of the concepts, definitions, and properties of force +fields with explicit bonded interactions (like the ones discussed in +this HowTo) is given in :ref:`(Gissinger) `. + +A force field has 2 parts: the formulas that define its potential +functions and the coefficients used for a particular system. To assign +parameters it is first required to assign atom types. Those are not +only based on the elements, but also on the chemical environment due to +the atoms bound to them. This often follows the chemical concept of +*functional groups*. Example: a carbon atom bound with a single bond to +a single OH-group (alcohol) would be a different atom type than a carbon +atom bound to a methyl CH3 group (aliphatic carbon). The atom types +usually then determine the non-bonded Lennard-Jones parameters and the +parameters for bonds, angles, dihedrals, and impropers. On top of that, +partial charges have to be applied. Those are usually independent of +the atom types and are determined either for groups of atoms called +residues with some fitting procedure based on quantum mechanical +calculations, or based on some increment system that add or subtract +increments from the partial charge of an atom based on the types of +the neighboring atoms. + +Force fields differ in the strategies they employ to determine the +parameters and charge distribution in how generic or specific they are +which in turn has an impact on the accuracy (compare for example +CGenFF to CHARMM and GAFF to Amber). Because of the different +strategies, it is not a good idea to use a mix of parameters from +different force field *families* (like CHARMM, Amber, or GROMOS) +and that extends to the parameters for the solvent, especially +water. The publication describing the parameterization of a force +field will describe which water model to use. Changing the water +model usually leads to overall worse results (even if it may improve +on the water itself). + +In addition, one has to consider that *families* of force fields like +CHARMM, Amber, OPLS, or GROMOS have evolved over time and thus provide +different *revisions* of the force field parameters. These often +corresponds to changes in the functional form or the parameterization +strategies. This may also result in changes required for simulation +settings like the preferred cutoff or how Coulomb interactions are +computed (cutoff, smoothed/shifted cutoff, or long-range with Ewald +summation or equivalent). Unless explicitly stated in the publication +describing the force field, the Coulomb interaction cannot be chosen at +will but must match the revision of the force field. That said, +liberties may be taken during the initial equilibration of a system to +speed up the process, but not for production simulations. + +---------- + +.. _Typelabel2: + +**(Gissinger)** J. R. Gissinger, I. Nikiforov, Y. Afshar, B. Waters, M. Choi, D. S. Karls, A. Stukowski, W. Im, H. Heinz, A. Kohlmeyer, and E. B. Tadmor, J Phys Chem B, 128, 3282-3297 (2024). + diff --git a/doc/src/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst index 92dd45b9b6..cf8e4ab13e 100644 --- a/doc/src/Howto_bioFF.rst +++ b/doc/src/Howto_bioFF.rst @@ -1,22 +1,16 @@ CHARMM, AMBER, COMPASS, DREIDING, and OPLS force fields ======================================================= -A compact summary of the concepts, definitions, and properties of -force fields with explicit bonded interactions (like the ones discussed -in this HowTo) is given in :ref:`(Gissinger) `. - -A force field has 2 parts: the formulas that define it and the -coefficients used for a particular system. Here we only discuss -formulas implemented in LAMMPS that correspond to formulas commonly used -in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting -coefficients is done either from special sections in an input data file -via the :doc:`read_data ` command or in the input script with -commands like :doc:`pair_coeff ` or :doc:`bond_coeff -` and so on. See the :doc:`Tools ` doc page for -additional tools that can use CHARMM, AMBER, or Materials Studio -generated files to assign force field coefficients and convert their -output into LAMMPS input. LAMMPS input scripts can also be generated by -`charmm-gui.org `_. +Here we only discuss formulas implemented in LAMMPS that correspond to +formulas commonly used in the CHARMM, AMBER, COMPASS, and DREIDING force +fields. Setting coefficients is done either from special sections in an +input data file via the :doc:`read_data ` command or in the +input script with commands like :doc:`pair_coeff ` or +:doc:`bond_coeff ` and so on. See the :doc:`Tools ` +doc page for additional tools that can use CHARMM, AMBER, or Materials +Studio generated files to assign force field coefficients and convert +their output into LAMMPS input. LAMMPS input scripts can also be +generated by `charmm-gui.org `_. CHARMM and AMBER ---------------- @@ -203,9 +197,11 @@ rather than individual force constants and geometric parameters that depend on the particular combinations of atoms involved in the bond, angle, or torsion terms. DREIDING has an :doc:`explicit hydrogen bond term ` to describe interactions involving a -hydrogen atom on very electronegative atoms (N, O, F). Unlike CHARMM -or AMBER, the DREIDING force field has not been parameterized for -considering solvents (like water). +hydrogen atom on very electronegative atoms (N, O, F). Unlike CHARMM or +AMBER, the DREIDING force field has not been parameterized for +considering solvents (like water) and has no rules for assigning +(partial) charges. That will seriously limit its accuracy when used for +simulating systems where those matter. See :ref:`(Mayo) ` for a description of the DREIDING force field @@ -272,10 +268,6 @@ compatible with a subset of OPLS interactions. ---------- -.. _Typelabel2: - -**(Gissinger)** J. R. Gissinger, I. Nikiforov, Y. Afshar, B. Waters, M. Choi, D. S. Karls, A. Stukowski, W. Im, H. Heinz, A. Kohlmeyer, and E. B. Tadmor, J Phys Chem B, 128, 3282-3297 (2024). - .. _howto-MacKerell: **(MacKerell)** MacKerell, Bashford, Bellott, Dunbrack, Evanseck, Field, Fischer, Gao, Guo, Ha, et al (1998). J Phys Chem, 102, 3586 . https://doi.org/10.1021/jp973084f diff --git a/doc/src/Howto_lammps_gui.rst b/doc/src/Howto_lammps_gui.rst index 592e67abc5..f6cfdefc81 100644 --- a/doc/src/Howto_lammps_gui.rst +++ b/doc/src/Howto_lammps_gui.rst @@ -308,7 +308,10 @@ of the *Output* window showing how many warnings and errors were detected and how many lines the entire output has. By clicking on the button on the right with the warning symbol or by using the keyboard shortcut `Ctrl-N` (`Command-N` on macOS), you can jump to the next -line with a warning or error. +line with a warning or error. If there is a URL pointing to additional +explanations in the online manual, that URL will be highlighted and +double-clicking on it shall open the corresponding manual page in +the web browser. The option is also available from the context menu. By default, the *Output* window is replaced each time a run is started. The runs are counted and the run number for the current run is displayed diff --git a/doc/src/Howto_spc.rst b/doc/src/Howto_spc.rst index 00bd8a1b10..f84d7797d2 100644 --- a/doc/src/Howto_spc.rst +++ b/doc/src/Howto_spc.rst @@ -1,5 +1,5 @@ -SPC water model -=============== +SPC and SPC/E water model +========================= The SPC water model specifies a 3-site rigid water molecule with charges and Lennard-Jones parameters assigned to each of the three atoms. diff --git a/doc/src/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst index fe53fff540..bda3bc6cb4 100644 --- a/doc/src/Howto_thermostat.rst +++ b/doc/src/Howto_thermostat.rst @@ -21,9 +21,14 @@ can be invoked via the *dpd/tstat* pair style: * :doc:`fix nvt/sllod ` * :doc:`fix temp/berendsen ` * :doc:`fix temp/csvr ` +* :doc:`fix ffl ` +* :doc:`fix gjf ` +* :doc:`fix gld ` +* :doc:`fix gle ` * :doc:`fix langevin ` * :doc:`fix temp/rescale ` * :doc:`pair_style dpd/tstat ` +* :doc:`pair_style dpd/ext/tstat ` :doc:`Fix nvt ` only thermostats the translational velocity of particles. :doc:`Fix nvt/sllod ` also does this, @@ -82,10 +87,10 @@ that: .. note:: - Only the nvt fixes perform time integration, meaning they update + Not all thermostat fixes perform time integration, meaning they update the velocities and positions of particles due to forces and velocities respectively. The other thermostat fixes only adjust velocities; they - do NOT perform time integration updates. Thus they should be used in + do NOT perform time integration updates. Thus, they should be used in conjunction with a constant NVE integration fix such as these: * :doc:`fix nve ` diff --git a/doc/src/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst index 47a1b9b578..76c470d615 100644 --- a/doc/src/Howto_tip4p.rst +++ b/doc/src/Howto_tip4p.rst @@ -1,5 +1,5 @@ -TIP4P water model -================= +TIP4P and OPC water models +========================== The four-point TIP4P rigid water model extends the traditional :doc:`three-point TIP3P ` model by adding an additional @@ -9,9 +9,11 @@ the oxygen along the bisector of the HOH bond angle. A bond style of :doc:`harmonic ` and an angle style of :doc:`harmonic ` or :doc:`charmm ` should also be used. In case of rigid bonds also bond style :doc:`zero ` and angle -style :doc:`zero ` can be used. +style :doc:`zero ` can be used. Very similar to the TIP4P +model is the OPC water model. It can be realized the same way as TIP4P +but has different geometry and force field parameters. -There are two ways to implement TIP4P water in LAMMPS: +There are two ways to implement TIP4P-like water in LAMMPS: #. Use a specially written pair style that uses the :ref:`TIP3P geometry ` without the point M. The point M location is then @@ -21,7 +23,10 @@ There are two ways to implement TIP4P water in LAMMPS: computationally very efficient, but the charge distribution in space is only correct within the tip4p labeled styles. So all other computations using charges will "see" the negative charge incorrectly - on the oxygen atom. + located on the oxygen atom unless they are specially written for using + the TIP4P geometry internally as well, e.g. :doc:`compute dipole/tip4p + `, :doc:`fix efield/tip4p `, or + :doc:`kspace_style pppm/tip4p `. This can be done with the following pair styles for Coulomb with a cutoff: @@ -68,77 +73,90 @@ TIP4P/2005 model :ref:`(Abascal2) ` and a version of TIP4P parameters adjusted for use with a long-range Coulombic solver (e.g. Ewald or PPPM in LAMMPS). Note that for implicit TIP4P models the OM distance is specified in the :doc:`pair_style ` command, -not as part of the pair coefficients. +not as part of the pair coefficients. Also parameters for the OPC +model (:ref:`Izadi `) are provided. .. list-table:: :header-rows: 1 - :widths: 36 19 13 15 17 + :widths: 40 12 12 14 11 11 * - Parameter - TIP4P (original) - TIP4P/Ice - TIP4P/2005 - TIP4P (Ewald) + - OPC * - O mass (amu) - 15.9994 - 15.9994 - 15.9994 - 15.9994 + - 15.9994 * - H mass (amu) - 1.008 - 1.008 - 1.008 - 1.008 + - 1.008 * - O or M charge (:math:`e`) - -1.040 - -1.1794 - -1.1128 - -1.04844 + - -1.3582 * - H charge (:math:`e`) - 0.520 - 0.5897 - 0.5564 - 0.52422 + - 0.6791 * - LJ :math:`\epsilon` of OO (kcal/mole) - 0.1550 - 0.21084 - 0.1852 - 0.16275 + - 0.21280 * - LJ :math:`\sigma` of OO (:math:`\AA`) - 3.1536 - 3.1668 - 3.1589 - 3.16435 + - 3.1660 * - LJ :math:`\epsilon` of HH, MM, OH, OM, HM (kcal/mole) - 0.0 - 0.0 - 0.0 - 0.0 + - 0.0 * - LJ :math:`\sigma` of HH, MM, OH, OM, HM (:math:`\AA`) - 1.0 - 1.0 - 1.0 - 1.0 + - 1.0 * - :math:`r_0` of OH bond (:math:`\AA`) - 0.9572 - 0.9572 - 0.9572 - 0.9572 + - 0.8724 * - :math:`\theta_0` of HOH angle - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` - 104.52\ :math:`^{\circ}` + - 103.60\ :math:`^{\circ}` * - OM distance (:math:`\AA`) - 0.15 - 0.1577 - 0.1546 - 0.1250 + - 0.1594 -Note that the when using the TIP4P pair style, the neighbor list cutoff +Note that the when using a TIP4P pair style, the neighbor list cutoff for Coulomb interactions is effectively extended by a distance 2 \* (OM distance), to account for the offset distance of the fictitious charges -on O atoms in water molecules. Thus it is typically best in an +on O atoms in water molecules. Thus, it is typically best in an efficiency sense to use a LJ cutoff >= Coulomb cutoff + 2\*(OM distance), to shrink the size of the neighbor list. This leads to slightly larger cost for the long-range calculation, so you can test the @@ -192,6 +210,94 @@ file changed): run 20000 write_data tip4p-implicit.data nocoeff +When constructing an OPC model, we cannot use the ``tip3p.mol`` file due +to the different geometry. Below is a molecule file providing the 3 +sites of an implicit OPC geometry for use with TIP4P styles. Note, that +the "Shake" and "Special" sections are missing here. Those will be +auto-generated by LAMMPS when the molecule file is loaded *after* the +simulation box has been created. These sections are required only when +the molecule file is loaded *before*. + +.. _opc3p_molecule: +.. code-block:: + + # Water molecule. 3 point geometry for OPC model + + 3 atoms + 2 bonds + 1 angles + + Coords + + 1 0.00000 -0.06037 0.00000 + 2 0.68558 0.50250 0.00000 + 3 -0.68558 0.50250 0.00000 + + Types + + 1 1 # O + 2 2 # H + 3 2 # H + + Charges + + 1 -1.3582 + 2 0.6791 + 3 0.6791 + + Bonds + + 1 1 1 2 + 2 1 1 3 + + Angles + + 1 1 2 1 3 + +Below is a LAMMPS input file using the implicit method to implement +the OPC model using the molecule file from above and including the +PPPM long-range Coulomb solver. + +.. code-block:: LAMMPS + + units real + atom_style full + region box block -5 5 -5 5 -5 5 + create_box 2 box bond/types 1 angle/types 1 & + extra/bond/per/atom 2 extra/angle/per/atom 1 extra/special/per/atom 2 + + mass 1 15.9994 + mass 2 1.008 + + pair_style lj/cut/tip4p/long 1 2 1 1 0.1594 12.0 + pair_coeff 1 1 0.2128 3.166 + pair_coeff 2 2 0.0 1.0 + + bond_style zero + bond_coeff 1 0.8724 + + angle_style zero + angle_coeff 1 103.6 + + kspace_style pppm/tip4p 1.0e-5 + + molecule water opc3p.mol # this file has the OPC geometry but is without M + create_atoms 0 random 33 34564 NULL mol water 25367 overlap 1.33 + + fix rigid all shake 0.001 10 10000 b 1 a 1 + minimize 0.0 0.0 1000 10000 + + reset_timestep 0 + timestep 1.0 + velocity all create 300.0 5463576 + fix integrate all nvt temp 300 300 100.0 + + thermo_style custom step temp press etotal pe + + thermo 1000 + run 20000 + write_data opc-implicit.data nocoeff + Below is the code for a LAMMPS input file using the explicit method and a TIP4P molecule file. Because of using :doc:`fix rigid/small ` no bonds need to be defined and thus no extra storage needs @@ -279,3 +385,8 @@ Phys, 79, 926 (1983). **(Abascal2)** Abascal, J Chem Phys, 123, 234505 (2005) https://doi.org/10.1063/1.2121687 + +.. _Izadi: + +**(Izadi)** Izadi, Anandakrishnan, Onufriev, J. Phys. Chem. Lett., 5, 21, 3863 (2014) + https://doi.org/10.1021/jz501780a diff --git a/doc/src/Intro_authors.rst b/doc/src/Intro_authors.rst index 38f1102595..730cd2e336 100644 --- a/doc/src/Intro_authors.rst +++ b/doc/src/Intro_authors.rst @@ -84,8 +84,9 @@ lammps.org". General questions about LAMMPS should be posted in the \normalsize -Past developers include Paul Crozier and Mark Stevens, both at SNL, -and Ray Shan, now at Materials Design. +Past core developers include Paul Crozier and Mark Stevens, both at SNL, +and Ray Shan while at SNL and later at Materials Design, now at Thermo +Fisher Scientific. ---------- diff --git a/doc/src/Intro_portability.rst b/doc/src/Intro_portability.rst index 63ae147b8c..564cdc47f4 100644 --- a/doc/src/Intro_portability.rst +++ b/doc/src/Intro_portability.rst @@ -28,8 +28,9 @@ Build systems LAMMPS can be compiled from source code using a (traditional) build system based on shell scripts, a few shell utilities (grep, sed, cat, tr) and the GNU make program. This requires running within a Bourne -shell (``/bin/sh``). Alternatively, a build system with different back -ends can be created using CMake. CMake must be at least version 3.16. +shell (``/bin/sh`` or ``/bin/bash``). Alternatively, a build system +with different back ends can be created using CMake. CMake must be +at least version 3.16. Operating systems ^^^^^^^^^^^^^^^^^ @@ -40,11 +41,18 @@ Also, compilation and correct execution on macOS and Windows (using Microsoft Visual C++) is checked automatically for the largest part of the source code. Some (optional) features are not compatible with all operating systems, either through limitations of the corresponding -LAMMPS source code or through incompatibilities of source code or -build system of required external libraries or packages. +LAMMPS source code or through incompatibilities or build system +limitations of required external libraries or packages. -Executables for Windows may be created natively using either Cygwin or -Visual Studio or with a Linux to Windows MinGW cross-compiler. +Executables for Windows may be created either natively using Cygwin, +MinGW, Intel, Clang, or Microsoft Visual C++ compilers, or with a Linux +to Windows MinGW cross-compiler. Native compilation is supported using +Microsoft Visual Studio or a terminal window (using the CMake build +system). + +Executables for macOS may be created either using Xcode or GNU compilers +installed with Homebrew. In the latter case, building of LAMMPS through +Homebrew instead of a manual compile is also possible. Additionally, FreeBSD and Solaris have been tested successfully to run LAMMPS and produce results consistent with those on Linux. @@ -61,8 +69,9 @@ CPU architectures ^^^^^^^^^^^^^^^^^ The primary CPU architecture for running LAMMPS is 64-bit x86, but also -32-bit x86, and 64-bit ARM and PowerPC (64-bit, Little Endian) are -regularly tested. +64-bit ARM and PowerPC (64-bit, Little Endian) are currently regularly +tested. Further architectures are tested by Linux distributions that +bundle LAMMPS. Portability compliance ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/src/JPG/lammps-gui-screen.png b/doc/src/JPG/lammps-gui-screen.png new file mode 100644 index 0000000000..cae0ae9fe9 Binary files /dev/null and b/doc/src/JPG/lammps-gui-screen.png differ diff --git a/doc/src/JPG/lammps-releases.png b/doc/src/JPG/lammps-releases.png index d5c317088f..b81039c007 100644 Binary files a/doc/src/JPG/lammps-releases.png and b/doc/src/JPG/lammps-releases.png differ diff --git a/doc/src/Modify_pair.rst b/doc/src/Modify_pair.rst index 64831e726f..84f06a3acd 100644 --- a/doc/src/Modify_pair.rst +++ b/doc/src/Modify_pair.rst @@ -46,6 +46,8 @@ Here is a brief list of some the class methods in the Pair class that +---------------------------------+------------------------------------------------------------------------+ | compute_inner/middle/outer | versions of compute used by rRESPA | +---------------------------------+------------------------------------------------------------------------+ +| compute_atomic_energy | energy of one atom, equivalent to per-atom energy | ++---------------------------------+------------------------------------------------------------------------+ | memory_usage | return estimated amount of memory used by the pair style | +---------------------------------+------------------------------------------------------------------------+ | modify_params | process arguments to pair_modify command | @@ -122,3 +124,5 @@ setting. +---------------------------------+-------------------------------------------------------------+---------+ | spinflag | 1 if compatible with spin kspace_style | 0 | +---------------------------------+-------------------------------------------------------------+---------+ +| atomic_energy_enable | 1 if compute_atomic_energy() routine exists | 0 | ++---------------------------------+-------------------------------------------------------------+---------+ diff --git a/doc/src/PDF/colvars-refman-lammps.pdf b/doc/src/PDF/colvars-refman-lammps.pdf index b8f049ce01..76d94f8e3a 100644 Binary files a/doc/src/PDF/colvars-refman-lammps.pdf and b/doc/src/PDF/colvars-refman-lammps.pdf differ diff --git a/doc/src/Tools.rst b/doc/src/Tools.rst index 488de848bf..521cfe5f16 100644 --- a/doc/src/Tools.rst +++ b/doc/src/Tools.rst @@ -475,9 +475,13 @@ beginners to start with LAMMPS, it is also the expectation that LAMMPS-GUI users will eventually transition to workflows that most experienced LAMMPS users employ. -All features have been extensively exposed to keyboard shortcuts, so -that there is also appeal for experienced LAMMPS users for prototyping -and testing simulation setups. +.. image:: JPG/lammps-gui-screen.png + :align: center + :scale: 50% + +Features have been extensively exposed to keyboard shortcuts, so that +there is also appeal for experienced LAMMPS users for prototyping and +testing simulation setups. Features ^^^^^^^^ @@ -502,7 +506,7 @@ Here are a few highlights of LAMMPS-GUI - Visualization of current state in Image Viewer (via calling :doc:`write_dump image `) - Capture of images created via :doc:`dump image ` in Slide show window - Dialog to set variables, similar to the LAMMPS command-line flag '-v' / '-var' -- Support for GPU, INTEL, KOKKOS/OpenMP, OPENMAP, and OPT and accelerator packages +- Support for GPU, INTEL, KOKKOS/OpenMP, OPENMP, and OPT accelerator packages Parallelization ^^^^^^^^^^^^^^^ @@ -523,8 +527,8 @@ with CMake is required. The LAMMPS-GUI has been successfully compiled and tested on: - Ubuntu Linux 20.04LTS x86_64 using GCC 9, Qt version 5.12 -- Fedora Linux 40 x86\_64 using GCC 14 and Clang 17, Qt version 5.15LTS -- Fedora Linux 40 x86\_64 using GCC 14, Qt version 6.7 +- Fedora Linux 41 x86\_64 using GCC 14 and Clang 17, Qt version 5.15LTS +- Fedora Linux 41 x86\_64 using GCC 14, Qt version 6.8 - Apple macOS 12 (Monterey) and macOS 13 (Ventura) with Xcode on arm64 and x86\_64, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.36, Qt version 5.15LTS - Windows 10 and 11 x86_64 with Visual Studio 2022 and Visual C++ 14.40, Qt version 6.7 diff --git a/doc/src/compute_bond_local.rst b/doc/src/compute_bond_local.rst index e070d507b1..7ce6f9b15a 100644 --- a/doc/src/compute_bond_local.rst +++ b/doc/src/compute_bond_local.rst @@ -64,20 +64,32 @@ All these properties are computed for the pair of atoms in a bond, whether the two atoms represent a simple diatomic molecule, or are part of some larger molecule. -The value *dist* is the current length of the bond. -The values *dx*, *dy*, and *dz* are the xyz components of the -*distance* between the pair of atoms. This value is always the -distance from the atom of lower to the one with the higher id. +.. versionchanged:: TBD + + The sign of *dx*, *dy*, *dz* is no longer determined by the atom IDs + of the bonded atoms but by their order in the bond list to be + consistent with *fx*, *fy*, and *fz*. + +The value *dist* is the current length of the bond. The values *dx*, +*dy*, and *dz* are the :math:`(x,y,z)` components of the distance vector +:math:`\vec{x_i} - \vec{x_j}` between the atoms in the bond. The order +of the atoms is determined by the bond list and the respective atom-IDs +can be output with :doc:`compute property/local +`. The value *engpot* is the potential energy for the bond, 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 value *force* is the magnitude of the force acting between the pair +of atoms in the bond, 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* between the pair of atoms in the bond. For bond styles that apply -non-central forces, such as :doc:`bond_style bpm/rotational +The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of +the force on the first atom *i* in the bond due to the second atom *j*. +Mathematically, they are obtained by multiplying the value of *force* +from above with a unit vector created from the *dx*, *dy*, and *dz* +components of the distance vector also described above. For bond styles +that apply non-central forces, such as :doc:`bond_style bpm/rotational `, these values only include the :math:`(x,y,z)` components of the normal force component. diff --git a/doc/src/compute_pair_local.rst b/doc/src/compute_pair_local.rst index 31209f63f4..605bfc8e9e 100644 --- a/doc/src/compute_pair_local.rst +++ b/doc/src/compute_pair_local.rst @@ -56,19 +56,33 @@ force cutoff distance for that interaction, as defined by the :doc:`pair_style ` and :doc:`pair_coeff ` commands. -The value *dist* is the distance between the pair of atoms. -The values *dx*, *dy*, and *dz* are the :math:`(x,y,z)` components of the -*distance* between the pair of atoms. This value is always the -distance from the atom of higher to the one with the lower atom ID. +.. versionchanged:: TBD + + The sign of *dx*, *dy*, *dz* is no longer determined by the value of + their atom-IDs but by their order in the neighbor list to be + consistent with *fx*, *fy*, and *fz*. + +The value *dist* is the distance between the pair of atoms. The values +*dx*, *dy*, and *dz* are the :math:`(x,y,z)` components of the distance +vector :math:`\vec{x_i} - \vec{x_j}` between the pair of atoms. The +order of the atoms is determined by the neighbor list and the respective +atom-IDs can be output with :doc:`compute property/local +`. 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 :math:`(x,y,z)` components of -*force* on atom I. For pair styles that apply non-central forces, -such as :doc:`granular pair styles `, these values only include -the :math:`(x,y,z)` components of the normal force component. +force. + +The values *fx*, *fy*, and *fz* are the :math:`(x,y,z)` components of +the force vector on the first atom *i* of a pair in the neighbor list +due to the second atom *j*. Mathematically, they are obtained by +multiplying the value of *force* from above with a unit vector created +from the *dx*, *dy*, and *dz* components of the distance vector also +described above. For pair styles that apply non-central forces, such as +:doc:`granular pair styles `, these values only include the +:math:`(x,y,z)` components of the normal force component. A pair style may define additional pairwise quantities which can be accessed as *p1* to *pN*, where :math:`N` is defined by the pair style. diff --git a/doc/src/fix.rst b/doc/src/fix.rst index 22996a327a..602f34ff8a 100644 --- a/doc/src/fix.rst +++ b/doc/src/fix.rst @@ -256,6 +256,7 @@ accelerated styles exist. * :doc:`flow/gauss ` - Gaussian dynamics for constant mass flux * :doc:`freeze ` - freeze atoms in a granular simulation * :doc:`gcmc ` - grand canonical insertions/deletions +* :doc:`gjf ` - statistically correct Langevin temperature control using the GJ methods * :doc:`gld ` - generalized Langevin dynamics integrator * :doc:`gle ` - generalized Langevin equation thermostat * :doc:`gravity ` - add gravity to atoms in a granular simulation @@ -290,6 +291,7 @@ accelerated styles exist. * :doc:`mvv/tdpd ` - constant temperature DPD using the modified velocity-Verlet algorithm * :doc:`neb ` - nudged elastic band (NEB) spring forces * :doc:`neb/spin ` - nudged elastic band (NEB) spring forces for spins +* :doc:`neighbor/swap ` - kinetic Monte Carlo (kMC) atom swapping * :doc:`nonaffine/displacement ` - calculate nonaffine displacement of atoms * :doc:`nph ` - constant NPH time integration via Nose/Hoover * :doc:`nph/asphere ` - NPH for aspherical particles diff --git a/doc/src/fix_gjf.rst b/doc/src/fix_gjf.rst new file mode 100644 index 0000000000..82d283db34 --- /dev/null +++ b/doc/src/fix_gjf.rst @@ -0,0 +1,208 @@ +.. index:: fix gjf + +fix gjf command +======================== + +Syntax +"""""" + +.. code-block:: LAMMPS + + fix ID group-ID gjf Tstart Tstop damp seed keyword values ... + +* ID, group-ID are documented in :doc:`fix ` command +* gjf = style name of this fix command +* Tstart,Tstop = desired temperature at start/end of run (temperature units) +* Tstart can be a variable (see below) +* damp = damping parameter (time units) +* seed = random number seed to use for white noise (positive integer) +* zero or more keyword/value pairs may be appended +* keyword = *vel* or *method* + + .. parsed-literal:: + + *vel* value = *vfull* or *vhalf* + *vfull* = use on-site velocity + *vhalf* = use half-step velocity + *method* value = *1-8* + *1-8* = choose one of the many GJ formulations + *7* = requires input of additional scalar between 0 and 1 + +Examples +"""""""" + +.. code-block:: LAMMPS + + fix 3 boundary gjf 10.0 10.0 1.0 699483 + fix 1 all gjf 10.0 100.0 100.0 48279 vel vfull method 4 + fix 2 all gjf 10.0 10.0 1.0 26488 method 7 0.95 + +Description +""""""""""" +.. versionadded:: TBD + +Apply a Langevin thermostat as described in :ref:`(Gronbech-Jensen-2020) ` +to a group of atoms which models an interaction with a background +implicit solvent. As described in the papers cited below, the GJ methods +provide exact diffusion, drift, and Boltzmann sampling for linear systems for +any time step within the stability limit. The purpose of this set of methods +is therefore to significantly improve statistical accuracy at longer time steps +compared to other thermostats. + +The current implementation provides the user with the option to output +the velocity in one of two forms: *vfull* or *vhalf*. The option *vhalf* +outputs the 2GJ half-step velocity given in :ref:`Gronbech Jensen/Gronbech-Jensen +`; for linear systems, this velocity is shown to not +have any statistical errors for any stable time step. The option *vfull* +outputs the on-site velocity given in :ref:`Gronbech-Jensen/Farago +`; this velocity is shown to be systematically lower +than the target temperature by a small amount, which grows +quadratically with the timestep. An overview of statistically correct Boltzmann +and Maxwell-Boltzmann sampling of true on-site and true half-step velocities is +given in :ref:`Gronbech-Jensen-2020 `. + +This fix allows the use of several GJ methods as listed in :ref:`Gronbech-Jensen-2020 `. +The GJ-VII method is described in :ref:`Finkelstein ` and GJ-VIII +is described in :ref:`Gronbech-Jensen-2024 `. +The implementation follows the splitting form provided in Eqs. (24) and (25) +in :ref:`Gronbech-Jensen-2024 `, including the application +of Gaussian noise values, per the description in +:ref:`Gronbech-Jensen-2023 `. + + +.. note:: + + Unlike the :doc:`fix langevin ` command which performs force + modifications only, this fix performs thermostatting and time integration. + Thus you no longer need a separate time integration fix, like :doc:`fix nve `. + +See the :doc:`Howto thermostat ` page for +a discussion of different ways to compute temperature and perform +thermostatting. + +The desired temperature at each timestep is a ramped value during the +run from *Tstart* to *Tstop*\ . + +*Tstart* can be specified as an equal-style or atom-style +:doc:`variable `. In this case, the *Tstop* setting is +ignored. 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 +target temperature. + +Equal-style variables can specify formulas with various mathematical +functions, and include :doc:`thermo_style ` command +keywords for the simulation box parameters and timestep and elapsed +time. Thus it is easy to specify a time-dependent temperature. + +Atom-style variables can specify the same formulas as equal-style +variables but can also include per-atom values, such as atom +coordinates. Thus it is easy to specify a spatially-dependent +temperature with optional time-dependence as well. + +Like other fixes that perform thermostatting, this fix can be used +with :doc:`compute commands ` that remove a "bias" from the +atom velocities. E.g. to apply the thermostat only to atoms within a +spatial :doc:`region `, or to remove the center-of-mass +velocity from a group of atoms, or to remove the x-component of +velocity from the calculation. + +This is not done by default, but only if the :doc:`fix_modify +` command is used to assign a temperature compute to this +fix that includes such a bias term. See the doc pages for individual +:doc:`compute temp commands ` to determine which ones include +a bias. + +The *damp* parameter is specified in time units and determines how +rapidly the temperature is relaxed. For example, a value of 100.0 means +to relax the temperature in a timespan of (roughly) 100 time units +(:math:`\tau` or fs or ps - see the :doc:`units ` command). The +damp factor can be thought of as inversely related to the viscosity of +the solvent. I.e. a small relaxation time implies a high-viscosity +solvent and vice versa. See the discussion about :math:`\gamma` and +viscosity in the documentation for the :doc:`fix viscous ` +command for more details. + +The random # *seed* must be a positive integer. A Marsaglia random +number generator is used. Each processor uses the input seed to +generate its own unique seed and its own stream of random numbers. +Thus the dynamics of the system will not be identical on two runs on +different numbers of processors. + +---------- + +The keyword/value option pairs are used in the following ways. + +The keyword *vel* determines which velocity is used to determine +quantities of interest in the simulation. + +The keyword *method* selects one of the eight GJ-methods implemented in LAMMPS. + +---------- + +Restart, fix_modify, output, run start/stop, minimize info +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +No information about this fix is written to :doc:`binary restart files `. +Because the state of the random number generator is not saved in restart files, +this means you cannot do "exact" restarts with this fix, where the simulation +continues on the same as if no restart had taken place. However, in a +statistical sense, a restarted simulation should produce the same behavior. +Additionally, the GJ methods implement noise exclusively within each time step +(unlike the BBK thermostat of the fix-langevin). The restart is done with +either vfull or vhalf velocity output for as long as the choice of vfull/vhalf +is the same for the simulation as it is in the restart file. + +The :doc:`fix_modify ` *temp* option is supported by this +fix. You can use it to assign a temperature :doc:`compute ` +you have defined to this fix which will be used in its thermostatting +procedure, as described above. For consistency, the group used by +this fix and by the compute should be the same. + +This fix can ramp its target temperature over multiple runs, using the +*start* and *stop* keywords of the :doc:`run ` command. See the +:doc:`run ` command for details of how to do this. + +This fix is not invoked during :doc:`energy minimization `. + +Restrictions +"""""""""""" + +This fix is not compatible with run_style respa. It is not compatible with +accelerated packages such as KOKKOS. + +Related commands +"""""""""""""""" + +:doc:`fix langevin `, :doc:`fix nvt ` + +Default +""""""" + +The option defaults are vel = vhalf, method = 1. + +---------- + +.. _Gronbech-Jensen-2020: + +**(Gronbech-Jensen-2020)** Gronbech-Jensen, Mol Phys 118, e1662506 (2020). + +.. _Gronbech-Jensen-2019: + +**(Gronbech Jensen/Gronbech-Jensen)** Gronbech Jensen and Gronbech-Jensen, Mol Phys, 117, 2511 (2019) + +.. _Gronbech-Jensen-Farago: + +**(Gronbech-Jensen/Farago)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 (2013). + +.. _Finkelstein: + +**(Finkelstein)** Finkelstein, Cheng, Florin, Seibold, Gronbech-Jensen, J. Chem. Phys., 155, 18 (2021) + +.. _Gronbech-Jensen-2024: + +**(Gronbech-Jensen-2024)** Gronbech-Jensen, J. Stat. Phys. 191, 137 (2024). + +.. _Gronbech-Jensen-2023: + +**(Gronbech-Jensen-2023)** Gronbech-Jensen, J. Stat. Phys. 190, 96 (2023). diff --git a/doc/src/fix_langevin.rst b/doc/src/fix_langevin.rst index 30e4c48270..b8be16e16d 100644 --- a/doc/src/fix_langevin.rst +++ b/doc/src/fix_langevin.rst @@ -56,7 +56,7 @@ Examples Description """"""""""" -Apply a Langevin thermostat as described in :ref:`(Schneider) ` +Apply a Langevin thermostat as described in :ref:`(Bruenger) ` to a group of atoms which models an interaction with a background implicit solvent. Used with :doc:`fix nve `, this command performs Brownian dynamics (BD), since the total force on each atom @@ -241,6 +241,13 @@ 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. +.. deprecated:: TDB + +The *gjf* keyword in fix langevin is deprecated and will be removed +soon. The GJF functionality has been moved to its own fix style +:doc:`fix gjf ` and it is strongly recommended to use that +fix instead. + The keyword *gjf* can be used to run the :ref:`Gronbech-Jensen/Farago ` time-discretization of the Langevin model. As described in the papers cited below, the purpose of this method is to @@ -324,14 +331,16 @@ types, tally = no, zero = no, gjf = no. ---------- +.. _Bruenger1: + +**(Bruenger)** Bruenger, Brooks, and Karplus, Chem. Phys. Lett. 105, 495 (1982). +[Previously attributed to Schneider and Stoll, Phys. Rev. B 17, 1302 (1978). +Implementation remains unchanged.] + .. _Dunweg1: **(Dunweg)** Dunweg and Paul, Int J of Modern Physics C, 2, 817-27 (1991). -.. _Schneider1: - -**(Schneider)** Schneider and Stoll, Phys Rev B, 17, 1302 (1978). - .. _Gronbech-Jensen: **(Gronbech-Jensen)** Gronbech-Jensen and Farago, Mol Phys, 111, 983 diff --git a/doc/src/fix_neighbor_swap.rst b/doc/src/fix_neighbor_swap.rst new file mode 100644 index 0000000000..dffbc93217 --- /dev/null +++ b/doc/src/fix_neighbor_swap.rst @@ -0,0 +1,264 @@ +.. index:: fix neighbor/swap + +fix neighbor/swap command +========================= + +Syntax +"""""" + +.. code-block:: LAMMPS + + fix ID group-ID neighbor/swap N X seed T R0 voro-ID keyword values ... + +* ID, group-ID are documented in :doc:`fix ` command +* neighbor/swap = style name of this fix command +* N = invoke this fix every N steps +* X = number of swaps to attempt every N steps +* seed = random # seed (positive integer) +* T = scaling temperature of the MC swaps (temperature units) +* R0 = scaling swap probability of the MC swaps (distance units) +* voro-ID = valid voronoi compute id (compute voronoi/atom) +* one or more keyword/value pairs may be appended to args +* keywords *types* and *diff* are mutually exclusive, but one must be specified +* keyword = *types* or *diff* or *ke* or *region* or *rates* + + .. parsed-literal:: + + *types* values = two or more atom types (Integers in range [1,Ntypes] or type labels) + *diff* values = one atom type + *ke* value = *yes* or *no* + *yes* = kinetic energy is conserved after atom swaps + *no* = no conservation of kinetic energy after atom swaps + *region* value = region-ID + region-ID = ID of region to use as an exchange/move volume + *rates* values = V1 V2 . . . Vntypes values to conduct variable diffusion for different atom types (unitless) + +Examples +"""""""" + +.. code-block:: LAMMPS + + compute voroN all voronoi/atom neighbors yes + fix mc all neighbor/swap 10 160 15238 1000.0 3.0 voroN diff 2 + fix myFix all neighbor/swap 100 1 12345 298.0 3.0 voroN region my_swap_region types 5 6 + fix kmc all neighbor/swap 1 100 345 1.0 3.0 voroN diff 3 rates 3 1 6 + +Description +""""""""""" + +.. versionadded:: TBD + +This fix performs Monte-Carlo (MC) evaluations to enable kinetic +Monte Carlo (kMC)-type behavior during MD simulation by allowing +neighboring atoms to swap their positions. In contrast to the :doc:`fix +atom/swap ` command which swaps pairs of atoms anywhere +in the simulation domain, the restriction of the MC swapping to +neighbors enables a hybrid MD/kMC-like simulation. + +Neighboring atoms are defined by using a Voronoi tesselation performed +by the :doc:`compute voronoi/atom ` command. +Two atoms are neighbors if their Voronoi cells share a common face +(3d) or edge (2d). + +The selection of a swap neighbor is made using a distance-based +criterion for weighting the selection probability of each swap, in the +same manner as kMC selects a next event using relative probabilities. +The acceptance or rejection of each swap is determined via the +Metropolis criterion after evaluating the change in system energy due +to the swap. + +A detailed explanation of the original implementation of this +algorithm can be found in :ref:`(Tavenner 2023) ` +where it was used to simulated accelerated diffusion in an MD context. + +Simulating inherently kinetically-limited behaviors which rely on rare +events (such as atomic diffusion in a solid) is challenging for +traditional MD since its relatively short timescale will not naturally +sample many events. This fix addresses this challenge by allowing rare +neighbor hopping events to be sampled in a kMC-like fashion at a much +faster rate (set by the specified *N* and *X* parameters). This enables +the processes of atomic diffusion to be approximated during an MD +simulation, effectively decoupling the MD atomic vibrational timescale +and the atomic hopping (kMC event) timescale. + +The algorithm implemented by this fix is as follows: + + - The MD simulation is paused every *N* steps + - A Voronoi tesselation is performed for the current atom configuration. + - Then *X* atom swaps are attempted, one after the other. + - For each swap, an atom *I* is selected randomly from the list of + atom types specified by either the *types* or *diff* keywords. + - One of *I*'s Voronoi neighbors *J* is selected using the + distance-weighted probability for each neighbor detailed below. + - The *I,J* atom IDs are communicated to all processors so that a + global energy evaluation can be performed for the post-swap state + of the system. + - The swap is accepted or rejected based on the Metropolis criterion + using the energy change of the system and the specified temperature + *T*. + +Here are a few comments on the computational cost of the swapping +algorithm. + + 1. The cost of a global energy evaluation is similar to that of an MD + timestep. + + 2. Similar to other MC algorithms in LAMMPS, improved parallel + efficiency is achieved with a smaller number of atoms per + processor than would typically be used in an standard MD + simulation. This is because the per-energy evaluation cost + increases relative to the balance of MD/MC steps as indicated by + 1., but the communication cost remains relatively constant for a + given number of MD steps. + + 3. The MC portion of the simulation will run dramatically slower if + the pair style uses different cutoffs for different atom types (or + type pairs). This is because each atom swap then requires a + rebuild of the neighbor list to ensure the post-swap global energy + can be computed correctly. + +Limitations are imposed on selection of *I,J* atom pairs to avoid +swapping of atoms which are outside of a reasonable cutoff (e.g. due to +a Voronoi tesselation near free surfaces) though the use of a +distance-weighted probability scaling. + +---------- + +This section gives more details on other arguments and keywords. + +The random number generator (RNG) used by all the processors for MC +operations is initialized with the specified *seed*. + +The distance-based probability is weighted by the specified *R0* which +sets the radius :math:`r_0` in this formula + +.. math:: + + p_{ij} = e^{(\frac{r_{ij}}{r_0})^2} + +where :math:`p_{ij}` is the probability of selecting atom :math:`j` to +swap with atom :math:`i`. Typically, a value for *R0* around the +average nearest-neighbor spacing is appropriate. Since this is simply a +probability weighting, the swapping behavior is not very sensitive to +the exact value of *R0*. + +The required *voro-ID* value is the compute-ID of a +:doc:`compute voronoi/atom ` command like +this: + +.. code-block:: LAMMPS + + compute compute-ID group-ID voronoi/atom neighbors yes + +It must return per-atom list of valid neighbor IDs as in the +:doc:`compute voronoi/atom ` command. + +The keyword *types* takes two or more atom types as its values. Only +atoms *I* of the first atom type will be selected. Only atoms *J* of the +remaining atom types will be considered as potential swap partners. + +The keyword *diff* take a single atom type as its value. Only atoms +*I* of the that atom type will be selected. Atoms *J* of all +remaining atom types will be considered as potential swap partners. +This includes the atom type specified with the *diff* keyword to +account for self-diffusive hops between two atoms of the same type. + +Note that the *neighbors yes* option must be enabled for use with this +fix. The group-ID should include all the atoms which this fix will +potentially select. I.e. the group-ID used in the voronoi compute should +include the same atoms as that indicated by the *types* keyword. If the +*diff* keyword is used, the group-ID should include atoms of all types +in the simulation. + +The keyword *ke* takes *yes* (default) or *no* as its value. It two +atoms are swapped with different masses, then a value of *yes* will +rescale their respective velocities to conserve the kinetic energy of +the system. A value of *no* will perform no rescaling, so that +kinetic energy is not conserved. See the restriction on this keyword +below. + +The *region* keyword takes a *region-ID* as its value. If specified, +then only atoms *I* and *J* within the geometric region will be +considered as swap partners. See the :doc:`region ` command +for details. This means the group-ID for the :doc:`compute +voronoi/atom ` command also need only contain +atoms within the region. + +The keyword *rates* can modify the swap rate based on the type of atom +*J*. Ntype values must be specified, where Ntype = the number of atom +types in the system. Each value is used to scale the probability +weighting given by the equation above. In the third example command +above, a simulation has 3 atoms types. Atom *I*s of type 1 are +eligible for swapping. Swaps may occur with atom *J*s of all 3 types. +Assuming all *J* atoms are equidistant from an atom *I*, *J* atoms of +type 1 will be 3x more likely to be selected as a swap partner than +atoms of type 2. And *J* atoms of type 3 will be 6.5x more likely to +be selected than atoms of type 2. If the *rates* keyword is not used, +all atom types will be treated with the same probability during selection +of swap attempts. + + +Restart, fix_modify, output, run start/stop, minimize info +"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +This fix writes the state of the fix to :doc:`binary restart files +`. This includes information about the random number generator +seed, the next timestep for MC exchanges, and the number of exchange +attempts and successes. 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. + +This fix computes a global vector of length 2, which can be accessed +by various :doc:`output commands `. The vector values are +the following global cumulative quantities: + + #. swap attempts + #. swap accepts + +The vector values calculated by this fix are "intensive". + +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 `. + +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. Also this fix requires that the :ref:`VORONOI +package ` is installed, otherwise the fix will not be +compiled. + +The :doc:`compute voronoi/atom ` command +referenced by the required voro-ID must return neighboring atoms as +illustrated in the examples above. + +If this fix is used with systems that do not have per-type masses +(e.g. atom style sphere), the *ke* keyword must be set to *off* since +the implemented algorithm will not be able to re-scale velocities +properly. + +Related commands +"""""""""""""""" + +:doc:`fix nvt `, :doc:`compute voronoi/atom ` +:doc:`delete_atoms `, :doc:`fix gcmc `, +:doc:`fix atom/swap `, :doc:`fix mol/swap `, +:doc:`fix sgcmc ` + +Default +""""""" + +The option defaults are *ke* = yes and *rates* = 1 for all atom types. + +---------- + +.. _TavennerMDkMC: + +**(Tavenner 2023)** J Tavenner, M Mendelev, J Lawson, Computational + Materials Science, 218, 111929 (2023). diff --git a/doc/src/fix_qeq_rel_reaxff.rst b/doc/src/fix_qeq_rel_reaxff.rst index 012980e230..98023ab51a 100644 --- a/doc/src/fix_qeq_rel_reaxff.rst +++ b/doc/src/fix_qeq_rel_reaxff.rst @@ -37,18 +37,18 @@ Examples Description """"""""""" -.. versionadded:: 19Nov2024 +.. versionadded:: 2Apr2025 -This fix implements the QEqR method for charge equilibration, which -differs from the QEq charge equilibration method :ref:`(Rappe and -Goddard) ` only in how external electric fields are accounted -for. This fix therefore raises a warning when used without :doc:`fix -efield ` since :doc:`fix qeq/reaxff ` should -be used without an external electric field. Charges are computed with -the QEqR method by minimizing the electrostatic energy of the system in -the same way as the QEq method but where the absolute electronegativity, -:math:`\chi_i`, of each atom in the QEq method is replaced with an -effective electronegativity given by +This fix implements the QEqR method :ref:`(Lalli) ` for charge +equilibration, which differs from the QEq charge equilibration method +:ref:`(Rappe and Goddard) ` only in how external electric fields +are accounted for. This fix therefore raises a warning when used without +:doc:`fix efield ` since :doc:`fix qeq/reaxff ` +should be used when no external electric field is present. Charges are +computed with the QEqR method by minimizing the electrostatic energy of +the system in the same way as the QEq method but where the absolute +electronegativity, :math:`\chi_i`, of each atom in the QEq method is +replaced with an effective electronegativity given by .. math:: \chi_{\mathrm{r}i} = \chi_i + \frac{\sum_{j=1}^{N} \beta(\phi_i - \phi_j) S_{ij}} @@ -61,8 +61,9 @@ external electric field and :math:`S_{ij}` is the overlap integral between atoms :math:`i` and :math:`j`. This formulation is advantageous over the method used by :doc:`fix qeq/reaxff ` to account for an external electric field in that it permits periodic -boundaries in the direction of an external electric field and in that it -does not worsen long-range charge transfer seen with QEq. +boundaries in the direction of an external electric field and in +that it does not worsen long-range charge transfer seen with +QEq. See :ref:`Lalli ` for further details. This fix is typically used in conjunction with the ReaxFF force field model as implemented in the :doc:`pair_style reaxff ` @@ -184,6 +185,10 @@ scale = 1.0 and maxiter = 200 ---------- +.. _lalli2: + +**(Lalli)** Lalli and Giusti, Journal of Chemical Physics, 162, 174311 (2025). + .. _Rappe4: **(Rappe)** Rappe and Goddard III, Journal of Physical Chemistry, 95, diff --git a/doc/src/fix_qtpie_reaxff.rst b/doc/src/fix_qtpie_reaxff.rst index 08ae24e164..643295dba4 100644 --- a/doc/src/fix_qtpie_reaxff.rst +++ b/doc/src/fix_qtpie_reaxff.rst @@ -59,8 +59,7 @@ and atom :math:`j`. The effect of an external electric field can be incorporated into the QTPIE method by modifying the absolute or effective electronegativities of each atom :ref:`(Chen) `. This fix models the effect of an external -electric field by using the effective electronegativity given in -:ref:`(Gergs) `: +electric field by using the effective electronegativity :ref:`(Lalli) ` .. math:: \tilde{\chi}_{\mathrm{r}i} = \frac{\sum_{j=1}^{N} (\chi_i - \chi_j + \beta(\phi_i - \phi_j)) S_{ij}} @@ -68,7 +67,8 @@ electric field by using the effective electronegativity given in where :math:`\beta` is a scaling factor and :math:`\phi_i` and :math:`\phi_j` are the electric potentials at the positions of atoms :math:`i` and :math:`j` -due to the external electric field. +due to the external electric field. Additional details regarding the +implementation and performance of this fix are provided in :ref:`Lalli `. This fix is typically used in conjunction with the ReaxFF force field model as implemented in the :doc:`pair_style reaxff ` @@ -206,10 +206,9 @@ scale = 1.0 and maxiter = 200 **(Chen)** Chen, Jiahao. Theory and applications of fluctuating-charge models. University of Illinois at Urbana-Champaign, 2009. -.. _Gergs: +.. _lalli: -**(Gergs)** Gergs, Dirkmann and Mussenbrock. -Journal of Applied Physics 123.24 (2018). +**(Lalli)** Lalli and Giusti, Journal of Chemical Physics, 162, 174311 (2025). .. _qeq-Aktulga2: diff --git a/doc/src/fix_sgcmc.rst b/doc/src/fix_sgcmc.rst index b9d933cec3..0a4156a886 100644 --- a/doc/src/fix_sgcmc.rst +++ b/doc/src/fix_sgcmc.rst @@ -30,7 +30,9 @@ Syntax N = number of times sampling window is moved during one MC cycle *window_size* frac frac = size of sampling window (must be between 0.5 and 1.0) - + *atomic/energy* yes/no + yes = use the atomic energy method to calculate energy changes + no = use the default method to calculate energy changes Examples """""""" @@ -127,6 +129,14 @@ The number of times the window is moved during a MC cycle is set using the parameter *window_moves* (see Sect. III.B in :ref:`Sadigh1 ` for details). +The *atomic/energy* keyword controls which method is used for calculating +the energy change when atom types are swapped. A value of *no* +uses the default method, see discussion below in Restrictions section. +A value of *yes* uses the atomic energy method, +if the method has been implemented for the LAMMPS energy model, +otherwise LAMMPS will exit with an error message. +So far this has only been implemented for EAM type potentials. + ------------ Restart, fix_modify, output, run start/stop, minimize info @@ -159,16 +169,26 @@ page for more info. This fix style requires an :doc:`atom style ` with per atom type masses. -At present the fix provides optimized subroutines for EAM type -potentials (see above) that calculate potential energy changes due to -*local* atom type swaps very efficiently. Other potentials are -supported by using the generic potential functions. This, however, will -lead to exceedingly slow simulations since it implies that the -energy of the *entire* system is recomputed at each MC trial step. If -other potentials are to be used it is strongly recommended to modify and -optimize the existing generic potential functions for this purpose. -Also, the generic energy calculation can not be used for parallel -execution i.e. it only works with a single MPI process. +The fix provides three methods for calculating the potential energy +change due to atom type swaps. For EAM type potentials, the default +method is a carefully optimized local energy change calculation that +is part of the source code for this fix. It takes advantage of the +specific computational and communication requirements of EAM. Customizing +the local method to handle other energy models such as Tersoff has been done, +but these cases are not supported in the public LAMMPS code. +For all other LAMMPS energy models, the default method calculates +the *total* potential energy of the system before and after each +atom type swap. This method does not depend on the details of the +energy model and so is guaranteed to be correct. It is also +orders of magnitude slower than the custom EAM calculation. +In addition, it can not be used with parallel execution i.e. only +a single MPI process is allowed. +The third method uses the *atomic/energy* keyword described above. +This allows parallel execution and it is also a local calculation, +making it only a bit slower than a fully-optimized local calculation. +So far, this has been implemented for EAM type potentials. +It is straightforward to extend this to other potentials, +requiring adding an atomic energy method to the pair style. ------------ @@ -180,6 +200,7 @@ The optional parameters default to the following values: * *randseed* = 324234 * *window_moves* = 8 * *window_size* = automatic +* *atomic/energy* = no ------------ diff --git a/doc/src/pair_granular.rst b/doc/src/pair_granular.rst index 4ae59a587f..4d8753a7a1 100644 --- a/doc/src/pair_granular.rst +++ b/doc/src/pair_granular.rst @@ -44,7 +44,7 @@ Examples pair_coeff * * hertz 1000.0 50.0 tangential mindlin 1000.0 1.0 0.4 heat area 0.1 pair_style granular - pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 0.0 0.7 rolling sds 2.7e5 0.0 0.6 damping none + pair_coeff * * mdr 5e6 0.4 1.9e5 2.0 0.5 0.5 tangential linear_history 940.0 1.0 0.7 rolling sds 2.7e5 0.0 0.6 damping mdr 1 Description """"""""""" @@ -88,7 +88,8 @@ and their required arguments are: 3. *hertz/material* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu` 4. *dmt* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` 5. *jkr* : E, :math:`\eta_{n0}` (or :math:`e`), :math:`\nu`, :math:`\gamma` -6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, :math:`\psi_b`, :math:`e` +6. *mdr* : :math:`E`, :math:`\nu`, :math:`Y`, :math:`\Delta\gamma`, + :math:`\psi_b`, :math:`\eta_{n0}` Here, :math:`k_n` is spring stiffness (with units that depend on model choice, see below); :math:`\eta_{n0}` is a damping prefactor (or, in its @@ -177,6 +178,8 @@ two-part series :ref:`Zunker and Kamrin Part I ` and :ref:`Zunker and Kamrin Part II `. Further development and demonstrations of its application to industrially relevant powder compaction processes are presented in :ref:`Zunker et al. `. +If you use the *mdr* normal model the only supported damping option is +the *mdr* damping class described below. The model requires the following inputs: @@ -200,8 +203,8 @@ The model requires the following inputs: triggered. Lower values of :math:`\psi_b` delay the onset of the bulk elastic response. - 6. *Coefficient of restitution* :math:`0 \le e \le 1` : The coefficient of - restitution is a tunable parameter that controls damping in the normal direction. + 6. *Damping coefficent* :math:`\eta_{n0} \ge 0` : The damping coefficient + is a tunable parameter that controls damping in the normal direction. .. note:: @@ -213,18 +216,12 @@ The *mdr* model produces a nonlinear force-displacement response, therefore the critical timestep :math:`\Delta t` depends on the inputs and level of deformation. As a conservative starting point the timestep can be assumed to be dictated by the bulk elastic response such that -:math:`\Delta t = 0.35\sqrt{m/k_\textrm{bulk}}`, where :math:`m` is the mass of +:math:`\Delta t = 0.08\sqrt{m/k_\textrm{bulk}}`, where :math:`m` is the mass of the smallest particle and :math:`k_\textrm{bulk} = \kappa R_\textrm{min}` is an effective stiffness related to the bulk elastic response. Here, :math:`\kappa = E/(3(1-2\nu))` is the bulk modulus and :math:`R_\textrm{min}` is the radius of the smallest particle. -.. note:: - - The *mdr* model requires some specific settings to function properly, - please read the following text carefully to ensure all requirements are - followed. - The *atom_style* must be set to *sphere 1* to enable dynamic particle radii. The *mdr* model is designed to respect the incompressibility of plastic deformation and inherently tracks free surface displacements @@ -253,13 +250,6 @@ algorithm see :ref:`Zunker et al. `. newton off -The damping model must be set to *none*. The *mdr* model already has a built -in damping model. - -.. code-block:: LAMMPS - - pair_coeff * * mdr 5e6 0.4 1.9e5 2 0.5 0.5 damping none - The definition of multiple *mdr* models in the *pair_style* is currently not supported. Similarly, the *mdr* model cannot be combined with a different normal model in the *pair_style*. Physically this means that only one homogeneous @@ -270,7 +260,7 @@ The *mdr* model currently only supports *fix wall/gran/region*, not any *fix wall/gran/region* commands must also use the *mdr* model. Additionally, the following *mdr* inputs must match between the *pair_style* and *fix wall/gran/region* definitions: :math:`E`, -:math:`\nu`, :math:`Y`, :math:`\psi_b`, and :math:`e`. The exception +:math:`\nu`, :math:`Y`, :math:`\psi_b`, and :math:`\eta_{n0}`. The exception is :math:`\Delta\gamma`, which may vary, permitting different adhesive behaviors between particle-particle and particle-wall interactions. @@ -336,6 +326,7 @@ for the damping model currently supported are: 3. *viscoelastic* 4. *tsuji* 5. *coeff_restitution* +6. *mdr* (class) : :math:`d_{type}` If the *damping* keyword is not specified, the *viscoelastic* model is used by default. @@ -425,6 +416,37 @@ the damping coefficient, it accurately reproduces the specified coefficient of restitution for both monodisperse and polydisperse particle pairs. This damping model is not compatible with cohesive normal models such as *JKR* or *DMT*. +The *mdr* damping class contains multiple damping models that can be toggled between +by specifying different integer values for the :math:`d_{type}` input parameter. This +damping option is only compatible with the normal *mdr* contact model. + +Setting :math:`d_{type} = 1` is the suggested damping option. This specifies a damping +model that takes into account the contact stiffness :math:`k_{mdr}` calculated +by the normal *mdr* contact model to determine the damping coefficient: + +.. math:: + + \eta_n = \eta_{n0} (m_{eff}k_{mdr})^{1/2}, + +where :math:`k_{mdr}` is proportional to contact radius :math:`a_{mdr}` tracked by the +normal *mdr* contact model: + +.. math:: + + k_{mdr} = 2 E_{eff} a_{mdr}. + +In this case, :math:`\eta_{n0}` is simply a dimensionless coefficient that scales the +the overall damping coefficient. + +The other supported option is :math:`d_{type} = 2`, which defines a simple damping model +similar to the *velocity* option + +.. math:: + + \eta_n = \eta_{n0}, + +but has additional checks to avoid non-physical damping after plastic deformation. + The total normal force is computed as the sum of the elastic and damping components: @@ -1068,8 +1090,8 @@ a bulk elastic response. Journal of the Mechanics and Physics of Solids, **(Zunker et al, 2025)** Zunker, W., Dunatunga, S., Thakur, S., Tang, P., & Kamrin, K. (2025). Experimentally validated DEM for large -deformation powder compaction: mechanically-derived contact model and -screening of non-physical contacts. +deformation powder compaction: Mechanically-derived contact model and +screening of non-physical contacts. Powder Technology, 120972. .. _Luding2008: diff --git a/doc/src/pair_lj_smooth.rst b/doc/src/pair_lj_smooth.rst index 4799ca3277..d6b266d932 100644 --- a/doc/src/pair_lj_smooth.rst +++ b/doc/src/pair_lj_smooth.rst @@ -48,13 +48,19 @@ At the inner cutoff the force and its first derivative will match the non-smoothed LJ formula. At the outer cutoff the force and its first derivative will be 0.0. The inner cutoff cannot be 0.0. +Explicit expressions for the coefficients C1, C2, C3, C4, as well as the +energy discontinuity at the cutoff can be found here :ref:`(Leoni_1) ` +and here :ref:`(Leoni_2) ` + .. note:: this force smoothing causes the energy to be discontinuous both in its values and first derivative. This can lead to poor energy - conservation and may require the use of a thermostat. Plot the energy - and force resulting from this formula via the - :doc:`pair_write ` command to see the effect. + conservation and may require the use of a thermostat. The energy + value discontinuity can be eliminated by shifting the potential + energy to be zero at the outer cutoff using the pair_modify shift + option. With or without shifting, you can plot the resulting energy + and force via the :doc:`pair_write ` command to see the effect. The following coefficients must be defined for each pair of atoms types via the :doc:`pair_coeff ` command as in the examples @@ -122,3 +128,14 @@ Default """"""" none + +---------- + +.. _Leoni_1: + +**(Leoni_1)** F. Leoni et al., Phys Rev Lett, 134, 128201 (2025). + +.. _Leoni_2: + +**(Leoni_2)** F. Leoni et al., Phys Rev Lett, 134, Supplementary Material (2025). + diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index cf90ce802d..af91745034 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -103,6 +103,7 @@ Amit amsmath amu Amzallag +Anandakrishnan analytical Anders Andric @@ -110,6 +111,7 @@ Andrienko Andzelm Ang anglegrad +anglelist angleoffset angletangrad angmom @@ -347,6 +349,7 @@ Bomont BondAngle BondBond bondchk +bondlist bondmax bondscreened bondscreenedspin @@ -395,6 +398,7 @@ Broglie brownian brownw Broyden +Bruenger Bruskin Brusselle Bryantsev @@ -819,6 +823,7 @@ diffusively diffusivities diffusivity dihedral +dihedrallist dihedrals Dihedrals dihydride @@ -1197,6 +1202,7 @@ filesystem filesystems Fily Fincham +Finkelstein Fint fingerprintconstants fingerprintsperelement @@ -1323,7 +1329,6 @@ Geocomputing georg Georg Geotechnica -Gergs germain Germann Germano @@ -1351,6 +1356,8 @@ Gillan Gingold Gissinger github +Giusti +GJ gjf gjwagne gl @@ -1609,6 +1616,7 @@ imagename imd Impey impl +improperlist impropers Impropers imulator @@ -1725,6 +1733,7 @@ Iyz iz izcm ized +Izadi Izrailev Izumi Izvekov @@ -1853,6 +1862,7 @@ Kloss Kloza kmax Kmax +kMC KMP kmu Knizhnik @@ -1917,6 +1927,7 @@ Lachet Lackmann Ladd lagrangian +Lalli lambdai LambdaLanczos Lambrecht @@ -1979,6 +1990,7 @@ lennard Lennard Lenosky Lenz +Leoni Lett Leuven Leven @@ -2477,6 +2489,7 @@ namespaces nan NaN Nandor +nanglelist nangles Nangletype nangletypes @@ -2513,6 +2526,7 @@ nbodies nbody Nbody nbond +nbondlist nbonds nbondtype Nbondtype @@ -2534,6 +2548,7 @@ ncount nd ndactrung ndescriptors +ndihedrallist ndihedrals Ndihedraltype ndihedraltypes @@ -2591,6 +2606,7 @@ NiAlH Nicklas Niklasson Nikolskiy +nimproperlist nimpropers Nimpropertype nimpropertypes @@ -2795,6 +2811,7 @@ oneMKL oneway onlysalt ons +Onufriev OO Oord opencl @@ -3463,6 +3480,7 @@ sectoring sed Seddon segmental +Seibold Seifert Seleson sellerio @@ -4082,9 +4100,11 @@ versa Verstraelen ves vf +vfull vflag vflow vfrac +vhalf vhi vibrational Vij @@ -4116,6 +4136,7 @@ volpress volumetric von Voro +voro Vorobyov voronoi Voronoi diff --git a/examples/COUPLE/plugin/liblammpsplugin.c b/examples/COUPLE/plugin/liblammpsplugin.c index 87cf58729c..5003b3826b 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.c +++ b/examples/COUPLE/plugin/liblammpsplugin.c @@ -144,6 +144,7 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib) ADDSYM(find_pair_neighlist); ADDSYM(find_fix_neighlist); ADDSYM(find_compute_neighlist); + ADDSYM(request_single_neighlist); ADDSYM(neighlist_num_elements); ADDSYM(neighlist_element_neighbors); diff --git a/examples/COUPLE/plugin/liblammpsplugin.h b/examples/COUPLE/plugin/liblammpsplugin.h index 3732b3a5c0..73cef7bc19 100644 --- a/examples/COUPLE/plugin/liblammpsplugin.h +++ b/examples/COUPLE/plugin/liblammpsplugin.h @@ -94,6 +94,17 @@ enum _LMP_VAR_CONST { LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ }; +/** Neighbor list settings constants + * + * Must be kept in sync with the equivalent constants in ``python/lammps/constants.py``, + * ``fortran/lammps.f90``, ``tools/swig/lammps.i``, and + * ``examples/COUPLE/plugin/liblammpsplugin.h`` */ + +enum _LMP_NEIGH_CONST { + LMP_NEIGH_HALF = 0, /*!< request (default) half neighbor list */ + LMP_NEIGH_FULL = 1, /*!< request full neighbor list */ +}; + #ifdef __cplusplus extern "C" { #endif @@ -189,14 +200,17 @@ struct _liblammpsplugin { * caller must match to how LAMMPS library is built */ #if !defined(LAMMPS_BIGBIG) - int (*create_atoms)(void *, int, int *, int *, double *, double *, int *, int); + int (*create_atoms)(void *, int, const int *, const int *, const double *, const double *, + const int *, int); #else - int (*create_atoms)(void *, int, int64_t *, int *, double *, double *, int64_t *, int); + int (*create_atoms)(void *, int, const int64_t *, const int *, const double *, const double *, + const int64_t *, int); #endif int (*find_pair_neighlist)(void *, const char *, int, int, int); int (*find_fix_neighlist)(void *, const char *, int); int (*find_compute_neighlist)(void *, const char *, int); + int (*request_single_neighlist)(void *, const char *, int, double); int (*neighlist_num_elements)(void *, int); void (*neighlist_element_neighbors)(void *, int, int, int *, int *, int **); diff --git a/examples/PACKAGES/imd/in.bucky-plus-cnt b/examples/PACKAGES/imd/in.bucky-plus-cnt index b3eeff3cc1..af511fe11f 100644 --- a/examples/PACKAGES/imd/in.bucky-plus-cnt +++ b/examples/PACKAGES/imd/in.bucky-plus-cnt @@ -46,8 +46,8 @@ fix integrate mobile nve fix thermostat mobile langevin 300.0 300.0 2000.0 234624 # IMD setup. -fix comm all imd 6789 unwrap on trate 10 -#fix comm all imd 6789 unwrap on trate 10 nowait on +#fix comm all imd 6789 unwrap on trate 10 +fix comm all imd 6789 unwrap on trate 10 nowait on # temperature is based on mobile atoms only compute mobtemp mobile temp diff --git a/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu b/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu index 5762ec68c8..f3e4b32cdc 100644 --- a/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu +++ b/examples/PACKAGES/imd/in.bucky-plus-cnt-gpu @@ -1,16 +1,20 @@ # stick a buckyball into a nanotube + +# enable GPU package from within the input: +package gpu 0 pair/only on +suffix gpu + units real dimension 3 boundary f f f atom_style molecular -newton off processors * * 1 # read topology read_data data.bucky-plus-cnt -pair_style lj/cut/gpu 10.0 +pair_style lj/cut 10.0 bond_style harmonic angle_style charmm dihedral_style charmm @@ -29,9 +33,6 @@ neigh_modify delay 0 every 1 check yes timestep 2.0 -# required for GPU acceleration -fix gpu all gpu force 0 0 1.0 - # we only move some atoms. group mobile type 1 @@ -49,8 +50,8 @@ fix integrate mobile nve fix thermostat mobile langevin 300.0 300.0 2000.0 234624 # IMD setup. -fix comm all imd 6789 unwrap on trate 10 -#fix comm all imd 6789 unwrap on trate 10 nowait on +#fix comm all imd 6789 unwrap on trate 10 +fix comm all imd 6789 unwrap on trate 10 nowait on # temperature is based on mobile atoms only compute mobtemp mobile temp diff --git a/examples/PACKAGES/imd/in.deca-ala_imd-gpu b/examples/PACKAGES/imd/in.deca-ala_imd-gpu index 72c3f4aae9..9470f7c213 100644 --- a/examples/PACKAGES/imd/in.deca-ala_imd-gpu +++ b/examples/PACKAGES/imd/in.deca-ala_imd-gpu @@ -1,8 +1,12 @@ -# +# + +# enable GPU package from within the input: +package gpu 0 pair/only on +suffix gpu + units real neighbor 2.5 bin neigh_modify delay 1 every 1 -newton off atom_style full bond_style harmonic @@ -10,20 +14,18 @@ angle_style charmm dihedral_style charmm improper_style harmonic -pair_style lj/charmm/coul/long/gpu 8 10 +pair_style lj/charmm/coul/long 8 10 pair_modify mix arithmetic special_bonds charmm read_data data.deca-ala-solv -fix 0 all gpu force/neigh 0 0 1.0 - group peptide id <= 103 fix rigidh all shake 1e-6 100 1000 t 1 2 3 4 5 a 23 thermo 100 thermo_style multi timestep 2.0 -kspace_style pppm/gpu 1e-5 +kspace_style pppm 1e-5 fix ensemble all npt temp 300.0 300.0 100.0 iso 1.0 1.0 1000.0 drag 0.2 diff --git a/examples/PACKAGES/imd/in.melt_imd-gpu b/examples/PACKAGES/imd/in.melt_imd-gpu index 24904eb832..f1406befa6 100644 --- a/examples/PACKAGES/imd/in.melt_imd-gpu +++ b/examples/PACKAGES/imd/in.melt_imd-gpu @@ -1,30 +1,32 @@ -# 3d Lennard-Jones melt +# 3d Lennard-Jones melt with GPU package acceleration -units lj -atom_style atomic -newton off +# enable GPU package from within the input: +package gpu 0 +suffix gpu -lattice fcc 0.8442 -region box block 0 10 0 10 0 10 -create_box 1 box -create_atoms 1 box -mass 1 1.0 +units lj +atom_style atomic -velocity all create 3.0 87287 +lattice fcc 0.8442 +region box block 0 10 0 10 0 10 +create_box 1 box +create_atoms 1 box +mass 1 1.0 -pair_style lj/cut/gpu 2.5 -pair_coeff 1 1 1.0 1.0 2.5 +velocity all create 3.0 87287 -neighbor 0.3 bin -neigh_modify every 5 delay 10 check yes +pair_style lj/cut 2.5 +pair_coeff 1 1 1.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify every 5 delay 10 check yes thermo_style custom step pe ke spcpu -fix 0 all gpu force/neigh 0 0 1.0 -fix 1 all nve +fix 1 all nve # IMD setup. fix comm all imd 5678 unwrap off fscale 20.0 trate 20 nowait on -thermo 500 -run 5000000 +thermo 500 +run 5000000 diff --git a/examples/gjf/README b/examples/gjf/README new file mode 100644 index 0000000000..f7c955080f --- /dev/null +++ b/examples/gjf/README @@ -0,0 +1,47 @@ +LAMMPS GJ THERMOSTAT EXAMPLE + +Required LAMMPS packages: EXTRA-FIX, MOLECULE, EXTRA-PAIR + +This directory contains the ingredients to run an NVT simulation using the +GJ thermostats. + +Example: + +NP=4 #number of processors +mpirun -np $NP lmp_mpi -in.gjf.vhalf + +Compared to other thermostats, the GJ thermostat allows for larger timesteps +with the correct Boltzmann statistics. A comparison using averaged properties +from this example's input file is shown below. 'X' denotes a failed simulation. +The theoretical value for KE is 1.1168 eV. + +POTENTIAL ENERGY (eV) +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|===================||========|========|========|========|========|========|========| +| gjf half || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| gjf full || -55.11 | -55.11 | -55.11 | -55.11 | -55.11 | -55.10 | -55.07 | +| langevin || -55.11 | -55.07 | -54.87 | -54.79 | -54.65 | X | X | +| nvt (Nose-Hoover) || -55.14 | -55.07 | -54.90 | -54.84 | -54.76 | X | X | +|-------------------||--------|--------|--------|--------|--------|--------|--------| + +KINETIC ENERGY (eV) +| Δt || 0.01 | 0.05 | 0.10 | 0.11 | 0.12 | 0.13 | 0.14 | +|===================||========|========|========|========|========|========|========| +| gjf half || 1.117 | 1.116 | 1.119 | 1.119 | 1.123 | 1.136 | 1.170 | +| gjf full || 1.116 | 1.071 | 0.938 | 0.898 | 0.858 | 0.817 | 0.780 | +| langevin || 1.110 | 1.113 | 1.121 | 1.129 | 1.157 | X | X | +| nvt (Nose-Hoover) || 1.083 | 1.109 | 1.112 | 1.113 | 1.114 | X | X | +|-------------------||--------|--------|--------|--------|--------|--------|--------| + + +Script Commands: +-- +fix lang all gjf 10 10 1 26488 +-- +fix lang all gjf 10 10 1 26488 vel vfull +-- +fix nve all nve +fix lang all langevin 10 10 1 26488 +-- +fix noho all nvt temp 10 10 1 +-- \ No newline at end of file diff --git a/examples/gjf/README.md b/examples/gjf/README.md deleted file mode 100644 index e6886cb2dd..0000000000 --- a/examples/gjf/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE - -## GJF-2GJ THERMOSTAT - -This directory contains the ingredients to run an NVT simulation using the GJF-2GJ thermostat. - -Example: -``` -NP=4 #number of processors -mpirun -np $NP lmp_mpi -in.gjf.vhalf -``` - -## Required LAMMPS packages: MOLECULE package diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull index 40512ac37a..fad6df4a9b 100644 --- a/examples/gjf/in.gjf.vfull +++ b/examples/gjf/in.gjf.vfull @@ -1,23 +1,25 @@ -# GJF-2GJ thermostat +# GJ thermostat units metal atom_style full boundary p p p read_data argon.lmp - include ff-argon.lmp velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 vel vfull method 1 -thermo 200 run 5000 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out +thermo 2000 +run 35000 \ No newline at end of file diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf index 63fb8bd467..2f5c482928 100644 --- a/examples/gjf/in.gjf.vhalf +++ b/examples/gjf/in.gjf.vhalf @@ -1,23 +1,25 @@ -# GJF-2GJ thermostat +# GJ thermostat units metal atom_style full boundary p p p read_data argon.lmp - include ff-argon.lmp velocity all create 10 2357 mom yes dist gaussian - neighbor 1 bin timestep 0.1 -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 -thermo 200 run 5000 +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out +thermo 2000 +run 35000 \ No newline at end of file diff --git a/examples/gjf/log.15Oct19.gjf.vfull.g++.1 b/examples/gjf/log.15Oct19.gjf.vfull.g++.1 deleted file mode 100644 index e3e9cce124..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vfull.g++.1 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000150019 secs - read_data CPU = 0.001946 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.875 | 6.875 | 6.875 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080223 -56.207655 0 -54.97164 37.215524 - 200 8.2588471 -55.073602 0 -54.152316 339.80416 - 400 8.1427292 -55.072244 0 -54.16391 338.91883 - 600 8.7595618 -55.066739 0 -54.089596 344.25426 - 800 8.550633 -55.148315 0 -54.194479 318.9385 - 1000 8.5394337 -55.125709 0 -54.173122 326.59471 - 1200 8.565973 -55.114892 0 -54.159345 328.5193 - 1400 8.2092914 -55.109233 0 -54.193475 329.56161 - 1600 8.209495 -55.138161 0 -54.22238 321.39971 - 1800 8.4039924 -55.13355 0 -54.196072 322.64214 - 2000 8.4548937 -55.062994 0 -54.119838 343.29888 - 2200 8.3775139 -55.13364 0 -54.199116 323.63744 - 2400 8.537332 -55.163702 0 -54.21135 315.62864 - 2600 8.672488 -55.112054 0 -54.144625 330.1106 - 2800 8.3000218 -55.147275 0 -54.221396 318.73112 - 3000 8.3552421 -55.135164 0 -54.203124 323.53075 - 3200 8.4126798 -55.135753 0 -54.197306 321.48817 - 3400 8.4986413 -55.135408 0 -54.187372 323.42951 - 3600 8.38431 -55.103932 0 -54.16865 330.68929 - 3800 8.8262454 -55.103648 0 -54.119067 332.97779 - 4000 7.9658136 -55.120402 0 -54.231803 324.9595 - 4200 8.2265544 -55.129011 0 -54.211327 323.87069 - 4400 8.1253738 -55.153089 0 -54.246691 316.304 - 4600 8.2010823 -55.124053 0 -54.20921 325.98402 - 4800 8.5512149 -55.075877 0 -54.121976 338.30137 - 5000 8.4737659 -55.158604 0 -54.213343 316.22418 -Loop time of 2.73236 on 1 procs for 5000 steps with 864 atoms - -Performance: 15810.507 ns/day, 0.002 hours/ns, 1829.920 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 | 1.4262 | 1.4262 | 1.4262 | 0.0 | 52.20 -Bond | 0.00042836 | 0.00042836 | 0.00042836 | 0.0 | 0.02 -Neigh | 0.12819 | 0.12819 | 0.12819 | 0.0 | 4.69 -Comm | 0.058611 | 0.058611 | 0.058611 | 0.0 | 2.15 -Output | 0.00047283 | 0.00047283 | 0.00047283 | 0.0 | 0.02 -Modify | 1.0924 | 1.0924 | 1.0924 | 0.0 | 39.98 -Other | | 0.02605 | | | 0.95 - -Nlocal: 864 ave 864 max 864 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1593 ave 1593 max 1593 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 18143 ave 18143 max 18143 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 18143 -Ave neighs/atom = 20.9988 -Ave special neighs/atom = 0 -Neighbor list builds = 158 -Dangerous builds = 5 - - -Total wall time: 0:00:02 diff --git a/examples/gjf/log.15Oct19.gjf.vfull.g++.4 b/examples/gjf/log.15Oct19.gjf.vfull.g++.4 deleted file mode 100644 index 95caed5dc9..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vfull.g++.4 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000556268 secs - read_data CPU = 0.003817 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vfull -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.808 | 6.808 | 6.808 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080228 -56.207655 0 -54.971639 37.215541 - 200 8.4818184 -55.127334 0 -54.181174 324.96159 - 400 8.5960916 -55.09236 0 -54.133453 334.83136 - 600 8.1607556 -55.073136 0 -54.162791 339.035 - 800 8.8350489 -55.133382 0 -54.147819 324.48149 - 1000 8.5692704 -55.118463 0 -54.162548 327.26328 - 1200 8.4174147 -55.126297 0 -54.187322 324.4248 - 1400 8.6362603 -55.123075 0 -54.159688 326.7798 - 1600 8.222512 -55.153799 0 -54.236565 317.8147 - 1800 8.324523 -55.116698 0 -54.188085 327.35373 - 2000 7.9615959 -55.155825 0 -54.267697 315.37215 - 2200 8.495968 -55.083943 0 -54.136205 336.67775 - 2400 7.7926986 -55.044816 0 -54.175529 344.87758 - 2600 8.1551351 -55.069404 0 -54.159687 339.60901 - 2800 8.2593599 -55.084151 0 -54.162807 336.54935 - 3000 8.2860869 -55.110296 0 -54.185971 328.99074 - 3200 8.4074534 -55.123576 0 -54.185712 326.06823 - 3400 8.6694364 -55.128925 0 -54.161836 324.67512 - 3600 8.5718984 -55.129861 0 -54.173653 325.20586 - 3800 8.508102 -55.099093 0 -54.150001 333.91437 - 4000 8.2966658 -55.117782 0 -54.192276 327.13516 - 4200 8.7641728 -55.135792 0 -54.158136 324.00844 - 4400 8.8827909 -55.096369 0 -54.10548 335.08467 - 4600 8.7666577 -55.127213 0 -54.149279 326.15539 - 4800 8.6670762 -55.163395 0 -54.19657 316.48383 - 5000 8.1893094 -55.073756 0 -54.160226 337.95271 -Loop time of 0.870594 on 4 procs for 5000 steps with 864 atoms - -Performance: 49621.267 ns/day, 0.000 hours/ns, 5743.202 timesteps/s -96.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.33582 | 0.35125 | 0.3724 | 2.3 | 40.35 -Bond | 0.00030267 | 0.00031316 | 0.00033538 | 0.0 | 0.04 -Neigh | 0.034246 | 0.03479 | 0.035904 | 0.4 | 4.00 -Comm | 0.15068 | 0.17419 | 0.19191 | 3.6 | 20.01 -Output | 0.00044776 | 0.00054703 | 0.00083177 | 0.0 | 0.06 -Modify | 0.27679 | 0.28079 | 0.28849 | 0.9 | 32.25 -Other | | 0.02871 | | | 3.30 - -Nlocal: 216 ave 216 max 216 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 888.75 ave 899 max 876 min -Histogram: 1 0 1 0 0 0 0 0 0 2 -Neighs: 4536 ave 4737 max 4335 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 18144 -Ave neighs/atom = 21 -Ave special neighs/atom = 0 -Neighbor list builds = 178 -Dangerous builds = 11 - - -Total wall time: 0:00:00 diff --git a/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 b/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 deleted file mode 100644 index a87b20a887..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vhalf.g++.1 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 1 by 1 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000147804 secs - read_data CPU = 0.00194898 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.5 | 6.5 | 6.5 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080223 -56.207655 0 -54.97164 37.215524 - 200 9.8808568 -55.073602 0 -53.971378 345.62207 - 400 9.8712816 -55.072244 0 -53.971088 345.11889 - 600 10.528988 -55.066739 0 -53.892214 350.60093 - 800 10.167171 -55.148315 0 -54.014152 324.73679 - 1000 10.029026 -55.125709 0 -54.006956 331.93766 - 1200 10.194424 -55.114892 0 -53.977688 334.36032 - 1400 9.3473846 -55.109233 0 -54.066518 333.64378 - 1600 9.7774071 -55.138161 0 -54.047477 327.02358 - 1800 9.9814275 -55.13355 0 -54.020107 328.30017 - 2000 10.2515 -55.062994 0 -53.919424 349.74304 - 2200 9.8126922 -55.13364 0 -54.039019 328.78521 - 2400 10.044314 -55.163702 0 -54.043244 321.03397 - 2600 10.543316 -55.112054 0 -53.935932 336.82099 - 2800 9.7874375 -55.147275 0 -54.055472 324.06626 - 3000 9.7703821 -55.135164 0 -54.045263 328.60665 - 3200 10.141958 -55.135753 0 -54.004402 327.69084 - 3400 10.160576 -55.135408 0 -54.00198 329.39063 - 3600 10.044652 -55.103932 0 -53.983436 336.64469 - 3800 10.662403 -55.103648 0 -53.914241 339.56382 - 4000 9.2921047 -55.120402 0 -54.083853 329.71671 - 4200 9.8744553 -55.129011 0 -54.027501 329.78147 - 4400 9.4085964 -55.153089 0 -54.103546 320.90673 - 4600 9.5463801 -55.124053 0 -54.05914 330.80941 - 4800 10.223884 -55.075877 0 -53.935387 344.30099 - 5000 9.6243338 -55.158604 0 -54.084996 320.3511 -Loop time of 2.29551 on 1 procs for 5000 steps with 864 atoms - -Performance: 18819.358 ns/day, 0.001 hours/ns, 2178.166 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 | 1.4393 | 1.4393 | 1.4393 | 0.0 | 62.70 -Bond | 0.0004441 | 0.0004441 | 0.0004441 | 0.0 | 0.02 -Neigh | 0.12136 | 0.12136 | 0.12136 | 0.0 | 5.29 -Comm | 0.059342 | 0.059342 | 0.059342 | 0.0 | 2.59 -Output | 0.00046968 | 0.00046968 | 0.00046968 | 0.0 | 0.02 -Modify | 0.64937 | 0.64937 | 0.64937 | 0.0 | 28.29 -Other | | 0.02522 | | | 1.10 - -Nlocal: 864 ave 864 max 864 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 1593 ave 1593 max 1593 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 18143 ave 18143 max 18143 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 18143 -Ave neighs/atom = 20.9988 -Ave special neighs/atom = 0 -Neighbor list builds = 158 -Dangerous builds = 5 - - -Total wall time: 0:00:02 diff --git a/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 b/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 deleted file mode 100644 index a70a67a89c..0000000000 --- a/examples/gjf/log.15Oct19.gjf.vhalf.g++.4 +++ /dev/null @@ -1,125 +0,0 @@ -LAMMPS (19 Sep 2019) - using 1 OpenMP thread(s) per MPI task -# GJF-2GJ thermostat - -units metal -atom_style full - -boundary p p p -read_data argon.lmp - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors - special bonds CPU = 0.000315903 secs - read_data CPU = 0.0653752 secs - -include ff-argon.lmp -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 -mass 1 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - - -velocity all create 10 2357 mom yes dist gaussian - -neighbor 1 bin - -timestep 0.1 - -fix lang all langevin 10 10 1 26488 gjf vhalf -fix nve all nve - -thermo 200 -run 5000 -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Per MPI rank memory allocation (min/avg/max) = 6.433 | 6.433 | 6.433 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 11.080228 -56.207655 0 -54.971639 37.215541 - 200 9.8046716 -55.127334 0 -54.033608 329.70647 - 400 10.174622 -55.09236 0 -53.957366 340.49331 - 600 9.9812299 -55.073136 0 -53.959714 345.56477 - 800 10.512874 -55.133382 0 -53.960655 330.4996 - 1000 9.9587885 -55.118463 0 -54.007545 332.24728 - 1200 10.236607 -55.126297 0 -53.984388 330.94998 - 1400 10.134679 -55.123075 0 -53.992537 332.15441 - 1600 9.8934078 -55.153799 0 -54.050174 323.80795 - 1800 10.064966 -55.116698 0 -53.993936 333.59644 - 2000 9.6736107 -55.155825 0 -54.076719 321.5129 - 2200 10.264537 -55.083943 0 -53.938918 343.02135 - 2400 9.5640032 -55.044816 0 -53.977937 351.23099 - 2600 9.6581077 -55.069404 0 -53.992028 344.99996 - 2800 9.9622575 -55.084151 0 -53.972846 342.6574 - 3000 9.8724909 -55.110296 0 -54.009005 334.68094 - 3200 10.032027 -55.123576 0 -54.004488 331.89534 - 3400 10.221132 -55.128925 0 -53.988742 330.24082 - 3600 10.085802 -55.129861 0 -54.004774 330.63601 - 3800 10.098545 -55.099093 0 -53.972585 339.61905 - 4000 10.000257 -55.117782 0 -54.002238 333.24569 - 4200 10.20477 -55.135792 0 -53.997435 329.17565 - 4400 10.545132 -55.096369 0 -53.920044 341.04725 - 4600 10.376108 -55.127213 0 -53.969743 331.92825 - 4800 10.247392 -55.163395 0 -54.020283 322.15219 - 5000 9.7753102 -55.073756 0 -53.983305 343.64146 -Loop time of 1.19785 on 4 procs for 5000 steps with 864 atoms - -Performance: 36064.674 ns/day, 0.001 hours/ns, 4174.152 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.36387 | 0.38652 | 0.44086 | 5.1 | 32.27 -Bond | 0.00028847 | 0.00030833 | 0.000338 | 0.0 | 0.03 -Neigh | 0.033934 | 0.034959 | 0.036917 | 0.6 | 2.92 -Comm | 0.39292 | 0.47821 | 0.52198 | 7.3 | 39.92 -Output | 0.00050343 | 0.0012343 | 0.0023338 | 1.9 | 0.10 -Modify | 0.1605 | 0.17963 | 0.19457 | 2.9 | 15.00 -Other | | 0.117 | | | 9.77 - -Nlocal: 216 ave 216 max 216 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 888.75 ave 899 max 876 min -Histogram: 1 0 1 0 0 0 0 0 0 2 -Neighs: 4536 ave 4737 max 4335 min -Histogram: 2 0 0 0 0 0 0 0 0 2 - -Total # of neighbors = 18144 -Ave neighs/atom = 21 -Ave special neighs/atom = 0 -Neighbor list builds = 178 -Dangerous builds = 11 - - -Total wall time: 0:00:01 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.1 b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 new file mode 100644 index 0000000000..ca739b3a22 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.1 @@ -0,0 +1,193 @@ +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.007 seconds +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian +neighbor 1 bin + +timestep 0.1 + +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 vel vfull method 1 + +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- GJ methods: doi:10.1080/00268976.2019.1662506 + +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020} +} + +- GJ-I vfull method: doi:10.1080/00268976.2012.760055 + +@Article{gronbech-jensen_simple_2013, +title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, +volume = {111}, +url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055}, +doi = {10.1080/00268976.2012.760055}, +pages = {983-991}, +number = {8}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels and Farago, Oded}, +year = {2013} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 5000 8.4535562 -55.150518 0 -54.207511 318.20862 +Loop time of 2.26831 on 1 procs for 5000 steps with 864 atoms + +Performance: 19044.977 ns/day, 0.001 hours/ns, 2204.280 timesteps/s, 1.904 Matom-step/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 | 1.2802 | 1.2802 | 1.2802 | 0.0 | 56.44 +Bond | 0.00051213 | 0.00051213 | 0.00051213 | 0.0 | 0.02 +Neigh | 0.27007 | 0.27007 | 0.27007 | 0.0 | 11.91 +Comm | 0.057527 | 0.057527 | 0.057527 | 0.0 | 2.54 +Output | 6.3876e-05 | 6.3876e-05 | 6.3876e-05 | 0.0 | 0.00 +Modify | 0.63364 | 0.63364 | 0.63364 | 0.0 | 27.93 +Other | | 0.02635 | | | 1.16 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1593 ave 1593 max 1593 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18143 ave 18143 max 18143 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 258 +Dangerous builds = 0 + +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out + +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 8.4535562 -55.150518 0 -54.207511 318.20862 + 6000 8.4899401 -55.108242 0 -54.161176 331.10703 + 8000 8.3618893 -55.092171 0 -54.15939 334.11831 + 10000 8.8684311 -55.100316 0 -54.111029 334.09931 + 12000 8.4339192 -55.07343 0 -54.132614 340.00487 + 14000 8.072393 -55.115121 0 -54.214633 327.98965 + 16000 8.3420289 -55.077813 0 -54.147247 337.74926 + 18000 8.3803911 -55.12201 0 -54.187164 326.10485 + 20000 8.4676985 -55.176339 0 -54.231754 311.57092 + 22000 8.8560138 -55.110505 0 -54.122603 330.66179 + 24000 8.3187826 -55.120592 0 -54.192619 327.01148 + 26000 8.0327666 -55.116664 0 -54.220596 326.25179 + 28000 8.3672169 -55.130413 0 -54.197037 324.2368 + 30000 8.1669275 -55.057678 0 -54.146645 344.9168 + 32000 8.3819314 -55.08989 0 -54.154873 335.45317 + 34000 8.109088 -55.17222 0 -54.267639 310.83717 + 36000 8.3048574 -55.079475 0 -54.153056 338.04291 + 38000 8.8708544 -55.108991 0 -54.119434 330.70097 + 40000 8.4012779 -55.080817 0 -54.143642 338.54326 +Loop time of 18.9699 on 1 procs for 35000 steps with 864 atoms + +Performance: 15941.040 ns/day, 0.002 hours/ns, 1845.028 timesteps/s, 1.594 Matom-step/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 | 11.593 | 11.593 | 11.593 | 0.0 | 61.11 +Bond | 0.0041801 | 0.0041801 | 0.0041801 | 0.0 | 0.02 +Neigh | 2.2671 | 2.2671 | 2.2671 | 0.0 | 11.95 +Comm | 0.42339 | 0.42339 | 0.42339 | 0.0 | 2.23 +Output | 0.00062204 | 0.00062204 | 0.00062204 | 0.0 | 0.00 +Modify | 4.4976 | 4.4976 | 4.4976 | 0.0 | 23.71 +Other | | 0.1839 | | | 0.97 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1592 ave 1592 max 1592 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18144 ave 18144 max 18144 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 2122 +Dangerous builds = 0 +Total wall time: 0:00:21 diff --git a/examples/gjf/log.2Apr25.gjf.vfull.g++.4 b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 new file mode 100644 index 0000000000..93466e8dfe --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vfull.g++.4 @@ -0,0 +1,193 @@ +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.002 seconds + read_data CPU = 0.015 seconds +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian +neighbor 1 bin + +timestep 0.1 + +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 vel vfull method 1 + +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- GJ methods: doi:10.1080/00268976.2019.1662506 + +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020} +} + +- GJ-I vfull method: doi:10.1080/00268976.2012.760055 + +@Article{gronbech-jensen_simple_2013, +title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics}, +volume = {111}, +url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055}, +doi = {10.1080/00268976.2012.760055}, +pages = {983-991}, +number = {8}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels and Farago, Oded}, +year = {2013} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 5000 7.946377 -55.076514 0 -54.190084 337.31999 +Loop time of 2.0998 on 4 procs for 5000 steps with 864 atoms + +Performance: 20573.405 ns/day, 0.001 hours/ns, 2381.181 timesteps/s, 2.057 Matom-step/s +65.2% 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.53641 | 0.54389 | 0.54721 | 0.6 | 25.90 +Bond | 0.00056487 | 0.0006195 | 0.00068462 | 0.0 | 0.03 +Neigh | 0.10567 | 0.1086 | 0.11128 | 0.7 | 5.17 +Comm | 0.96913 | 0.97758 | 0.98191 | 0.5 | 46.56 +Output | 0.00025213 | 0.00025642 | 0.00026405 | 0.0 | 0.01 +Modify | 0.25061 | 0.25105 | 0.25172 | 0.1 | 11.96 +Other | | 0.2178 | | | 10.37 + +Nlocal: 216 ave 216 max 216 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 884.75 ave 885 max 884 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 4536 ave 4737 max 4335 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 273 +Dangerous builds = 0 + +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out + +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 7.946377 -55.076514 0 -54.190084 337.31999 + 6000 8.2565866 -55.129244 0 -54.208209 324.57967 + 8000 7.9942397 -55.101417 0 -54.209648 331.24127 + 10000 8.5413968 -55.083292 0 -54.130486 337.82599 + 12000 8.3682078 -55.090905 0 -54.157419 335.08066 + 14000 8.5082065 -55.085051 0 -54.135948 336.2765 + 16000 8.1944037 -55.090733 0 -54.176635 334.03786 + 18000 8.2607106 -55.030131 0 -54.108637 352.49892 + 20000 8.1154691 -55.104072 0 -54.198779 330.14203 + 22000 8.5592601 -55.152019 0 -54.197221 318.03507 + 24000 8.3182914 -55.115242 0 -54.187324 328.46084 + 26000 8.3691375 -55.125275 0 -54.191685 325.43673 + 28000 8.531632 -55.107097 0 -54.155381 331.42771 + 30000 8.1102222 -55.099011 0 -54.194304 332.04678 + 32000 8.5558571 -55.077016 0 -54.122598 339.87746 + 34000 8.4213946 -55.097068 0 -54.157649 333.34935 + 36000 8.0936615 -55.152202 0 -54.249342 316.20169 + 38000 7.999652 -55.048407 0 -54.156034 345.07945 + 40000 8.6699753 -55.087634 0 -54.120485 337.23709 +Loop time of 17.6726 on 4 procs for 35000 steps with 864 atoms + +Performance: 17111.263 ns/day, 0.001 hours/ns, 1980.470 timesteps/s, 1.711 Matom-step/s +65.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 | 5.0739 | 5.1178 | 5.1689 | 1.5 | 28.96 +Bond | 0.0043764 | 0.004688 | 0.0051706 | 0.4 | 0.03 +Neigh | 0.83797 | 0.85506 | 0.87554 | 1.8 | 4.84 +Comm | 6.816 | 6.8932 | 6.9215 | 1.7 | 39.00 +Output | 0.0043624 | 0.0045336 | 0.004998 | 0.4 | 0.03 +Modify | 3.3008 | 3.3033 | 3.3066 | 0.1 | 18.69 +Other | | 1.494 | | | 8.45 + +Nlocal: 216 ave 222 max 210 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 905.5 ave 911 max 899 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 4535.75 ave 4837 max 4218 min +Histogram: 1 0 0 1 0 0 1 0 0 1 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 2140 +Dangerous builds = 0 +Total wall time: 0:00:19 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 new file mode 100644 index 0000000000..569b13bad6 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.1 @@ -0,0 +1,192 @@ +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.000 seconds + read_data CPU = 0.010 seconds +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian +neighbor 1 bin + +timestep 0.1 + +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 + +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- GJ methods: doi:10.1080/00268976.2019.1662506 + +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020} +} + +- GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 + +@Article{jensen_accurate_2019, +title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, +volume = {117}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369}, +doi = {10.1080/00268976.2019.1570369}, +number = {18}, +journal = {Molecular Physics}, +author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels}, +year = {2019} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 5000 9.7731898 -55.150518 0 -54.060304 322.94195 +Loop time of 2.28421 on 1 procs for 5000 steps with 864 atoms + +Performance: 18912.438 ns/day, 0.001 hours/ns, 2188.940 timesteps/s, 1.891 Matom-step/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 | 1.2715 | 1.2715 | 1.2715 | 0.0 | 55.66 +Bond | 0.00057126 | 0.00057126 | 0.00057126 | 0.0 | 0.03 +Neigh | 0.27008 | 0.27008 | 0.27008 | 0.0 | 11.82 +Comm | 0.057938 | 0.057938 | 0.057938 | 0.0 | 2.54 +Output | 6.1954e-05 | 6.1954e-05 | 6.1954e-05 | 0.0 | 0.00 +Modify | 0.658 | 0.658 | 0.658 | 0.0 | 28.81 +Other | | 0.0261 | | | 1.14 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1593 ave 1593 max 1593 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18143 ave 18143 max 18143 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 258 +Dangerous builds = 0 + +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out + +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.481 | 6.481 | 6.481 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 9.7731898 -55.150518 0 -54.060304 322.94195 + 6000 10.024842 -55.108242 0 -53.989956 336.6125 + 8000 10.118994 -55.092171 0 -53.963382 340.42078 + 10000 10.541359 -55.100316 0 -53.924412 340.09986 + 12000 10.023234 -55.07343 0 -53.955323 345.70551 + 14000 9.5912018 -55.115121 0 -54.045208 333.43739 + 16000 9.9450498 -55.077813 0 -53.968428 343.49906 + 18000 10.113744 -55.12201 0 -53.993806 332.32214 + 20000 9.9345204 -55.176339 0 -54.068128 316.83219 + 22000 10.585719 -55.110505 0 -53.929652 336.86599 + 24000 10.024757 -55.120592 0 -54.002315 333.13056 + 26000 9.7787474 -55.116664 0 -54.02583 332.51437 + 28000 9.6092087 -55.130413 0 -54.058491 328.69165 + 30000 9.8245787 -55.057678 0 -53.961731 350.86255 + 32000 10.066994 -55.08989 0 -53.966902 341.49724 + 34000 9.5677059 -55.17222 0 -54.104928 316.06902 + 36000 9.7252627 -55.079475 0 -53.994608 343.13769 + 38000 10.438984 -55.108991 0 -53.944506 336.32562 + 40000 10.238268 -55.080817 0 -53.938723 345.13228 +Loop time of 19.138 on 1 procs for 35000 steps with 864 atoms + +Performance: 15801.041 ns/day, 0.002 hours/ns, 1828.824 timesteps/s, 1.580 Matom-step/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 | 11.568 | 11.568 | 11.568 | 0.0 | 60.44 +Bond | 0.0042372 | 0.0042372 | 0.0042372 | 0.0 | 0.02 +Neigh | 2.2577 | 2.2577 | 2.2577 | 0.0 | 11.80 +Comm | 0.42841 | 0.42841 | 0.42841 | 0.0 | 2.24 +Output | 0.00060128 | 0.00060128 | 0.00060128 | 0.0 | 0.00 +Modify | 4.694 | 4.694 | 4.694 | 0.0 | 24.53 +Other | | 0.1852 | | | 0.97 + +Nlocal: 864 ave 864 max 864 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 1592 ave 1592 max 1592 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 18144 ave 18144 max 18144 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 2122 +Dangerous builds = 0 +Total wall time: 0:00:21 diff --git a/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 new file mode 100644 index 0000000000..2b5e19e634 --- /dev/null +++ b/examples/gjf/log.2Apr25.gjf.vhalf.g++.4 @@ -0,0 +1,192 @@ +LAMMPS (2 Apr 2025 - Development - d4867ab55e-modified) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:99) + using 1 OpenMP thread(s) per MPI task +# GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors + special bonds CPU = 0.002 seconds + read_data CPU = 0.015 seconds +include ff-argon.lmp +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 +mass 1 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + + +velocity all create 10 2357 mom yes dist gaussian +neighbor 1 bin + +timestep 0.1 + +compute myKE all ke +compute myPE all pe + +fix lang all gjf 10 10 1 26488 + +run 5000 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- GJ methods: doi:10.1080/00268976.2019.1662506 + +@Article{gronbech-jensen_complete_2020, +title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations}, +volume = {118}, +number = {8}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506}, +doi = {10.1080/00268976.2019.1662506}, +journal = {Molecular Physics}, +author = {Grønbech-Jensen, Niels}, +year = {2020} +} + +- GJ-I vhalf method: doi:10.1080/00268976.2019.1570369 + +@Article{jensen_accurate_2019, +title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems}, +volume = {117}, +url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369}, +doi = {10.1080/00268976.2019.1570369}, +number = {18}, +journal = {Molecular Physics}, +author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels}, +year = {2019} +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.9407173 + ghost atom cutoff = 6.9407173 + binsize = 3.4703587, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 6.427 | 6.427 | 6.427 Mbytes + Step Temp E_pair E_mol TotEng Press + 0 10 -56.207652 0 -55.092137 33.341103 + 5000 9.3726166 -55.076514 0 -54.030985 342.43571 +Loop time of 2.11818 on 4 procs for 5000 steps with 864 atoms + +Performance: 20394.822 ns/day, 0.001 hours/ns, 2360.512 timesteps/s, 2.039 Matom-step/s +63.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 | 0.53987 | 0.54922 | 0.56044 | 1.2 | 25.93 +Bond | 0.00058281 | 0.00063674 | 0.00075153 | 0.0 | 0.03 +Neigh | 0.10821 | 0.10912 | 0.11017 | 0.2 | 5.15 +Comm | 0.96075 | 0.97484 | 0.98645 | 1.1 | 46.02 +Output | 0.00026318 | 0.00026575 | 0.00027192 | 0.0 | 0.01 +Modify | 0.26142 | 0.2634 | 0.26465 | 0.2 | 12.44 +Other | | 0.2207 | | | 10.42 + +Nlocal: 216 ave 216 max 216 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 884.75 ave 885 max 884 min +Histogram: 1 0 0 0 0 0 0 0 0 3 +Neighs: 4536 ave 4737 max 4335 min +Histogram: 2 0 0 0 0 0 0 0 0 2 + +Total # of neighbors = 18144 +Ave neighs/atom = 21 +Ave special neighs/atom = 0 +Neighbor list builds = 273 +Dangerous builds = 0 + +fix energies all ave/time 1 20000 20000 c_myKE c_myPE #file ave.out + +thermo 2000 +run 35000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 6.428 | 6.428 | 6.428 Mbytes + Step Temp E_pair E_mol TotEng Press + 5000 9.3726166 -55.076514 0 -54.030985 342.43571 + 6000 9.6911866 -55.129244 0 -54.048177 329.72537 + 8000 9.7296551 -55.101417 0 -54.016059 337.46595 + 10000 10.098808 -55.083292 0 -53.956755 343.4122 + 12000 10.114344 -55.090905 0 -53.962635 341.3438 + 14000 10.230012 -55.085051 0 -53.943878 342.45237 + 16000 9.5989709 -55.090733 0 -54.019954 339.07584 + 18000 10.016071 -55.030131 0 -53.912824 358.79514 + 20000 9.7197057 -55.104072 0 -54.019824 335.89619 + 22000 9.959647 -55.152019 0 -54.041005 323.05805 + 24000 10.075138 -55.115242 0 -53.991345 334.76239 + 26000 10.227192 -55.125275 0 -53.984416 332.10131 + 28000 10.177109 -55.107097 0 -53.971825 337.32979 + 30000 9.521036 -55.099011 0 -54.036925 337.10716 + 32000 10.265633 -55.077016 0 -53.93187 346.01018 + 34000 10.173978 -55.097068 0 -53.962146 339.63562 + 36000 9.6032778 -55.152202 0 -54.080942 321.61646 + 38000 9.8802995 -55.048407 0 -53.946245 351.82506 + 40000 10.372288 -55.087634 0 -53.93059 343.34304 +Loop time of 17.867 on 4 procs for 35000 steps with 864 atoms + +Performance: 16925.013 ns/day, 0.001 hours/ns, 1958.914 timesteps/s, 1.693 Matom-step/s +65.3% CPU use with 4 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 5.0932 | 5.1683 | 5.2256 | 2.5 | 28.93 +Bond | 0.0044473 | 0.0048347 | 0.0058137 | 0.8 | 0.03 +Neigh | 0.85262 | 0.8601 | 0.87438 | 0.9 | 4.81 +Comm | 6.8164 | 6.8981 | 6.9859 | 2.6 | 38.61 +Output | 0.0046884 | 0.0047093 | 0.0047322 | 0.0 | 0.03 +Modify | 3.4107 | 3.4186 | 3.4248 | 0.3 | 19.13 +Other | | 1.512 | | | 8.47 + +Nlocal: 216 ave 222 max 210 min +Histogram: 2 0 0 0 0 0 0 0 0 2 +Nghost: 905.5 ave 911 max 899 min +Histogram: 1 1 0 0 0 0 0 0 0 2 +Neighs: 4535.75 ave 4837 max 4218 min +Histogram: 1 0 0 1 0 0 1 0 0 1 + +Total # of neighbors = 18143 +Ave neighs/atom = 20.998843 +Ave special neighs/atom = 0 +Neighbor list builds = 2140 +Dangerous builds = 0 +Total wall time: 0:00:21 diff --git a/examples/granular/in.tableting.200 b/examples/granular/in.tableting.200 index 41723c72af..58fc8dde3e 100644 --- a/examples/granular/in.tableting.200 +++ b/examples/granular/in.tableting.200 @@ -28,19 +28,20 @@ variable dieHeight equal 1e-2 pair_style granular -# mdr = E, nu, Y, gamma, psi_b, CoR +# mdr = E, nu, Y, gamma, psi_b, damp variable YoungsModulus equal 5e6 variable YieldStress equal 1.9e5 variable PoissonsRatio equal 0.4 variable SurfaceEnergy equal 2 variable SurfaceEnergyWall equal 0.0 -variable CoR equal 0.5 variable psi_b equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gammat, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable kt_wall equal 2/7*${YoungsModulus}*${atomRadius} -variable xgammat equal 0.0 +variable xgammat equal 1.0 variable mu_s equal 0.7 variable mu_s_wall equal 0.1 @@ -49,14 +50,17 @@ variable mu_roll equal 0.6 variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} variable gamma_roll equal 0.0 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} damping none +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr ${damp_type} & + tangential linear_history ${kt} ${xgammat} ${mu_s} & + rolling sds ${k_roll} ${gamma_roll} ${mu_roll} ######################################### ADD DIE AND PUNCH WALLS ############################################ variable disp_upper equal 0.0 variable disp_lower equal 0.0 -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${CoR} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} damping none" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" variable dieHeight2 equal 2*${dieHeight} @@ -73,7 +77,7 @@ variable avgUpperPunchForce equal c_avgUpperPunchForce compute avgLowerPunchForce all reduce sum f_lowerPunch[4] variable avgLowerPunchForce equal c_avgLowerPunchForce -fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no +#fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no ##################################### INTEGRATION AND GRAVITY ################################################# @@ -109,13 +113,13 @@ variable syy_ave equal c_sigmayy_ave variable szz_ave equal c_sigmazz_ave variable Vparticles equal c_Velas_sum -fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no -dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz +#fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no +#dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz #dump dumpParticlesVTK all vtk ${output_rate} post/particles_*.vtk id x y z fx fy fz vx vy vz c_ke radius c_sigmaxx c_sigmayy c_sigmazz ############################################## RUN SIMULATION ################################################# -variable upper_punch_stroke equal 0.6733*${dieHeight} +variable upper_punch_stroke equal 0.7*${dieHeight} variable vel_upper equal 0.25 variable settling_steps equal round(0.02/dt) @@ -146,4 +150,4 @@ run ${ejection_steps} variable disp_lower equal ${dieHeight} variable disp_upper equal ${dieHeight}*0.9 variable max_disp equal ${dieRadius}*0.75 -run ${free_float_steps} \ No newline at end of file +run ${free_float_steps} diff --git a/examples/granular/in.triaxial.compaction.12 b/examples/granular/in.triaxial.compaction.12 index eee9a2bfd8..0a35ab3c0a 100644 --- a/examples/granular/in.triaxial.compaction.12 +++ b/examples/granular/in.triaxial.compaction.12 @@ -1,7 +1,7 @@ ############################### SIMULATION SETTINGS ################################################### atom_style sphere 1 -atom_modify map array +atom_modify map array comm_modify vel yes units si newton off @@ -24,20 +24,23 @@ variable atomRadius equal 0.5 pair_style granular -# mdr = E, nu, Y, gamma, psi_b, CoR +# mdr = E, nu, Y, gamma, psi_b, damp variable YoungsModulus equal 1e9 variable PoissonsRatio equal 0.3 variable YieldStress equal 50e6 variable SurfaceEnergy equal 0.0 variable psi_b equal 0.5 -variable CoR equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 # linear_history = k_t, x_gamma,t, mu_s variable kt equal 2/7*${YoungsModulus}*${atomRadius} variable xgammat equal 0.0 variable mu_s equal 0.5 -pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} damping none +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} & + damping mdr ${damp_type} & + tangential linear_history ${kt} ${xgammat} ${mu_s} ######################################### ADD IN PLANES ################################################ @@ -54,7 +57,7 @@ region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_d region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box -variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${CoR} tangential linear_history ${kt} ${xgammat} ${mu_s} damping none" +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} " fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts @@ -72,12 +75,12 @@ variable plane_xz_neg_force equal c_plane_xz_neg_force compute plane_yz_neg_force all reduce sum f_plane_yz_neg[2] variable plane_yz_neg_force equal c_plane_yz_neg_force -fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no +#fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no -######################################## SCREEN OUTPUT #################################################### +######################################## SCREEN OUTPUT #################################################### compute 1 all erotate/sphere -thermo_style custom dt step atoms ke c_1 vol +thermo_style custom dt step atoms ke c_1 vol thermo 100 thermo_modify lost ignore norm no @@ -89,8 +92,8 @@ variable compression_steps equal round(${disp_max}/${ddisp}) variable output_rate equal round(${compression_steps}/100) ##################################### SET UP DUMP OUTPUTS #################################################### - -dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius + +#dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius #dump dmp all vtk ${output_rate} post/triaxial12particles_*.vtk id type mass x y z vx vy vz fx fy fz radius #################################### COMPRESS THE PARTICLES ################################################## @@ -101,7 +104,7 @@ run 0 compute Ac_1_12 particles_1_12 pair/local p13 cutoff radius compute Ac_1_12_sum particles_1_12 reduce sum c_Ac_1_12 inputs local variable Ac_1_12 equal c_Ac_1_12_sum -fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no +#fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no variable plane_disp equal ${ddisp}*elapsed variable plane_disp_neg equal -${ddisp}*elapsed diff --git a/examples/granular/log.4Feb25.tableting.200.g++.1 b/examples/granular/log.4Feb25.tableting.200.g++.1 new file mode 100644 index 0000000000..c164f3dbee --- /dev/null +++ b/examples/granular/log.4Feb25.tableting.200.g++.1 @@ -0,0 +1,795 @@ +LAMMPS (4 Feb 2025 - Development - patch_5May2020-22356-g0c29a0a0c9-modified) +##################################### SIMULATION SETTINGS ################################################### + +atom_style sphere 1 +atom_modify map array +comm_modify vel yes +units si +newton off +neighbor 1.0e-3 bin +neigh_modify every 10 delay 60 check no +timestep 4e-6 +#processors 2 2 1 + +############################## SIMULATION BOUNDING BOX AND INSERT PARTICLES ################################# + +boundary f f f +read_data spheres200.data +Reading data file ... + orthogonal box = (-0.005 -0.005 -0.001) to (0.005 0.005 0.02) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 200 atoms + read_data CPU = 0.024 seconds + +#################################### ADD DIE AND ATOM PARAMETERIZATION ###################################### + +variable atomRadius equal 0.44e-3*1.25 +variable atomDiameter equal 2*${atomRadius} +variable atomDiameter equal 2*0.00055 +variable atomDensity equal 1560 +variable atomMassAvg equal ${atomDensity}*4.0/3.0*PI*${atomRadius}^3.0 +variable atomMassAvg equal 1560*4.0/3.0*PI*${atomRadius}^3.0 +variable atomMassAvg equal 1560*4.0/3.0*PI*0.00055^3.0 +variable dieRadius equal 4e-3 +variable dieHeight equal 1e-2 + +############################## PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ################################## + +pair_style granular + +# mdr = E, nu, Y, gamma, psi_b, damp +variable YoungsModulus equal 5e6 +variable YieldStress equal 1.9e5 +variable PoissonsRatio equal 0.4 +variable SurfaceEnergy equal 2 +variable SurfaceEnergyWall equal 0.0 +variable psi_b equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 + +# linear_history = k_t, x_gammat, mu_s +variable kt equal 2/7*${YoungsModulus}*${atomRadius} +variable kt equal 2/7*5000000*${atomRadius} +variable kt equal 2/7*5000000*0.00055 +variable kt_wall equal 2/7*${YoungsModulus}*${atomRadius} +variable kt_wall equal 2/7*5000000*${atomRadius} +variable kt_wall equal 2/7*5000000*0.00055 +variable xgammat equal 1.0 +variable mu_s equal 0.7 +variable mu_s_wall equal 0.1 + +# sds = mu_roll, k_roll, gamma_roll +variable mu_roll equal 0.6 +variable k_roll equal 2.25*${mu_roll}*${mu_roll}*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*${mu_roll}*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*${YoungsModulus}*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*5000000*${atomRadius} +variable k_roll equal 2.25*0.6*0.6*5000000*0.00055 +variable gamma_roll equal 0.0 + +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 ${xgammat} ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 ${mu_s} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 ${mu_roll} +pair_coeff * * mdr 5000000 0.4 190000 2 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.7 rolling sds 2227.5 0 0.6 + +######################################### ADD DIE AND PUNCH WALLS ############################################ + +variable disp_upper equal 0.0 +variable disp_lower equal 0.0 + +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll}" +granular mdr 5000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 ${YieldStress} ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 ${SurfaceEnergyWall} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt_wall} ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 ${xgammat} ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 ${mu_s_wall} rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds ${k_roll} ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 ${gamma_roll} ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 ${mu_roll} +granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 + +variable dieHeight2 equal 2*${dieHeight} +variable dieHeight2 equal 2*0.01 + +region lowerPunch plane 0 0 0 0 0 1 side in units box move NULL NULL v_disp_lower units box +region upperPunch plane 0 0 ${dieHeight} 0 0 -1 side in move NULL NULL v_disp_upper units box +region upperPunch plane 0 0 0.01 0 0 -1 side in move NULL NULL v_disp_upper units box +region die cylinder z 0 0 ${dieRadius} 0 ${dieHeight2} side in units box +region die cylinder z 0 0 0.004 0 ${dieHeight2} side in units box +region die cylinder z 0 0 0.004 0 0.02 side in units box + +fix lowerPunch all wall/gran/region ${wall_contact_string} region lowerPunch contacts +fix lowerPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region lowerPunch contacts +fix upperPunch all wall/gran/region ${wall_contact_string} region upperPunch contacts +fix upperPunch all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region upperPunch contacts +fix die all wall/gran/region ${wall_contact_string} region die contacts +fix die all wall/gran/region granular mdr 5000000 0.4 190000 0 0.5 0.2 damping mdr 1 tangential linear_history 785.714285714286 1 0.1 rolling sds 2227.5 0 0.6 region die contacts + +compute avgUpperPunchForce all reduce sum f_upperPunch[4] +variable avgUpperPunchForce equal c_avgUpperPunchForce +compute avgLowerPunchForce all reduce sum f_lowerPunch[4] +variable avgLowerPunchForce equal c_avgLowerPunchForce + +#fix printFD all print 1 "${disp_upper} ${avgUpperPunchForce} ${avgLowerPunchForce}" file punch_force_disp_tableting200.csv screen no + +##################################### INTEGRATION AND GRAVITY ################################################# + +fix 1 all nve/sphere +fix grav all gravity 9.81 vector 0 0 -1 + +########################################### SCREEN OUTPUT #################################################### + +compute 1 all erotate/sphere +thermo_style custom dt step atoms ke vol v_disp_upper +thermo 100 +thermo_modify lost ignore norm no + +##################################### SET UP DUMP OUTPUTS #################################################### + +compute ke all ke/atom +variable output_rate equal round(1e-3/dt) + +run 0 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289 + +@Article{zunker2024mechanicallyI, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part I: Utilizing the method of dimensionality reduction}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105492}, +} + +@Article{zunker2024mechanicallyII, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part II: Contact under high compaction—modeling a bulk elastic response}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105493}, +} + +@Article{zunker2025experimentally, + author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, + title = {Experimentally validated DEM for large deformation powder compaction: + mechanically-derived contact model and screening of non-physical contacts}, + journal = {Powder Technology}, + year = {2025}, + pages = {120972}, +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 10 steps, delay = 60 steps, check = no + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 0.002318 + ghost atom cutoff = 0.002318 + binsize = 0.001159, bins = 9 9 19 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 0 200 0 2.1e-06 0 +Loop time of 7.43e-07 on 1 procs for 0 steps with 200 atoms + +134.6% 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 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 7.43e-07 | | |100.00 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1341 ave 1341 max 1341 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1341 +Ave neighs/atom = 6.705 +Neighbor list builds = 0 +Dangerous builds not checked + +compute sigmaxx all property/atom d_sigmaxx +compute sigmayy all property/atom d_sigmayy +compute sigmazz all property/atom d_sigmazz +compute Velas all property/atom d_Velas + +compute sigmaxx_ave all reduce ave c_sigmaxx +compute sigmayy_ave all reduce ave c_sigmayy +compute sigmazz_ave all reduce ave c_sigmazz +compute Velas_sum all reduce sum c_Velas + +variable sxx_ave equal c_sigmaxx_ave +variable syy_ave equal c_sigmayy_ave +variable szz_ave equal c_sigmazz_ave +variable Vparticles equal c_Velas_sum + +#fix log all print 1 "${sxx_ave} ${syy_ave} ${szz_ave} ${Vparticles}" file average_normal_stresses_tableting200.csv screen no +#dump dumpParticles all custom ${output_rate} tableting200.dump id type mass diameter x y z vx vy vz fx fy fz c_ke c_sigmaxx c_sigmayy c_sigmazz +#dump dumpParticlesVTK all vtk ${output_rate} post/particles_*.vtk id x y z fx fy fz vx vy vz c_ke radius c_sigmaxx c_sigmayy c_sigmazz + +############################################## RUN SIMULATION ################################################# + +variable upper_punch_stroke equal 0.7*${dieHeight} +variable upper_punch_stroke equal 0.7*0.01 +variable vel_upper equal 0.25 + +variable settling_steps equal round(0.02/dt) +variable compression_steps equal 2*round(${upper_punch_stroke}/${vel_upper}/dt) +variable compression_steps equal 2*round(0.007/${vel_upper}/dt) +variable compression_steps equal 2*round(0.007/0.25/dt) +variable ejection_steps equal ${compression_steps} +variable ejection_steps equal 14000 +variable free_float_steps equal round(0.02/dt) + +##### SETTLING ##### + +run ${settling_steps} +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 0 200 0 2.1e-06 0 + 4e-06 100 200 1.5945503e-09 2.1e-06 0 + 4e-06 200 200 6.3750614e-09 2.1e-06 0 + 4e-06 300 200 1.4225143e-08 2.1e-06 0 + 4e-06 400 200 2.5255561e-08 2.1e-06 0 + 4e-06 500 200 3.947508e-08 2.1e-06 0 + 4e-06 600 200 5.6839079e-08 2.1e-06 0 + 4e-06 700 200 7.7346494e-08 2.1e-06 0 + 4e-06 800 200 1.0075645e-07 2.1e-06 0 + 4e-06 900 200 1.2660105e-07 2.1e-06 0 + 4e-06 1000 200 1.5571123e-07 2.1e-06 0 + 4e-06 1100 200 1.8785107e-07 2.1e-06 0 + 4e-06 1200 200 2.2200974e-07 2.1e-06 0 + 4e-06 1300 200 2.6009223e-07 2.1e-06 0 + 4e-06 1400 200 3.0148646e-07 2.1e-06 0 + 4e-06 1500 200 3.4269724e-07 2.1e-06 0 + 4e-06 1600 200 3.8502938e-07 2.1e-06 0 + 4e-06 1700 200 4.2763891e-07 2.1e-06 0 + 4e-06 1800 200 4.6779321e-07 2.1e-06 0 + 4e-06 1900 200 5.1285578e-07 2.1e-06 0 + 4e-06 2000 200 5.6630973e-07 2.1e-06 0 + 4e-06 2100 200 6.1904302e-07 2.1e-06 0 + 4e-06 2200 200 6.7462868e-07 2.1e-06 0 + 4e-06 2300 200 7.3066636e-07 2.1e-06 0 + 4e-06 2400 200 7.7407334e-07 2.1e-06 0 + 4e-06 2500 200 8.3353557e-07 2.1e-06 0 + 4e-06 2600 200 9.0017986e-07 2.1e-06 0 + 4e-06 2700 200 9.5154909e-07 2.1e-06 0 + 4e-06 2800 200 1.0110977e-06 2.1e-06 0 + 4e-06 2900 200 1.0661364e-06 2.1e-06 0 + 4e-06 3000 200 1.1226841e-06 2.1e-06 0 + 4e-06 3100 200 1.1703917e-06 2.1e-06 0 + 4e-06 3200 200 1.2254551e-06 2.1e-06 0 + 4e-06 3300 200 1.2239859e-06 2.1e-06 0 + 4e-06 3400 200 1.273437e-06 2.1e-06 0 + 4e-06 3500 200 1.3357598e-06 2.1e-06 0 + 4e-06 3600 200 1.3949477e-06 2.1e-06 0 + 4e-06 3700 200 1.459988e-06 2.1e-06 0 + 4e-06 3800 200 1.5053806e-06 2.1e-06 0 + 4e-06 3900 200 1.4952453e-06 2.1e-06 0 + 4e-06 4000 200 1.5037857e-06 2.1e-06 0 + 4e-06 4100 200 1.5225204e-06 2.1e-06 0 + 4e-06 4200 200 1.5375323e-06 2.1e-06 0 + 4e-06 4300 200 1.5552328e-06 2.1e-06 0 + 4e-06 4400 200 1.581097e-06 2.1e-06 0 + 4e-06 4500 200 1.6066427e-06 2.1e-06 0 + 4e-06 4600 200 1.6061944e-06 2.1e-06 0 + 4e-06 4700 200 1.6110891e-06 2.1e-06 0 + 4e-06 4800 200 1.6072997e-06 2.1e-06 0 + 4e-06 4900 200 1.5907992e-06 2.1e-06 0 + 4e-06 5000 200 1.5501104e-06 2.1e-06 0 +Loop time of 0.592588 on 1 procs for 5000 steps with 200 atoms + +99.4% 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.20465 | 0.20465 | 0.20465 | 0.0 | 34.53 +Neigh | 0.013252 | 0.013252 | 0.013252 | 0.0 | 2.24 +Comm | 0.00037594 | 0.00037594 | 0.00037594 | 0.0 | 0.06 +Output | 0.00037454 | 0.00037454 | 0.00037454 | 0.0 | 0.06 +Modify | 0.37295 | 0.37295 | 0.37295 | 0.0 | 62.93 +Other | | 0.0009914 | | | 0.17 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1632 ave 1632 max 1632 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1632 +Ave neighs/atom = 8.16 +Neighbor list builds = 83 +Dangerous builds not checked + +##### Compression & Release ##### + +variable punch_frequency equal PI/2/(dt*${compression_steps}/2) +variable punch_frequency equal PI/2/(dt*14000/2) +variable disp_upper equal -${upper_punch_stroke}*sin(${punch_frequency}*elapsed*dt) +variable disp_upper equal -0.007*sin(${punch_frequency}*elapsed*dt) +variable disp_upper equal -0.007*sin(56.0998688141035*elapsed*dt) +variable short_release equal round(${compression_steps}*1.0) +variable short_release equal round(14000*1.0) +run ${short_release} +run 14000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.3 | 72.3 | 72.3 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 5000 200 1.5501104e-06 2.1e-06 0 + 4e-06 5100 200 1.5146077e-06 2.1e-06 -0.00015706645 + 4e-06 5200 200 1.4902158e-06 2.1e-06 -0.00031405381 + 4e-06 5300 200 1.3871134e-06 2.1e-06 -0.00047088304 + 4e-06 5400 200 1.3531184e-06 2.1e-06 -0.00062747516 + 4e-06 5500 200 1.3154278e-06 2.1e-06 -0.00078375133 + 4e-06 5600 200 1.2461265e-06 2.1e-06 -0.00093963286 + 4e-06 5700 200 1.1840322e-06 2.1e-06 -0.0010950413 + 4e-06 5800 200 1.083844e-06 2.1e-06 -0.0012498983 + 4e-06 5900 200 9.8572649e-07 2.1e-06 -0.0014041259 + 4e-06 6000 200 8.6605656e-07 2.1e-06 -0.0015576465 + 4e-06 6100 200 7.6694391e-07 2.1e-06 -0.0017103828 + 4e-06 6200 200 7.1292979e-07 2.1e-06 -0.0018622579 + 4e-06 6300 200 6.475067e-07 2.1e-06 -0.0020131953 + 4e-06 6400 200 5.378202e-07 2.1e-06 -0.002163119 + 4e-06 6500 200 4.5668598e-07 2.1e-06 -0.0023119534 + 4e-06 6600 200 3.1208987e-07 2.1e-06 -0.0024596238 + 4e-06 6700 200 2.2996407e-07 2.1e-06 -0.0026060556 + 4e-06 6800 200 1.658813e-07 2.1e-06 -0.0027511752 + 4e-06 6900 200 1.4495016e-07 2.1e-06 -0.0028949095 + 4e-06 7000 200 1.6172966e-07 2.1e-06 -0.0030371862 + 4e-06 7100 200 4.6620591e-07 2.1e-06 -0.0031779335 + 4e-06 7200 200 6.8121833e-07 2.1e-06 -0.0033170806 + 4e-06 7300 200 1.5506154e-06 2.1e-06 -0.0034545575 + 4e-06 7400 200 2.5919669e-06 2.1e-06 -0.0035902949 + 4e-06 7500 200 2.9403576e-06 2.1e-06 -0.0037242245 + 4e-06 7600 200 2.7726732e-06 2.1e-06 -0.0038562789 + 4e-06 7700 200 2.6586936e-06 2.1e-06 -0.0039863915 + 4e-06 7800 200 2.7059447e-06 2.1e-06 -0.0041144968 + 4e-06 7900 200 2.8454301e-06 2.1e-06 -0.0042405303 + 4e-06 8000 200 2.7747574e-06 2.1e-06 -0.0043644286 + 4e-06 8100 200 2.6329747e-06 2.1e-06 -0.0044861293 + 4e-06 8200 200 2.3654294e-06 2.1e-06 -0.0046055711 + 4e-06 8300 200 2.616465e-06 2.1e-06 -0.0047226938 + 4e-06 8400 200 2.6920973e-06 2.1e-06 -0.0048374385 + 4e-06 8500 200 2.6041158e-06 2.1e-06 -0.0049497475 + 4e-06 8600 200 1.8236056e-06 2.1e-06 -0.005059564 + 4e-06 8700 200 2.1290462e-06 2.1e-06 -0.005166833 + 4e-06 8800 200 1.8723934e-06 2.1e-06 -0.0052715003 + 4e-06 8900 200 1.7196474e-06 2.1e-06 -0.0053735132 + 4e-06 9000 200 1.558001e-06 2.1e-06 -0.0054728204 + 4e-06 9100 200 1.1714433e-06 2.1e-06 -0.0055693718 + 4e-06 9200 200 1.7973167e-06 2.1e-06 -0.005663119 + 4e-06 9300 200 1.4951874e-06 2.1e-06 -0.0057540145 + 4e-06 9400 200 1.197557e-06 2.1e-06 -0.0058420128 + 4e-06 9500 200 1.1638085e-06 2.1e-06 -0.0059270694 + 4e-06 9600 200 1.2591061e-06 2.1e-06 -0.0060091416 + 4e-06 9700 200 1.2747299e-06 2.1e-06 -0.0060881879 + 4e-06 9800 200 1.2424243e-06 2.1e-06 -0.0061641687 + 4e-06 9900 200 1.1624586e-06 2.1e-06 -0.0062370457 + 4e-06 10000 200 1.0724272e-06 2.1e-06 -0.0063067821 + 4e-06 10100 200 1.0806622e-06 2.1e-06 -0.0063733428 + 4e-06 10200 200 9.2046484e-07 2.1e-06 -0.0064366944 + 4e-06 10300 200 8.1801156e-07 2.1e-06 -0.0064968049 + 4e-06 10400 200 7.74927e-07 2.1e-06 -0.0065536441 + 4e-06 10500 200 6.85447e-07 2.1e-06 -0.0066071833 + 4e-06 10600 200 5.4693931e-07 2.1e-06 -0.0066573956 + 4e-06 10700 200 4.5275522e-07 2.1e-06 -0.0067042557 + 4e-06 10800 200 4.2807826e-07 2.1e-06 -0.00674774 + 4e-06 10900 200 3.5676739e-07 2.1e-06 -0.0067878266 + 4e-06 11000 200 2.9448839e-07 2.1e-06 -0.0068244954 + 4e-06 11100 200 2.7397196e-07 2.1e-06 -0.0068577278 + 4e-06 11200 200 1.8313029e-07 2.1e-06 -0.0068875071 + 4e-06 11300 200 1.4616679e-07 2.1e-06 -0.0069138184 + 4e-06 11400 200 1.0916404e-07 2.1e-06 -0.0069366483 + 4e-06 11500 200 7.4608897e-08 2.1e-06 -0.0069559855 + 4e-06 11600 200 4.9799693e-08 2.1e-06 -0.0069718201 + 4e-06 11700 200 2.996701e-08 2.1e-06 -0.0069841441 + 4e-06 11800 200 1.1810054e-08 2.1e-06 -0.0069929515 + 4e-06 11900 200 3.9455661e-09 2.1e-06 -0.0069982376 + 4e-06 12000 200 7.0818836e-11 2.1e-06 -0.007 + 4e-06 12100 200 3.989114e-09 2.1e-06 -0.0069982376 + 4e-06 12200 200 1.0481589e-08 2.1e-06 -0.0069929515 + 4e-06 12300 200 2.3561653e-08 2.1e-06 -0.0069841441 + 4e-06 12400 200 4.1819363e-08 2.1e-06 -0.0069718201 + 4e-06 12500 200 6.5328826e-08 2.1e-06 -0.0069559855 + 4e-06 12600 200 9.3738095e-08 2.1e-06 -0.0069366483 + 4e-06 12700 200 1.3058219e-07 2.1e-06 -0.0069138184 + 4e-06 12800 200 1.7668602e-07 2.1e-06 -0.0068875071 + 4e-06 12900 200 2.1482809e-07 2.1e-06 -0.0068577278 + 4e-06 13000 200 2.7185589e-07 2.1e-06 -0.0068244954 + 4e-06 13100 200 3.3577426e-07 2.1e-06 -0.0067878266 + 4e-06 13200 200 3.9749034e-07 2.1e-06 -0.00674774 + 4e-06 13300 200 5.0743398e-07 2.1e-06 -0.0067042557 + 4e-06 13400 200 5.6629069e-07 2.1e-06 -0.0066573956 + 4e-06 13500 200 5.9092105e-07 2.1e-06 -0.0066071833 + 4e-06 13600 200 7.313638e-07 2.1e-06 -0.0065536441 + 4e-06 13700 200 1.0954352e-06 2.1e-06 -0.0064968049 + 4e-06 13800 200 7.1637332e-07 2.1e-06 -0.0064366944 + 4e-06 13900 200 8.5398051e-07 2.1e-06 -0.0063733428 + 4e-06 14000 200 1.0429888e-06 2.1e-06 -0.0063067821 + 4e-06 14100 200 1.6673022e-07 2.1e-06 -0.0062370457 + 4e-06 14200 200 2.0206568e-08 2.1e-06 -0.0061641687 + 4e-06 14300 200 5.6062261e-09 2.1e-06 -0.0060881879 + 4e-06 14400 200 4.5198973e-09 2.1e-06 -0.0060091416 + 4e-06 14500 200 2.5522353e-09 2.1e-06 -0.0059270694 + 4e-06 14600 200 9.091094e-10 2.1e-06 -0.0058420128 + 4e-06 14700 200 1.3992806e-10 2.1e-06 -0.0057540145 + 4e-06 14800 200 1.0208666e-11 2.1e-06 -0.005663119 + 4e-06 14900 200 8.4078334e-11 2.1e-06 -0.0055693718 + 4e-06 15000 200 1.2567311e-10 2.1e-06 -0.0054728204 + 4e-06 15100 200 5.2285722e-10 2.1e-06 -0.0053735132 + 4e-06 15200 200 1.5839179e-10 2.1e-06 -0.0052715003 + 4e-06 15300 200 3.2283374e-11 2.1e-06 -0.005166833 + 4e-06 15400 200 2.9516435e-12 2.1e-06 -0.005059564 + 4e-06 15500 200 1.0302118e-11 2.1e-06 -0.0049497475 + 4e-06 15600 200 1.7289975e-11 2.1e-06 -0.0048374385 + 4e-06 15700 200 1.4850209e-11 2.1e-06 -0.0047226938 + 4e-06 15800 200 8.0260964e-12 2.1e-06 -0.0046055711 + 4e-06 15900 200 2.616591e-12 2.1e-06 -0.0044861293 + 4e-06 16000 200 3.0793261e-13 2.1e-06 -0.0043644286 + 4e-06 16100 200 4.9187696e-13 2.1e-06 -0.0042405303 + 4e-06 16200 200 3.9849142e-13 2.1e-06 -0.0041144968 + 4e-06 16300 200 5.2823345e-13 2.1e-06 -0.0039863915 + 4e-06 16400 200 3.9902725e-13 2.1e-06 -0.0038562789 + 4e-06 16500 200 1.9259043e-13 2.1e-06 -0.0037242245 + 4e-06 16600 200 5.3557316e-14 2.1e-06 -0.0035902949 + 4e-06 16700 200 3.7734621e-15 2.1e-06 -0.0034545575 + 4e-06 16800 200 3.0867115e-15 2.1e-06 -0.0033170806 + 4e-06 16900 200 1.1841579e-14 2.1e-06 -0.0031779335 + 4e-06 17000 200 1.3850503e-14 2.1e-06 -0.0030371862 + 4e-06 17100 200 9.8491914e-15 2.1e-06 -0.0028949095 + 4e-06 17200 200 4.7140149e-15 2.1e-06 -0.0027511752 + 4e-06 17300 200 1.3440466e-15 2.1e-06 -0.0026060556 + 4e-06 17400 200 1.0627828e-16 2.1e-06 -0.0024596238 + 4e-06 17500 200 6.2015781e-17 2.1e-06 -0.0023119534 + 4e-06 17600 200 2.8723007e-16 2.1e-06 -0.002163119 + 4e-06 17700 200 3.6601367e-16 2.1e-06 -0.0020131953 + 4e-06 17800 200 2.7862312e-16 2.1e-06 -0.0018622579 + 4e-06 17900 200 1.4268051e-16 2.1e-06 -0.0017103828 + 4e-06 18000 200 4.5443603e-17 2.1e-06 -0.0015576465 + 4e-06 18100 200 5.2330376e-18 2.1e-06 -0.0014041259 + 4e-06 18200 200 7.3566254e-19 2.1e-06 -0.0012498983 + 4e-06 18300 200 6.5880468e-18 2.1e-06 -0.0010950413 + 4e-06 18400 200 9.5744931e-18 2.1e-06 -0.00093963286 + 4e-06 18500 200 7.8604487e-18 2.1e-06 -0.00078375133 + 4e-06 18600 200 4.3166295e-18 2.1e-06 -0.00062747516 + 4e-06 18700 200 1.5188792e-18 2.1e-06 -0.00047088304 + 4e-06 18800 200 2.3221067e-19 2.1e-06 -0.00031405381 + 4e-06 18900 200 4.7558964e-21 2.1e-06 -0.00015706645 + 4e-06 19000 200 1.4567292e-19 2.1e-06 2.0903119e-17 +Loop time of 6.96616 on 1 procs for 14000 steps with 200 atoms + +99.5% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.8534 | 3.8534 | 3.8534 | 0.0 | 55.32 +Neigh | 0.038778 | 0.038778 | 0.038778 | 0.0 | 0.56 +Comm | 0.0015081 | 0.0015081 | 0.0015081 | 0.0 | 0.02 +Output | 0.0018007 | 0.0018007 | 0.0018007 | 0.0 | 0.03 +Modify | 3.0668 | 3.0668 | 3.0668 | 0.0 | 44.02 +Other | | 0.003851 | | | 0.06 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3031 ave 3031 max 3031 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3031 +Ave neighs/atom = 15.155 +Neighbor list builds = 233 +Dangerous builds not checked + +##### EJECTION ##### + +variable punch_frequency equal PI/2/(dt*${ejection_steps}) +variable punch_frequency equal PI/2/(dt*14000) +variable disp_lower equal ${dieHeight}*sin(${punch_frequency}*elapsed*dt) +variable disp_lower equal 0.01*sin(${punch_frequency}*elapsed*dt) +variable disp_lower equal 0.01*sin(28.0499344070517*elapsed*dt) +variable disp_upper equal 0.9*v_disp_lower +run ${ejection_steps} +run 14000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 19000 200 1.4567292e-19 2.1e-06 0 + 4e-06 19100 200 1.9132195e-05 2.1e-06 0.00010097765 + 4e-06 19200 200 3.1561748e-06 2.1e-06 0.00020194258 + 4e-06 19300 200 1.4462178e-05 2.1e-06 0.00030288209 + 4e-06 19400 200 4.6622112e-06 2.1e-06 0.00040378347 + 4e-06 19500 200 1.1929852e-05 2.1e-06 0.00050463403 + 4e-06 19600 200 5.6933661e-06 2.1e-06 0.00060542105 + 4e-06 19700 200 1.0429976e-05 2.1e-06 0.00070613186 + 4e-06 19800 200 6.6580254e-06 2.1e-06 0.00080675378 + 4e-06 19900 200 9.1721686e-06 2.1e-06 0.00090727414 + 4e-06 20000 200 7.4553343e-06 2.1e-06 0.0010076803 + 4e-06 20100 200 8.3534813e-06 2.1e-06 0.0011079596 + 4e-06 20200 200 7.8671075e-06 2.1e-06 0.0012080994 + 4e-06 20300 200 7.9115898e-06 2.1e-06 0.0013080871 + 4e-06 20400 200 8.2222312e-06 2.1e-06 0.0014079102 + 4e-06 20500 200 7.5281175e-06 2.1e-06 0.001507556 + 4e-06 20600 200 8.4242027e-06 2.1e-06 0.0016070121 + 4e-06 20700 200 7.3282364e-06 2.1e-06 0.0017062658 + 4e-06 20800 200 8.3501222e-06 2.1e-06 0.0018053047 + 4e-06 20900 200 7.3417566e-06 2.1e-06 0.0019041164 + 4e-06 21000 200 8.0702927e-06 2.1e-06 0.0020026884 + 4e-06 21100 200 7.5896194e-06 2.1e-06 0.0021010083 + 4e-06 21200 200 7.6596342e-06 2.1e-06 0.0021990637 + 4e-06 21300 200 7.7009755e-06 2.1e-06 0.0022968422 + 4e-06 21400 200 7.4010568e-06 2.1e-06 0.0023943316 + 4e-06 21500 200 7.7254953e-06 2.1e-06 0.0024915196 + 4e-06 21600 200 7.2931076e-06 2.1e-06 0.0025883939 + 4e-06 21700 200 7.5667043e-06 2.1e-06 0.0026849424 + 4e-06 21800 200 7.2767179e-06 2.1e-06 0.0027811529 + 4e-06 21900 200 7.3632148e-06 2.1e-06 0.0028770133 + 4e-06 22000 200 7.2563523e-06 2.1e-06 0.0029725116 + 4e-06 22100 200 7.2003226e-06 2.1e-06 0.0030676356 + 4e-06 22200 200 7.1862422e-06 2.1e-06 0.0031623734 + 4e-06 22300 200 7.0035785e-06 2.1e-06 0.0032567132 + 4e-06 22400 200 7.1023437e-06 2.1e-06 0.0033506429 + 4e-06 22500 200 6.8767896e-06 2.1e-06 0.0034441509 + 4e-06 22600 200 6.9556381e-06 2.1e-06 0.0035372253 + 4e-06 22700 200 6.7754491e-06 2.1e-06 0.0036298544 + 4e-06 22800 200 6.7752923e-06 2.1e-06 0.0037220265 + 4e-06 22900 200 6.6947789e-06 2.1e-06 0.0038137301 + 4e-06 23000 200 6.5811876e-06 2.1e-06 0.0039049537 + 4e-06 23100 200 6.5600064e-06 2.1e-06 0.0039956856 + 4e-06 23200 200 6.407054e-06 2.1e-06 0.0040859145 + 4e-06 23300 200 6.4635326e-06 2.1e-06 0.0041756291 + 4e-06 23400 200 6.2604509e-06 2.1e-06 0.004264818 + 4e-06 23500 200 6.2914059e-06 2.1e-06 0.00435347 + 4e-06 23600 200 6.1416598e-06 2.1e-06 0.004441574 + 4e-06 23700 200 6.0839487e-06 2.1e-06 0.0045291188 + 4e-06 23800 200 6.0216029e-06 2.1e-06 0.0046160935 + 4e-06 23900 200 5.896464e-06 2.1e-06 0.0047024871 + 4e-06 24000 200 5.8682556e-06 2.1e-06 0.0047882887 + 4e-06 24100 200 5.8744357e-06 2.1e-06 0.0048734875 + 4e-06 24200 200 5.6172509e-06 2.1e-06 0.0049580728 + 4e-06 24300 200 5.6527872e-06 2.1e-06 0.005042034 + 4e-06 24400 200 5.4706998e-06 2.1e-06 0.0051253604 + 4e-06 24500 200 5.4368713e-06 2.1e-06 0.0052080417 + 4e-06 24600 200 5.3496195e-06 2.1e-06 0.0052900673 + 4e-06 24700 200 5.2020248e-06 2.1e-06 0.0053714269 + 4e-06 24800 200 5.2035809e-06 2.1e-06 0.0054521104 + 4e-06 24900 200 5.0302031e-06 2.1e-06 0.0055321075 + 4e-06 25000 200 5.0094633e-06 2.1e-06 0.0056114082 + 4e-06 25100 200 4.8588064e-06 2.1e-06 0.0056900025 + 4e-06 25200 200 4.8221437e-06 2.1e-06 0.0057678805 + 4e-06 25300 200 4.7117322e-06 2.1e-06 0.0058450324 + 4e-06 25400 200 4.6148719e-06 2.1e-06 0.0059214485 + 4e-06 25500 200 4.5348297e-06 2.1e-06 0.0059971192 + 4e-06 25600 200 4.4325937e-06 2.1e-06 0.0060720349 + 4e-06 25700 200 4.3587865e-06 2.1e-06 0.0061461862 + 4e-06 25800 200 4.2449842e-06 2.1e-06 0.0062195638 + 4e-06 25900 200 4.1730814e-06 2.1e-06 0.0062921585 + 4e-06 26000 200 4.0712085e-06 2.1e-06 0.006363961 + 4e-06 26100 200 3.9603603e-06 2.1e-06 0.0064349624 + 4e-06 26200 200 3.9152641e-06 2.1e-06 0.0065051538 + 4e-06 26300 200 3.7864366e-06 2.1e-06 0.0065745262 + 4e-06 26400 200 3.7211553e-06 2.1e-06 0.006643071 + 4e-06 26500 200 3.6038142e-06 2.1e-06 0.0067107795 + 4e-06 26600 200 3.5518456e-06 2.1e-06 0.0067776432 + 4e-06 26700 200 3.4213616e-06 2.1e-06 0.0068436537 + 4e-06 26800 200 3.348649e-06 2.1e-06 0.0069088027 + 4e-06 26900 200 3.2592054e-06 2.1e-06 0.0069730819 + 4e-06 27000 200 3.1640896e-06 2.1e-06 0.0070364833 + 4e-06 27100 200 3.1491467e-06 2.1e-06 0.007098999 + 4e-06 27200 200 2.9475347e-06 2.1e-06 0.0071606209 + 4e-06 27300 200 2.9234007e-06 2.1e-06 0.0072213415 + 4e-06 27400 200 2.8106832e-06 2.1e-06 0.0072811529 + 4e-06 27500 200 2.7190831e-06 2.1e-06 0.0073400478 + 4e-06 27600 200 2.6595021e-06 2.1e-06 0.0073980187 + 4e-06 27700 200 2.5384163e-06 2.1e-06 0.0074550582 + 4e-06 27800 200 2.4906759e-06 2.1e-06 0.0075111593 + 4e-06 27900 200 2.3760852e-06 2.1e-06 0.0075663148 + 4e-06 28000 200 2.3135864e-06 2.1e-06 0.0076205178 + 4e-06 28100 200 2.206388e-06 2.1e-06 0.0076737615 + 4e-06 28200 200 2.1580755e-06 2.1e-06 0.0077260391 + 4e-06 28300 200 2.0541807e-06 2.1e-06 0.0077773442 + 4e-06 28400 200 1.9879886e-06 2.1e-06 0.0078276702 + 4e-06 28500 200 1.9080731e-06 2.1e-06 0.0078770108 + 4e-06 28600 200 1.8244513e-06 2.1e-06 0.0079253598 + 4e-06 28700 200 1.7612085e-06 2.1e-06 0.0079727111 + 4e-06 28800 200 1.6725418e-06 2.1e-06 0.0080190587 + 4e-06 28900 200 1.6108221e-06 2.1e-06 0.0080643969 + 4e-06 29000 200 1.5315923e-06 2.1e-06 0.0081087198 + 4e-06 29100 200 1.4668177e-06 2.1e-06 0.008152022 + 4e-06 29200 200 1.389947e-06 2.1e-06 0.0081942979 + 4e-06 29300 200 1.3244327e-06 2.1e-06 0.0082355423 + 4e-06 29400 200 1.2613389e-06 2.1e-06 0.00827575 + 4e-06 29500 200 1.189317e-06 2.1e-06 0.0083149158 + 4e-06 29600 200 1.1328651e-06 2.1e-06 0.0083530349 + 4e-06 29700 200 1.0634003e-06 2.1e-06 0.0083901025 + 4e-06 29800 200 1.0089659e-06 2.1e-06 0.0084261138 + 4e-06 29900 200 9.452383e-07 2.1e-06 0.0084610645 + 4e-06 30000 200 8.8857387e-07 2.1e-06 0.00849495 + 4e-06 30100 200 8.3934751e-07 2.1e-06 0.0085277661 + 4e-06 30200 200 7.7404495e-07 2.1e-06 0.0085595086 + 4e-06 30300 200 7.2760888e-07 2.1e-06 0.0085901737 + 4e-06 30400 200 6.7239685e-07 2.1e-06 0.0086197574 + 4e-06 30500 200 6.245416e-07 2.1e-06 0.0086482559 + 4e-06 30600 200 5.7834155e-07 2.1e-06 0.0086756657 + 4e-06 30700 200 5.2814574e-07 2.1e-06 0.0087019834 + 4e-06 30800 200 4.8878902e-07 2.1e-06 0.0087272057 + 4e-06 30900 200 4.4241206e-07 2.1e-06 0.0087513293 + 4e-06 31000 200 4.0442514e-07 2.1e-06 0.0087743512 + 4e-06 31100 200 3.642199e-07 2.1e-06 0.0087962686 + 4e-06 31200 200 3.2738558e-07 2.1e-06 0.0088170786 + 4e-06 31300 200 2.9389397e-07 2.1e-06 0.0088367787 + 4e-06 31400 200 2.5861566e-07 2.1e-06 0.0088553663 + 4e-06 31500 200 2.2934636e-07 2.1e-06 0.0088728392 + 4e-06 31600 200 1.9888494e-07 2.1e-06 0.0088891951 + 4e-06 31700 200 1.7250531e-07 2.1e-06 0.0089044319 + 4e-06 31800 200 1.4678036e-07 2.1e-06 0.0089185479 + 4e-06 31900 200 1.2324632e-07 2.1e-06 0.0089315411 + 4e-06 32000 200 1.0248084e-07 2.1e-06 0.0089434099 + 4e-06 32100 200 8.2609273e-08 2.1e-06 0.0089541529 + 4e-06 32200 200 6.551679e-08 2.1e-06 0.0089637686 + 4e-06 32300 200 5.0080052e-08 2.1e-06 0.008972256 + 4e-06 32400 200 3.6856646e-08 2.1e-06 0.0089796139 + 4e-06 32500 200 2.5648284e-08 2.1e-06 0.0089858413 + 4e-06 32600 200 1.637837e-08 2.1e-06 0.0089909376 + 4e-06 32700 200 9.2578154e-09 2.1e-06 0.008994902 + 4e-06 32800 200 4.0824723e-09 2.1e-06 0.0089977341 + 4e-06 32900 200 1.0371165e-09 2.1e-06 0.0089994335 + 4e-06 33000 200 6.1012168e-14 2.1e-06 0.009 +Loop time of 7.70808 on 1 procs for 14000 steps with 200 atoms + +99.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 4.4414 | 4.4414 | 4.4414 | 0.0 | 57.62 +Neigh | 0.040941 | 0.040941 | 0.040941 | 0.0 | 0.53 +Comm | 0.001526 | 0.001526 | 0.001526 | 0.0 | 0.02 +Output | 0.0019617 | 0.0019617 | 0.0019617 | 0.0 | 0.03 +Modify | 3.2183 | 3.2183 | 3.2183 | 0.0 | 41.75 +Other | | 0.003942 | | | 0.05 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3026 ave 3026 max 3026 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3026 +Ave neighs/atom = 15.13 +Neighbor list builds = 233 +Dangerous builds not checked + +##### FREE FLOAT ##### + +variable disp_lower equal ${dieHeight} +variable disp_lower equal 0.01 +variable disp_upper equal ${dieHeight}*0.9 +variable disp_upper equal 0.01*0.9 +variable max_disp equal ${dieRadius}*0.75 +variable max_disp equal 0.004*0.75 +run ${free_float_steps} +run 5000 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Per MPI rank memory allocation (min/avg/max) = 72.31 | 72.31 | 72.31 Mbytes + Dt Step Atoms KinEng Volume v_disp_upper + 4e-06 33000 200 6.1012168e-14 2.1e-06 0.009 + 4e-06 33100 200 6.7902539e-11 2.1e-06 0.009 + 4e-06 33200 200 2.0896758e-11 2.1e-06 0.009 + 4e-06 33300 200 2.5200405e-11 2.1e-06 0.009 + 4e-06 33400 200 2.1747895e-12 2.1e-06 0.009 + 4e-06 33500 200 1.1228817e-11 2.1e-06 0.009 + 4e-06 33600 200 3.3597579e-12 2.1e-06 0.009 + 4e-06 33700 200 1.4808583e-12 2.1e-06 0.009 + 4e-06 33800 200 3.5132295e-12 2.1e-06 0.009 + 4e-06 33900 200 8.2438639e-14 2.1e-06 0.009 + 4e-06 34000 200 1.3267378e-12 2.1e-06 0.009 + 4e-06 34100 200 6.2365031e-13 2.1e-06 0.009 + 4e-06 34200 200 1.1820072e-13 2.1e-06 0.009 + 4e-06 34300 200 5.2797742e-13 2.1e-06 0.009 + 4e-06 34400 200 3.2199555e-14 2.1e-06 0.009 + 4e-06 34500 200 1.553388e-13 2.1e-06 0.009 + 4e-06 34600 200 1.1458173e-13 2.1e-06 0.009 + 4e-06 34700 200 5.8686124e-15 2.1e-06 0.009 + 4e-06 34800 200 7.3486748e-14 2.1e-06 0.009 + 4e-06 34900 200 1.0877367e-14 2.1e-06 0.009 + 4e-06 35000 200 1.5284442e-14 2.1e-06 0.009 + 4e-06 35100 200 2.0294057e-14 2.1e-06 0.009 + 4e-06 35200 200 1.5385334e-17 2.1e-06 0.009 + 4e-06 35300 200 9.5858898e-15 2.1e-06 0.009 + 4e-06 35400 200 3.1985384e-15 2.1e-06 0.009 + 4e-06 35500 200 1.1327574e-15 2.1e-06 0.009 + 4e-06 35600 200 3.3810722e-15 2.1e-06 0.009 + 4e-06 35700 200 1.2867327e-16 2.1e-06 0.009 + 4e-06 35800 200 1.0755232e-15 2.1e-06 0.009 + 4e-06 35900 200 7.3381985e-16 2.1e-06 0.009 + 4e-06 36000 200 3.7750251e-17 2.1e-06 0.009 + 4e-06 36100 200 4.8518794e-16 2.1e-06 0.009 + 4e-06 36200 200 8.361623e-17 2.1e-06 0.009 + 4e-06 36300 200 8.9347649e-17 2.1e-06 0.009 + 4e-06 36400 200 1.4528409e-16 2.1e-06 0.009 + 4e-06 36500 200 8.2328133e-19 2.1e-06 0.009 + 4e-06 36600 200 5.9628413e-17 2.1e-06 0.009 + 4e-06 36700 200 2.857306e-17 2.1e-06 0.009 + 4e-06 36800 200 4.1078269e-18 2.1e-06 0.009 + 4e-06 36900 200 2.4094514e-17 2.1e-06 0.009 + 4e-06 37000 200 2.6153896e-18 2.1e-06 0.009 + 4e-06 37100 200 5.6577297e-18 2.1e-06 0.009 + 4e-06 37200 200 6.5849416e-18 2.1e-06 0.009 + 4e-06 37300 200 4.5596918e-21 2.1e-06 0.009 + 4e-06 37400 200 3.2329813e-18 2.1e-06 0.009 + 4e-06 37500 200 1.123288e-18 2.1e-06 0.009 + 4e-06 37600 200 3.4227094e-19 2.1e-06 0.009 + 4e-06 37700 200 1.1782135e-18 2.1e-06 0.009 + 4e-06 37800 200 6.9535961e-20 2.1e-06 0.009 + 4e-06 37900 200 3.4055174e-19 2.1e-06 0.009 + 4e-06 38000 200 2.8968649e-19 2.1e-06 0.009 +Loop time of 2.65906 on 1 procs for 5000 steps with 200 atoms + +99.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.5595 | 1.5595 | 1.5595 | 0.0 | 58.65 +Neigh | 0.012904 | 0.012904 | 0.012904 | 0.0 | 0.49 +Comm | 0.00041333 | 0.00041333 | 0.00041333 | 0.0 | 0.02 +Output | 0.00053486 | 0.00053486 | 0.00053486 | 0.0 | 0.02 +Modify | 1.0844 | 1.0844 | 1.0844 | 0.0 | 40.78 +Other | | 0.001336 | | | 0.05 + +Nlocal: 200 ave 200 max 200 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 3026 ave 3026 max 3026 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 3026 +Ave neighs/atom = 15.13 +Neighbor list builds = 83 +Dangerous builds not checked +Total wall time: 0:00:18 diff --git a/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 new file mode 100644 index 0000000000..1992fb2555 --- /dev/null +++ b/examples/granular/log.4Feb25.triaxial.compaction.12.g++.1 @@ -0,0 +1,784 @@ +LAMMPS (4 Feb 2025 - Development - patch_5May2020-22356-g0c29a0a0c9-modified) +############################### SIMULATION SETTINGS ################################################### + +atom_style sphere 1 +atom_modify map array +comm_modify vel yes +units si +newton off +neighbor 2 bin +neigh_modify delay 0 +timestep 1e-6 + +##################### SIMULATION BOUNDING BOX, INSERT PARTICLES, AND INTEGRATION ####################### + +boundary f f f +read_data spheres12.data +Reading data file ... + orthogonal box = (-10 -10 -10) to (10 10 10) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 12 atoms + read_data CPU = 0.029 seconds +fix integr all nve/sphere + +# create pair group for contact area outputs +group particles_1_12 id 1 12 +2 atoms in group particles_1_12 + +########################### PARTICLE MATERIAL PROPERTIES AND FORCE MODEL ############################### + +variable atomRadius equal 0.5 + +pair_style granular + +# mdr = E, nu, Y, gamma, psi_b, damp +variable YoungsModulus equal 1e9 +variable PoissonsRatio equal 0.3 +variable YieldStress equal 50e6 +variable SurfaceEnergy equal 0.0 +variable psi_b equal 0.5 +variable damp equal 0.2 +variable damp_type equal 1 + +# linear_history = k_t, x_gamma,t, mu_s +variable kt equal 2/7*${YoungsModulus}*${atomRadius} +variable kt equal 2/7*1000000000*${atomRadius} +variable kt equal 2/7*1000000000*0.5 +variable xgammat equal 0.0 +variable mu_s equal 0.5 + +pair_coeff * * mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 ${mu_s} +pair_coeff * * mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 + +######################################### ADD IN PLANES ################################################ + +variable boxWidth equal 3 +variable halfBoxWidth equal ${boxWidth}/2 +variable halfBoxWidth equal 3/2 + +variable plane_disp equal 0.0 +variable plane_disp_neg equal 0.0 + +region plane_yz_pos plane ${halfBoxWidth} 0 0 -1 0 0 side in move v_plane_disp_neg NULL NULL units box +region plane_yz_pos plane 1.5 0 0 -1 0 0 side in move v_plane_disp_neg NULL NULL units box +region plane_yz_neg plane -${halfBoxWidth} 0 0 1 0 0 side in move v_plane_disp NULL NULL units box +region plane_yz_neg plane -1.5 0 0 1 0 0 side in move v_plane_disp NULL NULL units box +region plane_xz_pos plane 0 ${halfBoxWidth} 0 0 -1 0 side in move NULL v_plane_disp_neg NULL units box +region plane_xz_pos plane 0 1.5 0 0 -1 0 side in move NULL v_plane_disp_neg NULL units box +region plane_xz_neg plane 0 -${halfBoxWidth} 0 0 1 0 side in move NULL v_plane_disp NULL units box +region plane_xz_neg plane 0 -1.5 0 0 1 0 side in move NULL v_plane_disp NULL units box +region plane_xy_pos plane 0 0 ${halfBoxWidth} 0 0 -1 side in move NULL NULL v_plane_disp_neg units box +region plane_xy_pos plane 0 0 1.5 0 0 -1 side in move NULL NULL v_plane_disp_neg units box +region plane_xy_neg plane 0 0 -${halfBoxWidth} 0 0 1 side in move NULL NULL v_plane_disp units box +region plane_xy_neg plane 0 0 -1.5 0 0 1 side in move NULL NULL v_plane_disp units box + +variable wall_contact_string string "granular mdr ${YoungsModulus} ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} " +granular mdr 1000000000 ${PoissonsRatio} ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 ${YieldStress} ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 ${SurfaceEnergy} ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 ${psi_b} ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 ${damp} damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr ${damp_type} tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history ${kt} ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 ${xgammat} ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 ${mu_s} +granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 + +fix plane_yz_pos all wall/gran/region ${wall_contact_string} region plane_yz_pos contacts +fix plane_yz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_yz_pos contacts +fix plane_yz_neg all wall/gran/region ${wall_contact_string} region plane_yz_neg contacts +fix plane_yz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_yz_neg contacts +fix plane_xz_pos all wall/gran/region ${wall_contact_string} region plane_xz_pos contacts +fix plane_xz_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xz_pos contacts +fix plane_xz_neg all wall/gran/region ${wall_contact_string} region plane_xz_neg contacts +fix plane_xz_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xz_neg contacts +fix plane_xy_pos all wall/gran/region ${wall_contact_string} region plane_xy_pos contacts +fix plane_xy_pos all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xy_pos contacts +fix plane_xy_neg all wall/gran/region ${wall_contact_string} region plane_xy_neg contacts +fix plane_xy_neg all wall/gran/region granular mdr 1000000000 0.3 50000000 0 0.5 0.2 damping mdr 1 tangential linear_history 142857142.857143 0 0.5 region plane_xy_neg contacts + +compute plane_xy_neg_force all reduce sum f_plane_xy_neg[4] +variable plane_xy_neg_force equal c_plane_xy_neg_force + +compute plane_xz_neg_force all reduce sum f_plane_xz_neg[3] +variable plane_xz_neg_force equal c_plane_xz_neg_force + +compute plane_yz_neg_force all reduce sum f_plane_yz_neg[2] +variable plane_yz_neg_force equal c_plane_yz_neg_force + +#fix print1 all print 1 "${plane_disp} ${plane_xy_neg_force} ${plane_xz_neg_force} ${plane_yz_neg_force}" file force_disp_triaxial12.csv screen no + +######################################## SCREEN OUTPUT #################################################### + +compute 1 all erotate/sphere +thermo_style custom dt step atoms ke c_1 vol +thermo 100 +thermo_modify lost ignore norm no + +##################################### DEFINE WALL MOVEMENT ################################################# + +variable disp_max equal 0.499 +variable ddisp equal 0.00001 +variable compression_steps equal round(${disp_max}/${ddisp}) +variable compression_steps equal round(0.499/${ddisp}) +variable compression_steps equal round(0.499/1e-05) +variable output_rate equal round(${compression_steps}/100) +variable output_rate equal round(49900/100) + +##################################### SET UP DUMP OUTPUTS #################################################### + +#dump dumpParticles all custom ${output_rate} triaxial_compaction_12.dump id type mass x y z vx vy vz fx fy fz radius +#dump dmp all vtk ${output_rate} post/triaxial12particles_*.vtk id type mass x y z vx vy vz fx fy fz radius + +#################################### COMPRESS THE PARTICLES ################################################## + +run 0 + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Your simulation uses code contributions which should be cited: + +- MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289 + +@Article{zunker2024mechanicallyI, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part I: Utilizing the method of dimensionality reduction}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105492}, +} + +@Article{zunker2024mechanicallyII, + author = {Zunker, William and Kamrin, Ken}, + title = {A mechanically-derived contact model for adhesive elastic-perfectly plastic particles, + Part II: Contact under high compaction—modeling a bulk elastic response}, + journal = {Journal of the Mechanics and Physics of Solids}, + year = {2024}, + volume = {183}, + pages = {105493}, +} + +@Article{zunker2025experimentally, + author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken}, + title = {Experimentally validated DEM for large deformation powder compaction: + mechanically-derived contact model and screening of non-physical contacts}, + journal = {Powder Technology}, + year = {2025}, + pages = {120972}, +} + +CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE-CITE + +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.2 + ghost atom cutoff = 3.2 + binsize = 1.6, bins = 13 13 13 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 74.54 | 74.54 | 74.54 Mbytes + Dt Step Atoms KinEng c_1 Volume + 1e-06 0 12 0 0 8000 +Loop time of 8.28e-07 on 1 procs for 0 steps with 12 atoms + +0.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 | 0 | 0 | 0 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0 | 0 | 0 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 8.28e-07 | | |100.00 + +Nlocal: 12 ave 12 max 12 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 66 ave 66 max 66 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 66 +Ave neighs/atom = 5.5 +Neighbor list builds = 0 +Dangerous builds = 0 + +# print out contact area evolution for particles 1 and 12 +compute Ac_1_12 particles_1_12 pair/local p13 cutoff radius +compute Ac_1_12_sum particles_1_12 reduce sum c_Ac_1_12 inputs local +variable Ac_1_12 equal c_Ac_1_12_sum +#fix logArea all print 100 "${plane_disp} ${Ac_1_12}" file pair_1_12_contact_area_triaxial12.csv screen no + +variable plane_disp equal ${ddisp}*elapsed +variable plane_disp equal 1e-05*elapsed +variable plane_disp_neg equal -${ddisp}*elapsed +variable plane_disp_neg equal -1e-05*elapsed + +run ${compression_steps} +run 49900 +Generated 0 of 0 mixed pair_coeff terms from geometric mixing rule +Neighbor list info ... + update: every = 1 steps, delay = 0 steps, check = yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.2 + ghost atom cutoff = 3.2 + binsize = 1.6, bins = 13 13 13 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair granular, perpetual + attributes: half, newton off, size, history + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard + (2) compute pair/local, occasional + attributes: half, newton off, size + pair build: half/size/bin/atomonly/newtoff + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 75.17 | 75.17 | 75.17 Mbytes + Dt Step Atoms KinEng c_1 Volume + 1e-06 0 12 0 0 8000 + 1e-06 100 12 0.063728867 0 8000 + 1e-06 200 12 0.79328888 0 8000 + 1e-06 300 12 3.1671095 0 8000 + 1e-06 400 12 8.7248683 0 8000 + 1e-06 500 12 20.158012 0 8000 + 1e-06 600 12 41.157061 0 8000 + 1e-06 700 12 76.628872 0 8000 + 1e-06 800 12 132.88829 0 8000 + 1e-06 900 12 217.80403 0 8000 + 1e-06 1000 12 340.91325 0 8000 + 1e-06 1100 12 513.50254 0 8000 + 1e-06 1200 12 748.65202 0 8000 + 1e-06 1300 12 1061.2394 0 8000 + 1e-06 1400 12 1467.9017 0 8000 + 1e-06 1500 12 1986.9524 0 8000 + 1e-06 1600 12 2638.2542 0 8000 + 1e-06 1700 12 3443.0464 0 8000 + 1e-06 1800 12 4423.728 0 8000 + 1e-06 1900 12 5603.6004 0 8000 + 1e-06 2000 12 7006.5697 0 8000 + 1e-06 2100 12 8656.8153 0 8000 + 1e-06 2200 12 10575.061 0.00041930161 8000 + 1e-06 2300 12 12776.34 0.031472922 8000 + 1e-06 2400 12 15285.834 0.16547279 8000 + 1e-06 2500 12 18123.472 0.48824818 8000 + 1e-06 2600 12 21306.73 1.1172148 8000 + 1e-06 2700 12 24850.635 2.2101203 8000 + 1e-06 2800 12 28767.448 3.9742876 8000 + 1e-06 2900 12 33066.341 6.6765245 8000 + 1e-06 3000 12 37753.104 10.653677 8000 + 1e-06 3100 12 42829.905 16.323673 8000 + 1e-06 3200 12 48295.143 24.196804 8000 + 1e-06 3300 12 54143.784 34.886968 8000 + 1e-06 3400 12 60367.427 49.122473 8000 + 1e-06 3500 12 66954.459 67.756017 8000 + 1e-06 3600 12 73890.367 91.773371 8000 + 1e-06 3700 12 81158.051 122.30029 8000 + 1e-06 3800 12 88738.15 160.60714 8000 + 1e-06 3900 12 96609.374 208.11075 8000 + 1e-06 4000 12 104748.82 266.37305 8000 + 1e-06 4100 12 113132.27 337.09603 8000 + 1e-06 4200 12 121734.46 422.11267 8000 + 1e-06 4300 12 130529.26 523.37361 8000 + 1e-06 4400 12 139489.96 642.8869 8000 + 1e-06 4500 12 148590.48 781.76659 8000 + 1e-06 4600 12 157805.54 939.73777 8000 + 1e-06 4700 12 167102.78 1115.3765 8000 + 1e-06 4800 12 176408.3 1304.8823 8000 + 1e-06 4900 12 185727.22 1506.1791 8000 + 1e-06 5000 12 195037.08 1715.5141 8000 + 1e-06 5100 12 204311.37 1928.3496 8000 + 1e-06 5200 12 213522.05 2139.6607 8000 + 1e-06 5300 12 222640.01 2344.2078 8000 + 1e-06 5400 12 231635.3 2536.8271 8000 + 1e-06 5500 12 240477.26 2712.7272 8000 + 1e-06 5600 12 249036.18 2865.4067 8000 + 1e-06 5700 12 257225.21 2990.2307 8000 + 1e-06 5800 12 265107.22 3088.4777 8000 + 1e-06 5900 12 272662.78 3160.202 8000 + 1e-06 6000 12 279867.43 3206.6334 8000 + 1e-06 6100 12 286696.38 3230.2607 8000 + 1e-06 6200 12 293126.06 3234.7442 8000 + 1e-06 6300 12 299135.09 3224.7366 8000 + 1e-06 6400 12 304704.84 3205.6378 8000 + 1e-06 6500 12 309820.07 3183.3082 8000 + 1e-06 6600 12 314469.34 3163.76 8000 + 1e-06 6700 12 318645.43 3152.8517 8000 + 1e-06 6800 12 322345.74 3156.004 8000 + 1e-06 6900 12 325572.61 3177.9574 8000 + 1e-06 7000 12 328333.69 3222.5849 8000 + 1e-06 7100 12 330642.36 3292.7692 8000 + 1e-06 7200 12 332518.34 3390.3494 8000 + 1e-06 7300 12 333988.86 3516.133 8000 + 1e-06 7400 12 335091.17 3669.9688 8000 + 1e-06 7500 12 335881.45 3850.8676 8000 + 1e-06 7600 12 336541.99 4057.1561 8000 + 1e-06 7700 12 337100.25 4286.6487 8000 + 1e-06 7800 12 337436.07 4536.819 8000 + 1e-06 7900 12 337576.23 4804.9572 8000 + 1e-06 8000 12 337553.74 5088.3001 8000 + 1e-06 8100 12 337412.69 5384.125 8000 + 1e-06 8200 12 337266.12 5689.8034 8000 + 1e-06 8300 12 337141.16 6002.815 8000 + 1e-06 8400 12 336990.23 6320.7444 8000 + 1e-06 8500 12 336832.35 6645.3584 8000 + 1e-06 8600 12 336684.67 6980.6347 8000 + 1e-06 8700 12 336479.86 7317.4769 8000 + 1e-06 8800 12 336286.29 7653.1265 8000 + 1e-06 8900 12 336134.3 7982.859 8000 + 1e-06 9000 12 336043.31 8307.1796 8000 + 1e-06 9100 12 336035 8626.669 8000 + 1e-06 9200 12 336134.55 8942.2162 8000 + 1e-06 9300 12 336370.73 9254.9724 8000 + 1e-06 9400 12 336775.97 9566.1537 8000 + 1e-06 9500 12 337386.26 9876.5005 8000 + 1e-06 9600 12 338238.87 10185.038 8000 + 1e-06 9700 12 339373.93 10490.42 8000 + 1e-06 9800 12 340832.84 10792.816 8000 + 1e-06 9900 12 342649.99 11091.69 8000 + 1e-06 10000 12 344857.32 11386.232 8000 + 1e-06 10100 12 347498.52 11676.525 8000 + 1e-06 10200 12 350625.53 11966.038 8000 + 1e-06 10300 12 354228.27 12250.382 8000 + 1e-06 10400 12 358314.64 12529.915 8000 + 1e-06 10500 12 362887.71 12806.586 8000 + 1e-06 10600 12 367944.26 13083.935 8000 + 1e-06 10700 12 373508.47 13375.901 8000 + 1e-06 10800 12 379544.75 13682.748 8000 + 1e-06 10900 12 385955.58 13992.431 8000 + 1e-06 11000 12 392687 14307.793 8000 + 1e-06 11100 12 399676.01 14631.631 8000 + 1e-06 11200 12 406851.99 14966.316 8000 + 1e-06 11300 12 414139.37 15312.299 8000 + 1e-06 11400 12 421458.35 15668.76 8000 + 1e-06 11500 12 428725.85 16034.567 8000 + 1e-06 11600 12 435860.63 16408.01 8000 + 1e-06 11700 12 442914.03 16784.22 8000 + 1e-06 11800 12 449956.98 17165.7 8000 + 1e-06 11900 12 456943.52 17548.894 8000 + 1e-06 12000 12 463832.6 17927.761 8000 + 1e-06 12100 12 470563.99 18302.718 8000 + 1e-06 12200 12 477048.89 18678.218 8000 + 1e-06 12300 12 483212.97 19059.367 8000 + 1e-06 12400 12 489085.23 19458.596 8000 + 1e-06 12500 12 494661.19 19885.306 8000 + 1e-06 12600 12 499940 20344.66 8000 + 1e-06 12700 12 504927.83 20838.53 8000 + 1e-06 12800 12 509641.24 21366.554 8000 + 1e-06 12900 12 514117.28 21934.019 8000 + 1e-06 13000 12 518378.2 22538.416 8000 + 1e-06 13100 12 522458.77 23167.62 8000 + 1e-06 13200 12 525853.3 23780.032 8000 + 1e-06 13300 12 528815.22 24345.078 8000 + 1e-06 13400 12 531513.34 24883.702 8000 + 1e-06 13500 12 534014.75 25400.482 8000 + 1e-06 13600 12 536357.43 25891.923 8000 + 1e-06 13700 12 538572.95 26355.972 8000 + 1e-06 13800 12 540657.99 26795.836 8000 + 1e-06 13900 12 542612.1 27223.435 8000 + 1e-06 14000 12 544466.84 27647.413 8000 + 1e-06 14100 12 546241.59 28080.229 8000 + 1e-06 14200 12 547953.9 28538.741 8000 + 1e-06 14300 12 549620.46 29043.928 8000 + 1e-06 14400 12 551260.1 29617.65 8000 + 1e-06 14500 12 552886.91 30280.697 8000 + 1e-06 14600 12 554517.93 31050.292 8000 + 1e-06 14700 12 556175.17 31938.659 8000 + 1e-06 14800 12 557897.11 32951.814 8000 + 1e-06 14900 12 559696.65 34092.387 8000 + 1e-06 15000 12 561564.33 35360.561 8000 + 1e-06 15100 12 563512.54 36749.828 8000 + 1e-06 15200 12 565557.63 38246.838 8000 + 1e-06 15300 12 567718.92 39832.256 8000 + 1e-06 15400 12 569910.41 41477.599 8000 + 1e-06 15500 12 572038.38 43132.458 8000 + 1e-06 15600 12 573913.47 44763.446 8000 + 1e-06 15700 12 575651.62 46334.905 8000 + 1e-06 15800 12 577306.75 47812.828 8000 + 1e-06 15900 12 578897.86 49166.374 8000 + 1e-06 16000 12 580431.98 50370.863 8000 + 1e-06 16100 12 581917.67 51410.025 8000 + 1e-06 16200 12 583392.37 52290.363 8000 + 1e-06 16300 12 584896.54 53001.616 8000 + 1e-06 16400 12 586445.21 53535.481 8000 + 1e-06 16500 12 588052.51 53896.917 8000 + 1e-06 16600 12 589732.17 54102.867 8000 + 1e-06 16700 12 591496.83 54180.423 8000 + 1e-06 16800 12 593357.37 54163.728 8000 + 1e-06 16900 12 595249.77 54088.894 8000 + 1e-06 17000 12 597130.72 53987.792 8000 + 1e-06 17100 12 598744.15 53852.584 8000 + 1e-06 17200 12 600057.69 53662.064 8000 + 1e-06 17300 12 601263.08 53505.031 8000 + 1e-06 17400 12 602411.57 53452.104 8000 + 1e-06 17500 12 603541.22 53553.609 8000 + 1e-06 17600 12 604067.01 53875.668 8000 + 1e-06 17700 12 602571.09 54490.575 8000 + 1e-06 17800 12 600292.75 55434.526 8000 + 1e-06 17900 12 597386.86 56736.273 8000 + 1e-06 18000 12 593981.08 58424.745 8000 + 1e-06 18100 12 590178.8 60527.06 8000 + 1e-06 18200 12 586056.65 63073.313 8000 + 1e-06 18300 12 581695.18 66084.237 8000 + 1e-06 18400 12 577195.63 69560.379 8000 + 1e-06 18500 12 572657.32 73490.56 8000 + 1e-06 18600 12 568173.86 77853.568 8000 + 1e-06 18700 12 563830.46 82617.321 8000 + 1e-06 18800 12 559701.49 87738.316 8000 + 1e-06 18900 12 555848.76 93162.955 8000 + 1e-06 19000 12 552088.23 98803.436 8000 + 1e-06 19100 12 548185.32 104427.42 8000 + 1e-06 19200 12 544535.46 110064.18 8000 + 1e-06 19300 12 541228.34 115757.05 8000 + 1e-06 19400 12 538293.89 121467.69 8000 + 1e-06 19500 12 535108.7 127127.41 8000 + 1e-06 19600 12 531413.61 132495.98 8000 + 1e-06 19700 12 527729.51 137678.56 8000 + 1e-06 19800 12 524151.76 142754.02 8000 + 1e-06 19900 12 520715.23 147730.68 8000 + 1e-06 20000 12 517436.17 152621.73 8000 + 1e-06 20100 12 514316.17 157423.95 8000 + 1e-06 20200 12 511400.64 162074.69 8000 + 1e-06 20300 12 508692.38 166497.97 8000 + 1e-06 20400 12 506153.1 170617.84 8000 + 1e-06 20500 12 503717.78 174351.25 8000 + 1e-06 20600 12 501293.63 177615.72 8000 + 1e-06 20700 12 498966.36 180365.82 8000 + 1e-06 20800 12 496760.02 182555.39 8000 + 1e-06 20900 12 494705.8 184132.07 8000 + 1e-06 21000 12 492841.84 185052.2 8000 + 1e-06 21100 12 491215.97 185288.72 8000 + 1e-06 21200 12 489677.84 184786.05 8000 + 1e-06 21300 12 488104.26 183535.77 8000 + 1e-06 21400 12 486394.75 181560.76 8000 + 1e-06 21500 12 484603.38 178874.58 8000 + 1e-06 21600 12 482731.75 175610.89 8000 + 1e-06 21700 12 480707.38 172071.04 8000 + 1e-06 21800 12 478504.9 168244.44 8000 + 1e-06 21900 12 476099.5 164130.08 8000 + 1e-06 22000 12 473401.48 159927.13 8000 + 1e-06 22100 12 470370.26 155762.08 8000 + 1e-06 22200 12 467067.88 151634.35 8000 + 1e-06 22300 12 463485.76 147589.77 8000 + 1e-06 22400 12 459593.94 143696.49 8000 + 1e-06 22500 12 455376.67 140035.23 8000 + 1e-06 22600 12 450819.48 136692.31 8000 + 1e-06 22700 12 445945.91 133704.47 8000 + 1e-06 22800 12 440758.89 131179.35 8000 + 1e-06 22900 12 435302.31 129342.22 8000 + 1e-06 23000 12 429598.98 128282.87 8000 + 1e-06 23100 12 423606.11 127995.47 8000 + 1e-06 23200 12 417364.51 128494.32 8000 + 1e-06 23300 12 410931.48 129772.21 8000 + 1e-06 23400 12 404376.34 131791.95 8000 + 1e-06 23500 12 397794.05 134484.8 8000 + 1e-06 23600 12 390990.06 137778.07 8000 + 1e-06 23700 12 384162.26 141638.59 8000 + 1e-06 23800 12 377636.5 145932.03 8000 + 1e-06 23900 12 371606.04 150514.72 8000 + 1e-06 24000 12 366266.24 155257.47 8000 + 1e-06 24100 12 361786.35 160026.32 8000 + 1e-06 24200 12 358332.56 164701.26 8000 + 1e-06 24300 12 356060.82 169171.06 8000 + 1e-06 24400 12 355078.48 173360.16 8000 + 1e-06 24500 12 355450.93 177217.02 8000 + 1e-06 24600 12 357219.84 180708.91 8000 + 1e-06 24700 12 360415.01 183807.52 8000 + 1e-06 24800 12 365023.77 186489.43 8000 + 1e-06 24900 12 371003.31 188744.64 8000 + 1e-06 25000 12 377719.96 190508.83 8000 + 1e-06 25100 12 385044.02 191723.21 8000 + 1e-06 25200 12 392909.32 192416.99 8000 + 1e-06 25300 12 401135.52 192645.59 8000 + 1e-06 25400 12 409539.24 192477.65 8000 + 1e-06 25500 12 417291.42 191761.92 8000 + 1e-06 25600 12 424737.36 190597.14 8000 + 1e-06 25700 12 431913.53 189106.01 8000 + 1e-06 25800 12 438736.08 187391.23 8000 + 1e-06 25900 12 445137.75 185551.39 8000 + 1e-06 26000 12 451066.87 183681.98 8000 + 1e-06 26100 12 456506.74 181876.3 8000 + 1e-06 26200 12 461444.38 180210.36 8000 + 1e-06 26300 12 465927.86 178746.53 8000 + 1e-06 26400 12 470133.57 177568.71 8000 + 1e-06 26500 12 474134.12 176672.99 8000 + 1e-06 26600 12 477972.05 176033.42 8000 + 1e-06 26700 12 481533.44 175580.73 8000 + 1e-06 26800 12 484262.56 175093.24 8000 + 1e-06 26900 12 486070.74 174178.51 8000 + 1e-06 27000 12 487322.68 173184.75 8000 + 1e-06 27100 12 488010.07 172084.41 8000 + 1e-06 27200 12 488079.27 170808.69 8000 + 1e-06 27300 12 487463.01 169291.88 8000 + 1e-06 27400 12 486083.88 167484.29 8000 + 1e-06 27500 12 483861.52 165357.96 8000 + 1e-06 27600 12 480726.55 162915.35 8000 + 1e-06 27700 12 476628.16 160197.08 8000 + 1e-06 27800 12 471546.66 157277.97 8000 + 1e-06 27900 12 465514.41 154256.68 8000 + 1e-06 28000 12 458577.33 151265.67 8000 + 1e-06 28100 12 450810.58 148472.95 8000 + 1e-06 28200 12 442311.34 146058.64 8000 + 1e-06 28300 12 433200.29 144179.21 8000 + 1e-06 28400 12 423625.66 142953.04 8000 + 1e-06 28500 12 413765.24 142450.35 8000 + 1e-06 28600 12 403817.87 142689.67 8000 + 1e-06 28700 12 393989.03 143646.16 8000 + 1e-06 28800 12 384484.33 145259.76 8000 + 1e-06 28900 12 375502.5 147428.86 8000 + 1e-06 29000 12 367250.91 150041.97 8000 + 1e-06 29100 12 359903.16 153002.45 8000 + 1e-06 29200 12 353678.89 156213.09 8000 + 1e-06 29300 12 348513.14 159524.58 8000 + 1e-06 29400 12 344408.06 162793.23 8000 + 1e-06 29500 12 341354.25 165860.66 8000 + 1e-06 29600 12 339292.66 168560.48 8000 + 1e-06 29700 12 338131.77 170723.76 8000 + 1e-06 29800 12 337633.87 172131.92 8000 + 1e-06 29900 12 337374.11 172433.2 8000 + 1e-06 30000 12 337379.48 171680.35 8000 + 1e-06 30100 12 337530.24 169927.53 8000 + 1e-06 30200 12 337706.33 167168.98 8000 + 1e-06 30300 12 337790.98 163426.76 8000 + 1e-06 30400 12 337697.64 158781.65 8000 + 1e-06 30500 12 337366.76 153367.47 8000 + 1e-06 30600 12 336755.07 147361.71 8000 + 1e-06 30700 12 335854.47 140976.25 8000 + 1e-06 30800 12 334662.2 134438.92 8000 + 1e-06 30900 12 333206.26 127982.95 8000 + 1e-06 31000 12 331464.93 121911.39 8000 + 1e-06 31100 12 329488.62 116351.57 8000 + 1e-06 31200 12 327373.17 111369.57 8000 + 1e-06 31300 12 325228.82 107014.37 8000 + 1e-06 31400 12 323169.4 103330.69 8000 + 1e-06 31500 12 321071.03 100385.5 8000 + 1e-06 31600 12 319031.38 98193.648 8000 + 1e-06 31700 12 317126.27 96712.557 8000 + 1e-06 31800 12 315438.37 95876.196 8000 + 1e-06 31900 12 313815.51 95565.683 8000 + 1e-06 32000 12 312239.38 95585.612 8000 + 1e-06 32100 12 310926.28 95828.27 8000 + 1e-06 32200 12 309948.5 96173.311 8000 + 1e-06 32300 12 309370.35 96442.454 8000 + 1e-06 32400 12 309201.18 96472.304 8000 + 1e-06 32500 12 309383.35 96140.953 8000 + 1e-06 32600 12 309865.73 95349.932 8000 + 1e-06 32700 12 310615.88 94029.061 8000 + 1e-06 32800 12 311624.15 92145.895 8000 + 1e-06 32900 12 312897.69 89717.564 8000 + 1e-06 33000 12 314451.54 86812.433 8000 + 1e-06 33100 12 316227.53 83544.302 8000 + 1e-06 33200 12 318247.7 80051.39 8000 + 1e-06 33300 12 320540.3 76478.862 8000 + 1e-06 33400 12 323095.15 72955.915 8000 + 1e-06 33500 12 325858.6 69576.683 8000 + 1e-06 33600 12 328744.8 66391.967 8000 + 1e-06 33700 12 331653.91 63413.798 8000 + 1e-06 33800 12 334464.83 60630.152 8000 + 1e-06 33900 12 337044.79 58019.718 8000 + 1e-06 34000 12 339236.01 55565.231 8000 + 1e-06 34100 12 340903.65 53265.034 8000 + 1e-06 34200 12 341925.23 51135.512 8000 + 1e-06 34300 12 342206.93 49222.627 8000 + 1e-06 34400 12 341649.35 47586.207 8000 + 1e-06 34500 12 340176.56 46291.105 8000 + 1e-06 34600 12 337667.96 45393.826 8000 + 1e-06 34700 12 333648.9 44922.723 8000 + 1e-06 34800 12 328322.97 44898.764 8000 + 1e-06 34900 12 321776.97 45316.954 8000 + 1e-06 35000 12 314135.31 46151.059 8000 + 1e-06 35100 12 305598.53 47348.476 8000 + 1e-06 35200 12 296352.23 48877.862 8000 + 1e-06 35300 12 286690.37 50727.291 8000 + 1e-06 35400 12 276916.56 52890.03 8000 + 1e-06 35500 12 267324.34 55346.515 8000 + 1e-06 35600 12 258272.27 58117.818 8000 + 1e-06 35700 12 250043.55 61209.498 8000 + 1e-06 35800 12 242858.64 64607.799 8000 + 1e-06 35900 12 236841.89 68268.869 8000 + 1e-06 36000 12 232039.2 72109.967 8000 + 1e-06 36100 12 228474.09 76010.069 8000 + 1e-06 36200 12 226115.66 79808.944 8000 + 1e-06 36300 12 224858.91 83318.088 8000 + 1e-06 36400 12 224574.55 86340.123 8000 + 1e-06 36500 12 225062.39 88691.698 8000 + 1e-06 36600 12 226104.86 90211.829 8000 + 1e-06 36700 12 227493.83 90797.861 8000 + 1e-06 36800 12 229033.4 90446.128 8000 + 1e-06 36900 12 230503.16 89238.368 8000 + 1e-06 37000 12 231859.26 87294.45 8000 + 1e-06 37100 12 233083.51 84767.219 8000 + 1e-06 37200 12 234235.94 81827.155 8000 + 1e-06 37300 12 235402.6 78655.588 8000 + 1e-06 37400 12 236702.37 75432.209 8000 + 1e-06 37500 12 238271.62 72343.239 8000 + 1e-06 37600 12 240191.8 69493.919 8000 + 1e-06 37700 12 242533.8 66949.307 8000 + 1e-06 37800 12 245357.31 64751.161 8000 + 1e-06 37900 12 248707.62 62935.998 8000 + 1e-06 38000 12 252613.72 61551.838 8000 + 1e-06 38100 12 257052.41 60672.572 8000 + 1e-06 38200 12 261959.48 60392.157 8000 + 1e-06 38300 12 267252.31 60809.22 8000 + 1e-06 38400 12 272813.05 62005.004 8000 + 1e-06 38500 12 278498.77 64020.387 8000 + 1e-06 38600 12 284150.51 66835.207 8000 + 1e-06 38700 12 289604.09 70354.609 8000 + 1e-06 38800 12 294696.3 74392.688 8000 + 1e-06 38900 12 299233.72 78587.64 8000 + 1e-06 39000 12 303148.91 82674.175 8000 + 1e-06 39100 12 306708.36 86536.948 8000 + 1e-06 39200 12 309600.62 89862.067 8000 + 1e-06 39300 12 311700.43 92456.711 8000 + 1e-06 39400 12 312846.09 94218.029 8000 + 1e-06 39500 12 312996.55 95123.249 8000 + 1e-06 39600 12 311853.31 95204.167 8000 + 1e-06 39700 12 309573.91 94589.061 8000 + 1e-06 39800 12 306120.98 93445.743 8000 + 1e-06 39900 12 301697.58 91905.478 8000 + 1e-06 40000 12 296465.51 90172.857 8000 + 1e-06 40100 12 290548.45 88402.41 8000 + 1e-06 40200 12 284112.93 86721.642 8000 + 1e-06 40300 12 277419.21 85394.11 8000 + 1e-06 40400 12 270601.67 84327.103 8000 + 1e-06 40500 12 263782.18 83363.209 8000 + 1e-06 40600 12 257075.79 82350.637 8000 + 1e-06 40700 12 250587.81 81169.87 8000 + 1e-06 40800 12 244408.86 79765.108 8000 + 1e-06 40900 12 238613.12 78159.356 8000 + 1e-06 41000 12 233263.11 76444.561 8000 + 1e-06 41100 12 228410.45 74765.108 8000 + 1e-06 41200 12 224097.82 73288.059 8000 + 1e-06 41300 12 220360.61 72170.137 8000 + 1e-06 41400 12 217228.06 71527.798 8000 + 1e-06 41500 12 214724.04 71415.43 8000 + 1e-06 41600 12 212866.32 71815.969 8000 + 1e-06 41700 12 211661 72645.932 8000 + 1e-06 41800 12 211103.8 73762.785 8000 + 1e-06 41900 12 211177.1 74986.705 8000 + 1e-06 42000 12 211607.62 76028.195 8000 + 1e-06 42100 12 212363.62 76700.039 8000 + 1e-06 42200 12 213529.03 76938.547 8000 + 1e-06 42300 12 215008.35 76693.739 8000 + 1e-06 42400 12 216674.6 75984.606 8000 + 1e-06 42500 12 218453.89 74873.786 8000 + 1e-06 42600 12 220270.22 73459.542 8000 + 1e-06 42700 12 222044.1 71860.203 8000 + 1e-06 42800 12 223693.34 70197.611 8000 + 1e-06 42900 12 225131.14 68583.075 8000 + 1e-06 43000 12 226264.5 67108.382 8000 + 1e-06 43100 12 227001.96 65842.14 8000 + 1e-06 43200 12 227259.44 64830.806 8000 + 1e-06 43300 12 226966.5 64102.73 8000 + 1e-06 43400 12 226072.23 63673.107 8000 + 1e-06 43500 12 224550.01 63547.892 8000 + 1e-06 43600 12 222400.27 63725.546 8000 + 1e-06 43700 12 219649.08 64198.122 8000 + 1e-06 43800 12 216345.77 64940.248 8000 + 1e-06 43900 12 212561.67 65898.806 8000 + 1e-06 44000 12 208386.13 66994.934 8000 + 1e-06 44100 12 203921.52 68131.378 8000 + 1e-06 44200 12 199278.14 69204.386 8000 + 1e-06 44300 12 194569.44 70118.481 8000 + 1e-06 44400 12 189909.06 70810.594 8000 + 1e-06 44500 12 185407.95 71268.155 8000 + 1e-06 44600 12 181166.51 71493.826 8000 + 1e-06 44700 12 177276.76 71524.448 8000 + 1e-06 44800 12 173823.45 71423.226 8000 + 1e-06 44900 12 170886.41 71262.132 8000 + 1e-06 45000 12 168528.37 71107.616 8000 + 1e-06 45100 12 166817.96 70991.562 8000 + 1e-06 45200 12 165820.31 70920.666 8000 + 1e-06 45300 12 165574.99 70863.13 8000 + 1e-06 45400 12 166019.37 70710.029 8000 + 1e-06 45500 12 167147.87 70350.412 8000 + 1e-06 45600 12 169082.77 69657.821 8000 + 1e-06 45700 12 171945.43 68520.345 8000 + 1e-06 45800 12 175909.9 66883.643 8000 + 1e-06 45900 12 181195.22 64747.392 8000 + 1e-06 46000 12 188023.1 62178.63 8000 + 1e-06 46100 12 196442.27 59308.946 8000 + 1e-06 46200 12 206276.92 56311.64 8000 + 1e-06 46300 12 217187.2 53375.161 8000 + 1e-06 46400 12 228713.53 50677.575 8000 + 1e-06 46500 12 240278.4 48364.725 8000 + 1e-06 46600 12 251273.01 46535.827 8000 + 1e-06 46700 12 261407.3 45239.704 8000 + 1e-06 46800 12 270264.36 44479.416 8000 + 1e-06 46900 12 277578.87 44223.038 8000 + 1e-06 47000 12 283258 44417.235 8000 + 1e-06 47100 12 287156.44 45000.19 8000 + 1e-06 47200 12 289242.87 45911.176 8000 + 1e-06 47300 12 289597.36 47095.056 8000 + 1e-06 47400 12 288380.97 48501.691 8000 + 1e-06 47500 12 285805.13 50081.427 8000 + 1e-06 47600 12 282130.22 51780.572 8000 + 1e-06 47700 12 277128.82 53385.936 8000 + 1e-06 47800 12 271407.61 54873.773 8000 + 1e-06 47900 12 265556.17 56217.287 8000 + 1e-06 48000 12 260082.32 57338.782 8000 + 1e-06 48100 12 255399.15 58166.789 8000 + 1e-06 48200 12 251785.89 58653.934 8000 + 1e-06 48300 12 249277.86 58789.891 8000 + 1e-06 48400 12 247494.11 58609.44 8000 + 1e-06 48500 12 245660.12 58192.865 8000 + 1e-06 48600 12 242968.44 57656.856 8000 + 1e-06 48700 12 238968.69 57140.878 8000 + 1e-06 48800 12 233565.17 56788.953 8000 + 1e-06 48900 12 227411.99 56720.334 8000 + 1e-06 49000 12 221053.64 57003.014 8000 + 1e-06 49100 12 215153.96 57629.419 8000 + 1e-06 49200 12 210402.16 58574.859 8000 + 1e-06 49300 12 207216.41 59750.238 8000 + 1e-06 49400 12 205860.43 61020.818 8000 + 1e-06 49500 12 206382.26 62237.849 8000 + 1e-06 49600 12 208600.44 63264.958 8000 + 1e-06 49700 12 212280.2 63999.734 8000 + 1e-06 49800 12 217167.6 64388.533 8000 + 1e-06 49900 12 223002.61 64430.977 8000 +Loop time of 0.997677 on 1 procs for 49900 steps with 12 atoms + +99.2% 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.24529 | 0.24529 | 0.24529 | 0.0 | 24.59 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.0019929 | 0.0019929 | 0.0019929 | 0.0 | 0.20 +Output | 0.0024977 | 0.0024977 | 0.0024977 | 0.0 | 0.25 +Modify | 0.74056 | 0.74056 | 0.74056 | 0.0 | 74.23 +Other | | 0.007341 | | | 0.74 + +Nlocal: 12 ave 12 max 12 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 66 ave 66 max 66 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 66 +Ave neighs/atom = 5.5 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/fortran/lammps.f90 b/fortran/lammps.f90 index fdd10167bf..4baff4d03a 100644 --- a/fortran/lammps.f90 +++ b/fortran/lammps.f90 @@ -74,7 +74,9 @@ MODULE LIBLAMMPS LMP_VAR_EQUAL = 0, & ! equal-style variables (and compatible) LMP_VAR_ATOM = 1, & ! atom-style variables LMP_VAR_VECTOR = 2, & ! vector variables - LMP_VAR_STRING = 3 ! string variables (everything else) + LMP_VAR_STRING = 3, & ! string variables (everything else) + LMP_NEIGH_HALF = 0, & ! request (default) half neighbor list + LMP_NEIGH_FULL = 1 ! request full neighbor list ! Constants we set once (in the constructor) and never need to check again INTEGER(c_int), SAVE :: SIZE_TAGINT, SIZE_BIGINT, SIZE_IMAGEINT @@ -195,10 +197,11 @@ MODULE LIBLAMMPS PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig GENERIC :: create_atoms => lmp_create_atoms_int, & lmp_create_atoms_bigbig - PROCEDURE :: find_pair_neighlist => lmp_find_pair_neighlist - PROCEDURE :: find_fix_neighlist => lmp_find_fix_neighlist - PROCEDURE :: find_compute_neighlist => lmp_find_compute_neighlist - PROCEDURE :: neighlist_num_elements => lmp_neighlist_num_elements + PROCEDURE :: find_pair_neighlist => lmp_find_pair_neighlist + PROCEDURE :: find_fix_neighlist => lmp_find_fix_neighlist + PROCEDURE :: find_compute_neighlist => lmp_find_compute_neighlist + PROCEDURE :: request_single_neighlist => lmp_request_single_neighlist + PROCEDURE :: neighlist_num_elements => lmp_neighlist_num_elements PROCEDURE :: neighlist_element_neighbors => lmp_neighlist_element_neighbors PROCEDURE :: version => lmp_version PROCEDURE, NOPASS :: get_os_info => lmp_get_os_info @@ -778,6 +781,15 @@ MODULE LIBLAMMPS INTEGER(c_int) :: lammps_find_compute_neighlist END FUNCTION lammps_find_compute_neighlist + FUNCTION lammps_request_single_neighlist(handle, id, flags, cutoff) BIND(C) + IMPORT :: c_int, c_double, c_ptr + IMPLICIT NONE + TYPE(c_ptr), VALUE :: handle, id + INTEGER(c_int), VALUE :: flags + REAL(c_double), VALUE :: cutoff + INTEGER(c_int) :: lammps_request_single_neighlist + END FUNCTION lammps_request_single_neighlist + FUNCTION lammps_neighlist_num_elements(handle, idx) BIND(C) IMPORT :: c_ptr, c_int TYPE(c_ptr), VALUE :: handle @@ -2942,6 +2954,36 @@ CONTAINS CALL lammps_free(Cid) END FUNCTION lmp_find_compute_neighlist + ! equivalent function to lammps_request_single_neighlist + INTEGER(c_int) FUNCTION lmp_request_single_neighlist(self, id, flags, cutoff) RESULT(idx) + CLASS(lammps), INTENT(IN) :: self + CHARACTER(LEN=*), INTENT(IN) :: id + INTEGER(c_int), INTENT(IN), OPTIONAL :: flags + REAL(c_double), INTENT(IN), OPTIONAL :: cutoff + TYPE(c_ptr) :: Cid + INTEGER(c_int) :: Cflags + REAL(c_double) :: Ccutoff + + IF (PRESENT(flags)) THEN + Cflags = flags + ELSE + Cflags = LMP_NEIGH_HALF + END IF + IF (PRESENT(cutoff)) THEN + Ccutoff = cutoff + ELSE + Ccutoff = 1.0_c_double + END IF + + Cid = f2c_string(id) + idx = lammps_request_single_neighlist(self%handle, Cid, Cflags, Ccutoff) + IF (idx < 0) THEN + CALL lmp_error(self, LMP_ERROR_WARNING + LMP_ERROR_WORLD, & + 'neighbor list build failed [Fortran/request_single_neighlist]') + END IF + CALL lammps_free(Cid) + END FUNCTION lmp_request_single_neighlist + INTEGER(c_int) FUNCTION lmp_neighlist_num_elements(self, idx) RESULT(inum) CLASS(lammps), INTENT(IN) :: self INTEGER(c_int), INTENT(IN) :: idx diff --git a/lib/colvars/Makefile.common b/lib/colvars/Makefile.common index f0282b8caf..9203f9d158 100644 --- a/lib/colvars/Makefile.common +++ b/lib/colvars/Makefile.common @@ -32,6 +32,7 @@ COLVARS_SRCS = \ colvarbias_histogram_reweight_amd.cpp \ colvarbias_meta.cpp \ colvarbias_restraint.cpp \ + colvarbias_opes.cpp \ colvarcomp_alchlambda.cpp \ colvarcomp_angles.cpp \ colvarcomp_apath.cpp \ @@ -40,6 +41,7 @@ COLVARS_SRCS = \ colvarcomp_distances.cpp \ colvarcomp_gpath.cpp \ colvarcomp_neuralnetwork.cpp \ + colvarcomp_torchann.cpp \ colvarcomp_combination.cpp \ colvarcomp_protein.cpp \ colvarcomp_rotations.cpp \ diff --git a/lib/colvars/Makefile.deps b/lib/colvars/Makefile.deps index 61f0b1a335..82d36e53c4 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -52,6 +52,12 @@ $(COLVARS_OBJ_DIR)colvarbias_restraint.o: colvarbias_restraint.cpp \ colvarproxy_tcl.h colvarproxy_volmaps.h colvarvalue.h \ colvarbias_restraint.h colvarbias.h colvar.h colvarparse.h \ colvarparams.h colvardeps.h +$(COLVARS_OBJ_DIR)colvarbias_opes.o: colvarbias_opes.cpp \ + colvarmodule.h colvars_version.h colvarproxy.h colvartypes.h \ + ../../src/math_eigen_impl.h colvarproxy_io.h colvarproxy_system.h \ + colvarproxy_tcl.h colvarproxy_volmaps.h colvarvalue.h \ + colvarbias_opes.h colvarbias.h colvar.h colvarparse.h \ + colvarparams.h colvardeps.h $(COLVARS_OBJ_DIR)colvarcomp_alchlambda.o: colvarcomp_alchlambda.cpp \ colvarmodule.h colvars_version.h colvarvalue.h colvartypes.h \ ../../src/math_eigen_impl.h colvar.h colvarparse.h colvarparams.h \ @@ -101,6 +107,11 @@ $(COLVARS_OBJ_DIR)colvarcomp_neuralnetwork.o: \ colvarproxy.h colvarproxy_io.h colvarproxy_system.h colvarproxy_tcl.h \ colvarproxy_volmaps.h colvar_geometricpath.h \ colvar_neuralnetworkcompute.h +$(COLVARS_OBJ_DIR)colvarcomp_torchann.o: \ + colvarcomp_torchann.cpp colvarmodule.h colvars_version.h \ + colvarvalue.h colvartypes.h colvarparse.h colvarparams.h colvar.h \ + colvardeps.h colvarcomp.h colvarcomp_torchann.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ + colvarproxy_system.h colvarproxy_tcl.h $(COLVARS_OBJ_DIR)colvarcomp_combination.o: colvarcomp_combination.cpp \ colvarcomp.h colvarmodule.h colvars_version.h colvaratoms.h \ colvarproxy.h colvartypes.h ../../src/math_eigen_impl.h colvarproxy_io.h \ @@ -127,7 +138,7 @@ $(COLVARS_OBJ_DIR)colvarcomp_volmaps.o: colvarcomp_volmaps.cpp \ colvar_geometricpath.h $(COLVARS_OBJ_DIR)colvar.o: colvar.cpp colvarmodule.h colvars_version.h \ colvarvalue.h colvartypes.h ../../src/math_eigen_impl.h colvarparse.h \ - colvarparams.h colvarcomp.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ + colvarparams.h colvarcomp.h colvarcomp_torchann.h colvaratoms.h colvarproxy.h colvarproxy_io.h \ colvarproxy_system.h colvarproxy_tcl.h colvarproxy_volmaps.h \ colvardeps.h colvar.h colvar_geometricpath.h colvarbias.h \ colvars_memstream.h @@ -152,7 +163,8 @@ $(COLVARS_OBJ_DIR)colvarmodule.o: colvarmodule.cpp colvarmodule.h \ colvarbias_histogram_reweight_amd.h colvarbias_meta.h colvarscript.h \ colvarscript_commands.h colvarscript_commands_colvar.h \ colvarscript_commands_bias.h colvaratoms.h colvarcomp.h \ - colvar_geometricpath.h colvars_memstream.h colvarmodule_refs.h + colvar_geometricpath.h colvars_memstream.h colvarmodule_refs.h \ + colvarbias_opes.h $(COLVARS_OBJ_DIR)colvarparams.o: colvarparams.cpp colvarmodule.h \ colvars_version.h colvarvalue.h colvartypes.h \ ../../src/math_eigen_impl.h colvarparams.h diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index 58eb87fd0e..136aa2afd5 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -21,6 +21,7 @@ #include "colvarbias.h" #include "colvars_memstream.h" +#include "colvarcomp_torchann.h" std::map> colvar::global_cvc_map = std::map>(); @@ -95,6 +96,12 @@ int colvar::init(std::string const &conf) if (error_code != COLVARS_OK) { return cvm::get_error(); } +#else + if (key_lookup(conf, "customFunction")) { + return cvm::error( + "Error: customFunction keyword is used, but the Lepton library is not available.\n", + COLVARS_NOT_IMPLEMENTED); + } #endif // Setup colvar as scripted function of components @@ -175,12 +182,6 @@ int colvar::init(std::string const &conf) set_enabled(f_cv_scalar, (value().type() == colvarvalue::type_scalar)); - // If using scripted biases, any colvar may receive bias forces - // and will need its gradient - if (cvm::scripted_forces()) { - enable(f_cv_gradient); - } - // check for linear combinations { bool lin = !(is_enabled(f_cv_scripted) || is_enabled(f_cv_custom_function)); @@ -311,9 +312,27 @@ int colvar::init(std::string const &conf) // Detect if we have a single component that is an alchemical lambda if (is_enabled(f_cv_single_cvc) && cvcs[0]->function_type() == "alchLambda") { enable(f_cv_external); + + static_cast(cvcs[0].get())->init_alchemy(time_step_factor); + } + + // If using scripted biases, any colvar may receive bias forces + if (cvm::scripted_forces()) { + enable(f_cv_apply_force); } error_code |= init_extended_Lagrangian(conf); + + // when total atomic forces are obtained from the previous time step, + // we cannot (currently) have colvar values and projected total forces for the same timestep + // (that would require anticipating the total force request by one timestep) + // i.e. the combination of f_cv_total_force_calc and f_cv_multiple_ts requires f_cv_total_force_current_step + // Because f_cv_total_force_current_step is static, we can hard-code this, once other features are set + // that is f_cv_external and f_cv_extended_Lagrangian + if (!is_enabled(f_cv_total_force_current_step)) { + exclude_feature_self(f_cv_multiple_ts, f_cv_total_force_calc); + } + error_code |= init_output_flags(conf); // Now that the children are defined we can solve dependencies @@ -495,8 +514,6 @@ int colvar::init_grid_parameters(std::string const &conf) { int error_code = COLVARS_OK; - colvarmodule *cv = cvm::main(); - cvm::real default_width = width; if (!key_already_set("width")) { @@ -522,34 +539,68 @@ int colvar::init_grid_parameters(std::string const &conf) if (is_enabled(f_cv_scalar)) { - if (is_enabled(f_cv_single_cvc)) { - // Get the default boundaries from the component + // Record the CVC's intrinsic boundaries, and set them as default values for the user's choice + colvarvalue cvc_lower_boundary, cvc_upper_boundary; + + if (is_enabled(f_cv_single_cvc)) { // Get the intrinsic boundaries of the CVC + if (cvcs[0]->is_enabled(f_cvc_lower_boundary)) { enable(f_cv_lower_boundary); enable(f_cv_hard_lower_boundary); - lower_boundary = + lower_boundary = cvc_lower_boundary = *(reinterpret_cast(cvcs[0]->get_param_ptr("lowerBoundary"))); } + if (cvcs[0]->is_enabled(f_cvc_upper_boundary)) { enable(f_cv_upper_boundary); enable(f_cv_hard_upper_boundary); - upper_boundary = - *(reinterpret_cast(cvcs[0]->get_param_ptr("upperBoundary"))); + upper_boundary = cvc_upper_boundary = + *(reinterpret_cast(cvcs[0]->get_param_ptr("upperBoundary"))); } } if (get_keyval(conf, "lowerBoundary", lower_boundary, lower_boundary)) { enable(f_cv_lower_boundary); - // Because this is the user's choice, we cannot assume it is a true - // physical boundary - disable(f_cv_hard_lower_boundary); + if (is_enabled(f_cv_single_cvc) && is_enabled(f_cv_hard_lower_boundary)) { + if (cvm::sqrt(dist2(lower_boundary, cvc_lower_boundary))/width > colvar_boundaries_tol) { + // The user choice is different from the CVC's default + disable(f_cv_hard_lower_boundary); + } + } } if (get_keyval(conf, "upperBoundary", upper_boundary, upper_boundary)) { enable(f_cv_upper_boundary); - disable(f_cv_hard_upper_boundary); + if (is_enabled(f_cv_single_cvc) && is_enabled(f_cv_hard_upper_boundary)) { + if (cvm::sqrt(dist2(upper_boundary, cvc_upper_boundary))/width > colvar_boundaries_tol) { + disable(f_cv_hard_upper_boundary); + } + } } + get_keyval_feature(this, conf, "hardLowerBoundary", f_cv_hard_lower_boundary, + is_enabled(f_cv_hard_lower_boundary)); + + get_keyval_feature(this, conf, "hardUpperBoundary", f_cv_hard_upper_boundary, + is_enabled(f_cv_hard_upper_boundary)); + + get_keyval(conf, "expandBoundaries", expand_boundaries, expand_boundaries); + + error_code |= parse_legacy_wall_params(conf); + error_code |= check_grid_parameters(); + } + + return error_code; +} + + +int colvar::parse_legacy_wall_params(std::string const &conf) +{ + int error_code = COLVARS_OK; + colvarmodule *cv = cvm::main(); + + if (is_enabled(f_cv_scalar)) { + // Parse legacy wall options and set up a harmonicWalls bias if needed cvm::real lower_wall_k = 0.0, upper_wall_k = 0.0; cvm::real lower_wall = 0.0, upper_wall = 0.0; @@ -603,13 +654,14 @@ harmonicWalls {\n\ } } - get_keyval_feature(this, conf, "hardLowerBoundary", f_cv_hard_lower_boundary, - is_enabled(f_cv_hard_lower_boundary)); + return error_code; +} - get_keyval_feature(this, conf, "hardUpperBoundary", f_cv_hard_upper_boundary, - is_enabled(f_cv_hard_upper_boundary)); - // consistency checks for boundaries and walls +int colvar::check_grid_parameters() +{ + int error_code = COLVARS_OK; + if (is_enabled(f_cv_lower_boundary) && is_enabled(f_cv_upper_boundary)) { if (lower_boundary >= upper_boundary) { error_code |= cvm::error("Error: the upper boundary, "+ @@ -620,7 +672,6 @@ harmonicWalls {\n\ } } - get_keyval(conf, "expandBoundaries", expand_boundaries, expand_boundaries); if (expand_boundaries && periodic_boundaries()) { error_code |= cvm::error("Error: trying to expand boundaries that already " "cover a whole period of a periodic colvar.\n", @@ -654,14 +705,15 @@ int colvar::init_extended_Lagrangian(std::string const &conf) x_ext.type(colvarvalue::type_notset); v_ext.type(value()); fr.type(value()); - const bool temp_provided = get_keyval(conf, "extendedTemp", temp, - proxy->target_temperature()); + const bool temp_provided = get_keyval(conf, "extendedTemp", temp, proxy->target_temperature()); if (is_enabled(f_cv_external)) { - // In the case of an "external" coordinate, there is no coupling potential: + // In the case of a driven external parameter in the back-end, there is no coupling potential: // only the fictitious mass is meaningful get_keyval(conf, "extendedMass", ext_mass); // Ensure that the computed restraint energy term is zero ext_force_k = 0.0; + // Then we need forces from the back-end + enable(f_cv_total_force_calc); } else { // Standard case of coupling to a geometric colvar if (temp <= 0.0) { // Then a finite temperature is required @@ -779,6 +831,7 @@ int colvar::init_components_type(const std::string& conf, const char* def_config &def_conf, &pos) ) { + cvm::increase_depth(); cvm::log("Initializing " "a new \""+std::string(def_config_key)+"\" component"+ (cvm::debug() ? ", with configuration:\n"+def_conf @@ -791,7 +844,6 @@ int colvar::init_components_type(const std::string& conf, const char* def_config } cvcs.push_back(std::shared_ptr(cvcp)); - cvm::increase_depth(); int error_code_this = cvcp->init(def_conf); if (error_code_this == COLVARS_OK) { // Checking for invalid keywords only if the parsing was successful, otherwise any @@ -851,12 +903,8 @@ void colvar::define_component_types() add_component_type("dipole angle", "dipoleAngle"); add_component_type("dihedral", "dihedral"); add_component_type("hydrogen bond", "hBond"); - - if (proxy->check_atom_name_selections_available() == COLVARS_OK) { - add_component_type("alpha helix", "alpha"); - add_component_type("dihedral principal component", "dihedralPC"); - } - + add_component_type("alpha helix", "alpha"); + add_component_type("dihedral principal component", "dihedralPC"); add_component_type("orientation", "orientation"); add_component_type("orientation angle", "orientationAngle"); add_component_type("orientation projection", "orientationProj"); @@ -888,6 +936,8 @@ void colvar::define_component_types() add_component_type("neural network CV for other CVs", "neuralNetwork"); + add_component_type("CV defined by PyTorch artifical neural network models", "torchANN"); + if (proxy->check_volmaps_available() == COLVARS_OK) { add_component_type("total value of atomic map", "mapTotal"); } @@ -1098,6 +1148,9 @@ int colvar::init_dependencies() { init_feature(f_cv_gradient, "gradient", f_type_dynamic); require_feature_children(f_cv_gradient, f_cvc_gradient); + init_feature(f_cv_apply_force, "apply_force", f_type_dynamic); + require_feature_alt(f_cv_apply_force, f_cv_gradient, f_cv_external); + init_feature(f_cv_collect_gradient, "collect_gradient", f_type_dynamic); require_feature_self(f_cv_collect_gradient, f_cv_gradient); require_feature_self(f_cv_collect_gradient, f_cv_scalar); @@ -1116,6 +1169,10 @@ int colvar::init_dependencies() { init_feature(f_cv_total_force, "total_force", f_type_dynamic); require_feature_alt(f_cv_total_force, f_cv_extended_Lagrangian, f_cv_total_force_calc); + // If this is active, the total force reported to biases (ABF / TI) is from the current step + // therefore it does not include Colvars biases -> it is a "system force" + init_feature(f_cv_total_force_current_step, "total_force_current_step", f_type_dynamic); + // Deps for explicit total force calculation init_feature(f_cv_total_force_calc, "total_force_calculation", f_type_dynamic); require_feature_self(f_cv_total_force_calc, f_cv_scalar); @@ -1134,13 +1191,15 @@ int colvar::init_dependencies() { init_feature(f_cv_extended_Lagrangian, "extended_Lagrangian", f_type_user); require_feature_self(f_cv_extended_Lagrangian, f_cv_scalar); - require_feature_self(f_cv_extended_Lagrangian, f_cv_gradient); + require_feature_self(f_cv_extended_Lagrangian, f_cv_apply_force); 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); + init_feature(f_cv_external, "external_parameter", f_type_static); require_feature_self(f_cv_external, f_cv_single_cvc); + // External parameters always report the total force for current step + require_feature_self(f_cv_external, f_cv_total_force_current_step); init_feature(f_cv_single_cvc, "single_component", f_type_static); @@ -1201,10 +1260,7 @@ int colvar::init_dependencies() { init_feature(f_cv_linear, "linear", f_type_static); init_feature(f_cv_homogeneous, "homogeneous", f_type_static); - // because total forces are obtained from the previous time step, - // we cannot (currently) have colvar values and total forces for the same timestep init_feature(f_cv_multiple_ts, "multiple_timestep", f_type_static); - exclude_feature_self(f_cv_multiple_ts, f_cv_total_force_calc); // check that everything is initialized for (i = 0; i < colvardeps::f_cv_ntot; i++) { @@ -1225,6 +1281,10 @@ int colvar::init_dependencies() { feature_states[f_cv_fdiff_velocity].available = cvm::main()->proxy->simulation_running(); + // Some back-ends report current total forces for all colvars + if (cvm::main()->proxy->total_forces_same_step()) + enable(f_cv_total_force_current_step); + return COLVARS_OK; } @@ -1351,7 +1411,6 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) cvm::log("Calculating colvar \""+this->name+"\", components "+ cvm::to_str(first_cvc)+" through "+cvm::to_str(first_cvc+num_cvcs)+".\n"); - colvarproxy *proxy = cvm::main()->proxy; int error_code = COLVARS_OK; error_code |= check_cvc_range(first_cvc, num_cvcs); @@ -1359,7 +1418,7 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) return error_code; } - if ((cvm::step_relative() > 0) && (!proxy->total_forces_same_step())){ + if ((cvm::step_relative() > 0) && (!is_enabled(f_cv_total_force_current_step))){ // Use Jacobian derivative from previous timestep error_code |= calc_cvc_total_force(first_cvc, num_cvcs); } @@ -1367,7 +1426,7 @@ int colvar::calc_cvcs(int first_cvc, size_t num_cvcs) error_code |= calc_cvc_values(first_cvc, num_cvcs); error_code |= calc_cvc_gradients(first_cvc, num_cvcs); error_code |= calc_cvc_Jacobians(first_cvc, num_cvcs); - if (proxy->total_forces_same_step()){ + if (is_enabled(f_cv_total_force_current_step)){ // Use Jacobian derivative from this timestep error_code |= calc_cvc_total_force(first_cvc, num_cvcs); } @@ -1384,10 +1443,9 @@ int colvar::collect_cvc_data() if (cvm::debug()) cvm::log("Calculating colvar \""+this->name+"\"'s properties.\n"); - colvarproxy *proxy = cvm::main()->proxy; int error_code = COLVARS_OK; - if ((cvm::step_relative() > 0) && (!proxy->total_forces_same_step())){ + if ((cvm::step_relative() > 0) && (!is_enabled(f_cv_total_force_current_step))){ // Total force depends on Jacobian derivative from previous timestep // collect_cvc_total_forces() uses the previous value of jd error_code |= collect_cvc_total_forces(); @@ -1395,7 +1453,7 @@ int colvar::collect_cvc_data() error_code |= collect_cvc_values(); error_code |= collect_cvc_gradients(); error_code |= collect_cvc_Jacobians(); - if (proxy->total_forces_same_step()){ + if (is_enabled(f_cv_total_force_current_step)){ // Use Jacobian derivative from this timestep error_code |= collect_cvc_total_forces(); } @@ -1609,22 +1667,20 @@ int colvar::collect_cvc_total_forces() if (is_enabled(f_cv_total_force_calc)) { ft.reset(); - if (cvm::step_relative() > 0) { - // get from the cvcs the total forces from the PREVIOUS step - for (size_t i = 0; i < cvcs.size(); i++) { - if (!cvcs[i]->is_enabled()) continue; - if (cvm::debug()) - cvm::log("Colvar component no. "+cvm::to_str(i+1)+ - " within colvar \""+this->name+"\" has total force "+ - cvm::to_str((cvcs[i])->total_force(), - cvm::cv_width, cvm::cv_prec)+".\n"); - // linear combination is assumed - ft += (cvcs[i])->total_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; - } + for (size_t i = 0; i < cvcs.size(); i++) { + if (!cvcs[i]->is_enabled()) continue; + if (cvm::debug()) + cvm::log("Colvar component no. "+cvm::to_str(i+1)+ + " within colvar \""+this->name+"\" has total force "+ + cvm::to_str((cvcs[i])->total_force(), + cvm::cv_width, cvm::cv_prec)+".\n"); + // linear combination is assumed + ft += (cvcs[i])->total_force() * (cvcs[i])->sup_coeff / active_cvc_square_norm; } 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 + // This is by far the most common case + // 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 @@ -1632,6 +1688,10 @@ int colvar::collect_cvc_total_forces() } } + if (is_enabled(f_cv_total_force_current_step)) { + // Report total force value without waiting for calc_colvar_properties() + ft_reported = ft; + } return COLVARS_OK; } @@ -1733,12 +1793,15 @@ int colvar::calc_colvar_properties() // But we report values at the beginning of the timestep (value at t=0 on the first timestep) x_reported = x_ext; v_reported = v_ext; - // the "total force" with the extended Lagrangian is - // calculated in update_forces_energy() below + // the "total force" for the extended Lagrangian is calculated in update_forces_energy() below + // A future improvement could compute a "system force" here, borrowing a part of update_extended_Lagrangian() + // this would change the behavior of eABF with respect to other biases + // by enabling f_cv_total_force_current_step, and reducing the total force to a system force + // giving the behavior of f_cv_subtract_applied_force - this is correct for WTM-eABF etc. } else { - if (is_enabled(f_cv_subtract_applied_force)) { + if (is_enabled(f_cv_subtract_applied_force) && !cvm::proxy->total_forces_same_step()) { // correct the total force only if it has been measured // TODO add a specific test instead of relying on sq norm if (ft.norm2() > 0.0) { @@ -1825,7 +1888,8 @@ void colvar::update_extended_Lagrangian() // Integrate with slow timestep (if time_step_factor != 1) cvm::real dt = cvm::dt() * cvm::real(time_step_factor); - colvarvalue f_ext(fr.type()); // force acting on the extended variable + // Force acting on the extended variable + colvarvalue f_ext(fr.type()); f_ext.reset(); if (is_enabled(f_cv_external)) { @@ -1834,13 +1898,13 @@ void colvar::update_extended_Lagrangian() f += fb_actual; } - // fr: bias force on extended variable (without harmonic spring), for output in trajectory - fr = f; - // External force has been scaled for an inner-timestep impulse (for the back-end integrator) // here we scale it back because this integrator uses only the outer (long) timestep f_ext = f / cvm::real(time_step_factor); + // fr: bias force on extended variable (without harmonic spring), for output in trajectory + fr = f_ext; + colvarvalue f_system(fr.type()); // force exterted by the system on the extended DOF if (is_enabled(f_cv_external)) { @@ -1863,14 +1927,18 @@ void colvar::update_extended_Lagrangian() } 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 (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 - ft_reported = f_ext; + if ( ! is_enabled(f_cv_total_force_current_step)) { + if (is_enabled(f_cv_subtract_applied_force)) { + // Report a "system" force without the biases on this colvar + // 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 + ft_reported = f_ext; + } + // Since biases have already been updated, this ft_reported will only be + // communicated to biases at the next timestep } // backup in case we need to revert this integration timestep @@ -2184,12 +2252,10 @@ int colvar::set_cvc_param(std::string const ¶m_name, void const *new_value) bool colvar::periodic_boundaries(colvarvalue const &lb, colvarvalue const &ub) const { if (period > 0.0) { - if ( ((cvm::sqrt(this->dist2(lb, ub))) / this->width) - < 1.0E-10 ) { + if (((cvm::sqrt(this->dist2(lb, ub))) / this->width) < colvar_boundaries_tol) { return true; } } - return false; } @@ -2347,6 +2413,11 @@ int colvar::set_state_params(std::string const &conf) cvm::to_str(x)+"\n"); x_restart = x; after_restart = true; + // Externally driven cv (e.g. alchemical lambda) is imposed by restart value + if (is_enabled(f_cv_external) && is_enabled(f_cv_extended_Lagrangian)) { + // Request immediate sync of driven parameter to back-end code + cvcs[0]->set_value(x, true); + } } if (is_enabled(f_cv_extended_Lagrangian)) { @@ -2489,8 +2560,14 @@ std::string const colvar::get_state_params() const os << " name " << name << "\n" << " x " << std::setprecision(cvm::cv_prec) - << std::setw(cvm::cv_width) - << x << "\n"; + << std::setw(cvm::cv_width); + if (is_enabled(f_cv_external) && is_enabled(f_cv_extended_Lagrangian)) { + // For an external colvar, x is one timestep in the future after integration + // write x at beginning of timestep + os << x_reported << "\n"; + } else { + os << x << "\n"; + } if (is_enabled(f_cv_output_velocity)) { os << " v " diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index 443e1e4bdd..1db313f416 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -263,6 +263,12 @@ public: /// Init defaults for grid options int init_grid_parameters(std::string const &conf); + /// Consistency check for the grid paramaters + int check_grid_parameters(); + + /// Read legacy wall keyword (these are biases now) + int parse_legacy_wall_params(std::string const &conf); + /// Init extended Lagrangian parameters int init_extended_Lagrangian(std::string const &conf); @@ -633,6 +639,7 @@ public: class euler_psi; class euler_theta; class neuralNetwork; + class torchANN; class customColvar; // non-scalar components @@ -753,7 +760,7 @@ inline colvarvalue const & colvar::total_force() const inline void colvar::add_bias_force(colvarvalue const &force) { - check_enabled(f_cv_gradient, + check_enabled(f_cv_apply_force, std::string("applying a force to the variable \""+name+"\"")); if (cvm::debug()) { cvm::log("Adding biasing force "+cvm::to_str(force)+" to colvar \""+name+"\".\n"); @@ -778,4 +785,10 @@ inline void colvar::reset_bias_force() { fb_actual.reset(); } + +namespace { + // Tolerance parameter to decide when two boundaries coincide + constexpr cvm::real colvar_boundaries_tol = 1.0e-10; +} + #endif diff --git a/lib/colvars/colvar_rotation_derivative.h b/lib/colvars/colvar_rotation_derivative.h index 50f4f1aa97..ceaf728c36 100644 --- a/lib/colvars/colvar_rotation_derivative.h +++ b/lib/colvars/colvar_rotation_derivative.h @@ -5,11 +5,21 @@ #include #include +#ifndef _noalias +#if defined(__INTEL_COMPILER) || (defined(__PGI) && !defined(__NVCOMPILER)) +#define _noalias restrict +#elif defined(__GNUC__) || defined(__INTEL_LLVM_COMPILER) || defined(__NVCOMPILER) +#define _noalias __restrict +#else +#define _noalias +#endif +#endif + /// \brief Helper function for loading the ia-th atom in the vector pos to x, y and z (C++11 SFINAE is used) template ::value, bool>::type = true> inline void read_atom_coord( size_t ia, const std::vector& pos, - cvm::real* x, cvm::real* y, cvm::real* z) { + cvm::real* _noalias x, cvm::real* _noalias y, cvm::real* _noalias z) { *x = pos[ia].x; *y = pos[ia].y; *z = pos[ia].z; @@ -18,7 +28,7 @@ inline void read_atom_coord( template ::value, bool>::type = true> inline void read_atom_coord( size_t ia, const std::vector& pos, - cvm::real* x, cvm::real* y, cvm::real* z) { + cvm::real* _noalias x, cvm::real* _noalias y, cvm::real* _noalias z) { *x = pos[ia].pos.x; *y = pos[ia].pos.y; *z = pos[ia].pos.z; @@ -26,9 +36,9 @@ inline void read_atom_coord( /// \brief Helper enum class for specifying options in rotation_derivative::prepare_derivative enum class rotation_derivative_dldq { - /// Require the derivative of the leading eigenvalue with respect to the atom coordinats + /// Require the derivative of the leading eigenvalue with respect to the atom coordinates use_dl = 1 << 0, - /// Require the derivative of the leading eigenvector with respect to the atom coordinats + /// Require the derivative of the leading eigenvector with respect to the atom coordinates use_dq = 1 << 1 }; @@ -327,12 +337,13 @@ struct rotation_derivative { * @param[out] dq0_out The output of derivative of Q * @param[out] ds_out The output of derivative of overlap matrix S */ + template void calc_derivative_impl( const cvm::rvector (&ds)[4][4], - cvm::rvector* const dl0_out, - cvm::vector1d* const dq0_out, - cvm::matrix2d* const ds_out) const { - if (ds_out != nullptr) { + cvm::rvector* _noalias const dl0_out, + cvm::vector1d* _noalias const dq0_out, + cvm::matrix2d* _noalias const ds_out) const { + if (use_ds) { // this code path is for debug_gradients, so not necessary to unroll the loop *ds_out = cvm::matrix2d(4, 4); for (int i = 0; i < 4; ++i) { @@ -341,7 +352,7 @@ struct rotation_derivative { } } } - if (dl0_out != nullptr) { + if (use_dl) { /* manually loop unrolling of the following loop: dl0_1.reset(); for (size_t i = 0; i < 4; i++) { @@ -367,7 +378,7 @@ struct rotation_derivative { tmp_Q0Q0[3][2] * ds[3][2] + tmp_Q0Q0[3][3] * ds[3][3]; } - if (dq0_out != nullptr) { + if (use_dq) { // we can skip this check if a fixed-size array is used if (dq0_out->size() != 4) dq0_out->resize(4); /* manually loop unrolling of the following loop: @@ -462,32 +473,21 @@ struct rotation_derivative { * @param[out] ds_1_out The output of derivative of overlap matrix S with * respect to ia-th atom of group 1 */ + template void calc_derivative_wrt_group1( - size_t ia, cvm::rvector* const dl0_1_out = nullptr, - cvm::vector1d* const dq0_1_out = nullptr, - cvm::matrix2d* const ds_1_out = nullptr) const { - if (dl0_1_out == nullptr && dq0_1_out == nullptr) return; + size_t ia, cvm::rvector* _noalias const dl0_1_out = nullptr, + cvm::vector1d* _noalias const dq0_1_out = nullptr, + cvm::matrix2d* _noalias const ds_1_out = nullptr) const { + // if (dl0_1_out == nullptr && dq0_1_out == nullptr) return; cvm::real a2x, a2y, a2z; // we can get rid of the helper function read_atom_coord if C++17 (constexpr) is available read_atom_coord(ia, m_pos2, &a2x, &a2y, &a2z); - cvm::rvector ds_1[4][4]; - ds_1[0][0].set( a2x, a2y, a2z); - ds_1[1][0].set( 0.0, a2z, -a2y); - ds_1[0][1] = ds_1[1][0]; - ds_1[2][0].set(-a2z, 0.0, a2x); - ds_1[0][2] = ds_1[2][0]; - ds_1[3][0].set( a2y, -a2x, 0.0); - ds_1[0][3] = ds_1[3][0]; - ds_1[1][1].set( a2x, -a2y, -a2z); - ds_1[2][1].set( a2y, a2x, 0.0); - ds_1[1][2] = ds_1[2][1]; - ds_1[3][1].set( a2z, 0.0, a2x); - ds_1[1][3] = ds_1[3][1]; - ds_1[2][2].set(-a2x, a2y, -a2z); - ds_1[3][2].set( 0.0, a2z, a2y); - ds_1[2][3] = ds_1[3][2]; - ds_1[3][3].set(-a2x, -a2y, a2z); - calc_derivative_impl(ds_1, dl0_1_out, dq0_1_out, ds_1_out); + const cvm::rvector ds_1[4][4] = { + {{ a2x, a2y, a2z}, { 0.0, a2z, -a2y}, {-a2z, 0.0, a2x}, { a2y, -a2x, 0.0}}, + {{ 0.0, a2z, -a2y}, { a2x, -a2y, -a2z}, { a2y, a2x, 0.0}, { a2z, 0.0, a2x}}, + {{-a2z, 0.0, a2x}, { a2y, a2x, 0.0}, {-a2x, a2y, -a2z}, { 0.0, a2z, a2y}}, + {{ a2y, -a2x, 0.0}, { a2z, 0.0, a2x}, { 0.0, a2z, a2y}, {-a2x, -a2y, a2z}}}; + calc_derivative_impl(ds_1, dl0_1_out, dq0_1_out, ds_1_out); } /*! @brief Calculate the derivatives of S, the leading eigenvalue L and * the leading eigenvector Q with respect to `m_pos2` @@ -499,32 +499,21 @@ struct rotation_derivative { * @param[out] ds_2_out The output of derivative of overlap matrix S with * respect to ia-th atom of group 2 */ + template void calc_derivative_wrt_group2( - size_t ia, cvm::rvector* const dl0_2_out = nullptr, - cvm::vector1d* const dq0_2_out = nullptr, - cvm::matrix2d* const ds_2_out = nullptr) const { - if (dl0_2_out == nullptr && dq0_2_out == nullptr) return; + size_t ia, cvm::rvector* _noalias const dl0_2_out = nullptr, + cvm::vector1d* _noalias const dq0_2_out = nullptr, + cvm::matrix2d* _noalias const ds_2_out = nullptr) const { + // if (dl0_2_out == nullptr && dq0_2_out == nullptr) return; cvm::real a1x, a1y, a1z; // we can get rid of the helper function read_atom_coord if C++17 (constexpr) is available read_atom_coord(ia, m_pos1, &a1x, &a1y, &a1z); - cvm::rvector ds_2[4][4]; - ds_2[0][0].set( a1x, a1y, a1z); - ds_2[1][0].set( 0.0, -a1z, a1y); - ds_2[0][1] = ds_2[1][0]; - ds_2[2][0].set( a1z, 0.0, -a1x); - ds_2[0][2] = ds_2[2][0]; - ds_2[3][0].set(-a1y, a1x, 0.0); - ds_2[0][3] = ds_2[3][0]; - ds_2[1][1].set( a1x, -a1y, -a1z); - ds_2[2][1].set( a1y, a1x, 0.0); - ds_2[1][2] = ds_2[2][1]; - ds_2[3][1].set( a1z, 0.0, a1x); - ds_2[1][3] = ds_2[3][1]; - ds_2[2][2].set(-a1x, a1y, -a1z); - ds_2[3][2].set( 0.0, a1z, a1y); - ds_2[2][3] = ds_2[3][2]; - ds_2[3][3].set(-a1x, -a1y, a1z); - calc_derivative_impl(ds_2, dl0_2_out, dq0_2_out, ds_2_out); + const cvm::rvector ds_2[4][4] = { + {{ a1x, a1y, a1z}, { 0.0, -a1z, a1y}, { a1z, 0.0, -a1x}, {-a1y, a1x, 0.0}}, + {{ 0.0, -a1z, a1y}, { a1x, -a1y, -a1z}, { a1y, a1x, 0.0}, { a1z, 0.0, a1x}}, + {{ a1z, 0.0, -a1x}, { a1y, a1x, 0.0}, {-a1x, a1y, -a1z}, { 0.0, a1z, a1y}}, + {{-a1y, a1x, 0.0}, { a1z, 0.0, a1x}, { 0.0, a1z, a1y}, {-a1x, -a1y, a1z}}}; + calc_derivative_impl(ds_2, dl0_2_out, dq0_2_out, ds_2_out); } }; @@ -585,10 +574,7 @@ void debug_gradients( cvm::real S_new_eigval[4]; cvm::real S_new_eigvec[4][4]; for (size_t ia = 0; ia < pos2.size(); ++ia) { - // cvm::real const &a1x = pos1[ia].x; - // cvm::real const &a1y = pos1[ia].y; - // cvm::real const &a1z = pos1[ia].z; - deriv.calc_derivative_wrt_group2(ia, &dl0_2, &dq0_2, &ds_2); + deriv.template calc_derivative_wrt_group2(ia, &dl0_2, &dq0_2, &ds_2); // make an infitesimal move along each cartesian coordinate of // this atom, and solve again the eigenvector problem for (size_t comp = 0; comp < 3; comp++) { diff --git a/lib/colvars/colvaratoms.cpp b/lib/colvars/colvaratoms.cpp index e15b9301a1..054db505f3 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -673,7 +673,7 @@ int cvm::atom_group::add_atom_numbers(std::string const &numbers_conf) } -int cvm::atom_group::add_index_group(std::string const &index_group_name) +int cvm::atom_group::add_index_group(std::string const &index_group_name, bool silent) { std::vector const &index_group_names = cvm::main()->index_group_names; @@ -687,7 +687,10 @@ int cvm::atom_group::add_index_group(std::string const &index_group_name) } if (i_group >= index_group_names.size()) { - return cvm::error("Error: could not find index group "+ + if (silent) + return COLVARS_INPUT_ERROR; + else + return cvm::error("Error: could not find index group "+ index_group_name+" among those already provided.\n", COLVARS_INPUT_ERROR); } @@ -1055,6 +1058,14 @@ void cvm::atom_group::calc_apply_roto_translation() } } + if (is_enabled(f_ag_fit_gradients) && !b_dummy) { + // Save the unrotated frame for fit gradients + pos_unrotated.resize(size()); + for (size_t i = 0; i < size(); ++i) { + pos_unrotated[i] = atoms[i].pos; + } + } + if (is_enabled(f_ag_rotate)) { // rotate the group (around the center of geometry if f_ag_center is // enabled, around the origin otherwise) @@ -1217,23 +1228,30 @@ void cvm::atom_group::calc_fit_gradients() if (cvm::debug()) cvm::log("Calculating fit gradients.\n"); + cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; + + auto accessor_main = [this](size_t i){return atoms[i].grad;}; + auto accessor_fitting = [&group_for_fit](size_t j, const cvm::rvector& grad){group_for_fit->fit_gradients[j] = grad;}; if (is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (!is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (!is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) - calc_fit_gradients_impl(); + calc_fit_forces_impl(accessor_main, accessor_fitting); if (cvm::debug()) cvm::log("Done calculating fit gradients.\n"); } -template -void cvm::atom_group::calc_fit_gradients_impl() { - cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; +template +void cvm::atom_group::calc_fit_forces_impl( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const { + const cvm::atom_group *group_for_fit = fitting_group ? fitting_group : this; // the center of geometry contribution to the gradients cvm::rvector atom_grad; // the rotation matrix contribution to the gradients @@ -1243,17 +1261,13 @@ void cvm::atom_group::calc_fit_gradients_impl() { cvm::vector1d dq0_1(4); // loop 1: iterate over the current atom group for (size_t i = 0; i < size(); i++) { - cvm::atom_pos pos_orig; if (B_ag_center) { - atom_grad += atoms[i].grad; - if (B_ag_rotate) pos_orig = rot_inv * (atoms[i].pos - ref_pos_cog); - } else { - if (B_ag_rotate) pos_orig = atoms[i].pos; + atom_grad += accessor_main(i); } if (B_ag_rotate) { // calculate \partial(R(q) \vec{x}_i)/\partial q) \cdot \partial\xi/\partial\vec{x}_i cvm::quaternion const dxdq = - rot.q.position_derivative_inner(pos_orig, atoms[i].grad); + rot.q.position_derivative_inner(pos_unrotated[i], accessor_main(i)); sum_dxdq[0] += dxdq[0]; sum_dxdq[1] += dxdq[1]; sum_dxdq[2] += dxdq[2]; @@ -1261,26 +1275,45 @@ void cvm::atom_group::calc_fit_gradients_impl() { } } if (B_ag_center) { - if (B_ag_rotate) atom_grad = rot.inverse().matrix() * atom_grad; + if (B_ag_rotate) atom_grad = rot_inv * atom_grad; atom_grad *= (-1.0)/(cvm::real(group_for_fit->size())); } // loop 2: iterate over the fitting group if (B_ag_rotate) rot_deriv->prepare_derivative(rotation_derivative_dldq::use_dq); for (size_t j = 0; j < group_for_fit->size(); j++) { + cvm::rvector fitting_force_grad{0, 0, 0}; if (B_ag_center) { - group_for_fit->fit_gradients[j] = atom_grad; + fitting_force_grad += atom_grad; } if (B_ag_rotate) { - rot_deriv->calc_derivative_wrt_group1(j, nullptr, &dq0_1); + rot_deriv->calc_derivative_wrt_group1(j, nullptr, &dq0_1); // multiply by {\partial q}/\partial\vec{x}_j and add it to the fit gradients - group_for_fit->fit_gradients[j] += sum_dxdq[0] * dq0_1[0] + - sum_dxdq[1] * dq0_1[1] + - sum_dxdq[2] * dq0_1[2] + - sum_dxdq[3] * dq0_1[3]; + fitting_force_grad += sum_dxdq[0] * dq0_1[0] + + sum_dxdq[1] * dq0_1[1] + + sum_dxdq[2] * dq0_1[2] + + sum_dxdq[3] * dq0_1[3]; } + if (cvm::debug()) { + cvm::log(cvm::to_str(fitting_force_grad)); + } + accessor_fitting(j, fitting_force_grad); } } +template +void cvm::atom_group::calc_fit_forces( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const { + if (is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (!is_enabled(f_ag_center) && is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); + if (!is_enabled(f_ag_center) && !is_enabled(f_ag_rotate)) + calc_fit_forces_impl(accessor_main, accessor_fitting); +} + std::vector cvm::atom_group::positions() const { @@ -1452,17 +1485,72 @@ void cvm::atom_group::apply_force(cvm::rvector const &force) return; } - if (is_enabled(f_ag_rotate)) { + auto ag_force = get_group_force_object(); + for (size_t i = 0; i < size(); ++i) { + ag_force.add_atom_force(i, atoms[i].mass / total_mass * force); + } +} - const auto rot_inv = rot.inverse().matrix(); - for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->apply_force(rot_inv * ((ai->mass/total_mass) * force)); +cvm::atom_group::group_force_object cvm::atom_group::get_group_force_object() { + return cvm::atom_group::group_force_object(this); +} + +cvm::atom_group::group_force_object::group_force_object(cvm::atom_group* ag): +m_ag(ag), m_group_for_fit(m_ag->fitting_group ? m_ag->fitting_group : m_ag), +m_has_fitting_force(m_ag->is_enabled(f_ag_center) || m_ag->is_enabled(f_ag_rotate)) { + if (m_has_fitting_force) { + if (m_ag->group_forces.size() != m_ag->size()) { + m_ag->group_forces.assign(m_ag->size(), 0); + } else { + std::fill(m_ag->group_forces.begin(), + m_ag->group_forces.end(), 0); } + } +} +cvm::atom_group::group_force_object::~group_force_object() { + if (m_has_fitting_force) { + apply_force_with_fitting_group(); + } +} + +void cvm::atom_group::group_force_object::add_atom_force(size_t i, const cvm::rvector& force) { + if (m_has_fitting_force) { + m_ag->group_forces[i] += force; } else { + // Apply the force directly if we don't use fitting + (*m_ag)[i].apply_force(force); + } +} - for (cvm::atom_iter ai = this->begin(); ai != this->end(); ai++) { - ai->apply_force((ai->mass/total_mass) * force); +void cvm::atom_group::group_force_object::apply_force_with_fitting_group() { + const cvm::rmatrix rot_inv = m_ag->rot.inverse().matrix(); + if (cvm::debug()) { + cvm::log("Applying force on main group " + m_ag->name + ":\n"); + } + for (size_t ia = 0; ia < m_ag->size(); ++ia) { + const cvm::rvector f_ia = rot_inv * m_ag->group_forces[ia]; + (*m_ag)[ia].apply_force(f_ia); + if (cvm::debug()) { + cvm::log(cvm::to_str(f_ia)); + } + } + // Gradients are only available with scalar components, so for a scalar component, + // if f_ag_fit_gradients is disabled, then the forces on the fitting group is not + // computed. For a vector component, we can only know the forces on the fitting + // group, but checking this flag can mimic results that the users expect (if + // "enableFitGradients no" then there is no force on the fitting group). + if (!m_ag->b_dummy && m_ag->is_enabled(f_ag_fit_gradients)) { + auto accessor_main = [this](size_t i){return m_ag->group_forces[i];}; + auto accessor_fitting = [this](size_t j, const cvm::rvector& fitting_force){ + (*(m_group_for_fit))[j].apply_force(fitting_force); + }; + if (cvm::debug()) { + cvm::log("Applying force on the fitting group of main group" + m_ag->name + ":\n"); + } + m_ag->calc_fit_forces(accessor_main, accessor_fitting); + if (cvm::debug()) { + cvm::log("Done applying force on the fitting group of main group" + m_ag->name + ":\n"); } } } diff --git a/lib/colvars/colvaratoms.h b/lib/colvars/colvaratoms.h index d16ca7bd56..528e849df0 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -194,7 +194,7 @@ public: int add_atom_numbers(std::string const &numbers_conf); int add_atoms_of_group(atom_group const * ag); - int add_index_group(std::string const &index_group_name); + int add_index_group(std::string const &index_group_name, bool silent = false); int add_atom_numbers_range(std::string const &range_conf); int add_atom_name_residue_range(std::string const &psf_segid, std::string const &range_conf); @@ -257,8 +257,63 @@ protected: /// \brief Index in the colvarproxy arrays (if the group is scalable) int index; + /// \brief The temporary forces acting on the main group atoms. + /// Currently this is only used for calculating the fitting group forces for + /// non-scalar components. + std::vector group_forces; + public: + /*! @class group_force_object + * @brief A helper class for applying forces on an atom group in a way that + * is aware of the fitting group. NOTE: you are encouraged to use + * get_group_force_object() to get an instance of group_force_object + * instead of constructing directly. + */ + class group_force_object { + public: + /*! @brief Constructor of group_force_object + * @param ag The pointer to the atom group that forces will be applied on. + */ + group_force_object(cvm::atom_group* ag); + /*! @brief Destructor of group_force_object + */ + ~group_force_object(); + /*! @brief Apply force to atom i + * @param i The i-th of atom in the atom group. + * @param force The force being added to atom i. + * + * The function can be used as follows, + * @code + * // In your colvar::cvc::apply_force() loop of a component: + * auto ag_force = atoms->get_group_force_object(); + * for (ia = 0; ia < atoms->size(); ia++) { + * const cvm::rvector f = compute_force_on_atom_ia(); + * ag_force.add_atom_force(ia, f); + * } + * @endcode + * There are actually two scenarios under the hood: + * (i) If the atom group does not have a fitting group, then the force is + * added to atom i directly; + * (ii) If the atom group has a fitting group, the force on atom i will just + * be temporary stashed into ag->group_forces. At the end of the loop + * of apply_force(), the destructor ~group_force_object() will be called, + * which then call apply_force_with_fitting_group(). The forces on the + * main group will be rotated back by multiplying ag->group_forces with + * the inverse rotation. The forces on the fitting group (if + * enableFitGradients is on) will be calculated by calling + * calc_fit_forces. + */ + void add_atom_force(size_t i, const cvm::rvector& force); + private: + cvm::atom_group* m_ag; + cvm::atom_group* m_group_for_fit; + bool m_has_fitting_force; + void apply_force_with_fitting_group(); + }; + + group_force_object get_group_force_object(); + inline cvm::atom & operator [] (size_t const i) { return atoms[i]; @@ -423,6 +478,9 @@ private: /// \brief Center of geometry before any fitting cvm::atom_pos cog_orig; + /// \brief Unrotated atom positions for fit gradients + std::vector pos_unrotated; + public: /// \brief Return the center of geometry of the atomic positions @@ -497,15 +555,60 @@ public: /// \brief Calculate the derivatives of the fitting transformation void calc_fit_gradients(); -/*! @brief Actual implementation of `calc_fit_gradients`. The template is +/*! @brief Actual implementation of `calc_fit_gradients` and + * `calc_fit_forces`. The template is * used to avoid branching inside the loops in case that the CPU * branch prediction is broken (or further migration to GPU code). * @tparam B_ag_center Centered the reference to origin? This should follow * the value of `is_enabled(f_ag_center)`. * @tparam B_ag_rotate Calculate the optimal rotation? This should follow * the value of `is_enabled(f_ag_rotate)`. + * @tparam main_force_accessor_T The type of accessor of the main + * group forces or gradients acting on the rotated frame. + * @tparam fitting_force_accessor_T The type of accessor of the fitting group + * forces or gradients. + * @param accessor_main The accessor of the main group forces or gradients. + * accessor_main(i) should return the i-th force or gradient of the + * rotated main group. + * @param accessor_fitting The accessor of the fitting group forces or gradients. + * accessor_fitting(j, v) should store/apply the j-th atom gradient or + * force in the fitting group. + * + * This function is used to (i) project the gradients of CV with respect to + * rotated main group atoms to fitting group atoms, or (ii) project the forces + * on rotated main group atoms to fitting group atoms, by the following two steps + * (using the goal (ii) for example): + * (1) Loop over the positions of main group atoms and call cvm::quaternion::position_derivative_inner + * to project the forces on rotated main group atoms to the forces on quaternion. + * (2) Loop over the positions of fitting group atoms, compute the gradients of + * \f$\mathbf{q}\f$ with respect to the position of each atom, and then multiply + * that with the force on \f$\mathbf{q}\f$ (chain rule). */ - template void calc_fit_gradients_impl(); + template + void calc_fit_forces_impl( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const; + +/*! @brief Calculate or apply the fitting group forces from the main group forces. + * @tparam main_force_accessor_T The type of accessor of the main + * group forces or gradients. + * @tparam fitting_force_accessor_T The type of accessor of the fitting group + * forces or gradients. + * @param accessor_main The accessor of the main group forces or gradients. + * accessor_main(i) should return the i-th force or gradient of the + * main group. + * @param accessor_fitting The accessor of the fitting group forces or gradients. + * accessor_fitting(j, v) should store/apply the j-th atom gradient or + * force in the fitting group. + * + * This function just dispatches the parameters to calc_fit_forces_impl that really + * performs the calculations. + */ + template + void calc_fit_forces( + main_force_accessor_T accessor_main, + fitting_force_accessor_T accessor_fitting) const; /// \brief Derivatives of the fitting transformation std::vector fit_gradients; diff --git a/lib/colvars/colvarbias.cpp b/lib/colvars/colvarbias.cpp index fdffdc1794..43b54d672f 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -93,6 +93,8 @@ int colvarbias::init(std::string const &conf) cvm::log("Reinitializing bias \""+name+"\".\n"); } + feature_states[f_cvb_step_zero_data].available = true; + colvar_values.resize(num_variables()); for (i = 0; i < num_variables(); i++) { colvar_values[i].type(colvars[i]->value().type()); @@ -157,7 +159,7 @@ int colvarbias::init_dependencies() { init_feature(f_cvb_step_zero_data, "step_zero_data", f_type_user); init_feature(f_cvb_apply_force, "apply_force", f_type_user); - require_feature_children(f_cvb_apply_force, f_cv_gradient); + require_feature_children(f_cvb_apply_force, f_cv_apply_force); init_feature(f_cvb_bypass_ext_lagrangian, "bypass_extended_Lagrangian_coordinates", f_type_user); @@ -199,6 +201,8 @@ int colvarbias::init_dependencies() { init_feature(f_cvb_extended, "Bias on extended-Lagrangian variables", f_type_static); + init_feature(f_cvb_smp, "smp_computation", f_type_user); + // check that everything is initialized for (i = 0; i < colvardeps::f_cvb_ntot; i++) { if (is_not_set(i)) { @@ -221,8 +225,9 @@ int colvarbias::init_dependencies() { // The feature f_cvb_bypass_ext_lagrangian is only implemented by some derived classes // (initially, harmonicWalls) feature_states[f_cvb_bypass_ext_lagrangian].available = false; - // disabled by default; can be changed by derived classes that implement it - feature_states[f_cvb_bypass_ext_lagrangian].enabled = false; + + // Most biases cannot currently be processed in parallel over threads + feature_states[f_cvb_smp].available = false; return COLVARS_OK; } @@ -704,7 +709,7 @@ int colvarbias::read_state_string(char const *buffer) std::ostream &colvarbias::write_state_data_key(std::ostream &os, std::string const &key, - bool header) + bool header) const { os << (header ? "\n" : "") << key << (header ? "\n" : " "); return os; @@ -712,7 +717,7 @@ std::ostream &colvarbias::write_state_data_key(std::ostream &os, std::string con cvm::memory_stream &colvarbias::write_state_data_key(cvm::memory_stream &os, std::string const &key, - bool /* header */) + bool /* header */) const { os << std::string(key); return os; @@ -792,6 +797,8 @@ int colvarbias_ti::init(std::string const &conf) { int error_code = COLVARS_OK; + key_lookup(conf, "grid", &grid_conf); + get_keyval_feature(this, conf, "writeTISamples", f_cvb_write_ti_samples, is_enabled(f_cvb_write_ti_samples)); @@ -800,18 +807,16 @@ int colvarbias_ti::init(std::string const &conf) f_cvb_write_ti_pmf, is_enabled(f_cvb_write_ti_pmf)); + if (is_enabled(f_cvb_write_ti_pmf)) { + enable(f_cvb_write_ti_samples); + } + if ((num_variables() > 1) && is_enabled(f_cvb_write_ti_pmf)) { return cvm::error("Error: only 1-dimensional PMFs can be written " "on the fly.\n" "Consider using writeTISamples instead and " "post-processing the sampled free-energy gradients.\n", COLVARS_NOT_IMPLEMENTED); - } else { - error_code |= init_grids(); - } - - if (is_enabled(f_cvb_write_ti_pmf)) { - enable(f_cvb_write_ti_samples); } if (is_enabled(f_cvb_calc_ti_samples)) { @@ -831,6 +836,8 @@ int colvarbias_ti::init(std::string const &conf) } } + error_code |= colvarbias_ti::init_grids(); + if (is_enabled(f_cvb_write_ti_pmf) || is_enabled(f_cvb_write_ti_samples)) { cvm::main()->cite_feature("Internal-forces free energy estimator"); } @@ -844,16 +851,15 @@ int colvarbias_ti::init_grids() if (is_enabled(f_cvb_calc_ti_samples)) { if (!ti_avg_forces) { ti_bin.resize(num_variables()); + ti_bin.assign(ti_bin.size(), -1); ti_system_forces.resize(num_variables()); for (size_t icv = 0; icv < num_variables(); icv++) { ti_system_forces[icv].type(variables(icv)->value()); ti_system_forces[icv].is_derivative(); ti_system_forces[icv].reset(); } - ti_avg_forces.reset(new colvar_grid_gradient(colvars)); - ti_count.reset(new colvar_grid_count(colvars)); - ti_avg_forces->samples = ti_count; - ti_count->has_parent_data = true; + ti_count.reset(new colvar_grid_count(colvars, grid_conf)); + ti_avg_forces.reset(new colvar_grid_gradient(colvars, ti_count)); } } @@ -884,8 +890,12 @@ int colvarbias_ti::update_system_forces(std::vector const size_t i; - if (proxy->total_forces_same_step()) { - for (i = 0; i < num_variables(); i++) { + if (cvm::debug()) { + cvm::log("TI bin for bias \"" + name + "\" = " + cvm::to_str(ti_bin) + ".\n"); + } + + for (i = 0; i < num_variables(); i++) { + if (variables(i)->is_enabled(f_cv_total_force_current_step)) { ti_bin[i] = ti_avg_forces->current_bin_scalar(i); } } @@ -894,8 +904,10 @@ int colvarbias_ti::update_system_forces(std::vector const if ((cvm::step_relative() > 0) || proxy->total_forces_same_step()) { if (ti_avg_forces->index_ok(ti_bin)) { for (i = 0; i < num_variables(); i++) { - if (variables(i)->is_enabled(f_cv_subtract_applied_force)) { + if (variables(i)->is_enabled(f_cv_subtract_applied_force) || + (cvm::proxy->total_forces_same_step() && !variables(i)->is_enabled(f_cv_external))) { // this colvar is already subtracting all applied forces + // or the "total force" is really a system force at current step ti_system_forces[i] = variables(i)->total_force(); } else { ti_system_forces[i] = variables(i)->total_force() - @@ -904,14 +916,17 @@ int colvarbias_ti::update_system_forces(std::vector const } } if (cvm::step_relative() > 0 || is_enabled(f_cvb_step_zero_data)) { + if (cvm::debug()) { + cvm::log("Accumulating TI forces for bias \"" + name + "\".\n"); + } ti_avg_forces->acc_value(ti_bin, ti_system_forces); } } } - if (!proxy->total_forces_same_step()) { - // Set the index for use in the next iteration, when total forces come in - for (i = 0; i < num_variables(); i++) { + for (i = 0; i < num_variables(); i++) { + if (!variables(i)->is_enabled(f_cv_total_force_current_step)) { + // Set the index for use in the next iteration, when total forces come in ti_bin[i] = ti_avg_forces->current_bin_scalar(i); } } diff --git a/lib/colvars/colvarbias.h b/lib/colvars/colvarbias.h index 03f93f4315..35438752a1 100644 --- a/lib/colvars/colvarbias.h +++ b/lib/colvars/colvarbias.h @@ -174,14 +174,14 @@ public: /// \param[in,out] os Output stream /// \param[in] key Keyword labeling the header block /// \param[in] header Whether this is the header of a multi-line segment vs a single line - std::ostream &write_state_data_key(std::ostream &os, std::string const &key, bool header = true); + std::ostream &write_state_data_key(std::ostream &os, std::string const &key, bool header = true) const; /// Write a keyword header for a data sequence to an unformatted stream /// \param[in,out] os Output stream /// \param[in] key Keyword labeling the header block /// \param[in] header Ignored cvm::memory_stream &write_state_data_key(cvm::memory_stream &os, std::string const &key, - bool header = true); + bool header = true) const; private: @@ -358,6 +358,9 @@ protected: /// \brief Forces exerted from the system to the associated variables std::vector ti_system_forces; + /// Grid configuration parameters (also used by grids in derived classes) + std::string grid_conf; + /// Averaged system forces std::shared_ptr ti_avg_forces; diff --git a/lib/colvars/colvarbias_abf.cpp b/lib/colvars/colvarbias_abf.cpp index 6327650863..b01e9de853 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -87,24 +87,25 @@ int colvarbias_abf::init(std::string const &conf) get_keyval(conf, "shared", shared_on, false); if (shared_on) { cvm::main()->cite_feature("Multiple-walker ABF implementation"); - if ((proxy->replica_enabled() != COLVARS_OK) || - (proxy->num_replicas() <= 1)) { - return cvm::error("Error: shared ABF requires more than one replica.", - COLVARS_INPUT_ERROR); - } - cvm::log("shared ABF will be applied among "+ - cvm::to_str(proxy->num_replicas()) + " replicas.\n"); + cvm::main()->cite_feature("Updated multiple-walker ABF implementation"); + + + // Cannot check this here because the replica communicator is obtained later + // in Gromacs + + // if ((proxy->check_replicas_enabled() != COLVARS_OK) || + // (proxy->num_replicas() <= 1)) { + // return cvm::error("Error: shared ABF requires more than one replica.", + // COLVARS_INPUT_ERROR); + // } + // cvm::log("shared ABF will be applied among "+ + // cvm::to_str(proxy->num_replicas()) + " replicas.\n"); // If shared_freq is not set, we default to output_freq get_keyval(conf, "sharedFreq", shared_freq, output_freq); if ( shared_freq && output_freq % shared_freq ) { return cvm::error("Error: outputFreq must be a multiple of sharedFreq.\n"); } - - // Allocate these at init time if possible - local_samples.reset(new colvar_grid_count(colvars)); - local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); - local_pmf.reset(new integrate_potential(colvars, local_gradients)); } // ************* checking the associated colvars ******************* @@ -124,10 +125,17 @@ 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, not driven external param), we are running eABF + if (colvars[i]->is_enabled(f_cv_extended_Lagrangian) + && !colvars[i]->is_enabled(f_cv_external)) { enable(f_cvb_extended); + } + + if (!colvars[i]->is_enabled(f_cv_total_force_current_step)) { + // If any colvar does not have current-step total force, then + // we can't do step 0 data + provide(f_cvb_step_zero_data, false); + } // Cannot mix and match coarse time steps with ABF because it gives // wrong total force averages - total force needs to be averaged over @@ -181,12 +189,23 @@ int colvarbias_abf::init(std::string const &conf) cvm::log("Allocating count and free energy gradient grids.\n"); } - samples.reset(new colvar_grid_count(colvars)); - gradients.reset(new colvar_grid_gradient(colvars, samples)); + { + /// Optional custom configuration string for grid parameters + std::string grid_conf; + key_lookup(conf, "grid", &grid_conf); + + samples.reset(new colvar_grid_count(colvars, grid_conf)); + } + gradients.reset(new colvar_grid_gradient(colvars, samples)); // Also use samples as template for sizes gradients->full_samples = full_samples; gradients->min_samples = min_samples; + if (shared_on) { + local_samples.reset(new colvar_grid_count(colvars, samples)); + local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); + } + // Data for eABF z-based estimator if (is_enabled(f_cvb_extended)) { get_keyval(conf, "CZARestimator", b_CZAR_estimator, true); @@ -198,11 +217,11 @@ int colvarbias_abf::init(std::string const &conf) colvarparse::parse_silent); z_bin.assign(num_variables(), 0); - z_samples.reset(new colvar_grid_count(colvars)); + z_samples.reset(new colvar_grid_count(colvars, samples)); z_samples->request_actual_value(); z_gradients.reset(new colvar_grid_gradient(colvars, z_samples)); z_gradients->request_actual_value(); - czar_gradients.reset(new colvar_grid_gradient(colvars)); + czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); } get_keyval(conf, "integrate", b_integrate, num_variables() <= 3); // Integrate for output if d<=3 @@ -216,6 +235,9 @@ int colvarbias_abf::init(std::string const &conf) if (b_CZAR_estimator) { czar_pmf.reset(new integrate_potential(colvars, czar_gradients)); } + if (shared_on) { + local_pmf.reset(new integrate_potential(colvars, local_gradients)); + } // Parameters for integrating initial (and final) gradient data get_keyval(conf, "integrateMaxIterations", integrate_iterations, 10000, colvarparse::parse_silent); get_keyval(conf, "integrateTol", integrate_tol, 1e-6, colvarparse::parse_silent); @@ -228,9 +250,9 @@ int colvarbias_abf::init(std::string const &conf) if (b_CZAR_estimator && shared_on && cvm::main()->proxy->replica_index() == 0) { // The pointers below are used for outputting CZAR data // Allocate grids for collected global data, on replica 0 only - global_z_samples.reset(new colvar_grid_count(colvars)); + global_z_samples.reset(new colvar_grid_count(colvars, samples)); global_z_gradients.reset(new colvar_grid_gradient(colvars, global_z_samples)); - global_czar_gradients.reset(new colvar_grid_gradient(colvars)); + global_czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); global_czar_pmf.reset(new integrate_potential(colvars, global_czar_gradients)); } else { // otherwise they are just aliases for the local CZAR grids @@ -244,10 +266,10 @@ int colvarbias_abf::init(std::string const &conf) // This used to be only if "shared" was defined, // but now we allow calling share externally (e.g. from Tcl). if (b_CZAR_estimator) { - z_samples_in.reset(new colvar_grid_count(colvars)); + z_samples_in.reset(new colvar_grid_count(colvars, samples)); z_gradients_in.reset(new colvar_grid_gradient(colvars, z_samples_in)); } - last_samples.reset(new colvar_grid_count(colvars)); + last_samples.reset(new colvar_grid_count(colvars, samples)); last_gradients.reset(new colvar_grid_gradient(colvars, last_samples)); // Any data collected after now is new for shared ABF purposes shared_last_step = cvm::step_absolute(); @@ -315,27 +337,36 @@ int colvarbias_abf::update() size_t i; for (i = 0; i < num_variables(); i++) { bin[i] = samples->current_bin_scalar(i); + if (colvars[i]->is_enabled(f_cv_total_force_current_step)) { + force_bin[i] = bin[i]; + } } - // *********************************************************** // ****** ABF Part I: update the FE gradient estimate ****** // *********************************************************** - if (cvm::proxy->total_forces_same_step()) { - // e.g. in LAMMPS, total forces are current - force_bin = bin; + // Share data first, so that 2d/3d PMF is refreshed using new data for mw-pABF. + // shared_on can be true with shared_freq 0 if we are sharing via script + if (shared_on && shared_freq && + shared_last_step >= 0 && // we have already collected some data + cvm::step_absolute() > shared_last_step && // time has passed since the last sharing timestep + // (avoid re-sharing at last and first ts of successive run statements) + cvm::step_absolute() % shared_freq == 0) { + // Share gradients and samples for shared ABF. + replica_share(); } if (can_accumulate_data() && is_enabled(f_cvb_history_dependent)) { if (cvm::step_relative() > 0 || cvm::proxy->total_forces_same_step()) { + // Note: this will skip step 0 data when available in some cases (extended system), + // but not doing so would make the code more complex if (samples->index_ok(force_bin)) { // Only if requested and within bounds of the grid... - // get total forces (lagging by 1 timestep) from colvars - // and subtract previous ABF force if necessary + // get total force and subtract previous ABF force if necessary update_system_force(); gradients->acc_force(force_bin, system_force); @@ -368,21 +399,11 @@ int colvarbias_abf::update() } } - if (!(cvm::proxy->total_forces_same_step())) { - // e.g. in NAMD, total forces will be available for next timestep - // hence we store the current colvar bin - force_bin = bin; - } + // In some cases, total forces are stored for next timestep + // hence we store the current colvar bin - this is overwritten on a per-colvar basis + // at the top of update() + force_bin = bin; - // Share data after force sample is collected for this time step - // shared_on can be true with shared_freq 0 if we are sharing via script - if (shared_on && shared_freq && - cvm::step_absolute() > shared_last_step && // time has passed since the last sharing timestep - // (avoid re-sharing at last and first ts of successive run statements) - cvm::step_absolute() % shared_freq == 0) { - // Share gradients and samples for shared ABF. - replica_share(); - } // ****************************************************************** // ****** ABF Part II: calculate and apply the biasing force ****** @@ -452,10 +473,13 @@ int colvarbias_abf::update_system_force() // System force from atomic forces (or extended Lagrangian if applicable) for (i = 0; i < num_variables(); i++) { - if (colvars[i]->is_enabled(f_cv_subtract_applied_force)) { + if (colvars[i]->is_enabled(f_cv_subtract_applied_force) + || colvars[i]->is_enabled(f_cv_total_force_current_step)) { // this colvar is already subtracting the ABF force + // or the "total force" is from current step and cannot possibly contain Colvars biases system_force[i] = colvars[i]->total_force().real_value; } else { + // Subtract previous step's bias force from previous step's total force system_force[i] = colvars[i]->total_force().real_value - colvar_forces[i].real_value; } @@ -525,7 +549,7 @@ int colvarbias_abf::replica_share() { colvarproxy *proxy = cvm::main()->proxy; - if (proxy->replica_enabled() != COLVARS_OK) { + if (proxy->check_replicas_enabled() != COLVARS_OK) { cvm::error("Error: shared ABF: No replicas.\n"); return COLVARS_ERROR; } @@ -542,7 +566,7 @@ int colvarbias_abf::replica_share() { if (!local_samples) { // We arrive here if sharing has just been enabled by a script // in which case local arrays have not been initialized yet - local_samples.reset(new colvar_grid_count(colvars)); + local_samples.reset(new colvar_grid_count(colvars, samples)); local_gradients.reset(new colvar_grid_gradient(colvars, local_samples)); local_pmf.reset(new integrate_potential(colvars, local_gradients)); } @@ -662,9 +686,9 @@ int colvarbias_abf::replica_share_CZAR() { // We arrive here if sharing has just been enabled by a script // Allocate grids for collective data, on replica 0 only // overriding CZAR grids that are equal to local ones by default - global_z_samples.reset(new colvar_grid_count(colvars)); + global_z_samples.reset(new colvar_grid_count(colvars, samples)); global_z_gradients.reset(new colvar_grid_gradient(colvars, global_z_samples)); - global_czar_gradients.reset(new colvar_grid_gradient(colvars)); + global_czar_gradients.reset(new colvar_grid_gradient(colvars, nullptr, samples)); global_czar_pmf.reset(new integrate_potential(colvars, global_czar_gradients)); } diff --git a/lib/colvars/colvarbias_histogram.cpp b/lib/colvars/colvarbias_histogram.cpp index 98de275304..aab2c8f593 100644 --- a/lib/colvars/colvarbias_histogram.cpp +++ b/lib/colvars/colvarbias_histogram.cpp @@ -98,10 +98,10 @@ int colvarbias_histogram::init(std::string const &conf) } { - std::string grid_conf; - if (key_lookup(conf, "histogramGrid", &grid_conf)) { + if (key_lookup(conf, "histogramGrid", &grid_conf) || + key_lookup(conf, "grid", &grid_conf)) { grid->parse_params(grid_conf); - grid->check_keywords(grid_conf, "histogramGrid"); + grid->check_keywords(grid_conf, "grid"); } } diff --git a/lib/colvars/colvarbias_histogram.h b/lib/colvars/colvarbias_histogram.h index 2c6ee84d1f..ed3ee346a6 100644 --- a/lib/colvars/colvarbias_histogram.h +++ b/lib/colvars/colvarbias_histogram.h @@ -38,6 +38,7 @@ protected: /// n-dim histogram colvar_grid_scalar *grid; + std::string grid_conf; std::vector bin; std::string out_name, out_name_dx; diff --git a/lib/colvars/colvarbias_histogram_reweight_amd.cpp b/lib/colvars/colvarbias_histogram_reweight_amd.cpp index de2f6d9b8a..3c31e175f2 100644 --- a/lib/colvars/colvarbias_histogram_reweight_amd.cpp +++ b/lib/colvars/colvarbias_histogram_reweight_amd.cpp @@ -11,43 +11,9 @@ #include "colvarproxy.h" #include "colvars_memstream.h" -colvarbias_reweightaMD::colvarbias_reweightaMD(char const *key) - : colvarbias_histogram(key), grid_count(NULL), grid_dV(NULL), - grid_dV_square(NULL), pmf_grid_exp_avg(NULL), pmf_grid_cumulant(NULL), - grad_grid_exp_avg(NULL), grad_grid_cumulant(NULL) -{ -} +colvarbias_reweightaMD::colvarbias_reweightaMD(char const *key) : colvarbias_histogram(key) {} -colvarbias_reweightaMD::~colvarbias_reweightaMD() { - if (grid_dV) { - delete grid_dV; - grid_dV = NULL; - } - if (grid_dV_square) { - delete grid_dV_square; - grid_dV_square = NULL; - } - if (grid_count) { - delete grid_count; - grid_count = NULL; - } - if (pmf_grid_exp_avg) { - delete pmf_grid_exp_avg; - pmf_grid_exp_avg = NULL; - } - if (pmf_grid_cumulant) { - delete pmf_grid_cumulant; - pmf_grid_cumulant = NULL; - } - if (grad_grid_exp_avg) { - delete grad_grid_exp_avg; - grad_grid_exp_avg = NULL; - } - if (grad_grid_cumulant) { - delete grad_grid_cumulant; - grad_grid_cumulant = NULL; - } -} +colvarbias_reweightaMD::~colvarbias_reweightaMD() {} int colvarbias_reweightaMD::init(std::string const &conf) { if (cvm::proxy->accelMD_enabled() == false) { @@ -60,21 +26,21 @@ int colvarbias_reweightaMD::init(std::string const &conf) { get_keyval(conf, "WritePMFGradients", b_write_gradients, true); get_keyval(conf, "historyFreq", history_freq, 0); b_history_files = (history_freq > 0); - grid_count = new colvar_grid_scalar(colvars); + grid_count.reset(new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); grid_count->request_actual_value(); grid->request_actual_value(); - pmf_grid_exp_avg = new colvar_grid_scalar(colvars); + pmf_grid_exp_avg.reset(new colvar_grid_scalar(colvars, grid_count)); if (b_write_gradients) { - grad_grid_exp_avg = new colvar_grid_gradient(colvars); + grad_grid_exp_avg.reset(new colvar_grid_gradient(colvars, nullptr, grid_count)); } if (b_use_cumulant_expansion) { - grid_dV = new colvar_grid_scalar(colvars); - grid_dV_square = new colvar_grid_scalar(colvars); - pmf_grid_cumulant = new colvar_grid_scalar(colvars); + grid_dV.reset(new colvar_grid_scalar(colvars, grid_count)); + grid_dV_square.reset(new colvar_grid_scalar(colvars, grid_count)); + pmf_grid_cumulant.reset(new colvar_grid_scalar(colvars, grid_count)); grid_dV->request_actual_value(); grid_dV_square->request_actual_value(); if (b_write_gradients) { - grad_grid_cumulant = new colvar_grid_gradient(colvars); + grad_grid_cumulant.reset(new colvar_grid_gradient(colvars, nullptr, grid_count)); } } previous_bin.assign(num_variables(), -1); @@ -193,7 +159,7 @@ int colvarbias_reweightaMD::write_exponential_reweighted_pmf( pmf_grid_exp_avg->set_value(i, tmp / count); } } - hist_to_pmf(pmf_grid_exp_avg, grid_count); + hist_to_pmf(pmf_grid_exp_avg.get(), grid_count.get()); pmf_grid_exp_avg->write_multicol(pmf_grid_os); if (!keep_open) { cvm::proxy->close_output_stream(output_pmf); @@ -231,9 +197,9 @@ int colvarbias_reweightaMD::write_cumulant_expansion_pmf( if (!pmf_grid_cumulant_os) { return COLVARS_FILE_ERROR; } - compute_cumulant_expansion_factor(grid_dV, grid_dV_square, - grid_count, pmf_grid_cumulant); - hist_to_pmf(pmf_grid_cumulant, grid_count); + compute_cumulant_expansion_factor(grid_dV.get(), grid_dV_square.get(), + grid_count.get(), pmf_grid_cumulant.get()); + hist_to_pmf(pmf_grid_cumulant.get(), grid_count.get()); pmf_grid_cumulant->write_multicol(pmf_grid_cumulant_os); if (!keep_open) { cvm::proxy->close_output_stream(output_pmf); diff --git a/lib/colvars/colvarbias_histogram_reweight_amd.h b/lib/colvars/colvarbias_histogram_reweight_amd.h index 43759b3bde..3e3bdede26 100644 --- a/lib/colvars/colvarbias_histogram_reweight_amd.h +++ b/lib/colvars/colvarbias_histogram_reweight_amd.h @@ -68,9 +68,9 @@ protected: /// Use cumulant expansion to second order? bool b_use_cumulant_expansion; - colvar_grid_scalar* grid_count; - colvar_grid_scalar* grid_dV; - colvar_grid_scalar* grid_dV_square; + std::shared_ptr grid_count; + std::unique_ptr grid_dV; + std::unique_ptr grid_dV_square; /// Number of timesteps between recording data in history files (if non-zero) size_t history_freq; @@ -90,10 +90,10 @@ protected: private: /// temporary grids for evaluating PMFs - colvar_grid_scalar *pmf_grid_exp_avg; - colvar_grid_scalar *pmf_grid_cumulant; - colvar_grid_gradient *grad_grid_exp_avg; - colvar_grid_gradient *grad_grid_cumulant; + std::unique_ptr pmf_grid_exp_avg; + std::unique_ptr pmf_grid_cumulant; + std::unique_ptr grad_grid_exp_avg; + std::unique_ptr grad_grid_cumulant; }; #endif // COLVARBIAS_HISTOGRAM_REWEIGHT_AMD diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 905cd17883..1131c88ec5 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -11,27 +11,10 @@ #include #include -// Define function to get the absolute path of a replica file -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -#define GETCWD(BUF, SIZE) ::_getcwd(BUF, SIZE) -#define PATHSEP "\\" -#else -#include -#define GETCWD(BUF, SIZE) ::getcwd(BUF, SIZE) -#define PATHSEP "/" -#endif - -#ifdef __cpp_lib_filesystem -// When std::filesystem is available, use it -#include -#undef GETCWD -#define GETCWD(BUF, SIZE) (std::filesystem::current_path().string().c_str()) -#endif - #include "colvarmodule.h" #include "colvarproxy.h" #include "colvar.h" +#include "colvargrid.h" #include "colvarbias_meta.h" #include "colvars_memstream.h" @@ -49,8 +32,6 @@ colvarbias_meta::colvarbias_meta(char const *key) use_grids = true; grids_freq = 0; rebin_grids = false; - hills_energy = NULL; - hills_energy_gradients = NULL; dump_fes = true; keep_hills = false; @@ -161,9 +142,9 @@ int colvarbias_meta::init(std::string const &conf) get_keyval(conf, "keepHills", keep_hills, keep_hills); get_keyval(conf, "keepFreeEnergyFiles", dump_fes_save, dump_fes_save); - if (hills_energy == NULL) { - hills_energy = new colvar_grid_scalar(colvars); - hills_energy_gradients = new colvar_grid_gradient(colvars); + if (!hills_energy) { + hills_energy.reset(new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); + hills_energy_gradients.reset(new colvar_grid_gradient(colvars, nullptr, hills_energy)); } } else { @@ -209,7 +190,7 @@ int colvarbias_meta::init_replicas_params(std::string const &conf) get_keyval(conf, "replicaID", replica_id, replica_id); if (!replica_id.size()) { - if (proxy->replica_enabled() == COLVARS_OK) { + if (proxy->check_replicas_enabled() == COLVARS_OK) { // Obtain replicaID from the communicator replica_id = cvm::to_str(proxy->replica_index()); cvm::log("Setting replicaID from communication layer: replicaID = "+ @@ -272,7 +253,6 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf) { int error_code = COLVARS_OK; // for ebmeta - target_dist = NULL; get_keyval(conf, "ebMeta", ebmeta, false); if(ebmeta){ cvm::main()->cite_feature("Ensemble-biased metadynamics (ebMetaD)"); @@ -283,7 +263,7 @@ int colvarbias_meta::init_ebmeta_params(std::string const &conf) "targetDistFile accordingly.\n", COLVARS_INPUT_ERROR); } - target_dist = new colvar_grid_scalar(); + target_dist.reset(new colvar_grid_scalar()); error_code |= target_dist->init_from_colvars(colvars); std::string target_dist_file; get_keyval(conf, "targetDistFile", target_dist_file); @@ -336,33 +316,15 @@ colvarbias_meta::~colvarbias_meta() { colvarbias_meta::clear_state_data(); colvarproxy *proxy = cvm::main()->proxy; - proxy->close_output_stream(replica_hills_file); - proxy->close_output_stream(hills_traj_file_name()); - - if (target_dist) { - delete target_dist; - target_dist = NULL; - } } int colvarbias_meta::clear_state_data() { - if (hills_energy) { - delete hills_energy; - hills_energy = NULL; - } - - if (hills_energy_gradients) { - delete hills_energy_gradients; - hills_energy_gradients = NULL; - } - hills.clear(); hills_off_grid.clear(); - return COLVARS_OK; } @@ -451,8 +413,11 @@ int colvarbias_meta::update() error_code |= update_grid_params(); // add new biasing energy/forces error_code |= update_bias(); - // update grid content to reflect new bias - error_code |= update_grid_data(); + + if (use_grids) { + // update grid content to reflect new bias + error_code |= update_grid_data(); + } if (comm != single_replica && (cvm::step_absolute() % replica_update_freq) == 0) { @@ -539,9 +504,9 @@ int colvarbias_meta::update_grid_params() // map everything into new grids colvar_grid_scalar *new_hills_energy = - new colvar_grid_scalar(*hills_energy); + new colvar_grid_scalar(*hills_energy); colvar_grid_gradient *new_hills_energy_gradients = - new colvar_grid_gradient(*hills_energy_gradients); + new colvar_grid_gradient(*hills_energy_gradients); // supply new boundaries to the new grids @@ -556,10 +521,8 @@ int colvarbias_meta::update_grid_params() new_hills_energy->map_grid(*hills_energy); new_hills_energy_gradients->map_grid(*hills_energy_gradients); - delete hills_energy; - delete hills_energy_gradients; - hills_energy = new_hills_energy; - hills_energy_gradients = new_hills_energy_gradients; + hills_energy.reset(new_hills_energy); + hills_energy_gradients.reset(new_hills_energy_gradients); curr_bin = hills_energy->get_colvars_index(); if (cvm::debug()) @@ -641,8 +604,7 @@ int colvarbias_meta::update_grid_data() { if ((cvm::step_absolute() % grids_freq) == 0) { // map the most recent gaussians to the grids - project_hills(new_hills_begin, hills.end(), - hills_energy, hills_energy_gradients); + project_hills(new_hills_begin, hills.end(), hills_energy.get(), hills_energy_gradients.get()); new_hills_begin = hills.end(); // TODO: we may want to condense all into one replicas array, @@ -651,8 +613,8 @@ int colvarbias_meta::update_grid_data() for (size_t ir = 0; ir < replicas.size(); ir++) { replicas[ir]->project_hills(replicas[ir]->new_hills_begin, replicas[ir]->hills.end(), - replicas[ir]->hills_energy, - replicas[ir]->hills_energy_gradients); + replicas[ir]->hills_energy.get(), + replicas[ir]->hills_energy_gradients.get()); replicas[ir]->new_hills_begin = replicas[ir]->hills.end(); } } @@ -670,11 +632,20 @@ int colvarbias_meta::calc_energy(std::vector const *values) replicas[ir]->bias_energy = 0.0; } - std::vector const curr_bin = values ? - hills_energy->get_colvars_index(*values) : - hills_energy->get_colvars_index(); + bool index_ok = false; + std::vector curr_bin; - if (hills_energy->index_ok(curr_bin)) { + if (use_grids) { + + curr_bin = values ? + hills_energy->get_colvars_index(*values) : + hills_energy->get_colvars_index(); + + index_ok = hills_energy->index_ok(curr_bin); + + } + + if ( index_ok ) { // index is within the grid: get the energy from there for (ir = 0; ir < replicas.size(); ir++) { @@ -723,11 +694,20 @@ int colvarbias_meta::calc_forces(std::vector const *values) } } - std::vector const curr_bin = values ? - hills_energy->get_colvars_index(*values) : - hills_energy->get_colvars_index(); + bool index_ok = false; + std::vector curr_bin; - if (hills_energy->index_ok(curr_bin)) { + if (use_grids) { + + curr_bin = values ? + hills_energy->get_colvars_index(*values) : + hills_energy->get_colvars_index(); + + index_ok = hills_energy->index_ok(curr_bin); + + } + + if ( index_ok ) { for (ir = 0; ir < replicas.size(); ir++) { cvm::real const *f = &(replicas[ir]->hills_energy_gradients->value(curr_bin)); for (ic = 0; ic < num_variables(); ic++) { @@ -959,8 +939,7 @@ void colvarbias_meta::project_hills(colvarbias_meta::hill_iter h_first, void colvarbias_meta::recount_hills_off_grid(colvarbias_meta::hill_iter h_first, - colvarbias_meta::hill_iter h_last, - colvar_grid_scalar * /* he */) + colvarbias_meta::hill_iter h_last) { hills_off_grid.clear(); @@ -1078,9 +1057,13 @@ int colvarbias_meta::update_replicas_registry() (replicas.back())->comm = multiple_replicas; if (use_grids) { - (replicas.back())->hills_energy = new colvar_grid_scalar(colvars); - (replicas.back())->hills_energy_gradients = new colvar_grid_gradient(colvars); + (replicas.back()) + ->hills_energy.reset(new colvar_grid_scalar(colvars, hills_energy)); + (replicas.back()) + ->hills_energy_gradients.reset( + new colvar_grid_gradient(colvars, nullptr, hills_energy)); } + if (is_enabled(f_cvb_calc_ti_samples)) { (replicas.back())->enable(f_cvb_calc_ti_samples); (replicas.back())->colvarbias_ti::init_grids(); @@ -1336,34 +1319,40 @@ template IST &colvarbias_meta::read_state_data_template_(IST &is) { if (use_grids) { - colvar_grid_scalar *hills_energy_backup = NULL; - colvar_grid_gradient *hills_energy_gradients_backup = NULL; + std::shared_ptr hills_energy_backup; + std::shared_ptr hills_energy_gradients_backup; - if (has_data) { + bool const need_backup = has_data; + + if (need_backup) { if (cvm::debug()) - cvm::log("Backupping grids for metadynamics bias \""+ - this->name+"\""+ - ((comm != single_replica) ? ", replica \""+replica_id+"\"" : "")+".\n"); - hills_energy_backup = hills_energy; - hills_energy_gradients_backup = hills_energy_gradients; - hills_energy = new colvar_grid_scalar(colvars); - hills_energy_gradients = new colvar_grid_gradient(colvars); + cvm::log("Backing up grids for metadynamics bias \"" + this->name + "\"" + + ((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n"); + + hills_energy_backup = std::move(hills_energy); + hills_energy_gradients_backup = std::move(hills_energy_gradients); + hills_energy.reset(new colvar_grid_scalar(colvars, hills_energy)); + hills_energy_gradients.reset(new colvar_grid_gradient(colvars, nullptr, hills_energy)); } - read_grid_data_template_(is, "hills_energy", hills_energy, - hills_energy_backup); + read_grid_data_template_(is, "hills_energy", hills_energy.get(), + hills_energy_backup.get()); - read_grid_data_template_( - is, "hills_energy_gradients", hills_energy_gradients, hills_energy_gradients_backup); + read_grid_data_template_(is, "hills_energy_gradients", + hills_energy_gradients.get(), + hills_energy_gradients_backup.get()); if (is) { cvm::log(" successfully read the biasing potential and its gradients from grids.\n"); - if (hills_energy_backup != nullptr) { - // Now that we have successfully updated the grids, delete the backup copies - delete hills_energy_backup; - delete hills_energy_gradients_backup; - } } else { + if (need_backup) { + if (cvm::debug()) + cvm::log("Restoring grids from backup for metadynamics bias \"" + this->name + "\"" + + ((comm != single_replica) ? ", replica \"" + replica_id + "\"" : "") + ".\n"); + // Restoring content from original grid + hills_energy->copy_grid(*hills_energy_backup); + hills_energy_gradients->copy_grid(*hills_energy_gradients_backup); + } return is; } } @@ -1451,10 +1440,12 @@ void colvarbias_meta::rebin_grids_after_restart() // read from the configuration file), and project onto them the // grids just read from the restart file - colvar_grid_scalar *new_hills_energy = - new colvar_grid_scalar(colvars); - colvar_grid_gradient *new_hills_energy_gradients = - new colvar_grid_gradient(colvars); + // Create new grids based on the configuration parameters, because reading from the state + // file automatically sets the old parameters + std::shared_ptr new_hills_energy( + new colvar_grid_scalar(colvars, nullptr, false, grid_conf)); + std::shared_ptr new_hills_energy_gradients( + new colvar_grid_gradient(colvars, nullptr, new_hills_energy)); if (cvm::debug()) { std::ostringstream tmp_os; @@ -1468,9 +1459,9 @@ void colvarbias_meta::rebin_grids_after_restart() 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"); - project_hills(hills.begin(), hills.end(), - new_hills_energy, new_hills_energy_gradients, true); + cvm::to_str(hills.size())+" hills (this may take a bit)...\n"); + project_hills(hills.begin(), hills.end(), new_hills_energy.get(), + new_hills_energy_gradients.get(), true); cvm::log("rebinning done.\n"); } else { @@ -1481,15 +1472,13 @@ void colvarbias_meta::rebin_grids_after_restart() new_hills_energy_gradients->map_grid(*hills_energy_gradients); } - delete hills_energy; - delete hills_energy_gradients; - hills_energy = new_hills_energy; - hills_energy_gradients = new_hills_energy_gradients; + hills_energy = std::move(new_hills_energy); + hills_energy_gradients = std::move(new_hills_energy_gradients); // assuming that some boundaries have expanded, eliminate those // off-grid hills that aren't necessary any more if (!hills.empty()) - recount_hills_off_grid(hills.begin(), hills.end(), hills_energy); + recount_hills_off_grid(hills.begin(), hills.end()); } } @@ -1718,29 +1707,17 @@ int colvarbias_meta::setup_output() if (comm == multiple_replicas) { - // TODO: one may want to specify the path manually for intricated filesystems? - char *pwd = new char[3001]; - if (GETCWD(pwd, 3000) == nullptr) { - if (pwd != nullptr) { // - delete[] pwd; - } - return cvm::error("Error: cannot get the path of the current working directory.\n", - COLVARS_BUG_ERROR); - } - + auto const pwd = cvm::main()->proxy->get_current_work_dir(); replica_list_file = - (std::string(pwd)+std::string(PATHSEP)+ - this->name+"."+replica_id+".files.txt"); + cvm::main()->proxy->join_paths(pwd, this->name + "." + replica_id + ".files.txt"); // replica_hills_file and replica_state_file are those written // by the current replica; within the mirror biases, they are // those by another replica - replica_hills_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix()+".colvars."+this->name+"."+replica_id+".hills"); - replica_state_file = - (std::string(pwd)+std::string(PATHSEP)+ - cvm::output_prefix()+".colvars."+this->name+"."+replica_id+".state"); - delete[] pwd; + replica_hills_file = cvm::main()->proxy->join_paths( + pwd, cvm::output_prefix() + ".colvars." + this->name + "." + replica_id + ".hills"); + + replica_state_file = cvm::main()->proxy->join_paths( + pwd, cvm::output_prefix() + ".colvars." + this->name + "." + replica_id + ".state"); // now register this replica @@ -1842,7 +1819,7 @@ template OST &colvarbias_meta::write_state_data_template_(OST &os // this is a very good time to project hills, if you haven't done // it already! - project_hills(new_hills_begin, hills.end(), hills_energy, hills_energy_gradients); + project_hills(new_hills_begin, hills.end(), hills_energy.get(), hills_energy_gradients.get()); new_hills_begin = hills.end(); // write down the grids to the restart file diff --git a/lib/colvars/colvarbias_meta.h b/lib/colvars/colvarbias_meta.h index a765a60c71..57aa21ed6b 100644 --- a/lib/colvars/colvarbias_meta.h +++ b/lib/colvars/colvarbias_meta.h @@ -10,12 +10,16 @@ #ifndef COLVARBIAS_META_H #define COLVARBIAS_META_H -#include -#include #include +#include +#include +#include #include "colvarbias.h" -#include "colvargrid.h" + +class colvar_grid_scalar; +class colvar_grid_gradient; + /// Metadynamics bias (implementation of \link colvarbias \endlink) @@ -123,8 +127,7 @@ protected: hill_iter new_hills_off_grid_begin; /// Regenerate the hills_off_grid list - void recount_hills_off_grid(hill_iter h_first, hill_iter h_last, - colvar_grid_scalar *ge); + void recount_hills_off_grid(hill_iter h_first, hill_iter h_last); template OST &write_hill_template_(OST &os, colvarbias_meta::hill const &h); @@ -211,7 +214,7 @@ protected: bool ebmeta; /// Target distribution for EBmeta - colvar_grid_scalar* target_dist; + std::unique_ptr target_dist; /// Number of equilibration steps for EBmeta cvm::step_number ebmeta_equil_steps; @@ -223,15 +226,14 @@ protected: bool safely_read_restart; /// Hill energy, cached on a grid - colvar_grid_scalar *hills_energy; + std::shared_ptr hills_energy; /// Hill forces, cached on a grid - colvar_grid_gradient *hills_energy_gradients; + std::shared_ptr hills_energy_gradients; - /// \brief Project the selected hills onto grids - void project_hills(hill_iter h_first, hill_iter h_last, - colvar_grid_scalar *ge, colvar_grid_gradient *gf, - bool print_progress = false); + /// Project the selected hills onto grids + void project_hills(hill_iter h_first, hill_iter h_last, colvar_grid_scalar *ge, + colvar_grid_gradient *gf, bool print_progress = false); // Multiple Replicas variables and functions diff --git a/lib/colvars/colvarbias_opes.cpp b/lib/colvars/colvarbias_opes.cpp new file mode 100644 index 0000000000..9caeb967e0 --- /dev/null +++ b/lib/colvars/colvarbias_opes.cpp @@ -0,0 +1,1996 @@ +// This code is mainly adapted from the PLUMED opes module, which uses the +// LGPLv3 license as shown below: +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Copyright (c) 2020-2021 of Michele Invernizzi. + + This file is part of the OPES plumed module. + + The OPES plumed module is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The OPES plumed module 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with plumed. If not, see . ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + +#include "colvarbias_opes.h" +#include "colvarbias.h" +#include "colvardeps.h" +#include "colvarproxy.h" +#include "colvars_memstream.h" +#include "colvargrid.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +colvarbias_opes::colvarbias_opes(char const *key): + colvarbias(key), m_kbt(0), m_barrier(0), m_biasfactor(0), + m_bias_prefactor(0), m_temperature(0), + m_pace(0), m_adaptive_sigma_stride(0), + m_adaptive_counter(0), m_counter(1), + m_compression_threshold(0), m_compression_threshold2(0), + m_adaptive_sigma(false), m_fixed_sigma(false), + m_no_zed(false), m_nlist(false), m_recursive_merge(true), + m_nlist_param(2, 0), m_epsilon(0), m_sum_weights(0), + m_sum_weights2(0), m_cutoff(0), m_cutoff2(0), + m_zed(1), m_old_kdenorm(0), m_kdenorm(0), + m_val_at_cutoff(0), m_nlist_center(0), m_nlist_index(0), + m_nlist_steps(0), m_nlist_update(false), + m_nlist_pace_reset(false), m_nker(0), m_calc_work(false), + m_work(0), comm(single_replica), m_num_walkers(1), + m_num_threads(1), m_nlker(0), m_traj_output_frequency(0), + m_traj_line(traj_line{0}), m_is_first_step(true), + m_pmf_grid_on(false), m_reweight_grid(nullptr), + m_pmf_grid(nullptr), m_pmf_hist_freq(0), m_pmf_shared(true), + m_explore(false), m_inf_biasfactor(false) +{ +#ifdef OPES_THREADING + provide(f_cvb_smp, cvm::proxy->get_smp_mode() == colvarproxy_smp::smp_mode_t::inner_loop); + if (is_available(f_cv_smp)){ + enable(f_cvb_smp); // Enabled by default + } +#endif +} + +int colvarbias_opes::init(const std::string& conf) { + int error_code = colvarbias::init(conf); + enable(f_cvb_scalar_variables); + get_keyval_feature(this, conf, "applyBias", f_cvb_apply_force, true); + m_temperature = cvm::proxy->target_temperature(); + m_kbt = m_temperature * cvm::proxy->boltzmann(); + get_keyval(conf, "newHillFrequency", m_pace); + get_keyval(conf, "barrier", m_barrier); + get_keyval(conf, "explore", m_explore, false); + if (m_barrier < 0) { + return cvm::error("the barrier should be greater than zero", COLVARS_INPUT_ERROR); + } + std::string biasfactor_str; + get_keyval(conf, "biasfactor", biasfactor_str); + if ((cvm::proxy->target_temperature() == 0.0) && cvm::proxy->simulation_running()) { + cvm::log("WARNING: OPES should not be run without a thermostat or at 0 Kelvin!\n"); + } + m_biasfactor = m_barrier / m_kbt; + m_inf_biasfactor = biasfactor_str == "inf" || biasfactor_str == "INF"; + if (m_inf_biasfactor) { + m_biasfactor = std::numeric_limits::infinity(); + m_bias_prefactor = 1; + if (m_explore) { + return cvm::error("biasfactor cannot be infinity in the explore mode."); + } + } else { + if (biasfactor_str.size() > 0) { + try { + m_biasfactor = std::stod(biasfactor_str); + } catch (const std::exception& e) { + return cvm::error(e.what(), COLVARS_INPUT_ERROR); + } + } + if (m_biasfactor <= 1.0) { + return cvm::error("biasfactor must be greater than one (use \"inf\" for uniform target)"); + } + m_bias_prefactor = 1 - 1.0 / m_biasfactor; + } + if (m_explore) { + m_bias_prefactor = m_biasfactor - 1; + } + get_keyval(conf, "adaptiveSigma", m_adaptive_sigma, false); + m_sigma0.resize(num_variables()); + get_keyval(conf, "gaussianSigma", m_sigma0, std::vector(num_variables())); + m_av_cv.assign(num_variables(), 0); + m_av_M2.assign(num_variables(), 0); + if (m_adaptive_sigma) { + get_keyval(conf, "adaptiveSigmaStride", m_adaptive_sigma_stride, 0); + if (m_inf_biasfactor) { + return cvm::error("cannot use infinite biasfactor with adaptive sigma", + COLVARS_INPUT_ERROR); + } + if (m_adaptive_sigma_stride == 0) { + m_adaptive_sigma_stride = m_pace * 10; + } + if (m_adaptive_sigma_stride < m_pace) { + return cvm::error("It is better to choose an adaptiveSigmaStride >= newHillFrequency.\n", COLVARS_INPUT_ERROR); + } + } else { + if (m_sigma0.size() != num_variables()) { + return cvm::error("number of sigma parameters does not match the number of variables", + COLVARS_INPUT_ERROR); + } + if (m_explore) { + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] *= std::sqrt(m_biasfactor); + } + } + } + get_keyval(conf, "gaussianSigmaMin", m_sigma_min); + if ((m_sigma_min.size() != 0) && (m_sigma_min.size() != num_variables())) { + return cvm::error("incorrect number of parameters of gaussianSigmaMin"); + } + if (m_sigma_min.size() > 0 && !m_adaptive_sigma) { + for (size_t i = 0; i < num_variables(); ++i) { + if (m_sigma_min[i] > m_sigma0[i]) { + return cvm::error("gaussianSigmaMin of variable " + cvm::to_str(i) + " should be smaller than sigma"); + } + } + } + get_keyval(conf, "epsilon", m_epsilon, std::exp(-m_barrier/m_bias_prefactor/m_kbt)); + if (m_epsilon <= 0) { + return cvm::error("you must choose a value of epsilon greater than zero"); + } + m_sum_weights = std::pow(m_epsilon, m_bias_prefactor); + m_sum_weights2 = m_sum_weights * m_sum_weights; + if (m_explore) { + get_keyval(conf, "kernelCutoff", m_cutoff, std::sqrt(2.0*m_barrier/m_kbt)); + } else { + get_keyval(conf, "kernelCutoff", m_cutoff, std::sqrt(2.0*m_barrier/m_bias_prefactor/m_kbt)); + } + if (m_cutoff <= 0) { + return cvm::error("you must choose a value of kernelCutoff greater than zero"); + } + m_cutoff2 = m_cutoff * m_cutoff; + m_val_at_cutoff = std::exp(-0.5 * m_cutoff2); + get_keyval(conf, "compressionThreshold", m_compression_threshold, 1); + if (m_compression_threshold != 0) { + if (m_compression_threshold < 0 || m_compression_threshold > m_cutoff) { + return cvm::error("compressionThreshold cannot be smaller than 0 or larger than kernelCutoff", COLVARS_INPUT_ERROR); + } + } + m_compression_threshold2 = m_compression_threshold * m_compression_threshold; + get_keyval(conf, "neighborList", m_nlist, false); + if (m_nlist) { + get_keyval(conf, "neighborListNewHillReset", m_nlist_pace_reset, false); + std::vector nlist_param; + get_keyval(conf, "neighborListParameters", nlist_param, std::vector()); + if (nlist_param.empty()) { + m_nlist_param[0] = 3.0; //*cutoff2_ -> max distance of neighbors + m_nlist_param[1] = 0.5; //*nlist_dev2_[i] -> condition for rebuilding + } else { + if (nlist_param.size() != 2) { + return cvm::error("two cutoff parameters are needed for the neighbor list", COLVARS_INPUT_ERROR); + } + if (nlist_param[0] <= 1.0) { + return cvm::error("the first of neighborListParam must be greater than 1.0. The smaller the first, the smaller should be the second as well", COLVARS_INPUT_ERROR); + } + const cvm::real min_PARAM_1 = (1.-1./std::sqrt(nlist_param[0]))+0.16; + if (nlist_param[1] <= 0) { + return cvm::error("the second of neighborListParam must be greater than 0", COLVARS_INPUT_ERROR); + } + if (nlist_param[1] > min_PARAM_1) { + return cvm::error("the second of neighborListParam must be smaller to avoid systematic errors. Largest suggested value is: 1.16-1/sqrt(param_0) = " + cvm::to_str(min_PARAM_1), COLVARS_INPUT_ERROR); + } + m_nlist_param = nlist_param; + } + m_nlist_center.resize(num_variables()); + m_nlist_dev2.resize(num_variables(), 0); + m_nlist_steps = 0; + m_nlist_update = true; + } + get_keyval(conf, "noZed", m_no_zed, false); + if (m_no_zed) { + m_sum_weights = 1; + m_sum_weights2 = 1; + } + get_keyval(conf, "fixedGaussianSigma", m_fixed_sigma, false); + get_keyval(conf, "recursiveMerge", m_recursive_merge, true); + get_keyval(conf, "calcWork", m_calc_work, false); + bool b_replicas = false; + get_keyval(conf, "multipleReplicas", b_replicas, false); + +#ifdef OPES_THREADING + get_keyval_feature(this, conf, "smp", f_cvb_smp, is_enabled(f_cvb_smp)); + if (is_enabled(f_cv_smp)) { + m_num_threads = cvm::proxy->smp_num_threads(); + } else { + m_num_threads = 1; + } +#else + // if (m_num_threads > 1) { + // return cvm::error("Multithreading in OPES is not compiled.\n"); + // } + m_num_threads = 1; +#endif + bool serial = false; + get_keyval(conf, "serial", serial, false); + if (serial) m_num_threads = 1; + comm = b_replicas ? multiple_replicas : single_replica; + if (comm == multiple_replicas) { + colvarproxy *proxy = cvm::main()->proxy; + get_keyval(conf, "replicaID", replica_id, replica_id); + get_keyval(conf, "sharedFreq", shared_freq, output_freq); + if (!replica_id.size()) { + if (proxy->check_replicas_enabled() == COLVARS_OK) { + // Obtain replicaID from the communicator + replica_id = cvm::to_str(proxy->replica_index()); + cvm::log("Setting replicaID from communication layer: replicaID = "+ + replica_id+".\n"); + } else { + return cvm::error("Error: using more than one replica, but replicaID " + "could not be obtained.\n", COLVARS_INPUT_ERROR); + } + } + m_num_walkers = proxy->num_replicas(); + } + get_keyval(conf, "pmf", m_pmf_grid_on, false); + if (m_pmf_grid_on) { + std::vector pmf_cv_name; + get_keyval(conf, "pmfColvars", pmf_cv_name); + for (auto it = pmf_cv_name.begin(); it != pmf_cv_name.end(); ++it) { + bool found = false; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->name == (*it)) { + if (variables(i)->enable(f_cv_grid) != COLVARS_OK) { + return cvm::error("CV " + (*it) + " does not support grid\n"); + } + m_pmf_cvs.push_back(variables(i)); + found = true; + break; + } + } + if (!found) { + return cvm::error("CV " + (*it) + " not found\n"); + } + } + key_lookup(conf, "grid", &grid_conf); + m_reweight_grid.reset(new colvar_grid_scalar(m_pmf_cvs, nullptr, false, grid_conf)); + m_pmf_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + get_keyval(conf, "pmfHistoryFrequency", m_pmf_hist_freq, 0); + if (comm == multiple_replicas) { + get_keyval(conf, "pmfShared", m_pmf_shared, true); + if (m_pmf_shared) { + m_global_reweight_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + m_global_pmf_grid.reset(new colvar_grid_scalar(m_pmf_cvs, m_reweight_grid)); + } + } + } + m_kdenorm = m_explore? m_counter : m_sum_weights; + m_old_kdenorm = m_kdenorm; + m_traj_line.rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.zed = m_zed; + m_traj_line.neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_traj_line.nker = m_kernels.size(); + get_keyval(conf, "printTrajectoryFrequency", m_traj_output_frequency, cvm::cv_traj_freq); + m_cv.resize(num_variables(), 0); + showInfo(); + return error_code; +} + +void colvarbias_opes::showInfo() const { + // Print information about this bias + auto printInfo = [&](const std::string& info, const std::string& val){ + cvm::log(this->name + ": " + info + val + "\n"); + }; + printInfo("temperature = ", cvm::to_str(m_kbt / cvm::proxy->boltzmann())); + printInfo("beta = ", cvm::to_str(1.0 / m_kbt)); + printInfo("depositing new kernels with newHillFrequency = ", cvm::to_str(m_pace)); + printInfo("expected barrier is ", cvm::to_str(m_barrier)); + printInfo("using target distribution with biasfactor (gamma) = ", m_inf_biasfactor ? "inf" : cvm::to_str(m_biasfactor)); + if (m_inf_biasfactor) { + cvm::log(" (thus a uniform flat target distribution, no well-tempering)\n"); + cvm::log(this->name + ": " + "the equivalent bias temperature = inf\n"); + } else { + cvm::log(this->name + ": " + "the equivalent bias temperature = " + cvm::to_str(cvm::proxy->target_temperature() * (m_biasfactor - 1))); + } + if (m_adaptive_sigma) { + printInfo("adaptive sigma will be used, with adaptiveSigmaStride = ", cvm::to_str(m_adaptive_sigma_stride)); + size_t x = std::ceil(m_adaptive_sigma_stride / m_pace); + printInfo(" thus the first x kernel depositions will be skipped, x = adaptiveSigmaStride/newHillFrequency = ", cvm::to_str(x)); + } else { + std::string sigmas; + for (size_t i = 0; i < num_variables(); ++i) { + sigmas += " " + cvm::to_str(m_sigma0[i]); + } + cvm::log(this->name + ": kernels have initial gaussianSigma = " + sigmas + "\n"); + } + if (m_fixed_sigma) { + cvm::log(this->name + " fixedGaussianSigma: gaussianSigma will not decrease as the simulation proceeds\n"); + } + printInfo("kernels are truncated with kernelCutoff = ", cvm::to_str(m_cutoff)); + if (m_cutoff < 3.5) { + cvm::log(this->name + " +++ WARNING +++ probably kernels are truncated too much\n"); + } + printInfo("the value at cutoff is = ", cvm::to_str(m_val_at_cutoff)); + printInfo("regularization epsilon = ", cvm::to_str(m_epsilon)); + if (m_val_at_cutoff > m_epsilon*(1+1e-6)) { + cvm::log(this->name + " +++ WARNING +++ the kernelCutoff might be too small for the given epsilon\n"); + } + printInfo("kernels will be compressed when closer than compression_threshold = ", cvm::to_str(m_compression_threshold)); + if (m_compression_threshold2 == 0) { + cvm::log(this->name + " +++ WARNING +++ kernels will never merge, expect slowdowns\n"); + } + if (!m_recursive_merge) { + cvm::log(this->name + " -- RECURSIVE_MERGE_OFF: only one merge for each new kernel will be attempted. This is faster only if total number of kernels does not grow too much\n"); + } + if (m_nlist) { + cvm::log(this->name + " neighborList: using neighbor list for kernels, with parameters: " + cvm::to_str(m_nlist_param[0]) + " " + cvm::to_str(m_nlist_param[1]) + "\n"); + if (m_nlist_pace_reset) { + cvm::log(this->name + " neighborListNewHillReset: forcing the neighbor list to update every time when depositing a new hill\n"); + } + } + if (m_no_zed) { + printInfo("noZed: using fixed normalization factor = ", cvm::to_str(m_zed)); + } + if (comm == multiple_replicas && m_num_walkers > 1) { + cvm::log(this->name + " if multiple replicas are present, they will share the same bias\n"); + } + if (m_num_threads > 1) { + printInfo("using multiple threads per simulation: ", cvm::to_str(m_num_threads)); + } + cvm::main()->cite_feature("OPES"); + if (m_adaptive_sigma || m_explore) { + cvm::main()->cite_feature("OPES explore or adaptive kernels"); + } +} + +cvm::real colvarbias_opes::evaluateKernel( + const colvarbias_opes::kernel& G, + const std::vector& x) const { + cvm::real norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + const cvm::real dist2_i = variables(i)->dist2(G.m_center[i], x[i]) / (G.m_sigma[i] * G.m_sigma[i]); + norm2 += dist2_i; + if (norm2 >= m_cutoff2) { + return 0; + } + } + return G.m_height * (std::exp(-0.5 * norm2) - m_val_at_cutoff); +} + +cvm::real colvarbias_opes::evaluateKernel( + const colvarbias_opes::kernel& G, + const std::vector& x, + std::vector& accumulated_derivative, + std::vector& dist) const { + cvm::real norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + dist[i] = 0.5 * variables(i)->dist2_lgrad(x[i], G.m_center[i]) / G.m_sigma[i]; + norm2 += dist[i] * dist[i]; + if (norm2 >= m_cutoff2) { + return 0; + } + } + const cvm::real val = G.m_height * (std::exp(-0.5 * norm2) - m_val_at_cutoff); + // The derivative of norm2 with respect to x + for (size_t i = 0; i < num_variables(); ++i) { + accumulated_derivative[i] -= val * dist[i] / G.m_sigma[i]; + } + return val; +} + +cvm::real colvarbias_opes::getProbAndDerivatives( + const std::vector& cv, std::vector& der_prob) const { + double prob = 0.0; + std::vector dist(num_variables(), 0); + if (!m_nlist) { + if (m_num_threads == 1 || m_kernels.size() < 2 * m_num_threads) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + prob += evaluateKernel(m_kernels[k], cv, der_prob, dist); + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector omp_deriv(der_prob.size(), 0); + std::vector tmp_dist(num_variables()); + #pragma omp for reduction(+:prob) nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + prob += evaluateKernel(m_kernels[k], cv, omp_deriv, tmp_dist); + } + #pragma omp critical + for (int i = 0; i < static_cast(num_variables()); ++i) { + der_prob[i]+=omp_deriv[i]; + } + #pragma omp single + for (int i = 0; i < static_cast(num_variables()); ++i) { + dist[i] = tmp_dist[i]; + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Test this once fine-grained parallelization is enabled + std::vector> derivs(m_num_threads, std::vector(num_variables(), 0)); + std::vector> dists(m_num_threads, std::vector(num_variables(), 0)); + auto worker = [&](int start, int end, void* result){ + const int tid = cvm::proxy->smp_thread_id(); + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + tmp_prob += evaluateKernel(m_kernels[i], cv, derivs[tid], dists[tid]); + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &prob, CKLOOP_DOUBLE_SUM, NULL); + for (size_t i = 0; i < num_variables(); ++i) { + for (size_t j = 0; j < m_num_threads; ++j) { + if (j == 0) dist[i] = dists[j][i]; + der_prob[i] += derivs[j][i]; + } + } +#else + cvm::error("multiple threads required in OPES, but this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1 || m_nlist_index.size() < 2 * m_num_threads) { + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + const size_t k = m_nlist_index[nk]; + prob += evaluateKernel(m_kernels[k], cv, der_prob, dist); + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector omp_deriv(der_prob.size(), 0); + std::vector tmp_dist(num_variables()); + #pragma omp for reduction(+:prob) nowait + for (int nk = 0; nk < static_cast(m_nlist_index.size()); ++nk) { + const size_t k = m_nlist_index[nk]; + prob += evaluateKernel(m_kernels[k], cv, omp_deriv, tmp_dist); + } + #pragma omp critical + for (int i = 0; i < static_cast(num_variables()); ++i) { + der_prob[i]+=omp_deriv[i]; + } + #pragma omp single + for (int i = 0; i < static_cast(num_variables()); ++i) { + dist[i] = tmp_dist[i]; + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Test this once fine-grained parallelization is enabled + std::vector> derivs(m_num_threads, std::vector(num_variables(), 0)); + std::vector> dists(m_num_threads, std::vector(num_variables(), 0)); + auto worker = [&](int start, int end, void* result){ + const int tid = cvm::proxy->smp_thread_id(); + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + const size_t k = m_nlist_index[i]; + tmp_prob += evaluateKernel(m_kernels[k], cv, derivs[tid], dists[tid]); + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &prob, CKLOOP_DOUBLE_SUM, NULL); + for (size_t i = 0; i < num_variables(); ++i) { + for (size_t j = 0; j < m_num_threads; ++j) { + if (j == 0) dist[i] = dists[j][i]; + der_prob[i] += derivs[j][i]; + } + } +#else + cvm::error("multiple threads required in OPES, but this binary is not linked with a supported threading library.\n"); +#endif + } + } + prob /= m_kdenorm; + for (size_t i = 0; i < num_variables(); ++i) { + der_prob[i] /= m_kdenorm; + } + return prob; +} + +int colvarbias_opes::calculate_opes() { + if (m_nlist) { + ++m_nlist_steps; + const bool exchange_step = + (comm == multiple_replicas) && + cvm::step_absolute() % shared_freq == 0; + if (exchange_step) { + m_nlist_update = true; + } else { + for (size_t i = 0; i < num_variables(); ++i) { + const cvm::real diff_i2 = variables(i)->dist2(m_cv[i], m_nlist_center[i]); + if (diff_i2 > m_nlist_param[1] * m_nlist_dev2[i]) { + m_nlist_update = true; + break; + } + } + } + if (m_nlist_update) { + updateNlist(m_cv); + } + } + std::vector der_prob(num_variables(), 0); + const cvm::real prob = getProbAndDerivatives(m_cv, der_prob); + const cvm::real bias = m_kbt * m_bias_prefactor * cvm::logn(prob / m_zed + m_epsilon); + bias_energy = bias; + if (is_enabled(f_cvb_apply_force)) { + for (size_t i = 0; i < num_variables(); ++i) { + colvar_forces[i] = -m_kbt * m_bias_prefactor / (prob / m_zed + m_epsilon) * der_prob[i] / m_zed; + } + } + return COLVARS_OK; +} + +int colvarbias_opes::update_opes() { + if (m_adaptive_sigma) { + m_adaptive_counter++; + cvm::step_number tau = m_adaptive_sigma_stride; + if (m_adaptive_counter < m_adaptive_sigma_stride) tau = m_adaptive_counter; + for (size_t i = 0; i < num_variables(); ++i) { + // Welford's online algorithm for standard deviation + const cvm::real diff_i = 0.5 * variables(i)->dist2_lgrad(m_cv[i], m_av_cv[i]); + m_av_cv[i] += diff_i / tau; + m_av_M2[i] += diff_i * 0.5 * variables(i)->dist2_lgrad(m_cv[i], m_av_cv[i]); + } + if (m_adaptive_counter < m_adaptive_sigma_stride && m_counter == 1) { + return COLVARS_OK;; + } + } + if (cvm::step_absolute() % m_pace == 0) { + m_old_kdenorm = m_kdenorm; + m_delta_kernels.clear(); + const size_t old_nker = m_kernels.size(); + // TODO: how could I account for extra biases in Colvars? + const cvm::real log_weight = bias_energy / m_kbt; + cvm::real height = cvm::exp(log_weight); + cvm::real sum_heights = height; + cvm::real sum_heights2 = height * height; + if (m_num_walkers > 1) { + std::vector replica_sum_heights(cvm::proxy->num_replicas() - 1, 0); + // Send all sum_heights to PE 0 + if (cvm::proxy->replica_index() == 0) { + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(replica_sum_heights[p - 1]), sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&sum_heights, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights to replica 0."); + } + } + cvm::proxy->replica_comm_barrier(); + // PE 0 sum all sum_heights and broadcast + if (cvm::proxy->replica_index() == 0) { + for (auto it = replica_sum_heights.begin(); it != replica_sum_heights.end(); ++it) { + sum_heights += (*it); + } + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)&sum_heights, sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights to replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_recv((char*)&sum_heights, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights from replica 0."); + } + } + cvm::proxy->replica_comm_barrier(); + // Send all sum_heights2 to PE 0 + std::vector replica_sum_heights2(cvm::proxy->num_replicas() - 1, 0); + if (cvm::proxy->replica_index() == 0) { + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(replica_sum_heights2[p - 1]), sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: getting sum of weights2 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&sum_heights2, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights2 from replica."); + } + } + cvm::proxy->replica_comm_barrier(); + // PE 0 sum all sum_heights2 and broadcast + if (cvm::proxy->replica_index() == 0) { + for (auto it = replica_sum_heights2.begin(); it != replica_sum_heights2.end(); ++it) { + sum_heights2 += (*it); + } + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)&sum_heights2, sizeof(cvm::real), p) != sizeof(cvm::real)) { + return cvm::error("Error: sending sum of weights2 to replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_recv((char*)&sum_heights2, sizeof(cvm::real), 0) != sizeof(cvm::real)) { + return cvm::error("Error: receiving sum of weights2 from replica."); + } + } + cvm::proxy->replica_comm_barrier(); + } + m_counter += m_num_walkers; + m_sum_weights += sum_heights; + m_sum_weights2 += sum_heights2; + m_neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.neff = m_neff; + m_traj_line.rct = m_rct; + if (m_explore) { + m_kdenorm = m_counter; + height = 1.0; + } else { + m_kdenorm = m_sum_weights; + } + std::vector sigma = m_sigma0; + if (m_adaptive_sigma) { + const cvm::real factor = m_explore ? 1.0 : m_biasfactor; + if (m_counter == 1 + m_num_walkers) { + for (size_t i = 0; i < num_variables(); ++i) { + m_av_M2[i] *= m_biasfactor; + } + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] = std::sqrt(m_av_M2[i] / m_adaptive_counter / factor); + } + if (m_sigma_min.size() == 0) { + for (size_t i = 0; i < num_variables(); ++i) { + if (m_sigma0[i] < 1e-6) { + cvm::error("Adaptive sigma is suspiciously small for CV " + cvm::to_str(i) + "\nManually provide sigma or set a safe sigma_min to avoid possible issues\n"); + return COLVARS_ERROR; + } + } + } else { + for (size_t i = 0; i < num_variables(); ++i) { + m_sigma0[i] = std::max(m_sigma0[i], m_sigma_min[i]); + } + } + } + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::sqrt(m_av_M2[i] / m_adaptive_counter / factor); + } + if (m_sigma_min.size() == 0) { + bool sigma_less_than_threshold = false; + for (size_t i = 0; i < num_variables(); ++i) { + if (sigma[i] < 1e-6) { + cvm::log("The adaptive sigma is suspiciously small, you should set a safe sigma_min. 1e-6 will be used here\n"); + sigma[i] = 1e-6; + sigma_less_than_threshold = true; + } + } + if (sigma_less_than_threshold) { + m_sigma_min.assign(num_variables(), 1e-6); + } + } else { + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::max(sigma[i], m_sigma_min[i]); + } + } + } + if (!m_fixed_sigma) { + const cvm::real size = m_explore ? m_counter : m_neff; + const size_t ncv = num_variables(); + const cvm::real s_rescaling = std::pow(size * (ncv + 2.0) / 4, -1.0 / (4.0 + ncv)); + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] *= s_rescaling; + } + if (m_sigma_min.size() > 0) { + for (size_t i = 0; i < num_variables(); ++i) { + sigma[i] = std::max(sigma[i], m_sigma_min[i]); + } + } + } + // the height should be divided by sqrt(2*pi)*sigma0_, + // but this overall factor would be canceled when dividing by Zed + // thus we skip it altogether, but keep any other sigma rescaling + for (size_t i = 0; i < num_variables(); ++i) { + height *= (m_sigma0[i] / sigma[i]); + } + if (m_num_walkers == 1) { + addKernel(height, m_cv, sigma, log_weight); + } else { + std::vector all_height(m_num_walkers, 0.0); + std::vector all_center(m_num_walkers * num_variables(), 0.0); + std::vector all_sigma(m_num_walkers * num_variables(), 0.0); + std::vector all_logweight(m_num_walkers, 0.0); + const int my_replica = cvm::proxy->replica_index(); + + // Allgather of heights + if (my_replica == 0) { + all_height[0] = height; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_height[p]), sizeof(decltype(all_height)::value_type), p) != sizeof(decltype(all_height)::value_type)) { + return cvm::error("Error: on receiving height on replica 0 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&height, sizeof(decltype(height)), 0) != sizeof(cvm::real)) { + return cvm::error("Error: on sending height to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast heights + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_height)::value_type) * all_height.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_height.data(), send_size, p) != send_size) { + return cvm::error("Error: on sending heights from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_height)::value_type) * all_height.size(); + if (cvm::proxy->replica_comm_recv((char*)all_height.data(), recv_size, 0) != recv_size) { + return cvm::error("Error: on receiving heights from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of centers + if (my_replica == 0) { + std::copy(m_cv.begin(), m_cv.end(), all_center.begin()); + const int recv_size = sizeof(decltype(m_cv)::value_type) * m_cv.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + cvm::real* recv_start_ptr = &(all_center[p * m_cv.size()]); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving centers from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(m_cv)::value_type) * m_cv.size(); + if (cvm::proxy->replica_comm_send((char*)m_cv.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending centers to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast centers + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_center)::value_type) * all_center.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_center.data(), send_size, p) != send_size) { + return cvm::error("Error on sending centers from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_center)::value_type) * all_center.size(); + if (cvm::proxy->replica_comm_recv((char*)all_center.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving centers from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of sigmas + if (my_replica == 0) { + std::copy(sigma.begin(), sigma.end(), all_sigma.begin()); + const int recv_size = sizeof(decltype(sigma)::value_type) * sigma.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + cvm::real* recv_start_ptr = &(all_sigma[p * m_cv.size()]); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving sigmas from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(sigma)::value_type) * sigma.size(); + if (cvm::proxy->replica_comm_send((char*)sigma.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending sigmas to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast sigmas + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_sigma)::value_type) * all_sigma.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_sigma.data(), send_size, p) != send_size) { + return cvm::error("Error on sending sigmas from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_sigma)::value_type) * all_sigma.size(); + if (cvm::proxy->replica_comm_recv((char*)all_sigma.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving sigmas from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + // Allgather of logweights + if (my_replica == 0) { + all_logweight[0] = log_weight; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_logweight[p]), sizeof(decltype(all_logweight)::value_type), p) != sizeof(decltype(all_logweight)::value_type)) { + return cvm::error("Error on receiving log_weight on replica 0 from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)&log_weight, sizeof(decltype(log_weight)), 0) != sizeof(cvm::real)) { + return cvm::error("Error on sending log_weight to replica 0 from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast log_weight + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_logweight)::value_type) * all_logweight.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_logweight.data(), send_size, p) != send_size) { + return cvm::error("Error on sending log_weight from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_logweight)::value_type) * all_logweight.size(); + if (cvm::proxy->replica_comm_recv((char*)all_logweight.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving log_weight from replica 0 to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + + if (m_nlist) { + std::vector all_nlist_size(m_num_walkers); + const int my_replica = cvm::proxy->replica_index(); + // Get the size of the neighbor list of each replica + if (my_replica == 0) { + all_nlist_size[0] = m_nlist_index.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_recv((char*)&(all_nlist_size[p]), sizeof(int), p) != sizeof(int)) { + return cvm::error("Error on receiving neighbor list size from replica " + cvm::to_str(p)); + } + } + } else { + const int nlist_size = m_nlist_index.size(); + if (cvm::proxy->replica_comm_send((char*)&nlist_size, sizeof(int), 0) != sizeof(int)) { + return cvm::error("Error on sending neighbor list size from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast the neighbor list sizes to all replicas + if (my_replica == 0) { + const int send_size = sizeof(int) * all_nlist_size.size(); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_nlist_size.data(), send_size, p) != send_size) { + return cvm::error("Error on sending neighbor list sizes from replica 0 to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(int) * all_nlist_size.size(); + if (cvm::proxy->replica_comm_recv((char*)all_nlist_size.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving neighbor list sizes to replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Gather all neighbor lists from replicas + const int tot_size = std::accumulate(all_nlist_size.begin(), all_nlist_size.end(), 0); + if (tot_size > 0) { + // Allgatherv all neighbor lists from replicas + std::vector all_nlist_index(tot_size); + if (my_replica == 0) { + std::vector recv_start(m_num_walkers); + // Accumulative sum + recv_start[0] = 0; + std::partial_sum(all_nlist_size.begin(), all_nlist_size.end() - 1, recv_start.begin() + 1); + std::copy(m_nlist_index.begin(), m_nlist_index.end(), all_nlist_index.begin()); + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + size_t* recv_start_ptr = &(all_nlist_index[recv_start[p]]); + const int recv_size = all_nlist_size[p] * sizeof(decltype(all_nlist_index)::value_type); + if (cvm::proxy->replica_comm_recv((char*)recv_start_ptr, recv_size, p) != recv_size) { + return cvm::error("Error on receiving neighbor list from replica " + cvm::to_str(p)); + } + } + } else { + const int send_size = sizeof(decltype(m_nlist_index)::value_type) * m_nlist_index.size(); + if (cvm::proxy->replica_comm_send((char*)m_nlist_index.data(), send_size, 0) != send_size) { + return cvm::error("Error on sending neighbor list from replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast the neighbor list + if (my_replica == 0) { + const int send_size = sizeof(decltype(all_nlist_index)::value_type) * tot_size; + for (int p = 1; p < cvm::proxy->num_replicas(); ++p) { + if (cvm::proxy->replica_comm_send((char*)all_nlist_index.data(), send_size, p) != send_size) { + return cvm::error("Error on sending total neighbor list to replica " + cvm::to_str(p)); + } + } + } else { + const int recv_size = sizeof(decltype(all_nlist_index)::value_type) * tot_size; + if (cvm::proxy->replica_comm_recv((char*)all_nlist_index.data(), recv_size, 0) != recv_size) { + return cvm::error("Error on receiving total neighbor list on replica " + cvm::to_str(my_replica)); + } + } + cvm::proxy->replica_comm_barrier(); + // Deduplicate and sort the merged neighbor list + std::unordered_set all_nlist_index_set; + for (auto it = all_nlist_index.cbegin(); it != all_nlist_index.cend(); ++it) { + all_nlist_index_set.insert(*it); + } + m_nlist_index.assign(all_nlist_index_set.begin(), all_nlist_index_set.end()); + std::sort(m_nlist_index.begin(), m_nlist_index.end()); + } + } + for (size_t w = 0; w < m_num_walkers; ++w) { + std::vector center_w( + all_center.begin() + num_variables() * w, + all_center.begin() + num_variables() * (w + 1)); + std::vector sigma_w( + all_sigma.begin() + num_variables() * w, + all_sigma.begin() + num_variables() * (w + 1)); + addKernel(all_height[w], center_w, sigma_w, all_logweight[w]); + } + } + m_nker = m_kernels.size(); + m_traj_line.nker = m_nker; + if (m_nlist) { + m_nlker = m_nlist_index.size(); + m_traj_line.nlker = m_nlker; + if (m_nlist_pace_reset) { + m_nlist_update = true; + } + } + if (!m_no_zed) { + cvm::real sum_uprob = 0; + const size_t ks = m_kernels.size(); + const size_t ds = m_delta_kernels.size(); + const int num_parallel = 1; // Always 1 + const bool few_kernels = (ks * ks < (3 * ks * ds + 2 * ds * ds * num_parallel + 100)); + if (few_kernels) { + if (m_num_threads == 1) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + for (size_t kk = 0; kk < m_kernels.size(); ++kk) { + sum_uprob += evaluateKernel(m_kernels[kk], m_kernels[k].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:sum_uprob) nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + for (int kk = 0; kk < static_cast(m_kernels.size()); ++kk) { + sum_uprob += evaluateKernel(m_kernels[kk], m_kernels[k].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // TODO: Does this work?? + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + for (size_t kk = 0; kk < m_kernels.size(); ++kk) { + tmp_prob += evaluateKernel(m_kernels[kk], m_kernels[i].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + if (num_parallel > 1) { + return cvm::error("Unimplemented feature: OPES in parallel running.\n"); + } + } else { + cvm::real delta_sum_uprob = 0; + if (!m_nlist) { + if (m_num_threads == 1) { + for (size_t i = 0; i < m_kernels.size(); ++i) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) nowait + for (int i = 0; i < static_cast(m_kernels.size()); ++i) { + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += evaluateKernel(m_delta_kernels[d], m_kernels[i].m_center) + sign * evaluateKernel(m_kernels[i], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &delta_sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1) { + for (size_t i = 0; i < m_nlist_index.size(); ++i) { + const size_t k = m_nlist_index[i]; + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) nowait + for (int i = 0; i < static_cast(m_nlist_index.size()); ++i) { + const size_t k = m_nlist_index[i]; + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int i = start; i <= end; ++i) { + const size_t k = m_nlist_index[i]; + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + const double sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += evaluateKernel(m_delta_kernels[d], m_kernels[k].m_center) + sign * evaluateKernel(m_kernels[k], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &delta_sum_uprob, CKLOOP_DOUBLE_SUM, NULL); +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } + if (num_parallel > 1) { + return cvm::error("Unimplemented feature: OPES in parallel running.\n"); + } + if (m_num_threads == 1) { + for (size_t d = 0; d < m_delta_kernels.size(); ++d) { + for (size_t dd = 0; dd < m_delta_kernels.size(); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob -= sign *evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + #pragma omp for reduction(+:delta_sum_uprob) + for (int d = 0; d < static_cast(m_delta_kernels.size()); ++d) { + for (int dd = 0; dd < static_cast(m_delta_kernels.size()); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + delta_sum_uprob -= sign * evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + auto worker = [&](int start, int end, void* result) { + double tmp_prob = 0; + for (int d = start; d <= end; ++d) { + for (size_t dd = 0; dd < m_delta_kernels.size(); ++dd) { + const int sign = m_delta_kernels[d].m_height < 0 ? -1 : 1; + tmp_prob += sign * evaluateKernel(m_delta_kernels[dd], m_delta_kernels[d].m_center); + } + } + *(double *)result = tmp_prob; + }; + const size_t numChunks = m_delta_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + double tmp = 0; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, &tmp, CKLOOP_DOUBLE_SUM, NULL); + delta_sum_uprob -= tmp; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + sum_uprob = m_zed * m_old_kdenorm * old_nker + delta_sum_uprob; + } + m_zed = sum_uprob / m_kdenorm / m_kernels.size(); + m_traj_line.zed = m_zed; + } + if (m_calc_work) { + std::vector dummy(num_variables()); + const cvm::real prob = getProbAndDerivatives(m_cv, dummy); + const cvm::real new_bias = m_kbt * m_bias_prefactor * cvm::logn(prob / m_zed + m_epsilon); + m_work += new_bias - bias_energy; + m_traj_line.work = m_work; + } + } + return COLVARS_OK; +} + +void colvarbias_opes::save_state() { + if (cvm::step_absolute() % cvm::restart_out_freq == 0) { + m_saved_zed = m_zed; + m_saved_sum_weights = m_sum_weights; + m_saved_sum_weights2 = m_sum_weights2; + m_saved_kernels = m_kernels; + } +} + +int colvarbias_opes::update() { + int error_code = COLVARS_OK; + for (size_t i = 0; i < num_variables(); ++i) { + m_cv[i] = variables(i)->value(); + } + error_code |= calculate_opes(); + // NOTE: I don't think that calling dumpStateToFile() after update in + // the PLUMED implementation is correct for step 0, so I save the + // data after calculate() that does not modify the internal state + // of the bias. + save_state(); + if (error_code != COLVARS_OK) return error_code; + if (m_is_first_step) { + // NOTE: Colvars does not allow chainned biases, so I have to implement + // the PRINT here. Even if OPESmetad::update() is skipped we should + // still call Print::update() + writeTrajBuffer(); + if (m_pmf_grid_on) error_code |= collectSampleToPMFGrid(); + m_is_first_step = false; + return COLVARS_OK; + } + error_code |= update_opes(); + if (error_code != COLVARS_OK) return error_code; + writeTrajBuffer(); // Print::update() + if (m_pmf_grid_on) error_code |= collectSampleToPMFGrid(); + return error_code; +} + +int colvarbias_opes::collectSampleToPMFGrid() { + if (m_reweight_grid) { + // Get the bin index + std::vector bin(m_pmf_cvs.size(), 0); + for (size_t i = 0; i < m_pmf_cvs.size(); ++i) { + bin[i] = m_reweight_grid->current_bin_scalar(i); + } + const cvm::real reweighting_factor = cvm::exp(bias_energy / m_kbt); + if (m_reweight_grid->index_ok(bin)) { + m_reweight_grid->acc_value(bin, reweighting_factor); + } + } + return COLVARS_OK; +} + +template OST& colvarbias_opes::write_state_data_template_(OST &os) const { + std::ios_base::fmtflags f; + const bool formatted = !std::is_same::value; + if (formatted) { + f = os.flags(); + os.setf(std::ios::scientific, std::ios::floatfield); + } + write_state_data_key(os, "opes_metad_" + this->name); + auto printFieldReal = [&](const std::string& s, cvm::real x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + auto printFieldULL = [&](const std::string& s, unsigned long long x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + auto printFieldString = [&](const std::string& s, const std::string& x){ + write_state_data_key(os, s, false); + if (formatted) + os << std::setprecision(cvm::en_prec) << std::setw(cvm::en_width); + os << x; + if (formatted) + os << "\n"; + }; + std::ostringstream oss; + if (m_inf_biasfactor) { + oss << "inf"; + } else { + oss << m_biasfactor; + } + printFieldString("biasfactor", oss.str()); + printFieldReal("epsilon", m_epsilon); + printFieldReal("kernel_cutoff", cvm::sqrt(m_cutoff2)); + printFieldReal("compression_threshold", m_compression_threshold); + printFieldReal("zed", m_saved_zed); + printFieldReal("sum_weights", m_saved_sum_weights); + printFieldReal("sum_weights2", m_saved_sum_weights2); + printFieldULL("counter", m_counter); + if (m_adaptive_sigma) { + printFieldULL("adaptive_counter", m_adaptive_counter); + for (size_t i = 0; i < num_variables(); ++i) { + printFieldReal("sigma0_" + variables(i)->name, m_sigma0[i]); + printFieldReal("av_cv_" + variables(i)->name, m_av_cv[i]); + printFieldReal("av_M2_" + variables(i)->name, m_av_M2[i]); + } + } + printFieldULL("num_hills", m_saved_kernels.size()); + write_state_data_key(os, "hills", false); + if (formatted) os << "{\n"; + for (size_t k = 0; k < m_saved_kernels.size(); ++k) { + if (formatted) os << "{ "; + os << k; + if (formatted) os << " "; + for (size_t i = 0; i < num_variables(); ++i) { + os << m_saved_kernels[k].m_center[i]; + if (formatted) os << " "; + } + for (size_t i = 0; i < num_variables(); ++i) { + os << m_saved_kernels[k].m_sigma[i]; + if (formatted) os << " "; + } + os << m_saved_kernels[k].m_height; + if (formatted) os << " }\n"; + } + if (formatted) os << "}\n"; + if (formatted) os.setf(f); + if (m_pmf_grid_on) { + write_state_data_key(os, "probability_grid"); + m_reweight_grid->write_raw(os, 8); + } + return os; +} + +std::ostream& colvarbias_opes::write_state_data(std::ostream &os) { + try { + auto& s = write_state_data_template_(os); + return s; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return os; +} + +cvm::memory_stream& colvarbias_opes::write_state_data(cvm::memory_stream& os) { + try { + auto& s = write_state_data_template_(os); + return s; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return os; +} + +template IST& colvarbias_opes::read_state_data_template_(IST &is) { + bool const formatted = !std::is_same::value; + std::string tmp_name; + is >> tmp_name; + if (tmp_name.rfind("opes_metad_", 0) != 0) { + throw std::runtime_error("Unknown action name: " + tmp_name + "\n"); + } + auto readFieldString = [&](const std::string& s, std::string& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + auto readFieldReal = [&](const std::string& s, cvm::real& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + auto readFieldULL = [&](const std::string& s, unsigned long long& x){ + std::string field; + is >> field; + if (field.compare(s) == 0) { + is >> x; + } else { + throw std::runtime_error("Expect field \"" + s + "\" , but got \"" + field + "\"\n"); + } + }; + std::string old_biasfactor_str; + cvm::real old_biasfactor; + readFieldString("biasfactor", old_biasfactor_str); + if (old_biasfactor_str == "inf" || old_biasfactor_str == "-inf" || old_biasfactor_str == "+inf" || + old_biasfactor_str == "INF" || old_biasfactor_str == "-INF" || old_biasfactor_str == "+INF") { + old_biasfactor = std::numeric_limits::infinity(); + m_inf_biasfactor = true; + } else { + old_biasfactor = std::stod(old_biasfactor_str); + m_inf_biasfactor = false; + } + if (std::abs(old_biasfactor - m_biasfactor) > 1e-6 * m_biasfactor) { + cvm::log("WARNING: previous bias factor was " + cvm::to_str(old_biasfactor) + + " while now it is " + cvm::to_str(m_biasfactor) + + " (the new one is used).\n"); + } + cvm::real old_epsilon; + readFieldReal("epsilon", old_epsilon); + if (std::abs(old_epsilon - m_epsilon) > 1e-6 * m_epsilon) { + cvm::log("WARNING: previous epsilon was " + cvm::to_str(old_epsilon) + + " while now it is " + cvm::to_str(m_epsilon) + + " (the new one is used).\n"); + } + cvm::real old_cutoff; + readFieldReal("kernel_cutoff", old_cutoff); + if (std::abs(old_cutoff - m_cutoff) > 1e-6 * m_cutoff) { + cvm::log("WARNING: previous cutoff was " + cvm::to_str(old_cutoff) + + " while now it is " + cvm::to_str(m_cutoff) + + " (the new one is used).\n"); + } + m_cutoff2 = m_cutoff * m_cutoff; + cvm::real old_compression_threshold; + readFieldReal("compression_threshold", old_compression_threshold); + if (std::abs(old_compression_threshold - m_compression_threshold) > 1e-6 * m_compression_threshold) { + cvm::log("WARNING: previous cutoff was " + cvm::to_str(old_compression_threshold) + + " while now it is " + cvm::to_str(m_compression_threshold) + + " (the new one is used).\n"); + } + m_compression_threshold2 = m_compression_threshold * m_compression_threshold; + readFieldReal("zed", m_zed); + readFieldReal("sum_weights", m_sum_weights); + readFieldReal("sum_weights2", m_sum_weights2); + unsigned long long tmp_counter = 1; + readFieldULL("counter", tmp_counter); + m_counter = tmp_counter; + if (m_adaptive_sigma) { + readFieldULL("adaptive_counter", tmp_counter); + m_adaptive_counter = tmp_counter; + for (size_t i = 0; i < num_variables(); ++i) { + readFieldReal("sigma0_" + variables(i)->name, m_sigma0[i]); + readFieldReal("av_cv_" + variables(i)->name, m_av_cv[i]); + readFieldReal("av_M2_" + variables(i)->name, m_av_M2[i]); + } + } + unsigned long long kernel_size = 0; + readFieldULL("num_hills", kernel_size); + if (kernel_size > 0) m_kernels.resize(kernel_size); + read_state_data_key(is, "hills"); + auto consume = [&](const std::string& expected_token){ + if (formatted) { + std::string field; + is >> field; + if (field.compare(expected_token) != 0) { + throw std::runtime_error("Expect " + expected_token + " but got " + field + "\n"); + } + } + }; + consume("{"); + for (size_t k = 0; k < m_kernels.size(); ++k) { + consume("{"); + unsigned long long tmp_k = 0; + is >> tmp_k; + if (formatted && k != tmp_k) { + throw std::runtime_error("Corrupt hill data\n"); + } + kernel current_kernel; + current_kernel.m_center.resize(num_variables()); + current_kernel.m_sigma.resize(num_variables()); + for (size_t i = 0; i < num_variables(); ++i) { + is >> current_kernel.m_center[i]; + } + for (size_t i = 0; i < num_variables(); ++i) { + is >> current_kernel.m_sigma[i]; + } + is >> current_kernel.m_height; + m_kernels[k] = current_kernel; + consume("}"); + } + consume("}"); + if (m_pmf_grid_on) { + read_state_data_key(is, "probability_grid"); + m_reweight_grid->read_raw(is); + } + m_kdenorm = m_explore ? m_counter : m_sum_weights; + m_traj_line.rct = m_kbt * cvm::logn(m_sum_weights / m_counter); + m_traj_line.zed = m_zed; + m_traj_line.neff = (1 + m_sum_weights) * (1 + m_sum_weights) / (1 + m_sum_weights2); + m_traj_line.nker = m_kernels.size(); + showInfo(); + return is; +} + +std::istream& colvarbias_opes::read_state_data(std::istream &is) { + try { + auto& ret = read_state_data_template_(is); + return ret; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return is; +} + +cvm::memory_stream& colvarbias_opes::read_state_data(cvm::memory_stream &is) { + try { + auto& ret = read_state_data_template_(is); + return ret; + } catch (const std::exception& e) { + cvm::error(e.what()); + } + return is; +} + +void colvarbias_opes::addKernel(const double height, const std::vector& center, const std::vector& sigma, const double logweight) { + addKernel(height,center,sigma); + const std::ios_base::fmtflags f = m_kernels_output.flags(); + m_kernels_output << std::right; + // simulation time in ps + m_kernels_output << std::setw(24) << (cvm::step_absolute() * cvm::dt()) * 1e-3; + for (size_t i = 0; i < num_variables(); ++i) { + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << center[i]; + } + for (size_t i = 0; i < num_variables(); ++i) { + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << sigma[i]; + } + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << height; + m_kernels_output << " " << std::setw(24) << std::setprecision(16) << logweight; + m_kernels_output << std::endl; + m_kernels_output.flags(f); +} + +void colvarbias_opes::addKernel(const double height, const std::vector& center, const std::vector& sigma) { + bool no_match = true; + if (m_compression_threshold2 != 0) { + size_t taker_k = getMergeableKernel(center, m_kernels.size()); + if (taker_k < m_kernels.size()) { + no_match = false; + m_delta_kernels.emplace_back(-1 * m_kernels[taker_k].m_height, m_kernels[taker_k].m_center, m_kernels[taker_k].m_sigma); + mergeKernels(m_kernels[taker_k], kernel(height, center, sigma)); + m_delta_kernels.push_back(m_kernels[taker_k]); + if (m_recursive_merge) { + size_t giver_k = taker_k; + taker_k = getMergeableKernel(m_kernels[giver_k].m_center, giver_k); + while (taker_k < m_kernels.size()) { + m_delta_kernels.pop_back(); + m_delta_kernels.emplace_back(-1 * m_kernels[taker_k].m_height, m_kernels[taker_k].m_center, m_kernels[taker_k].m_sigma); + if (taker_k > giver_k) std::swap(taker_k, giver_k); + mergeKernels(m_kernels[taker_k], m_kernels[giver_k]); + m_delta_kernels.push_back(m_kernels[taker_k]); + m_kernels.erase(m_kernels.begin() + giver_k); + if (m_nlist) { + size_t giver_nk = 0; + bool found_giver = false; + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + if (found_giver) m_nlist_index[nk]--; + if (m_nlist_index[nk] == giver_k) { + giver_nk = nk; + found_giver = true; + } + } + if (found_giver == false) { + cvm::error("problem with merging and nlist\n"); + } + m_nlist_index.erase(m_nlist_index.begin() + giver_nk); + } + giver_k = taker_k; + taker_k = getMergeableKernel(m_kernels[giver_k].m_center, giver_k); + } + } + } + } + if (no_match) { + m_kernels.emplace_back(height, center, sigma); + m_delta_kernels.emplace_back(height, center, sigma); + if (m_nlist) m_nlist_index.push_back(m_kernels.size() - 1); + } +} + +void colvarbias_opes::mergeKernels(kernel& k1, const kernel& k2) const { + const double h = k1.m_height + k2.m_height; + for (size_t i = 0; i < k1.m_center.size(); ++i) { + const bool isPeriodic_i = variables(i)->is_enabled(f_cv_periodic); + if (isPeriodic_i) { + k1.m_center[i] = k2.m_center[i] + 0.5 * variables(i)->dist2_lgrad(k1.m_center[i], k2.m_center[i]).real_value; + } + const cvm::real c_i = (k1.m_height * k1.m_center[i] + + k2.m_height * k2.m_center[i]) / h; + const cvm::real ss_k1_part = k1.m_height * (k1.m_sigma[i] * k1.m_sigma[i] + k1.m_center[i] * k1.m_center[i]); + const cvm::real ss_k2_part = k2.m_height * (k2.m_sigma[i] * k2.m_sigma[i] + k2.m_center[i] * k2.m_center[i]); + const cvm::real ss_i = (ss_k1_part + ss_k2_part) / h - c_i * c_i; + if (isPeriodic_i) { + colvarvalue tmp(c_i); + variables(i)->wrap(tmp); + k1.m_center[i] = tmp.real_value; + } else { + k1.m_center[i] = c_i; + } + k1.m_sigma[i] = cvm::sqrt(ss_i); + } + k1.m_height = h; +} + +size_t colvarbias_opes::getMergeableKernel(const std::vector& giver_center, const size_t giver_k) const { + size_t min_k = m_kernels.size(); + cvm::real min_norm2 = m_compression_threshold2; + const int num_parallel = 1; + if (!m_nlist) { + if (m_num_threads == 1) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + if (k == giver_k) continue; + double norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2) break; + } + if (norm2 < min_norm2) { + min_norm2 = norm2; + min_k = k; + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + int min_k_omp = min_k; + cvm::real min_norm2_omp = m_compression_threshold2; + #pragma omp for nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + if (k == static_cast(giver_k)) continue; + double norm2 = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_omp) break; + } + if (norm2 < min_norm2_omp) { + min_norm2_omp = norm2; + min_k_omp = k; + } + } + #pragma omp critical + { + if (min_norm2_omp < min_norm2) { + min_norm2 = min_norm2_omp; + min_k = min_k_omp; + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // NOTE: No existing reduction type for finding the minimum, so I have + // to use such a workaround. + std::vector min_k_smp(m_num_threads, min_k); + std::vector min_norm2_smp(m_num_threads, m_compression_threshold2); + auto worker = [&](int start, int end, void* unused) { + const int tid = cvm::proxy->smp_thread_id(); + for (int k = start; k <= end; ++k) { + if (k == giver_k) continue; + double norm2 = 0; + for (size_t j = 0; j < num_variables(); ++j) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_smp[tid]) break; + } + if (norm2 < min_norm2_smp[tid]) { + min_norm2_smp[tid] = norm2; + min_k_smp[tid] = k; + } + } + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + const auto it_min = std::min_element(min_norm2_smp.begin(), min_norm2_smp.end()); + min_norm2 = *it_min; + min_k = min_k_smp[std::distance(min_norm2_smp.begin(), it_min)]; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } else { + if (m_num_threads == 1) { + // size_t min_k_omp = min_k; + // cvm::real min_norm2_omp = m_compression_threshold2; + for (size_t nk = 0; nk < m_nlist_index.size(); ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2) break; + } + if (norm2 < min_norm2) { + min_norm2 = norm2; + min_k = k; + } + } + } else { +#if defined(_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + size_t min_k_omp = min_k; + cvm::real min_norm2_omp = m_compression_threshold2; + #pragma omp for nowait + for (int nk = 0; nk < static_cast(m_nlist_index.size()); ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2 += variables(i)->dist2(giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_omp) break; + } + if (norm2 < min_norm2_omp) { + min_norm2_omp = norm2; + min_k_omp = k; + } + } + #pragma omp critical + { + if (min_norm2_omp < min_norm2) { + min_norm2 = min_norm2_omp; + min_k = min_k_omp; + } + } + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + // NOTE: No existing reduction type for finding the minimum, so I have + // to use such a workaround. + std::vector min_k_smp(m_num_threads, min_k); + std::vector min_norm2_smp(m_num_threads, m_compression_threshold2); + auto worker = [&](int start, int end, void* unused) { + const int tid = cvm::proxy->smp_thread_id(); + for (int nk = start; nk <= end; ++nk) { + const size_t k = m_nlist_index[nk]; + if (k == giver_k) continue; + double norm2 = 0; + for (size_t j = 0; j < num_variables(); ++j) { + norm2 += variables(i)->dist2( giver_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + if (norm2 >= min_norm2_smp[tid]) break; + } + if (norm2 < min_norm2_smp[tid]) { + min_norm2_smp[tid] = norm2; + min_k_smp[tid] = k; + } + } + }; + const size_t numChunks = m_nlist_index.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + const auto it_min = std::min_element(min_norm2_smp.begin(), min_norm2_smp.end()); + min_norm2 = *it_min; + min_k = min_k_smp[std::distance(min_norm2_smp.begin(), it_min)]; +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + } + } + if (num_parallel > 1) { + cvm::error("The Colvars OPES implementation does not support running OPES in parallel across nodes.\n"); + } + return min_k; +} + +std::string const colvarbias_opes::traj_file_name(const std::string& suffix) const { + return std::string(cvm::output_prefix()+ + ".colvars."+this->name+ + ( (comm != single_replica) ? + ("."+replica_id) : + ("") )+ + suffix); +} + +int colvarbias_opes::write_output_files() { + int error_code = COLVARS_OK; + thread_local static bool firsttime = true; + // Write the kernels + const std::string kernels_filename = traj_file_name(".kernels.dat"); + std::ostream& os_kernels = cvm::proxy->output_stream(kernels_filename, "kernels file"); + const std::ios_base::fmtflags format_kernels = os_kernels.flags(); + if (firsttime) { + os_kernels << "#! FIELDS time "; + for (size_t i = 0; i < num_variables(); ++i) { + os_kernels << variables(i)->name + " "; + } + for (size_t i = 0; i < num_variables(); ++i) { + os_kernels << "sigma_" + variables(i)->name + " "; + } + os_kernels << "height logweight\n"; + // Make sure the action name compatible with the script in https://github.com/invemichele/opes/blob/master/postprocessing/State_from_Kernels.py + if (m_explore) os_kernels << "#! SET action OPES_METAD_EXPLORE_kernels\n"; + else os_kernels << "#! SET action OPES_METAD_kernels\n"; + if (m_inf_biasfactor) { + os_kernels << "#! SET biasfactor " << "inf" << "\n"; + } else { + os_kernels << "#! SET biasfactor " << m_biasfactor << "\n"; + } + os_kernels << "#! SET epsilon " << m_epsilon << "\n"; + os_kernels << "#! SET kernel_cutoff " << m_cutoff << "\n"; + os_kernels << "#! SET compression_threshold " << m_compression_threshold << "\n"; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->is_enabled(f_cv_periodic)) { + if (variables(i)->is_enabled(f_cv_lower_boundary)) { + os_kernels << "#! SET min_" + variables(i)->name + " " << variables(i)->lower_boundary.real_value << "\n"; + } + if (variables(i)->is_enabled(f_cv_upper_boundary)) { + os_kernels << "#! SET max_" + variables(i)->name + " " << variables(i)->upper_boundary.real_value << "\n"; + } + } + } + } + os_kernels << m_kernels_output.str(); + os_kernels.setf(format_kernels); + error_code |= cvm::proxy->flush_output_stream(kernels_filename); + m_kernels_output.str(""); + m_kernels_output.clear(); + + // Write the trajectory + const std::string traj_filename = traj_file_name(".misc.traj"); + std::ostream& os_traj = cvm::proxy->output_stream(traj_filename, "trajectory of various OPES properties"); + const std::ios_base::fmtflags format_traj = os_traj.flags(); + if (firsttime) { + os_traj << "#! FIELDS time "; + for (size_t i = 0; i < num_variables(); ++i) { + os_traj << variables(i)->name + " "; + } + os_traj << this->name + ".bias "; + os_traj << this->name + ".rct "; + if (!m_no_zed) os_traj << this->name + ".zed "; + os_traj << this->name + ".neff "; + if (m_calc_work) if (!m_no_zed) os_traj << this->name + ".work "; + os_traj << this->name + ".nker "; + if (m_nlist) os_traj << this->name + ".nlker "; + if (m_nlist) os_traj << this->name + ".nlsteps "; + os_traj << "\n"; + for (size_t i = 0; i < num_variables(); ++i) { + if (variables(i)->is_enabled(f_cv_lower_boundary)) { + os_traj << "#! SET min_" + variables(i)->name + " " << variables(i)->lower_boundary.real_value << "\n"; + } + if (variables(i)->is_enabled(f_cv_upper_boundary)) { + os_traj << "#! SET max_" + variables(i)->name + " " << variables(i)->upper_boundary.real_value << "\n"; + } + } + } + os_traj << m_traj_oss.str(); + os_traj.setf(format_traj); + error_code |= cvm::proxy->flush_output_stream(traj_filename); + m_traj_oss.str(""); + m_traj_oss.clear(); + if (firsttime) firsttime = false; + if (m_pmf_grid_on) { + error_code |= computePMF(); + const std::string pmf_filename = traj_file_name(".pmf"); + error_code |= writePMF(m_pmf_grid, pmf_filename, false); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::proxy->replica_index() == 0) { + const std::string global_pmf_filename = traj_file_name(".global.pmf"); + error_code |= writePMF(m_global_pmf_grid, global_pmf_filename, false); + } + } + if (m_pmf_hist_freq > 0 && cvm::step_absolute() % m_pmf_hist_freq == 0) { + const std::string pmf_hist_filename = traj_file_name(".hist.pmf"); + error_code |= writePMF(m_pmf_grid, pmf_hist_filename, true); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::proxy->replica_index() == 0) { + const std::string global_hist_pmf_filename = traj_file_name(".global.hist.pmf"); + error_code |= writePMF(m_global_pmf_grid, global_hist_pmf_filename, true); + } + } + } + } + // To prevent the case that one replica exits earlier and then destroys all streams + if (comm == multiple_replicas) cvm::proxy->replica_comm_barrier(); + return error_code; +} + +void hist_to_pmf(const cvm::real kbt, const colvar_grid_scalar *hist, std::unique_ptr& pmf) { + // Get the sum of probabilities of all grids + cvm::real norm_factor = 0; + cvm::real max_prob = 0; + auto& prob_data = hist->data; + for (auto it = prob_data.begin(); it != prob_data.end(); ++it) { + norm_factor += (*it); + if ((*it) > max_prob) max_prob = (*it); + } + if (norm_factor > 0) { + const cvm::real min_pmf = (max_prob > 0) ? -1.0 * kbt * cvm::logn(max_prob / norm_factor) : 0; + auto& pmf_data = pmf->data; + for (size_t i = 0; i < pmf_data.size(); ++i) { + if (prob_data[i] > 0) { + pmf_data[i] = -1.0 * kbt * cvm::logn(prob_data[i] / norm_factor) - min_pmf; + } + } + auto max_pmf = *std::max_element(pmf_data.begin(), pmf_data.end()); + for (size_t i = 0; i < pmf_data.size(); ++i) { + if (!(prob_data[i] > 0)) { + pmf_data[i] = max_pmf; + } + } + } +} + +int colvarbias_opes::computePMF() { + // Multiple replica: collect all samples from other replicas + if (comm == multiple_replicas && m_pmf_shared) { + const size_t samples_n = m_reweight_grid->raw_data_num(); + const int msg_size = samples_n * sizeof(cvm::real); + std::vector buffer; + if (cvm::main()->proxy->replica_index() == 0) { + buffer.resize(samples_n * (cvm::proxy->num_replicas() - 1)); + for (int p = 1; p < cvm::proxy->num_replicas(); p++) { + const size_t start_pos = (p - 1) * samples_n; + if (cvm::proxy->replica_comm_recv((char*)&(buffer[start_pos]), msg_size, p) != msg_size) { + return cvm::error("Error getting shared OPES reweighting histogram from replica " + cvm::to_str(p)); + } + } + } else { + if (cvm::proxy->replica_comm_send((char*)(&(m_reweight_grid->data[0])), msg_size, 0) != msg_size) { + return cvm::error("Error sending shared OPES reweighting histogram from replica " + cvm::to_str(cvm::main()->proxy->replica_index())); + } + } + cvm::proxy->replica_comm_barrier(); + // Broadcast m_reweight_grid to all replicas + auto& global_data = m_global_reweight_grid->data; + if (cvm::main()->proxy->replica_index() == 0) { + global_data = m_reweight_grid->data; + // Sum the samples on PE 0 + for (int p = 1; p < cvm::proxy->num_replicas(); p++) { + const size_t start_pos = (p - 1) * samples_n; + for (size_t i = 0 ; i < samples_n; ++i) { + global_data[i] += buffer[start_pos+i]; + } + } + } + } + // Get the sum of probabilities of all grids + hist_to_pmf(m_kbt, m_reweight_grid.get(), m_pmf_grid); + if (comm == multiple_replicas && m_pmf_shared) { + if (cvm::main()->proxy->replica_index() == 0) { + hist_to_pmf(m_kbt, m_global_reweight_grid.get(), m_global_pmf_grid); + } + } + if (comm == multiple_replicas) { + cvm::proxy->replica_comm_barrier(); + } + return COLVARS_OK; +} + +int colvarbias_opes::writePMF(const std::unique_ptr& pmf_grid, const std::string &filename, bool keep_open) { + std::ostream& os = cvm::proxy->output_stream(filename, "output stream of " + filename); + if (!os) { + return COLVARS_FILE_ERROR; + } + pmf_grid->write_multicol(os); + if (!keep_open) { + cvm::proxy->close_output_stream(filename); + } else { + cvm::proxy->flush_output_stream(filename); + } + return COLVARS_OK; +} + +void colvarbias_opes::writeTrajBuffer() { + if (m_traj_output_frequency > 0 && cvm::step_absolute() % m_traj_output_frequency == 0) { + m_traj_oss << std::right; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << (cvm::step_absolute() * cvm::dt()) * 1e-3; + for (size_t i = 0; i < num_variables(); ++i) { + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << variables(i)->value().real_value; + } + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << bias_energy; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.rct; + if (!m_no_zed) m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.zed; + m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.neff; + if (m_calc_work) m_traj_oss << std::scientific << " " << std::setw(cvm::cv_width) << std::setprecision(cvm::cv_prec) << m_traj_line.work; + m_traj_oss << " " << m_traj_line.nker; + if (m_nlist) m_traj_oss << " " << m_traj_line.nlker; + if (m_nlist) m_traj_oss << " " << m_traj_line.nlsteps; + m_traj_oss << "\n"; + } +} + +void colvarbias_opes::updateNlist(const std::vector& center) { + if (m_kernels.empty()) return; + m_nlist_center = center; + m_nlist_index.clear(); + if (m_num_threads == 1 || m_kernels.size() < 2 * m_num_threads) { + for (size_t k = 0; k < m_kernels.size(); ++k) { + cvm::real norm2_k = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + m_nlist_index.push_back(k); + } + } + } else { +#if defined (_OPENMP) + #pragma omp parallel num_threads(m_num_threads) + { + std::vector private_nlist_index; + #pragma omp for nowait + for (int k = 0; k < static_cast(m_kernels.size()); ++k) { + cvm::real norm2_k = 0; + for (int i = 0; i < static_cast(num_variables()); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + private_nlist_index.push_back(static_cast(k)); + } + } + #pragma omp critical + m_nlist_index.insert(m_nlist_index.end(), private_nlist_index.begin(), private_nlist_index.end()); + } +#elif defined(CMK_SMP) && defined(USE_CKLOOP) + std::vector> private_nlist_index(m_num_threads); + auto worker = [&](int start, int end, void* unused){ + const int tid = cvm::proxy->smp_thread_id(); + for (int k = start; k <= end; ++k) { + cvm::real norm2_k = 0; + for (size_t i = 0; i < num_variables(); ++i) { + norm2_k += variables(i)->dist2(m_nlist_center[i], m_kernels[k].m_center[i]) / (m_kernels[k].m_sigma[i] * m_kernels[k].m_sigma[i]); + } + if (norm2_k <= m_nlist_param[0] * m_cutoff2) { + private_nlist_index[tid].push_back(k); + } + } + }; + const size_t numChunks = m_kernels.size(); + const size_t lowerRange = 0; + const size_t upperRange = numChunks - 1; + CkLoop_Parallelize( + numChunks, lowerRange, upperRange, + worker, NULL, CKLOOP_NONE, NULL); + for (size_t j = 0; j < m_num_threads; ++j) { + m_nlist_index.insert(m_nlist_index.end(), private_nlist_index[i].begin(), private_nlist_index.end()); + } +#else + cvm::error("OPES cannot run because this binary is not linked with a supported threading library.\n"); +#endif + if (m_recursive_merge) { + std::sort(m_nlist_index.begin(), m_nlist_index.end()); + } + } + std::vector dev2(num_variables(), 0); + for (size_t k = 0; k < m_nlist_index.size(); ++k) { + for (size_t i = 0; i < num_variables(); ++i) { + dev2[i] += variables(i)->dist2(m_nlist_center[i], m_kernels[m_nlist_index[k]].m_center[i]); + } + } + for (size_t i = 0; i < num_variables(); ++i) { + if (m_nlist_index.empty()) { + m_nlist_dev2[i] = m_kernels.back().m_sigma[i] * m_kernels.back().m_sigma[i]; + } else { + m_nlist_dev2[i] = dev2[i] / m_nlist_index.size(); + } + } + m_traj_line.nlker = m_nlist_index.size(); + m_traj_line.nlsteps = m_nlist_steps; + m_nlist_steps = 0; + m_nlist_update = false; +} diff --git a/lib/colvars/colvarbias_opes.h b/lib/colvars/colvarbias_opes.h new file mode 100644 index 0000000000..0c52ba2413 --- /dev/null +++ b/lib/colvars/colvarbias_opes.h @@ -0,0 +1,176 @@ +#ifndef COLVARBIAS_OPES_H +#define COLVARBIAS_OPES_H + +// This code is mainly adapted from the PLUMED opes module, which uses the +// LGPLv3 license as shown below: +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Copyright (c) 2020-2021 of Michele Invernizzi. + + This file is part of the OPES plumed module. + + The OPES plumed module is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + The OPES plumed module 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with plumed. If not, see . ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ + +#include "colvarbias.h" + +#include +#include + +// OPES_METAD implementation: swiped from OPESmetad.cpp of PLUMED +class colvarbias_opes: public colvarbias { +public: + /// The Gaussian kernel data structure + struct kernel { + cvm::real m_height; + std::vector m_center; + std::vector m_sigma; + kernel() {} + kernel(cvm::real h, const std::vector& c, + const std::vector& s): + m_height(h), m_center(c), m_sigma(s) {} + }; + /// Communication between different replicas + enum Communication { + /// One replica (default) + single_replica, + /// Hills added concurrently by several replicas + multiple_replicas + }; + /// Constructor + colvarbias_opes(char const *key); + /// Initializer + int init(std::string const &conf) override; + /// Per-timestep update + int update() override; + /// Save the state to a text file for restarting + std::ostream &write_state_data(std::ostream &os) override; + /// Read the state from a text file for restarting + std::istream &read_state_data(std::istream &is) override; + /// Save the state to a binary file for restarting + cvm::memory_stream &write_state_data(cvm::memory_stream &os) override; + /// Read the state from a binary file for restarting + cvm::memory_stream &read_state_data(cvm::memory_stream &is) override; + /// Write to files at restart steps + int write_output_files() override; +private: + int update_opes(); + int calculate_opes(); + void save_state(); + cvm::real getProbAndDerivatives(const std::vector& cv, std::vector& der_prob) const; + cvm::real evaluateKernel(const kernel& G, const std::vector& x) const; + cvm::real evaluateKernel(const kernel& G, const std::vector& x, std::vector& accumulated_derivative, std::vector& dist) const; + void addKernel(const double height, const std::vector& center, const std::vector& sigma, const double logweight); + void addKernel(const double height, const std::vector& center, const std::vector& sigma); + size_t getMergeableKernel(const std::vector& giver_center, const size_t giver_k) const; + void mergeKernels(kernel& k1, const kernel& k2) const; + void updateNlist(const std::vector& center); + struct traj_line { + double rct; + double zed; + double neff; + double work; + size_t nker; + size_t nlker; + size_t nlsteps; + }; + void writeTrajBuffer(); + void showInfo() const; + template OST &write_state_data_template_(OST &os) const; + template IST &read_state_data_template_(IST &os); + std::string const traj_file_name(const std::string& suffix) const; + int collectSampleToPMFGrid(); + int computePMF(); + int writePMF(const std::unique_ptr& pmf_grid, const std::string &filename, bool keep_open); +private: + cvm::real m_kbt; + cvm::real m_barrier; + cvm::real m_biasfactor; + cvm::real m_bias_prefactor; + cvm::real m_temperature; + cvm::step_number m_pace; + cvm::step_number m_adaptive_sigma_stride; + cvm::step_number m_adaptive_counter; + unsigned long long m_counter; + cvm::real m_compression_threshold; + cvm::real m_compression_threshold2; + bool m_adaptive_sigma; + bool m_fixed_sigma; + bool m_no_zed; + // bool m_restart; + bool m_nlist; + bool m_recursive_merge; + std::vector m_nlist_param; + std::vector m_sigma0; + std::vector m_sigma_min; + cvm::real m_epsilon; + cvm::real m_sum_weights; + cvm::real m_sum_weights2; + cvm::real m_cutoff; + cvm::real m_cutoff2; + cvm::real m_zed; + cvm::real m_old_kdenorm; + cvm::real m_kdenorm; + cvm::real m_val_at_cutoff; + cvm::real m_rct; + cvm::real m_neff; + std::vector m_kernels; + std::vector m_delta_kernels; + std::vector m_av_cv; + std::vector m_av_M2; + std::ostringstream m_kernels_output; + std::vector m_nlist_center; + std::vector m_nlist_index; + std::vector m_nlist_dev2; + size_t m_nlist_steps; + bool m_nlist_update; + bool m_nlist_pace_reset; + size_t m_nker; + bool m_calc_work; + cvm::real m_work; + /// Communication between different replicas + Communication comm; + /// \brief Identifier for this replica + std::string replica_id; + size_t m_num_walkers; + size_t shared_freq; + size_t m_num_threads; + size_t m_nlker; + // size_t m_state_stride; + // std::unordered_map m_kernel_output_components; + std::string m_kernels_output_headers; + cvm::step_number m_traj_output_frequency; + traj_line m_traj_line; + std::ostringstream m_traj_oss; + bool m_is_first_step; + std::vector m_cv; + // For saving states + decltype(m_zed) m_saved_zed; + decltype(m_sum_weights) m_saved_sum_weights; + decltype(m_sum_weights2) m_saved_sum_weights2; + decltype(m_kernels) m_saved_kernels; + // PMF grid from reweighting + bool m_pmf_grid_on; + std::vector m_pmf_cvs; + std::string grid_conf; + std::shared_ptr m_reweight_grid; + std::unique_ptr m_pmf_grid; + cvm::step_number m_pmf_hist_freq; + bool m_pmf_shared; // shared PMF among replicas + std::unique_ptr m_global_reweight_grid; + std::unique_ptr m_global_pmf_grid; + bool m_explore; + bool m_inf_biasfactor; +}; + +#endif // COLVARBIAS_OPES_H diff --git a/lib/colvars/colvarcomp.cpp b/lib/colvars/colvarcomp.cpp index e6729f43a7..9a056f7dd3 100644 --- a/lib/colvars/colvarcomp.cpp +++ b/lib/colvars/colvarcomp.cpp @@ -261,7 +261,6 @@ int colvar::cvc::init_dependencies() { require_feature_children(f_cvc_explicit_gradient, f_ag_explicit_gradient); init_feature(f_cvc_inv_gradient, "inverse_gradient", f_type_dynamic); - require_feature_self(f_cvc_inv_gradient, f_cvc_gradient); init_feature(f_cvc_debug_gradient, "debug_gradient", f_type_user); require_feature_self(f_cvc_debug_gradient, f_cvc_gradient); @@ -525,7 +524,7 @@ void colvar::cvc::calc_force_invgrads() void colvar::cvc::calc_Jacobian_derivative() { - cvm::error("Error: calculation of inverse gradients is not implemented " + cvm::error("Error: calculation of Jacobian derivatives is not implemented " "for colvar components of type \""+function_type()+"\".\n", COLVARS_NOT_IMPLEMENTED); } @@ -533,8 +532,10 @@ void colvar::cvc::calc_Jacobian_derivative() void colvar::cvc::calc_fit_gradients() { - for (size_t ig = 0; ig < atom_groups.size(); ig++) { - atom_groups[ig]->calc_fit_gradients(); + if (is_enabled(f_cvc_explicit_gradient)) { + for (size_t ig = 0; ig < atom_groups.size(); ig++) { + atom_groups[ig]->calc_fit_gradients(); + } } } diff --git a/lib/colvars/colvarcomp.h b/lib/colvars/colvarcomp.h index 334fdc1f6e..53755576c2 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -233,8 +233,14 @@ public: /// Forcibly set value of CVC - useful for driving an external coordinate, /// eg. lambda dynamics - inline void set_value(colvarvalue const &new_value) { + inline void set_value(colvarvalue const &new_value, bool now=false) { x = new_value; + // Cache value to be communicated to back-end between time steps + cvm::proxy->set_alch_lambda(x.real_value); + if (now) { + // If requested (e.g. upon restarting), sync to back-end + cvm::proxy->send_alch_lambda(); + } } protected: @@ -1212,9 +1218,11 @@ protected: // No atom groups needed public: alch_lambda(); + int init_alchemy(int time_step_factor); virtual ~alch_lambda() {} virtual void calc_value(); - virtual void calc_gradients(); + virtual void calc_force_invgrads(); + virtual void calc_Jacobian_derivative(); virtual void apply_force(colvarvalue const &force); }; diff --git a/lib/colvars/colvarcomp_alchlambda.cpp b/lib/colvars/colvarcomp_alchlambda.cpp index a175ea43e8..29168d87ce 100644 --- a/lib/colvars/colvarcomp_alchlambda.cpp +++ b/lib/colvars/colvarcomp_alchlambda.cpp @@ -20,22 +20,46 @@ colvar::alch_lambda::alch_lambda() { set_function_type("alchLambda"); - disable(f_cvc_explicit_gradient); - disable(f_cvc_gradient); + provide(f_cvc_explicit_gradient, false); + provide(f_cvc_gradient, false); // Cannot apply forces on this CVC + provide(f_cvc_collect_atom_ids, false); + + provide(f_cvc_inv_gradient); // Projected force is TI derivative + provide(f_cvc_Jacobian); // Zero x.type(colvarvalue::type_scalar); - // Query initial value from back-end + + // Query initial value from back-end; will be overwritten if restarting from a state file cvm::proxy->get_alch_lambda(&x.real_value); } +int colvar::alch_lambda::init_alchemy(int factor) +{ + // We need calculation every time step + // default in Tinker-HP and NAMD2, must be enforced in NAMD3 + // Also checks back-end settings, ie. that alchemy is enabled + // (in NAMD3: alchType TI, computeEnergies at the right frequency) + + // Forbid MTS until fully implemented + if (factor != 1) { + return cvm::error("Error: timeStepFactor > 1 is not yet supported for alchemical variables."); + } + cvm::proxy->request_alch_energy_freq(factor); + + return COLVARS_OK; +} + + void colvar::alch_lambda::calc_value() { - // Special workflow: - // at the beginning of the timestep we get a force instead of calculating the value + // By default, follow external parameter + // This might get overwritten by driving extended dynamics + // (in apply_force() below) + cvm::proxy->get_alch_lambda(&x.real_value); cvm::proxy->get_dE_dlambda(&ft.real_value); - ft.real_value *= -1.0; // Energy derivative to force + ft.real_value *= -1.0; // Convert energy derivative to force // Include any force due to bias on Flambda ft.real_value += cvm::proxy->indirect_lambda_biasing_force; @@ -43,19 +67,24 @@ void colvar::alch_lambda::calc_value() } -void colvar::alch_lambda::calc_gradients() +void colvar::alch_lambda::calc_force_invgrads() { + // All the work is done in calc_value() +} + + +void colvar::alch_lambda::calc_Jacobian_derivative() +{ + jd = 0.0; } void colvar::alch_lambda::apply_force(colvarvalue const & /* force */) { - // new value will be cached and sent at end of timestep - cvm::proxy->set_alch_lambda(x.real_value); + // Forces, if any, are applied in colvar::update_extended_Lagrangian() } - colvar::alch_Flambda::alch_Flambda() { set_function_type("alch_Flambda"); diff --git a/lib/colvars/colvarcomp_angles.cpp b/lib/colvars/colvarcomp_angles.cpp index 56894e9f5c..0e7aed65ed 100644 --- a/lib/colvars/colvarcomp_angles.cpp +++ b/lib/colvars/colvarcomp_angles.cpp @@ -267,74 +267,22 @@ void colvar::dihedral::calc_value() void colvar::dihedral::calc_gradients() { - cvm::rvector A = cvm::rvector::outer(r12, r23); - cvm::real rA = A.norm(); - cvm::rvector B = cvm::rvector::outer(r23, r34); - cvm::real rB = B.norm(); - cvm::rvector C = cvm::rvector::outer(r23, A); - cvm::real rC = C.norm(); + // Eqs. (27i) ~ (27l) from https://doi.org/10.1002/(SICI)1096-987X(19960715)17:9<1132::AID-JCC5>3.0.CO;2-T. - cvm::real const cos_phi = (A*B)/(rA*rB); - cvm::real const sin_phi = (C*B)/(rC*rB); + const cvm::rvector A = cvm::rvector::outer(r12, r23); + const cvm::rvector B = cvm::rvector::outer(r23, r34); + const cvm::real nG = r23.norm(); + const cvm::real A2 = A.norm2(); + const cvm::real B2 = B.norm2(); - cvm::rvector f1, f2, f3; - - rB = 1.0/rB; - B *= rB; - - if (cvm::fabs(sin_phi) > 0.1) { - rA = 1.0/rA; - A *= rA; - cvm::rvector const dcosdA = rA*(cos_phi*A-B); - cvm::rvector const dcosdB = rB*(cos_phi*B-A); - // rA = 1.0; - - cvm::real const K = (1.0/sin_phi) * (180.0/PI); - - f1 = K * cvm::rvector::outer(r23, dcosdA); - f3 = K * cvm::rvector::outer(dcosdB, r23); - f2 = K * (cvm::rvector::outer(dcosdA, r12) - + cvm::rvector::outer(r34, dcosdB)); - } - else { - rC = 1.0/rC; - C *= rC; - cvm::rvector const dsindC = rC*(sin_phi*C-B); - cvm::rvector const dsindB = rB*(sin_phi*B-C); - // rC = 1.0; - - cvm::real const K = (-1.0/cos_phi) * (180.0/PI); - - f1.x = K*((r23.y*r23.y + r23.z*r23.z)*dsindC.x - - r23.x*r23.y*dsindC.y - - r23.x*r23.z*dsindC.z); - f1.y = K*((r23.z*r23.z + r23.x*r23.x)*dsindC.y - - r23.y*r23.z*dsindC.z - - r23.y*r23.x*dsindC.x); - f1.z = K*((r23.x*r23.x + r23.y*r23.y)*dsindC.z - - r23.z*r23.x*dsindC.x - - r23.z*r23.y*dsindC.y); - - f3 = cvm::rvector::outer(dsindB, r23); - f3 *= K; - - f2.x = K*(-(r23.y*r12.y + r23.z*r12.z)*dsindC.x - +(2.0*r23.x*r12.y - r12.x*r23.y)*dsindC.y - +(2.0*r23.x*r12.z - r12.x*r23.z)*dsindC.z - +dsindB.z*r34.y - dsindB.y*r34.z); - f2.y = K*(-(r23.z*r12.z + r23.x*r12.x)*dsindC.y - +(2.0*r23.y*r12.z - r12.y*r23.z)*dsindC.z - +(2.0*r23.y*r12.x - r12.y*r23.x)*dsindC.x - +dsindB.x*r34.z - dsindB.z*r34.x); - f2.z = K*(-(r23.x*r12.x + r23.y*r12.y)*dsindC.z - +(2.0*r23.z*r12.x - r12.z*r23.x)*dsindC.x - +(2.0*r23.z*r12.y - r12.z*r23.y)*dsindC.y - +dsindB.y*r34.x - dsindB.x*r34.y); - } + const cvm::real K = 180.0/PI; + const cvm::rvector f1 = K * nG / A2 * A; + const cvm::rvector f2 = K * ((r12 * r23 / (A2 * nG)) * A + (r34 * r23 / (B2 * nG)) * B); + const cvm::rvector f3 = K * nG / B2 * B; group1->set_weighted_gradient(-f1); - group2->set_weighted_gradient(-f2 + f1); - group3->set_weighted_gradient(-f3 + f2); + group2->set_weighted_gradient( f2 + f1); + group3->set_weighted_gradient(-f3 - f2); group4->set_weighted_gradient(f3); } diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index 319190c385..6de68264c3 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -384,32 +384,30 @@ void colvar::distance_dir::apply_force(colvarvalue const &force) cvm::real const iprod = force.rvector_value * x.rvector_value; cvm::rvector const force_tang = force.rvector_value - iprod * x.rvector_value; - if (!group1->noforce) - group1->apply_force(-1.0 * force_tang); - - if (!group2->noforce) - group2->apply_force( force_tang); + if (!group1->noforce) { + group1->apply_force(-1.0 / dist_v.norm() * force_tang); + } + if (!group2->noforce) { + group2->apply_force( 1.0 / dist_v.norm() * force_tang); + } } -cvm::real colvar::distance_dir::dist2(colvarvalue const &x1, - colvarvalue const &x2) const +cvm::real colvar::distance_dir::dist2(colvarvalue const &x1, colvarvalue const &x2) const { - return (x1.rvector_value - x2.rvector_value).norm2(); + return x1.dist2(x2); } -colvarvalue colvar::distance_dir::dist2_lgrad(colvarvalue const &x1, - colvarvalue const &x2) const +colvarvalue colvar::distance_dir::dist2_lgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x1.rvector_value - x2.rvector_value), colvarvalue::type_unit3vectorderiv); + return x1.dist2_grad(x2); } -colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, - colvarvalue const &x2) const +colvarvalue colvar::distance_dir::dist2_rgrad(colvarvalue const &x1, colvarvalue const &x2) const { - return colvarvalue((x2.rvector_value - x1.rvector_value), colvarvalue::type_unit3vectorderiv); + return x2.dist2_grad(x1); } @@ -1005,7 +1003,7 @@ void colvar::rmsd::calc_Jacobian_derivative() for (size_t ia = 0; ia < atoms->size(); ia++) { // Gradient of optimal quaternion wrt current Cartesian position - atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq); + atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq); g11 = 2.0 * (atoms->rot.q)[1]*dq[1]; g22 = 2.0 * (atoms->rot.q)[2]*dq[2]; @@ -1304,7 +1302,7 @@ void colvar::eigenvector::calc_Jacobian_derivative() // Gradient of optimal quaternion wrt current Cartesian position // trick: d(R^-1)/dx = d(R^t)/dx = (dR/dx)^t // we can just transpose the derivatives of the direct matrix - atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq_1); + atoms->rot_deriv->calc_derivative_wrt_group1(ia, nullptr, &dq_1); g11 = 2.0 * quat0[1]*dq_1[1]; g22 = 2.0 * quat0[2]*dq_1[2]; @@ -1403,11 +1401,12 @@ void colvar::cartesian::apply_force(colvarvalue const &force) size_t ia, j; if (!atoms->noforce) { cvm::rvector f; + auto ag_force = atoms->get_group_force_object(); for (ia = 0; ia < atoms->size(); ia++) { for (j = 0; j < dim; j++) { f[axes[j]] = force.vector1d_value[dim*ia + j]; } - (*atoms)[ia].apply_force(f); + ag_force.add_atom_force(ia, f); } } } diff --git a/lib/colvars/colvarcomp_protein.cpp b/lib/colvars/colvarcomp_protein.cpp index f782095148..832005e2a7 100644 --- a/lib/colvars/colvarcomp_protein.cpp +++ b/lib/colvars/colvarcomp_protein.cpp @@ -28,34 +28,58 @@ colvar::alpha_angles::alpha_angles() int colvar::alpha_angles::init(std::string const &conf) { int error_code = cvc::init(conf); + if (error_code != COLVARS_OK) return error_code; std::string segment_id; - get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - std::vector residues; - { - std::string residues_conf = ""; - key_lookup(conf, "residueRange", &residues_conf); + + bool b_use_index_groups = false; + cvm::atom_group group_CA, group_N, group_O; + + std::string residues_conf = ""; + std::string prefix; + + // residueRange is mandatory for the topology-based case + if (key_lookup(conf, "residueRange", &residues_conf)) { if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; char dash; if ( (is >> initial) && (initial > 0) && - (is >> dash) && (dash == '-') && - (is >> final) && (final > 0) ) { + (is >> dash) && (dash == '-') && + (is >> final) && (final > 0) ) { for (int rnum = initial; rnum <= final; rnum++) { residues.push_back(rnum); } } } else { - error_code |= - cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); } - } - if (residues.size() < 5) { - error_code |= cvm::error("Error: not enough residues defined in \"residueRange\".\n", - COLVARS_INPUT_ERROR); + if (residues.size() < 5) { + return cvm::error("Error: not enough residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + } + get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); + + } else { + b_use_index_groups = true; + get_keyval(conf, "prefix", prefix, "alpha_"); + + // Not all groups are mandatory, parse silently + group_CA.add_index_group(prefix + "CA", true); + group_N.add_index_group(prefix + "N", true); + group_O.add_index_group(prefix + "O", true); + int na = group_CA.size(); + int nn = group_N.size(); + int no = group_O.size(); + if ((nn != 0 || no != 0) && (nn != no)) { + return cvm::error("Error: If either is provided, atom groups " + prefix + "N and " + prefix + "O must have the same number of atoms.", + COLVARS_INPUT_ERROR); + } + if (nn != 0 && na != 0 && nn != na) { + return cvm::error("Error: If both are provided, atom groups " + prefix + "N and " + prefix + "CA must have the same number of atoms.", + COLVARS_INPUT_ERROR); + } } std::string const &sid = segment_id; @@ -64,8 +88,7 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "hBondCoeff", hb_coeff, hb_coeff); if ((hb_coeff < 0.0) || (hb_coeff > 1.0)) { - error_code |= - cvm::error("Error: hBondCoeff must be defined between 0 and 1.\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: hBondCoeff must be defined between 0 and 1.\n", COLVARS_INPUT_ERROR); } @@ -73,14 +96,29 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "angleTol", theta_tol, theta_tol); if (hb_coeff < 1.0) { - - for (size_t i = 0; i < residues.size()-2; i++) { - theta.push_back(new colvar::angle(cvm::atom(r[i ], "CA", sid), - cvm::atom(r[i+1], "CA", sid), - cvm::atom(r[i+2], "CA", sid))); - register_atom_group(theta.back()->atom_groups[0]); - register_atom_group(theta.back()->atom_groups[1]); - register_atom_group(theta.back()->atom_groups[2]); + if (b_use_index_groups) { + if (group_CA.size() < 5) { + return cvm::error("Not enough atoms (" + cvm::to_str(group_CA.size()) + ") in index group \"" + prefix + "CA\"", + COLVARS_INPUT_ERROR); + } + for (size_t i = 0; i < group_CA.size()-2; i++) { + // Note: the angle constructor constructs copies of the atom objects + theta.push_back(new colvar::angle(group_CA[i], + group_CA[i+1], + group_CA[i+2])); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + } + } else { + for (size_t i = 0; i < residues.size()-2; i++) { + theta.push_back(new colvar::angle(cvm::atom(r[i ], "CA", sid), + cvm::atom(r[i+1], "CA", sid), + cvm::atom(r[i+2], "CA", sid))); + register_atom_group(theta.back()->atom_groups[0]); + register_atom_group(theta.back()->atom_groups[1]); + register_atom_group(theta.back()->atom_groups[2]); + } } } else { @@ -93,14 +131,27 @@ int colvar::alpha_angles::init(std::string const &conf) get_keyval(conf, "hBondExpDenom", ed, ed); if (hb_coeff > 0.0) { - - for (size_t i = 0; i < residues.size()-4; i++) { - hb.push_back(new colvar::h_bond(cvm::atom(r[i ], "O", sid), - cvm::atom(r[i+4], "N", sid), - r0, en, ed)); - register_atom_group(hb.back()->atom_groups[0]); + if (b_use_index_groups) { + if (group_N.size() < 5) { + return cvm::error("Not enough atoms (" + cvm::to_str(group_N.size()) + ") in index group \"" + prefix + "N\"", + COLVARS_INPUT_ERROR); + } + for (size_t i = 0; i < group_N.size()-4; i++) { + // Note: we need to call the atom copy constructor here because + // the h_bond constructor does not make copies of the provided atoms + hb.push_back(new colvar::h_bond(cvm::atom(group_O[i]), + cvm::atom(group_N[i+4]), + r0, en, ed)); + register_atom_group(hb.back()->atom_groups[0]); + } + } else { + for (size_t i = 0; i < residues.size()-4; i++) { + hb.push_back(new colvar::h_bond(cvm::atom(r[i ], "O", sid), + cvm::atom(r[i+4], "N", sid), + r0, en, ed)); + register_atom_group(hb.back()->atom_groups[0]); + } } - } else { cvm::log("The hBondCoeff specified will disable the hydrogen bond terms.\n"); } @@ -290,41 +341,62 @@ int colvar::dihedPC::init(std::string const &conf) if (cvm::debug()) cvm::log("Initializing dihedral PC object.\n"); + bool b_use_index_groups = false; std::string segment_id; - get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - std::vector residues; - { - std::string residues_conf = ""; - key_lookup(conf, "residueRange", &residues_conf); + size_t n_residues; + std::string residues_conf = ""; + std::string prefix; + cvm::atom_group group_CA, group_N, group_C; + + // residueRange is mandatory for the topology-based case + if (key_lookup(conf, "residueRange", &residues_conf)) { if (residues_conf.size()) { std::istringstream is(residues_conf); int initial, final; char dash; if ( (is >> initial) && (initial > 0) && - (is >> dash) && (dash == '-') && - (is >> final) && (final > 0) ) { + (is >> dash) && (dash == '-') && + (is >> final) && (final > 0) ) { for (int rnum = initial; rnum <= final; rnum++) { residues.push_back(rnum); } } } else { - error_code |= - cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); + return cvm::error("Error: no residues defined in \"residueRange\".\n", COLVARS_INPUT_ERROR); } - } + n_residues = residues.size(); + get_keyval(conf, "psfSegID", segment_id, std::string("MAIN")); - if (residues.size() < 2) { + } else { + + b_use_index_groups = true; + get_keyval(conf, "prefix", prefix, "dihed_"); + + // All three groups are required + group_CA.add_index_group(prefix + "CA"); + group_N.add_index_group(prefix + "N"); + group_C.add_index_group(prefix + "C"); + int na = group_CA.size(); + int nn = group_N.size(); + int nc = group_C.size(); + if ((nn != na || na != nc)) { + return cvm::error("Error: atom groups " + prefix + "N, " + prefix + "CA, and " + prefix + + "C must have the same number of atoms.", COLVARS_INPUT_ERROR); + } + n_residues = nn; + } + if (n_residues < 2) { error_code |= - cvm::error("Error: dihedralPC requires at least two residues.\n", COLVARS_INPUT_ERROR); + cvm::error("Error: dihedralPC requires at least two residues.\n", COLVARS_INPUT_ERROR); } std::string const &sid = segment_id; std::vector const &r = residues; std::string vecFileName; - int vecNumber; if (get_keyval(conf, "vectorFile", vecFileName, vecFileName)) { + int vecNumber; get_keyval(conf, "vectorNumber", vecNumber, 0); if (vecNumber < 1) { error_code |= @@ -339,9 +411,8 @@ int colvar::dihedPC::init(std::string const &conf) } // TODO: adapt to different formats by setting this flag - bool eigenvectors_as_columns = true; - - if (eigenvectors_as_columns) { + // bool eigenvectors_as_columns = true; + // if (eigenvectors_as_columns) { // Carma-style dPCA file std::string line; cvm::real c; @@ -352,9 +423,7 @@ int colvar::dihedPC::init(std::string const &conf) for (int i=0; i> c; coeffs.push_back(c); } - } -/* TODO Uncomment this when different formats are recognized - else { + /* } else { // Uncomment this when different formats are recognized // Eigenvectors as lines // Skip to the right line for (int i = 1; iatom_groups[0]); register_atom_group(theta.back()->atom_groups[1]); register_atom_group(theta.back()->atom_groups[2]); register_atom_group(theta.back()->atom_groups[3]); // Phi (next res) - theta.push_back(new colvar::dihedral(cvm::atom(r[i ], "C", sid), - cvm::atom(r[i+1], "N", sid), - cvm::atom(r[i+1], "CA", sid), - cvm::atom(r[i+1], "C", sid))); + if (b_use_index_groups) { + theta.push_back(new colvar::dihedral(group_C[i], + group_N[i+1], + group_CA[i+1], + group_C[i+1])); + } else { + theta.push_back(new colvar::dihedral(cvm::atom(r[i ], "C", sid), + cvm::atom(r[i+1], "N", sid), + cvm::atom(r[i+1], "CA", sid), + cvm::atom(r[i+1], "C", sid))); + } register_atom_group(theta.back()->atom_groups[0]); register_atom_group(theta.back()->atom_groups[1]); register_atom_group(theta.back()->atom_groups[2]); diff --git a/lib/colvars/colvarcomp_rotations.cpp b/lib/colvars/colvarcomp_rotations.cpp index a04ace851a..766a0870d1 100644 --- a/lib/colvars/colvarcomp_rotations.cpp +++ b/lib/colvars/colvarcomp_rotations.cpp @@ -137,11 +137,14 @@ void colvar::orientation::apply_force(colvarvalue const &force) if (!atoms->noforce) { rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; + auto ag_force = atoms->get_group_force_object(); for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); - for (size_t i = 0; i < 4; i++) { - (*atoms)[ia].apply_force(FQ[i] * dq0_2[i]); - } + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + const auto f_ia = FQ[0] * dq0_2[0] + + FQ[1] * dq0_2[1] + + FQ[2] * dq0_2[2] + + FQ[3] * dq0_2[3]; + ag_force.add_atom_force(ia, f_ia); } } } @@ -205,7 +208,7 @@ void colvar::orientation_angle::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]); } } @@ -265,7 +268,7 @@ void colvar::orientation_proj::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]); } } @@ -314,7 +317,7 @@ void colvar::tilt::calc_gradients() cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { (*atoms)[ia].grad = cvm::rvector(0.0, 0.0, 0.0); - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); for (size_t iq = 0; iq < 4; iq++) { (*atoms)[ia].grad += (dxdq[iq] * dq0_2[iq]); } @@ -351,7 +354,7 @@ void colvar::spin_angle::calc_gradients() cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { (*atoms)[ia].grad = cvm::rvector(0.0, 0.0, 0.0); - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); for (size_t iq = 0; iq < 4; iq++) { (*atoms)[ia].grad += (dxdq[iq] * dq0_2[iq]); } @@ -399,7 +402,7 @@ void colvar::euler_phi::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + @@ -448,7 +451,7 @@ void colvar::euler_psi::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + @@ -495,7 +498,7 @@ void colvar::euler_theta::calc_gradients() rot_deriv_impl->prepare_derivative(rotation_derivative_dldq::use_dq); cvm::vector1d dq0_2; for (size_t ia = 0; ia < atoms->size(); ia++) { - rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); + rot_deriv_impl->calc_derivative_wrt_group2(ia, nullptr, &dq0_2); (*atoms)[ia].grad = (dxdq0 * dq0_2[0]) + (dxdq1 * dq0_2[1]) + (dxdq2 * dq0_2[2]) + diff --git a/lib/colvars/colvarcomp_torchann.cpp b/lib/colvars/colvarcomp_torchann.cpp new file mode 100644 index 0000000000..7b83baf9b6 --- /dev/null +++ b/lib/colvars/colvarcomp_torchann.cpp @@ -0,0 +1,233 @@ +// -*- 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 "colvar.h" +#include "colvarcomp.h" +#include "colvarmodule.h" +#include "colvarparse.h" +#include "colvarvalue.h" + +#include "colvarcomp_torchann.h" + + +#ifdef COLVARS_TORCH + +colvar::torchANN::torchANN() +{ + set_function_type("torchANN"); + provide(f_cvc_periodic); +} + +colvar::torchANN::~torchANN() {} + + +int colvar::torchANN::init(std::string const &conf) { + + int error_code = linearCombination::init(conf); + + std::string model_file ; + get_keyval(conf, "modelFile", model_file, std::string("")); + try { + nn = torch::jit::load(model_file); + nn.to(torch::kCPU); + cvm::log("torch model loaded.") ; + } catch (const std::exception & e) { + return cvm::error("Error: couldn't load libtorch model (see below).\n" + cvm::to_str(e.what()), + COLVARS_INPUT_ERROR); + } + + auto const legacy_keyword = get_keyval(conf, "m_output_index", m_output_index, m_output_index); + if (legacy_keyword) { + cvm::log("Warning: m_output_index is a deprecated keyword, please use output_component instead.\n"); + } + get_keyval(conf, "output_component", m_output_index, m_output_index); + + get_keyval(conf, "doubleInputTensor", use_double_input, use_double_input); + //get_keyval(conf, "useGPU", use_gpu, false); + + cvc_indices.resize(cv.size(),0); + + size_t num_inputs = 0; + // compute total number of inputs of neural network + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) + { + num_inputs += cv[i_cv]->value().size() ; + if (i_cv < cv.size() - 1) + cvc_indices[i_cv+1] = num_inputs; + } + cvm::log("Input dimension of model: " + cvm::to_str(num_inputs)); + + // initialize the input tensor + auto options = torch::TensorOptions().dtype(torch::kFloat32).requires_grad(true); + + /* + if (use_gpu) { + if (torch::cuda::is_available()) { + try { + nn.to(torch::kCUDA); + } catch(const std::exception & e) { + cvm::error("Failed to move model to GPU."); + use_gpu = false; + } + } else { + use_gpu = false; + cvm::log("GPU not available."); + } + } + + if (use_gpu) { + options = options.device(torch::kCUDA); + if (use_double_input) { + cvm::log("Data type reset to Float for GPU computation!"); + use_double_input = false; + } + } + */ + + if (use_double_input) { // set type to double + options = options.dtype(torch::kFloat64); + nn.to(torch::kFloat64); + cvm::log("Model's dtype: kFloat64."); + } else { + cvm::log("Model's dtype: kFloat32."); + } + + input_tensor = torch::zeros({1,(long int) num_inputs}, options); + + try { // test the model + std::vector inputs={input_tensor}; + nn_outputs = nn.forward(inputs).toTensor()[0][m_output_index]; + cvm::log("Evaluating model with zero tensor succeeded."); + } catch (const std::exception & e) { + error_code |= cvm::error("Error: evaluating model with zero tensor failed (see below).\n" + + cvm::to_str(e.what()), + COLVARS_INPUT_ERROR); + } + + return error_code; +} + + +void colvar::torchANN::calc_value() { + + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) + cv[i_cv]->calc_value(); + + /* + if (use_gpu) + input_tensor = input_tensor.to(torch::kCPU); + */ + + // set input tensor with no_grad + { + torch::NoGradGuard no_grad; + size_t l = 0; + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + const colvarvalue& current_cv_value = cv[i_cv]->value(); + if (current_cv_value.type() == colvarvalue::type_scalar) { + input_tensor[0][l++] = cv[i_cv]->sup_coeff * (cvm::pow(current_cv_value.real_value, cv[i_cv]->sup_np)); + } else { + for (size_t j_elem = 0; j_elem < current_cv_value.size(); ++j_elem) + input_tensor[0][l++] = cv[i_cv]->sup_coeff * current_cv_value[j_elem]; + } + } + } + + /* + if (use_gpu) + input_tensor = input_tensor.to(torch::kCUDA); + */ + + std::vector inputs={input_tensor}; + + // evaluate the value of function + nn_outputs = nn.forward(inputs).toTensor()[0][m_output_index]; + + input_grad = torch::autograd::grad({nn_outputs}, {input_tensor})[0][0]; + + /* + if (use_gpu) + input_grad = input_grad.to(torch::kCPU); + */ + + x = nn_outputs.item() ; + + this->wrap(x); + +} + +void colvar::torchANN::calc_gradients() { + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + cv[i_cv]->calc_gradients(); + if (cv[i_cv]->is_enabled(f_cvc_explicit_gradient)) { + const cvm::real factor_polynomial = getPolynomialFactorOfCVGradient(i_cv); + // get the initial index of this cvc + size_t l = cvc_indices[i_cv]; + for (size_t j_elem = 0; j_elem < cv[i_cv]->value().size(); ++j_elem) { + // get derivative of neural network wrt its input + const cvm::real factor = input_grad[l+j_elem].item(); + for (size_t k_ag = 0 ; k_ag < cv[i_cv]->atom_groups.size(); ++k_ag) { + for (size_t l_atom = 0; l_atom < (cv[i_cv]->atom_groups)[k_ag]->size(); ++l_atom) { + (*(cv[i_cv]->atom_groups)[k_ag])[l_atom].grad = factor_polynomial * factor * (*(cv[i_cv]->atom_groups)[k_ag])[l_atom].grad; + } + } + } + } + } +} + +void colvar::torchANN::apply_force(colvarvalue const &force) { + + for (size_t i_cv = 0; i_cv < cv.size(); ++i_cv) { + // If this CV uses explicit gradients, then atomic gradients is already calculated + // We can apply the force to atom groups directly + if (cv[i_cv]->is_enabled(f_cvc_explicit_gradient)) { + for (size_t k_ag = 0 ; k_ag < cv[i_cv]->atom_groups.size(); ++k_ag) { + (cv[i_cv]->atom_groups)[k_ag]->apply_colvar_force(force.real_value); + } + } else { + const colvarvalue& current_cv_value = cv[i_cv]->value(); + colvarvalue cv_force(current_cv_value); + cv_force.reset(); + const cvm::real factor_polynomial = getPolynomialFactorOfCVGradient(i_cv); + // get the initial index of this cvc + size_t l = cvc_indices[i_cv]; + for (size_t j_elem = 0; j_elem < current_cv_value.size(); ++j_elem) { + cv_force[j_elem] = factor_polynomial * input_grad[l+j_elem].item() * force.real_value; + } + cv[i_cv]->apply_force(cv_force); + } + } +} + + +#else + +colvar::torchANN::torchANN() +{ + set_function_type("torchANN"); +} + +colvar::torchANN::~torchANN() {} + +int colvar::torchANN::init(std::string const &conf) { + + return cvm::error( + "torchANN requires the libtorch library, but it is not enabled during compilation.\n" + "Please refer to the Compilation Notes section of the Colvars manual for more " + "information.\n", + COLVARS_NOT_IMPLEMENTED); + +} + +void colvar::torchANN::calc_value() +{ +} + +#endif diff --git a/lib/colvars/colvarcomp_torchann.h b/lib/colvars/colvarcomp_torchann.h new file mode 100644 index 0000000000..ae241edbcc --- /dev/null +++ b/lib/colvars/colvarcomp_torchann.h @@ -0,0 +1,63 @@ +// -*- 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 COLVARCOMP_TORCH_H +#define COLVARCOMP_TORCH_H + +// Declaration of torchann + +#include + +#include "colvar.h" +#include "colvarcomp.h" +#include "colvarmodule.h" + +#ifdef COLVARS_TORCH + +#include +#include + +class colvar::torchANN + : public colvar::linearCombination +{ +protected: + torch::jit::script::Module nn; + /// the index of nn output component + size_t m_output_index = 0; + bool use_double_input = false; + //bool use_gpu; + // 1d tensor, concatenation of values of sub-cvcs + torch::Tensor input_tensor; + torch::Tensor nn_outputs; + torch::Tensor input_grad; + // record the initial index of of sub-cvcs in input_tensor + std::vector cvc_indices; +public: + torchANN(); + virtual ~torchANN(); + virtual int init(std::string const &conf); + virtual void calc_value(); + virtual void calc_gradients(); + virtual void apply_force(colvarvalue const &force); +}; + +#else + +class colvar::torchANN + : public colvar::cvc +{ +public: + torchANN(); + virtual ~torchANN(); + virtual int init(std::string const &conf); + virtual void calc_value(); +}; +#endif // COLVARS_TORCH checking + +#endif diff --git a/lib/colvars/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 46b7917569..3ba3209000 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -92,6 +92,8 @@ void colvardeps::restore_children_deps() { void colvardeps::provide(int feature_id, bool truefalse) { feature_states[feature_id].available = truefalse; + // Make sure that we don't leave this feature enabled + if (!truefalse) disable(feature_id); } @@ -123,8 +125,9 @@ bool colvardeps::get_keyval_feature(colvarparse *cvp, int colvardeps::enable(int feature_id, - bool dry_run /* default: false */, - bool toplevel /* default: true */) + bool dry_run /* default: false */, + bool toplevel /* default: true */, + bool error /*default: false */) { int res; size_t i, j; @@ -137,9 +140,12 @@ int colvardeps::enable(int feature_id, feature *f = features()[feature_id]; feature_state *fs = &feature_states[feature_id]; + // dry_run can be true because parent object is not active, yet we are displaying an error message + // then error is set to true + if (cvm::debug()) { cvm::log("DEPS: " + description + - (dry_run ? " testing " : " enabling ") + + (dry_run ? " testing " : " enabling ") + (error ? " [error] " : "") + "\"" + f->description +"\"\n"); } @@ -159,7 +165,7 @@ int colvardeps::enable(int feature_id, (is_dynamic(feature_id) ? "Dynamic" : "User-controlled"); if (!fs->available) { - if (!dry_run) { + if (!dry_run || error) { if (toplevel) { cvm::error("Error: " + feature_type_descr + " feature unavailable: \"" + f->description + "\" in " + description + ".\n"); @@ -172,7 +178,7 @@ int colvardeps::enable(int feature_id, } if (!toplevel && !is_dynamic(feature_id)) { - if (!dry_run) { + if (!dry_run || error) { cvm::log(feature_type_descr + " feature \"" + f->description + "\" cannot be enabled automatically in " + description + ".\n"); if (is_user(feature_id)) { @@ -189,7 +195,7 @@ int colvardeps::enable(int feature_id, if (cvm::debug()) cvm::log(f->description + " requires exclude " + g->description + "\n"); if (is_enabled(f->requires_exclude[i])) { - if (!dry_run) { + if (!dry_run || error) { cvm::log("Feature \"" + f->description + "\" is incompatible with \"" + g->description + "\" in " + description + ".\n"); if (toplevel) { @@ -204,10 +210,14 @@ int colvardeps::enable(int feature_id, for (i=0; irequires_self.size(); i++) { if (cvm::debug()) cvm::log(f->description + " requires self " + features()[f->requires_self[i]]->description + "\n"); - res = enable(f->requires_self[i], dry_run, false); + res = enable(f->requires_self[i], dry_run, false, error); if (res != COLVARS_OK) { - if (!dry_run) { - cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + if (!dry_run || error) { + if (toplevel) { + cvm::log("Cannot enable \"" + f->description + "\" in " + description + "\n"); + } else { + cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + } if (toplevel) { cvm::error("Error: Failed dependency in " + description + ".\n"); } @@ -225,11 +235,11 @@ int colvardeps::enable(int feature_id, int g = f->requires_alt[i][j]; if (cvm::debug()) cvm::log(f->description + " requires alt " + features()[g]->description + "\n"); - res = enable(g, true, false); // see if available + res = enable(g, true, false, error); // see if available if (res == COLVARS_OK) { ok = true; - if (!dry_run) { - enable(g, false, false); // Require again, for real + if (!dry_run || error) { + enable(g, false, false, error); // Require again, for real fs->alternate_refs.push_back(g); // We remember we enabled this // so we can free it if this feature gets disabled } @@ -245,7 +255,7 @@ int colvardeps::enable(int feature_id, for (j=0; jrequires_alt[i].size(); j++) { int g = f->requires_alt[i][j]; cvm::log(cvm::to_str(j+1) + ". " + features()[g]->description + "\n"); - enable(g, false, false); // Just for printing error output + enable(g, false, false, true); // Just for printing error output } cvm::decrease_depth(); cvm::log("-----------------------------------------\n"); @@ -264,10 +274,14 @@ int colvardeps::enable(int feature_id, for (i=0; irequires_children.size(); i++) { int g = f->requires_children[i]; for (j=0; jenable(g, dry_run || !is_enabled(), false); + res = children[j]->enable(g, dry_run || !is_enabled(), false, error); if (res != COLVARS_OK) { - if (!dry_run) { - cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + if (!dry_run || error) { + if (toplevel) { + cvm::log("Cannot enable \"" + f->description + "\" in " + description + "\n"); + } else { + cvm::log("...required by \"" + f->description + "\" in " + description + "\n"); + } if (toplevel) { cvm::error("Error: Failed dependency in " + description + ".\n"); } diff --git a/lib/colvars/colvardeps.h b/lib/colvars/colvardeps.h index 1bd304b545..92e7a88326 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -198,7 +198,9 @@ public: /// \param toplevel False if this is called as part of a chain of dependency resolution. /// This is used to diagnose failed dependencies by displaying the full stack: /// only the toplevel dependency will throw a fatal error. - int enable(int f, bool dry_run = false, bool toplevel = true); + /// \param error Recursively enable, printing error messages along the way + /// Necessary when propagating errors across alternate dependencies + int enable(int f, bool dry_run = false, bool toplevel = true, bool error = false); /// Disable a feature, decrease the reference count of its dependencies /// and recursively disable them as applicable @@ -255,6 +257,8 @@ public: f_cvb_scale_biasing_force, /// \brief whether this bias is applied to one or more ext-Lagrangian colvars f_cvb_extended, + /// Process this bias's data in parallel over multiple CPU threads + f_cvb_smp, f_cvb_ntot }; @@ -263,8 +267,11 @@ public: f_cv_active, /// \brief Colvar is awake (active on its own accord) this timestep f_cv_awake, - /// \brief Gradients are calculated and temporarily stored, so - /// that external forces can be applied + /// \brief External force can be applied, either to atoms or to an + /// extended DOF + f_cv_apply_force, + /// \brief Gradients are calculated and temporarily stored, + /// so that external forces can be propagated to atoms f_cv_gradient, /// \brief Collect atomic gradient data from all cvcs into vector /// atomic_gradient @@ -277,7 +284,10 @@ public: /// forces on the inverse gradient f_cv_total_force, /// \brief Calculate total force from atomic forces + /// or get it from the back-end for an external parameter f_cv_total_force_calc, + /// \brief Total force is that of current time step + f_cv_total_force_current_step, /// \brief Subtract the applied force from the total force f_cv_subtract_applied_force, /// \brief Estimate Jacobian derivative @@ -289,8 +299,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) + /// \brief A variable that constrains or follows an external parameter + /// in the back-end (eg. an alchemical coupling parameter for lambda-dynamics) + /// If extended Lagrangian, then we drive the external parameter + /// Otherwise we follow it /// Can have a single component f_cv_external, /// \brief The extended system coordinate undergoes Langevin dynamics diff --git a/lib/colvars/colvargrid.cpp b/lib/colvars/colvargrid.cpp index 11693a7587..ad42966943 100644 --- a/lib/colvars/colvargrid.cpp +++ b/lib/colvars/colvargrid.cpp @@ -24,15 +24,14 @@ colvar_grid_count::colvar_grid_count() mult = 1; } -colvar_grid_count::colvar_grid_count(std::vector const &nx_i, - size_t const &def_count) - : colvar_grid(nx_i, def_count, 1) +colvar_grid_count::colvar_grid_count(std::vector &colvars, + std::string config) + : colvar_grid(colvars, 0, 1, false, nullptr, config) {} colvar_grid_count::colvar_grid_count(std::vector &colvars, - size_t const &def_count, - bool margin) - : colvar_grid(colvars, def_count, 1, margin) + std::shared_ptr params) + : colvar_grid(colvars, 0, 1, false, params) {} std::string colvar_grid_count::get_state_params() const @@ -132,13 +131,17 @@ colvar_grid_scalar::colvar_grid_scalar(colvar_grid_scalar const &g) { } -colvar_grid_scalar::colvar_grid_scalar(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, 1), samples(NULL) +colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, + std::shared_ptr params, + bool add_extra_bin, + std::string config) + : colvar_grid(colvars, 0.0, 1, add_extra_bin, params, config), samples(NULL) { } -colvar_grid_scalar::colvar_grid_scalar(std::vector &colvars, bool margin) - : colvar_grid(colvars, 0.0, 1, margin), samples(NULL) +colvar_grid_scalar::colvar_grid_scalar(std::string const &filename) + : colvar_grid(filename, 1), + samples(nullptr) { } @@ -330,89 +333,37 @@ cvm::real colvar_grid_scalar::grid_rmsd(colvar_grid_scalar const &other_grid) co colvar_grid_gradient::colvar_grid_gradient() - : colvar_grid(), samples(NULL), full_samples(0), min_samples(0) + : colvar_grid(), samples(NULL) {} -colvar_grid_gradient::colvar_grid_gradient(std::vector const &nx_i) - : colvar_grid(nx_i, 0.0, nx_i.size()), samples(NULL), full_samples(0), min_samples(0) -{} +// colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, std::string config) +// : colvar_grid(colvars, 0.0, colvars.size(), false, nullptr, config), samples(NULL) +// {} +// colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, +// std::shared_ptr samples_in) +// : colvar_grid(colvars, 0.0, colvars.size(), false, samples_in), samples(samples_in) +// { +// if (samples_in) +// samples_in->has_parent_data = true; +// } -colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars) - : colvar_grid(colvars, 0.0, colvars.size()), samples(NULL), full_samples(0), min_samples(0) -{} - - -colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, std::shared_ptr samples_in) - : colvar_grid(colvars, 0.0, colvars.size()), samples(samples_in), full_samples(0), min_samples(0) +colvar_grid_gradient::colvar_grid_gradient(std::vector &colvars, + std::shared_ptr samples_in, + std::shared_ptr params, + std::string config) + : colvar_grid(colvars, 0.0, colvars.size(), false, params, config), samples(samples_in) { - samples_in->has_parent_data = true; + if (samples_in) + samples_in->has_parent_data = true; } -colvar_grid_gradient::colvar_grid_gradient(std::string &filename) - : colvar_grid(), - samples(NULL) +colvar_grid_gradient::colvar_grid_gradient(std::string const &filename) + : colvar_grid(filename, 0), + samples(nullptr) { - std::istream &is = cvm::main()->proxy->input_stream(filename, - "gradient file"); - if (!is) { - 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; - - if (nd > 50) { - cvm::error("Error: excessive number of dimensions in file \""+ - filename+"\". Please ensure that the file is not corrupt.\n", - COLVARS_INPUT_ERROR); - return; - } - - 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); - cvm::main()->proxy->close_input_stream(filename); } std::string colvar_grid_gradient::get_state_params() const @@ -586,12 +537,13 @@ cvm::real colvar_grid_gradient::grid_rmsd(colvar_grid_gradient const &other_grid } -integrate_potential::integrate_potential(std::vector &colvars, std::shared_ptr gradients) - : colvar_grid_scalar(colvars, true), +integrate_potential::integrate_potential(std::vector &colvars, + std::shared_ptr gradients) + : colvar_grid_scalar(colvars, gradients, true), b_smoothed(false), gradients(gradients) { - // parent class colvar_grid_scalar is constructed with margin option set to true + // parent class colvar_grid_scalar is constructed with add_extra_bin option set to true // hence PMF grid is wider than gradient grid if non-PBC if (nd > 1) { diff --git a/lib/colvars/colvargrid.h b/lib/colvars/colvargrid.h index 4cbbb10961..697b46a560 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -19,17 +19,13 @@ #include "colvarparse.h" -/// \brief Grid of values of a function of several collective -/// variables \param T The data type -/// -/// Only scalar colvars supported so far: vector colvars are treated as arrays -template class colvar_grid : public colvarparse { - - //protected: -public: // TODO create accessors for these after all instantiations work +/// \brief Unified base class for grid of values of a function of several collective +/// variables +class colvar_grid_params { +public: /// Number of dimensions - size_t nd; + size_t nd = 0; /// Number of points along each dimension std::vector nx; @@ -37,6 +33,27 @@ public: // TODO create accessors for these after all instantiations work /// Cumulative number of points along each dimension std::vector nxc; + /// Lower boundaries of the colvars in this grid + std::vector lower_boundaries; + + /// Upper boundaries of the colvars in this grid + std::vector upper_boundaries; + + /// Widths of the colvars in this grid + std::vector widths; +}; + + +/// \brief Grid of values of a function of several collective +/// variables \param T The data type +/// +/// Only scalar colvars supported so far: vector colvars are treated as arrays +/// All common, type-independent members are collected in the base class colvar_grid_base +template class colvar_grid : public colvar_grid_params, public colvarparse { + + //protected: +public: // TODO create accessors for these after all instantiations work + /// \brief Multiplicity of each datum (allow the binning of /// non-scalar types such as atomic gradients) size_t mult; @@ -73,13 +90,6 @@ public: // TODO create accessors for these after all instantiations work } public: - - /// Lower boundaries of the colvars in this grid - std::vector lower_boundaries; - - /// Upper boundaries of the colvars in this grid - std::vector upper_boundaries; - /// Whether some colvars are periodic std::vector periodic; @@ -89,9 +99,6 @@ public: /// Whether some colvars have hard upper boundaries std::vector hard_upper_boundaries; - /// Widths of the colvars in this grid - std::vector widths; - /// True if this is a count grid related to another grid of data bool has_parent_data; @@ -218,19 +225,15 @@ public: /// \brief "Almost copy-constructor": only copies configuration /// parameters from another grid, but doesn't reallocate stuff; /// setup() must be called after that; - colvar_grid(colvar_grid const &g) : colvarparse(), - nd(g.nd), - nx(g.nx), + colvar_grid(colvar_grid const &g) : colvar_grid_params(colvar_grid_params(g)), + colvarparse(), mult(g.mult), data(), cv(g.cv), use_actual_value(g.use_actual_value), - lower_boundaries(g.lower_boundaries), - upper_boundaries(g.upper_boundaries), periodic(g.periodic), hard_lower_boundaries(g.hard_lower_boundaries), hard_upper_boundaries(g.hard_upper_boundaries), - widths(g.widths), has_parent_data(false), has_data(false) {} @@ -247,22 +250,31 @@ public: this->setup(nx_i, t, mult_i); } - /// \brief Constructor from a vector of colvars + /// \brief Constructor from a vector of colvars or an optional grid config string /// \param add_extra_bin requests that non-periodic dimensions are extended /// by 1 bin to accommodate the integral (PMF) of another gridded quantity (gradient) colvar_grid(std::vector const &colvars, T const &t = T(), size_t mult_i = 1, - bool add_extra_bin = false) + bool add_extra_bin = false, + std::shared_ptr params = nullptr, + std::string config = std::string()) : has_parent_data(false), has_data(false) { (void) t; - this->init_from_colvars(colvars, mult_i, add_extra_bin); + this->init_from_colvars(colvars, mult_i, add_extra_bin, params, config); } + /// \brief Constructor from a multicol file + /// \param filename multicol file containing data to be read + /// \param multi_i multiplicity of the data - if 0, assume gradient multiplicity (mult = nd) + colvar_grid(std::string const &filename, size_t mult_i = 1); + int init_from_colvars(std::vector const &colvars, size_t mult_i = 1, - bool add_extra_bin = false) + bool add_extra_bin = false, + std::shared_ptr params = nullptr, + std::string config = std::string()) { if (cvm::debug()) { cvm::log("Reading grid configuration from collective variables.\n"); @@ -279,8 +291,7 @@ public: " collective variables, multiplicity = "+cvm::to_str(mult_i)+".\n"); } - for (i = 0; i < cv.size(); i++) { - + for (i = 0; i < nd; i++) { if (cv[i]->value().type() != colvarvalue::type_scalar) { cvm::error("Colvar grids can only be automatically " "constructed for scalar variables. " @@ -298,7 +309,6 @@ public: widths.push_back(cv[i]->width); hard_lower_boundaries.push_back(cv[i]->is_enabled(colvardeps::f_cv_hard_lower_boundary)); hard_upper_boundaries.push_back(cv[i]->is_enabled(colvardeps::f_cv_hard_upper_boundary)); - periodic.push_back(cv[i]->periodic_boundaries()); // By default, get reported colvar value (for extended Lagrangian colvars) use_actual_value.push_back(false); @@ -310,22 +320,55 @@ public: use_actual_value[i-1] = true; } + // This needs to work if the boundaries are undefined in the colvars + lower_boundaries.push_back(cv[i]->lower_boundary); + upper_boundaries.push_back(cv[i]->upper_boundary); + } + + // Replace widths and boundaries with optional custom configuration + if (!config.empty()) { + this->parse_params(config); + this->check_keywords(config, "grid"); + + if (params) { + cvm::error("Error: init_from_colvars was passed both a grid config and a template grid.", COLVARS_BUG_ERROR); + return COLVARS_BUG_ERROR; + } + } else if (params) { + // Match grid sizes with template + + if (params->nd != nd) { + cvm::error("Trying to initialize grid from template with wrong dimension (" + + cvm::to_str(params->nd) + " instead of " + + cvm::to_str(this->nd) + ")."); + return COLVARS_ERROR; + } + + widths =params->widths; + lower_boundaries =params->lower_boundaries; + upper_boundaries =params->upper_boundaries; + } + + // Only now can we determine periodicity + for (i = 0; i < nd; i++) { + periodic.push_back(cv[i]->periodic_boundaries(lower_boundaries[i].real_value, + upper_boundaries[i].real_value)); + if (add_extra_bin) { + // Shift the grid by half the bin width (values at edges instead of center of bins) + lower_boundaries[i] -= 0.5 * widths[i]; + if (periodic[i]) { - // Shift the grid by half the bin width (values at edges instead of center of bins) - lower_boundaries.push_back(cv[i]->lower_boundary.real_value - 0.5 * widths[i]); - upper_boundaries.push_back(cv[i]->upper_boundary.real_value - 0.5 * widths[i]); + // Just shift + upper_boundaries[i] -= 0.5 * widths[i]; } else { - // Make this grid larger by one bin width - lower_boundaries.push_back(cv[i]->lower_boundary.real_value - 0.5 * widths[i]); - upper_boundaries.push_back(cv[i]->upper_boundary.real_value + 0.5 * widths[i]); + // Widen grid by one bin width + upper_boundaries[i] += 0.5 * widths[i]; } - } else { - lower_boundaries.push_back(cv[i]->lower_boundary); - upper_boundaries.push_back(cv[i]->upper_boundary); } } + // Reset grid sizes based on widths and boundaries this->init_from_boundaries(); return this->setup(); } @@ -966,14 +1009,12 @@ public: virtual ~colvar_grid_count() {} - /// Constructor - colvar_grid_count(std::vector const &nx_i, - size_t const &def_count = 0); - - /// Constructor from a vector of colvars + /// Constructor from a vector of colvars or a config string colvar_grid_count(std::vector &colvars, - size_t const &def_count = 0, - bool add_extra_bin = false); + std::shared_ptr params = nullptr); + + colvar_grid_count(std::vector &colvars, + std::string config); /// Increment the counter at given position inline void incr_count(std::vector const &ix) @@ -1255,12 +1296,14 @@ public: /// Destructor virtual ~colvar_grid_scalar(); - /// Constructor from specific sizes arrays - colvar_grid_scalar(std::vector const &nx_i); - /// Constructor from a vector of colvars colvar_grid_scalar(std::vector &colvars, - bool add_extra_bin = false); + std::shared_ptr params = nullptr, + bool add_extra_bin = false, + std::string config = std::string()); + + /// Constructor from a multicol file + colvar_grid_scalar(std::string const &filename); /// Accumulate the value inline void acc_value(std::vector const &ix, @@ -1334,8 +1377,8 @@ public: /// \brief Return the gradient of the scalar field from finite differences /// Input coordinates are those of gradient grid, shifted wrt scalar grid - /// Should not be called on edges of scalar grid, provided the latter has margins - /// wrt gradient grid + /// Should not be called on edges of scalar grid, provided the latter has + /// margins (extra bins) wrt gradient grid inline void vector_gradient_finite_diff( const std::vector &ix0, std::vector &grad) { cvm::real A0, A1; @@ -1566,17 +1609,21 @@ public: virtual ~colvar_grid_gradient() {} - /// Constructor from specific sizes arrays - colvar_grid_gradient(std::vector const &nx_i); + // /// Constructor from specific sizes arrays + // colvar_grid_gradient(std::vector const &nx_i); - /// Constructor from a vector of colvars - colvar_grid_gradient(std::vector &colvars); + // /// Constructor from a vector of colvars + // colvar_grid_gradient(std::vector &colvars, + // std::string config = std::string()); /// Constructor from a multicol file - colvar_grid_gradient(std::string &filename); + colvar_grid_gradient(std::string const &filename); /// Constructor from a vector of colvars and a pointer to the count grid - colvar_grid_gradient(std::vector &colvars, std::shared_ptr samples_in); + colvar_grid_gradient(std::vector &colvars, + std::shared_ptr samples_in = nullptr, + std::shared_ptr params = nullptr, + std::string config = std::string()); /// Parameters for smoothing data with low sampling int full_samples; @@ -1829,7 +1876,8 @@ class integrate_potential : public colvar_grid_scalar {} /// Constructor from a vector of colvars + gradient grid - integrate_potential(std::vector &colvars, std::shared_ptr gradients); + integrate_potential(std::vector &colvars, + std::shared_ptr gradients); /// Constructor from a gradient grid (for processing grid files without a Colvars config) integrate_potential(std::shared_ptr gradients); diff --git a/lib/colvars/colvargrid_def.h b/lib/colvars/colvargrid_def.h index fa6531271b..96075e1ffe 100644 --- a/lib/colvars/colvargrid_def.h +++ b/lib/colvars/colvargrid_def.h @@ -22,6 +22,62 @@ #include "colvars_memstream.h" +template +colvar_grid::colvar_grid(std::string const &filename, size_t mult_i) +{ +std::istream &is = cvm::main()->proxy->input_stream(filename, "multicol grid file"); +if (!is) { + 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 = (mult_i == 0) ? nd : mult_i; + +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); +cvm::main()->proxy->close_input_stream(filename); +} + + template IST &read_restart_template_(colvar_grid &g, IST &is) { auto const start_pos = is.tellg(); @@ -203,14 +259,16 @@ template int colvar_grid::parse_params(std::string const &conf, lower_boundaries, lower_boundaries, colvarparse::parse_silent); colvarparse::get_keyval(conf, "upper_boundaries", upper_boundaries, upper_boundaries, colvarparse::parse_silent); + // plural form is used in state file + colvarparse::get_keyval(conf, "widths", widths, widths, colvarparse::parse_silent); // camel case keywords are used in config file - colvarparse::get_keyval(conf, "lowerBoundaries", + colvarparse::get_keyval(conf, "lowerBoundary", lower_boundaries, lower_boundaries, parse_mode); - colvarparse::get_keyval(conf, "upperBoundaries", + colvarparse::get_keyval(conf, "upperBoundary", upper_boundaries, upper_boundaries, parse_mode); - colvarparse::get_keyval(conf, "widths", widths, widths, parse_mode); + colvarparse::get_keyval(conf, "width", widths, widths, parse_mode); // only used in state file colvarparse::get_keyval(conf, "sizes", nx, nx, colvarparse::parse_silent); diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 25b1efe209..34485d7883 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -24,6 +24,7 @@ #include "colvarbias_histogram_reweight_amd.h" #include "colvarbias_meta.h" #include "colvarbias_restraint.h" +#include "colvarbias_opes.h" #include "colvarscript.h" #include "colvaratoms.h" #include "colvarcomp.h" @@ -109,23 +110,23 @@ colvarmodule::colvarmodule(colvarproxy *proxy_in) " https://doi.org/10.1080/00268976.2013.813594\n" "as well as all other papers listed below for individual features used.\n"); -#if (__cplusplus >= 201103L) - 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" - " https://colvars.github.io/README-c++11.html\n"); -#endif - cvm::log("Summary of compile-time features available in this build:\n"); - if (proxy->check_smp_enabled() == COLVARS_NOT_IMPLEMENTED) { - cvm::log(" - SMP parallelism: not available\n"); + std::string cxx_lang_msg(" - C++ language version: " + cvm::to_str(__cplusplus)); +#if defined(_WIN32) && !defined(__CYGWIN__) + cxx_lang_msg += std::string(" (warning: may not be accurate for this build)"); +#endif + cxx_lang_msg += std::string("\n"); + cvm::log(cxx_lang_msg); + + if (proxy->check_replicas_enabled() == COLVARS_NOT_IMPLEMENTED) { + cvm::log(" - Multiple replicas: not available\n"); } else { - if (proxy->check_smp_enabled() == COLVARS_OK) { - cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + if (proxy->check_replicas_enabled() == COLVARS_OK) { + cvm::log(" - Multiple replicas: enabled (replica number " + + to_str(proxy->replica_index() + 1) + " of " + to_str(proxy->num_replicas()) + ")\n"); } else { - cvm::log(" - SMP parallelism: available, but not enabled\n"); + cvm::log(" - Multiple replicas: available, but not (yet) enabled\n"); } } @@ -201,6 +202,20 @@ std::vector *colvarmodule::variables_active_smp_items() } +int colvarmodule::calc_component_smp(int i) +{ + colvar *x = (*(variables_active_smp()))[i]; + int x_item = (*(variables_active_smp_items()))[i]; + if (cvm::debug()) { + cvm::log("Thread "+cvm::to_str(proxy->smp_thread_id())+"/"+ + cvm::to_str(proxy->smp_num_threads())+ + ": calc_component_smp(), i = "+cvm::to_str(i)+", cv = "+ + x->name+", cvc = "+cvm::to_str(x_item)+"\n"); + } + return x->calc_cvcs(x_item, 1); +} + + std::vector *colvarmodule::biases_active() { return &(biases_active_); @@ -387,8 +402,26 @@ int colvarmodule::parse_global_params(std::string const &conf) } } - if (parse->get_keyval(conf, "smp", proxy->b_smp_active, proxy->b_smp_active)) { - if (proxy->b_smp_active == false) { + std::string smp; + if (parse->get_keyval(conf, "smp", smp, "cvcs")) { + if (smp == "cvcs" || smp == "on" || smp == "yes") { + if (proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::cvcs) != COLVARS_OK) { + cvm::error("Colvars component-based parallelism is not implemented.\n"); + return COLVARS_INPUT_ERROR; + } else { + cvm::log("SMP parallelism will be applied to Colvars components.\n"); + cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + } + } else if (smp == "inner_loop") { + if (proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::inner_loop) != COLVARS_OK) { + cvm::error("SMP parallelism inside the calculation of Colvars components is not implemented.\n"); + return COLVARS_INPUT_ERROR; + } else { + cvm::log("SMP parallelism will be applied inside the Colvars components.\n"); + cvm::log(" - SMP parallelism: enabled (num. threads = " + to_str(proxy->smp_num_threads()) + ")\n"); + } + } else { + proxy->set_smp_mode(colvarproxy_smp::smp_mode_t::none); cvm::log("SMP parallelism has been disabled.\n"); } } @@ -589,6 +622,9 @@ int colvarmodule::parse_biases(std::string const &conf) /// initialize reweightaMD instances parse_biases_type(conf, "reweightaMD"); + /// initialize OPES instances + parse_biases_type(conf, "opes_metad"); + if (use_scripted_forces) { cvm::log(cvm::line_marker); cvm::increase_depth(); @@ -922,7 +958,7 @@ int colvarmodule::calc_colvars() } // if SMP support is available, split up the work - if (proxy->check_smp_enabled() == COLVARS_OK) { + if (proxy->get_smp_mode() == colvarproxy_smp::smp_mode_t::cvcs) { // first, calculate how much work (currently, how many active CVCs) each colvar has @@ -948,8 +984,10 @@ int colvarmodule::calc_colvars() } cvm::decrease_depth(); - // calculate colvar components in parallel - error_code |= proxy->smp_colvars_loop(); + // calculate active colvar components in parallel + error_code |= proxy->smp_loop(variables_active_smp()->size(), [](int i) { + return cvm::main()->calc_component_smp(i); + }); cvm::increase_depth(); for (cvi = variables_active()->begin(); cvi != variables_active()->end(); cvi++) { @@ -1013,7 +1051,7 @@ int colvarmodule::calc_biases() } // If SMP support is available, split up the work (unless biases need to use main thread's memory) - if (proxy->check_smp_enabled() == COLVARS_OK && !biases_need_main_thread) { + if (proxy->get_smp_mode() == colvarproxy::smp_mode_t::cvcs && !biases_need_main_thread) { if (use_scripted_forces && !scripting_after_biases) { // calculate biases and scripted forces in parallel @@ -1097,7 +1135,7 @@ int colvarmodule::update_colvar_forces() cvm::log("Communicating forces from the colvars to the atoms.\n"); cvm::increase_depth(); for (cvi = variables_active()->begin(); cvi != variables_active()->end(); cvi++) { - if ((*cvi)->is_enabled(colvardeps::f_cv_gradient)) { + if ((*cvi)->is_enabled(colvardeps::f_cv_apply_force)) { (*cvi)->communicate_forces(); if (cvm::get_error()) { return COLVARS_ERROR; @@ -1986,7 +2024,7 @@ size_t & colvarmodule::depth() { // NOTE: do not call log() or error() here, to avoid recursion colvarmodule *cv = cvm::main(); - if (proxy->check_smp_enabled() == COLVARS_OK) { + if (proxy->get_smp_mode() == colvarproxy::smp_mode_t::cvcs) { int const nt = proxy->smp_num_threads(); if (int(cv->depth_v.size()) != nt) { proxy->smp_lock(); diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index fa84b1ad75..5f042767dc 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -18,6 +18,11 @@ #define COLVARS_DEBUG false #endif +#if defined(__FAST_MATH__) +// NOTE: This is used for fixing https://github.com/Colvars/colvars/issues/767 +#define COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC +#endif + /*! \mainpage Main page This is the Developer's documentation for the Collective Variables module (Colvars). @@ -147,17 +152,44 @@ 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)); - } +#ifndef PI +#define PI 3.14159265358979323846 +#endif +#ifndef PI_2 +#define PI_2 1.57079632679489661923 +#endif - /// Reimplemented to work around MS compiler issues - static inline real acos(real const &x) - { +/// Reimplemented to work around compiler issues; return hard-coded values for boundary conditions +static inline real asin(real const &x) +{ +#ifdef COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC + if (x <= -1.0) { + return -PI_2; + } else if (x >= 1.0) { + return PI_2; + } else { + return ::asin(static_cast(x)); + } +#else + return ::asin(static_cast(x)); +#endif +} + +/// Reimplemented to work around compiler issues; return hard-coded values for boundary conditions +static inline real acos(real const &x) +{ +#ifdef COLVARS_BOUNDED_INV_TRIGONOMETRIC_FUNC + if (x <= -1.0) { + return PI; + } else if (x >= 1.0) { + return 0.0; + } else { + return ::acos(static_cast(x)); + } +#else return ::acos(static_cast(x)); - } +#endif +} /// Reimplemented to work around MS compiler issues static inline real atan2(real const &x, real const &y) @@ -307,6 +339,9 @@ public: /// Indexes of the items to calculate for each colvar std::vector *variables_active_smp_items(); + /// Calculate the value of the specified component (to be called in a SMP loop) + int calc_component_smp(int i); + /// Array of collective variable biases std::vector biases; diff --git a/lib/colvars/colvarmodule_refs.h b/lib/colvars/colvarmodule_refs.h index 2e9615e3b4..0317567502 100644 --- a/lib/colvars/colvarmodule_refs.h +++ b/lib/colvars/colvarmodule_refs.h @@ -129,6 +129,23 @@ " url = {https://doi.org/10.1002/jcc.26075}\n" "}\n"; + paper_count_[std::string("Fiorin2024")] = 0; + paper_url_[std::string("Fiorin2024")] = "https://doi.org/10.1021/acs.jpcb.4c05604"; + paper_bibtex_[std::string("Fiorin2024")] = + "\n" + "@article{Fiorin2024,\n" + " author = {Fiorin, Giacomo and Marinelli, Fabrizio and Forrest, Lucy R. and Chen, Haochuan and Chipot, Christophe and Kohlmeyer, Axel and Santuz, Hubert and H{\\'e}nin, J{\\'e}rôme},\n" + " title = {Expanded Functionality and Portability for the Colvars Library},\n" + " journal = {J. Phys. Chem. {B}},\n" + " volume = {128},\n" + " number = {45},\n" + " pages = {11108--11123},\n" + " year = {2024},\n" + " doi = {10.1021/acs.jpcb.4c05604},\n" + " pmid = 39501453,\n" + " url = { https://doi.org/10.1021/acs.jpcb.4c05604}\n" + "}\n"; + paper_count_[std::string("Fu2016")] = 0; paper_url_[std::string("Fu2016")] = "https://doi.org/10.1021/acs.jctc.6b00447"; paper_bibtex_[std::string("Fu2016")] = @@ -227,6 +244,20 @@ " url = {https://doi.org/10.1016/0263-7855(96)00018-5}\n" "}\n"; + paper_count_[std::string("Lagardere2023")] = 0; + paper_url_[std::string("Lagardere2023")] = "https://arxiv.org/abs/2307.08006"; + paper_bibtex_[std::string("Lagardere2023")] = + "\n" + "@misc{Lagardere2023,\n" + " title={Lambda-ABF: Simplified, Accurate and Cost-effective Alchemical Free Energy Computations},\n" + " author={Louis Lagard\\`ere and Lise Maurin and Olivier Adjoua and Krystel El Hage and Pierre Monmarch\\'e and Jean-Philip Piquemal and J\\'er\\^ome H\\'enin},\n" + " year={2023},\n" + " eprint={2307.08006},\n" + " archivePrefix={arXiv},\n" + " primaryClass={physics.chem-ph},\n" + " url = {https://arxiv.org/abs/2307.08006}\n" + "}\n"; + paper_count_[std::string("Lesage2017")] = 0; paper_url_[std::string("Lesage2017")] = "https://doi.org/10.1021/acs.jpcb.6b10055"; paper_bibtex_[std::string("Lesage2017")] = @@ -344,6 +375,45 @@ " url = {https://doi.org/10.1021/ct500320c}\n" "}\n"; + paper_count_[std::string("Invernizzi2020")] = 0; + paper_url_[std::string("Invernizzi2020")] = "https://pubs.acs.org/doi/10.1021/acs.jpclett.0c00497"; + paper_bibtex_[std::string("Invernizzi2020")] = + "\n" + "@article{Invernizzi2020,\n" + " title = {Rethinking {Metadynamics}: {From} {Bias} {Potentials} to {Probability} {Distributions}},\n" + " volume = {11},\n" + " issn = {1948-7185, 1948-7185},\n" + " shorttitle = {Rethinking {Metadynamics}},\n" + " url = {https://pubs.acs.org/doi/10.1021/acs.jpclett.0c00497},\n" + " doi = {10.1021/acs.jpclett.0c00497},\n" + " number = {7},\n" + " urldate = {2020-09-30},\n" + " journal = {J. Phys. Chem. Lett.},\n" + " author = {Invernizzi, Michele and Parrinello, Michele},\n" + " month = apr,\n" + " year = {2020},\n" + " pages = {2731--2736},\n" + "}\n"; + + paper_count_[std::string("Invernizzi2022")] = 0; + paper_url_[std::string("Invernizzi2022")] = "https://doi.org/10.1021/acs.jctc.2c00152"; + paper_bibtex_[std::string("Invernizzi2022")] = + "\n" + "@article{Invernizzi2022,\n" + " title = {Exploration vs {Convergence} {Speed} in {Adaptive}-{Bias} {Enhanced} {Sampling}},\n" + " volume = {18},\n" + " issn = {1549-9618},\n" + " url = {https://doi.org/10.1021/acs.jctc.2c00152},\n" + " doi = {10.1021/acs.jctc.2c00152},\n" + " number = {6},\n" + " urldate = {2024-07-02},\n" + " journal = {J. Chem. Theory Comput.},\n" + " author = {Invernizzi, Michele and Parrinello, Michele},\n" + " month = jun,\n" + " year = {2022},\n" + " pages = {3988--3996},\n" + "}\n"; + paper_count_[std::string("n/a")] = 0; paper_url_[std::string("n/a")] = ""; paper_bibtex_[std::string("n/a")] = ""; @@ -489,6 +559,42 @@ feature_count_[std::string("Multi-Map collective variables")] = 0; feature_paper_map_[std::string("Multi-Map collective variables")] = "Fiorin2020"; + feature_count_[std::string("Colvars-GROMACS interface")] = 0; + feature_paper_map_[std::string("Colvars-GROMACS interface")] = "Fiorin2024"; + + feature_count_[std::string("gspath colvar component")] = 0; + feature_paper_map_[std::string("gspath colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gzpath colvar component")] = 0; + feature_paper_map_[std::string("gzpath colvar component")] = "Fiorin2024"; + + feature_count_[std::string("linearCombination colvar component")] = 0; + feature_paper_map_[std::string("linearCombination colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gspathCV colvar component")] = 0; + feature_paper_map_[std::string("gspathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("gzpathCV colvar component")] = 0; + feature_paper_map_[std::string("gzpathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("aspathCV colvar component")] = 0; + feature_paper_map_[std::string("aspathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("azpathCV colvar component")] = 0; + feature_paper_map_[std::string("azpathCV colvar component")] = "Fiorin2024"; + + feature_count_[std::string("Custom functions (Lepton)")] = 0; + feature_paper_map_[std::string("Custom functions (Lepton)")] = "Fiorin2024"; + + feature_count_[std::string("Scripted functions (Tcl)")] = 0; + feature_paper_map_[std::string("Scripted functions (Tcl)")] = "Fiorin2024"; + + feature_count_[std::string("ABMD bias")] = 0; + feature_paper_map_[std::string("ABMD bias")] = "Fiorin2024"; + + feature_count_[std::string("Updated multiple-walker ABF implementation")] = 0; + feature_paper_map_[std::string("Updated multiple-walker ABF implementation")] = "Fiorin2024"; + feature_count_[std::string("Umbrella-integration eABF estimator")] = 0; feature_paper_map_[std::string("Umbrella-integration eABF estimator")] = "Fu2016"; @@ -525,6 +631,15 @@ feature_count_[std::string("VMD engine")] = 0; feature_paper_map_[std::string("VMD engine")] = "Humphrey1996"; + feature_count_[std::string("alchLambda colvar component")] = 0; + feature_paper_map_[std::string("alchLambda colvar component")] = "Lagardere2023"; + + feature_count_[std::string("alchFLambda colvar component")] = 0; + feature_paper_map_[std::string("alchFLambda colvar component")] = "Lagardere2023"; + + feature_count_[std::string("Tinker-HP interface")] = 0; + feature_paper_map_[std::string("Tinker-HP interface")] = "Lagardere2023"; + feature_count_[std::string("eABF implementation")] = 0; feature_paper_map_[std::string("eABF implementation")] = "Lesage2017"; @@ -555,38 +670,14 @@ feature_count_[std::string("ALB colvar bias implementation")] = 0; feature_paper_map_[std::string("ALB colvar bias implementation")] = "White2014"; - feature_count_[std::string("Colvars-GROMACS interface")] = 0; - feature_paper_map_[std::string("Colvars-GROMACS interface")] = "n/a"; + feature_count_[std::string("OPES")] = 0; + feature_paper_map_[std::string("OPES")] = "Invernizzi2020"; - feature_count_[std::string("gspath colvar component")] = 0; - feature_paper_map_[std::string("gspath colvar component")] = "n/a"; - - feature_count_[std::string("gzpath colvar component")] = 0; - feature_paper_map_[std::string("gzpath colvar component")] = "n/a"; - - feature_count_[std::string("linearCombination colvar component")] = 0; - feature_paper_map_[std::string("linearCombination colvar component")] = "n/a"; - - feature_count_[std::string("gspathCV colvar component")] = 0; - feature_paper_map_[std::string("gspathCV colvar component")] = "n/a"; - - feature_count_[std::string("gzpathCV colvar component")] = 0; - feature_paper_map_[std::string("gzpathCV colvar component")] = "n/a"; - - feature_count_[std::string("aspathCV colvar component")] = 0; - feature_paper_map_[std::string("aspathCV colvar component")] = "n/a"; - - feature_count_[std::string("azpathCV colvar component")] = 0; - feature_paper_map_[std::string("azpathCV colvar component")] = "n/a"; + feature_count_[std::string("OPES explore or adaptive kernels")] = 0; + feature_paper_map_[std::string("OPES explore or adaptive kernels")] = "Invernizzi2022"; feature_count_[std::string("coordNum pairlist")] = 0; feature_paper_map_[std::string("coordNum pairlist")] = "n/a"; - feature_count_[std::string("Custom functions (Lepton)")] = 0; - feature_paper_map_[std::string("Custom functions (Lepton)")] = "n/a"; - - feature_count_[std::string("Scripted functions (Tcl)")] = 0; - feature_paper_map_[std::string("Scripted functions (Tcl)")] = "n/a"; - - feature_count_[std::string("ABMD bias")] = 0; - feature_paper_map_[std::string("ABMD bias")] = "n/a"; + feature_count_[std::string("torchANN colvar component")] = 0; + feature_paper_map_[std::string("torchANN colvar component")] = "n/a"; diff --git a/lib/colvars/colvarparse.cpp b/lib/colvars/colvarparse.cpp index 76b5c694c1..cf3096ba50 100644 --- a/lib/colvars/colvarparse.cpp +++ b/lib/colvars/colvarparse.cpp @@ -592,7 +592,7 @@ int colvarparse::check_keywords(std::string &conf, char const *key) { if (cvm::debug()) cvm::log("Configuration string for \""+std::string(key)+ - "\": \"\n"+conf+"\".\n"); + "\":\n\""+conf+"\".\n"); strip_values(conf); // after stripping, the config string has either empty lines, or @@ -833,7 +833,8 @@ bool colvarparse::key_lookup(std::string const &conf, data_end) + 1; } - if (data != NULL) { + // data_end < data_begin means that the data or block contains only whitespace + if (data != NULL && data_end > data_begin) { data->append(line, data_begin, (data_end-data_begin)); if (cvm::debug()) { diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index 588b7c68d8..1ed7a55552 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -243,7 +243,7 @@ void colvarproxy_atom_groups::compute_max_atom_groups_applied_force() colvarproxy_smp::colvarproxy_smp() { - b_smp_active = true; // May be disabled by user option + smp_mode = smp_mode_t::cvcs; // May be disabled by user option omp_lock_state = NULL; #if defined(_OPENMP) if (omp_get_thread_num() == 0) { @@ -265,41 +265,45 @@ colvarproxy_smp::~colvarproxy_smp() #endif } - -int colvarproxy_smp::check_smp_enabled() -{ +colvarproxy::smp_mode_t colvarproxy_smp::get_smp_mode() const { #if defined(_OPENMP) - if (b_smp_active) { - return COLVARS_OK; - } - return COLVARS_ERROR; + return smp_mode; #else - return COLVARS_NOT_IMPLEMENTED; + return colvarproxy::smp_mode_t::none; +#endif +} + +int colvarproxy_smp::set_smp_mode(smp_mode_t mode) { +#if defined(_OPENMP) + smp_mode = mode; + return COLVARS_OK; +#else + if (mode != colvarproxy::smp_mode_t::none) { + return COLVARS_NOT_IMPLEMENTED; + } else { + smp_mode = colvarproxy::smp_mode_t::none; + } + return COLVARS_OK; #endif } -int colvarproxy_smp::smp_colvars_loop() +int colvarproxy_smp::smp_loop(int n_items, std::function const &worker) { + int error_code = COLVARS_OK; #if defined(_OPENMP) - colvarmodule *cv = cvm::main(); - colvarproxy *proxy = cv->proxy; + cvm::increase_depth(); #pragma omp parallel for - for (int i = 0; i < static_cast(cv->variables_active_smp()->size()); i++) { - colvar *x = (*(cv->variables_active_smp()))[i]; - int x_item = (*(cv->variables_active_smp_items()))[i]; - if (cvm::debug()) { - cvm::log("["+cvm::to_str(proxy->smp_thread_id())+"/"+ - cvm::to_str(proxy->smp_num_threads())+ - "]: calc_colvars_items_smp(), i = "+cvm::to_str(i)+", cv = "+ - x->name+", cvc = "+cvm::to_str(x_item)+"\n"); - } - x->calc_cvcs(x_item, 1); + for (int i = 0; i < n_items; i++) { + int const retcode = worker(i); +#pragma omp atomic + error_code |= retcode; } - return cvm::get_error(); + cvm::decrease_depth(); #else - return COLVARS_NOT_IMPLEMENTED; + error_code |= COLVARS_NOT_IMPLEMENTED; #endif + return error_code; } @@ -470,8 +474,8 @@ colvarproxy::~colvarproxy() bool colvarproxy::io_available() { - return (check_smp_enabled() == COLVARS_OK && smp_thread_id() == 0) || - (check_smp_enabled() != COLVARS_OK); + return ((get_smp_mode() != smp_mode_t::none) && smp_thread_id() == 0) || + (get_smp_mode() == smp_mode_t::none); } diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 91db6011e9..353f354efa 100644 --- a/lib/colvars/colvarproxy.h +++ b/lib/colvars/colvarproxy.h @@ -10,9 +10,12 @@ #ifndef COLVARPROXY_H #define COLVARPROXY_H +#include + #include "colvarmodule.h" #include "colvartypes.h" #include "colvarproxy_io.h" +#include "colvarproxy_replicas.h" #include "colvarproxy_system.h" #include "colvarproxy_tcl.h" #include "colvarproxy_volmaps.h" @@ -447,21 +450,22 @@ class colvarproxy_smp { public: + enum class smp_mode_t {cvcs, inner_loop, none}; + /// Constructor colvarproxy_smp(); /// Destructor virtual ~colvarproxy_smp(); - /// Whether threaded parallelization should be used (TODO: make this a - /// cvm::deps feature) - bool b_smp_active; + /// Get the current SMP mode + virtual smp_mode_t get_smp_mode() const; - /// Whether threaded parallelization is available (TODO: make this a cvm::deps feature) - virtual int check_smp_enabled(); + /// Set the current SMP mode + virtual int set_smp_mode(smp_mode_t mode); - /// Distribute calculation of colvars (and their components) across threads - virtual int smp_colvars_loop(); + /// Distribute computation over threads using OpenMP, unless overridden in the backend (e.g. NAMD) + virtual int smp_loop(int n_items, std::function const &worker); /// Distribute calculation of biases across threads virtual int smp_biases_loop(); @@ -488,38 +492,10 @@ protected: /// Lock state for OpenMP omp_lock_t *omp_lock_state; -}; - - -/// \brief Methods for multiple-replica communication -class colvarproxy_replicas { - -public: - - /// Constructor - colvarproxy_replicas(); - - /// Destructor - virtual ~colvarproxy_replicas(); - - /// \brief Indicate if multi-replica support is available and active - virtual int replica_enabled(); - - /// \brief Index of this replica - virtual int replica_index(); - - /// \brief Total number of replicas - virtual int num_replicas(); - - /// \brief Synchronize replica with others - virtual void replica_comm_barrier(); - - /// \brief Receive data from other replica - virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); - - /// \brief Send data to other replica - virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + /// Whether threaded parallelization should be used (TODO: make this a + /// cvm::deps feature) + smp_mode_t smp_mode; }; diff --git a/lib/colvars/colvarproxy_io.cpp b/lib/colvars/colvarproxy_io.cpp index 4cfdfeec26..0327ed36f0 100644 --- a/lib/colvars/colvarproxy_io.cpp +++ b/lib/colvars/colvarproxy_io.cpp @@ -7,10 +7,28 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. + +#if defined(_WIN32) && !defined(__CYGWIN__) + // Using access() to check if a file exists (until we can assume C++14/17) -#if !defined(_WIN32) || defined(__CYGWIN__) -#include +#include + +#if defined(__has_include) +# if __has_include() +# include // MSVC only defines __cpp_lib_filesystem after include +# endif #endif + +#else + +#include + +#ifdef __cpp_lib_filesystem +#include +#endif + +#endif + #if defined(_WIN32) #include #endif @@ -64,6 +82,53 @@ int colvarproxy_io::set_frame(long int) } +std::string colvarproxy_io::get_current_work_dir() const +{ +#ifdef __cpp_lib_filesystem + + return std::filesystem::current_path().string(); + +#else + + // Legacy code + size_t constexpr buf_size = 3001; + char buf[buf_size]; + +#if defined(_WIN32) && !defined(__CYGWIN__) + char *getcwd_result = ::_getcwd(buf, buf_size); +#else + char *getcwd_result = ::getcwd(buf, buf_size); +#endif + + if (getcwd_result == nullptr) { + cvm::error("Error: cannot read the current working directory.\n", COLVARS_INPUT_ERROR); + return std::string(""); + } + + return std::string(getcwd_result); +#endif +} + + +std::string colvarproxy_io::join_paths(std::string const &path1, std::string const &path2) const +{ +#ifdef __cpp_lib_filesystem + + return (std::filesystem::path(path1) / std::filesystem::path(path2)).string(); + +#else + + // Legacy code +#if defined(_WIN32) && !defined(__CYGWIN__) + return (path1 + "\\" + path2); +#else + return (path1 + "/" + path2); +#endif + +#endif +} + + int colvarproxy_io::backup_file(char const *filename) { // Simplified version of NAMD_file_exists() diff --git a/lib/colvars/colvarproxy_io.h b/lib/colvars/colvarproxy_io.h index 726f915c97..eaf750366d 100644 --- a/lib/colvars/colvarproxy_io.h +++ b/lib/colvars/colvarproxy_io.h @@ -38,6 +38,12 @@ public: // Returns error code virtual int set_frame(long int); + /// Get the current working directory of this process + std::string get_current_work_dir() const; + + /// Join two paths using the operating system's path separation + std::string join_paths(std::string const &path1, std::string const &path2) const; + /// \brief Rename the given file, before overwriting it virtual int backup_file(char const *filename); diff --git a/lib/colvars/colvarproxy_replicas.cpp b/lib/colvars/colvarproxy_replicas.cpp index 1f336d3e44..ec7ffdd8d5 100644 --- a/lib/colvars/colvarproxy_replicas.cpp +++ b/lib/colvars/colvarproxy_replicas.cpp @@ -7,50 +7,103 @@ // If you wish to distribute your changes, please submit them to the // Colvars repository at GitHub. + #include "colvarmodule.h" -#include "colvarproxy.h" +#include "colvarproxy_replicas.h" -colvarproxy_replicas::colvarproxy_replicas() {} +colvarproxy_replicas::colvarproxy_replicas() +{ +#ifdef COLVARS_MPI + replicas_mpi_comm = MPI_COMM_NULL; +#endif +} colvarproxy_replicas::~colvarproxy_replicas() {} -int colvarproxy_replicas::replica_enabled() +void colvarproxy_replicas::set_replicas_mpi_communicator(replicas_mpi_comm_t comm) { + replicas_mpi_comm = comm; +#ifdef COLVARS_MPI + if (comm != MPI_COMM_NULL) { + MPI_Comm_rank(comm, &replicas_mpi_rank); + MPI_Comm_size(comm, &replicas_mpi_num); + cvm::log("Enabling multiple replicas: this is replica number " + + cvm::to_str(replica_index() + 1) + " of " + cvm::to_str(num_replicas()) + ".\n"); + } +#endif +} + + +int colvarproxy_replicas::check_replicas_enabled() +{ +#ifdef COLVARS_MPI + if (replicas_mpi_comm != MPI_COMM_NULL) { + return num_replicas() > 1 ? COLVARS_OK : COLVARS_ERROR; + } + return COLVARS_ERROR; +#else return COLVARS_NOT_IMPLEMENTED; +#endif } int colvarproxy_replicas::replica_index() { - return 0; + return replicas_mpi_rank; } int colvarproxy_replicas::num_replicas() { - return 1; + return replicas_mpi_num; } -void colvarproxy_replicas::replica_comm_barrier() {} - - -int colvarproxy_replicas::replica_comm_recv(char* /* msg_data */, - int /* buf_len */, - int /* src_rep */) +void colvarproxy_replicas::replica_comm_barrier() { - return COLVARS_NOT_IMPLEMENTED; +#ifdef COLVARS_MPI + MPI_Barrier(replicas_mpi_comm); +#endif } -int colvarproxy_replicas::replica_comm_send(char* /* msg_data */, - int /* msg_len */, - int /* dest_rep */) +int colvarproxy_replicas::replica_comm_recv(char *buffer, int buffer_length, int source_rank) { +#ifdef COLVARS_MPI + MPI_Status status; + int retval = MPI_Recv(buffer, buffer_length, MPI_CHAR, source_rank, 0, replicas_mpi_comm, &status); + if (retval == MPI_SUCCESS) { + MPI_Get_count(&status, MPI_CHAR, &retval); + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)source_rank; return COLVARS_NOT_IMPLEMENTED; +#endif } +int colvarproxy_replicas::replica_comm_send(char *buffer, int buffer_length, int destination_rank) +{ +#ifdef COLVARS_MPI + int retval = MPI_Send(buffer, buffer_length, MPI_CHAR, destination_rank, 0, replicas_mpi_comm); + if (retval == MPI_SUCCESS) { + retval = buffer_length; + } else { + retval = 0; + } + return retval; +#else + (void)buffer; + (void)buffer_length; + (void)destination_rank; + return COLVARS_NOT_IMPLEMENTED; +#endif +} diff --git a/lib/colvars/colvarproxy_replicas.h b/lib/colvars/colvarproxy_replicas.h new file mode 100644 index 0000000000..b58c80bf5e --- /dev/null +++ b/lib/colvars/colvarproxy_replicas.h @@ -0,0 +1,66 @@ +// -*- 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 COLVARPROXY_REPLICAS_H +#define COLVARPROXY_REPLICAS_H + + +#ifdef COLVARS_MPI +#include +typedef MPI_Comm replicas_mpi_comm_t; +#else +typedef void * replicas_mpi_comm_t; +#endif + + +/// \brief Methods for multiple-replica communication +class colvarproxy_replicas { + +public: + + /// Constructor + colvarproxy_replicas(); + + /// Destructor + virtual ~colvarproxy_replicas(); + + /// Set the multiple replicas communicator + virtual void set_replicas_mpi_communicator(replicas_mpi_comm_t comm); + + /// Indicate if multi-replica support is available and active + virtual int check_replicas_enabled(); + + /// Index of this replica + virtual int replica_index(); + + /// Total number of replicas + virtual int num_replicas(); + + /// Synchronize replica with others + virtual void replica_comm_barrier(); + + /// Receive data from other replica + virtual int replica_comm_recv(char* msg_data, int buf_len, int src_rep); + + /// Send data to other replica + virtual int replica_comm_send(char* msg_data, int msg_len, int dest_rep); + +protected: + + /// MPI communicator containint 1 root proc from each world + replicas_mpi_comm_t replicas_mpi_comm; + + /// Index (rank) of this replica in the MPI implementation + int replicas_mpi_rank = 0; + + /// Number of replicas in the MPI implementation + int replicas_mpi_num = 1; +}; + +#endif diff --git a/lib/colvars/colvarproxy_system.h b/lib/colvars/colvarproxy_system.h index 67d0938e54..bf2ad2ea8b 100644 --- a/lib/colvars/colvarproxy_system.h +++ b/lib/colvars/colvarproxy_system.h @@ -94,6 +94,7 @@ public: virtual bool total_forces_enabled() const; /// Are total forces from the current step available? + /// in which case they are really system forces virtual bool total_forces_same_step() const; /// Get the molecule ID when called in VMD; raise error otherwise @@ -109,6 +110,11 @@ public: /// Send cached value of alchemical lambda parameter to back-end (if available) virtual int send_alch_lambda(); + /// Request energy computation every freq steps (necessary for NAMD3, not all back-ends) + virtual int request_alch_energy_freq(int const freq) { + return COLVARS_OK; + } + /// Get energy derivative with respect to lambda (if available) virtual int get_dE_dlambda(cvm::real* dE_dlambda); diff --git a/lib/colvars/colvars_memstream.h b/lib/colvars/colvars_memstream.h index 0d80d2794d..c9564a3c41 100644 --- a/lib/colvars/colvars_memstream.h +++ b/lib/colvars/colvars_memstream.h @@ -108,6 +108,9 @@ public: /// Ignore formatting operators inline void setf(decltype(std::ios::fmtflags(0)), decltype(std::ios::floatfield)) {} + /// Ignore formatting operators + inline void setf(decltype(std::ios::fmtflags(0))) {} + /// Ignore formatting operators inline void flags(decltype(std::ios::fmtflags(0))) {} diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index d50a00fff5..02f949b517 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,3 +1,3 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2024-06-04" +#define COLVARS_VERSION "2025-04-30" #endif diff --git a/lib/colvars/colvarscript_commands.h b/lib/colvars/colvarscript_commands.h index bdad74e433..191724dd0f 100644 --- a/lib/colvars/colvarscript_commands.h +++ b/lib/colvars/colvarscript_commands.h @@ -541,6 +541,15 @@ CVSCRIPT(cv_printframe, return COLVARS_OK; ) +CVSCRIPT(cv_patchversion, + "Get the Colvars patch version number (used for bugfixes only)\n" + "version : string - Colvars version", + 0, 0, + "", + script->set_result_int(cvm::main()->patch_version_number()); + return COLVARS_OK; + ) + CVSCRIPT(cv_printframelabels, "Return the labels that would be written to colvars.traj\n" "Labels : string - The labels", @@ -656,7 +665,7 @@ CVSCRIPT(cv_update, ) CVSCRIPT(cv_version, - "Get the Colvars Module version string\n" + "Get the Colvars version string\n" "version : string - Colvars version", 0, 0, "", @@ -665,7 +674,7 @@ CVSCRIPT(cv_version, ) // This guard allows compiling colvar and bias function bodies in their -// respecitve files instead of colvarscript_commands.o +// respective files instead of colvarscript_commands.o #ifndef COLVARSCRIPT_COMMANDS_GLOBAL #include "colvarscript_commands_colvar.h" #include "colvarscript_commands_bias.h" diff --git a/lib/colvars/colvarscript_commands_colvar.h b/lib/colvars/colvarscript_commands_colvar.h index f6bb6b8c98..c641b321d0 100644 --- a/lib/colvars/colvarscript_commands_colvar.h +++ b/lib/colvars/colvarscript_commands_colvar.h @@ -23,6 +23,7 @@ CVSCRIPT(colvar_addforce, script->add_error_msg("addforce : error parsing force value"); return COLVARSCRIPT_ERROR; } + this_colvar->enable(colvardeps::f_cv_apply_force); this_colvar->add_bias_force(force); script->set_result_colvarvalue(force); return COLVARS_OK; diff --git a/lib/colvars/colvartypes.cpp b/lib/colvars/colvartypes.cpp index f51791d015..6c65f1f5a6 100644 --- a/lib/colvars/colvartypes.cpp +++ b/lib/colvars/colvartypes.cpp @@ -137,71 +137,6 @@ std::istream & operator >> (std::istream &is, colvarmodule::quaternion &q) } -cvm::quaternion -cvm::quaternion::position_derivative_inner(cvm::rvector const &pos, - cvm::rvector const &vec) const -{ - cvm::quaternion result(0.0, 0.0, 0.0, 0.0); - - - result.q0 = 2.0 * pos.x * q0 * vec.x - +2.0 * pos.y * q0 * vec.y - +2.0 * pos.z * q0 * vec.z - - -2.0 * pos.y * q3 * vec.x - +2.0 * pos.z * q2 * vec.x - - +2.0 * pos.x * q3 * vec.y - -2.0 * pos.z * q1 * vec.y - - -2.0 * pos.x * q2 * vec.z - +2.0 * pos.y * q1 * vec.z; - - - result.q1 = +2.0 * pos.x * q1 * vec.x - -2.0 * pos.y * q1 * vec.y - -2.0 * pos.z * q1 * vec.z - - +2.0 * pos.y * q2 * vec.x - +2.0 * pos.z * q3 * vec.x - - +2.0 * pos.x * q2 * vec.y - -2.0 * pos.z * q0 * vec.y - - +2.0 * pos.x * q3 * vec.z - +2.0 * pos.y * q0 * vec.z; - - - result.q2 = -2.0 * pos.x * q2 * vec.x - +2.0 * pos.y * q2 * vec.y - -2.0 * pos.z * q2 * vec.z - - +2.0 * pos.y * q1 * vec.x - +2.0 * pos.z * q0 * vec.x - - +2.0 * pos.x * q1 * vec.y - +2.0 * pos.z * q3 * vec.y - - -2.0 * pos.x * q0 * vec.z - +2.0 * pos.y * q3 * vec.z; - - - result.q3 = -2.0 * pos.x * q3 * vec.x - -2.0 * pos.y * q3 * vec.y - +2.0 * pos.z * q3 * vec.z - - -2.0 * pos.y * q0 * vec.x - +2.0 * pos.z * q1 * vec.x - - +2.0 * pos.x * q0 * vec.y - +2.0 * pos.z * q2 * vec.y - - +2.0 * pos.x * q1 * vec.z - +2.0 * pos.y * q2 * vec.z; - - return result; -} - #ifdef COLVARS_LAMMPS namespace { inline void *new_Jacobi_solver(int size) { @@ -336,7 +271,7 @@ void colvarmodule::rotation::compute_overlap_matrix() #ifndef COLVARS_LAMMPS namespace NR { -void diagonalize_matrix(cvm::real m[4][4], +int diagonalize_matrix(cvm::real m[4][4], cvm::real eigval[4], cvm::real eigvec[4][4]) { @@ -347,9 +282,7 @@ void diagonalize_matrix(cvm::real m[4][4], int jac_nrot = 0; if (NR_Jacobi::jacobi(m, eigval, eigvec, &jac_nrot) != COLVARS_OK) { - cvm::error("Too many iterations in jacobi diagonalization.\n" - "This is usually the result of an ill-defined set of atoms for " - "rotational alignment (RMSD, rotateReference, etc).\n"); + return COLVARS_ERROR; } NR_Jacobi::eigsrt(eigval, eigvec); // jacobi saves eigenvectors by columns @@ -367,6 +300,7 @@ void diagonalize_matrix(cvm::real m[4][4], eigvec[ie][i] /= norm; } } + return COLVARS_OK; } } @@ -429,14 +363,25 @@ void colvarmodule::rotation::calc_optimal_rotation_impl() { cvm::real[4][4]> *>(jacobi); int ierror = ecalc->Diagonalize(S, S_eigval, S_eigvec); +#else + int ierror = NR::diagonalize_matrix(S, S_eigval, S_eigvec); +#endif if (ierror) { + cvm::log("Failed to diagonalize the following overlapping matrix:\n"); + for (size_t i = 0; i < 4; ++i) { + for (size_t j = 0; j < 4; ++j) { + cvm::log(cvm::to_str(S[i][j]) + " "); + } + cvm::log("\n"); + } + cvm::log("The corresponding correlation matrix is:\n"); + cvm::log(" " + cvm::to_str(C.xx) + " " + cvm::to_str(C.xy) + " " + cvm::to_str(C.xz)); + cvm::log(" " + cvm::to_str(C.yx) + " " + cvm::to_str(C.yy) + " " + cvm::to_str(C.yz)); + cvm::log(" " + cvm::to_str(C.zx) + " " + cvm::to_str(C.zy) + " " + cvm::to_str(C.zz) + "\n"); cvm::error("Too many iterations in jacobi diagonalization.\n" "This is usually the result of an ill-defined set of atoms for " "rotational alignment (RMSD, rotateReference, etc).\n"); } -#else - NR::diagonalize_matrix(S, S_eigval, S_eigvec); -#endif q = cvm::quaternion{S_eigvec[0][0], S_eigvec[0][1], S_eigvec[0][2], S_eigvec[0][3]}; if (cvm::rotation::monitor_crossings) { diff --git a/lib/colvars/colvartypes.h b/lib/colvars/colvartypes.h index 455e628f1b..db5827990b 100644 --- a/lib/colvars/colvartypes.h +++ b/lib/colvars/colvartypes.h @@ -20,10 +20,6 @@ #include "colvarmodule.h" -#ifndef PI -#define PI 3.14159265358979323846 -#endif - // ---------------------------------------------------------------------- /// Linear algebra functions and data types used in the collective /// variables implemented so far @@ -1221,8 +1217,57 @@ public: /// \brief Multiply the given vector by the derivative of the given /// (rotated) position with respect to the quaternion - cvm::quaternion position_derivative_inner(cvm::rvector const &pos, - cvm::rvector const &vec) const; + /// \param pos The position \f$\mathbf{x}\f$. + /// \param vec The vector \f$\mathbf{v}\f$. + /// \return A quaternion (see the detailed documentation below). + /// + /// This function is mainly used for projecting the gradients or forces on + /// the rotated atoms to the forces on quaternion. Assume this rotation can + /// be represented as \f$R(\mathbf{q})\f$, + /// where \f$\mathbf{q} := (q_0, q_1, q_2, q_3)\f$ + /// is the current quaternion, the function returns the following new + /// quaternion: + /// \f[ + /// \left(\mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_0}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_1}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_2}\mathbf{x}, + /// \mathbf{v}^\mathrm{T}\frac{\partial R(\mathbf{q})}{\partial q_3}\mathbf{x}\right) + /// \f] + /// where \f$\mathbf{v}\f$ is usually the gradient of \f$\xi\f$ with respect to + /// the rotated frame \f$\tilde{\mathbf{X}}\f$, + /// \f$\partial \xi / \partial \tilde{\mathbf{X}}\f$, or the force acting on it + /// (\f$\mathbf{F}_{\tilde{\mathbf{X}}}\f$). + /// By using the following loop in pseudo C++ code, + /// either \f$\partial \xi / \partial \tilde{\mathbf{X}}\f$ + /// or \f$\mathbf{F}_{\tilde{\mathbf{X}}}\f$, can be projected to + /// \f$\partial \xi / \partial \mathbf{q}\f$ or \f$\mathbf{F}_q\f$ into `sum_dxdq`: + /// @code + /// cvm::real sum_dxdq[4] = {0, 0, 0, 0}; + /// for (size_t i = 0; i < main_group_size(); ++i) { + /// const cvm::rvector v = grad_or_force_on_rotated_main_group(i); + /// const cvm::rvector x = unrotated_main_group_positions(i); + /// cvm::quaternion const dxdq = position_derivative_inner(x, v); + /// sum_dxdq[0] += dxdq[0]; + /// sum_dxdq[1] += dxdq[1]; + /// sum_dxdq[2] += dxdq[2]; + /// sum_dxdq[3] += dxdq[3]; + /// } + /// @endcode + inline cvm::quaternion position_derivative_inner(cvm::rvector const &pos, + cvm::rvector const &vec) const { + return cvm::quaternion(2.0 * (vec.x * ( q0 * pos.x - q3 * pos.y + q2 * pos.z) + + vec.y * ( q3 * pos.x + q0 * pos.y - q1 * pos.z) + + vec.z * (-q2 * pos.x + q1 * pos.y + q0 * pos.z)), + 2.0 * (vec.x * ( q1 * pos.x + q2 * pos.y + q3 * pos.z) + + vec.y * ( q2 * pos.x - q1 * pos.y - q0 * pos.z) + + vec.z * ( q3 * pos.x + q0 * pos.y - q1 * pos.z)), + 2.0 * (vec.x * (-q2 * pos.x + q1 * pos.y + q0 * pos.z) + + vec.y * ( q1 * pos.x + q2 * pos.y + q3 * pos.z) + + vec.z * (-q0 * pos.x + q3 * pos.y - q2 * pos.z)), + 2.0 * (vec.x * (-q3 * pos.x - q0 * pos.y + q1 * pos.z) + + vec.y * ( q0 * pos.x - q3 * pos.y + q2 * pos.z) + + vec.z * ( q1 * pos.x + q2 * pos.y + q3 * pos.z))); + } /// \brief Return the cosine between the orientation frame @@ -1301,7 +1346,7 @@ public: #ifndef COLVARS_LAMMPS namespace NR { -void diagonalize_matrix(cvm::real m[4][4], +int diagonalize_matrix(cvm::real m[4][4], cvm::real eigval[4], cvm::real eigvec[4][4]); } diff --git a/lib/colvars/colvarvalue.cpp b/lib/colvars/colvarvalue.cpp index 3b8077d2e7..66baf35eeb 100644 --- a/lib/colvars/colvarvalue.cpp +++ b/lib/colvars/colvarvalue.cpp @@ -153,29 +153,6 @@ std::string const colvarvalue::type_keyword(Type t) } -size_t colvarvalue::num_df(Type t) -{ - switch (t) { - case colvarvalue::type_notset: - default: - return 0; break; - case colvarvalue::type_scalar: - return 1; break; - case colvarvalue::type_3vector: - return 3; break; - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return 2; break; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return 3; break; - case colvarvalue::type_vector: - // the size of a vector is unknown without its object - return 0; break; - } -} - - size_t colvarvalue::num_dimensions(Type t) { switch (t) { @@ -591,34 +568,132 @@ cvm::real operator * (colvarvalue const &x1, } +cvm::real colvarvalue::norm2() const +{ + switch (value_type) { + case colvarvalue::type_scalar: + return (this->real_value)*(this->real_value); + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return (this->rvector_value).norm2(); + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return (this->quaternion_value).norm2(); + case colvarvalue::type_vector: + if (elem_types.size() > 0) { + // if we have information about non-scalar types, use it + cvm::real result = 0.0; + size_t i; + for (i = 0; i < elem_types.size(); i++) { + result += (this->get_elem(i)).norm2(); + } + return result; + } else { + return vector1d_value.norm2(); + } + break; + case colvarvalue::type_notset: + default: + return 0.0; + } +} + + +cvm::real colvarvalue::sum() const +{ + switch (value_type) { + case colvarvalue::type_scalar: + return (this->real_value); + case colvarvalue::type_3vector: + case colvarvalue::type_unit3vector: + case colvarvalue::type_unit3vectorderiv: + return (this->rvector_value).x + (this->rvector_value).y + + (this->rvector_value).z; + case colvarvalue::type_quaternion: + case colvarvalue::type_quaternionderiv: + return (this->quaternion_value).q0 + (this->quaternion_value).q1 + + (this->quaternion_value).q2 + (this->quaternion_value).q3; + case colvarvalue::type_vector: + return (this->vector1d_value).sum(); + case colvarvalue::type_notset: + default: + return 0.0; + } +} + + +cvm::real colvarvalue::dist2(colvarvalue const &x2) const +{ + colvarvalue::check_types(*this, x2); + + switch (this->type()) { + case colvarvalue::type_scalar: + return (this->real_value - x2.real_value) * (this->real_value - x2.real_value); + case colvarvalue::type_3vector: + return (this->rvector_value - x2.rvector_value).norm2(); + case colvarvalue::type_unit3vector: { + cvm::rvector const &v1 = this->rvector_value; + cvm::rvector const &v2 = x2.rvector_value; + cvm::real const theta = cvm::acos(v1 * v2); + return theta * theta; + } + case colvarvalue::type_quaternion: + // angle between (*this) and x2 is the distance, the quaternion + // object has it implemented internally + return this->quaternion_value.dist2(x2.quaternion_value); + case colvarvalue::type_vector: + return (this->vector1d_value - x2.vector1d_value).norm2(); + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + cvm::error("Error: computing a squared-distance between two variables of type \"" + + type_desc(this->type()) + "\", for which it is not defined.\n", + COLVARS_BUG_ERROR); + case colvarvalue::type_notset: + default: + this->undef_op(); + return 0.0; + }; + + return 0.0; +} + + colvarvalue colvarvalue::dist2_grad(colvarvalue const &x2) const { colvarvalue::check_types(*this, x2); + // Compute derivative with respect to (*this) + switch (this->value_type) { case colvarvalue::type_scalar: return 2.0 * (this->real_value - x2.real_value); case colvarvalue::type_3vector: return 2.0 * (this->rvector_value - x2.rvector_value); - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - { - cvm::rvector const &v1 = this->rvector_value; - cvm::rvector const &v2 = x2.rvector_value; - cvm::real const cos_t = v1 * v2; - return colvarvalue(2.0 * (cos_t * v1 - v2), colvarvalue::type_unit3vectorderiv); - } + case colvarvalue::type_unit3vector: { + cvm::rvector const &v1 = this->rvector_value; + cvm::rvector const &v2 = x2.rvector_value; + cvm::real const cos_t = v1 * v2; + return colvarvalue(2.0 * cvm::acos(cos_t) * -1.0 / cvm::sqrt(1.0 - cos_t * cos_t) * v2, + colvarvalue::type_unit3vectorderiv); + } case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: return this->quaternion_value.dist2_grad(x2.quaternion_value); case colvarvalue::type_vector: return colvarvalue(2.0 * (this->vector1d_value - x2.vector1d_value), colvarvalue::type_vector); break; + case colvarvalue::type_unit3vectorderiv: + case colvarvalue::type_quaternionderiv: + cvm::error("Error: computing a squared-distance gradient between two variables of type \"" + + type_desc(this->type()) + "\", for which it is not defined.\n", + COLVARS_BUG_ERROR); case colvarvalue::type_notset: default: this->undef_op(); return colvarvalue(colvarvalue::type_notset); }; + + return colvarvalue(colvarvalue::type_notset); } diff --git a/lib/colvars/colvarvalue.h b/lib/colvars/colvarvalue.h index e8a6a849d3..61f1bf718b 100644 --- a/lib/colvars/colvarvalue.h +++ b/lib/colvars/colvarvalue.h @@ -109,9 +109,6 @@ public: /// User keywords for specifying value types in the configuration static std::string const type_keyword(Type t); - /// Number of degrees of freedom for each supported type - static size_t num_df(Type t); - /// Number of dimensions for each supported type (used to allocate vector1d_value) static size_t num_dimensions(Type t); @@ -671,87 +668,4 @@ inline cvm::vector1d const colvarvalue::as_vector() const } -inline cvm::real colvarvalue::norm2() const -{ - switch (value_type) { - case colvarvalue::type_scalar: - return (this->real_value)*(this->real_value); - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return (this->rvector_value).norm2(); - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return (this->quaternion_value).norm2(); - case colvarvalue::type_vector: - if (elem_types.size() > 0) { - // if we have information about non-scalar types, use it - cvm::real result = 0.0; - size_t i; - for (i = 0; i < elem_types.size(); i++) { - result += (this->get_elem(i)).norm2(); - } - return result; - } else { - return vector1d_value.norm2(); - } - break; - case colvarvalue::type_notset: - default: - return 0.0; - } -} - - -inline cvm::real colvarvalue::sum() const -{ - switch (value_type) { - case colvarvalue::type_scalar: - return (this->real_value); - case colvarvalue::type_3vector: - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - return (this->rvector_value).x + (this->rvector_value).y + - (this->rvector_value).z; - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - return (this->quaternion_value).q0 + (this->quaternion_value).q1 + - (this->quaternion_value).q2 + (this->quaternion_value).q3; - case colvarvalue::type_vector: - return (this->vector1d_value).sum(); - case colvarvalue::type_notset: - default: - return 0.0; - } -} - - -inline cvm::real colvarvalue::dist2(colvarvalue const &x2) const -{ - colvarvalue::check_types(*this, x2); - - switch (this->type()) { - case colvarvalue::type_scalar: - return (this->real_value - x2.real_value)*(this->real_value - x2.real_value); - case colvarvalue::type_3vector: - return (this->rvector_value - x2.rvector_value).norm2(); - case colvarvalue::type_unit3vector: - case colvarvalue::type_unit3vectorderiv: - // angle between (*this) and x2 is the distance - return cvm::acos(this->rvector_value * x2.rvector_value) * cvm::acos(this->rvector_value * x2.rvector_value); - case colvarvalue::type_quaternion: - case colvarvalue::type_quaternionderiv: - // angle between (*this) and x2 is the distance, the quaternion - // object has it implemented internally - return this->quaternion_value.dist2(x2.quaternion_value); - case colvarvalue::type_vector: - return (this->vector1d_value - x2.vector1d_value).norm2(); - case colvarvalue::type_notset: - default: - this->undef_op(); - return 0.0; - }; -} - - #endif diff --git a/lib/scafacos/Install.py b/lib/scafacos/Install.py index 28bcf43086..9766d4fc1e 100644 --- a/lib/scafacos/Install.py +++ b/lib/scafacos/Install.py @@ -16,11 +16,12 @@ parser = ArgumentParser(prog='Install.py', description="LAMMPS library build wra # settings -version = "1.0.1" +version = "1.0.4" # known checksums for different ScaFaCoS versions. used to validate the download. checksums = { \ - '1.0.1' : 'bd46d74e3296bd8a444d731bb10c1738' \ + '1.0.1' : 'bd46d74e3296bd8a444d731bb10c1738', \ + '1.0.4' : '23867540ec32e63ce71d6ecc105278d2', \ } # extra help message diff --git a/src/.gitignore b/src/.gitignore index a25a884a8a..c39dfbdfeb 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -875,6 +875,8 @@ /fix_freeze.h /fix_gcmc.cpp /fix_gcmc.h +/fix_gjf.cpp +/fix_gjf.h /fix_gld.cpp /fix_gld.h /fix_gle.cpp @@ -924,6 +926,8 @@ /fix_msst.h /fix_neb.cpp /fix_neb.h +/fix_neighbor_swap.cpp +/fix_neighbor_swap.h /fix_nh_asphere.cpp /fix_nh_asphere.h /fix_nph_asphere.cpp diff --git a/src/COLVARS/colvarproxy_lammps.cpp b/src/COLVARS/colvarproxy_lammps.cpp index 265dc34f43..c92d835cf6 100644 --- a/src/COLVARS/colvarproxy_lammps.cpp +++ b/src/COLVARS/colvarproxy_lammps.cpp @@ -33,12 +33,9 @@ colvarproxy_lammps::colvarproxy_lammps(LAMMPS_NS::LAMMPS *lmp) : _lmp(lmp), _ra previous_step = -1; do_exit = false; - inter_me = 0; - inter_num = 1; bias_energy = 0.0; engine_ready_ = false; - inter_comm = MPI_COMM_NULL; } /* ---------------------------------------------------------------------- */ @@ -83,19 +80,6 @@ void colvarproxy_lammps::set_random_seed(int seed) _random = new LAMMPS_NS::RanPark(_lmp, seed); } -/* ---------------------------------------------------------------------- */ - -void colvarproxy_lammps::set_replicas_communicator(MPI_Comm root2root) -{ - inter_comm = root2root; - - // initialize multi-replica support, if available - if (replica_enabled() == COLVARS_OK) { - MPI_Comm_rank(inter_comm, &inter_me); - MPI_Comm_size(inter_comm, &inter_num); - } -} - /* ---------------------------------------------------------------------- re-initialize data where needed ------------------------------------------------------------------------- */ @@ -255,63 +239,7 @@ int colvarproxy_lammps::set_unit_system(std::string const &units_in, bool /*chec return COLVARS_OK; } -/* ---------------------------------------------------------------------- - multi-replica support -------------------------------------------------------------------------- */ -int colvarproxy_lammps::replica_enabled() -{ - return (inter_comm != MPI_COMM_NULL) ? COLVARS_OK : COLVARS_NOT_IMPLEMENTED; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_index() -{ - return inter_me; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::num_replicas() -{ - return inter_num; -} - -/* ---------------------------------------------------------------------- */ - -void colvarproxy_lammps::replica_comm_barrier() -{ - MPI_Barrier(inter_comm); -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_comm_recv(char* msg_data, int buf_len, int src_rep) -{ - MPI_Status status; - int retval; - - retval = MPI_Recv(msg_data,buf_len,MPI_CHAR,src_rep,0,inter_comm,&status); - if (retval == MPI_SUCCESS) { - MPI_Get_count(&status, MPI_CHAR, &retval); - } else retval = 0; - return retval; -} - -/* ---------------------------------------------------------------------- */ - -int colvarproxy_lammps::replica_comm_send(char* msg_data, int msg_len, int dest_rep) -{ - int retval; - retval = MPI_Send(msg_data,msg_len,MPI_CHAR,dest_rep,0,inter_comm); - if (retval == MPI_SUCCESS) { - retval = msg_len; - } else retval = 0; - return retval; -} - -/* ---------------------------------------------------------------------- */ int colvarproxy_lammps::check_atom_id(int atom_number) { diff --git a/src/COLVARS/colvarproxy_lammps.h b/src/COLVARS/colvarproxy_lammps.h index d98be37b09..06bda4252e 100644 --- a/src/COLVARS/colvarproxy_lammps.h +++ b/src/COLVARS/colvarproxy_lammps.h @@ -45,9 +45,6 @@ class colvarproxy_lammps : public colvarproxy { std::vector atoms_types; - MPI_Comm inter_comm; // MPI comm with 1 root proc from each world - int inter_me, inter_num; // rank for the inter replica comm - public: friend class cvm::atom; @@ -59,9 +56,6 @@ class colvarproxy_lammps : public colvarproxy { /// Set the internal seed used by \link rand_gaussian() \endlink void set_random_seed(int seed); - /// Set the multiple replicas communicator - void set_replicas_communicator(MPI_Comm root2root); - int setup() override; // disable default and copy constructor @@ -72,7 +66,8 @@ class colvarproxy_lammps : public colvarproxy { // methods for lammps to move data or trigger actions in the proxy public: bool total_forces_enabled() const override { return total_force_requested; }; - bool total_forces_same_step() const override { return true; }; + // Total forces are saved at end of step, only processed at the next step + bool total_forces_same_step() const override { return false; }; bool want_exit() const { return do_exit; }; // perform colvars computation. returns biasing energy @@ -102,14 +97,6 @@ class colvarproxy_lammps : public colvarproxy { int check_atom_id(int atom_number) override; inline std::vector *modify_atom_types() { return &atoms_types; } - - int replica_enabled() override; - int replica_index() override; - int num_replicas() override; - - void replica_comm_barrier() override; - int replica_comm_recv(char *msg_data, int buf_len, int src_rep) override; - int replica_comm_send(char *msg_data, int msg_len, int dest_rep) override; }; #endif diff --git a/src/COLVARS/colvarproxy_lammps_version.h b/src/COLVARS/colvarproxy_lammps_version.h index 5901044b1e..1c16217679 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 "2024-07-05" +#define COLVARPROXY_VERSION "2025-03-31" #endif diff --git a/src/COLVARS/fix_colvars.cpp b/src/COLVARS/fix_colvars.cpp index d5a8806eed..247ad2ef8b 100644 --- a/src/COLVARS/fix_colvars.cpp +++ b/src/COLVARS/fix_colvars.cpp @@ -267,6 +267,7 @@ void FixColvars::init() if (init_flag) return; init_flag = 1; +#if defined(COLVARS_MPI) if (universe->nworlds > 1) { // create inter root communicator int color = 1; @@ -275,9 +276,10 @@ void FixColvars::init() } MPI_Comm_split(universe->uworld, color, universe->iworld, &root2root); if (me == 0) { - proxy->set_replicas_communicator(root2root); + proxy->set_replicas_mpi_communicator(root2root); } } +#endif } diff --git a/src/Depend.sh b/src/Depend.sh index 9ddb29450d..ba55deb62c 100755 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -146,6 +146,7 @@ fi if (test $1 = "MC") then depend MISC + depend VORONOI fi if (test $1 = "MEAM") then diff --git a/src/EXTRA-FIX/fix_gjf.cpp b/src/EXTRA-FIX/fix_gjf.cpp new file mode 100644 index 0000000000..f602e6181d --- /dev/null +++ b/src/EXTRA-FIX/fix_gjf.cpp @@ -0,0 +1,687 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 authors: Tim Linke & Niels Gronbech-Jensen (UC Davis) +------------------------------------------------------------------------- */ + +#include "fix_gjf.h" + +#include "atom.h" +#include "citeme.h" +#include "comm.h" +#include "compute.h" +#include "error.h" +#include "force.h" +#include "group.h" +#include "input.h" +#include "memory.h" +#include "modify.h" +#include "random_mars.h" +#include "respa.h" +#include "update.h" +#include "variable.h" + +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +enum { NOBIAS, BIAS }; +enum { CONSTANT, EQUAL, ATOM }; + +static const char cite_gjf[] = + "GJ methods: doi:10.1080/00268976.2019.1662506\n\n" + "@Article{gronbech-jensen_complete_2020,\n" + "title = {Complete set of stochastic Verlet-type thermostats for correct Langevin simulations},\n" + "volume = {118},\n" + "number = {8},\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1662506},\n" + "doi = {10.1080/00268976.2019.1662506},\n" + "journal = {Molecular Physics},\n" + "author = {Grønbech-Jensen, Niels},\n" + "year = {2020}\n" + "}\n\n"; + +static const char cite_gjf_7[] = + "GJ-VII method: doi:10.1063/5.0066008\n\n" + "@Article{finkelstein_2021,\n" + "title = {Bringing discrete-time Langevin splitting methods into agreement with thermodynamics},\n" + "volume = {155},\n" + "number = {18},\n" + "url = {https://doi.org/10.1063/5.0066008},\n" + "doi = {10.1063/5.0066008},\n" + "journal = {J. Chem. Phys.},\n" + "author = {Finkelstein, Joshua and Cheng, Chungho and Fiorin, Giacomo and Seibold, Benjamin and Grønbech-Jensen, Niels},\n" + "year = {2021},\n" + "pages = {184104}\n" + "}\n\n"; + +static const char cite_gjf_8[] = + "GJ-VIII method: doi:10.1007/s10955-024-03345-1\n\n" + "@Article{gronbech_jensen_2024,\n" + "title = {On the Definition of Velocity in Discrete-Time, Stochastic Langevin Simulations},\n" + "volume = {191},\n" + "number = {10},\n" + "url = {https://doi.org/10.1007/s10955-024-03345-1},\n" + "doi = {10.1007/s10955-024-03345-1},\n" + "journal = {J. Stat. Phys.},\n" + "author = {Gronbech-Jensen, Niels},\n" + "year = {2024},\n" + "pages = {137}\n" + "}\n\n"; + +static const char cite_gjf_vhalf[] = + "GJ-I vhalf method: doi:10.1080/00268976.2019.1570369\n\n" + "@Article{jensen_accurate_2019,\n" + "title = {Accurate configurational and kinetic statistics in discrete-time Langevin systems},\n" + "volume = {117},\n" + "url = {https://www.tandfonline.com/doi/full/10.1080/00268976.2019.1570369},\n" + "doi = {10.1080/00268976.2019.1570369},\n" + "number = {18},\n" + "journal = {Molecular Physics},\n" + "author = {Jensen, Lucas Frese Grønbech and Grønbech-Jensen, Niels},\n" + "year = {2019}\n" + "}\n\n"; + +static const char cite_gjf_vfull[] = + "GJ-I vfull method: doi:10.1080/00268976.2012.760055\n\n" + "@Article{gronbech-jensen_simple_2013,\n" + "title = {A simple and effective Verlet-type algorithm for simulating Langevin dynamics},\n" + "volume = {111},\n" + "url = {http://www.tandfonline.com/doi/abs/10.1080/00268976.2012.760055},\n" + "doi = {10.1080/00268976.2012.760055},\n" + "pages = {983-991},\n" + "number = {8},\n" + "journal = {Molecular Physics},\n" + "author = {Grønbech-Jensen, Niels and Farago, Oded},\n" + "year = {2013}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +FixGJF::FixGJF(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), tstr(nullptr), tforce(nullptr), lv(nullptr), id_temp(nullptr), random(nullptr) +{ + if (lmp->citeme) lmp->citeme->add(cite_gjf); + if (narg < 7) error->all(FLERR, "Illegal fix gjf command"); + + time_integrate = 1; + global_freq = 1; + nevery = 1; + + if (utils::strmatch(arg[3], "^v_")) { + tstr = utils::strdup(arg[3] + 2); + } else { + t_start = utils::numeric(FLERR, arg[3], false, lmp); + t_target = t_start; + tstyle = CONSTANT; + } + + t_stop = utils::numeric(FLERR, arg[4], false, lmp); + t_period = utils::numeric(FLERR, arg[5], false, lmp); + seed = utils::inumeric(FLERR, arg[6], false, lmp); + + if (t_period <= 0.0) error->all(FLERR, "Fix gjf period must be > 0.0"); + if (seed <= 0) error->all(FLERR, "Illegal fix gjf command"); + + // initialize Marsaglia RNG with processor-unique seed + random = new RanMars(lmp, seed + comm->me); + + int GJmethods = 8; // number of currently implemented GJ methods + maxatom = 0; + + // optional args + // per default, use half step and GJ-I + + osflag = 0; + GJmethod = 1; + lv_allocated = 0; + + int iarg = 7; + while (iarg < narg) { + if (strcmp(arg[iarg], "vel") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix gjf command"); + if (strcmp(arg[iarg + 1], "vfull") == 0) { + osflag = 1; + } else if (strcmp(arg[iarg + 1], "vhalf") == 0) { + osflag = 0; + } else + error->all(FLERR, "Illegal fix gjf command"); + iarg += 2; + } else if (strcmp(arg[iarg], "method") == 0) { + GJmethod = utils::inumeric(FLERR, arg[iarg + 1], false, lmp); + if (GJmethod == 7) { + if (iarg + 3 > narg) error->all(FLERR, "Illegal fix gjf command for GJ-VII"); + gjfc2 = utils::numeric(FLERR, arg[iarg + 2], false, lmp); + if (gjfc2 < 0 || gjfc2 > 1) error->all(FLERR, "Choice of c2 in GJ-VII must be 0≤c2≤1"); + iarg += 3; + if (lmp->citeme) lmp->citeme->add(cite_gjf_7); + } + else { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix gjf command"); + if (GJmethod < 0 || GJmethod > GJmethods) error->all(FLERR, "Invalid GJ method choice in gjf command"); + if (GJmethod == 8) if (lmp->citeme) lmp->citeme->add(cite_gjf_8); + iarg += 2; + } + } else + error->all(FLERR, "Illegal fix gjf command"); + } + if (GJmethod == 1 && osflag == 0) if (lmp->citeme) lmp->citeme->add(cite_gjf_vhalf); + if (GJmethod == 1 && osflag == 1) if (lmp->citeme) lmp->citeme->add(cite_gjf_vfull); + + // set temperature = nullptr, user can override via fix_modify if wants bias + id_temp = nullptr; + temperature = nullptr; + + lv = nullptr; + tforce = nullptr; + + // setup atom-based array for lv + // register with Atom class + // no need to set peratom_flag, b/c data is for internal use only + + + FixGJF::grow_arrays(atom->nmax); + atom->add_callback(Atom::GROW); + + // initialize lv to onsite velocity + int nlocal = atom->nlocal; + for (int i = 0; i < nlocal; i++) { + lv[i][0] = 0.0; + lv[i][1] = 0.0; + lv[i][2] = 0.0; + } +} + +/* ---------------------------------------------------------------------- */ + +FixGJF::~FixGJF() +{ + if (copymode) return; + + delete random; + delete[] tstr; + delete[] id_temp; + memory->destroy(tforce); + + memory->destroy(lv); + if (modify->get_fix_by_id(id)) atom->delete_callback(id, Atom::GROW); +} + +/* ---------------------------------------------------------------------- */ + +int FixGJF::setmask() +{ + int mask = 0; + mask |= INITIAL_INTEGRATE; + mask |= FINAL_INTEGRATE; + if (!osflag) mask |= END_OF_STEP; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixGJF::init() +{ + if (id_temp) { + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) { + error->all(FLERR, "Temperature compute ID {} for fix {} does not exist", id_temp, style); + } else { + if (temperature->tempflag == 0) + error->all(FLERR, "Compute ID {} for fix {} does not compute temperature", id_temp, style); + } + } + // check variable + + if (tstr) { + tvar = input->variable->find(tstr); + if (tvar < 0) error->all(FLERR, "Variable name {} for fix gjf does not exist", tstr); + if (input->variable->equalstyle(tvar)) + tstyle = EQUAL; + else if (input->variable->atomstyle(tvar)) + tstyle = ATOM; + else + error->all(FLERR, "Variable {} for fix gjf is invalid style", tstr); + } + + if (utils::strmatch(update->integrate_style, "^respa")) { + error->all(FLERR, "Fix gjf and run style respa are not compatible"); + } + + if (temperature && temperature->tempbias) + tbiasflag = BIAS; + else + tbiasflag = NOBIAS; + + // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) + switch (GJmethod) { + case 1: + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + break; + case 2: + gjfc2 = exp(-update->dt / t_period); + break; + case 3: + gjfc2 = 1.0 - update->dt / t_period; + break; + case 4: + gjfc2 = ( sqrt(1.0 + 4.0 * (update->dt / t_period) ) - 1.0 ) / ( 2.0 * update->dt / t_period ); + break; + case 5: + gjfc2 = 1.0 / (1.0 + update->dt / t_period); + break; + case 6: + gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); + break; + case 7: // provided in Finkelstein (2021) + update->dt = (1.0 + gjfc2) / (1.0 - gjfc2) * log(gjfc2) * log(gjfc2) * 0.5 * t_period; + break; + case 8: // provided in Gronbech-Jensen (2024) + gjfc2 = sqrt( (update->dt / t_period) * (update->dt / t_period) + 1.0 ) - update->dt / t_period; + break; + case 0: + gjfc2 = 0.0; + break; + default: + error->all(FLERR, "Fix gjf method not found"); + break; + } + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; +} + +/* ---------------------------------------------------------------------- + integrate position and velocity according to the GJ methods + in Grønbech-Jensen, J Stat Phys 191, 137 (2024). The general workflow is + 1. GJ Initial Integration + 2. Force Update + 3. GJ Final Integration + 4. Velocity Choice in end_of_step() +------------------------------------------------------------------------- */ + +void FixGJF::initial_integrate(int /* vflag */) +{ + // This function provides the integration of the GJ formulation 24 a-e + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *mass = atom->mass; + double *rmass = atom->rmass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double fran[3]; + + double boltz = force->boltz; + double dt = update->dt; + double mvv2e = force->mvv2e; + double ftm2v = force->ftm2v; + + double dtf = 0.5 * dt * ftm2v; + double dtfm; + double c1sqrt = sqrt(gjfc1); + double c3sqrt = sqrt(gjfc3); + double csq = sqrt(gjfc3 / gjfc1); + double m, beta; + + // If user elected vhalf, v needs to be reassigned to onsite velocity for integration + if (!osflag && lv_allocated) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // lv is Eq. 24f from previous time step + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + } + } + + compute_target(); + if (tbiasflag) temperature->compute_scalar(); + + if (rmass) { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); + m = rmass[i]; + beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; + + fran[0] = beta*random->gaussian(); + fran[1] = beta*random->gaussian(); + fran[2] = beta*random->gaussian(); + + // First integration delivers Eq. 24a and 24b: + dtfm = dtf / m; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + + if (tbiasflag) temperature->remove_bias(i, v[i]); + + // Calculate Eq. 24c: + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; + + // Calculate Eq. 24d + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; + + if (tbiasflag) temperature->restore_bias(i, v[i]); + if (tbiasflag) temperature->restore_bias(i, lv[i]); + + // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + } + } + } else { + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + if (tstyle == ATOM) tsqrt = sqrt(tforce[i]); + m = mass[type[i]]; + beta = tsqrt * sqrt(2.0*dt*m*boltz/t_period/mvv2e) / ftm2v; + + fran[0] = beta*random->gaussian(); + fran[1] = beta*random->gaussian(); + fran[2] = beta*random->gaussian(); + + // First integration delivers Eq. 24a and 24b: + dtfm = dtf / m; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + + if (tbiasflag) temperature->remove_bias(i, v[i]); + + // Calculate Eq. 24c: + lv[i][0] = c1sqrt*v[i][0] + ftm2v * (c3sqrt / (2.0 * m)) * fran[0]; + lv[i][1] = c1sqrt*v[i][1] + ftm2v * (c3sqrt / (2.0 * m)) * fran[1]; + lv[i][2] = c1sqrt*v[i][2] + ftm2v * (c3sqrt / (2.0 * m)) * fran[2]; + + // Calculate Eq. 24d + v[i][0] = (gjfc2 / c1sqrt) * lv[i][0] + ftm2v * csq * (0.5 / m) * fran[0]; + v[i][1] = (gjfc2 / c1sqrt) * lv[i][1] + ftm2v * csq * (0.5 / m) * fran[1]; + v[i][2] = (gjfc2 / c1sqrt) * lv[i][2] + ftm2v * csq * (0.5 / m) * fran[2]; + + if (tbiasflag) temperature->restore_bias(i, v[i]); + if (tbiasflag) temperature->restore_bias(i, lv[i]); + + // Calculate Eq. 24e. Final integrator then calculates Eq. 24f after force update. + x[i][0] += 0.5 * csq * dt * v[i][0]; + x[i][1] += 0.5 * csq * dt * v[i][1]; + x[i][2] += 0.5 * csq * dt * v[i][2]; + } + } + } +} + +void FixGJF::final_integrate() +{ + double **v = atom->v; + double **f = atom->f; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double dtfm; + double dtf = 0.5 * update->dt * force->ftm2v; + double csq = sqrt(gjfc3 / gjfc1); + + // Calculate Eq. 24f. + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + v[i][0] += csq * dtfm * f[i][0]; + v[i][1] += csq * dtfm * f[i][1]; + v[i][2] += csq * dtfm * f[i][2]; + } + } + + lv_allocated = 1; +} + +/* ---------------------------------------------------------------------- + set current t_target and t_sqrt +------------------------------------------------------------------------- */ + +void FixGJF::compute_target() +{ + int *mask = atom->mask; + int nlocal = atom->nlocal; + + double delta = update->ntimestep - update->beginstep; + if (delta != 0.0) delta /= update->endstep - update->beginstep; + + // if variable temp, evaluate variable, wrap with clear/add + // reallocate tforce array if necessary + + if (tstyle == CONSTANT) { + t_target = t_start + delta * (t_stop-t_start); + tsqrt = sqrt(t_target); + } else { + modify->clearstep_compute(); + if (tstyle == EQUAL) { + t_target = input->variable->compute_equal(tvar); + if (t_target < 0.0) + error->one(FLERR, "Fix gjf variable returned negative temperature"); + tsqrt = sqrt(t_target); + } else { + if (atom->nmax > maxatom) { + maxatom = atom->nmax; + memory->destroy(tforce); + memory->create(tforce,maxatom,"gjf:tforce"); + } + input->variable->compute_atom(tvar,igroup,tforce,1,0); + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + if (tforce[i] < 0.0) + error->one(FLERR, "Fix gjf variable returned negative temperature"); + } + modify->addstep_compute(update->ntimestep + 1); + } +} + +/* ---------------------------------------------------------------------- + select velocity for GJ +------------------------------------------------------------------------- */ + +void FixGJF::end_of_step() +{ + double **v = atom->v; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // After the final integrator delivers 24f, either the on-site or half-step + // velocity is used in remaining simulation tasks, depending on user input + double tmp[3]; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // v is Eq. 24f + tmp[0] = v[i][0]; + tmp[1] = v[i][1]; + tmp[2] = v[i][2]; + // Move on with half-step velocity + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + // store Eq. 24f in lv for next timestep + lv[i][0] = tmp[0]; + lv[i][1] = tmp[1]; + lv[i][2] = tmp[2]; + } +} + +// clang-format on +/* ---------------------------------------------------------------------- */ + +void FixGJF::reset_target(double t_new) +{ + t_target = t_start = t_stop = t_new; +} + +/* ---------------------------------------------------------------------- */ + +void FixGJF::reset_dt() +{ + // Complete set of thermostats is given in Gronbech-Jensen, Molecular Physics, 118 (2020) + switch (GJmethod) { + case 1: + gjfc2 = (1.0 - update->dt / 2.0 / t_period) / (1.0 + update->dt / 2.0 / t_period); + break; + case 2: + gjfc2 = exp(-update->dt / t_period); + break; + case 3: + gjfc2 = 1.0 - update->dt / t_period; + break; + case 4: + gjfc2 = ( sqrt(1.0 + 4.0 * (update->dt / t_period) ) - 1.0 ) / ( 2.0 * update->dt / t_period ); + break; + case 5: + gjfc2 = 1.0 / (1.0 + update->dt / t_period); + break; + case 6: + gjfc2 = (1.0 / (1.0 + update->dt / 2.0 / t_period)) * (1.0 / (1.0 + update->dt / 2.0 / t_period)); + break; + case 7: // provided in Finkelstein (2021) + update->dt = (1.0 + gjfc2) / (1.0 - gjfc2) * log(gjfc2) * log(gjfc2) * 0.5 * t_period; + break; + case 8: // provided in Gronbech-Jensen (2024) + gjfc2 = sqrt( (update->dt / t_period)*(update->dt / t_period) + 1.0 ) - update->dt / t_period; + break; + case 0: + gjfc2 = 0.0; + break; + default: + error->all(FLERR, "Fix gjf method not found"); + break; + } + gjfc1 = (1.0 + gjfc2) / 2.0; + gjfc3 = (1.0 - gjfc2) * t_period / update->dt; +} + +/* ---------------------------------------------------------------------- */ + +int FixGJF::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0], "temp") == 0) { + if (narg < 2) utils::missing_cmd_args(FLERR, "fix_modify", error); + delete[] id_temp; + id_temp = utils::strdup(arg[1]); + temperature = modify->get_compute_by_id(id_temp); + if (!temperature) + error->all(FLERR, "Could not find fix_modify temperature compute ID: {}", id_temp); + + if (temperature->tempflag == 0) + error->all(FLERR, "Fix_modify temperature compute {} does not compute temperature", id_temp); + if (temperature->igroup != igroup && comm->me == 0) + error->warning(FLERR, "Group for fix_modify temp != fix group: {} vs {}", + group->names[igroup], group->names[temperature->igroup]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + extract thermostat properties +------------------------------------------------------------------------- */ + +void *FixGJF::extract(const char *str, int &dim) +{ + dim = 0; + if (strcmp(str, "t_target") == 0) { return &t_target; } + return nullptr; +} + +/* ---------------------------------------------------------------------- + memory usage of tally array +------------------------------------------------------------------------- */ + +double FixGJF::memory_usage() +{ + double bytes = 0.0; + bytes += (double) atom->nmax * 3 * sizeof(double); + if (tforce) bytes += (double) atom->nmax * sizeof(double); + return bytes; +} + +/* ---------------------------------------------------------------------- + allocate atom-based array for lv +------------------------------------------------------------------------- */ + +void FixGJF::grow_arrays(int nmax) +{ + memory->grow(lv, nmax, 3, "fix_gjf:lv"); +} + +/* ---------------------------------------------------------------------- + copy values within local atom-based array +------------------------------------------------------------------------- */ + +void FixGJF::copy_arrays(int i, int j, int /*delflag*/) +{ + lv[j][0] = lv[i][0]; + lv[j][1] = lv[i][1]; + lv[j][2] = lv[i][2]; +} + +/* ---------------------------------------------------------------------- + pack values in local atom-based array for exchange with another proc +------------------------------------------------------------------------- */ + +int FixGJF::pack_exchange(int i, double *buf) +{ + int n = 0; + buf[n++] = lv[i][0]; + buf[n++] = lv[i][1]; + buf[n++] = lv[i][2]; + return n; +} + +/* ---------------------------------------------------------------------- + unpack values in local atom-based array from exchange with another proc +------------------------------------------------------------------------- */ + +int FixGJF::unpack_exchange(int nlocal, double *buf) +{ + int n = 0; + lv[nlocal][0] = buf[n++]; + lv[nlocal][1] = buf[n++]; + lv[nlocal][2] = buf[n++]; + return n; +} diff --git a/src/EXTRA-FIX/fix_gjf.h b/src/EXTRA-FIX/fix_gjf.h new file mode 100644 index 0000000000..154f6543da --- /dev/null +++ b/src/EXTRA-FIX/fix_gjf.h @@ -0,0 +1,68 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 FIX_CLASS +// clang-format off +FixStyle(gjf,FixGJF); +// clang-format on +#else + +#ifndef LMP_FIX_GJF_H +#define LMP_FIX_GJF_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixGJF : public Fix { + public: + FixGJF(class LAMMPS *, int, char **); + ~FixGJF() override; + int setmask() override; + void init() override; + void initial_integrate(int) override; + void final_integrate() override; + void end_of_step() override; + void reset_target(double) override; + void reset_dt() override; + int modify_param(int, char **) override; + double memory_usage() override; + void *extract(const char *, int &) override; + void grow_arrays(int) override; + void copy_arrays(int, int, int) override; + int pack_exchange(int, double *) override; + int unpack_exchange(int, double *) override; + + protected: + int osflag, tbiasflag, GJmethod, maxatom, lv_allocated; + double t_start, t_stop, t_period, t_target, tsqrt; + double gjfc1, gjfc2, gjfc3; + int tstyle, tvar; + char *tstr; + + double *tforce; + double **lv; //half step velocity + + char *id_temp; + class Compute *temperature; + + class RanMars *random; + int seed; + + void compute_target(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/EXTRA-PAIR/pair_lj_pirani.cpp b/src/EXTRA-PAIR/pair_lj_pirani.cpp index b0b5ab2f7a..e2ece45578 100644 --- a/src/EXTRA-PAIR/pair_lj_pirani.cpp +++ b/src/EXTRA-PAIR/pair_lj_pirani.cpp @@ -39,7 +39,7 @@ using MathSpecial::square; /* ---------------------------------------------------------------------- */ -PairLJPirani::PairLJPirani(LAMMPS *lmp) : Pair(lmp) +PairLJPirani::PairLJPirani(LAMMPS *lmp) : Pair(lmp), cut_respa(nullptr) { respa_enable = 1; born_matrix_enable = 0; @@ -95,7 +95,7 @@ void PairLJPirani::compute(int eflag, int vflag) { int i, j, ii, jj, inum, jnum, itype, jtype; double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair; - double rsq, forcelj, factor_lj; + double rsq, factor_lj; int *ilist, *jlist, *numneigh, **firstneigh; double r, rx, n_x; @@ -208,13 +208,12 @@ void PairLJPirani::compute_inner() { int i, j, ii, jj, inum, jnum, itype, jtype; double xtmp, ytmp, ztmp, delx, dely, delz, fpair; - double rsq, r2inv, r6inv, forcelj, factor_lj, rsw; + double rsq, factor_lj, rsw; int *ilist, *jlist, *numneigh, **firstneigh; double r, rx, n_x; double pow_rx_n_x, pow_rx_gamma; double filj1, filj2, filj3, filj4, filj5, filj6, forceilj; - double ilj1, ilj2; double fxtmp, fytmp, fztmp; double **x = atom->x; @@ -315,13 +314,12 @@ void PairLJPirani::compute_middle() { int i, j, ii, jj, inum, jnum, itype, jtype; double xtmp, ytmp, ztmp, delx, dely, delz, fpair; - double rsq, r2inv, r6inv, forcelj, factor_lj, rsw; + double rsq, factor_lj, rsw; int *ilist, *jlist, *numneigh, **firstneigh; double r, rx, n_x; double pow_rx_n_x, pow_rx_gamma; double filj1, filj2, filj3, filj4, filj5, filj6, forceilj; - double ilj1, ilj2; double fxtmp, fytmp, fztmp; double **x = atom->x; @@ -430,7 +428,7 @@ void PairLJPirani::compute_outer(int eflag, int vflag) { int i, j, ii, jj, inum, jnum, itype, jtype; double xtmp, ytmp, ztmp, delx, dely, delz, evdwl, fpair; - double rsq, r2inv, r6inv, forcelj, factor_lj, rsw; + double rsq, factor_lj, rsw; int *ilist, *jlist, *numneigh, **firstneigh; double r, rx, n_x; diff --git a/src/GRANULAR/fix_add_heat.cpp b/src/GRANULAR/fix_add_heat.cpp index 73bf8a9a26..330723700b 100644 --- a/src/GRANULAR/fix_add_heat.cpp +++ b/src/GRANULAR/fix_add_heat.cpp @@ -20,11 +20,13 @@ #include "atom.h" #include "error.h" #include "input.h" +#include "math_special.h" #include "memory.h" #include "variable.h" using namespace LAMMPS_NS; using namespace FixConst; +using MathSpecial::powint; enum { CONSTANT, EQUAL, ATOM }; enum { ADD, LINEAR, QUARTIC }; @@ -152,7 +154,7 @@ void FixAddHeat::post_force(int /*vflag*/) } else if (style == LINEAR) { heatflow[i] += prefactor * (vtmp - temperature[i]); } else if (style == QUARTIC) { - heatflow[i] += prefactor * (pow(vtmp, 4.0) - pow(temperature[i], 4.0)); + heatflow[i] += prefactor * (powint(vtmp, 4) - powint(temperature[i], 4)); } } } diff --git a/src/GRANULAR/fix_granular_mdr.cpp b/src/GRANULAR/fix_granular_mdr.cpp index 9efabdf465..0416edc432 100644 --- a/src/GRANULAR/fix_granular_mdr.cpp +++ b/src/GRANULAR/fix_granular_mdr.cpp @@ -29,6 +29,7 @@ #include "granular_model.h" #include "input.h" #include "math_const.h" +#include "math_special.h" #include "memory.h" #include "modify.h" #include "neigh_list.h" @@ -43,9 +44,10 @@ using namespace Granular_NS; using namespace Granular_MDR_NS; using namespace FixConst; using MathConst::MY_PI; +using MathSpecial::cube; static constexpr double EPSILON = 1e-16; -static constexpr double OVERLAP_LIMIT = 0.75; +static constexpr double OVERLAP_LIMIT = 0.95; enum { COMM_1, COMM_2 }; @@ -85,7 +87,7 @@ void FixGranularMDR::post_constructor() modify->add_fix( fmt::format("{} all property/atom d_Ro d_Vcaps d_Vgeo d_Velas d_eps_bar d_dRnumerator " "d_dRdenominator d_Acon0 d_Acon1 d_Atot d_Atot_sum d_ddelta_bar d_psi " - "d_history_setup_flag d_sigmaxx d_sigmayy d_sigmazz ghost yes", + "d_history_setup_flag d_sigmaxx d_sigmayy d_sigmazz d_dRavg ghost yes", id_fix)); index_Ro = atom->find_custom("Ro", tmp1, tmp2); @@ -105,6 +107,7 @@ void FixGranularMDR::post_constructor() index_sigmaxx = atom->find_custom("sigmaxx", tmp1, tmp2); index_sigmayy = atom->find_custom("sigmayy", tmp1, tmp2); index_sigmazz = atom->find_custom("sigmazz", tmp1, tmp2); + index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); } /* ---------------------------------------------------------------------- */ @@ -153,31 +156,31 @@ void FixGranularMDR::setup_pre_force(int /*vflag*/) norm_model2 = dynamic_cast(fix->model->normal_model); - if (norm_model && norm_model2 && (norm_model->E != norm_model2->E)) + if (norm_model && norm_model2 && fabs(norm_model->get_emod() - norm_model2->get_emod()) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Young's modulus in pair style, {}, does not agree with value {} in fix gran/wall/region", - norm_model->E, norm_model2->E); - if (norm_model->nu != norm_model2->nu) + norm_model->get_emod(), norm_model2->get_emod()); + if (fabs(norm_model->get_poiss() - norm_model2->get_poiss()) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Poisson's ratio in pair style, {}, does not agree with value {} in fix gran/wall/region", - norm_model->nu, norm_model2->nu); - if (norm_model->Y != norm_model2->Y) + norm_model->get_poiss(), norm_model2->get_poiss()); + if (fabs(norm_model->Y - norm_model2->Y) > EPSILON) error->all( FLERR, Error::NOLASTLINE, "Yield stress in pair style, {}, does not agree with value {} in fix gran/wall/region", norm_model->Y, norm_model2->Y); - if (norm_model->psi_b != norm_model2->psi_b) + if (fabs(norm_model->psi_b - norm_model2->psi_b) > EPSILON) error->all(FLERR, Error::NOLASTLINE, "Bulk response trigger in pair style, {}, does not agree with value {} in fix " "gran/wall/region", norm_model->psi_b, norm_model2->psi_b); - if (norm_model->CoR != norm_model2->CoR) + if (fabs(norm_model->get_damp() - norm_model2->get_damp()) > EPSILON) error->all(FLERR, Error::NOLASTLINE, - "Coefficient of restitution in pair style, {}, does not agree with value {} in " + "Damping in pair style, {}, does not agree with value {} in " "fix gran/wall/region", - norm_model->CoR, norm_model2->CoR); + norm_model->get_damp(), norm_model2->get_damp()); } fix_history = dynamic_cast(modify->get_fix_by_id("NEIGH_HISTORY_GRANULAR")); @@ -208,6 +211,7 @@ void FixGranularMDR::pre_force(int) double *sigmayy = atom->dvector[index_sigmayy]; double *sigmazz = atom->dvector[index_sigmazz]; double *history_setup_flag = atom->dvector[index_history_setup_flag]; + double *dRavg = atom->dvector[index_dRavg]; int new_atom; int nlocal = atom->nlocal; @@ -241,17 +245,24 @@ void FixGranularMDR::pre_force(int) if (update->setupflag && (!new_atom)) continue; const double R = radius[i]; - const double Vo = 4.0 / 3.0 * MY_PI * pow(Ro[i], 3.0); - const double Vgeoi = 4.0 / 3.0 * MY_PI * pow(R, 3.0) - Vcaps[i]; + const double Rsq = R * R; + const double Vo = 4.0 / 3.0 * MY_PI * cube(Ro[i]); + const double Vgeoi = 4.0 / 3.0 * MY_PI * Rsq * R - Vcaps[i]; Vgeo[i] = MIN(Vgeoi, Vo); Velas[i] = Vo * (1.0 + eps_bar[i]); - Atot[i] = 4.0 * MY_PI * pow(R, 2.0) + Atot_sum[i]; + Atot[i] = 4.0 * MY_PI * Rsq + Atot_sum[i]; psi[i] = (Atot[i] - Acon1[i]) / Atot[i]; if (psi_b_coeff < psi[i]) { - const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * pow(R, 2.0)), 0.0); - if ((radius[i] + dR) < (1.5 * Ro[i])) radius[i] += dR; + double w_confinement; + ( psi[i] > 0.1 ) ? w_confinement = 1.0 / (1.0 + exp(-75.0 * (psi[i] - 0.2))) : w_confinement = 0.0; + const double dR = MAX(dRnumerator[i] / (dRdenominator[i] - 4.0 * MY_PI * Rsq) * w_confinement, 0.0); + + const double N_window = 10.0; + if (dR > 0.0) dRavg[i] += (dR - dRavg[i]) / N_window; + + if (((radius[i] + dR) < (1.5 * Ro[i])) && (dR > 0.0)) radius[i] += dRavg[i]; } Acon0[i] = Acon1[i]; } diff --git a/src/GRANULAR/fix_granular_mdr.h b/src/GRANULAR/fix_granular_mdr.h index f0ba76d155..fce727fe5d 100644 --- a/src/GRANULAR/fix_granular_mdr.h +++ b/src/GRANULAR/fix_granular_mdr.h @@ -51,7 +51,8 @@ namespace Granular_MDR_NS { PENALTY, // contact penalty DELTA_MAX, DELTAP_0, - DELTAP_1 + DELTAP_1, + DAMP_SCALE }; } // namespace Granular_MDR_NS @@ -97,8 +98,7 @@ class FixGranularMDR : public Fix { int index_sigmayy; // yy-component of the stress tensor, not necessary forforce calculation int index_sigmazz; // zz-component of the stress tensor, not necessary forforce calculation int index_history_setup_flag; // flag to check if history variables have beeninitialized - int index_contacts; // total contacts on particle - int index_adhesive_length; // total length of adhesive contact on a particle + int index_dRavg; // average radius update increment }; } // namespace LAMMPS_NS diff --git a/src/GRANULAR/gran_sub_mod_damping.cpp b/src/GRANULAR/gran_sub_mod_damping.cpp index 2fdd7e1f82..f85b866f8d 100644 --- a/src/GRANULAR/gran_sub_mod_damping.cpp +++ b/src/GRANULAR/gran_sub_mod_damping.cpp @@ -13,11 +13,14 @@ #include "gran_sub_mod_damping.h" +#include "error.h" #include "gran_sub_mod_normal.h" +#include "fix_granular_mdr.h" #include "granular_model.h" #include "math_special.h" #include "math_const.h" +#include "style_gran_sub_mod.h" // IWYU pragma: keep #include using namespace LAMMPS_NS; @@ -41,6 +44,9 @@ GranSubModDamping::GranSubModDamping(GranularModel *gm, LAMMPS *lmp) : GranSubMo void GranSubModDamping::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + damp = gm->normal_model->get_damp(); } @@ -127,6 +133,9 @@ GranSubModDampingTsuji::GranSubModDampingTsuji(GranularModel *gm, LAMMPS *lmp) : void GranSubModDampingTsuji::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + double tmp = gm->normal_model->get_damp(); damp = 1.2728 - 4.2783 * tmp + 11.087 * square(tmp); damp += -22.348 * cube(tmp) + 27.467 * powint(tmp, 4); @@ -160,6 +169,9 @@ GranSubModDampingCoeffRestitution::GranSubModDampingCoeffRestitution(GranularMod void GranSubModDampingCoeffRestitution::init() { + if (gm->normal_model->name == "mdr") + error->all(FLERR, "Only damping mdr may be used with the mdr normal model"); + // Calculate prefactor, assume Hertzian as default double cor = gm->normal_model->get_damp(); double logcor = log(cor); @@ -170,3 +182,48 @@ void GranSubModDampingCoeffRestitution::init() damp /= sqrt(MY_PI * MY_PI + logcor * logcor); } } + +/* ---------------------------------------------------------------------- + MDR damping +------------------------------------------------------------------------- */ + +GranSubModDampingMDR::GranSubModDampingMDR(GranularModel *gm, LAMMPS *lmp) : + GranSubModDamping(gm, lmp) +{ + num_coeffs = 1; +} + +void GranSubModDampingMDR::coeffs_to_local() +{ + damp_type = coeffs[0]; // damping type 1 = mdr stiffness or 2 = velocity + if (damp_type != 1 && damp_type != 2) + error->all(FLERR, "Illegal MDR damping model, damping type must an integer equal to 1 or 2"); +} + +/* ---------------------------------------------------------------------- */ + +void GranSubModDampingMDR::init() +{ + if (gm->normal_model->name != "mdr") + error->all(FLERR, "Damping mdr can only be used with mdr normal model"); + + damp = gm->normal_model->get_damp(); +} + +/* ---------------------------------------------------------------------- */ + +double GranSubModDampingMDR::calculate_forces() +{ + using namespace Granular_MDR_NS; + double *history = & gm->history[gm->normal_model->history_index]; + if (damp_type == 1) { + damp_prefactor = damp * history[DAMP_SCALE]; + } else if (damp_type == 2) { + if (history[DAMP_SCALE] == 0.0) { + damp_prefactor = 0.0; + } else { + damp_prefactor = damp; + } + } + return -damp_prefactor * gm->vnnr; +} diff --git a/src/GRANULAR/gran_sub_mod_damping.h b/src/GRANULAR/gran_sub_mod_damping.h index 98c31d680a..ac1363f64f 100644 --- a/src/GRANULAR/gran_sub_mod_damping.h +++ b/src/GRANULAR/gran_sub_mod_damping.h @@ -19,6 +19,7 @@ GranSubModStyle(mass_velocity,GranSubModDampingMassVelocity,DAMPING); GranSubModStyle(viscoelastic,GranSubModDampingViscoelastic,DAMPING); GranSubModStyle(tsuji,GranSubModDampingTsuji,DAMPING); GranSubModStyle(coeff_restitution,GranSubModDampingCoeffRestitution,DAMPING); +GranSubModStyle(mdr,GranSubModDampingMDR,DAMPING); // clang-format on #else @@ -48,7 +49,6 @@ namespace Granular_NS { class GranSubModDampingNone : public GranSubModDamping { public: GranSubModDampingNone(class GranularModel *, class LAMMPS *); - void init() override{}; double calculate_forces() override; }; @@ -95,6 +95,19 @@ namespace Granular_NS { /* ---------------------------------------------------------------------- */ + class GranSubModDampingMDR : public GranSubModDamping { + public: + GranSubModDampingMDR(class GranularModel *, class LAMMPS *); + void coeffs_to_local() override; + void init() override; + double calculate_forces() override; + + protected: + int damp_type; + }; + + /* ---------------------------------------------------------------------- */ + } // namespace Granular_NS } // namespace LAMMPS_NS diff --git a/src/GRANULAR/gran_sub_mod_normal.cpp b/src/GRANULAR/gran_sub_mod_normal.cpp index 226d26d86b..a4e2aecdc4 100644 --- a/src/GRANULAR/gran_sub_mod_normal.cpp +++ b/src/GRANULAR/gran_sub_mod_normal.cpp @@ -19,16 +19,18 @@ #include "fix_granular_mdr.h" #include "granular_model.h" #include "math_const.h" +#include "math_special.h" #include "modify.h" #include "update.h" #include -#include -#include using namespace LAMMPS_NS; using namespace Granular_NS; using namespace MathConst; +using MathSpecial::square; +using MathSpecial::cube; +using MathSpecial::powint; static constexpr double PISQ = 9.8696044010893579923; // PI^2 static constexpr double PIINV = 0.318309886183790691216; // 1/PI @@ -47,7 +49,7 @@ static constexpr int MDR_MAX_IT = 100; // Newton-Raphs static constexpr double MDR_EPSILON1 = 1e-10; // Newton-Raphson for MDR static constexpr double MDR_EPSILON2 = 1e-16; // Newton-Raphson for MDR static constexpr double MDR_EPSILON3 = 1e-20; // For precision checks -static constexpr double MDR_OVERLAP_LIMIT = 0.75; // Maximum contact overlap for MDR +static constexpr double MDR_OVERLAP_LIMIT = 0.95; // Maximum contact overlap for MDR static const char cite_mdr[] = "MDR contact model command: (i) https://doi.org/10.1016/j.jmps.2023.105492 || (ii) https://doi.org/10.1016/j.jmps.2023.105493 || (iii) https://doi.org/10.31224/4289\n\n" @@ -73,8 +75,9 @@ static const char cite_mdr[] = " author = {Zunker, William and Dunatunga, Sachith and Thakur, Subhash and Tang, Pingjun and Kamrin, Ken},\n" " title = {Experimentally validated DEM for large deformation powder compaction:\n" " mechanically-derived contact model and screening of non-physical contacts},\n" + " journal = {Powder Technology},\n" " year = {2025},\n" - " journal = {engrXiv},\n" + " pages = {120972},\n" "}\n\n"; /* ---------------------------------------------------------------------- @@ -442,9 +445,10 @@ GranSubModNormalMDR::GranSubModNormalMDR(GranularModel *gm, LAMMPS *lmp) : num_coeffs = 6; contact_radius_flag = 1; - size_history = 26; + size_history = 27; nsvector = 1; fix_mdr_flag = 0; + material_properties = 1; id_fix = nullptr; nondefault_history_transfer = 1; @@ -467,29 +471,30 @@ GranSubModNormalMDR::~GranSubModNormalMDR() void GranSubModNormalMDR::coeffs_to_local() { - E = coeffs[0]; // Young's modulus - nu = coeffs[1]; // Poisson's ratio - Y = coeffs[2]; // yield stress - gamma = coeffs[3]; // effective surface energy - psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} - CoR = coeffs[5]; // coefficent of restitution + Emod = coeffs[0]; // Young's modulus + poiss = coeffs[1]; // Poisson's ratio + Y = coeffs[2]; // yield stress + gamma = coeffs[3]; // effective surface energy + psi_b = coeffs[4]; // bulk response trigger based on ratio of remaining free area: A_{free}/A_{total} + damp = coeffs[5]; // coefficent of restitution - if (E <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); - if (nu < 0.0 || nu > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); + if (Emod <= 0.0) error->all(FLERR, "Illegal MDR normal model, Young's modulus must be greater than 0"); + if (poiss < 0.0 || poiss > 0.5) error->all(FLERR, "Illegal MDR normal model, Poisson's ratio must be between 0 and 0.5"); if (Y < 0.0) error->all(FLERR, "Illegal MDR normal model, yield stress must be greater than or equal to 0"); if (gamma < 0.0) error->all(FLERR, "Illegal MDR normal model, effective surface energy must be greater than or equal to 0"); if (psi_b < 0.0 || psi_b > 1.0) error->all(FLERR, "Illegal MDR normal model, psi_b must be between 0 and 1.0"); - if (CoR < 0.0 || CoR > 1.0) error->all(FLERR, "Illegal MDR normal model, coefficent of restitution must be between 0 and 1.0"); + if (damp < 0.0) error->all(FLERR, "Illegal MDR normal model, damping coefficent must be greater than or equal to 0"); - G = E / (2.0 * (1.0 + nu)); // shear modulus - kappa = E / (3.0 * (1.0 - 2.0 * nu)); // bulk modulus - Eeff = E / (1.0 - pow(nu, 2.0)); // composite plane strain modulus + G = Emod / (2.0 * (1.0 + poiss)); // shear modulus + kappa = Emod / (3.0 * (1.0 - 2.0 * poiss)); // bulk modulus + Eeff = Emod / (1.0 - square(poiss)); // composite plane strain modulus // precomputing factors Eeffinv = 1.0 / Eeff; Eeffsq = Eeff * Eeff; Eeffsqinv = Eeffinv * Eeffinv; + Eeff2particle = 0.5 * Eeff; gammasq = gamma * gamma; gamma3 = gammasq * gamma; @@ -528,6 +533,7 @@ void GranSubModNormalMDR::init() index_sigmaxx = atom->find_custom("sigmaxx", tmp1, tmp2); // xx-component of the stress tensor, not necessary for force calculation index_sigmayy = atom->find_custom("sigmayy", tmp1, tmp2); // yy-component of the stress tensor, not necessary for force calculation index_sigmazz = atom->find_custom("sigmazz", tmp1, tmp2); // zz-component of the stress tensor, not necessary for force calculation + index_dRavg = atom->find_custom("dRavg", tmp1, tmp2); // radius update increment } /* ---------------------------------------------------------------------- */ @@ -566,6 +572,7 @@ double GranSubModNormalMDR::calculate_forces() double *sigmaxx = atom->dvector[index_sigmaxx]; double *sigmayy = atom->dvector[index_sigmayy]; double *sigmazz = atom->dvector[index_sigmazz]; + double *dRavg = atom->dvector[index_dRavg]; const int itag_true = atom->tag[gm->i]; // true i particle tag const int jtag_true = atom->tag[gm->j]; // true j particle tag @@ -579,6 +586,7 @@ double GranSubModNormalMDR::calculate_forces() double F1 = 0.0; // force on contact side 1 double delta = gm->delta; // apparent overlap double Ac_avg = 0.0; // average contact area across both sides + double a_damp = 0.0; // damping contact radius double *history = & gm->history[history_index]; // load in all history variables int history_update = gm->history_update; @@ -596,7 +604,6 @@ double GranSubModNormalMDR::calculate_forces() if (gm->delta >= *deltamax_offset) *deltamax_offset = gm->delta; double deltamax = *deltamax_offset; - for (int contactSide = 0; contactSide < 2; contactSide++) { double *delta_offset, *deltao_offset, *delta_MDR_offset, *delta_BULK_offset; @@ -607,17 +614,17 @@ double GranSubModNormalMDR::calculate_forces() // displacement partitioning only necessary for particle-particle contact // itag and jtag persist after neighbor list builds, use tags to compare to match - // contact history variables consistently across steps for a particle pair. + // contact history variables consistently across steps for a particle pair. if ((contactSide == 0 && itag_true > jtag_true) || (contactSide != 0 && itag_true < jtag_true)) { - gm->i = i_true; - gm->j = j_true; - gm->radi = radi_true; - gm->radj = radj_true; + gm->i = i_true; + gm->j = j_true; + gm->radi = radi_true; + gm->radj = radj_true; } else { - gm->i = j_true; - gm->j = i_true; - gm->radi = radj_true; - gm->radj = radi_true; + gm->i = j_true; + gm->j = i_true; + gm->radi = radj_true; + gm->radj = radi_true; } // determine the two maximum experienced geometric overlaps on either side of rigid flat @@ -715,7 +722,7 @@ double GranSubModNormalMDR::calculate_forces() if (history_update && phertz > pY) { *Yflag_offset = 1.0; *deltaY_offset = delta_MDR; - *cA_offset = MY_PI * (pow(*deltaY_offset, 2) - *deltaY_offset * R); + *cA_offset = MY_PI * (square(*deltaY_offset) - *deltaY_offset * R); } } @@ -737,7 +744,7 @@ double GranSubModNormalMDR::calculate_forces() amax = sqrt(deltamax_MDR * R); } else { // plastic contact - amax = sqrt(2.0 * deltamax_MDR * R - pow(deltamax_MDR, 2) + cA * PIINV); + amax = sqrt(2.0 * deltamax_MDR * R - square(deltamax_MDR) + cA * PIINV); amaxsq = amax * amax; A = 4.0 * pY * Eeffinv * amax; Ainv = 1.0 / A; @@ -748,13 +755,13 @@ double GranSubModNormalMDR::calculate_forces() // force caused by full submersion of elliptical indenter to depth of A/2 double Fmax = Eeff * (A * B * 0.25) * acos(1 - 2 * deltae1Dmax * Ainv); - Fmax -= (2 - 4 * deltae1Dmax * Ainv) * sqrt(deltae1Dmax * Ainv - pow(deltae1Dmax * Ainv, 2)); + Fmax -= (2 - 4 * deltae1Dmax * Ainv) * sqrt(deltae1Dmax * Ainv - square(deltae1Dmax * Ainv)); // depth of particle center const double zR = R - (deltamax_MDR - deltae1Dmax); - deltaR = 2 * amaxsq * (-1 + nu) - (-1 + 2 * nu) * zR * (-zR + sqrt(amaxsq + pow(zR, 2))); - deltaR *= Fmax / (MY_2PI * amaxsq * G * sqrt(amaxsq + pow(zR, 2))); + deltaR = 2 * amaxsq * (-1 + poiss) - (-1 + 2 * poiss) * zR * (-zR + sqrt(amaxsq + square(zR))); + deltaR *= Fmax / (MY_2PI * amaxsq * G * sqrt(amaxsq + square(zR))); // transformed elastic displacement deltae1D = (delta_MDR - deltamax_MDR + deltae1Dmax + deltaR) / (1 + deltaR / deltae1Dmax); @@ -805,17 +812,17 @@ double GranSubModNormalMDR::calculate_forces() } if (std::isnan(F_MDR)) - error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs"); + error->one(FLERR, "F_MDR is NaN, case 1: no tensile springs for atoms {} and {}", itag_true, jtag_true); if (history_update) *aAdh_offset = a_fac * a_na; } else { // case 2+3, tensile springs const double lmax = sqrt(MY_2PI * aAdh * gamma * Eeffinv); - g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); + g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - square(aAdh)); g_aAdh = round_up_negative_epsilon(g_aAdh); double tmp = 27 * A4 * B4 * gamma * Eeffinv; - tmp -= 2 * pow(B, 6) * gamma3 * PISQ * pow(Eeffinv, 3); + tmp -= 2 * powint(B, 6) * gamma3 * PISQ * cube(Eeffinv); tmp += sqrt(27) * Asq * B4 * sqrt(27 * A4 * Eeffsq * gammasq - 4 * Bsq * gamma4 * PISQ) * Eeffsqinv; tmp = cbrt(tmp); @@ -843,12 +850,12 @@ double GranSubModNormalMDR::calculate_forces() double aAdh_tmp = aAdh; double fa, fa2, fa_tmp, dfda; for (int lv1 = 0; lv1 < MDR_MAX_IT; ++lv1) { - fa_tmp = deltae1D - A * 0.5 + A * sqrt(Bsq * 0.25 - pow(aAdh_tmp, 2)) * Binv; + fa_tmp = deltae1D - A * 0.5 + A * sqrt(Bsq * 0.25 - square(aAdh_tmp)) * Binv; fa = fa_tmp + sqrt(MY_2PI * aAdh_tmp * gamma * Eeffinv); if (abs(fa) < MDR_EPSILON1) { break; } - dfda = -aAdh_tmp * A / (B * sqrt(-pow(aAdh_tmp, 2) + Bsq * 0.25)); + dfda = -aAdh_tmp * A / (B * sqrt(-square(aAdh_tmp) + Bsq * 0.25)); dfda += gamma * SQRTHALFPI / sqrt(aAdh_tmp * gamma * Eeff); aAdh_tmp = aAdh_tmp - fa / dfda; fa2 = fa_tmp + sqrt(MY_2PI * aAdh_tmp * gamma * Eeffinv); @@ -861,15 +868,20 @@ double GranSubModNormalMDR::calculate_forces() } aAdh = aAdh_tmp; - g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - pow(aAdh, 2)); - g_aAdh = round_up_negative_epsilon(g_aAdh); + if (aAdh < acrit) { + aAdh = 0.0; + F_MDR = 0.0; + } else { + g_aAdh = A * 0.5 - A * Binv * sqrt(Bsq * 0.25 - square(aAdh)); + g_aAdh = round_up_negative_epsilon(g_aAdh); - const double deltaeAdh = g_aAdh; - const double F_na = calculate_nonadhesive_mdr_force(deltaeAdh, Ainv, Eeff, A, B); - const double F_Adhes = 2.0 * Eeff * (deltae1D - deltaeAdh) * aAdh; - F_MDR = F_na + F_Adhes; - if (std::isnan(F_MDR)) - error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length"); + const double deltaeAdh = g_aAdh; + const double F_na = calculate_nonadhesive_mdr_force(deltaeAdh, Ainv, Eeff, A, B); + const double F_Adhes = 2.0 * Eeff * (deltae1D - deltaeAdh) * aAdh; + F_MDR = F_na + F_Adhes; + if (std::isnan(F_MDR)) + error->one(FLERR, "F_MDR is NaN, case 3: tensile springs exceed critical length"); + } } if (history_update) *aAdh_offset = aAdh; } @@ -883,7 +895,7 @@ double GranSubModNormalMDR::calculate_forces() // area related calculations double Ac; - (*Yflag_offset == 0.0) ? Ac = MY_PI * delta * R : Ac = MY_PI * (2.0 * delta * R - pow(delta, 2)) + cA; + (*Yflag_offset == 0.0) ? Ac = MY_PI * delta * R : Ac = MY_PI * (2.0 * delta * R - square(delta)) + cA; if (Ac < 0.0) Ac = 0.0; if (history_update) { Atot_sum[i] += wij * (Ac - MY_2PI * R * (deltamax_MDR + delta_BULK)); @@ -891,6 +903,9 @@ double GranSubModNormalMDR::calculate_forces() } Ac_avg += wij * Ac; + // contact radius for damping + (gamma > 0.0) ? a_damp += aAdh : a_damp += a_na; + // bulk force calculation double F_BULK; (delta_BULK <= 0.0) ? F_BULK = 0.0 : F_BULK = (1.0 / Vgeo[i]) * Acon0[i] * delta_BULK * kappa * Ac; @@ -903,7 +918,7 @@ double GranSubModNormalMDR::calculate_forces() *Ac_offset = wij * Ac; // radius update scheme quantity calculation - Vcaps[i] += MY_PI * THIRD * pow(delta, 2) * (3.0 * R - delta); + Vcaps[i] += MY_PI * THIRD * square(delta) * (3.0 * R - delta); } const double Fntmp = wij * (F_MDR + F_BULK); @@ -917,9 +932,9 @@ double GranSubModNormalMDR::calculate_forces() if (history_update) eps_bar[i] += eps_bar_contact; if (history_update && delta_MDR == deltamax_MDR && *Yflag_offset > 0.0 && F_MDR > 0.0) { - const double Vo = FOURTHIRDS * MY_PI * pow(Ro, 3); + const double Vo = FOURTHIRDS * MY_PI * cube(Ro); dRnumerator[i] -= Vo * (eps_bar_contact - *eps_bar_offset); - dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - pow(deltao, 2) + pow(R, 2) - pow(Ro, 2)); + dRnumerator[i] -= wij * MY_PI * ddeltao * (2 * deltao * Ro - square(deltao) + square(R) - square(Ro)); dRdenominator[i] += wij * 2.0 * MY_PI * R * (deltao + R - Ro); } @@ -944,41 +959,32 @@ double GranSubModNormalMDR::calculate_forces() const double wij = MAX(1.0 - pij, 0.0); // assign final force + double damp_scale; if (gm->contact_type != PAIR) { - F = wij * F0; + a_damp = a_damp/2.0; + damp_scale = sqrt(gm->meff * 2.0 * Eeff2particle * a_damp); + double *deltao_offset = &history[DELTAO_0]; + const double wfm = std::exp(10.7 * (*deltao_offset) / Rinitial[gm->i] - 10.0) + 1.0; // wall force magnifier + F = wij * F0 * wfm; } else { + damp_scale = sqrt(gm->meff * 2.0 * Eeff * a_damp); F = wij * (F0 + F1) * 0.5; } - // calculate damping force - if (F > 0.0) { - double Eeff2; - double Reff2; - if (gm->contact_type == PAIR) { - Eeff2 = E / (2.0 * (1.0 - pow(nu, 2))); - Reff2 = 1.0 / ((1.0 / gm->radi + 1.0 / gm->radj)); - } else { - Eeff2 = E / (1.0 - pow(nu, 2)); - Reff2 = gm->radi; - } - const double kn = Eeff2 * Reff2; - const double beta = -log(CoR) / sqrt(pow(log(CoR), 2) + PISQ); - const double damp_prefactor = beta * sqrt(gm->meff * kn); - const double F_DAMP = -damp_prefactor * gm->vnnr; - - F += wij * F_DAMP; + if (history_update) { + double *damp_scale_offset = & history[DAMP_SCALE]; + (a_damp <= 0.0) ? *damp_scale_offset = 0.0 : *damp_scale_offset = damp_scale; } return F; } - /* ---------------------------------------------------------------------- */ double GranSubModNormalMDR::calculate_nonadhesive_mdr_force(double delta, double Ainv, double Eeff, double A, double B) { double F_na = acos(1.0 - 2.0 * delta * Ainv); - F_na -= (2 - 4 * delta * Ainv) * sqrt(delta * Ainv - pow(delta * Ainv, 2)); + F_na -= (2 - 4 * delta * Ainv) * sqrt(delta * Ainv - square(delta * Ainv)); F_na *= 0.25 * Eeff * A * B; return F_na; diff --git a/src/GRANULAR/gran_sub_mod_normal.h b/src/GRANULAR/gran_sub_mod_normal.h index db96227f13..9805bd81c0 100644 --- a/src/GRANULAR/gran_sub_mod_normal.h +++ b/src/GRANULAR/gran_sub_mod_normal.h @@ -143,11 +143,11 @@ namespace Granular_NS { void coeffs_to_local() override; void init() override; double calculate_forces() override; - double E, nu, Y, gamma, CoR, psi_b; // specified coeffs + double Y, gamma, psi_b; // specified coeffs protected: double G, kappa, Eeff; // derived coeffs - double Eeffsq, Eeffinv, Eeffsqinv; + double Eeffsq, Eeffinv, Eeffsqinv, Eeff2particle; double gammasq, gamma3, gamma4; int warn_flag; @@ -155,6 +155,7 @@ namespace Granular_NS { int index_Ro, index_Vgeo, index_Velas, index_Vcaps, index_eps_bar, index_dRnumerator; int index_dRdenominator, index_Acon0, index_Acon1, index_Atot, index_Atot_sum, index_ddelta_bar; int index_psi, index_sigmaxx, index_sigmayy, index_sigmazz, index_contacts, index_adhesive_length; + int index_dRavg; int fix_mdr_flag; char *id_fix; diff --git a/src/GRANULAR/granular_model.cpp b/src/GRANULAR/granular_model.cpp index e96debd59e..1a3a46b12e 100644 --- a/src/GRANULAR/granular_model.cpp +++ b/src/GRANULAR/granular_model.cpp @@ -250,12 +250,7 @@ void GranularModel::init() // Must have valid normal, damping, and tangential models if (normal_model->name == "none") error->all(FLERR, "Must specify normal granular model"); - if (normal_model->name == "mdr") { - if (damping_model->name != "none") - error->all(FLERR, "MDR require 'none' damping model. To damp, specify a coefficient of restitution < 1."); - } else { - if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); - } + if (damping_model->name == "none") error->all(FLERR, "Must specify damping granular model"); if (tangential_model->name == "none") error->all(FLERR, "Must specify tangential granular model"); // Twisting, rolling, and heat are optional diff --git a/src/KOKKOS/meam_dens_init_kokkos.h b/src/KOKKOS/meam_dens_init_kokkos.h index dd63be96bd..23985c7082 100644 --- a/src/KOKKOS/meam_dens_init_kokkos.h +++ b/src/KOKKOS/meam_dens_init_kokkos.h @@ -236,7 +236,6 @@ MEAMKokkos::meam_dens_init(int inum_half, int ntype, typename AT::t_ this->d_neighbors_half = d_neighbors_half; this->d_neighbors_full = d_neighbors_full; this->d_offset = d_offset; - this->nlocal = nlocal; if (need_dup) { dup_rho0 = Kokkos::Experimental::create_scatter_view(d_rho0); diff --git a/src/KOKKOS/meam_force_kokkos.h b/src/KOKKOS/meam_force_kokkos.h index 1875e22dcf..703bee23d7 100644 --- a/src/KOKKOS/meam_force_kokkos.h +++ b/src/KOKKOS/meam_force_kokkos.h @@ -17,7 +17,6 @@ void MEAMKokkos::meam_force( { EV_FLOAT ev; - this->eflag_either = eflag_either; this->eflag_global = eflag_global; this->eflag_atom = eflag_atom; this->vflag_global = vflag_global; diff --git a/src/KOKKOS/mliap_unified_couple_kokkos.pyx b/src/KOKKOS/mliap_unified_couple_kokkos.pyx index 1492962013..91dce645ac 100644 --- a/src/KOKKOS/mliap_unified_couple_kokkos.pyx +++ b/src/KOKKOS/mliap_unified_couple_kokkos.pyx @@ -498,7 +498,7 @@ cdef public object mliap_unified_connect_kokkos(char *fname, MLIAPDummyModel * m unified = LOADED_MODEL elif str_fname.endswith(".pt") or str_fname.endswith('.pth'): import torch - unified = torch.load(str_fname) + unified = torch.load(str_fname,weights_only=False) else: with open(str_fname, 'rb') as pfile: unified = pickle.load(pfile) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 399142dfaf..63e637c108 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -961,7 +961,7 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, std::enable_if_t<(NEIGHFLAG&P lastcall = fpair->lmp->update->ntimestep; vectorsize = GetMaxNeighs(list); if (vectorsize == 0) vectorsize = 1; - vectorsize = MathSpecial::powint(2,(int(log2(vectorsize) + 0.5))); // round to nearest power of 2 + vectorsize = MathSpecial::powint(2.0,(int(log2(double(vectorsize)) + 0.5))); // round to nearest power of 2 #if defined(KOKKOS_ENABLE_HIP) int max_vectorsize = 64; diff --git a/src/LATBOLTZ/fix_lb_fluid.cpp b/src/LATBOLTZ/fix_lb_fluid.cpp index 286b56cab5..d5161bba42 100644 --- a/src/LATBOLTZ/fix_lb_fluid.cpp +++ b/src/LATBOLTZ/fix_lb_fluid.cpp @@ -2344,7 +2344,7 @@ void FixLbFluid::SetupBuffers() MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &dump_file_handle_raw); MPI_File_set_size(dump_file_handle_raw, 0); - MPI_File_set_view(dump_file_handle_raw, 0, MPI_DOUBLE, dump_file_mpitype, "native", + MPI_File_set_view(dump_file_handle_raw, 0, MPI_DOUBLE, dump_file_mpitype, (char *)"native", MPI_INFO_NULL); } } diff --git a/src/MANYBODY/pair_eam.cpp b/src/MANYBODY/pair_eam.cpp index b5a0ca0f77..fcef67b985 100644 --- a/src/MANYBODY/pair_eam.cpp +++ b/src/MANYBODY/pair_eam.cpp @@ -39,6 +39,7 @@ PairEAM::PairEAM(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; manybody_flag = 1; + atomic_energy_enable = 1; embedstep = -1; unit_convert_flag = utils::get_supported_conversions(utils::ENERGY); @@ -340,6 +341,70 @@ void PairEAM::compute(int eflag, int vflag) if (vflag_fdotr) virial_fdotr_compute(); } +/********************************************************************* + * Calculates the atomic energy of atom i + *********************************************************************/ +double PairEAM::compute_atomic_energy(int i, NeighList *neighborList) +{ + double p; + int m; + double* coeff; + double Ei = 0.0; + double rhoi = 0.0; + + double xi = atom->x[i][0]; + double yi = atom->x[i][1]; + double zi = atom->x[i][2]; + int itype = atom->type[i]; + + // loop over all neighbors of the selected atom. + + int* jlist = neighborList->firstneigh[i]; + int jnum = neighborList->numneigh[i]; + + for(int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + + double delx = xi - atom->x[j][0]; + double dely = yi - atom->x[j][1]; + double delz = zi - atom->x[j][2]; + double rsq = delx*delx + dely*dely + delz*delz; + if(rsq >= cutforcesq) continue; + + int jtype = atom->type[j]; + double r = sqrt(rsq); + + p = r * rdr + 1.0; + m = static_cast(p); + m = MIN(m, nr - 1); + p -= m; + p = MIN(p, 1.0); + + // sum pair energy ij + // divide by 2 to avoid double counting energy + + coeff = z2r_spline[type2z2r[jtype][itype]][m]; + double z2 = ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; + Ei += 0.5*z2 / r; + + // sum rho_ij to rho_i + coeff = rhor_spline[type2rhor[jtype][itype]][m]; + rhoi += ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; + } + + // compute the change in embedding energy of atom i. + + p = rhoi * rdrho + 1.0; + m = static_cast(p); + m = MAX(1, MIN(m, nrho - 1)); + p -= m; + p = MIN(p, 1.0); + coeff = frho_spline[type2frho[itype]][m]; + Ei += ((coeff[3]*p + coeff[4])*p + coeff[5])*p + coeff[6]; + + return Ei; +} + /* ---------------------------------------------------------------------- allocate all arrays ------------------------------------------------------------------------- */ diff --git a/src/MANYBODY/pair_eam.h b/src/MANYBODY/pair_eam.h index 24221a07ce..6a112a3221 100644 --- a/src/MANYBODY/pair_eam.h +++ b/src/MANYBODY/pair_eam.h @@ -47,6 +47,7 @@ class PairEAM : public Pair { PairEAM(class LAMMPS *); ~PairEAM() override; void compute(int, int) override; + double compute_atomic_energy(int, NeighList *) override; void settings(int, char **) override; void coeff(int, char **) override; void init_style() override; diff --git a/src/MANYBODY/pair_extep.cpp b/src/MANYBODY/pair_extep.cpp index 623dc510c4..1d8242127d 100644 --- a/src/MANYBODY/pair_extep.cpp +++ b/src/MANYBODY/pair_extep.cpp @@ -161,7 +161,6 @@ void PairExTeP::SR_neigh() } } } - //printf("SR_neigh : N[%d] = %f\n",i,N[i]); ipage->vgot(n); if (ipage->status()) diff --git a/src/MANYBODY/pair_gw.h b/src/MANYBODY/pair_gw.h index 15ddaa21a8..f098bfa082 100644 --- a/src/MANYBODY/pair_gw.h +++ b/src/MANYBODY/pair_gw.h @@ -94,8 +94,6 @@ class PairGW : public Pair { const double gw_d = param->d * param->d; const double hcth = param->h - costheta; - //printf("gw_gijk: gw_c=%f gw_d=%f hcth=%f=%f-%f\n", gw_c, gw_d, hcth, param->h, costheta); - return param->gamma * (1.0 + gw_c / gw_d - gw_c / (gw_d + hcth * hcth)); } diff --git a/src/MC/Install.sh b/src/MC/Install.sh index ccf6767c4d..efe6b7c07b 100755 --- a/src/MC/Install.sh +++ b/src/MC/Install.sh @@ -51,6 +51,8 @@ action fix_charge_regulation.cpp action fix_charge_regulation.h action fix_gcmc.cpp action fix_gcmc.h +action fix_neighbor_swap.cpp compute_voronoi_atom.cpp +action fix_neighbor_swap.h compute_voronoi_atom.h action fix_mol_swap.cpp action fix_mol_swap.h action fix_sgcmc.cpp pair_eam.cpp diff --git a/src/MC/fix_bond_break.cpp b/src/MC/fix_bond_break.cpp index 94ec5a89bb..f5b34ac356 100644 --- a/src/MC/fix_bond_break.cpp +++ b/src/MC/fix_bond_break.cpp @@ -439,11 +439,6 @@ void FixBondBreak::update_topology() ndihedrals = 0; nimpropers = 0; - //printf("NBREAK %d: ",nbreak); - //for (i = 0; i < nbreak; i++) - // printf(" %d %d,",broken[i][0],broken[i][1]); - //printf("\n"); - for (i = 0; i < nlocal; i++) { influenced = 0; slist = special[i]; diff --git a/src/MC/fix_neighbor_swap.cpp b/src/MC/fix_neighbor_swap.cpp new file mode 100644 index 0000000000..d44181a981 --- /dev/null +++ b/src/MC/fix_neighbor_swap.cpp @@ -0,0 +1,901 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 authors: Jacob Tavenner +------------------------------------------------------------------------- */ + +#include "fix_neighbor_swap.h" + +#include "angle.h" +#include "atom.h" +#include "bond.h" +#include "comm.h" +#include "compute.h" +#include "compute_voronoi_atom.h" +#include "dihedral.h" +#include "domain.h" +#include "error.h" +#include "fix.h" +#include "force.h" +#include "group.h" +#include "improper.h" +#include "kspace.h" +#include "math_special.h" +#include "memory.h" +#include "modify.h" +#include "neighbor.h" +#include "pair.h" +#include "random_park.h" +#include "region.h" +#include "update.h" + +#include +#include +#include +#include + +using namespace LAMMPS_NS; +using namespace FixConst; + +static const char cite_fix_neighbor_swap_c[] = + "fix neighbor/swap command: doi:10.1016/j.commatsci.2022.111929\n\n" + "@Article{Tavenner2023111929,\n" + " author = {Jacob P. Tavenner and Mikhail I. Mendelev and John W. Lawson},\n" + " title = {Molecular dynamics based kinetic Monte Carlo simulation for accelerated " + "diffusion},\n" + " journal = {Computational Materials Science},\n" + " year = {2023},\n" + " volume = {218},\n" + " pages = {111929}\n" + " url = {https://www.sciencedirect.com/science/article/pii/S0927025622006401}\n" + "}\n\n"; + +/* ---------------------------------------------------------------------- */ + +FixNeighborSwap::FixNeighborSwap(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), region(nullptr), idregion(nullptr), type_list(nullptr), qtype(nullptr), + c_voro(nullptr), voro_neighbor_list(nullptr), sqrt_mass_ratio(nullptr), + local_swap_iatom_list(nullptr), random_equal(nullptr), c_pe(nullptr) +{ + if (narg < 10) utils::missing_cmd_args(FLERR, "fix neighbor/swap", error); + + dynamic_group_allow = 1; + + vector_flag = 1; + size_vector = 2; + global_freq = 1; + extvector = 0; + restart_global = 1; + time_depend = 1; + + // required args + + nevery = utils::inumeric(FLERR, arg[3], false, lmp); + ncycles = utils::inumeric(FLERR, arg[4], false, lmp); + seed = utils::inumeric(FLERR, arg[5], false, lmp); + double temperature = utils::numeric(FLERR, arg[6], false, lmp); + r_0 = utils::inumeric(FLERR, arg[7], false, lmp); + + // Voro compute check + + int icompute = modify->find_compute(utils::strdup(arg[8])); + if (icompute < 0) error->all(FLERR, "Could not find neighbor compute ID"); + c_voro = modify->compute[icompute]; + if (c_voro->local_flag == 0) + error->all(FLERR, "Neighbor compute does not compute local info"); + if (c_voro->size_local_cols != 3) + error->all(FLERR, "Neighbor compute does not give i, j, size as expected"); + + if (nevery <= 0) error->all(FLERR, "Illegal fix neighbor/swap command nevery value"); + if (ncycles < 0) error->all(FLERR, "Illegal fix neighbor/swap command ncycles value"); + if (seed <= 0) error->all(FLERR, "Illegal fix neighbor/swap command seed value"); + if (temperature <= 0.0) error->all(FLERR, "Illegal fix neighbor/swap command temperature value"); + + beta = 1.0 / (force->boltz * temperature); + + memory->create(type_list, atom->ntypes, "neighbor/swap:type_list"); + memory->create(rate_list, atom->ntypes, "neighbor/swap:rate_list"); + + // read options from end of input line + + options(narg - 8, &arg[8]); + + // random number generator, same for all procs + + random_equal = new RanPark(lmp, seed); + + // set up reneighboring + + force_reneighbor = 1; + next_reneighbor = update->ntimestep + 1; + + // zero out counters + + nswap_attempts = 0.0; + nswap_successes = 0.0; + + atom_swap_nmax = 0; + voro_neighbor_list = nullptr; + local_swap_iatom_list = nullptr; + local_swap_neighbor_list = nullptr; + local_swap_probability = nullptr; + local_swap_type_list = nullptr; + + // set comm size needed by this Fix + + if (atom->q_flag) + comm_forward = 2; + else + comm_forward = 1; +} + +/* ---------------------------------------------------------------------- */ + +FixNeighborSwap::~FixNeighborSwap() +{ + memory->destroy(type_list); + memory->destroy(rate_list); + memory->destroy(qtype); + memory->destroy(sqrt_mass_ratio); + memory->destroy(local_swap_iatom_list); + memory->destroy(local_swap_neighbor_list); + memory->destroy(local_swap_probability); + memory->destroy(local_swap_type_list); + delete[] idregion; + delete random_equal; +} + +/* ---------------------------------------------------------------------- + parse optional parameters at end of input line +------------------------------------------------------------------------- */ + +void FixNeighborSwap::options(int narg, char **arg) +{ + if (narg < 0) error->all(FLERR, "Illegal fix neighbor/swap command\n"); + + ke_flag = 1; + diff_flag = 0; + rates_flag = 0; + nswaptypes = 0; + + int iarg = 0; + while (iarg < narg) { + if (strcmp(arg[iarg], "region") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + region = domain->get_region_by_id(arg[iarg + 1]); + if (!region) error->all(FLERR, "Region ID for fix neighbor/swap does not exist"); + idregion = utils::strdup(arg[iarg + 1]); + iarg += 2; + } else if (strcmp(arg[iarg], "ke") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + ke_flag = utils::logical(FLERR, arg[iarg + 1], false, lmp); + iarg += 2; + } else if (strcmp(arg[iarg], "types") == 0) { + if (iarg + 3 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + if (diff_flag != 0) error->all(FLERR, "Illegal fix neighbor/swap command"); + iarg++; + nswaptypes = 0; + while (iarg < narg) { + if (isalpha(arg[iarg][0])) break; + if (nswaptypes >= atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR, arg[iarg], false, lmp); + nswaptypes++; + iarg++; + } + } else if (strcmp(arg[iarg], "diff") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + if (nswaptypes != 0) error->all(FLERR, "Illegal fix neighbor/swap command"); + type_list[nswaptypes] = utils::numeric(FLERR, arg[iarg + 1], false, lmp); + diff_flag = 1; + nswaptypes++; + iarg += 2; + } else if (strcmp(arg[iarg], "rates") == 0) { + if (iarg + atom->ntypes >= narg) error->all(FLERR, "Illegal fix neighbor/swap command"); + iarg++; + int i = 0; + while (iarg < narg) { + if (isalpha(arg[iarg][0])) break; + if (i >= atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + rate_list[i] = utils::numeric(FLERR, arg[iarg], false, lmp); + i++; + iarg++; + } + rates_flag = 1; + if (i != atom->ntypes) error->all(FLERR, "Illegal fix neighbor/swap command"); + } else + error->all(FLERR, "Illegal fix neighbor/swap command"); + } +} + +/* ---------------------------------------------------------------------- */ + +int FixNeighborSwap::setmask() +{ + int mask = 0; + mask |= PRE_EXCHANGE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixNeighborSwap::init() +{ + c_pe = modify->get_compute_by_id("thermo_pe"); + + int *type = atom->type; + + if (nswaptypes < 2 && !diff_flag) + error->all(FLERR, "Must specify at least 2 types in fix neighbor/swap command"); + + // set index and check validity of region + + if (idregion) { + region = domain->get_region_by_id(idregion); + if (!region) error->all(FLERR, "Region {} for fix setforce does not exist", idregion); + } + + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) + if (type_list[iswaptype] <= 0 || type_list[iswaptype] > atom->ntypes) + error->all(FLERR, "Invalid atom type in fix neighbor/swap command"); + + if (atom->q_flag) { + double qmax, qmin; + int firstall, first; + memory->create(qtype, nswaptypes, "neighbor/swap:qtype"); + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) { + first = 1; + for (int i = 0; i < atom->nlocal; i++) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[iswaptype]) { + if (first) { + qtype[iswaptype] = atom->q[i]; + first = 0; + } else if (qtype[iswaptype] != atom->q[i]) + error->one(FLERR, "All atoms of a swapped type must have the same charge."); + } + } + } + MPI_Allreduce(&first, &firstall, 1, MPI_INT, MPI_MIN, world); + if (firstall) + error->all(FLERR, + "At least one atom of each swapped type must be present to define charges."); + if (first) qtype[iswaptype] = -DBL_MAX; + MPI_Allreduce(&qtype[iswaptype], &qmax, 1, MPI_DOUBLE, MPI_MAX, world); + if (first) qtype[iswaptype] = DBL_MAX; + MPI_Allreduce(&qtype[iswaptype], &qmin, 1, MPI_DOUBLE, MPI_MIN, world); + if (qmax != qmin) error->all(FLERR, "All atoms of a swapped type must have same charge."); + } + } + + memory->create(sqrt_mass_ratio, atom->ntypes + 1, atom->ntypes + 1, + "neighbor/swap:sqrt_mass_ratio"); + for (int itype = 1; itype <= atom->ntypes; itype++) + for (int jtype = 1; jtype <= atom->ntypes; jtype++) + sqrt_mass_ratio[itype][jtype] = sqrt(atom->mass[itype] / atom->mass[jtype]); + + // check to see if itype and jtype cutoffs are the same + // if not, reneighboring will be needed between swaps + + double **cutsq = force->pair->cutsq; + unequal_cutoffs = false; + for (int iswaptype = 0; iswaptype < nswaptypes; iswaptype++) + for (int jswaptype = 0; jswaptype < nswaptypes; jswaptype++) + for (int ktype = 1; ktype <= atom->ntypes; ktype++) + if (cutsq[type_list[iswaptype]][ktype] != cutsq[type_list[jswaptype]][ktype]) + unequal_cutoffs = true; + + // check that no swappable atoms are in atom->firstgroup + // swapping such an atom might not leave firstgroup atoms first + + if (atom->firstgroup >= 0) { + int *mask = atom->mask; + int firstgroupbit = group->bitmask[atom->firstgroup]; + + int flag = 0; + for (int i = 0; i < atom->nlocal; i++) + if ((mask[i] == groupbit) && (mask[i] && firstgroupbit)) flag = 1; + + int flagall; + MPI_Allreduce(&flag, &flagall, 1, MPI_INT, MPI_SUM, world); + + if (flagall) error->all(FLERR, "Cannot do neighbor/swap on atoms in atom_modify first group"); + } +} + +/* ---------------------------------------------------------------------- + attempt Monte Carlo swaps +------------------------------------------------------------------------- */ + +void FixNeighborSwap::pre_exchange() +{ + // just return if should not be called on this timestep + + if (next_reneighbor != update->ntimestep) return; + + // ensure current system is ready to compute energy + + if (domain->triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal + atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + + // energy_stored = energy of current state + // will be updated after accepted swaps + + energy_stored = energy_full(); + + // attempt Ncycle atom swaps + + int nsuccess = 0; + update_iswap_atoms_list(); + for (int i = 0; i < ncycles; i++) nsuccess += attempt_swap(); + + // udpate MC stats + + nswap_attempts += ncycles; + nswap_successes += nsuccess; + + next_reneighbor = update->ntimestep + nevery; +} + +/* ---------------------------------------------------------------------- + attempt a swap of a pair of atoms + compare before/after energy and accept/reject the swap +------------------------------------------------------------------------- */ + +int FixNeighborSwap::attempt_swap() +{ + // int nlocal = atom->nlocal; + tagint *id = atom->tag; + + if (niswap == 0) return 0; + + // pre-swap energy + + double energy_before = energy_stored; + + // pick a random atom i + + int i = pick_i_swap_atom(); + + // get global id and position of atom i + // get_global_i(i); + + // build nearest-neighbor list based on atom i + + build_i_neighbor_list(i); + if (njswap <= 0) return 0; + + // pick a neighbor atom j based on i neighbor list + jtype_selected = -1; + int j = pick_j_swap_neighbor(i); + + int itype = type_list[0]; + int jtype = jtype_selected; + + // Accept swap if types are equal, no change to system + if (itype == jtype) { return 1; } + + // swap their properties + if (i >= 0) { + atom->type[i] = jtype; + if (atom->q_flag) atom->q[i] = qtype[jtype_selected]; + } + if (j >= 0) { + atom->type[j] = itype; + if (atom->q_flag) atom->q[j] = qtype[0]; + } + + // if unequal_cutoffs, call comm->borders() and rebuild neighbor list + // else communicate ghost atoms + // call to comm->exchange() is a no-op but clears ghost atoms + + if (unequal_cutoffs) { + if (domain->triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + comm->exchange(); + comm->borders(); + if (domain->triclinic) domain->lamda2x(atom->nlocal + atom->nghost); + if (modify->n_pre_neighbor) modify->pre_neighbor(); + neighbor->build(1); + } else { + comm->forward_comm(this); + } + + // post-swap energy + + double energy_after = energy_full(); + + // if swap accepted, return 1 + // if ke_flag, rescale atom velocities + + if (random_equal->uniform() < exp(beta * (energy_before - energy_after))) { + update_iswap_atoms_list(); + if (ke_flag) { + if (i >= 0) { + atom->v[i][0] *= sqrt_mass_ratio[itype][jtype]; + atom->v[i][1] *= sqrt_mass_ratio[itype][jtype]; + atom->v[i][2] *= sqrt_mass_ratio[itype][jtype]; + } + if (j >= 0) { + atom->v[j][0] *= sqrt_mass_ratio[jtype][itype]; + atom->v[j][1] *= sqrt_mass_ratio[jtype][itype]; + atom->v[j][2] *= sqrt_mass_ratio[jtype][itype]; + } + } + energy_stored = energy_after; + return 1; + } + + // swap not accepted, return 0 + // restore the swapped itype & jtype atoms + // do not need to re-call comm->borders() and rebuild neighbor list + // since will be done on next cycle or in Verlet when this fix finishes + + if (i >= 0) { + atom->type[i] = itype; + if (atom->q_flag) atom->q[i] = qtype[0]; + } + if (j >= 0) { + atom->type[j] = jtype; + if (atom->q_flag) atom->q[j] = qtype[jtype_selected]; + } + + return 0; +} + +/* ---------------------------------------------------------------------- + compute system potential energy +------------------------------------------------------------------------- */ + +double FixNeighborSwap::energy_full() +{ + int eflag = 1; + int vflag = 0; + + if (modify->n_pre_force) modify->pre_force(vflag); + + if (force->pair) force->pair->compute(eflag, vflag); + + if (atom->molecular != Atom::ATOMIC) { + if (force->bond) force->bond->compute(eflag, vflag); + if (force->angle) force->angle->compute(eflag, vflag); + if (force->dihedral) force->dihedral->compute(eflag, vflag); + if (force->improper) force->improper->compute(eflag, vflag); + } + + if (force->kspace) force->kspace->compute(eflag, vflag); + + if (modify->n_post_force_any) modify->post_force(vflag); + + update->eflag_global = update->ntimestep; + double total_energy = c_pe->compute_scalar(); + + return total_energy; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +int FixNeighborSwap::pick_i_swap_atom() +{ + tagint *id = atom->tag; + int id_center_local = -1; + int i = -1; + + int iwhichglobal = static_cast(niswap * random_equal->uniform()); + if ((iwhichglobal >= niswap_before) && (iwhichglobal < niswap_before + niswap_local)) { + int iwhichlocal = iwhichglobal - niswap_before; + i = local_swap_iatom_list[iwhichlocal]; + id_center_local = id[i]; + MPI_Allreduce(&id[i], &id_center, 1, MPI_INT, MPI_MAX, world); + } else { + MPI_Allreduce(&id[i], &id_center, 1, MPI_INT, MPI_MAX, world); + } + + return i; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +int FixNeighborSwap::pick_j_swap_neighbor(int i) +{ + int j = -1; + int jtype_selected_local = -1; + + // Generate random double from 0 to maximum global probability + double selected_prob = static_cast(global_probability * random_equal->uniform()); + + // Find which local swap atom corresponds to probability + if ((selected_prob >= prev_probability) && + (selected_prob < prev_probability + local_probability)) { + double search_prob = selected_prob - prev_probability; + for (int n = 0; n < njswap_local; n++) { + if (search_prob > local_swap_probability[n]) { + search_prob -= local_swap_probability[n]; + } else { + j = local_swap_neighbor_list[n]; + jtype_selected_local = local_swap_type_list[n]; + MPI_Allreduce(&jtype_selected_local, &jtype_selected, 1, MPI_INT, MPI_MAX, world); + return j; + } + } + error->all(FLERR, "Did not select local neighbor swap atom"); + } + + MPI_Allreduce(&jtype_selected_local, &jtype_selected, 1, MPI_INT, MPI_MAX, world); + return j; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +double FixNeighborSwap::get_distance(double *i, double *j) +{ + double r = sqrt(MathSpecial::square((i[0] - j[0])) + MathSpecial::square((i[1] - j[1])) + + MathSpecial::square((i[2] - j[2]))); + return r; +} + +/* ---------------------------------------------------------------------- +------------------------------------------------------------------------- */ + +void FixNeighborSwap::build_i_neighbor_list(int i_center) +{ + int nghost = atom->nghost; + int nlocal = atom->nlocal; + int *type = atom->type; + double **x = atom->x; + tagint *id = atom->tag; + + // Allocate local_swap_neighbor_list size + + memory->sfree(local_swap_neighbor_list); + atom_swap_nmax = atom->nmax; + local_swap_neighbor_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_neighbor_list"); + + memory->sfree(local_swap_probability); + local_swap_probability = (double *) memory->smalloc(atom_swap_nmax * sizeof(double), + "MCSWAP:local_swap_probability_list"); + + memory->sfree(local_swap_type_list); + local_swap_type_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_type_list"); + + // Compute voronoi and access neighbor list + + c_voro->compute_local(); + + voro_neighbor_list = c_voro->array_local; + njswap_local = 0; + local_probability = 0.0; + + for (int n = 0; n < c_voro->size_local_rows; n++) { + + int temp_j_id = -1; + int temp_j = -1; + + // Find local voronoi entry with selected central atom + if ((int) voro_neighbor_list[n][0] == id_center) { + temp_j_id = voro_neighbor_list[n][1]; + temp_j = -1; + } else if (((int) voro_neighbor_list[n][1] == id_center) && (i_center < 0)) { + temp_j_id = voro_neighbor_list[n][0]; + temp_j = -1; + } else { + continue; + } + + // Find which local atom corresponds to neighbor + for (int j = 0; j < nlocal; j++) { + if (temp_j_id == id[j]) { + temp_j = j; + break; + } + } + + // If temp_j not on this processor, skip + if (temp_j < 0) continue; + + if (region) { + if (region->match(x[temp_j][0], x[temp_j][1], x[temp_j][2]) == 1) { + if (atom->mask[temp_j] & groupbit) { + if (diff_flag) { + // Calculate distance from i to each j, adjust probability of selection + + // Get distance if own center atom + double r = INFINITY; + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } + + // Get local id of ghost center atom when ghost + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); + } else { + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); + } + local_probability += local_swap_probability[njswap_local]; + local_swap_type_list[njswap_local] = type[temp_j]; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } else { + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++) { + if (type[temp_j] == type_list[jswaptype]) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } + + // Get local id of ghost center atom when ghost + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); + } else { + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = jswaptype; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } + } + } + } + } + } else { + if (atom->mask[temp_j] & groupbit) { + if (diff_flag) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if (i_center >= 0) { r = get_distance(x[temp_j], x[i_center]); } + + // Get local id of ghost center atoms + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) + r = get_distance(x[temp_j], x[i]); + } + + if (rates_flag) { + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); + } else { + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = type[temp_j]; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } else { + for (int jswaptype = 1; jswaptype < nswaptypes; jswaptype++) { + if (type[temp_j] == type_list[jswaptype]) { + // Calculate distance from i to each j, adjust probability of selection + // Get distance if own center atom + double r = INFINITY; + if (i_center >= 0) { double r = get_distance(x[temp_j], x[i_center]); } + + // Get local id of ghost center atom when ghost + for (int i = nlocal; i < nlocal + nghost; i++) { + if ((id[i] == id_center) && (get_distance(x[temp_j], x[i]) < r)) { + r = get_distance(x[temp_j], x[i]); + } + } + + if (rates_flag) { + local_swap_probability[njswap_local] = + rate_list[type[temp_j] - 1] * exp(-MathSpecial::square(r / r_0)); + } else { + local_swap_probability[njswap_local] = exp(-MathSpecial::square(r / r_0)); + } + local_probability += local_swap_probability[njswap_local]; + + local_swap_type_list[njswap_local] = jswaptype; + local_swap_neighbor_list[njswap_local] = temp_j; + njswap_local++; + } + } + } + } + } + } + + MPI_Allreduce(&njswap_local, &njswap, 1, MPI_INT, MPI_SUM, world); + MPI_Scan(&njswap_local, &njswap_before, 1, MPI_INT, MPI_SUM, world); + njswap_before -= njswap_local; + + MPI_Allreduce(&local_probability, &global_probability, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Scan(&local_probability, &prev_probability, 1, MPI_DOUBLE, MPI_SUM, world); + prev_probability -= local_probability; +} + +/* ---------------------------------------------------------------------- + update the list of swap atoms +------------------------------------------------------------------------- */ + +void FixNeighborSwap::update_iswap_atoms_list() +{ + int nlocal = atom->nlocal; + int *type = atom->type; + double **x = atom->x; + + if (atom->nmax > atom_swap_nmax) { + memory->sfree(local_swap_iatom_list); + atom_swap_nmax = atom->nmax; + local_swap_iatom_list = + (int *) memory->smalloc(atom_swap_nmax * sizeof(int), "MCSWAP:local_swap_iatom_list"); + } + + niswap_local = 0; + + if (region) { + + for (int i = 0; i < nlocal; i++) { + if (region->match(x[i][0], x[i][1], x[i][2]) == 1) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[0]) { + local_swap_iatom_list[niswap_local] = i; + niswap_local++; + } + } + } + } + + } else { + for (int i = 0; i < nlocal; i++) { + if (atom->mask[i] & groupbit) { + if (type[i] == type_list[0]) { + local_swap_iatom_list[niswap_local] = i; + niswap_local++; + } + } + } + } + + MPI_Allreduce(&niswap_local, &niswap, 1, MPI_INT, MPI_SUM, world); + MPI_Scan(&niswap_local, &niswap_before, 1, MPI_INT, MPI_SUM, world); + niswap_before -= niswap_local; +} + +/* ---------------------------------------------------------------------- */ + +int FixNeighborSwap::pack_forward_comm(int n, int *list, double *buf, int /*pbc_flag*/, + int * /*pbc*/) +{ + int i, j, m; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + + if (atom->q_flag) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + buf[m++] = q[j]; + } + } else { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = type[j]; + } + } + + return m; +} + +/* ---------------------------------------------------------------------- */ + +void FixNeighborSwap::unpack_forward_comm(int n, int first, double *buf) +{ + int i, m, last; + + int *type = atom->type; + double *q = atom->q; + + m = 0; + last = first + n; + + if (atom->q_flag) { + for (i = first; i < last; i++) { + type[i] = static_cast(buf[m++]); + q[i] = buf[m++]; + } + } else { + for (i = first; i < last; i++) type[i] = static_cast(buf[m++]); + } +} + +/* ---------------------------------------------------------------------- + return acceptance ratio +------------------------------------------------------------------------- */ + +double FixNeighborSwap::compute_vector(int n) +{ + if (n == 0) return nswap_attempts; + if (n == 1) return nswap_successes; + return 0.0; +} + +/* ---------------------------------------------------------------------- + memory usage of local atom-based arrays +------------------------------------------------------------------------- */ + +double FixNeighborSwap::memory_usage() +{ + double bytes = (double) atom_swap_nmax * sizeof(int); + return bytes; +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixNeighborSwap::write_restart(FILE *fp) +{ + int n = 0; + double list[6]; + list[n++] = random_equal->state(); + list[n++] = ubuf(next_reneighbor).d; + list[n++] = nswap_attempts; + list[n++] = nswap_successes; + list[n++] = ubuf(update->ntimestep).d; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size, sizeof(int), 1, fp); + fwrite(list, sizeof(double), n, fp); + } +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixNeighborSwap::restart(char *buf) +{ + int n = 0; + double *list = (double *) buf; + + seed = static_cast(list[n++]); + random_equal->reset(seed); + + next_reneighbor = (bigint) ubuf(list[n++]).i; + + nswap_attempts = static_cast(list[n++]); + nswap_successes = static_cast(list[n++]); + + bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; + if (ntimestep_restart != update->ntimestep) + error->all(FLERR, "Must not reset timestep when restarting fix neighbor/swap"); +} diff --git a/src/MC/fix_neighbor_swap.h b/src/MC/fix_neighbor_swap.h new file mode 100644 index 0000000000..821eda1bdc --- /dev/null +++ b/src/MC/fix_neighbor_swap.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + 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 FIX_CLASS +// clang-format off +FixStyle(neighbor/swap,FixNeighborSwap); +// clang-format on +#else + +#ifndef LMP_FIX_NEIGH_SWAP_H +#define LMP_FIX_NEIGH_SWAP_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixNeighborSwap : public Fix { + public: + FixNeighborSwap(class LAMMPS *, int, char **); + ~FixNeighborSwap(); + int setmask(); + void init(); + void pre_exchange(); + int pack_forward_comm(int, int *, double *, int, int *); + void unpack_forward_comm(int, int, double *); + double compute_vector(int); + double memory_usage(); + void write_restart(FILE *); + void restart(char *); + + private: + int nevery, seed; + int ke_flag; // yes = conserve ke, no = do not conserve ke + int diff_flag; // yes = simulate diffusion of central atom, no = swap only to certain types + int rates_flag; // yes = use modified type rates, no = swap rates are equivilent across types + int ncycles; + int niswap, njswap; // # of i,j swap atoms on all procs + int niswap_local, njswap_local; // # of swap atoms on this proc + int niswap_before, njswap_before; // # of swap atoms on procs < this proc + // int global_i_ID; // global id of selected i atom + class Region *region; // swap region + char *idregion; // swap region id + + int nswaptypes; + int jtype_selected; + int id_center; + double x_center; + double y_center; + double z_center; + int *type_list; + double *rate_list; + + double nswap_attempts; + double nswap_successes; + + bool unequal_cutoffs; + + int atom_swap_nmax; + double beta, r_0; + double local_probability; // Total swap probability stored on this proc + double global_probability; // Total swap probability across all proc + double prev_probability; // Swap probability on proc < this proc + double *qtype; + double energy_stored; + double **sqrt_mass_ratio; + double **voro_neighbor_list; + int *local_swap_iatom_list; + int *local_swap_neighbor_list; + int *local_swap_type_list; // Type list index of atoms stored on this proc + double *local_swap_probability; + + class RanPark *random_equal; + + class Compute *c_voro; + class Compute *c_pe; + + void options(int, char **); + int attempt_swap(); + double energy_full(); + int pick_i_swap_atom(); + int pick_j_swap_neighbor(int); + double get_distance(double[3], double[3]); + void build_i_neighbor_list(int); + void update_iswap_atoms_list(); +}; + +} // namespace LAMMPS_NS + +#endif +#endif diff --git a/src/MC/fix_sgcmc.cpp b/src/MC/fix_sgcmc.cpp index c405421b7f..c081d84f2d 100644 --- a/src/MC/fix_sgcmc.cpp +++ b/src/MC/fix_sgcmc.cpp @@ -124,6 +124,7 @@ FixSemiGrandCanonicalMC::FixSemiGrandCanonicalMC(LAMMPS *_lmp, int narg, char ** // Default values for optional parameters (where applicable). numSamplingWindowMoves = 8; seed = 324234; + atomicenergyflag = 0; // Parse extra/optional parameters while (iarg < narg) { @@ -175,7 +176,7 @@ FixSemiGrandCanonicalMC::FixSemiGrandCanonicalMC(LAMMPS *_lmp, int narg, char ** targetConcentration[i] = utils::numeric(FLERR, arg[iarg], false, lmp); targetConcentration[1] -= targetConcentration[i]; } - for (int i = 1; i <= atom->ntypes; i++, iarg++) { + for (int i = 1; i <= atom->ntypes; i++) { if ((targetConcentration[i] < 0.0) || (targetConcentration[i] > 1.0)) error->all(FLERR, "Target concentration {} for species {} is out of range", targetConcentration[i], i); @@ -183,7 +184,6 @@ FixSemiGrandCanonicalMC::FixSemiGrandCanonicalMC(LAMMPS *_lmp, int narg, char ** utils::logmesg(lmp, " SGC - Target concentration of species {}: {}\n", i, targetConcentration[i]); } - } else if (strcmp(arg[iarg], "serial") == 0) { // Switch off second rejection. serialMode = true; @@ -193,6 +193,12 @@ FixSemiGrandCanonicalMC::FixSemiGrandCanonicalMC(LAMMPS *_lmp, int narg, char ** if (comm->nprocs != 1) error->all(FLERR, "Cannot use serial mode Monte Carlo in a parallel simulation."); + + } else if (strcmp(arg[iarg],"atomic/energy") == 0) { + if (iarg+2 > narg) utils::missing_cmd_args(FLERR, fmt::format("fix {} atomic/energy", style), error); + atomicenergyflag = utils::logical(FLERR,arg[iarg+1],false,lmp); + iarg += 2; + } else { error->all(FLERR, "Unknown fix sgcmc keyword: {}", arg[iarg]); } @@ -243,25 +249,40 @@ void FixSemiGrandCanonicalMC::init() if (modify->get_fix_by_style("sgcmc").size() > 1) error->all(FLERR, "More than one fix sgcmc defined."); - // Save a pointer to the EAM potential. - pairEAM = dynamic_cast(force->pair); - if (!pairEAM) { - if (comm->me == 0) - utils::logmesg(lmp, " SGC - Using naive total energy calculation for MC -> SLOW!\n"); + if (atomicenergyflag) { + // Save a pointer to the EAM potential. + if (comm->me == 0) utils::logmesg(lmp, " SGC - Using atomic energy method for SGCMC\n"); + if (!force->pair->atomic_energy_enable) { + error->all(FLERR, "SGC - Pair style does not support atomic energy method"); + } + } else { + // Save a pointer to the EAM potential. + pairEAM = dynamic_cast(force->pair); + if (!pairEAM) { - if (comm->nprocs > 1) - error->all(FLERR, "Can not run fix sgcmc with naive total energy calculation " - "and more than one MPI process."); + if (comm->me == 0) + utils::logmesg(lmp, " SGC - Using naive total energy calculation for MC -> SLOW!\n"); - // Get reference to a compute that will provide the total energy of the system. - // This is needed by computeTotalEnergy(). - compute_pe = modify->get_compute_by_id("thermo_pe"); + if (comm->nprocs > 1) + error->all(FLERR, "Can not run fix sgcmc with naive total energy calculation " + "and more than one MPI process."); + + // Get reference to a compute that will provide the total energy of the system. + // This is needed by computeTotalEnergy(). + compute_pe = modify->get_compute_by_id("thermo_pe"); + } } + interactionRadius = force->pair->cutforce; if (comm->me == 0) utils::logmesg(lmp, " SGC - Interaction radius: {}\n", interactionRadius); + // This fix needs a full neighbor list. - neighbor->add_request(this, NeighConst::REQ_FULL); + if (atomicenergyflag) + // for atomic energy method, need ghost neighbors + neighbor->add_request(this, NeighConst::REQ_FULL | NeighConst::REQ_GHOST); + else + neighbor->add_request(this, NeighConst::REQ_FULL); // Count local number of atoms from each species. const int *type = atom->type; @@ -379,11 +400,18 @@ void FixSemiGrandCanonicalMC::doMC() deltaN[newSpecies] = +1; // Compute the energy difference that swapping this atom would cost or gain. - if (pairEAM) { - deltaE = computeEnergyChangeEAM(selectedAtom, selectedAtomNL, oldSpecies, newSpecies); + + // Atomic energy method: + if(atomicenergyflag) { + deltaE = computeEnergyChangeEatom(selectedAtom, oldSpecies, newSpecies); } else { - // Generic case: - deltaE = computeEnergyChangeGeneric(selectedAtom, oldSpecies, newSpecies); + // EAM method: + if (pairEAM) { + deltaE = computeEnergyChangeEAM(selectedAtom, selectedAtomNL, oldSpecies, newSpecies); + } else { + // Generic method + deltaE = computeEnergyChangeGeneric(selectedAtom, oldSpecies, newSpecies); + } } // Perform inner MC acceptance test. @@ -440,10 +468,14 @@ void FixSemiGrandCanonicalMC::doMC() // Make accepted atom swap permanent. if (selectedAtom >= 0) { - if (pairEAM) - flipAtomEAM(selectedAtom, selectedAtomNL, oldSpecies, newSpecies); - else - flipAtomGeneric(selectedAtom, oldSpecies, newSpecies); + if(atomicenergyflag) { + flipAtomEatom(selectedAtom, oldSpecies, newSpecies); + } else { + if (pairEAM) + flipAtomEAM(selectedAtom, selectedAtomNL, oldSpecies, newSpecies); + else + flipAtomGeneric(selectedAtom, oldSpecies, newSpecies); + } nAcceptedSwapsLocal++; } else { nRejectedSwapsLocal++; @@ -989,6 +1021,67 @@ void FixSemiGrandCanonicalMC::flipAtomGeneric(int flipAtom, int oldSpecies, int changedAtoms[flipAtom] = true; } +/********************************************************************* + * Calculates the change in energy that swapping the given + * atom would produce. This routine uses a per-atom energy calculation + *********************************************************************/ + +double FixSemiGrandCanonicalMC::computeEnergyChangeEatom(int flipAtom, int oldSpecies, int newSpecies) +{ + double Eold, Enew, deltaE; + + // Calculate old atomic energy of selected atom + + Eold = force->pair->compute_atomic_energy(flipAtom, neighborList); + + // calculate the old per-atom energy of neighbors + + int* jlist = neighborList->firstneigh[flipAtom]; + int jnum = neighborList->numneigh[flipAtom]; + + for(int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + Eold += force->pair->compute_atomic_energy(j, neighborList); + } + + // Calculate new per-atom energy of selected atom + + atom->type[flipAtom] = newSpecies; + + Enew = force->pair->compute_atomic_energy(flipAtom, neighborList); + + // calculate the new per-atom energy of neighbors + + for(int jj = 0; jj < jnum; jj++) { + int j = jlist[jj]; + Enew += force->pair->compute_atomic_energy(j, neighborList); + } + + atom->type[flipAtom] = oldSpecies; + + deltaE = Enew - Eold; + + return deltaE; +} + +/********************************************************************* + * Flips the type of one atom. + * This routine is for the per-atom energy case. + *********************************************************************/ + +void FixSemiGrandCanonicalMC::flipAtomEatom(int flipAtom, int oldSpecies, int newSpecies) +{ + atom->type[flipAtom] = newSpecies; + + // Rescale particle velocity vector to conserve kinetic energy. + double vScaleFactor = sqrt(atom->mass[oldSpecies] / atom->mass[newSpecies]); + atom->v[flipAtom][0] *= vScaleFactor; + atom->v[flipAtom][1] *= vScaleFactor; + atom->v[flipAtom][2] *= vScaleFactor; + + changedAtoms[flipAtom] = true; +} + /********************************************************************* * Lets the fix report one of its internal state variables to LAMMPS. *********************************************************************/ diff --git a/src/MC/fix_sgcmc.h b/src/MC/fix_sgcmc.h index 9ad3f65214..16ed23391f 100644 --- a/src/MC/fix_sgcmc.h +++ b/src/MC/fix_sgcmc.h @@ -75,6 +75,10 @@ class FixSemiGrandCanonicalMC : public Fix { // This routine should only be used for debugging purposes. double computeEnergyChangeGeneric(int flipAtom, int oldSpecies, int newSpecies); + // Calculates the change in energy that swapping the given atom would produce. + // This uses the atomic energy method + double computeEnergyChangeEatom(int flipAtom, int oldSpecies, int newSpecies); + // Lets LAMMPS calculate the total potential energy of the system. double computeTotalEnergy(); @@ -86,6 +90,10 @@ class FixSemiGrandCanonicalMC : public Fix { // This routine is for the generic case. void flipAtomGeneric(int flipAtom, int oldSpecies, int newSpecies); + // Flips the type of one atom. + // This routine is for the atomic energy method + void flipAtomEatom(int flipAtom, int oldSpecies, int newSpecies); + // Transfers the locally changed electron densities and atom types to the neighbors. void communicateRhoAndTypes(); @@ -181,6 +189,9 @@ class FixSemiGrandCanonicalMC : public Fix { // A compute used to compute the total potential energy of the system. class Compute *compute_pe; + + // Indicate whether or not atomic energy method is used + int atomicenergyflag; }; } // namespace LAMMPS_NS diff --git a/src/ML-IAP/mliap_unified_couple.pyx b/src/ML-IAP/mliap_unified_couple.pyx index 891ba8e28a..36c3eddda7 100644 --- a/src/ML-IAP/mliap_unified_couple.pyx +++ b/src/ML-IAP/mliap_unified_couple.pyx @@ -363,7 +363,7 @@ cdef public object mliap_unified_connect(char *fname, MLIAPDummyModel * model, unified = LOADED_MODEL elif str_fname.endswith(".pt") or str_fname.endswith('.pth'): import torch - unified = torch.load(str_fname) + unified = torch.load(str_fname,weights_only=False) else: with open(str_fname, 'rb') as pfile: unified = pickle.load(pfile) diff --git a/src/ML-PACE/pair_pace.cpp b/src/ML-PACE/pair_pace.cpp index 79d2f92455..c7b5414ef3 100644 --- a/src/ML-PACE/pair_pace.cpp +++ b/src/ML-PACE/pair_pace.cpp @@ -145,7 +145,7 @@ void PairPACE::compute(int eflag, int vflag) // ilist: list of "i" atoms for which neighbor lists exist ilist = list->ilist; - //numneigh: the length of each these neigbor list + //numneigh: the length of each these neighbor list numneigh = list->numneigh; // the pointer to the list of neighbors of "i" diff --git a/src/ML-PACE/pair_pace_extrapolation.cpp b/src/ML-PACE/pair_pace_extrapolation.cpp index 2946729905..5ac857d748 100644 --- a/src/ML-PACE/pair_pace_extrapolation.cpp +++ b/src/ML-PACE/pair_pace_extrapolation.cpp @@ -151,7 +151,7 @@ void PairPACEExtrapolation::compute(int eflag, int vflag) // ilist: list of "i" atoms for which neighbor lists exist ilist = list->ilist; - //numneigh: the length of each these neigbor list + //numneigh: the length of each these neighbor list numneigh = list->numneigh; // the pointer to the list of neighbors of "i" diff --git a/src/ML-POD/compute_podd_atom.cpp b/src/ML-POD/compute_podd_atom.cpp index 4ab6e23393..364bfb54ac 100644 --- a/src/ML-POD/compute_podd_atom.cpp +++ b/src/ML-POD/compute_podd_atom.cpp @@ -58,8 +58,8 @@ ComputePODDAtom::ComputePODDAtom(LAMMPS *lmp, int narg, char **arg) : pod = nullptr; elements = nullptr; - if (((((MAXBIGINT*3.0)*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) - error->all(FLERR, "Per-atom data too large"); + if ((((3.0*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) + error->all(FLERR, "Too many atoms ({}) for compute {}", atom->natoms, style); size_peratom_cols = 3 * atom->natoms * podptr->Mdesc * podptr->nClusters; peratom_flag = 1; } @@ -110,8 +110,8 @@ void ComputePODDAtom::compute_peratom() if (atom->natoms > nmax) { memory->destroy(pod); nmax = atom->natoms; - if (((((MAXBIGINT*3.0)*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) - error->all(FLERR, "Per-atom data too large"); + if ((((3.0*atom->natoms)*podptr->nClusters)*podptr->Mdesc) > (MAXSMALLINT*1.0)) + error->all(FLERR, "Too many atoms ({}) for compute {}", atom->natoms, style); int numdesc = 3 * atom->natoms * podptr->Mdesc * podptr->nClusters; memory->create(pod, nmax, numdesc,"podd/atom:pod"); array_atom = pod; diff --git a/src/OPENMP/pair_lj_pirani_omp.h b/src/OPENMP/pair_lj_pirani_omp.h index 7057562959..db19d0fbf6 100644 --- a/src/OPENMP/pair_lj_pirani_omp.h +++ b/src/OPENMP/pair_lj_pirani_omp.h @@ -17,7 +17,7 @@ #ifdef PAIR_CLASS // clang-format off -PairStyle(lj/pirani,PairLJPirani); +PairStyle(lj/pirani/omp,PairLJPiraniOMP); // clang-format on #else diff --git a/src/PERI/fix_peri_neigh.cpp b/src/PERI/fix_peri_neigh.cpp index 6adfc96f3f..1eba6006b8 100644 --- a/src/PERI/fix_peri_neigh.cpp +++ b/src/PERI/fix_peri_neigh.cpp @@ -279,7 +279,7 @@ void FixPeriNeigh::setup(int /*vflag*/) } } - // sanity check: does any atom appear twice in any neigborlist? + // sanity check: does any atom appear twice in any neighborlist? // should only be possible if using pbc and domain < 2*delta if (domain->xperiodic || domain->yperiodic || domain->zperiodic) { diff --git a/src/PHONON/third_order.cpp b/src/PHONON/third_order.cpp index e1d9161ef1..0facaecc9b 100644 --- a/src/PHONON/third_order.cpp +++ b/src/PHONON/third_order.cpp @@ -162,7 +162,7 @@ void ThirdOrder::command(int narg, char **arg) conversion = 1; folded = 0; - // set Neigborlist attributes to NULL + // set Neighborlist attributes to NULL ijnum = nullptr; neighbortags = nullptr; diff --git a/src/RHEO/compute_rheo_interface.cpp b/src/RHEO/compute_rheo_interface.cpp index 0cd6e46417..c2440100ae 100644 --- a/src/RHEO/compute_rheo_interface.cpp +++ b/src/RHEO/compute_rheo_interface.cpp @@ -344,31 +344,22 @@ void ComputeRHEOInterface::store_forces() // If forces are overwritten by a fix, there are no pressure forces // so just normalize auto fixlist = modify->get_fix_by_style("setforce"); - if (fixlist.size() != 0) { - for (const auto &fix : fixlist) { - for (int i = 0; i < atom->nlocal; i++) { - if (rmass) - minv = 1.0 / rmass[i]; - else - minv = 1.0 / mass[type[i]]; - if (mask[i] & fix->groupbit) - for (int a = 0; a < 3; a++) fp_store[i][a] = f[i][a] * minv; - else - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } - } else { - if (rmass) { - for (int i = 0; i < atom->nlocal; i++) { - minv = 1.0 / rmass[i]; - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } else { - for (int i = 0; i < atom->nlocal; i++) { - minv = 1.0 / mass[type[i]]; - for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; - } - } + int skip_from_setforce; + for (int i = 0; i < atom->nlocal; i++) { + if (rmass) + minv = 1.0 / rmass[i]; + else + minv = 1.0 / mass[type[i]]; + + skip_from_setforce = 0; + for (const auto &fix : fixlist) + if (mask[i] & fix->groupbit) + skip_from_setforce = 1; + + if (skip_from_setforce) + for (int a = 0; a < 3; a++) fp_store[i][a] = f[i][a] * minv; + else + for (int a = 0; a < 3; a++) fp_store[i][a] = (f[i][a] - fp_store[i][a]) * minv; } // Forward comm forces diff --git a/src/RHEO/fix_rheo_pressure.cpp b/src/RHEO/fix_rheo_pressure.cpp index 121473f7e3..6088c44348 100644 --- a/src/RHEO/fix_rheo_pressure.cpp +++ b/src/RHEO/fix_rheo_pressure.cpp @@ -191,14 +191,13 @@ void FixRHEOPressure::setup_pre_force(int /*vflag*/) void FixRHEOPressure::pre_force(int /*vflag*/) { int *mask = atom->mask; - int *type = atom->type; double *rho = atom->rho; double *pressure = atom->pressure; int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) pressure[i] = calc_pressure(rho[i], type[i]); + if (mask[i] & groupbit) pressure[i] = calc_pressure(rho[i], i); if (comm_forward) comm->forward_comm(this); } diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index b0c6d46ee4..95c274e8e3 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -1516,6 +1516,11 @@ void FixRigid::set_xv() MathExtra::omega_to_angmom(omega[ibody],exone,eyone,ezone, inertiaatom,angmom_one[i]); } + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::quatquat(quat[ibody],orient[i],quatatom); + MathExtra::qnormalize(quatatom); + } if (eflags[i] & DIPOLE) { MathExtra::quat_to_mat(quat[ibody],p); MathExtra::matvec(p,dorient[i],mu[i]); @@ -1713,7 +1718,7 @@ void FixRigid::setup_bodies_static() } // grow extended arrays and set extended flags for each particle - // orientflag = 4 if any particle stores ellipsoid or tri orientation + // orientflag = 4 if any particle stores ellipsoid or tri orientation or quat // orientflag = 1 if any particle stores line orientation // dorientflag = 1 if any particle stores dipole orientation @@ -1721,6 +1726,7 @@ void FixRigid::setup_bodies_static() if (atom->ellipsoid_flag) orientflag = 4; if (atom->line_flag) orientflag = 1; if (atom->tri_flag) orientflag = 4; + if (atom->quat_flag) orientflag = 4; if (atom->mu_flag) dorientflag = 1; grow_arrays(atom->nmax); @@ -2061,7 +2067,12 @@ void FixRigid::setup_bodies_static() ez_space[ibody],delta,displace[i]); if (extended) { - if (eflags[i] & ELLIPSOID) { + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::qconjugate(quat[ibody],qc); + MathExtra::quatquat(qc,quatatom,orient[i]); + MathExtra::qnormalize(orient[i]); + } else if (eflags[i] & ELLIPSOID) { quatatom = ebonus[ellipsoid[i]].quat; MathExtra::qconjugate(quat[ibody],qc); MathExtra::quatquat(qc,quatatom,orient[i]); diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 6ba2e5eb1c..d55b1fadd9 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -1409,6 +1409,11 @@ void FixRigidSmall::set_xv() MathExtra::omega_to_angmom(b->omega,exone,eyone,ezone, inertiaatom,angmom[i]); } + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::quatquat(b->quat,orient[i],quatatom); + MathExtra::qnormalize(quatatom); + } if (eflags[i] & DIPOLE) { MathExtra::quat_to_mat(b->quat,p); MathExtra::matvec(p,dorient[i],mu[i]); @@ -1849,7 +1854,7 @@ void FixRigidSmall::setup_bodies_static() } // grow extended arrays and set extended flags for each particle - // orientflag = 4 if any particle stores ellipsoid or tri orientation + // orientflag = 4 if any particle stores ellipsoid or tri orientation or quat // orientflag = 1 if any particle stores line orientation // dorientflag = 1 if any particle stores dipole orientation @@ -1857,6 +1862,7 @@ void FixRigidSmall::setup_bodies_static() if (atom->ellipsoid_flag) orientflag = 4; if (atom->line_flag) orientflag = 1; if (atom->tri_flag) orientflag = 4; + if (atom->quat_flag) orientflag = 4; if (atom->mu_flag) dorientflag = 1; grow_arrays(atom->nmax); @@ -2209,7 +2215,12 @@ void FixRigidSmall::setup_bodies_static() delta,displace[i]); if (extended) { - if (eflags[i] & ELLIPSOID) { + if (atom->quat_flag) { + quatatom = atom->quat[i]; + MathExtra::qconjugate(b->quat,qc); + MathExtra::quatquat(qc,quatatom,orient[i]); + MathExtra::qnormalize(orient[i]); + } else if (eflags[i] & ELLIPSOID) { quatatom = ebonus[ellipsoid[i]].quat; MathExtra::qconjugate(b->quat,qc); MathExtra::quatquat(qc,quatatom,orient[i]); diff --git a/src/atom.cpp b/src/atom.cpp index 0e0b1350ac..ac9ebb1634 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -2874,6 +2874,8 @@ void Atom::remove_custom(int index, int flag, int cols) } } +// TODO: complete list of exported properties. + /** Provide access to internal data of the Atom class by keyword * \verbatim embed:rst @@ -3035,7 +3037,6 @@ void *Atom::extract(const char *name) if (strcmp(name,"x") == 0) return (void *) x; if (strcmp(name,"v") == 0) return (void *) v; if (strcmp(name,"f") == 0) return (void *) f; - if (strcmp(name,"molecule") == 0) return (void *) molecule; if (strcmp(name,"q") == 0) return (void *) q; if (strcmp(name,"mu") == 0) return (void *) mu; if (strcmp(name,"omega") == 0) return (void *) omega; @@ -3051,6 +3052,33 @@ void *Atom::extract(const char *name) if (strcmp(name,"temperature") == 0) return (void *) temperature; if (strcmp(name,"heatflow") == 0) return (void *) heatflow; + // MOLECULE PACKAGE + + if (strcmp(name,"molecule") == 0) return (void *) molecule; + if (strcmp(name,"molindex") == 0) return (void *) molindex; + if (strcmp(name,"nspecial") == 0) return (void *) nspecial; + if (strcmp(name,"special") == 0) return (void *) special; + if (strcmp(name,"num_bond") == 0) return (void *) num_bond; + if (strcmp(name,"bond_type") == 0) return (void *) bond_type; + if (strcmp(name,"bond_atom") == 0) return (void *) bond_atom; + if (strcmp(name,"num_angle") == 0) return (void *) num_angle; + if (strcmp(name,"angle_type") == 0) return (void *) angle_type; + if (strcmp(name,"angle_atom1") == 0) return (void *) angle_atom1; + if (strcmp(name,"angle_atom2") == 0) return (void *) angle_atom2; + if (strcmp(name,"angle_atom3") == 0) return (void *) angle_atom3; + if (strcmp(name,"num_dihedral") == 0) return (void *) num_dihedral; + if (strcmp(name,"dihedral_type") == 0) return (void *) dihedral_type; + if (strcmp(name,"dihedral_atom1") == 0) return (void *) dihedral_atom1; + if (strcmp(name,"dihedral_atom2") == 0) return (void *) dihedral_atom2; + if (strcmp(name,"dihedral_atom3") == 0) return (void *) dihedral_atom3; + if (strcmp(name,"dihedral_atom4") == 0) return (void *) dihedral_atom4; + if (strcmp(name,"num_improper") == 0) return (void *) num_improper; + if (strcmp(name,"improper_type") == 0) return (void *) improper_type; + if (strcmp(name,"improper_atom1") == 0) return (void *) improper_atom1; + if (strcmp(name,"improper_atom2") == 0) return (void *) improper_atom2; + if (strcmp(name,"improper_atom3") == 0) return (void *) improper_atom3; + if (strcmp(name,"improper_atom4") == 0) return (void *) improper_atom4; + // PERI PACKAGE if (strcmp(name,"vfrac") == 0) return (void *) vfrac; @@ -3172,7 +3200,6 @@ int Atom::extract_datatype(const char *name) if (strcmp(name,"x") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"v") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"f") == 0) return LAMMPS_DOUBLE_2D; - if (strcmp(name,"molecule") == 0) return LAMMPS_TAGINT; if (strcmp(name,"q") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"mu") == 0) return LAMMPS_DOUBLE_2D; if (strcmp(name,"omega") == 0) return LAMMPS_DOUBLE_2D; @@ -3188,6 +3215,34 @@ int Atom::extract_datatype(const char *name) if (strcmp(name,"temperature") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"heatflow") == 0) return LAMMPS_DOUBLE; + // MOLECULE package + + if (strcmp(name,"molecule") == 0) return LAMMPS_TAGINT; + if (strcmp(name,"molindex") == 0) return LAMMPS_INT; + if (strcmp(name,"molatom") == 0) return LAMMPS_INT; + if (strcmp(name,"nspecial") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"special") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_bond") == 0) return LAMMPS_INT; + if (strcmp(name,"bond_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"bond_atom") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_angle") == 0) return LAMMPS_INT; + if (strcmp(name,"angle_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"angle_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"angle_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"angle_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_dihedral") == 0) return LAMMPS_INT; + if (strcmp(name,"dihedral_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"dihedral_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"dihedral_atom4") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"num_improper") == 0) return LAMMPS_INT; + if (strcmp(name,"improper_type") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"improper_atom1") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom2") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom3") == 0) return LAMMPS_TAGINT_2D; + if (strcmp(name,"improper_atom4") == 0) return LAMMPS_TAGINT_2D; + // PERI package (and in part MACHDYN) if (strcmp(name,"vfrac") == 0) return LAMMPS_DOUBLE; diff --git a/src/comm_brick.cpp b/src/comm_brick.cpp index 1e9bfe6aca..4720694759 100644 --- a/src/comm_brick.cpp +++ b/src/comm_brick.cpp @@ -209,8 +209,8 @@ void CommBrick::setup() double cut = get_comm_cutoff(); if ((cut == 0.0) && (me == 0)) - error->warning(FLERR,"Communication cutoff is 0.0. No ghost atoms " - "will be generated. Atoms may get lost."); + error->warning(FLERR,"Communication cutoff is 0.0. No ghost atoms will be generated. " + "Energies and forces may be wrong and atoms may get lost."); if (mode == Comm::MULTI) { double **cutcollectionsq = neighbor->cutcollectionsq; diff --git a/src/comm_tiled.cpp b/src/comm_tiled.cpp index bc4674a6b6..6a20728790 100644 --- a/src/comm_tiled.cpp +++ b/src/comm_tiled.cpp @@ -280,8 +280,8 @@ void CommTiled::setup() double cut = get_comm_cutoff(); if ((cut == 0.0) && (me == 0)) - error->warning(FLERR,"Communication cutoff is 0.0. No ghost atoms " - "will be generated. Atoms may get lost."); + error->warning(FLERR,"Communication cutoff is 0.0. No ghost atoms will be generated. " + "Energies and forces may be wrong and atoms may get lost."); if (triclinic == 0) cutghost[0] = cutghost[1] = cutghost[2] = cut; else { diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index e9632d254f..6354c67638 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -428,22 +428,19 @@ int ComputeBondLocal::compute_bonds(int flag) if (dstr) input->variable->internal_set(dvar, sqrt(rsq)); } - // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = tag[atom1] > tag[atom2] ? -1.0 : 1.0; - for (int n = 0; n < nvalues; n++) { switch (bstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; case DX: - ptr[n] = dx * directionCorrection; + ptr[n] = dx; break; case DY: - ptr[n] = dy * directionCorrection; + ptr[n] = dy; break; case DZ: - ptr[n] = dz * directionCorrection; + ptr[n] = dz; break; case ENGPOT: ptr[n] = engpot; diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index 57f15264f0..fa5d164844 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -277,22 +277,19 @@ int ComputePairLocal::compute_pairs(int flag) else ptr = alocal[m]; - // to make sure dx, dy and dz are always from the lower to the higher id - double directionCorrection = itag > jtag ? -1.0 : 1.0; - for (n = 0; n < nvalues; n++) { switch (pstyle[n]) { case DIST: ptr[n] = sqrt(rsq); break; case DX: - ptr[n] = delx * directionCorrection; + ptr[n] = delx; break; case DY: - ptr[n] = dely * directionCorrection; + ptr[n] = dely; break; case DZ: - ptr[n] = delz * directionCorrection; + ptr[n] = delz; break; case ENG: ptr[n] = eng; diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 60a55bbbb4..5f754b6d2b 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -170,6 +170,9 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { + if (comm->me == 0) + error->warning(FLERR, "The GJF formulation in fix {} is deprecated and will be removed soon. " + "\nPlease use fix gjf instead: https://docs.lammps.org/fix_gjf.html", style); FixLangevin::grow_arrays(atom->nmax); atom->add_callback(Atom::GROW); diff --git a/src/library.cpp b/src/library.cpp index 1e4243c59d..a8acbade52 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -1255,6 +1255,7 @@ be called without a valid LAMMPS object handle (it is ignored). * :ref:`Image masks ` * :ref:`System status ` * :ref:`System sizes ` +* :ref:`Neighbor list settings ` * :ref:`Atom style flags ` .. _extract_integer_sizes: @@ -1386,6 +1387,16 @@ internally by the :doc:`Fortran interface ` and are not likely to be us - number of dihedral types * - nimpropertypes - number of improper types + * - bond_per_atom + - size of per-atom bond data arrays + * - angle_per_atom + - size of per-atom angle data arrays + * - dihedral_per_atom + - size of per-atom dihedral data arrays + * - improper_per_atom + - size of per-atom improper data arrays + * - maxspecial + - size of per-atom special data array * - nellipsoids - number of atoms that have ellipsoid data * - nlines @@ -1395,6 +1406,31 @@ internally by the :doc:`Fortran interface ` and are not likely to be us * - nbodies - number of atoms that have body data (see :doc:`the Body particle HowTo `) +.. _extract_neighbor_settings: + +**Neighbor list settings** + +.. list-table:: + :header-rows: 1 + :widths: 17 83 + + * - neigh_every + - neighbor lists are rebuild every this many steps + * - neigh_delay + - neighbor lists are rebuild delayed this many steps + * - neigh_dist_check + - 0 if always rebuild, 1 rebuild after 1/2 skin + * - neigh_ago + - neighbor lists were rebuilt this many steps ago + * - nbondlist + - number of entries in bondlist (get list with :ref:`lammps_extract_global() `) + * - nanglelist + - number of entries in anglelist (get list with :ref:`lammps_extract_global() `) + * - ndihedrallist + - number of entries in dihedrallist (get list with :ref:`lammps_extract_global() `) + * - nimproperlist + - number of entries in improperlist (get list with :ref:`lammps_extract_global() `) + .. _extract_atom_flags: **Atom style flags** @@ -1479,11 +1515,25 @@ int lammps_extract_setting(void *handle, const char *keyword) if (strcmp(keyword,"nangletypes") == 0) return lmp->atom->nangletypes; if (strcmp(keyword,"ndihedraltypes") == 0) return lmp->atom->ndihedraltypes; if (strcmp(keyword,"nimpropertypes") == 0) return lmp->atom->nimpropertypes; + if (strcmp(keyword,"bond_per_atom") == 0) return lmp->atom->bond_per_atom; + if (strcmp(keyword,"angle_per_atom") == 0) return lmp->atom->angle_per_atom; + if (strcmp(keyword,"dihedral_per_atom") == 0) return lmp->atom->dihedral_per_atom; + if (strcmp(keyword,"improper_per_atom") == 0) return lmp->atom->improper_per_atom; + if (strcmp(keyword,"maxspecial") == 0) return lmp->atom->maxspecial; if (strcmp(keyword,"nellipsoids") == 0) return lmp->atom->nellipsoids; if (strcmp(keyword,"nlines") == 0) return lmp->atom->nlines; if (strcmp(keyword,"ntris") == 0) return lmp->atom->ntris; if (strcmp(keyword,"nbodies") == 0) return lmp->atom->nbodies; + if (strcmp(keyword,"neigh_every") == 0) return lmp->neighbor->every; + if (strcmp(keyword,"neigh_delay") == 0) return lmp->neighbor->delay; + if (strcmp(keyword,"neigh_dist_check") == 0) return lmp->neighbor->dist_check; + if (strcmp(keyword,"neigh_ago") == 0) return lmp->neighbor->ago; + if (strcmp(keyword,"nbondlist") == 0) return lmp->neighbor->nbondlist; + if (strcmp(keyword,"nanglelist") == 0) return lmp->neighbor->nanglelist; + if (strcmp(keyword,"ndihedrallist") == 0) return lmp->neighbor->ndihedrallist; + if (strcmp(keyword,"nimproperlist") == 0) return lmp->neighbor->nimproperlist; + if (strcmp(keyword,"molecule_flag") == 0) return lmp->atom->molecule_flag; if (strcmp(keyword,"q_flag") == 0) return lmp->atom->q_flag; if (strcmp(keyword,"mu_flag") == 0) return lmp->atom->mu_flag; @@ -1567,6 +1617,16 @@ int lammps_extract_global_datatype(void * /*handle*/, const char *name) if (strcmp(name,"special_lj") == 0) return LAMMPS_DOUBLE; if (strcmp(name,"special_coul") == 0) return LAMMPS_DOUBLE; + if (strcmp(name,"neigh_bondlist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_anglelist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_dihedrallist") == 0) return LAMMPS_INT_2D; + if (strcmp(name,"neigh_improperlist") == 0) return LAMMPS_INT_2D; + + if (strcmp(name,"eflag_global") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"eflag_atom") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"vflag_global") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"vflag_atom") == 0) return LAMMPS_BIGINT; + if (strcmp(name,"map_style") == 0) return LAMMPS_INT; #if defined(LAMMPS_BIGBIG) if (strcmp(name,"map_tag_max") == 0) return LAMMPS_BIGINT; @@ -1651,6 +1711,8 @@ report the "native" data type. The following tables are provided: * :ref:`Timestep settings ` * :ref:`Simulation box settings ` * :ref:`System property settings ` +* :ref:`Neighbor topology data ` +* :ref:`Energy and virial tally settings ` * :ref:`Git revision and version settings ` * :ref:`Unit settings ` @@ -1800,10 +1862,10 @@ report the "native" data type. The following tables are provided: - Type - Length - Description - * - ntypes - - int + * - natoms + - bigint - 1 - - number of atom types + - total number of atoms in the simulation. * - nbonds - bigint - 1 @@ -1820,10 +1882,6 @@ report the "native" data type. The following tables are provided: - bigint - 1 - total number of impropers in the simulation. - * - natoms - - bigint - - 1 - - total number of atoms in the simulation. * - nlocal - int - 1 @@ -1836,6 +1894,10 @@ report the "native" data type. The following tables are provided: - int - 1 - maximum of nlocal+nghost across all MPI ranks (for per-atom data array size). + * - ntypes + - int + - 1 + - number of atom types * - special_lj - double - 4 @@ -1897,6 +1959,66 @@ report the "native" data type. The following tables are provided: - 1 - string with the current KSpace style. +.. _extract_neighbor_lists: + +**Neighbor topology data** + +Get length of lists with :ref:`lammps_extract_setting() `. + +.. list-table:: + :header-rows: 1 + :widths: 20 12 16 52 + + * - Name + - Type + - Length + - Description + * - neigh_bondlist + - 2d int + - nbondlist + - list of bonds (atom1, atom2, type) + * - neigh_anglelist + - 2d int + - nanglelist + - list of angles (atom1, atom2, atom3, type) + * - neigh_dihedrallist + - 2d int + - ndihedrallist + - list of dihedrals (atom1, atom2, atom3, atom4, type) + * - neigh_improperlist + - 2d int + - nimproperlist + - list of impropers (atom1, atom2, atom3, atom4, type) + +.. _extract_tally_settings: + +**Energy and virial tally settings** + +.. list-table:: + :header-rows: 1 + :widths: 20 12 16 52 + + * - Name + - Type + - Length + - Description + * - eflag_global + - bigint + - 1 + - timestep global energy is tallied on + * - eflag_atom + - bigint + - 1 + - timestep per-atom energy is tallied on + * - vflag_global + - bigint + - 1 + - timestep global virial is tallied on + * - vflag_atom + - bigint + - 1 + - timestep per-atom virial is tallied on + .. _extract_git_settings: **Git revision and version settings** @@ -2094,7 +2216,6 @@ void *lammps_extract_global(void *handle, const char *name) return (void *) &lmp->comm->procgrid; if (strcmp(name,"natoms") == 0) return (void *) &lmp->atom->natoms; - if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"nbonds") == 0) return (void *) &lmp->atom->nbonds; if (strcmp(name,"nangles") == 0) return (void *) &lmp->atom->nangles; if (strcmp(name,"ndihedrals") == 0) return (void *) &lmp->atom->ndihedrals; @@ -2102,11 +2223,22 @@ void *lammps_extract_global(void *handle, const char *name) if (strcmp(name,"nlocal") == 0) return (void *) &lmp->atom->nlocal; if (strcmp(name,"nghost") == 0) return (void *) &lmp->atom->nghost; if (strcmp(name,"nmax") == 0) return (void *) &lmp->atom->nmax; + if (strcmp(name,"ntypes") == 0) return (void *) &lmp->atom->ntypes; if (strcmp(name,"special_lj") == 0) return (void *) lmp->force->special_lj; if (strcmp(name,"special_coul") == 0) return (void *) lmp->force->special_coul; if (strcmp(name,"q_flag") == 0) return (void *) &lmp->atom->q_flag; + if (strcmp(name,"neigh_bondlist") == 0) return (void *) lmp->neighbor->bondlist; + if (strcmp(name,"neigh_anglelist") == 0) return (void *) lmp->neighbor->anglelist; + if (strcmp(name,"neigh_dihedrallist") == 0) return (void *) lmp->neighbor->dihedrallist; + if (strcmp(name,"neigh_improperlist") == 0) return (void *) lmp->neighbor->improperlist; + + if (strcmp(name,"eflag_global") == 0) return (void *) &lmp->update->eflag_global; + if (strcmp(name,"eflag_atom") == 0) return (void *) &lmp->update->eflag_atom; + if (strcmp(name,"vflag_global") == 0) return (void *) &lmp->update->vflag_global; + if (strcmp(name,"vflag_atom") == 0) return (void *) &lmp->update->vflag_atom; + if (strcmp(name,"map_style") == 0) return (void *) &lmp->atom->map_style; if (strcmp(name,"map_tag_max") == 0) return (void *) &lmp->atom->map_tag_max; if (strcmp(name,"sametag") == 0) return (void *) lmp->atom->sametag; diff --git a/src/neighbor.cpp b/src/neighbor.cpp index a2aa3f411b..fcedfd7613 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -188,8 +188,8 @@ pairclass(nullptr), pairnames(nullptr), pairmasks(nullptr) // topology lists + nbondlist = nanglelist = ndihedrallist = nimproperlist = 0; bondwhich = anglewhich = dihedralwhich = improperwhich = NONE; - neigh_bond = nullptr; neigh_angle = nullptr; neigh_dihedral = nullptr; diff --git a/src/pair.cpp b/src/pair.cpp index 896957c087..78b2e13ee3 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -90,6 +90,8 @@ Pair::Pair(LAMMPS *lmp) : reinitflag = 1; centroidstressflag = CENTROID_SAME; + atomic_energy_enable = 0; + // pair_modify settings compute_flag = 1; diff --git a/src/pair.h b/src/pair.h index 461d0c121b..1a4cc1cbf3 100644 --- a/src/pair.h +++ b/src/pair.h @@ -54,6 +54,8 @@ class Pair : protected Pointers { int single_enable; // 1 if single() routine exists int born_matrix_enable; // 1 if born_matrix() routine exists int single_hessian_enable; // 1 if single_hessian() routine exists + int atomic_energy_enable; // 1 if compute_atomic_energy() routine exists + int restartinfo; // 1 if pair style writes restart info int respa_enable; // 1 if inner/middle/outer rRESPA routines int one_coeff; // 1 if allows only one coeff * * call @@ -156,6 +158,7 @@ class Pair : protected Pointers { virtual void compute_inner() {} virtual void compute_middle() {} virtual void compute_outer(int, int) {} + virtual double compute_atomic_energy(int, NeighList *) { return 0.0; } virtual double single(int, int, int, int, double, double, double, double &fforce) { diff --git a/src/potential_file_reader.cpp b/src/potential_file_reader.cpp index 2a93a4a524..7bac388ba0 100644 --- a/src/potential_file_reader.cpp +++ b/src/potential_file_reader.cpp @@ -86,11 +86,21 @@ PotentialFileReader::~PotentialFileReader() /** Set comment (= text after '#') handling preference for the file to be read * * \param value Comment text is ignored if true, or not if false */ + void PotentialFileReader::ignore_comments(bool value) { reader->ignore_comments = value; } +/** Set line buffer size of the internal TextFileReader class instance. + * + * \param bufsize New size of the line buffer */ + +void PotentialFileReader::set_bufsize(int bufsize) +{ + reader->set_bufsize(bufsize); +} + /** Reset file to the beginning */ void PotentialFileReader::rewind() diff --git a/src/potential_file_reader.h b/src/potential_file_reader.h index c07b4b83f6..534457a2f8 100644 --- a/src/potential_file_reader.h +++ b/src/potential_file_reader.h @@ -41,6 +41,7 @@ class PotentialFileReader : protected Pointers { const int auto_convert = 0); ~PotentialFileReader() override; + void set_bufsize(int bufsize); void ignore_comments(bool value); void rewind(); diff --git a/src/read_data.cpp b/src/read_data.cpp index 79d88148c5..cf7b224db2 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -174,13 +174,13 @@ void ReadData::command(int narg, char **arg) addflag = VALUE; bigint offset = utils::bnumeric(FLERR, arg[iarg + 1], false, lmp); if (offset > MAXTAGINT) - error->all(FLERR, "Read data add atomID offset {} is too big", offset); + error->all(FLERR, "Read data add IDoffset {} is too big", offset); id_offset = offset; if (atom->molecule_flag) { offset = utils::bnumeric(FLERR, arg[iarg + 2], false, lmp); if (offset > MAXTAGINT) - error->all(FLERR, "Read data add molID offset {} is too big", offset); + error->all(FLERR, "Read data add MOLoffset {} is too big", offset); mol_offset = offset; iarg++; } diff --git a/src/reset_atoms_mol.cpp b/src/reset_atoms_mol.cpp index 54d3bbcc76..363e2f08eb 100644 --- a/src/reset_atoms_mol.cpp +++ b/src/reset_atoms_mol.cpp @@ -211,7 +211,7 @@ void ResetAtomsMol::reset() // if offset < 0 (default), reset it // if group = all, offset = 0 - // else offset = largest molID of non-group atoms + // else offset = largest molecule ID of non-group atoms if (offset < 0) { if (groupbit != 1) { diff --git a/src/text_file_reader.cpp b/src/text_file_reader.cpp index 715e82ab32..d598c274f0 100644 --- a/src/text_file_reader.cpp +++ b/src/text_file_reader.cpp @@ -93,7 +93,9 @@ TextFileReader::~TextFileReader() delete[] line; } -/** adjust line buffer size */ +/** adjust line buffer size + * + * \param newsize New size of the internal line buffer */ void TextFileReader::set_bufsize(int newsize) { diff --git a/tools/coding_standard/README b/tools/coding_standard/README index b19d7241f4..da4552e081 100644 --- a/tools/coding_standard/README +++ b/tools/coding_standard/README @@ -6,3 +6,8 @@ whitespace.py detects TAB characters and trailing whitespace homepage.py detects outdated LAMMPS homepage URLs (pointing to sandia.gov instead of lammps.org) errordocs.py detects deprecated error docs in header files versiontags.py detects .. versionadded:: and .. versionchanged:: with pending version date + +Example usage: python3 versiontags.py + +where is the path of a LAMMPS directory containing subdirs src/, python/, doc/src/, etc. + diff --git a/tools/lammps-gui/flagwarnings.cpp b/tools/lammps-gui/flagwarnings.cpp index e91547288f..deeb9f8306 100644 --- a/tools/lammps-gui/flagwarnings.cpp +++ b/tools/lammps-gui/flagwarnings.cpp @@ -23,18 +23,22 @@ // workaround for Qt-5.12 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) namespace QColorConstants { -const QColor Red = QColor::fromRgb(0xff, 0x00, 0x00); +const QColor Red = QColor::fromRgb(0xff, 0x00, 0x00); +const QColor Blue = QColor::fromRgb(0x00, 0x00, 0xff); } // namespace QColorConstants #endif FlagWarnings::FlagWarnings(QLabel *label, QTextDocument *parent) : - QSyntaxHighlighter(parent), isWarning(QStringLiteral("^(ERROR|WARNING).*$")), summary(label), + QSyntaxHighlighter(parent), isWarning(QStringLiteral("^(ERROR|WARNING).*$")), + isURL(QStringLiteral("^.*(https://docs.lammps.org/err[0-9]+).*$")), summary(label), document(parent) { nwarnings = nlines = 0; formatWarning.setForeground(QColorConstants::Red); formatWarning.setFontWeight(QFont::Bold); + formatURL.setForeground(QColorConstants::Blue); + formatURL.setFontWeight(QFont::Bold); } void FlagWarnings::highlightBlock(const QString &text) @@ -42,11 +46,20 @@ void FlagWarnings::highlightBlock(const QString &text) // nothing to do for empty lines if (text.isEmpty()) return; + // highlight errors or warnings auto match = isWarning.match(text); if (match.hasMatch()) { ++nwarnings; setFormat(match.capturedStart(0), match.capturedLength(0), formatWarning); } + + // highlight ErrorURL links + match = isURL.match(text); + if (match.hasMatch()) { + setFormat(match.capturedStart(1), match.capturedLength(1), formatURL); + } + + // update error summary label if (document && summary) { summary->setText( QString("%1 Warnings / Errors - %2 Lines").arg(nwarnings).arg(document->lineCount())); diff --git a/tools/lammps-gui/flagwarnings.h b/tools/lammps-gui/flagwarnings.h index ad82942d62..b73224223b 100644 --- a/tools/lammps-gui/flagwarnings.h +++ b/tools/lammps-gui/flagwarnings.h @@ -33,7 +33,9 @@ protected: private: QRegularExpression isWarning; + QRegularExpression isURL; QTextCharFormat formatWarning; + QTextCharFormat formatURL; QLabel *summary; QTextDocument *document; int nwarnings, nlines; diff --git a/tools/lammps-gui/help_index.table b/tools/lammps-gui/help_index.table index a17b24fef5..d859fac2a6 100644 --- a/tools/lammps-gui/help_index.table +++ b/tools/lammps-gui/help_index.table @@ -42,6 +42,7 @@ angle_lepton.html angle_style lepton angle_lepton.html angle_style lepton/omp angle_mesocnt.html angle_style mesocnt angle_mm3.html angle_style mm3 +angle_mwlc.html angle_style mwlc angle_none.html angle_style none angle_quartic.html angle_style quartic angle_quartic.html angle_style quartic/omp @@ -129,6 +130,7 @@ atom_modify.html atom_modify atom_style.html atom_style balance.html balance bond_bpm_rotational.html bond_style bpm/rotational +bond_bpm_spring_plastic.html bond_style bpm/spring/plastic bond_bpm_spring.html bond_style bpm/spring bond_class2.html bond_style class2 bond_class2.html bond_style class2/kk @@ -233,6 +235,8 @@ compute_event_displace.html compute event/displace compute_fabric.html compute fabric compute_fep.html compute fep compute_fep_ta.html compute fep/ta +compute_gaussian_grid_local.html compute gaussian/grid/local +compute_gaussian_grid_local.html compute gaussian/grid/local/kk compute_global_atom.html compute global/atom compute_group_group.html compute group/group compute_gyration_chunk.html compute gyration/chunk @@ -315,7 +319,9 @@ compute_smd_vol.html compute smd/vol compute_sna_atom.html compute sna/atom compute_sna_atom.html compute snad/atom compute_sna_atom.html compute sna/grid +compute_sna_atom.html compute sna/grid/kk compute_sna_atom.html compute sna/grid/local +compute_sna_atom.html compute sna/grid/local/kk compute_sna_atom.html compute snap compute_sna_atom.html compute snav/atom compute_sph_e_atom.html compute sph/e/atom @@ -358,6 +364,7 @@ compute_temp_sphere.html compute temp/sphere compute_temp_uef.html compute temp/uef compute_ti.html compute ti compute_torque_chunk.html compute torque/chunk +compute_vacf_chunk.html compute vacf/chunk compute_vacf.html compute vacf compute_vcm_chunk.html compute vcm/chunk compute_viscosity_cos.html compute viscosity/cos @@ -396,6 +403,7 @@ dihedral_hybrid.html dihedral_style hybrid/kk dihedral_lepton.html dihedral_style lepton dihedral_lepton.html dihedral_style lepton/omp dihedral_multi_harmonic.html dihedral_style multi/harmonic +dihedral_multi_harmonic.html dihedral_style multi/harmonic/kk dihedral_multi_harmonic.html dihedral_style multi/harmonic/omp dihedral_nharmonic.html dihedral_style nharmonic dihedral_nharmonic.html dihedral_style nharmonic/omp @@ -436,6 +444,7 @@ dump.html dump custom dump.html dump custom/gz dump.html dump custom/zstd dump.html dump dcd +dump.html dump extxyz dump.html dump grid dump.html dump grid/vtk dump.html dump local @@ -487,7 +496,9 @@ fix_brownian.html fix brownian/asphere fix_brownian.html fix brownian/sphere fix_charge_regulation.html fix charge/regulation fix_cmap.html fix cmap +fix_cmap.html fix cmap/kk fix_colvars.html fix colvars +fix_colvars.html fix colvars/kk fix_controller.html fix controller fix_damping_cundall.html fix damping/cundall fix_deform_pressure.html fix deform/pressure @@ -504,6 +515,7 @@ fix_drude_transform.html fix drude/transform/direct fix_drude_transform.html fix drude/transform/inverse fix_dt_reset.html fix dt/reset fix_dt_reset.html fix dt/reset/kk +fix_efield_lepton.html fix efield/lepton fix_efield.html fix efield fix_efield.html fix efield/kk fix_efield.html fix efield/tip4p @@ -614,6 +626,7 @@ fix_nve_dotc_langevin.html fix nve/dotc/langevin fix_nve_dot.html fix nve/dot fix_nve_eff.html fix nve/eff fix_nve_limit.html fix nve/limit +fix_nve_limit.html fix nve/limit/kk fix_nve_line.html fix nve/line fix_nve_manifold_rattle.html fix nve/manifold/rattle fix_nve_noforce.html fix nve/noforce @@ -647,7 +660,9 @@ fix_pafi.html fix pafi fix_pair.html fix pair fix_phonon.html fix phonon fix_pimd.html fix pimd/langevin +fix_pimd.html fix pimd/langevin/bosonic fix_pimd.html fix pimd/nvt +fix_pimd.html fix pimd/nvt/bosonic fix_planeforce.html fix planeforce fix_plumed.html fix plumed fix_poems.html fix poems @@ -670,6 +685,8 @@ fix_qeq_comb.html fix qeq/comb/omp fix_qeq_reaxff.html fix qeq/reaxff fix_qeq_reaxff.html fix qeq/reaxff/kk fix_qeq_reaxff.html fix qeq/reaxff/omp +fix_qeq_rel_reaxff.html fix qeq/rel/reaxff +fix_qeq.html fix qeq/ctip fix_qeq.html fix qeq/dynamic fix_qeq.html fix qeq/fire fix_qeq.html fix qeq/point @@ -677,11 +694,13 @@ fix_qeq.html fix qeq/shielded fix_qeq.html fix qeq/slater fix_qmmm.html fix qmmm fix_qtb.html fix qtb +fix_qtpie_reaxff.html fix qtpie/reaxff fix_reaxff_bonds.html fix reaxff/bonds fix_reaxff_bonds.html fix reaxff/bonds/kk fix_reaxff_species.html fix reaxff/species fix_reaxff_species.html fix reaxff/species/kk fix_recenter.html fix recenter +fix_recenter.html fix recenter/kk fix_restrain.html fix restrain fix_rheo_oxidation.html fix rheo/oxidation fix_rheo_pressure.html fix rheo/pressure @@ -772,6 +791,7 @@ fix_wall_reflect.html fix wall/reflect fix_wall_reflect.html fix wall/reflect/kk fix_wall_reflect_stochastic.html fix wall/reflect/stochastic fix_wall_region.html fix wall/region +fix_wall_region.html fix wall/region/kk fix_wall.html fix wall/colloid fix_wall.html fix wall/harmonic fix_wall.html fix wall/lepton @@ -783,6 +803,7 @@ fix_wall.html fix wall/morse fix_wall.html fix wall/table fix_wall_srd.html fix wall/srd fix_widom.html fix widom +geturl.html geturl group2ndx.html group2ndx group2ndx.html ndx2group group.html group @@ -919,6 +940,7 @@ pair_born.html pair_style born/gpu pair_born.html pair_style born/omp pair_bpm_spring.html pair_style bpm/spring pair_brownian.html pair_style brownian +pair_brownian.html pair_style brownian/kk pair_brownian.html pair_style brownian/omp pair_brownian.html pair_style brownian/poly pair_brownian.html pair_style brownian/poly/omp @@ -983,6 +1005,7 @@ pair_comb.html pair_style comb/omp pair_cosine_squared.html pair_style cosine/squared pair_coul_diel.html pair_style coul/diel pair_coul_diel.html pair_style coul/diel/omp +pair_coul.html pair_style coul/ctip pair_coul.html pair_style coul/cut pair_coul.html pair_style coul/cut/global pair_coul.html pair_style coul/cut/global/omp @@ -1049,6 +1072,7 @@ pair_dipole.html pair_style lj/long/dipole/long pair_dipole.html pair_style lj/sf/dipole/sf pair_dipole.html pair_style lj/sf/dipole/sf/gpu pair_dipole.html pair_style lj/sf/dipole/sf/omp +pair_dispersion_d3.html pair_style dispersion/d3 pair_dpd_coul_slater_long.html pair_style dpd/coul/slater/long pair_dpd_coul_slater_long.html pair_style dpd/coul/slater/long/gpu pair_dpd_ext.html pair_style dpd/ext @@ -1153,8 +1177,12 @@ pair_gw.html pair_style gw/zbl pair_harmonic_cut.html pair_style harmonic/cut pair_harmonic_cut.html pair_style harmonic/cut/omp pair_hbond_dreiding.html pair_style hbond/dreiding/lj +pair_hbond_dreiding.html pair_style hbond/dreiding/lj/angleoffset +pair_hbond_dreiding.html pair_style hbond/dreiding/lj/angleoffset/omp pair_hbond_dreiding.html pair_style hbond/dreiding/lj/omp pair_hbond_dreiding.html pair_style hbond/dreiding/morse +pair_hbond_dreiding.html pair_style hbond/dreiding/morse/angleoffset +pair_hbond_dreiding.html pair_style hbond/dreiding/morse/angleoffset/omp pair_hbond_dreiding.html pair_style hbond/dreiding/morse/omp pair_hdnnp.html pair_style hdnnp pair_hybrid.html pair_style hybrid @@ -1236,6 +1264,8 @@ pair_lj_long.html pair_style lj/long/coul/long/omp pair_lj_long.html pair_style lj/long/coul/long/opt pair_lj_long.html pair_style lj/long/tip4p/long pair_lj_long.html pair_style lj/long/tip4p/long/omp +pair_lj_pirani.html pair_style lj/pirani +pair_lj_pirani.html pair_style lj/pirani/omp pair_lj_relres.html pair_style lj/relres pair_lj_relres.html pair_style lj/relres/omp pair_lj.html pair_style lj/cut @@ -1469,6 +1499,7 @@ quit.html quit read_data.html read_data read_dump.html read_dump read_restart.html read_restart +region2vmd.html region2vmd region.html region replicate.html replicate rerun.html rerun diff --git a/tools/lammps-gui/lammps-gui.appdata.xml b/tools/lammps-gui/lammps-gui.appdata.xml index 460e47f509..3061e973ea 100644 --- a/tools/lammps-gui/lammps-gui.appdata.xml +++ b/tools/lammps-gui/lammps-gui.appdata.xml @@ -62,7 +62,10 @@ Add option to visualize molecules defined through the molecule command Add text fields for editing plot title and axis labels for charts Add option to automatically open tutorial websites (enabled by default) + Add citation reminder comment to empty documents and the About dialog currently pointing to arXiv. Add preferences tab for charts to set default for title, plot colors, smooth/raw plot, smooth params + Highlight error URLs with pointers to additional explanations in log window + Double-click on highlighted URL opens it in web browser. Also available via context menu. diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index d515e8df78..f23f2daa31 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -68,6 +68,8 @@ static const QString blank(" "); static constexpr int BUFLEN = 256; +static const QString citeme("# When using LAMMPS-GUI in your project, please cite: " + "https://arxiv.org/abs/2503.14020\n"); LammpsGui::LammpsGui(QWidget *parent, const QString &filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), @@ -78,6 +80,8 @@ LammpsGui::LammpsGui(QWidget *parent, const QString &filename) : { docver = ""; ui->setupUi(this); + ui->textEdit->document()->setPlainText(citeme); + ui->textEdit->document()->setModified(false); this->setCentralWidget(ui->textEdit); highlighter = new Highlighter(ui->textEdit->document()); capturer = new StdCapture; @@ -413,7 +417,8 @@ LammpsGui::~LammpsGui() void LammpsGui::new_document() { current_file.clear(); - ui->textEdit->document()->setPlainText(QString()); + ui->textEdit->document()->setPlainText(citeme); + ui->textEdit->document()->setModified(false); if (lammps.is_running()) { stop_run(); @@ -1487,10 +1492,10 @@ void LammpsGui::about() info = std::string(info, start, end - start); } + info += citeme.toStdString(); to_clipboard += info.c_str(); #if QT_CONFIG(clipboard) QGuiApplication::clipboard()->setText(to_clipboard); - info += "(Note: this text has been copied to the clipboard)\n"; #endif QMessageBox msg; diff --git a/tools/lammps-gui/logwindow.cpp b/tools/lammps-gui/logwindow.cpp index 82689924dc..49b168b616 100644 --- a/tools/lammps-gui/logwindow.cpp +++ b/tools/lammps-gui/logwindow.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -37,6 +38,7 @@ const QString LogWindow::yaml_regex = QStringLiteral("^(keywords:.*$|data:$|---$|\\.\\.\\.$| - \\[.*\\]$)"); +const QString LogWindow::url_regex = QStringLiteral("^.*(https://docs.lammps.org/err[0-9]+).*$"); LogWindow::LogWindow(const QString &_filename, QWidget *parent) : QPlainTextEdit(parent), filename(_filename), warnings(nullptr) @@ -198,8 +200,53 @@ void LogWindow::extract_yaml() file.close(); } +void LogWindow::open_errorurl() +{ + if (!errorurl.isEmpty()) QDesktopServices::openUrl(QUrl(errorurl)); +} + +void LogWindow::mouseDoubleClickEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) { + // select the entire word (non-space text) under the cursor + // we need to do it in this complicated way, since QTextCursor does not recognize + // special characters as part of a word. + auto cursor = textCursor(); + auto line = cursor.block().text(); + int begin = qMin(cursor.positionInBlock(), line.length() - 1); + + while (begin >= 0) { + if (line[begin].isSpace()) break; + --begin; + } + + int end = begin + 1; + while (end < line.length()) { + if (line[end].isSpace()) break; + ++end; + } + cursor.setPosition(cursor.position() - cursor.positionInBlock() + begin + 1); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, end - begin - 1); + + auto text = cursor.selectedText(); + auto url = QRegularExpression(url_regex).match(text); + if (url.hasMatch()) { + errorurl = url.captured(1); + if (!errorurl.isEmpty()) { + QDesktopServices::openUrl(QUrl(errorurl)); + return; + } + } + } + // forward event to parent class for all unhandled cases + QPlainTextEdit::mouseDoubleClickEvent(event); +} + void LogWindow::contextMenuEvent(QContextMenuEvent *event) { + // reposition the cursor here, but only if there is no active selection + if (!textCursor().hasSelection()) setTextCursor(cursorForPosition(event->pos())); + // show augmented context menu auto *menu = createStandardContextMenu(); menu->addSeparator(); @@ -214,6 +261,15 @@ void LogWindow::contextMenuEvent(QContextMenuEvent *event) action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Y)); connect(action, &QAction::triggered, this, &LogWindow::extract_yaml); } + + // process line of text where the cursor is + auto text = textCursor().block().text().replace('\t', ' ').trimmed(); + auto url = QRegularExpression(url_regex).match(text); + if (url.hasMatch()) { + errorurl = url.captured(1); + action = menu->addAction("Open &URL in Web Browser", this, &LogWindow::open_errorurl); + action->setIcon(QIcon(":/icons/help-browser.png")); + } action = menu->addAction("&Jump to next warning or error", this, &LogWindow::next_warning); action->setIcon(QIcon(":/icons/warning.png")); action->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_N)); diff --git a/tools/lammps-gui/logwindow.h b/tools/lammps-gui/logwindow.h index 38bca9ba24..a3263bb2d2 100644 --- a/tools/lammps-gui/logwindow.h +++ b/tools/lammps-gui/logwindow.h @@ -32,16 +32,20 @@ private slots: void save_as(); void stop_run(); void next_warning(); + void open_errorurl(); protected: void closeEvent(QCloseEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override; bool eventFilter(QObject *watched, QEvent *event) override; bool check_yaml(); private: QString filename; + QString errorurl; static const QString yaml_regex; + static const QString url_regex; FlagWarnings *warnings; QLabel *summary; }; diff --git a/tools/lammps-gui/org.lammps.lammps-gui.yml b/tools/lammps-gui/org.lammps.lammps-gui.yml index a16ef5fdee..81c3b99dfa 100644 --- a/tools/lammps-gui/org.lammps.lammps-gui.yml +++ b/tools/lammps-gui/org.lammps.lammps-gui.yml @@ -1,6 +1,6 @@ id: org.lammps.lammps-gui runtime: org.kde.Platform -runtime-version: "5.15-23.08" +runtime-version: "5.15-24.08" sdk: org.kde.Sdk command: lammps-gui finish-args: diff --git a/tools/swig/lammps.i b/tools/swig/lammps.i index 1ed36d61c8..283b5d8b4e 100644 --- a/tools/swig/lammps.i +++ b/tools/swig/lammps.i @@ -95,6 +95,17 @@ enum _LMP_VAR_CONST { LMP_VAR_STRING = 3 /*!< return value will be a string (catch-all) */ }; +/** Neighbor list settings constants + * + * Must be kept in sync with the equivalent constants in ``python/lammps/constants.py``, + * ``fortran/lammps.f90``, ``tools/swig/lammps.i``, and + * ``examples/COUPLE/plugin/liblammpsplugin.h`` */ + +enum _LMP_NEIGH_CONST { + LMP_NEIGH_HALF = 0, /*!< request (default) half neighbor list */ + LMP_NEIGH_FULL = 1, /*!< request full neighbor list */ +}; + /* extern void *lammps_open(int argc, char **argv, MPI_Comm comm, void **ptr); */ @@ -143,32 +154,34 @@ extern int lammps_set_string_variable(void *, const char *, const char *); extern int lammps_set_internal_variable(void *, const char *, double); extern int lammps_variable_info(void *handle, int idx, char *buf, int bufsize); extern double lammps_eval(void *handle, const char *expr); + extern void lammps_clearstep_compute(void *handle); extern void lammps_addstep_compute(void *handle, void *nstep); extern void lammps_addstep_compute_all(void *handle, void *nstep); -extern void lammps_gather_atoms(void *, char *, int, int, void *); -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_atoms(void *, const char *, int, int, void *); +extern void lammps_gather_atoms_concat(void *, const char *, int, int, void *); +extern void lammps_gather_atoms_subset(void *, const char *, int, int, int, int *, void *); +extern void lammps_scatter_atoms(void *, const char *, int, int, void *); +extern void lammps_scatter_atoms_subset(void *, const char *, int, int, int, int *, void *); extern void lammps_gather_bonds(void *handle, void *data); extern void lammps_gather_angles(void *handle, void *data); extern void lammps_gather_dihedrals(void *handle, void *data); extern void lammps_gather_impropers(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 *); -extern void lammps_scatter(void *, char *, int, int, void *); -extern void lammps_scatter_subset(void *, char *, int, int, int, int *, void *); -extern int lammps_create_atoms(void *handle, int n, int *id, int *type, - double *x, double *v, int *image, int bexpand); +extern void lammps_gather(void *, const char *, int, int, void *); +extern void lammps_gather_concat(void *, const char *, int, int, void *); +extern void lammps_gather_subset(void *, const char *, int, int, int, int *, void *); +extern void lammps_scatter(void *, const char *, int, int, void *); +extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *); +extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type, + const double *x, const double *v, const int *image, int bexpand); /* extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */ -extern int lammps_find_pair_neighlist(void*, char *, int, int, int); -extern int lammps_find_fix_neighlist(void*, char *, int); -extern int lammps_find_compute_neighlist(void*, char *, int); -extern int lammps_neighlist_num_elements(void*, int); +extern int lammps_find_pair_neighlist(void *, const char *, int, int, int); +extern int lammps_find_fix_neighlist(void *, const char *, int); +extern int lammps_find_compute_neighlist(void *, const char *, int); +extern int lammps_request_single_neighlist(void *, const char *, int, double); +extern int lammps_neighlist_num_elements(void *, int); extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); extern int lammps_version(void *handle); @@ -344,27 +357,28 @@ extern void lammps_clearstep_compute(void *handle); extern void lammps_addstep_compute(void *handle, void *nstep); extern void lammps_addstep_compute_all(void *handle, void *nstep); -extern void lammps_gather_atoms(void *, char *, int, int, void *); -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_atoms(void *, const char *, int, int, void *); +extern void lammps_gather_atoms_concat(void *, const char *, int, int, void *); +extern void lammps_gather_atoms_subset(void *, const char *, int, int, int, int *, void *); +extern void lammps_scatter_atoms(void *, const char *, int, int, void *); +extern void lammps_scatter_atoms_subset(void *, const char *, int, int, int, int *, void *); extern void lammps_gather_bonds(void *handle, void *data); extern void lammps_gather_angles(void *handle, void *data); extern void lammps_gather_dihedrals(void *handle, void *data); extern void lammps_gather_impropers(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 *); -extern void lammps_scatter(void *, char *, int, int, void *); -extern void lammps_scatter_subset(void *, char *, int, int, int, int *, void *); -extern int lammps_create_atoms(void *handle, int n, int *id, int *type, - double *x, double *v, int *image, int bexpand); +extern void lammps_gather(void *, const char *, int, int, void *); +extern void lammps_gather_concat(void *, const char *, int, int, void *); +extern void lammps_gather_subset(void *, const char *, int, int, int, int *, void *); +extern void lammps_scatter(void *, const char *, int, int, void *); +extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *); +extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type, + const double *x, const double *v, const int *image, int bexpand); /* extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */ -extern int lammps_find_pair_neighlist(void*, char *, int, int, int); -extern int lammps_find_fix_neighlist(void*, char *, int); -extern int lammps_find_compute_neighlist(void*, char *, int); +extern int lammps_find_pair_neighlist(void*, const char *, int, int, int); +extern int lammps_find_fix_neighlist(void*, const char *, int); +extern int lammps_find_compute_neighlist(void*, const char *, int); +extern int lammps_request_single_neighlist(void *, const char *, int, double); extern int lammps_neighlist_num_elements(void*, int); extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); diff --git a/tools/tabulate/angle_harmonic_tabulate.py b/tools/tabulate/angle_harmonic_tabulate.py index c3b8cd39e8..7ecf3d493e 100755 --- a/tools/tabulate/angle_harmonic_tabulate.py +++ b/tools/tabulate/angle_harmonic_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import AngleTabulate diff --git a/tools/tabulate/bond_morse_tabulate.py b/tools/tabulate/bond_morse_tabulate.py index 14b6a2adf5..f5c7963340 100755 --- a/tools/tabulate/bond_morse_tabulate.py +++ b/tools/tabulate/bond_morse_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import BondTabulate diff --git a/tools/tabulate/dihedral_harmonic_tabulate.py b/tools/tabulate/dihedral_harmonic_tabulate.py index 8f49062e43..83f89bc4de 100755 --- a/tools/tabulate/dihedral_harmonic_tabulate.py +++ b/tools/tabulate/dihedral_harmonic_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import DihedralTabulate diff --git a/tools/tabulate/pair_bi_tabulate.py b/tools/tabulate/pair_bi_tabulate.py index 233cbe4d69..8a0fb39220 100755 --- a/tools/tabulate/pair_bi_tabulate.py +++ b/tools/tabulate/pair_bi_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python3 +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import PairTabulate import sys diff --git a/tools/tabulate/pair_hybrid_tabulate.py b/tools/tabulate/pair_hybrid_tabulate.py index 98e2814233..e2adb09044 100755 --- a/tools/tabulate/pair_hybrid_tabulate.py +++ b/tools/tabulate/pair_hybrid_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import PairTabulate diff --git a/tools/tabulate/pair_lj_tabulate.py b/tools/tabulate/pair_lj_tabulate.py index 713b10a761..96c76c4128 100755 --- a/tools/tabulate/pair_lj_tabulate.py +++ b/tools/tabulate/pair_lj_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import PairTabulate diff --git a/tools/tabulate/pair_zbladd_tabulate.py b/tools/tabulate/pair_zbladd_tabulate.py index 2791b1858f..90e6ac5ca1 100755 --- a/tools/tabulate/pair_zbladd_tabulate.py +++ b/tools/tabulate/pair_zbladd_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import PairTabulate diff --git a/tools/tabulate/plot_forces.py b/tools/tabulate/plot_forces.py index ee55a93be6..d215580fcc 100755 --- a/tools/tabulate/plot_forces.py +++ b/tools/tabulate/plot_forces.py @@ -1,5 +1,17 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- # Author: Germain Clavier (Unicaen), germain.clavier at unicaen.fr """ diff --git a/tools/tabulate/wall_harmonic_tabulate.py b/tools/tabulate/wall_harmonic_tabulate.py index 9424856dbf..dd980839f5 100755 --- a/tools/tabulate/wall_harmonic_tabulate.py +++ b/tools/tabulate/wall_harmonic_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import WallTabulate diff --git a/tools/tabulate/wall_multi_tabulate.py b/tools/tabulate/wall_multi_tabulate.py index 576889cf75..42e1be35d5 100755 --- a/tools/tabulate/wall_multi_tabulate.py +++ b/tools/tabulate/wall_multi_tabulate.py @@ -1,4 +1,16 @@ #!/usr/bin/env python +# ---------------------------------------------------------------------- +# LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator +# https://www.lammps.org/ Sandia National Laboratories +# LAMMPS Development team: developers@lammps.org +# +# 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. +# ------------------------------------------------------------------------- from tabulate import WallTabulate import os, sys diff --git a/unittest/c-library/test_library_properties.cpp b/unittest/c-library/test_library_properties.cpp index 3878b13774..39b31e8217 100644 --- a/unittest/c-library/test_library_properties.cpp +++ b/unittest/c-library/test_library_properties.cpp @@ -303,6 +303,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), -1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -313,7 +322,7 @@ TEST_F(LibraryProperties, setting) std::string input = path_join(INPUT_DIR, "in.fourmol"); if (!verbose) ::testing::internal::CaptureStdout(); lammps_file(lmp, input.c_str()); - lammps_command(lmp, "run 2 post no"); + lammps_command(lmp, "run 3 post no"); if (!verbose) ::testing::internal::GetCapturedStdout(); EXPECT_EQ(lammps_extract_setting(lmp, "triclinic"), 0); EXPECT_EQ(lammps_extract_setting(lmp, "box_exist"), 1); @@ -328,6 +337,15 @@ TEST_F(LibraryProperties, setting) EXPECT_EQ(lammps_extract_setting(lmp, "ndihedraltypes"), 5); EXPECT_EQ(lammps_extract_setting(lmp, "nimpropertypes"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_every"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_delay"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_dist_check"), 0); + EXPECT_EQ(lammps_extract_setting(lmp, "neigh_ago"), 1); + EXPECT_EQ(lammps_extract_setting(lmp, "nbondlist"), 24); + EXPECT_EQ(lammps_extract_setting(lmp, "nanglelist"), 30); + EXPECT_EQ(lammps_extract_setting(lmp, "ndihedrallist"), 31); + EXPECT_EQ(lammps_extract_setting(lmp, "nimproperlist"), 2); + EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 1); EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0); @@ -365,10 +383,48 @@ TEST_F(LibraryProperties, global) char *c_ptr = (char *)lammps_extract_global(lmp, "units"); EXPECT_THAT(c_ptr, StrEq("real")); - EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_INT64); - auto *b_ptr = (int64_t *)lammps_extract_global(lmp, "ntimestep"); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "ntimestep"), LAMMPS_BIGINT); + auto *b_ptr = (bigint *)lammps_extract_global(lmp, "ntimestep"); EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "natoms"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "natoms"); + EXPECT_EQ((*b_ptr), 29); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nbonds"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nbonds"); + EXPECT_EQ((*b_ptr), 24); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nangles"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nangles"); + EXPECT_EQ((*b_ptr), 30); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "ndihedrals"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "ndihedrals"); + EXPECT_EQ((*b_ptr), 31); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "nimpropers"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "nimpropers"); + EXPECT_EQ((*b_ptr), 2); + + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_bondlist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_bondlist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_anglelist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_anglelist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_dihedrallist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_dihedrallist"), nullptr); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "neigh_improperlist"), LAMMPS_INT_2D); + EXPECT_NE(lammps_extract_global(lmp, "neigh_improperlist"), nullptr); + + EXPECT_EQ(lammps_extract_global_datatype(lmp, "eflag_global"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "eflag_global"); + EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "eflag_atom"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "eflag_atom"); + EXPECT_EQ((*b_ptr), 0); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "vflag_global"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "vflag_global"); + EXPECT_EQ((*b_ptr), 2); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "vflag_atom"), LAMMPS_BIGINT); + b_ptr = (bigint *)lammps_extract_global(lmp, "vflag_atom"); + EXPECT_EQ((*b_ptr), 0); + EXPECT_EQ(lammps_extract_global_datatype(lmp, "dt"), LAMMPS_DOUBLE); auto *d_ptr = (double *)lammps_extract_global(lmp, "dt"); EXPECT_DOUBLE_EQ((*d_ptr), 0.1); @@ -584,17 +640,36 @@ TEST_F(LibraryProperties, neighlist) EXPECT_DOUBLE_EQ(minval, 1.0); EXPECT_DOUBLE_EQ(maxval, 2.1); + char errbuf[128]; + lammps_set_show_error(lmp, 0); const int nlocal = lammps_extract_setting(lmp, "nlocal"); EXPECT_EQ(nlocal, numatoms); EXPECT_NE(lammps_find_pair_neighlist(lmp, "sw", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "morse", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 1, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 2, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "lj/cut", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[69] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_pair_neighlist(): Pair style lj/cut does not exist")); EXPECT_EQ(lammps_find_pair_neighlist(lmp, "hybrid/overlay", 1, 0, 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_NE(lammps_find_compute_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_fix_neighlist(lmp, "dist", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 0); EXPECT_EQ(lammps_find_compute_neighlist(lmp, "xxx", 0), -1); + EXPECT_EQ(lammps_has_error(lmp), 1); + EXPECT_EQ(lammps_get_last_error_message(lmp, errbuf, 128), 1); + errbuf[66] = '\0'; + EXPECT_THAT(std::string(errbuf), + StrEq("ERROR: lammps_find_compute_neighlist(): Compute xxx does not exist")); // full neighbor list for 4 type 1 atoms // all have 3 type 1 atom neighbors diff --git a/unittest/commands/test_kim_commands.cpp b/unittest/commands/test_kim_commands.cpp index 5f997dccdf..2e43faf96e 100644 --- a/unittest/commands/test_kim_commands.cpp +++ b/unittest/commands/test_kim_commands.cpp @@ -636,7 +636,7 @@ TEST_F(KimCommandsTest, kim_query) "temperature_units=[K]"); END_HIDE_OUTPUT(); - ASSERT_THAT(variable->retrieve("alpha"), StrEq("1.654960564704273e-05")); + ASSERT_THAT(variable->retrieve("alpha"), StrEq("1.656579473023212e-05")); BEGIN_HIDE_OUTPUT(); command("clear"); 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 576885a6ef..af27892fe7 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 @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: unstable -date_generated: Fri Mar 18 22:17:36 2022 +date_generated: Fri Apr 25 19:44:59 2025 epsilon: 7.5e-13 skip_tests: gpu intel single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -35,142 +35,142 @@ pair_coeff: ! | 2 2 1388.77 0.3623188 175.0 extract: ! "" natoms: 64 -init_vdwl: 106.41860675757 -init_coul: -129.9140700924124 +init_vdwl: -24.42807736156882 +init_coul: -131.75120059001813 init_stress: ! |- - -2.8069812877025680e+02 -4.4806768911794171e+02 -5.0378472147221044e+02 3.9357896002405380e+02 -4.6782123097483543e+02 1.9690042286173212e+02 + -6.8611278946113976e+02 -8.4852099966145420e+02 -7.2493943802866158e+02 8.7199041253461814e+02 -6.9309149754481655e+02 1.0108767842057036e+03 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 + 1 4.7247694465962518e+00 3.8636589800094097e+00 1.1621871799061909e+01 + 2 9.1252156972042364e-02 4.2008105070379278e+00 -1.1980129104691510e+00 + 3 -1.2601754020721603e+00 9.2524682920861423e+00 7.3929409765368757e+00 + 4 -2.0726977587259077e+00 2.9077845151833932e+00 -2.7757587746193373e+00 + 5 -1.0459077110812462e+01 -1.1826792529252666e+01 -1.1083450570197344e+01 + 6 1.2136543334776942e+01 4.5849120194674704e+00 1.2079301503775022e+00 + 7 -2.2741379605274665e+00 1.8070366300153946e+00 4.4062289068411875e+00 + 8 -4.7711645442680819e+00 8.7524859750982991e+00 -4.8962583041964738e+00 + 9 4.0328267692134583e+00 3.4040816708138846e+00 -1.8995726137368742e+00 + 10 7.3342970772780651e+00 -1.1625708495684536e+01 1.6641556656164258e+00 + 11 2.3806275027928057e+00 2.0941569224028513e+00 -1.6519953937630087e+00 + 12 -6.2260236357885844e+02 8.2842855555945846e+02 -4.9419366949715675e+02 + 13 3.9701791827302380e+01 2.5107306829177205e+01 -2.6693078280374319e+01 + 14 -4.9665862218475114e+00 6.7166971146470966e-02 1.0835738495219992e+01 + 15 -6.5972542674545345e+00 3.2687337906397440e+00 -2.0185347166446563e+00 + 16 -2.9095101910253285e-01 -7.0769446878294087e+00 -2.6818145980741166e+00 + 17 -4.6662839821444395e+00 1.8992979157452603e+00 1.3892844154040138e+00 + 18 3.6232824669878743e+00 -4.3996978419370389e+00 -7.9083611962231020e+00 + 19 -6.8890131136555359e+00 -1.0830898273912712e+00 1.2072661383321417e+00 + 20 9.8171454663225788e+00 -9.1035000219673612e-01 2.8436105157483560e+00 + 21 -6.4267201894937989e+00 -8.2156139232861101e+00 6.3067572266832048e+00 + 22 -8.5030200202157591e+00 1.4205269387466176e+01 -7.8844799176414240e+00 + 23 6.9432523243590740e+00 3.3737260499363608e+00 2.2143562043946177e+00 + 24 1.1167733798586100e+01 -1.0739684016148335e+01 -3.7956397167384850e+00 + 25 -7.3628620125144280e+01 1.0248504583615836e+02 -4.8418860956676525e+01 + 26 6.6263639105567663e+01 -6.4097840274469718e+01 -6.3595212300135067e+01 + 27 7.2057038082439657e+00 7.4557411533732756e+00 2.8696162515374115e+00 + 28 -7.9329300958368369e+00 1.2335261827158241e+00 -1.2407218911970331e+01 + 29 -7.9031028432291606e+01 6.4797754884349033e+01 7.2935815813928102e+01 + 30 -4.3242124829998954e+00 1.7245335206633547e+00 2.5245835369028411e+00 + 31 -3.2556531400191888e+00 -4.0771319166777253e+00 9.4144942380785412e+00 + 32 5.3493297950927108e+00 1.2562955135214278e+01 -4.4882693411414065e-01 + 33 -1.2255425910828938e+01 -2.8689448972424191e+01 1.7093467049309599e+01 + 34 -3.1777406620351565e+00 -8.9186313551255836e+00 1.0463596621056004e+00 + 35 -3.1196549028141418e+00 -2.5994883508560860e+00 -9.2177540665900048e-01 + 36 -5.9576900168680282e+01 -7.4451272068728869e+01 6.1235068709614346e+01 + 37 6.0157330299178689e+01 8.0285495378129127e+01 -5.7938854098325038e+01 + 38 -9.6815577392778085e-01 5.8373609530147199e+00 -5.4776558838012690e+00 + 39 6.5036942143592802e-01 -5.5095290902514762e+00 -8.5045800982305975e-01 + 40 5.1842254872430082e-01 -1.7683063757591517e+00 -5.3317544095977998e-01 + 41 -1.6916180625756201e+01 -1.6630288797681160e+01 -3.7719493322749247e+00 + 42 2.5876740680807822e+00 5.3905848734122879e+00 -1.6450920338360145e+01 + 43 -3.5279855851679631e+00 9.8495179159335908e+00 -3.2714238772017765e+00 + 44 6.0889002640825662e-01 3.1410890913935359e+00 1.1032945837449786e+00 + 45 1.1968416936354009e+01 1.1004153957788535e+01 1.2105055934473947e+01 + 46 5.9540499922261426e+02 -8.5332666872039056e+02 5.2223674210671663e+02 + 47 9.3085758478118343e+00 3.6902311757607924e+00 -3.0446774945196609e+00 + 48 7.5901220066242217e+01 1.3757697268206282e+01 -6.5987345219634847e+01 + 49 -6.8359329024029364e+01 -3.9765670869480545e+01 5.4460314514030138e+01 + 50 -4.5653564184344297e-01 -4.6827143163841587e+00 2.2100068640440114e+01 + 51 -1.0710153088032328e+03 9.5012834910106676e+02 -1.2142374746384971e+03 + 52 1.3972268755441464e+01 -1.5027397170129637e+01 1.1181740632667148e+01 + 53 1.0887040837377938e+03 -9.4464616532703872e+02 1.2184820624884132e+03 + 54 -1.4916779565987026e+01 5.8262752191213307e+00 -1.8719794490582007e+01 + 55 5.1258703585615493e+01 -1.0313579382868322e+02 3.9556815338722231e+01 + 56 7.2230447113797958e+00 2.2629738499143413e+00 -3.2153882168284924e+00 + 57 7.9701310882685341e+00 1.9747232318959853e+01 1.0450527723051438e+01 + 58 -5.5233659987382948e+00 9.0259835310388870e-01 4.6808879589599970e+00 + 59 -2.1517171549006143e+01 1.6544754727019644e+01 9.6541292269942787e+00 + 60 1.2315294601931821e+00 -9.8191775257502307e+00 -1.0095770367374730e+01 + 61 -1.4403329803680169e+01 -2.5271904205234947e+01 -8.4385127431848996e+00 + 62 -7.2508809251494712e+00 -4.3099363976614820e+00 3.6806953545058976e+00 + 63 1.7366944215878561e+01 -2.1678065532175923e+00 -3.9215344710226812e+00 + 64 2.7331835514835586e+01 2.8927730528687206e+01 -1.7474424636631589e+01 +run_vdwl: -2140.050580658317 +run_coul: -134.89831768121073 run_stress: ! |- - -4.5872997550021264e+03 -3.9988755027842894e+03 -6.1188498400678936e+03 4.1760773642646591e+03 -5.3312812896810128e+03 4.4665905499115461e+03 + -5.4348057135758700e+03 -5.3159515873286382e+03 -6.7051641305464191e+03 5.3862756055333693e+03 -5.9963166859345883e+03 6.0214993931030604e+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 + 1 4.7122965463705064e+00 3.9483331580787571e+00 1.1728507090799370e+01 + 2 6.2540769620511583e-04 4.1975594096677806e+00 -1.2655578889200010e+00 + 3 -1.2620410935788802e+00 9.3431467733916858e+00 7.4655223258749022e+00 + 4 -2.0887790508687458e+00 2.8362620671083052e+00 -2.6665635606311202e+00 + 5 -1.0651156040553424e+01 -1.1870381165237049e+01 -1.1326632090513900e+01 + 6 1.2091930350658666e+01 4.9253117250743088e+00 1.2569218632223669e+00 + 7 -2.2466680039472138e+00 1.8285162496432987e+00 4.3642157656708376e+00 + 8 -4.7964507313245841e+00 8.5783752296325684e+00 -4.7402266739984285e+00 + 9 4.0921933327781339e+00 3.4422544385699028e+00 -1.9832969878570745e+00 + 10 7.3261797536542481e+00 -1.1778853782806936e+01 1.6672873842416867e+00 + 11 2.3262362451564815e+00 2.0302894707130710e+00 -1.5989681942671028e+00 + 12 -1.8528259976245022e+03 2.6733690793551527e+03 -1.6526784648042444e+03 + 13 2.9930583975905577e+01 2.0302968352922949e+01 -1.9718778029909050e+01 + 14 -4.9854520942538061e+00 1.1769885859903972e-01 1.0836441479065130e+01 + 15 -6.6436375960539298e+00 3.3504771031444984e+00 -2.0103943675023666e+00 + 16 -8.2826662234260773e-01 -7.7053582800848890e+00 -3.1407715947253125e+00 + 17 -4.6285853687124510e+00 1.8831032308670554e+00 1.3311155953669225e+00 + 18 3.6581901150678120e+00 -4.4248478511248424e+00 -7.9261897763565461e+00 + 19 -6.9775721937943915e+00 -1.0738344822024193e+00 1.3399278795331213e+00 + 20 9.8542409756528802e+00 -8.3583213038045168e-01 2.9729110796187017e+00 + 21 -6.3858473251137298e+00 -8.2063778055692573e+00 6.2090714363591655e+00 + 22 -8.5268899256470476e+00 1.4061397787130135e+01 -7.5959221227930600e+00 + 23 7.1053916341971437e+00 3.3593780094184811e+00 2.1454774319199919e+00 + 24 1.1287923752723026e+01 -1.0905349485022397e+01 -3.8423124003720108e+00 + 25 -7.8878144031307869e+01 1.1144037793856330e+02 -5.2345476930838664e+01 + 26 7.3556055368024303e+01 -7.0063862890920788e+01 -6.9625728550847427e+01 + 27 7.2649904809058601e+00 7.4435155311914185e+00 2.8761503856744834e+00 + 28 -7.8199489945593141e+00 1.6386033020381725e+00 -1.2582811155181844e+01 + 29 -8.6450147297519081e+01 7.0686776700164231e+01 7.9023187918102835e+01 + 30 -4.3027444462158391e+00 1.7239104829814220e+00 2.5535790049846039e+00 + 31 -3.3046500113513737e+00 -4.1204441409767592e+00 9.2623889633129082e+00 + 32 5.1772833147365276e+00 1.2309544714901417e+01 -5.8472477813045920e-01 + 33 -1.2649794837326658e+01 -2.9458570076205088e+01 1.7550527253526816e+01 + 34 -3.1661089296085292e+00 -8.7689043248204115e+00 9.7058611853842613e-01 + 35 -3.0924038824986666e+00 -2.4489419534639865e+00 -9.3762339249707094e-01 + 36 -7.1208690920666641e+01 -8.8806793017351026e+01 7.4268951629268130e+01 + 37 7.1829111376814453e+01 9.4565190186422143e+01 -7.0841892313239953e+01 + 38 -7.9134637265759067e-01 6.1278427310858481e+00 -5.7340689571314289e+00 + 39 5.8399235535558125e-01 -5.5767896971177642e+00 -8.8077256557329009e-01 + 40 3.3991818916474581e-01 -1.5995866916432444e+00 -3.7663653521179696e-01 + 41 -1.7039926503399553e+01 -1.6822911562713731e+01 -3.6075749889978770e+00 + 42 2.3106705960272320e+00 5.8882256112675435e+00 -1.6069778691774765e+01 + 43 -3.4306138444009289e+00 9.9265316014995850e+00 -3.3621117748415665e+00 + 44 6.4642428588167933e-01 3.0509717980229727e+00 1.1215034345971302e+00 + 45 1.2022816953757598e+01 1.0808099503778980e+01 1.1641671818467149e+01 + 46 1.8356549823565331e+03 -2.6920947307474571e+03 1.6746382302672109e+03 + 47 9.9557809841328968e+00 2.7776852967803318e+00 -3.0712599231891318e+00 + 48 8.2517343899876806e+01 1.7204532623712410e+01 -7.1545905171861946e+01 + 49 -7.5263235134837274e+01 -4.2852137596696686e+01 5.9345417348920002e+01 + 50 -1.7147346578728082e+00 -3.9215028587126870e+00 2.2046250885945959e+01 + 51 -1.4038860116616930e+04 1.2534673144126318e+04 -1.6004375713307671e+04 + 52 1.4036626077387192e+01 -1.5290044850585737e+01 1.1474515373499523e+01 + 53 1.4056802256914347e+04 -1.2530813382537252e+04 1.6008356188605358e+04 + 54 -1.4964928080874120e+01 5.9952178313910824e+00 -1.8703881764056817e+01 + 55 5.7171923852348037e+01 -1.1179386471206521e+02 4.3505525189942027e+01 + 56 7.4502714304370654e+00 2.4147743497707221e+00 -3.3080635176139359e+00 + 57 8.5439425697364193e+00 2.1826866783942567e+01 1.1739018146458523e+01 + 58 -5.4915924082367980e+00 1.2005891987344837e+00 4.8298527235029205e+00 + 59 -2.1827228692900594e+01 1.6434319959036547e+01 9.8746730849843019e+00 + 60 1.2577696663345079e+00 -9.7685855242912236e+00 -1.0067453390698732e+01 + 61 -1.4849037643280727e+01 -2.7508969230557387e+01 -9.8137997879873637e+00 + 62 -7.0890794009016256e+00 -4.5729644069748323e+00 4.0583900180348680e+00 + 63 1.7531488436729465e+01 -2.0193633823631418e+00 -4.2035828162489199e+00 + 64 2.8002375179649803e+01 2.9392313693873362e+01 -1.7921068696312695e+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 index b66f8900e4..37a43bdf57 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 @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: unstable -date_generated: Fri Mar 18 22:17:37 2022 +date_generated: Fri Apr 25 19:45:00 2025 epsilon: 7.5e-13 skip_tests: gpu intel single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -35,142 +35,142 @@ pair_coeff: ! | 2 2 1388.77 0.3623188 175.0 extract: ! "" natoms: 64 -init_vdwl: 106.41860675757 -init_coul: -92.45424973362312 +init_vdwl: -24.42807736156882 +init_coul: -94.30267248868505 init_stress: ! |- - -2.6904173108770976e+02 -4.3428982773044442e+02 -4.9175916018347112e+02 3.9566088371930806e+02 -4.7262515517192719e+02 1.9591432292647838e+02 + -6.7068818926501319e+02 -8.3761091480628568e+02 -7.1382559497863474e+02 8.6381835138610825e+02 -6.8072226844330942e+02 1.0121844048740628e+03 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 + 1 4.6947378407070453e+00 4.0026354353245912e+00 1.1654744393244599e+01 + 2 3.0143634117586426e-01 3.8809443078217702e+00 -9.6128395211218987e-01 + 3 -1.3716411354848843e+00 9.5471780695147253e+00 7.5006581074548340e+00 + 4 -1.3618498108317041e+00 2.3107529643252631e+00 -1.8978972314690825e+00 + 5 -1.0314751782203327e+01 -1.1714958511988597e+01 -1.0957611745775717e+01 + 6 1.2139320611078922e+01 4.4621569801079177e+00 7.9565858170198389e-01 + 7 -2.3828943922411789e+00 1.8061629767503349e+00 4.1866220497272488e+00 + 8 -4.3838950325503978e+00 8.4929090413005444e+00 -4.6953324004218988e+00 + 9 3.7902104202621465e+00 3.0903456612241684e+00 -1.8269955339285484e+00 + 10 7.2766698218308665e+00 -1.1501541933460331e+01 1.3692046888754137e+00 + 11 2.5103007687747221e+00 1.7986559406396334e+00 -2.3533810158340920e+00 + 12 -6.2283346510859803e+02 8.2830548108580581e+02 -4.9424073606205690e+02 + 13 3.9575030670921450e+01 2.5249567110437859e+01 -2.6634096271509200e+01 + 14 -5.1482019177180858e+00 1.1760207396209273e-01 1.0572766876991421e+01 + 15 -6.2204726961812558e+00 2.9817114003945533e+00 -1.9747283296218197e+00 + 16 3.1919563044919319e-01 -6.4802751202941122e+00 -2.9802590635532682e+00 + 17 -4.2097658785383398e+00 1.5718664589635776e+00 1.3890171101280913e+00 + 18 3.6912256651362307e+00 -4.1826706547335775e+00 -7.8536999927776936e+00 + 19 -6.4044264040026313e+00 -2.1909866156050581e+00 1.1530216826326269e+00 + 20 1.0039970738763460e+01 -9.5302508114405238e-01 3.0373478915930896e+00 + 21 -6.8830757734929584e+00 -7.9264010036198780e+00 6.0645790858957689e+00 + 22 -9.4025197973490968e+00 1.5158887727484627e+01 -7.6402347803458497e+00 + 23 6.8033212713644486e+00 3.7724280740807767e+00 2.4109989934677576e+00 + 24 1.0930017893990517e+01 -1.1066320927194150e+01 -3.9742190927699825e+00 + 25 -7.3623311423691959e+01 1.0245367267539233e+02 -4.8233004894338478e+01 + 26 6.6051306134206968e+01 -6.4079480404331917e+01 -6.3513638302539185e+01 + 27 6.9368259843626667e+00 7.4138971911546969e+00 2.8694772877849251e+00 + 28 -8.3405135380575590e+00 1.0701118442464019e+00 -1.2855629988828568e+01 + 29 -7.8998966689119499e+01 6.4765847807130982e+01 7.2769787582477221e+01 + 30 -4.2185913233377086e+00 1.7041491457387161e+00 2.6729632831328316e+00 + 31 -2.4701887452333628e+00 -4.2761894871807034e+00 8.7427533195132021e+00 + 32 5.6613002540651713e+00 1.2732929015561741e+01 1.4235201296271993e-01 + 33 -1.2811510404813792e+01 -2.9294410542694941e+01 1.7147318374908178e+01 + 34 -2.2186875619523803e+00 -7.9735289236164490e+00 1.4973095835945589e+00 + 35 -2.9400678245559244e+00 -2.9244307733655135e+00 -6.4358154126206180e-01 + 36 -5.8811557039538314e+01 -7.3484451796930784e+01 6.1182054184216824e+01 + 37 5.9313577452381750e+01 7.9308030214571261e+01 -5.7855711307413713e+01 + 38 -1.8297434568376252e+00 6.6486021531949753e+00 -6.3695741734645912e+00 + 39 6.7312899452214070e-01 -5.3889023491681378e+00 -5.6642784794245127e-01 + 40 8.8628302507953616e-02 -1.7349551496539137e+00 -3.8089599679364500e-01 + 41 -1.6987518094699748e+01 -1.6924100019119717e+01 -4.2314172109390542e+00 + 42 2.2991712758714971e+00 5.9197879839023084e+00 -1.5264733456073674e+01 + 43 -3.2000987996601373e+00 9.2653845069419063e+00 -3.1294352292711634e+00 + 44 -9.9752367697551220e-02 2.8940255581359668e+00 1.8927535768865569e+00 + 45 1.2313352143699715e+01 1.1903512236758489e+01 1.0838818293328735e+01 + 46 5.9528317830293622e+02 -8.5326605482947946e+02 5.2224055648577757e+02 + 47 9.0236667024287467e+00 3.3805975340120851e+00 -3.0880507211598451e+00 + 48 7.5623519689143521e+01 1.4048135465298412e+01 -6.6068273789820353e+01 + 49 -6.8429086762663275e+01 -3.9772009321122020e+01 5.4511109302924865e+01 + 50 -1.2723633018373928e+00 -4.4105244066813079e+00 2.1759410277499359e+01 + 51 -1.0704915197480825e+03 9.4871975761887313e+02 -1.2131880996901693e+03 + 52 1.4392677706376903e+01 -1.5623190771915734e+01 1.1288392851638649e+01 + 53 1.0877941919306670e+03 -9.4376094864347135e+02 1.2174103406116253e+03 + 54 -1.4054085017991891e+01 5.5548191571111634e+00 -1.8860565153249546e+01 + 55 5.1749757205887093e+01 -1.0320185655963705e+02 3.9674461695683675e+01 + 56 6.4542416669826856e+00 2.2799994448500591e+00 -2.8513559274898164e+00 + 57 7.9463071516499921e+00 1.9371547636436954e+01 1.0210371651084046e+01 + 58 -4.9459735467161527e+00 7.4875932479573815e-01 4.8418061234449707e+00 + 59 -2.1316442172319942e+01 1.6263918362969125e+01 9.6840331381689069e+00 + 60 1.1574992962236381e+00 -9.4604171682938745e+00 -9.6584390875308355e+00 + 61 -1.3913746150501709e+01 -2.4547872673808087e+01 -8.1905424919403753e+00 + 62 -6.9838472681609058e+00 -4.4719642179636265e+00 3.5237036597733087e+00 + 63 1.6875174710881243e+01 -1.6950863500105884e+00 -4.2696760309926658e+00 + 64 2.7165588387410757e+01 2.9309784051269887e+01 -1.7824864444744275e+01 +run_vdwl: -2134.3892897268993 +run_coul: -96.03599944505851 run_stress: ! |- - -4.5595453405449562e+03 -3.9713162676196043e+03 -6.0848825790480287e+03 4.1634964821175072e+03 -5.3172121985750009e+03 4.4482840126121810e+03 + -5.4063171627257107e+03 -5.2950860602286821e+03 -6.6770931459867124e+03 5.3671148124831825e+03 -5.9690973449547182e+03 6.0099351619009758e+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 + 1 4.6892793391143748e+00 4.0868347800834988e+00 1.1766635628134267e+01 + 2 2.1825488487267464e-01 3.8757095013565346e+00 -1.0073798100986142e+00 + 3 -1.3537236320918753e+00 9.6300639938774637e+00 7.5828460209779927e+00 + 4 -1.3806179078883103e+00 2.2566599376724836e+00 -1.8262008607672637e+00 + 5 -1.0501879235664362e+01 -1.1765151220356698e+01 -1.1174053328349354e+01 + 6 1.2081906267451341e+01 4.8111457759902567e+00 8.6744381609474974e-01 + 7 -2.3481452290006004e+00 1.8211072622871678e+00 4.1547985299131067e+00 + 8 -4.4187112855910105e+00 8.3229390748582084e+00 -4.5273147935352966e+00 + 9 3.8934804229575972e+00 3.1999690320094096e+00 -1.9259657830236261e+00 + 10 7.2597963656713693e+00 -1.1664403501619274e+01 1.3863101701775977e+00 + 11 2.4639909085535923e+00 1.7493204609463469e+00 -2.3112010097859619e+00 + 12 -1.8528336887173434e+03 2.6731870870175781e+03 -1.6525877314110971e+03 + 13 2.9763630741293877e+01 2.0415144885700634e+01 -1.9634360782401156e+01 + 14 -5.1662395911571570e+00 1.6875014496244453e-01 1.0592365176552571e+01 + 15 -6.2665675734685440e+00 3.0691185854048011e+00 -1.9580466403188828e+00 + 16 -2.6275218548533563e-01 -7.1381762563723443e+00 -3.4996916695583717e+00 + 17 -4.1654780469602137e+00 1.5361079260797916e+00 1.3401975403026616e+00 + 18 3.7286528246953332e+00 -4.1960652263279350e+00 -7.8701485269181948e+00 + 19 -6.4940172951662207e+00 -2.1747435762638245e+00 1.2981858615342521e+00 + 20 1.0103650680976910e+01 -8.8903683874538753e-01 3.1909242549095040e+00 + 21 -6.8597820307296438e+00 -7.9205571648216146e+00 5.9626616938112740e+00 + 22 -9.4155781987214571e+00 1.5015437915586146e+01 -7.3383280224417762e+00 + 23 6.9564369022672379e+00 3.7464077027955680e+00 2.3273029493408561e+00 + 24 1.1005491355340872e+01 -1.1246693105784701e+01 -4.0161634215755688e+00 + 25 -7.8909184534282247e+01 1.1145621677277245e+02 -5.2194775695690716e+01 + 26 7.3368338420090510e+01 -7.0031835073853884e+01 -6.9535981723903021e+01 + 27 6.9944298022481695e+00 7.3972578772654201e+00 2.8866509179123754e+00 + 28 -8.2711287519472823e+00 1.4680220100970349e+00 -1.3058320970526646e+01 + 29 -8.6409411296899592e+01 7.0662582844307295e+01 7.8861610077590299e+01 + 30 -4.2090132933572386e+00 1.7020958239783175e+00 2.7098396043754045e+00 + 31 -2.4916179083954715e+00 -4.3092382400511928e+00 8.5549370504418736e+00 + 32 5.5070538823001716e+00 1.2507927655619012e+01 -7.9407732523496533e-03 + 33 -1.3212471883193867e+01 -3.0079511041991672e+01 1.7611355842428878e+01 + 34 -2.2204104969824683e+00 -7.8677890560864334e+00 1.4815848324204692e+00 + 35 -2.9360906721266131e+00 -2.7790072685708163e+00 -6.2398597093972041e-01 + 36 -7.0328564202430059e+01 -8.7708050318214603e+01 7.4087373020867545e+01 + 37 7.0883080109884759e+01 9.3454262748233546e+01 -7.0637572299037060e+01 + 38 -1.6791152471260506e+00 6.8903003431438128e+00 -6.5792391419921810e+00 + 39 6.2114558303054102e-01 -5.4705000868167177e+00 -6.0995363882843123e-01 + 40 -8.5575175033000495e-02 -1.5676770319996012e+00 -2.2739935573548622e-01 + 41 -1.7063565933725492e+01 -1.7084683094487151e+01 -4.1030952134720664e+00 + 42 2.0164383964157797e+00 6.4126392451934384e+00 -1.4911605221213227e+01 + 43 -3.1223974735087143e+00 9.3337934754064147e+00 -3.2452448160726397e+00 + 44 -3.8536151260538831e-02 2.8076311471551318e+00 1.8893524692158952e+00 + 45 1.2420525481869857e+01 1.1650374966364845e+01 1.0411018445126269e+01 + 46 1.8353766392685825e+03 -2.6918881094984731e+03 1.6745016649352842e+03 + 47 9.7042901979047933e+00 2.5056905458968797e+00 -3.1502583712871663e+00 + 48 8.2242330744532012e+01 1.7537469729014216e+01 -7.1637534811203608e+01 + 49 -7.5361433706072617e+01 -4.2844586419908865e+01 5.9390105351009808e+01 + 50 -2.5326847687499296e+00 -3.6803166352324634e+00 2.1679244992172677e+01 + 51 -1.3994260363910489e+04 1.2495103203366980e+04 -1.5953687615118715e+04 + 52 1.4451090848616003e+01 -1.5856708135282542e+01 1.1532707652816709e+01 + 53 1.4011806768238075e+04 -1.2491761552030439e+04 1.5957675002080723e+04 + 54 -1.4081268336566538e+01 5.7114799508009444e+00 -1.8859302225508557e+01 + 55 5.7693944295016600e+01 -1.1186006518159193e+02 4.3616912954679812e+01 + 56 6.6199168958556669e+00 2.3999052122442626e+00 -2.8973481714029239e+00 + 57 8.4836203460384514e+00 2.1384319068659003e+01 1.1472770460480037e+01 + 58 -4.9145745977777073e+00 1.0453190231114557e+00 4.9844624853682458e+00 + 59 -2.1627613089063320e+01 1.6143674147383642e+01 9.9302354820848162e+00 + 60 1.1759638656141642e+00 -9.4125286302183593e+00 -9.6163170827332518e+00 + 61 -1.4344671515643032e+01 -2.6738694134214182e+01 -9.5336519003865412e+00 + 62 -6.8336789385796326e+00 -4.7470421885200578e+00 3.9087758544070783e+00 + 63 1.7031242585666934e+01 -1.5637458944136915e+00 -4.5767787515407932e+00 + 64 2.7839163157538515e+01 2.9780496899845449e+01 -1.8284768837842492e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-pedone.yaml b/unittest/force-styles/tests/atomic-pair-pedone.yaml index 82c6405e65..7d4c4446f5 100644 --- a/unittest/force-styles/tests/atomic-pair-pedone.yaml +++ b/unittest/force-styles/tests/atomic-pair-pedone.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 7 Feb 2024 +lammps_version: 2 Apr 2025 tags: unstable -date_generated: Tue Apr 9 07:44:34 2024 +date_generated: Fri Apr 25 19:44:29 2025 epsilon: 7.5e-13 skip_tests: prerequisites: ! | @@ -19,7 +19,7 @@ pre_commands: ! | displace_atoms all random 0.1 0.1 0.1 623426 mass 1 40.0 mass 2 16.0 - set type 1 type/fraction 2 0.5 998877 + set type 1 type/ratio 2 0.5 998877 set type 1 charge 1.2 set type 2 charge -1.2 velocity all create 100 4534624 loop geom @@ -35,78 +35,78 @@ extract: ! | r0 2 alpha 2 natoms: 32 -init_vdwl: -0.05846735245123568 -init_coul: -127.6163776098739 +init_vdwl: 2.9494509357483256 +init_coul: -117.6172409199394 init_stress: ! |- - -2.3766889264059056e+01 -4.4271670366067475e+01 -2.5180846524036202e+01 5.0038886969182466e+00 1.8669335074554186e-01 -5.7263597257471289e+01 + -2.2541355315451575e+01 -4.7089488305762060e+01 2.3012720857944640e+01 -6.8220029718273878e+00 1.0291889629007059e+01 2.3174252164545656e+01 init_forces: ! |2 - 1 1.3068329866550368e+00 -3.2426393314368136e+00 -1.7090059822217059e+00 - 2 -8.3708962469663994e-01 8.0332716327131255e+00 3.3880696306892157e+00 - 3 1.0817171269316166e+00 6.9121377930223904e-01 6.1164739509900095e+00 - 4 -6.2705188270402727e+00 -8.8174699380428727e+00 -6.6683743935745587e+00 - 5 2.8006317273000447e-01 -1.4785785338160322e+00 2.1291363801130675e-01 - 6 -9.9407772093842439e-02 3.0597043453576771e+00 2.6317878547215199e+00 - 7 -3.0340486322792599e+00 1.3184658303824097e+00 3.6223571622028894e+00 - 8 5.0115915641263573e+00 -4.9677051620674799e+00 -6.1712277135681015e+00 - 9 -6.1985573132343514e+00 -2.9794836727762029e+00 -1.3747449204783135e+00 - 10 6.8202263133821162e-02 -8.8740995444094821e+00 -3.7669178307548044e+00 - 11 1.8229752044042762e+00 1.2148573816886858e+00 -4.4347407582895784e+00 - 12 -3.9294213238803009e+00 8.8686068238310583e+00 -1.5696200877040254e+00 - 13 4.6671449089488757e+00 -4.6189653076982848e+00 -1.3124536997564062e+00 - 14 4.5651421484368113e-02 -2.3521973378049634e+00 -1.6447916834323362e+00 - 15 2.0718235766251047e+00 -1.0016787355222116e+00 2.6102514913196893e+00 - 16 4.2906354719273310e+00 5.5091935314875675e+00 2.3081189742020186e-01 - 17 2.4088963659786491e+00 2.6695675589930521e+00 3.5122235738936918e+00 - 18 3.4512362576614999e+00 -4.1430347952161721e+00 4.2175118122911428e+00 - 19 -1.1172781222643726e+00 5.0374260939675146e+00 6.1287692774066489e+00 - 20 4.7466340882928550e+00 4.2198180415705018e+00 -8.2329099903756351e+00 - 21 4.9922952432844170e-01 -3.3643476589192347e+00 -3.4586600244054257e+00 - 22 1.9519912199733915e+00 2.3651493661604901e+00 1.9718930394593539e+00 - 23 3.2436581993388014e+00 9.2909318945485386e-01 4.6199095913337018e+00 - 24 -4.6577163797485408e+00 1.0944440231458034e-01 -3.9975755528276791e+00 - 25 -8.9409463869190198e+00 2.4726478248668329e+00 3.7066236847004816e+00 - 26 1.1745295461487557e+00 -6.0775548138182502e+00 3.9173262687577626e-01 - 27 2.1387234883139223e+00 -9.1458060453528878e-01 3.4582641764483730e+00 - 28 -5.4502482566484289e+00 3.4786802718788201e+00 2.2450528597292503e+00 - 29 -7.5667651846088226e+00 -1.4577149705984696e+00 -3.9568568740165220e+00 - 30 3.1230549128026425e-01 1.3068114717904746e+00 1.5378868153458369e+00 - 31 3.8386185003687259e+00 2.2553073046534435e+00 -1.3273631790345837e+00 - 32 3.6895374447617666e+00 7.5079155624842708e-01 -9.7729039239942395e-01 -run_vdwl: -0.05936305172833948 -run_coul: -127.68271387147016 + 1 -6.3362664460989571e+00 -5.5675953809005563e+00 5.2433022853406435e+00 + 2 2.5272841018026293e+00 3.2861696119140240e+00 5.1290078308024700e-01 + 3 2.8736330741366913e+00 -8.0101217621013632e+00 4.4239459866944779e+00 + 4 -4.9391946500861614e+00 2.4214724011119628e+00 -7.4043372804161267e-01 + 5 -8.7458417440617655e+00 6.8178024464161542e+00 -1.5663609486435133e+00 + 6 -5.8354492582570430e+00 2.7855923148292092e+00 1.4318145567550462e+00 + 7 1.7890721158820868e+00 6.8992160685063055e+00 -1.1136932457245847e+00 + 8 5.4120153449924553e+00 -3.5994382606092812e-01 -3.2708887191436808e-01 + 9 5.7881794761494660e+00 -6.1254552176265298e+00 -6.1490199189764700e+00 + 10 4.8164597621270566e+00 -4.4686579184574908e+00 5.2515680103836004e+00 + 11 4.2086429123657112e+00 -8.2328758425938720e+00 -3.1060548730017362e-01 + 12 4.7188924784061506e+00 3.1580116468695474e+00 -2.2579251614124565e+00 + 13 5.9604865103183027e+00 2.6846927396057372e+00 3.5343615137944799e+00 + 14 3.5183987706957316e+00 7.4936876877498082e-01 -4.3877154472799802e+00 + 15 -2.5857201237785765e+00 -8.8984967505572623e+00 8.4419388786976446e-01 + 16 -6.3790360037106648e+00 -3.4247137010744733e+00 5.6009632092402084e-01 + 17 6.8014093900381329e+00 6.4725654630428648e+00 4.8638728543865142e+00 + 18 -2.4700553932782943e-01 1.3905753516717705e+00 -2.0522890037710946e+00 + 19 5.6796417186406014e+00 -1.3728496235202594e+00 -5.2554898977322235e+00 + 20 -5.8145115485094490e+00 3.8264076387599641e+00 -4.3838538606987747e+00 + 21 -6.2453302443758076e+00 6.6621794831544410e+00 1.0191014239559351e+00 + 22 8.9712442238868295e-01 -4.3443495194647648e+00 -1.8159514646102606e-01 + 23 5.2570937097213655e+00 4.2303429620270752e+00 2.8088473969152221e+00 + 24 -5.4961271569978800e+00 2.9596806633454198e-01 1.7064029673830192e-01 + 25 4.0282476230053543e+00 -4.8286997854324856e+00 7.2684638290451762e+00 + 26 5.6837921153548354e-02 -3.3752285785643177e-01 4.4480107472333037e+00 + 27 -8.0757599871404762e-01 4.2229293962869949e+00 -1.7316136160711428e+00 + 28 -8.4995068885602993e+00 -3.7372509333611879e+00 -3.8455139533986062e+00 + 29 4.2112944028294166e+00 6.1502884378944369e+00 6.6909132996538945e-02 + 30 -5.6752140031420162e-01 3.3303564881676357e+00 -3.8797620147611966e+00 + 31 1.6109595211066583e+00 -4.4336201570638032e+00 -8.6055214046833439e-01 + 32 -7.6565862529673545e+00 -1.2417860092962250e+00 -3.4045165834577240e+00 +run_vdwl: 2.946730704634551 +run_coul: -117.63239014130372 run_stress: ! |- - -2.3775085785175861e+01 -4.4287200358424037e+01 -2.5219014434426338e+01 5.0215354612619398e+00 1.6449805968891407e-01 -5.7274887432938485e+01 + -2.2525567143236341e+01 -4.7156926714844516e+01 2.3017372730894518e+01 -6.8115721623881766e+00 1.0270080569586144e+01 2.3184821973405956e+01 run_forces: ! |2 - 1 1.2991722692082786e+00 -3.2346896741423627e+00 -1.7041329770094276e+00 - 2 -8.3577389730915552e-01 8.0381530163215924e+00 3.3923109270711151e+00 - 3 1.0835047785054042e+00 6.9319911007073187e-01 6.1150295417259430e+00 - 4 -6.2592674457409263e+00 -8.8205393549813724e+00 -6.6664974877688721e+00 - 5 2.8319324224275277e-01 -1.4769949542028844e+00 2.1366042708413130e-01 - 6 -1.0153594962155643e-01 3.0590371871661279e+00 2.6305719846785136e+00 - 7 -3.0312781169981404e+00 1.3253014477860192e+00 3.6137212324460495e+00 - 8 5.0065920194766118e+00 -4.9738538898220481e+00 -6.1680653045217282e+00 - 9 -6.1953589072633033e+00 -2.9840507476418630e+00 -1.3858506137213893e+00 - 10 7.2110931001166223e-02 -8.8715664120515498e+00 -3.7622114666042830e+00 - 11 1.8261227725248501e+00 1.2127884088947380e+00 -4.4352512345078896e+00 - 12 -3.9286782746032927e+00 8.8761060543305845e+00 -1.5679267227812392e+00 - 13 4.6639719242626425e+00 -4.6221575223138132e+00 -1.3189131763776332e+00 - 14 4.5202926162814835e-02 -2.3548742883712031e+00 -1.6491976796732051e+00 - 15 2.0720535642022995e+00 -1.0069819281480463e+00 2.6083600468918844e+00 - 16 4.2902983639126537e+00 5.5131718679546795e+00 2.3830711385553280e-01 - 17 2.4096838033622459e+00 2.6710791048618789e+00 3.5085731540934209e+00 - 18 3.4514062725618015e+00 -4.1373868590762886e+00 4.2169294048595312e+00 - 19 -1.1264411792212099e+00 5.0227271243385347e+00 6.1237583999889607e+00 - 20 4.7393545880453329e+00 4.2216825100295452e+00 -8.2318896574215081e+00 - 21 5.0316022185802045e-01 -3.3658905024666987e+00 -3.4562503451177298e+00 - 22 1.9368078287723918e+00 2.3534799016713426e+00 1.9729696376413666e+00 - 23 3.2400632484576661e+00 9.3259676426325444e-01 4.6157700185053541e+00 - 24 -4.6586992607556210e+00 1.1241261874328348e-01 -3.9896118917888690e+00 - 25 -8.9349626587186393e+00 2.4768648221903695e+00 3.7112080381606569e+00 - 26 1.1679346190142463e+00 -6.0828712249034158e+00 3.8801942263557465e-01 - 27 2.1417538088342263e+00 -9.0746081465677486e-01 3.4626716637488029e+00 - 28 -5.4328133673274284e+00 3.4793352823397115e+00 2.2408588660642268e+00 - 29 -7.5599171237192415e+00 -1.4574882072609379e+00 -3.9594670101361755e+00 - 30 3.1095531392911402e-01 1.2978745340983431e+00 1.5451191860370526e+00 - 31 3.8408681082369638e+00 2.2573010571848813e+00 -1.3280944539185844e+00 - 32 3.6805155767070339e+00 7.5369556779361924e-01 -9.7447904413958231e-01 + 1 -6.3264957631043668e+00 -5.5616677894844813e+00 5.2377447488028963e+00 + 2 2.5207850475887850e+00 3.2933848159449859e+00 5.1315455663128340e-01 + 3 2.8750295592286625e+00 -8.0138261672438134e+00 4.4151844065328429e+00 + 4 -4.9347930073892989e+00 2.4187029727401019e+00 -7.4775999883115363e-01 + 5 -8.7447100707946799e+00 6.8206185721270369e+00 -1.5619840332009798e+00 + 6 -5.8305897654694814e+00 2.7780662546795476e+00 1.4267264531175377e+00 + 7 1.7896384256206381e+00 6.8972435833503596e+00 -1.1125436080011231e+00 + 8 5.4120919552199327e+00 -3.5503131760790568e-01 -3.1974520611780971e-01 + 9 5.7884847630254344e+00 -6.1307120766105445e+00 -6.1495320493381138e+00 + 10 4.8185686480859236e+00 -4.4762773417587027e+00 5.2481373174384505e+00 + 11 4.2135475251874048e+00 -8.2387623515652439e+00 -3.1188179923143239e-01 + 12 4.7124325385207309e+00 3.1606948907632155e+00 -2.2565255296795415e+00 + 13 5.9544243762048774e+00 2.6912324208789991e+00 3.5211152379641941e+00 + 14 3.5207571976492793e+00 7.5181873269499699e-01 -4.3880524213969254e+00 + 15 -2.5875210973741130e+00 -8.9010778414559244e+00 8.4782734849777330e-01 + 16 -6.3773119007243251e+00 -3.4198420030599590e+00 5.6623606538922155e-01 + 17 6.8009728867260311e+00 6.4705188296770970e+00 4.8651207615988579e+00 + 18 -2.4123426888532529e-01 1.3897011792888114e+00 -2.0573303133668390e+00 + 19 5.6650470032526172e+00 -1.3761862890657235e+00 -5.2514202264245942e+00 + 20 -5.8202993837499326e+00 3.8258925741304184e+00 -4.3814889474065488e+00 + 21 -6.2459886187466838e+00 6.6655141349421223e+00 1.0181439506082162e+00 + 22 8.8992182249454221e-01 -4.3434133291733037e+00 -1.8142856053326917e-01 + 23 5.2543116984459735e+00 4.2325076585148267e+00 2.8058589684741122e+00 + 24 -5.5017381721075953e+00 2.9208729455984078e-01 1.7043880822112661e-01 + 25 4.0233655159335449e+00 -4.8288192300109944e+00 7.2771341503708964e+00 + 26 6.0207373247735951e-02 -3.4632929070626806e-01 4.4482803799386108e+00 + 27 -8.0508089814358330e-01 4.2342919914977442e+00 -1.7273706488490252e+00 + 28 -8.4918987161213995e+00 -3.7305556342399067e+00 -3.8360170295313090e+00 + 29 4.2080753755658806e+00 6.1482903636161481e+00 6.4803422163866947e-02 + 30 -5.6440104734860830e-01 3.3297479003899353e+00 -3.8787255178702176e+00 + 31 1.6129614203717417e+00 -4.4315790587258928e+00 -8.6310081340658296e-01 + 32 -7.6485604224103430e+00 -1.2462344490875306e+00 -3.4009998725644341e+00 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml b/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml index a805de7029..c079e4abef 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff-acks2.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: slow, unstable -date_generated: Fri Mar 18 22:17:38 2022 +date_generated: Fri Apr 25 19:44:14 2025 epsilon: 7.5e-09 skip_tests: omp prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | displace_atoms all random 0.1 0.1 0.1 623426 mass 1 1.0 mass 2 16.0 - set type 1 type/fraction 2 0.333333333 998877 + set type 1 type/ratio 2 0.333333333 998877 set type 1 charge 0.01 set type 2 charge -0.02 velocity all create 100 4534624 loop geom @@ -33,142 +33,142 @@ pair_coeff: ! | * * acks2_ff.water H O extract: ! "" natoms: 64 -init_vdwl: -1315.674323112547 -init_coul: -251.82520863781136 -init_stress: ! |- - -3.6252552634610828e+02 -5.3642230434120154e+02 -3.2708821928047780e+02 -1.8739746594217769e+02 -7.3161204592256269e+01 2.8634078571435208e+02 +init_vdwl: -1457.0978882394859 +init_coul: -281.97769540108135 +init_stress: ! |2- + 5.5981958709126445e+01 -7.4730321625851434e+02 -9.5456144343352128e+02 6.5107808661942670e+02 1.5562407617027011e+02 -3.0475709482474264e+02 init_forces: ! |2 - 1 -6.0368026319723334e-01 2.0490281105259228e+01 1.6647650192347417e+01 - 2 -1.2754929753354234e+02 -6.4506752258382122e+01 -3.3765604494033497e+01 - 3 -1.6340638699344356e+02 -1.3395894275690221e+01 4.5681732661684634e+01 - 4 -7.8669167893588874e+00 1.2975050709670612e+02 -1.6422202215654622e+02 - 5 4.8895820330576854e+01 1.3583526793691512e+00 1.9082272968463208e+01 - 6 -3.2215264081964378e+01 -1.0434725558607181e+02 -2.9321909814724460e+01 - 7 5.4687724085035022e+01 -4.0913013646280532e+01 -5.8353503975056263e+01 - 8 -3.4374174863798075e+01 -5.4582176195261731e+01 3.9162148827896928e+01 - 9 1.0602587269872288e+02 2.4517278481186896e+01 -8.2926292024679384e+01 - 10 8.3433641774183407e+00 5.5896742851927943e+00 1.5837228744594089e+01 - 11 8.6970191683169129e-01 -5.8991563586004766e+01 -3.9877951865531514e+01 - 12 4.4192147377965640e+01 1.4903341767625852e+02 -1.6218738820961934e+02 - 13 -1.4906540622411359e+02 -1.1995838086244909e+02 1.0915797981155475e+02 - 14 -1.6840918424164060e+00 -2.4233434851726496e+01 -2.4811432594512457e+01 - 15 2.8916293161615947e+01 9.0150734924389738e+01 5.2202528013163860e+00 - 16 1.1511072719898208e+02 2.8294359308952078e+01 6.7521666411546050e+01 - 17 4.4257318509790032e+01 4.2406840066994654e+01 7.2795080140788869e+01 - 18 -7.8848831769041654e+00 -1.3664596390464098e+02 6.1096090529306210e+01 - 19 1.0685808811691570e+02 2.0723200091856646e+02 4.4123703145411937e+01 - 20 -4.9541566255910801e+01 -8.1664859207282433e+01 -2.8988844313476029e+01 - 21 -1.3289404043644814e+02 3.7558583406053941e+01 -1.0102514473761195e+02 - 22 1.3266704365038908e+02 -1.1782659065785897e+02 5.4036616742189061e+01 - 23 5.1406826507867223e+01 -2.3873203577956730e+01 -4.7707992031474234e+01 - 24 3.2375661774934940e+01 8.7122524112522697e+01 6.6904840845090462e+01 - 25 -7.6343346793073664e+01 1.4702372716259256e+02 -6.9634429545332381e+01 - 26 1.3052482043203892e+02 -7.6695952258764208e+01 -6.8144336882390846e+01 - 27 6.2295256121926471e+01 5.0088548894938114e+01 3.3482187356569881e+01 - 28 8.1224991426364603e+00 -3.8522307644648572e+00 -1.5910295435991639e+01 - 29 -1.1706768240874355e+02 7.1116543353676818e+01 1.0440306737798934e+02 - 30 2.6668840384251649e+01 -1.1285667565996226e+02 1.8633172811903989e+01 - 31 -1.0847355678967622e+02 1.0996595842176285e+02 -5.5616286819737311e+01 - 32 -1.4603119222198394e+01 4.2813303531510641e+01 3.8845175595330531e+01 - 33 -2.9522724683327016e+01 -7.8740075435568029e+00 4.0691892849331758e+01 - 34 9.4358005650347835e+01 5.1578786222111148e+01 4.9877606247135589e+00 - 35 1.3878162567772878e+02 1.3002914177061694e+01 -3.9262700309813695e+01 - 36 -5.4285827285916746e+01 -8.6097074177259515e+01 6.3573072280656689e+01 - 37 4.8502367882367082e+01 7.1094372467616139e+01 -6.4170831125588478e+01 - 38 -1.2068302892901679e+02 -2.3921624494724261e+02 1.0639158013338042e+02 - 39 4.7483616773316575e+00 1.1147185880245857e+01 9.5242536579092729e+01 - 40 -4.2106716215321676e+00 2.8923432927375652e+00 -3.8847459020822011e+00 - 41 -1.2582176673926276e+02 -1.1458507442867946e+02 1.5633840332025807e+01 - 42 4.3299931174721657e+01 -1.1323682562113908e+02 -1.2149036854079469e+02 - 43 -6.1455115997918410e+00 -1.1290761800594723e+01 1.3010001275147209e+02 - 44 2.3306479216564437e+01 -7.2456643864466814e+00 -2.1408875167843437e+01 - 45 -2.2863088909548026e+01 1.3728756890564244e+02 1.7762941813938326e+02 - 46 4.5766906983362070e+01 -6.7544686606488227e+01 3.7528326465811972e+01 - 47 -3.2700893536527538e+01 -5.3002101899722568e+01 -5.4679464444461047e+01 - 48 2.0328502419620253e+02 -3.0317080221415955e+02 -1.7385360483394399e+02 - 49 -6.8067873927712014e+01 3.9176176719051938e+01 3.5930432225694524e+01 - 50 8.9353300749969620e+00 1.4185265656301095e+02 1.5862761052665803e+02 - 51 3.5555345549045576e+01 -3.2564032333055451e+01 1.4767362774338116e+02 - 52 -1.0584640086659454e+02 1.0312320105331467e+02 -5.0601860204759092e+01 - 53 -3.3989834984567189e+01 9.4952795280998046e+01 -2.0788572482728082e+02 - 54 3.1058276661162811e+01 -5.5555419356318176e+01 4.7450764854663454e+01 - 55 8.0177808131181635e+01 -1.2981809858342260e+02 5.6596128355738813e+01 - 56 -1.2360446884305839e+01 -2.8595758498921775e+01 -5.6863776538006210e+00 - 57 4.5290996755611062e+01 1.5919693798996261e+02 9.9974122525349088e+01 - 58 -2.8760688272312827e+01 6.0635769417465973e+01 -2.3798836888216112e+01 - 59 -2.2258012527336544e+02 1.3033272684720029e+02 1.4065235688360508e+02 - 60 -2.7053865051546467e+01 1.4140560377577856e+02 -1.2766809320306062e+02 - 61 -6.3880582214376446e+01 -1.6334264803781880e+02 -1.2897713279774706e+02 - 62 6.9329936622438794e+01 6.4175913906891367e+01 -9.4055044619463501e+01 - 63 1.1093666087049192e+02 -1.8945409551622827e+01 -7.9769943280840309e+01 - 64 -3.2043182569612747e+00 6.0969354223353436e-02 8.3726884654705636e+00 -run_vdwl: -1315.67379925802 -run_coul: -251.82538792482003 -run_stress: ! |- - -3.6252933525980472e+02 -5.3641871517019717e+02 -3.2709175284369167e+02 -1.8738655015007816e+02 -7.3168357673524369e+01 2.8633318365887470e+02 + 1 -7.6177162883484016e+01 -7.7195147301727317e+01 -7.3262199800416532e+00 + 2 -5.9731707381411340e+01 -6.7062243475801893e+01 -1.7033998538459464e+01 + 3 4.6465437513555429e+01 -1.3640697850622286e+02 -1.2876791151469615e+00 + 4 7.4281075548153396e+01 1.5831711028545200e+02 -2.0193157625370819e+02 + 5 -1.2227535037260040e+02 -3.3654751631118934e+01 -1.1980064014575561e+02 + 6 4.2036860047046346e+01 1.7717796831515667e+01 -1.1844149758190115e+02 + 7 1.1029932623134289e+02 -3.1953775595924231e+01 -2.5669354710371071e+00 + 8 -5.7278923269788827e+01 -1.3563397821898912e+01 9.4607848186894358e+01 + 9 -1.0547120295179512e+01 9.3861266321626431e+00 -2.1590654528792181e+00 + 10 4.9524895115786578e+01 -7.3299291792634258e-01 -4.6056189108839163e+01 + 11 7.4477305052681668e+00 -4.1215569829308699e+01 -6.3237327552865644e+01 + 12 4.4736809077027488e+01 1.4902252026127658e+02 -1.6398562763795897e+02 + 13 -1.7931798972348790e+02 -2.9420413816107050e+01 2.2145219195778327e+02 + 14 3.5218106008862897e+01 -4.6707600515158560e+01 -1.3266867399430811e+02 + 15 3.6300287577747007e+01 1.2676937856168740e+02 4.2899398124780816e+01 + 16 8.4129690904157552e+00 7.7347469165415205e+01 1.4941123661000810e+02 + 17 -3.3993676322610185e+00 4.1980211202695896e+00 2.8940348230365753e+00 + 18 -1.3814281295768138e+00 -3.5037215767464374e+01 1.1272735418047713e+01 + 19 1.9180669400145248e+01 1.6493290427416781e+02 9.1368714784910253e+01 + 20 -5.8455932164523681e+01 -3.6646810913745522e+00 -7.0598656237470905e+01 + 21 5.1947950387375343e+01 -7.5085265344504663e+01 5.3264183207703297e+01 + 22 4.9331469867375191e+01 -2.1544002296838922e+01 1.1559752936400687e+02 + 23 -4.3687256961192176e+01 -1.0194829112087425e+02 -8.4818629670667121e+01 + 24 2.5309285322198436e+00 1.0730057829632794e+02 8.1364345899054797e+01 + 25 -5.4489703324957013e+01 1.5155800924225142e+02 -8.2921144069221555e+01 + 26 1.3153340629013786e+02 -7.9345782827942344e+01 -6.8449563861425290e+01 + 27 1.8438127438975698e+01 3.7067138166687890e+01 -2.4624130078078711e+01 + 28 -4.8582809822689690e+00 -2.2242916161884242e+01 -1.0183010048266662e+02 + 29 -1.1131836330129600e+02 6.5859110093656696e+01 1.0308747992227001e+02 + 30 -8.1849705664141901e+00 -1.6692534641344730e+02 2.5126743152434742e+01 + 31 -6.4477772092144306e+01 -1.6423739348743467e+01 -2.8600930895458145e+01 + 32 -1.2144789840532958e+01 4.0324464194251981e+01 4.6320719236389785e+01 + 33 2.8112611472586324e+00 -7.0842027141641623e+01 -4.2150852729788566e+00 + 34 5.3538088184201342e+01 -1.8043801387246756e+01 2.3507210675938087e+01 + 35 -1.3145222251111542e+02 1.3190322919979988e+02 1.4151287973420344e+02 + 36 -5.5683417150747239e+01 -6.3746543117450024e+01 -1.7128608064903627e+01 + 37 -2.4802504889693786e+01 9.7708014689826186e+00 2.5405766216718998e+01 + 38 -2.4408294620587156e+00 -1.1054217780573634e+02 7.8941769554249603e+01 + 39 3.9513848186183644e+01 -2.0421909909848502e+01 2.4473694801089891e+01 + 40 2.2810485260928313e+00 5.0260376275762351e+00 -2.2833942628869668e+00 + 41 -6.8695112353475324e+01 -5.5387509593729852e+01 -5.1456249134202132e+01 + 42 4.3615345323684373e+01 -1.1794771153958600e+02 -1.2316272102208355e+02 + 43 1.2410355196612475e+02 1.5419108102589684e+02 6.8164279771563443e+01 + 44 7.4716188218592507e+01 -8.2462624647227685e+01 -3.5648087693976471e+01 + 45 -2.1381502055268591e+01 1.4305428532776065e+02 1.8308491282486889e+02 + 46 4.4644620393393609e+01 -6.1800665971169593e+01 3.4182346143758117e+01 + 47 4.7727888029675981e+01 -3.2717876160480273e+01 1.1114532492761837e+01 + 48 -5.1602511722010767e+01 8.0888719179670446e+01 -7.9910458841361569e+00 + 49 -3.1650831137360171e+00 -2.2619730851627661e+01 2.3770689022734757e+01 + 50 -7.2378264322910752e+01 1.0155962062622534e+01 1.9087771624310329e+02 + 51 2.7345742827030609e+01 -3.6354045227602946e+01 1.6016770356227559e+02 + 52 -1.0807332536174142e+02 9.8140083006105442e+01 -5.3416344813519878e+01 + 53 -7.8590207743292098e+01 1.4844806420553134e+01 -2.1481313134714640e+02 + 54 1.6264628612067323e+01 3.3853684101750900e+01 8.7251208688635813e+01 + 55 1.9999527863180916e+01 -1.5787938551302835e+02 9.8553162919712477e+01 + 56 1.1776603175815038e+02 -1.4146787745742026e+01 -1.2902359896040022e+02 + 57 1.1000661502016431e+01 4.9853758714666860e+01 4.2722764614798116e+01 + 58 -1.3446216939142334e+02 -6.4024318227690102e+01 8.3220606177818013e+01 + 59 5.7503734372169937e+01 -5.2943831719656075e+01 -4.1293876185252635e+01 + 60 -2.9840496443584666e+01 1.2011435649698353e+02 -1.2229117383313545e+02 + 61 3.2515954392156935e+01 -1.2623056833002887e+02 -6.1860396181581514e+01 + 62 1.3256924313275961e+01 6.0275058757535284e+01 2.6028589355326559e+01 + 63 1.2042843217755897e+02 1.6385951842325287e+01 -9.8259460013122364e+01 + 64 7.3574239017927297e+01 6.9983184316409179e+01 -4.0465234689661571e+01 +run_vdwl: -1457.1003641133227 +run_coul: -281.9780684337918 +run_stress: ! |2- + 5.6017821076766680e+01 -7.4728343454749336e+02 -9.5453454108072799e+02 6.5108728197560856e+02 1.5558641781547578e+02 -3.0475804856244207e+02 run_forces: ! |2 - 1 -6.0427779703512252e-01 2.0490756272412511e+01 1.6647493421616424e+01 - 2 -1.2754841307685804e+02 -6.4508077454175094e+01 -3.3763524679658680e+01 - 3 -1.6340651846845867e+02 -1.3399328724256982e+01 4.5679725510421832e+01 - 4 -7.8684594311176888e+00 1.2975107988543994e+02 -1.6422243689311080e+02 - 5 4.8894979857641701e+01 1.3587905179520945e+00 1.9080723746040558e+01 - 6 -3.2215908697921762e+01 -1.0434604335770943e+02 -2.9323571125825332e+01 - 7 5.4688956076284285e+01 -4.0913951081108415e+01 -5.8353333114689789e+01 - 8 -3.4374795730683481e+01 -5.4582565197183818e+01 3.9161685070849273e+01 - 9 1.0602750268492444e+02 2.4518806007662270e+01 -8.2928224031342211e+01 - 10 8.3448765452309477e+00 5.5864371171692877e+00 1.5832573244721663e+01 - 11 8.7180631758889338e-01 -5.8993323881745852e+01 -3.9884267152772146e+01 - 12 4.4192365852491093e+01 1.4903429729452878e+02 -1.6219206584779144e+02 - 13 -1.4906927452343609e+02 -1.1995874777506886e+02 1.0916264378106862e+02 - 14 -1.6828280298940346e+00 -2.4232825100885098e+01 -2.4809440148861022e+01 - 15 2.8919110783949506e+01 9.0150838201145390e+01 5.2192985984410605e+00 - 16 1.1511130216873305e+02 2.8295862401014123e+01 6.7521012199711848e+01 - 17 4.4256599992638108e+01 4.2406484713402243e+01 7.2795346026494585e+01 - 18 -7.8848008384430539e+00 -1.3664634639099947e+02 6.1095756801901778e+01 - 19 1.0685903199732036e+02 2.0723222350990062e+02 4.4124512300846625e+01 - 20 -4.9546858835888280e+01 -8.1659242595103365e+01 -2.8998046004100793e+01 - 21 -1.3289412244333695e+02 3.7556999753658936e+01 -1.0102308037606839e+02 - 22 1.3266755025284439e+02 -1.1782686540823109e+02 5.4036617937847950e+01 - 23 5.1405885909264370e+01 -2.3873943214452368e+01 -4.7708844268632390e+01 - 24 3.2373370471025311e+01 8.7125637769180997e+01 6.6908838382987426e+01 - 25 -7.6344016160229543e+01 1.4702421930244424e+02 -6.9633680565374561e+01 - 26 1.3052497933070995e+02 -7.6696652508392248e+01 -6.8143428678963431e+01 - 27 6.2295886509448287e+01 5.0089165913467404e+01 3.3482708752529071e+01 - 28 8.1190626623672930e+00 -3.8523237731699100e+00 -1.5914254496826086e+01 - 29 -1.1706723439423264e+02 7.1117332937318878e+01 1.0440215382628243e+02 - 30 2.6668772919869735e+01 -1.1285862351526934e+02 1.8633778385120795e+01 - 31 -1.0847428154293594e+02 1.0996582278921207e+02 -5.5617081154122886e+01 - 32 -1.4603651831782168e+01 4.2816664679363605e+01 3.8851610792442827e+01 - 33 -2.9519680131282556e+01 -7.8704683492661038e+00 4.0688290026701139e+01 - 34 9.4358200696983218e+01 5.1577940760121209e+01 4.9883503942774707e+00 - 35 1.3878184805054929e+02 1.3003401024036332e+01 -3.9263099864942795e+01 - 36 -5.4286023648995418e+01 -8.6096314968346391e+01 6.3573237117647288e+01 - 37 4.8502340503125687e+01 7.1092674139180076e+01 -6.4168924259418233e+01 - 38 -1.2068169270717785e+02 -2.3921584479385240e+02 1.0639203784120866e+02 - 39 4.7485776026051134e+00 1.1146641081166505e+01 9.5242256869966710e+01 - 40 -4.2108599786857281e+00 2.8922835579037174e+00 -3.8847867381075893e+00 - 41 -1.2582200605811198e+02 -1.1458626320666988e+02 1.5634634730428779e+01 - 42 4.3298811262104522e+01 -1.1323825959325698e+02 -1.2148951307455756e+02 - 43 -6.1445155174009782e+00 -1.1289851749911026e+01 1.3009938178494568e+02 - 44 2.3304112892355839e+01 -7.2440612084043048e+00 -2.1407988900122422e+01 - 45 -2.2861406128358620e+01 1.3728999900873370e+02 1.7762870040423550e+02 - 46 4.5768613429530582e+01 -6.7545097081622060e+01 3.7529079576855302e+01 - 47 -3.2701732666230441e+01 -5.3001652471881712e+01 -5.4679269668412701e+01 - 48 2.0328585168114128e+02 -3.0317396492632025e+02 -1.7385434764992988e+02 - 49 -6.8067688050655704e+01 3.9177224134041339e+01 3.5930110316890534e+01 - 50 8.9327213346898784e+00 1.4185280256429226e+02 1.5862826485318126e+02 - 51 3.5558738484365847e+01 -3.2568300408296722e+01 1.4767879474338230e+02 - 52 -1.0584741977885415e+02 1.0312398264883062e+02 -5.0601463470758752e+01 - 53 -3.3993088743715688e+01 9.4956349730017635e+01 -2.0789074418856003e+02 - 54 3.1064727433155586e+01 -5.5559689516396887e+01 4.7459382807520264e+01 - 55 8.0177886992157639e+01 -1.2981800298783250e+02 5.6595487267941550e+01 - 56 -1.2360401264720954e+01 -2.8594676148725313e+01 -5.6861881216640269e+00 - 57 4.5290952881935198e+01 1.5919551554155248e+02 9.9973551309890851e+01 - 58 -2.8760842576207317e+01 6.0634819158216445e+01 -2.3799874997643553e+01 - 59 -2.2258027485314665e+02 1.3033435434930627e+02 1.4065348873603111e+02 - 60 -2.7053242000018251e+01 1.4140890863215688e+02 -1.2766702327645474e+02 - 61 -6.3880091105988988e+01 -1.6334055272776587e+02 -1.2897680193744620e+02 - 62 6.9331724159145509e+01 6.4173290531939443e+01 -9.4050280780932169e+01 - 63 1.1093735613545634e+02 -1.8944653137110969e+01 -7.9770997264690990e+01 - 64 -3.2080968598290363e+00 5.4907326642554835e-02 8.3750551713524164e+00 + 1 -7.6176528321577990e+01 -7.7193697650476508e+01 -7.3236119076773303e+00 + 2 -5.9731521596683123e+01 -6.7061810936603507e+01 -1.7032926681258331e+01 + 3 4.6464902807680701e+01 -1.3640807247285727e+02 -1.2892419904141255e+00 + 4 7.4280927657086607e+01 1.5831848159634873e+02 -2.0193304400901224e+02 + 5 -1.2227698614070928e+02 -3.3654819927720489e+01 -1.1980288922886288e+02 + 6 4.2035680014991534e+01 1.7718238736656112e+01 -1.1844057309120632e+02 + 7 1.1030043939783029e+02 -3.1953899885505283e+01 -2.5666088762215344e+00 + 8 -5.7278925777651317e+01 -1.3563628736290003e+01 9.4607701580344170e+01 + 9 -1.0546579531567678e+01 9.3865577703762657e+00 -2.1593415762271917e+00 + 10 4.9525758206975382e+01 -7.3464558869788721e-01 -4.6057737393867754e+01 + 11 7.4492667880882264e+00 -4.1216940310356321e+01 -6.3241720792464790e+01 + 12 4.4735066623897808e+01 1.4902170851280485e+02 -1.6398860141535354e+02 + 13 -1.7931958356131602e+02 -2.9420797423736264e+01 2.2145271185124639e+02 + 14 3.5218534434760649e+01 -4.6706713528442812e+01 -1.3266859641008907e+02 + 15 3.6301260062500717e+01 1.2676791459674502e+02 4.2897502196397568e+01 + 16 8.4139326184035568e+00 7.7349198697276265e+01 1.4941174902861161e+02 + 17 -3.3994722202780321e+00 4.1978960514370787e+00 2.8940210960272190e+00 + 18 -1.3814641046968010e+00 -3.5037100497396139e+01 1.1272793764719914e+01 + 19 1.9182309547693606e+01 1.6493245779140221e+02 9.1368676245274770e+01 + 20 -5.8460991808659571e+01 -3.6594333611337095e+00 -7.0607880623009251e+01 + 21 5.1947075895217885e+01 -7.5086212106193415e+01 5.3265070107703409e+01 + 22 4.9333180283877645e+01 -2.1545495893528436e+01 1.1559709202686679e+02 + 23 -4.3688038326959429e+01 -1.0194841238599992e+02 -8.4818752954385729e+01 + 24 2.5303181431758812e+00 1.0730250906543465e+02 8.1365722099475988e+01 + 25 -5.4491238169998113e+01 1.5155984320072449e+02 -8.2921040915088042e+01 + 26 1.3153345432488717e+02 -7.9346411316342383e+01 -6.8448656391241883e+01 + 27 1.8438419927963118e+01 3.7065674801770648e+01 -2.4623887634108794e+01 + 28 -4.8616813403418240e+00 -2.2244055395872088e+01 -1.0183494321984668e+02 + 29 -1.1131759582619462e+02 6.5859820808151795e+01 1.0308648341429061e+02 + 30 -8.1843525675250053e+00 -1.6692671782720984e+02 2.5126965839018364e+01 + 31 -6.4477796823725129e+01 -1.6423803627138096e+01 -2.8600832470753215e+01 + 32 -1.2144699344276514e+01 4.0327987636311050e+01 4.6326570274752370e+01 + 33 2.8117580282259569e+00 -7.0841625802938509e+01 -4.2162287253397093e+00 + 34 5.3537863072282860e+01 -1.8044131206781927e+01 2.3506803235701753e+01 + 35 -1.3144847185186094e+02 1.3190319482527150e+02 1.4151112959958670e+02 + 36 -5.5682016684372954e+01 -6.3743841510610075e+01 -1.7131100017320957e+01 + 37 -2.4804206447924770e+01 9.7686065236891366e+00 2.5410228864805042e+01 + 38 -2.4404062590757789e+00 -1.1054300109959247e+02 7.8943460931965660e+01 + 39 3.9513844362209056e+01 -2.0422290238351351e+01 2.4473257940679112e+01 + 40 2.2808066767847568e+00 5.0259378480376506e+00 -2.2834196699761833e+00 + 41 -6.8695097273380114e+01 -5.5387949067360637e+01 -5.1456492321780686e+01 + 42 4.3614230324561476e+01 -1.1794918802960962e+02 -1.2316191104808772e+02 + 43 1.2410556382683072e+02 1.5419248393283905e+02 6.8163881032618278e+01 + 44 7.4714691880550774e+01 -8.2462161349280052e+01 -3.5646094112545221e+01 + 45 -2.1379719370091596e+01 1.4305685230544594e+02 1.8308423010050225e+02 + 46 4.4645875944160984e+01 -6.1800666458606216e+01 3.4183089365778351e+01 + 47 4.7727392422655726e+01 -3.2717212570553031e+01 1.1114956120886475e+01 + 48 -5.1606105858794500e+01 8.0854914538139823e+01 -7.9810201577063520e+00 + 49 -3.1362888199874774e+00 -2.2603768766632598e+01 2.3747573427021813e+01 + 50 -7.2380107171375272e+01 1.0155460497771998e+01 1.9087780133747341e+02 + 51 2.7349117891256796e+01 -3.6358827531920447e+01 1.6017317887786595e+02 + 52 -1.0807560922756177e+02 9.8142148985581755e+01 -5.3416845524164771e+01 + 53 -7.8594686660565699e+01 1.4847619046541915e+01 -2.1481917725901840e+02 + 54 1.6270626078454669e+01 3.3848716907900915e+01 8.7258351473752299e+01 + 55 2.0001178773512052e+01 -1.5788106239566429e+02 9.8553268898950421e+01 + 56 1.1776178598679007e+02 -1.4146138861571533e+01 -1.2902168255324324e+02 + 57 1.1001310418260427e+01 4.9854837951899043e+01 4.2723283838995378e+01 + 58 -1.3446293297451928e+02 -6.4026291305518242e+01 8.3220782826351268e+01 + 59 5.7480820920591668e+01 -5.2925006378894786e+01 -4.1280109521363109e+01 + 60 -2.9840109219026999e+01 1.2011707295697519e+02 -1.2229117904432887e+02 + 61 3.2515409458936332e+01 -1.2623339975548464e+02 -6.1862716855047999e+01 + 62 1.3257579453923380e+01 6.0276007594923783e+01 2.6035906927294644e+01 + 63 1.2042921036627455e+02 1.6386089692909756e+01 -9.8260527172630532e+01 + 64 7.3573620659404568e+01 6.9980998327504309e+01 -4.0464852761315164e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml b/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml index 00524a037d..d74acc22c5 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff-qtpie.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 29 Aug 2024 +lammps_version: 2 Apr 2025 tags: slow, unstable -date_generated: Fri Nov 15 13:22:57 2024 +date_generated: Fri Apr 25 19:44:15 2025 epsilon: 2e-10 skip_tests: kokkos_omp prerequisites: ! | @@ -22,8 +22,8 @@ pre_commands: ! | mass 1 1.0 mass 2 12.0 mass 3 16.0 - set type 1 type/fraction 2 0.5 998877 - set type 2 type/fraction 3 0.5 887766 + set type 1 type/ratio 2 0.5 998877 + set type 2 type/ratio 3 0.5 887766 set type 1 charge 0.00 set type 2 charge 0.01 set type 3 charge -0.01 @@ -36,142 +36,142 @@ pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -3296.3503506624793 -init_coul: -268.63677950571287 +init_vdwl: -3524.467708131265 +init_coul: -302.02867099328955 init_stress: ! |- - -1.0115766891336298e+03 -1.2088131753999489e+03 -8.2791874767348656e+02 -2.3899453277851464e+02 1.9901049958702231e+02 -6.5090424115686358e+02 + -1.0677680011562386e+03 -6.1615943556624609e+02 -1.1905725617489425e+03 -1.7617473887006850e+02 -1.7857285218511987e+02 -4.5170589942510560e+02 init_forces: ! |2 - 1 -8.6436073169042203e+01 -2.4400814471028966e+01 1.0905778351740135e+02 - 2 -1.0912360851161381e+02 -1.7785390915789219e+02 -2.2174396944101937e+02 - 3 -1.7205686042941795e+02 1.8323463801374010e+02 1.3330073949860362e+01 - 4 3.5074883698050790e+01 -5.4658573523678996e+01 8.8946983653047340e+01 - 5 1.8037666038924445e+02 1.5258130212658664e+01 -8.1473951707266664e+01 - 6 1.3687016587487102e+02 -2.9993359047535205e+02 3.1610843762057812e+01 - 7 -5.3040478511967407e+01 -1.2906564054460426e+02 -1.6364626011721845e+02 - 8 -1.5098093043741406e+02 4.1651970160590970e+01 1.5340103366817354e+02 - 9 1.7340129928959293e+01 8.8054766076132950e+01 2.4310262794648661e+01 - 10 8.3732473664111822e+01 1.4163802420547773e+02 1.2086953212785974e+02 - 11 -4.2433035390388874e+01 6.5812517236648006e+01 1.3461956725415703e+02 - 12 -9.6266601388748128e+01 -2.5379001755851835e+01 7.7659919394842500e+00 - 13 -6.5393078499150931e+01 -4.9454699468880946e+01 -3.8254305288102898e+01 - 14 8.2607951316806449e+01 -6.8984439086417567e+01 -9.2468559306204710e+01 - 15 -6.6187434150450684e+01 2.1289685674401704e+02 7.8580288164394176e+01 - 16 1.8897543273751987e+02 5.3397684583320228e+01 6.3460608305143431e+01 - 17 1.4554759813765031e+02 -3.9370375612854211e+01 -9.7056561289015221e+01 - 18 -4.5104710861585204e+01 -1.8896520586433442e+02 1.1164278206176432e+02 - 19 2.6896526778434691e+02 3.6948523216182610e+02 -3.3986956263391414e+02 - 20 -7.5462858727084978e+01 -8.6024949892680127e+01 -4.6529428267542672e-01 - 21 -7.3095936427312608e+01 -5.7463824581552551e+01 -1.1787940398446622e+02 - 22 1.5517223233172072e+02 -1.2975611741340879e+02 8.0541352960578152e+01 - 23 7.9113780255105098e+01 -1.3159747874504722e+01 -2.5876270623789040e+01 - 24 -2.0721357932150298e+02 2.1426998940883044e+02 -1.2404916276617425e+02 - 25 -1.1375172605965993e+02 1.9145650691697844e+02 -8.3221527665980318e+01 - 26 2.8613004810395404e+02 -2.1814761019305757e+02 2.3221022419460809e+02 - 27 -6.4957092731555079e+01 6.8730894090822545e+01 1.7879679090575814e+02 - 28 -3.5591147454501368e+00 3.8919120211497962e+01 3.2899891202019738e+01 - 29 -7.1006654872719238e+01 3.4395396834237154e+01 2.5490290273424105e+01 - 30 -1.7028325267142560e+02 -1.9865767607180553e+02 -1.1525322636144483e+02 - 31 -1.4030343203666592e+02 1.6505252880438636e+02 -1.2536824728321348e+02 - 32 2.8083940532792852e+01 -5.9613080258602423e+01 -1.7589243121123940e+02 - 33 -6.0786787938223988e+01 -6.2914083425882403e+01 6.1724187337270543e+01 - 34 -2.2381506031982109e+01 1.0258481649700494e+02 -7.2581426601092289e+01 - 35 2.6826897000164860e+02 -2.1830766483611634e+02 1.2929910897210587e+02 - 36 1.0617788606545010e+02 1.8844480945948908e+02 -1.9952637621677195e+02 - 37 -1.8500771626166176e+02 1.2691494490100189e+02 -6.1799194093629900e+01 - 38 -2.9568079732966703e+02 1.0466330586524869e+02 1.5539102098367138e+02 - 39 9.0313772894092821e+01 -5.7763893527493209e+01 2.4405485803219346e+01 - 40 2.0368385039374967e+01 -1.0212243725288241e+02 5.8977256992383225e+01 - 41 -5.4472403223120203e+01 1.3664060494004097e+01 -7.0498722233072925e+01 - 42 -1.0110613172512772e+02 3.7733470557342038e+01 -7.1384152705391784e+01 - 43 2.2496360806160274e+02 9.5374846176895645e+01 1.2314600313131321e+02 - 44 8.9930414141415653e+01 -9.8548000406723986e+01 -8.6016793720029909e+01 - 45 1.8042451487789609e+01 1.2291681595021672e+02 4.8750513798444771e+01 - 46 1.4360528923605511e+01 -2.8393705665522205e+01 2.5000665776800748e+01 - 47 3.3430180733495789e+01 -1.9134003719608592e+02 -6.9378872162649785e+01 - 48 6.5977481507414737e+01 -2.0569144157798024e+02 -2.3305633430859448e+01 - 49 -3.6805309882726834e+02 -2.5080697208449138e+01 1.0725330582435194e+02 - 50 3.3568380074196661e+01 -7.2887959381521910e+01 8.4247363622347109e+01 - 51 1.3937571489940009e+02 -1.0241922204671263e+02 1.5837793886668237e+02 - 52 -1.1015736921987484e+02 1.2143381508599626e+02 -1.3301954780997897e+02 - 53 -5.5053511032747757e+01 3.3318719859853354e+02 -5.4695756604566270e-02 - 54 -9.3809048702850468e+00 6.3003589530582012e+01 1.8485428176102951e+02 - 55 1.1268442794862931e+02 -1.7912573126673601e+02 7.6216834182693233e+01 - 56 -4.5797371929680743e+01 -1.3685285921363297e+02 4.1670118112644616e+01 - 57 9.5486141883804535e+01 7.3675172824019725e+01 -6.4017779318177091e+01 - 58 -2.6940387352055815e+01 -9.1882719416077734e+00 -1.6496876672222488e+01 - 59 -6.1110604213739784e+01 1.0339564891274583e+02 8.0387279300896552e+01 - 60 -1.3438307290047304e+01 6.2821560489016619e+01 -1.4960910695536089e+02 - 61 -3.7436807177941901e+01 -1.0060440409572418e+02 -7.2129567761936670e+01 - 62 1.5913069360497735e+01 -7.4587444709681003e+00 2.7411930168532034e+01 - 63 1.3132402121938716e+02 -1.2633666867998599e+02 -5.9237822651056007e+01 - 64 1.0528416436964088e+02 1.1185676743727093e+02 7.6927706681792429e+01 -run_vdwl: -3296.3468820327244 -run_coul: -268.63661874354375 + 1 -2.0620959441247908e+01 -2.8820697332017556e+02 -2.2672399163125171e+01 + 2 -1.0143214986836621e+02 -1.1388888472939423e+02 2.6976278445027866e+01 + 3 1.3200209041777239e+02 -1.9229725450665623e+02 1.2156996007594074e+01 + 4 2.0117456013337167e+02 2.6993439521718074e+02 -1.2177483997484373e+02 + 5 -7.0613645562227973e+01 1.0169064941958388e+02 -1.6196514543964639e+02 + 6 2.9254020469168566e+01 -1.0681325418135543e+00 -3.3004963577390396e+02 + 7 1.8383017268349626e+01 7.4508685004647774e+01 -2.4201433524953433e+01 + 8 -8.9287854764551895e+01 -2.5221797575260734e+02 1.5632912766957011e+02 + 9 3.9335344160688607e+01 7.5096170126298418e+01 1.5025410464937369e+01 + 10 -7.4911455278656376e+01 1.4391585030247472e+02 -1.2206228064953469e+02 + 11 -1.3605771407361792e+02 -2.1395437458065782e+01 2.1182451909806093e+02 + 12 7.2436563248604546e+00 4.9985274924019016e+01 -4.8173955249544264e+01 + 13 -1.4916539378304651e+02 -9.2940738255062357e+01 1.5478786471062540e+02 + 14 1.1263124700442397e+02 -3.3887875510225548e+01 -1.7753169053988785e+02 + 15 1.8566765441562720e+02 2.9764642587420281e+02 1.4648720459865453e+02 + 16 -4.1719345644124999e+01 2.1050447920028992e+02 3.1083159066139285e+02 + 17 -9.4939057796424242e-01 3.6270926356471329e+00 -3.0883544949280273e-01 + 18 2.1493923809700422e+02 -7.9532815943619809e+01 3.0314973901264869e+02 + 19 1.0450363109018831e+02 4.7677578944765038e+01 1.6060453455517435e+02 + 20 2.1792950295237222e+02 2.1056398668705992e+02 2.3923339990913369e+01 + 21 -7.0833919885146514e+01 7.7663746981350990e+00 -2.1060247706354090e+01 + 22 -9.5095641688017693e+01 -1.0164293884351461e+02 -9.5863024194781062e+01 + 23 -4.3991733080580879e+01 -8.7008725533293287e+01 -5.4474443405182612e+01 + 24 -2.8332161992557019e+02 -9.1422758888084203e+01 -1.7042049773773934e+02 + 25 1.1546060908292963e+01 2.1134756931338156e+01 -1.5600294223720454e+01 + 26 1.1604826069147266e+02 -9.5482106462301601e+00 1.7382925013910683e+01 + 27 8.5044269668709077e+01 -1.4245835020832160e+02 -8.1189563842171026e+01 + 28 -6.2479048245475745e+01 3.4208558231288784e+01 -4.6356158748953625e+01 + 29 -3.6707763380941536e+01 5.0767305936872660e+01 3.4417237037613006e+01 + 30 5.3531414889082988e+01 -2.5505328713201666e+02 4.5094984039863505e+01 + 31 -3.3749555026087613e+01 4.0520098482615308e-01 -1.2106570621042097e+02 + 32 -3.9359841302357175e+01 -6.1695026591294024e+01 -3.5416228135732860e+02 + 33 -5.3388574562146850e+01 -6.3064852045276183e+01 2.8340819195147269e+01 + 34 -1.2028142459854104e+02 7.2783446406787490e+01 -1.0017337870166038e+02 + 35 -2.0567326503259327e+01 1.9869838732230622e+02 7.5521512380911517e+01 + 36 3.3639010843760801e+01 -9.6421735346037053e+01 2.7400932475575381e+01 + 37 -7.5179943330972741e+00 -1.1033252673548633e+02 5.3559951330175366e+01 + 38 2.3286244499276044e+01 -7.3463188419963174e+01 6.6182447168628897e+01 + 39 -3.3320862645702015e+01 -1.3471954634728107e+01 2.5325665262547030e+00 + 40 1.0689831101269210e+02 -8.6544264485675811e+01 7.0815526811396666e+01 + 41 -1.3222606346238800e+02 -7.5380891874053503e+01 -3.0201592658127851e+02 + 42 -2.1543672053752701e+02 1.3827107189845060e+02 2.6204932498415221e+01 + 43 1.0644037184805237e+02 -1.1798237729343127e+01 2.2444023167465221e+02 + 44 7.3103033510634674e+01 -1.0639712819453868e+02 -6.4419147487218368e+01 + 45 8.2019510204274837e+01 9.9222282390238078e+01 7.4226544045696841e+01 + 46 2.6987179031291557e+00 6.0802477196864082e+00 -4.9100091961696268e+00 + 47 2.8060825057219741e+01 1.1645088806762989e+00 -8.5131949431915629e+01 + 48 -8.2804153670198829e+01 -1.4102266794745205e+02 2.0928003362143991e+02 + 49 -5.8165751380485538e+01 7.1330406506573993e+01 2.0325948979895443e+01 + 50 -7.9182424014766921e+00 -5.3639453283318922e+01 2.6215229340126523e+01 + 51 1.4066074277422871e+02 -1.3190799504213703e+02 2.0633057080670960e+02 + 52 -6.0060026930167240e+01 6.7184030194633877e+01 -3.7907087826974696e+01 + 53 -1.9789824336934311e+02 2.0812513407927150e+02 -1.6924813728849244e+02 + 54 1.9885644502802471e+01 1.1514324865917428e+02 2.1269155236109296e+02 + 55 -4.3262163181707002e+01 5.7523860412128187e+01 -2.6464001108644055e+01 + 56 -2.8973157120632052e+01 1.0281104241979246e+01 -2.6817430892783690e+01 + 57 -8.7934843787397465e+00 1.3173082680339673e+01 1.9345405233509329e+01 + 58 8.0495212929136898e+01 -1.0419672936043632e+02 2.6807051843775821e+02 + 59 9.2413481196715452e+01 -5.4137976500950742e+01 -5.5624152326260770e+01 + 60 -9.1628091969569567e+01 1.8229641035036332e+02 -1.2725695337114045e+02 + 61 9.5375196712380139e-01 -2.6509107887231515e+01 -5.0642587295592669e+00 + 62 4.7810636503807565e+01 -2.0874245815617986e+01 -1.3364749086442728e+02 + 63 6.9126087516350310e+01 2.4753540632189853e+01 -6.8251279263374286e+01 + 64 7.5813761812372633e+01 1.2796479366919257e+02 -5.4612837931889025e+01 +run_vdwl: -3524.4640957298143 +run_coul: -302.02896022824405 run_stress: ! |- - -1.0114879837664473e+03 -1.2087430287015966e+03 -8.2783958944769802e+02 -2.3908224870200783e+02 1.9895929948999779e+02 -6.5093393277361292e+02 + -1.0678086159604027e+03 -6.1620656749535647e+02 -1.1906153739938306e+03 -1.7617109472932708e+02 -1.7857773773097585e+02 -4.5169485167493195e+02 run_forces: ! |2 - 1 -8.6437645087040067e+01 -2.4400562180957351e+01 1.0906066254553539e+02 - 2 -1.0912275665241053e+02 -1.7786252590616218e+02 -2.2173930761917526e+02 - 3 -1.7205763157578019e+02 1.8323288100722453e+02 1.3329429976402201e+01 - 4 3.5076762638460409e+01 -5.4659870228622246e+01 8.8949923949362500e+01 - 5 1.8037851727311079e+02 1.5258819157296621e+01 -8.1471824505046186e+01 - 6 1.3693758232722558e+02 -2.9996076554788232e+02 3.1544103577304767e+01 - 7 -5.3040940882157734e+01 -1.2906590024224255e+02 -1.6365072194268137e+02 - 8 -1.5098199162393547e+02 4.1652246872814757e+01 1.5340185354669362e+02 - 9 1.7338937131206805e+01 8.8052623671376480e+01 2.4311464733168261e+01 - 10 8.3731216255426517e+01 1.4163544349001512e+02 1.2086773194932107e+02 - 11 -4.2431645167783358e+01 6.5809284879610303e+01 1.3461058585127651e+02 - 12 -9.6268502974108401e+01 -2.5380508031933715e+01 7.7613919613213387e+00 - 13 -6.5394480799184038e+01 -4.9454690134569510e+01 -3.8251921533789378e+01 - 14 8.2607648143581144e+01 -6.8981518310093449e+01 -9.2465919648906919e+01 - 15 -6.6184911564685194e+01 2.1289827790699042e+02 7.8579764996083128e+01 - 16 1.8897212100631526e+02 5.3401557991805042e+01 6.3454265397142500e+01 - 17 1.4554879673647156e+02 -3.9369818695332363e+01 -9.7059433050641857e+01 - 18 -4.5104364652465691e+01 -1.8896630466961875e+02 1.1164283921546559e+02 - 19 2.6896544439509694e+02 3.6948380976016932e+02 -3.3986849873937234e+02 - 20 -7.5474652635907873e+01 -8.6015213272245504e+01 -4.8259676480768809e-01 - 21 -7.3095940937548960e+01 -5.7464788467137694e+01 -1.1787855066724634e+02 - 22 1.5517351794732136e+02 -1.2975689546114967e+02 8.0540859481818742e+01 - 23 7.9115865455975012e+01 -1.3150472802357561e+01 -2.5876503956346053e+01 - 24 -2.0722276003223385e+02 2.1428270990874043e+02 -1.2405357611708547e+02 - 25 -1.1375429959489580e+02 1.9146061264686494e+02 -8.3222256641294663e+01 - 26 2.8613970510624404e+02 -2.1815485596507278e+02 2.3221441960858138e+02 - 27 -6.4953545994003377e+01 6.8732504333245046e+01 1.7879777515705371e+02 - 28 -3.5609706858523174e+00 3.8914845051174211e+01 3.2895014258375397e+01 - 29 -7.1006962970615220e+01 3.4395946962585107e+01 2.5490302918559674e+01 - 30 -1.7028397298399719e+02 -1.9865780309887722e+02 -1.1525330878428163e+02 - 31 -1.4030595583104076e+02 1.6505149109610096e+02 -1.2536961295119134e+02 - 32 2.8084746879715730e+01 -5.9606705649399501e+01 -1.7588207877218977e+02 - 33 -6.0786242960574022e+01 -6.2913885176828828e+01 6.1724433850103161e+01 - 34 -2.2381168039316268e+01 1.0258398798459802e+02 -7.2580420302975753e+01 - 35 2.6830990081622787e+02 -2.1835204404249015e+02 1.2931018843147504e+02 - 36 1.0617963217845744e+02 1.8843796909876622e+02 -1.9952176446060335e+02 - 37 -1.8503402227685811e+02 1.2695504061699209e+02 -6.1823411355500355e+01 - 38 -2.9568399770704622e+02 1.0466662636959578e+02 1.5539009610875451e+02 - 39 9.0314570392701199e+01 -5.7764115394488343e+01 2.4405095735494033e+01 - 40 2.0369156227530599e+01 -1.0212187254286960e+02 5.8977622919450276e+01 - 41 -5.4470510869266015e+01 1.3662227244573693e+01 -7.0490380604491506e+01 - 42 -1.0110530047858049e+02 3.7731202989968210e+01 -7.1386374496910719e+01 - 43 2.2495960799582232e+02 9.5372714343303912e+01 1.2314241456430595e+02 - 44 8.9934882887196963e+01 -9.8543527246862695e+01 -8.6022172212180365e+01 - 45 1.8033520031139599e+01 1.2290938260195539e+02 4.8756688104804162e+01 - 46 1.4361839506594013e+01 -2.8393917262125949e+01 2.5000422631182474e+01 - 47 3.3429877782459641e+01 -1.9133540583883391e+02 -6.9377262749149708e+01 - 48 6.5990004078562464e+01 -2.0569338794984392e+02 -2.3314637198125183e+01 - 49 -3.6809322631363733e+02 -2.5025981981696823e+01 1.0734144239898833e+02 - 50 3.3569219922950602e+01 -7.2886698417202680e+01 8.4245785013977056e+01 - 51 1.3937840161131851e+02 -1.0242257034381630e+02 1.5838167570232804e+02 - 52 -1.1015632519571759e+02 1.2143397586854937e+02 -1.3302347496060023e+02 - 53 -5.5089426238213143e+01 3.3316281975316286e+02 -7.4271240172002706e-02 - 54 -9.3687742955109137e+00 6.2990741970756417e+01 1.8487238090605700e+02 - 55 1.1268678311310606e+02 -1.7912913164827566e+02 7.6217416717889748e+01 - 56 -4.5806154616486943e+01 -1.3684453580988600e+02 4.1676759373489766e+01 - 57 9.5485704227965911e+01 7.3672454441368231e+01 -6.4019152364471736e+01 - 58 -2.6940596532815384e+01 -9.1863734979434319e+00 -1.6497051289566816e+01 - 59 -6.1118963218972965e+01 1.0340128135495597e+02 8.0392569432165885e+01 - 60 -1.3439582130914836e+01 6.2820376074347955e+01 -1.4960914576393716e+02 - 61 -3.7435810911347573e+01 -1.0060262070691427e+02 -7.2129466739698870e+01 - 62 1.5913491338811767e+01 -7.4593609075659995e+00 2.7412825126279046e+01 - 63 1.3132146995609114e+02 -1.2633718643910591e+02 -5.9233334916534574e+01 - 64 1.0528511106781713e+02 1.1185795842149707e+02 7.6928226208764087e+01 + 1 -2.0622413686833745e+01 -2.8820193576283310e+02 -2.2669097668917704e+01 + 2 -1.0143680571866237e+02 -1.1388898266692752e+02 2.6969970002799620e+01 + 3 1.3200126141356955e+02 -1.9229335937496592e+02 1.2158093514201409e+01 + 4 2.0117398288215077e+02 2.6993216982997205e+02 -1.2177474343956361e+02 + 5 -7.0615035474971251e+01 1.0169131653918561e+02 -1.6196678297598515e+02 + 6 2.9261975376719349e+01 -1.0739277626797730e+00 -3.3005756770459016e+02 + 7 1.8385842816822446e+01 7.4507384367651582e+01 -2.4197811014932395e+01 + 8 -8.9300961154990887e+01 -2.5221227087947298e+02 1.5634150185788340e+02 + 9 3.9333930830650580e+01 7.5096001349764478e+01 1.5023461366250395e+01 + 10 -7.4911063466758378e+01 1.4391362380338688e+02 -1.2206330707255816e+02 + 11 -1.3605857752294764e+02 -2.1399862278838057e+01 2.1181472601820093e+02 + 12 7.2425912065508244e+00 4.9984134471503289e+01 -4.8176283210023207e+01 + 13 -1.4916452466572150e+02 -9.2937737119382078e+01 1.5478918319527253e+02 + 14 1.1263465068882249e+02 -3.3885963290803552e+01 -1.7753423731301649e+02 + 15 1.8566932132690619e+02 2.9765483580371711e+02 1.4649031820628238e+02 + 16 -4.1715800177771158e+01 2.1050932448552717e+02 3.1084567403208797e+02 + 17 -9.4919218632035018e-01 3.6273002216368431e+00 -3.0877324947577961e-01 + 18 2.1491828392980855e+02 -7.9512210714683889e+01 3.0313283672174407e+02 + 19 1.0451277723711183e+02 4.7675231224717088e+01 1.6060316497541899e+02 + 20 2.1792991487735500e+02 2.1056622173951092e+02 2.3922781575954716e+01 + 21 -7.0832382152983271e+01 7.7611344470322496e+00 -2.1056558340803331e+01 + 22 -9.5094074816669135e+01 -1.0164265138147877e+02 -9.5864063596900237e+01 + 23 -4.3994493569698548e+01 -8.7012066058884116e+01 -5.4477161477025973e+01 + 24 -2.8332035774767724e+02 -9.1429312116758425e+01 -1.7042298971171533e+02 + 25 1.1546641426471593e+01 2.1135160840748341e+01 -1.5600913686144443e+01 + 26 1.1606254494660804e+02 -9.5607187419221251e+00 1.7371133367525132e+01 + 27 8.5043493707906606e+01 -1.4246476176452398e+02 -8.1192577764446639e+01 + 28 -6.2489536495260026e+01 3.4197613265923124e+01 -4.6355381286373934e+01 + 29 -3.6716422047413765e+01 5.0785105132017371e+01 3.4422839917837486e+01 + 30 5.3525854234502305e+01 -2.5504756808810566e+02 4.5091745592977979e+01 + 31 -3.3750216875432066e+01 4.0418627433195509e-01 -1.2106654374560462e+02 + 32 -3.9333921368952133e+01 -6.1710564980917923e+01 -3.5413813229581325e+02 + 33 -5.3391470920757719e+01 -6.3067045367496107e+01 2.8344004655424090e+01 + 34 -1.2028087422513809e+02 7.2783166248276061e+01 -1.0017285218897264e+02 + 35 -2.0560641347323656e+01 1.9869830660170942e+02 7.5519877404977706e+01 + 36 3.3638401074129831e+01 -9.6409737349492033e+01 2.7393776356194348e+01 + 37 -7.5204256499413837e+00 -1.1033417457119046e+02 5.3562405818863390e+01 + 38 2.3286139705692303e+01 -7.3462281540250984e+01 6.6182227309247821e+01 + 39 -3.3321649217589851e+01 -1.3473484935365008e+01 2.5320134490100896e+00 + 40 1.0689809306395027e+02 -8.6544933735419448e+01 7.0815683184515578e+01 + 41 -1.3222516776597374e+02 -7.5378122475487800e+01 -3.0201303317934122e+02 + 42 -2.1543667703024141e+02 1.3826863815831948e+02 2.6203245455058457e+01 + 43 1.0642550314114835e+02 -1.1787437062227083e+01 2.2445263610680527e+02 + 44 7.3104497221046472e+01 -1.0639906215733886e+02 -6.4418867717943854e+01 + 45 8.2015470823910036e+01 9.9219440214538878e+01 7.4225442313100984e+01 + 46 2.6988443815519489e+00 6.0801874561435199e+00 -4.9102291548068910e+00 + 47 2.8060668892889129e+01 1.1641136347786447e+00 -8.5131625509811840e+01 + 48 -8.2803344820086608e+01 -1.4102644306116639e+02 2.0927820887654869e+02 + 49 -5.8166600997434671e+01 7.1331771679688856e+01 2.0328122653374038e+01 + 50 -7.9172443931147543e+00 -5.3645033979653363e+01 2.6216988704380775e+01 + 51 1.4066529234354221e+02 -1.3191411335238999e+02 2.0633721647249638e+02 + 52 -6.0059684325586218e+01 6.7183993649086290e+01 -3.7905682410037535e+01 + 53 -1.9790191349595023e+02 2.0813139238151655e+02 -1.6925450810318728e+02 + 54 1.9889101907392639e+01 1.1514089230191617e+02 2.1269139330650734e+02 + 55 -4.3262618959665872e+01 5.7525150214720547e+01 -2.6464750475919018e+01 + 56 -2.8974397980366522e+01 1.0284367748153825e+01 -2.6815477033117585e+01 + 57 -8.7930764191870630e+00 1.3174201848663994e+01 1.9345998043400019e+01 + 58 8.0492196620158239e+01 -1.0419591141572728e+02 2.6806891754760034e+02 + 59 9.2411004115920647e+01 -5.4135175827278175e+01 -5.5622747906537299e+01 + 60 -9.1608544923073055e+01 1.8230848861644441e+02 -1.2723866663727966e+02 + 61 9.5327444014250529e-01 -2.6510578831570086e+01 -5.0649683499479599e+00 + 62 4.7811170825553390e+01 -2.0874556679482026e+01 -1.3364552038007898e+02 + 63 6.9125960676341720e+01 2.4754062628588279e+01 -6.8251054194541709e+01 + 64 7.5811425465168369e+01 1.2794306814554174e+02 -5.4642679206528861e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff.yaml b/unittest/force-styles/tests/atomic-pair-reaxff.yaml index 1d540363bb..48cfabbd88 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 30 Jul 2021 +lammps_version: 2 Apr 2025 tags: slow, unstable -date_generated: Mon Aug 23 20:32:03 2021 +date_generated: Fri Apr 25 19:44:16 2025 epsilon: 2e-10 skip_tests: prerequisites: ! | @@ -22,8 +22,8 @@ pre_commands: ! | mass 1 1.0 mass 2 12.0 mass 3 16.0 - set type 1 type/fraction 2 0.5 998877 - set type 2 type/fraction 3 0.5 887766 + set type 1 type/ratio 2 0.5 998877 + set type 2 type/ratio 3 0.5 887766 set type 1 charge 0.00 set type 2 charge 0.01 set type 3 charge -0.01 @@ -36,142 +36,142 @@ pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -3296.3503506624793 -init_coul: -327.06551252279405 +init_vdwl: -3524.467708131265 +init_coul: -347.64664274403816 init_stress: ! |- - -1.0522112314759529e+03 -1.2629480788292253e+03 -8.6765541430727546e+02 -2.5149818635822436e+02 2.0624598409299585e+02 -6.4309968343216588e+02 + -1.1051529177610175e+03 -6.9898054108727558e+02 -1.2354119890986140e+03 -1.8088602511205445e+02 -1.6771232489482543e+02 -4.4506735206412708e+02 init_forces: ! |2 - 1 -8.8484559491557576e+01 -2.5824737864578474e+01 1.0916228789487663e+02 - 2 -1.1227736122976231e+02 -1.8092349731667568e+02 -2.2420586526896210e+02 - 3 -1.7210817575849001e+02 1.8292439782308699e+02 1.3552618819720600e+01 - 4 3.2997500231086512e+01 -5.1076027616186423e+01 9.0475628837094987e+01 - 5 1.8144778146274754e+02 1.6797701000586258e+01 -8.1725507301126484e+01 - 6 1.3634094180728138e+02 -3.0056789474000107e+02 2.9661495129806241e+01 - 7 -5.3287158661291443e+01 -1.2872927610192636e+02 -1.6347871108897522e+02 - 8 -1.5334883257588731e+02 4.0171483324130968e+01 1.5317461163041025e+02 - 9 1.8364155867633905e+01 8.1986572088188041e+01 2.8272397798080572e+01 - 10 8.4246730110712335e+01 1.4177487113456957e+02 1.2330079878579940e+02 - 11 -4.3218423112520789e+01 6.5551082199289695e+01 1.3464882148706644e+02 - 12 -9.7317470492933708e+01 -2.6234999414153897e+01 7.2277941881646690e+00 - 13 -6.3183329836754375e+01 -4.7368101002971763e+01 -3.7592654029315270e+01 - 14 7.8642975316486883e+01 -6.7997612991897341e+01 -9.9044775614594982e+01 - 15 -6.6373732796039107e+01 2.1787558547532043e+02 8.0103149369093344e+01 - 16 1.9216166082224314e+02 5.3228015320734926e+01 6.6260214054210081e+01 - 17 1.4496007689503062e+02 -3.9700923044583710e+01 -9.7503851828130095e+01 - 18 -4.4989550233790261e+01 -1.9360605894359642e+02 1.1274792197022478e+02 - 19 2.6657528138945804e+02 3.7189510796650745e+02 -3.3847307488287669e+02 - 20 -7.6341040242469091e+01 -8.8478925962202780e+01 1.3557778212056153e+00 - 21 -7.1188591900927420e+01 -5.1591439985137015e+01 -1.2279442803769207e+02 - 22 1.5504836733039960e+02 -1.3094504458746056e+02 8.1474408030760486e+01 - 23 7.8015302036862593e+01 -1.3272310040520148e+01 -2.2771427736544595e+01 - 24 -2.0546718065741135e+02 2.1611071031053424e+02 -1.2423208053538949e+02 - 25 -1.1402686646199029e+02 1.9100238121128146e+02 -8.3504908417580012e+01 - 26 2.8663576552098777e+02 -2.1773884754170624e+02 2.3144300100087486e+02 - 27 -6.3247409025611496e+01 6.9122196748086992e+01 1.8606936744368636e+02 - 28 -3.5426011055935565e+00 3.8764809029452159e+01 3.2874001946768921e+01 - 29 -7.1069178571876549e+01 3.5485903180427400e+01 2.7311648896320079e+01 - 30 -1.7036987830119909e+02 -1.9851827590031249e+02 -1.1511401829123544e+02 - 31 -1.3970409889743348e+02 1.6660943915628044e+02 -1.2913930522474664e+02 - 32 2.7179130444112555e+01 -6.0169059447629756e+01 -1.7669495182022018e+02 - 33 -6.2659679124099306e+01 -6.4422131921795099e+01 6.4150928205326267e+01 - 34 -2.2119065265693525e+01 1.0450386886830492e+02 -7.3998379587547646e+01 - 35 2.6982987783286018e+02 -2.1519317040003440e+02 1.3051628460669710e+02 - 36 1.0368628874516730e+02 1.8817377639779588e+02 -1.9748944223870336e+02 - 37 -1.8009522406837104e+02 1.2993653092243764e+02 -6.3523043394051243e+01 - 38 -2.9571205878460017e+02 1.0441609933482263e+02 1.5582204859042571e+02 - 39 8.7398805727029966e+01 -6.0025559644668739e+01 2.2209742009837775e+01 - 40 2.0540672579010657e+01 -1.0735874009092251e+02 5.8655918369892035e+01 - 41 -5.8895846271371049e+01 1.1852345624640863e+01 -6.6147257724571631e+01 - 42 -9.6895512314643625e+01 3.8928741136688558e+01 -7.5791929957114633e+01 - 43 2.2476051812062411e+02 9.5505204283237532e+01 1.2309042240718757e+02 - 44 8.9817373579488688e+01 -1.0616333580628816e+02 -8.6321519086255464e+01 - 45 1.7202629662584872e+01 1.2890307246697708e+02 5.2916171301067237e+01 - 46 1.3547783972602119e+01 -2.9276223331259811e+01 2.2187412696867874e+01 - 47 3.3389762514712146e+01 -1.9217585014965024e+02 -6.9956213241088335e+01 - 48 7.3631720332111271e+01 -2.0953007324688463e+02 -2.3183566221404689e+01 - 49 -3.7589944473227075e+02 -2.4083165714764295e+01 1.0770339502610511e+02 - 50 3.8603083564822633e+01 -7.3616481568798903e+01 9.0414065019643530e+01 - 51 1.3736420686706222e+02 -1.0204157331507010e+02 1.5813725581150817e+02 - 52 -1.0797257051087884e+02 1.1876975735151218e+02 -1.3295758126486228e+02 - 53 -5.3807540206295457e+01 3.3259462625854701e+02 -3.8426833262548143e-03 - 54 -1.0690184616186478e+01 6.2820270853646576e+01 1.8343158343321142e+02 - 55 1.1231900459987587e+02 -1.7906654831317175e+02 7.6533681064340797e+01 - 56 -4.1027190034915932e+01 -1.4085413191133824e+02 3.7483064289953155e+01 - 57 9.9904315214039713e+01 7.0938939080462006e+01 -6.8654961257660744e+01 - 58 -2.7563642882026500e+01 -6.7445498717147609e+00 -1.8442640542822897e+01 - 59 -6.6628933617874523e+01 1.0613066354110011e+02 8.7736153919830500e+01 - 60 -1.7748415247438214e+01 6.3757605316872365e+01 -1.5086907478326515e+02 - 61 -3.3560907195792048e+01 -1.0076987083174087e+02 -7.4536106106935421e+01 - 62 1.5883428926665001e+01 -5.8433760297910968e+00 2.8392494016034437e+01 - 63 1.3294494001298756e+02 -1.2724568063770263e+02 -6.4886848316805384e+01 - 64 1.0738157273930983e+02 1.2062173788161350e+02 7.4541400611711396e+01 -run_vdwl: -3296.346882377749 -run_coul: -327.06539950739005 + 1 -1.9975568051760412e+01 -2.9038675172531003e+02 -2.4262971074791462e+01 + 2 -1.0096684921630010e+02 -1.1446632411858079e+02 2.7107768487143847e+01 + 3 1.3570779596618439e+02 -1.9708962364052729e+02 9.1414372627491360e+00 + 4 2.0163792773517747e+02 2.6653872421153397e+02 -1.2060099790512635e+02 + 5 -7.1849159814107367e+01 1.0447379081880220e+02 -1.6169651782023271e+02 + 6 2.9518740900703023e+01 -3.0496184460881182e-01 -3.2988641889434297e+02 + 7 1.8870799339143939e+01 7.8648477976023386e+01 -2.2724554420015536e+01 + 8 -8.9147833235527372e+01 -2.5164010033629589e+02 1.5630382929054508e+02 + 9 3.9476418396821437e+01 7.8951585581059703e+01 1.3508270465626616e+01 + 10 -7.6070515048252517e+01 1.4252415664560507e+02 -1.2227741520157578e+02 + 11 -1.3561600551377734e+02 -2.0414301666419313e+01 2.1197081239383510e+02 + 12 5.8639561536393092e+00 4.3384249886639211e+01 -4.6636308382072912e+01 + 13 -1.4706349318651777e+02 -9.0541856209833853e+01 1.5355665947874766e+02 + 14 1.1456010048104200e+02 -3.3907083169921371e+01 -1.7984987197087892e+02 + 15 1.8628723453103606e+02 2.9761809716361819e+02 1.4663587778225698e+02 + 16 -4.3474707841850282e+01 2.1027305846250195e+02 3.1408997130695172e+02 + 17 -8.7927082509001686e-01 4.1409270081105003e+00 -1.3214993258501509e-01 + 18 2.1374422859345822e+02 -8.0390819928073299e+01 3.0355460568773526e+02 + 19 1.0447667769651265e+02 4.9027545225134503e+01 1.6082336119766290e+02 + 20 2.1546707348061216e+02 2.0808364634934694e+02 2.5287817794821166e+01 + 21 -6.9220962761164301e+01 1.0848607119360969e+01 -2.2899047529102550e+01 + 22 -9.5218047134255613e+01 -9.9708301270106006e+01 -9.6345985205443284e+01 + 23 -4.4622971249079583e+01 -8.7569925717409646e+01 -5.4631627217046329e+01 + 24 -2.8904031192988970e+02 -8.8657903574087513e+01 -1.7226320360835996e+02 + 25 8.2020312508743096e+00 2.4273149185030796e+01 -1.6293509333349135e+01 + 26 1.1621924932443470e+02 -9.0907387714265386e+00 1.7424074764366274e+01 + 27 8.5548460452066990e+01 -1.4248955254299497e+02 -8.3287702134164832e+01 + 28 -6.1916698232371544e+01 3.3745077030416155e+01 -4.5711781535375991e+01 + 29 -3.5953137924824553e+01 4.9903129984350983e+01 3.3629709007465983e+01 + 30 5.3875232342216194e+01 -2.5517985401025570e+02 4.4271734432007655e+01 + 31 -3.5706110116182941e+01 -7.0496219482866485e-01 -1.2152711141650634e+02 + 32 -3.7526691385220609e+01 -6.0032107112550875e+01 -3.5730869336525780e+02 + 33 -5.7424807380666927e+01 -6.7791879926396547e+01 2.7904266031968188e+01 + 34 -1.2191989751511039e+02 6.8647377200395567e+01 -1.0367659270795789e+02 + 35 -2.0904369548718478e+01 2.0449505803001421e+02 7.6200339736500283e+01 + 36 3.1473160714823244e+01 -1.0333653184727883e+02 2.6681713262895016e+01 + 37 -3.9158764049305681e+00 -1.0674654990056227e+02 5.4424182464753201e+01 + 38 2.3823784706344593e+01 -7.3607105690263211e+01 6.5169232769614410e+01 + 39 -3.3250767569145353e+01 -1.4166570800038185e+01 2.1824343009016967e+00 + 40 1.0600762780157599e+02 -8.7425218765159030e+01 7.1268662701326136e+01 + 41 -1.3046053875846781e+02 -7.8942090566175693e+01 -2.9611986340646689e+02 + 42 -2.1462667230741863e+02 1.3933158869996902e+02 2.5526136430522282e+01 + 43 1.0624349430036672e+02 -1.1444734415078624e+01 2.2668598482560085e+02 + 44 7.5251296888941511e+01 -1.0611422685798784e+02 -6.4239187905169743e+01 + 45 7.8629509748577135e+01 9.4867228448616018e+01 7.4435149525017408e+01 + 46 2.0400031644506162e+00 3.9539479722864503e+00 -4.0791732735874202e+00 + 47 2.5609470423889256e+01 6.3412090405657935e+00 -8.6487250654129099e+01 + 48 -8.6092982876776077e+01 -1.3802996303679203e+02 2.1311546448553420e+02 + 49 -5.9223694900023744e+01 7.0284185147645474e+01 2.3494049108909977e+01 + 50 -8.6786177835371312e+00 -5.2936415800052416e+01 2.6583304398904481e+01 + 51 1.3902569779996657e+02 -1.2818860749596266e+02 2.0593529384194059e+02 + 52 -6.1106838994128729e+01 6.7644782515915040e+01 -3.6422300435108937e+01 + 53 -1.9458684636773080e+02 2.0597114226480764e+02 -1.7148329972405375e+02 + 54 2.1789309799889502e+01 1.1706121801601151e+02 2.1816872944829174e+02 + 55 -3.8860777062183153e+01 5.0443615318388801e+01 -2.6469958938187222e+01 + 56 -2.5334105988626149e+01 1.5300050806811861e+01 -2.8930359024328855e+01 + 57 -8.5840513490010562e+00 1.3416779949428882e+01 1.9293105588299522e+01 + 58 8.0520347536272297e+01 -1.0356100998648992e+02 2.6833253509976424e+02 + 59 9.5223319862434280e+01 -5.5506040100726267e+01 -5.7717788619220578e+01 + 60 -9.1872524667975341e+01 1.8185806929800526e+02 -1.2676953988553160e+02 + 61 1.1257286974973608e+00 -2.5749832108472400e+01 -4.7742793375110688e+00 + 62 4.8013065364369837e+01 -2.2130646255793337e+01 -1.3288352300236190e+02 + 63 6.9406187868396032e+01 2.5581024929757916e+01 -6.8743421097531325e+01 + 64 7.7453771618895018e+01 1.3062109110030636e+02 -5.5574108415286226e+01 +run_vdwl: -3524.4640959547714 +run_coul: -347.6469056590895 run_stress: ! |- - -1.0521225462924954e+03 -1.2628780139889352e+03 -8.6757617693084944e+02 -2.5158592653603768e+02 2.0619472152426559e+02 -6.4312943979323916e+02 + -1.1051934290113556e+03 -6.9902768302472543e+02 -1.2354546810879856e+03 -1.8088245184954522e+02 -1.6771726437670378e+02 -4.4505643915126393e+02 run_forces: ! |2 - 1 -8.8486129396001218e+01 -2.5824483374473036e+01 1.0916517213634087e+02 - 2 -1.1227648453173404e+02 -1.8093214754186079e+02 -2.2420118533940303e+02 - 3 -1.7210894875994950e+02 1.8292263268451674e+02 1.3551979435685961e+01 - 4 3.2999405001010643e+01 -5.1077312719546981e+01 9.0478579144069144e+01 - 5 1.8144963583123194e+02 1.6798391906830979e+01 -8.1723378082075044e+01 - 6 1.3640835897739478e+02 -3.0059507544862021e+02 2.9594750460783587e+01 - 7 -5.3287619129788844e+01 -1.2872953167026776e+02 -1.6348317368624151e+02 - 8 -1.5334990952322408e+02 4.0171746946781077e+01 1.5317542403106148e+02 - 9 1.8362961213927182e+01 8.1984428717785391e+01 2.8273598253026371e+01 - 10 8.4245458094788816e+01 1.4177227430519349e+02 1.2329899933660948e+02 - 11 -4.3217035356344297e+01 6.5547850976510787e+01 1.3463983671946414e+02 - 12 -9.7319343004572985e+01 -2.6236499899232058e+01 7.2232061905743059e+00 - 13 -6.3184735475530928e+01 -4.7368090836538634e+01 -3.7590268076036381e+01 - 14 7.8642680121804801e+01 -6.7994653297646380e+01 -9.9042134233432975e+01 - 15 -6.6371195967082940e+01 2.1787700653339559e+02 8.0102624694807346e+01 - 16 1.9215832443892546e+02 5.3231888618094061e+01 6.6253846562694534e+01 - 17 1.4496126989603124e+02 -3.9700366098757236e+01 -9.7506725874209351e+01 - 18 -4.4989211400008664e+01 -1.9360716191976348e+02 1.1274798810455860e+02 - 19 2.6657546213782763e+02 3.7189369483257491e+02 -3.3847202166067979e+02 - 20 -7.6352829159880756e+01 -8.8469178952300979e+01 1.3384778817068639e+00 - 21 -7.1188597560667986e+01 -5.1592404200740368e+01 -1.2279357314243465e+02 - 22 1.5504965184741243e+02 -1.3094582932680512e+02 8.1473922626937920e+01 - 23 7.8017376001393998e+01 -1.3263023728606166e+01 -2.2771654676274697e+01 - 24 -2.0547634460482288e+02 2.1612342044348708e+02 -1.2423651650061697e+02 - 25 -1.1402944116091899e+02 1.9100648219391283e+02 -8.3505645569845328e+01 - 26 2.8664542299410522e+02 -2.1774609219880730e+02 2.3144720166994426e+02 - 27 -6.3243843868043413e+01 6.9123801262965202e+01 1.8607035157681540e+02 - 28 -3.5444604841998948e+00 3.8760531647714707e+01 3.2869123667281748e+01 - 29 -7.1069494158179182e+01 3.5486459158760333e+01 2.7311657876180927e+01 - 30 -1.7037059987992401e+02 -1.9851840131669331e+02 -1.1511410156295651e+02 - 31 -1.3970663440086025e+02 1.6660841802304981e+02 -1.2914070628112756e+02 - 32 2.7179939937138652e+01 -6.0162678551485335e+01 -1.7668459764117409e+02 - 33 -6.2659124615697849e+01 -6.4421915847941165e+01 6.4151176691093141e+01 - 34 -2.2118740875419427e+01 1.0450303589341122e+02 -7.3997370482692745e+01 - 35 2.6987081482968597e+02 -2.1523754104000369e+02 1.3052736086179686e+02 - 36 1.0368798521815600e+02 1.8816694370725310e+02 -1.9748485159172913e+02 - 37 -1.8012152564003969e+02 1.2997662140302771e+02 -6.3547259053586927e+01 - 38 -2.9571525697590874e+02 1.0441941743734624e+02 1.5582112543442304e+02 - 39 8.7399620724575939e+01 -6.0025787992410734e+01 2.2209357601282722e+01 - 40 2.0541458171950772e+01 -1.0735817059032904e+02 5.8656280350524156e+01 - 41 -5.8893965304898771e+01 1.1850504754315740e+01 -6.6138932259023889e+01 - 42 -9.6894702780993356e+01 3.8926449644174937e+01 -7.5794133002763360e+01 - 43 2.2475651760389374e+02 9.5503072846836602e+01 1.2308683766845417e+02 - 44 8.9821846939843198e+01 -1.0615882525757729e+02 -8.6326896770189904e+01 - 45 1.7193681344342732e+01 1.2889564928820488e+02 5.2922372841251153e+01 - 46 1.3549091739280518e+01 -2.9276447091757351e+01 2.2187152043657001e+01 - 47 3.3389460345593193e+01 -1.9217121673024394e+02 -6.9954603582952615e+01 - 48 7.3644268618851228e+01 -2.0953201921822756e+02 -2.3192562071413256e+01 - 49 -3.7593958318940844e+02 -2.4028439106860226e+01 1.0779151134440963e+02 - 50 3.8603926624327279e+01 -7.3615255297989023e+01 9.0412505212291279e+01 - 51 1.3736689552214187e+02 -1.0204490780187885e+02 1.5814099219652562e+02 - 52 -1.0797151154267804e+02 1.1876989597626228e+02 -1.3296150756377062e+02 - 53 -5.3843453069456608e+01 3.3257024143956778e+02 -2.3416395383755173e-02 - 54 -1.0678049522667131e+01 6.2807424617056697e+01 1.8344969045860529e+02 - 55 1.1232135576105669e+02 -1.7906994470561887e+02 7.6534265234548087e+01 - 56 -4.1035945990527210e+01 -1.4084577238065111e+02 3.7489705598247944e+01 - 57 9.9903872061945378e+01 7.0936213558024932e+01 -6.8656338416451703e+01 - 58 -2.7563844572723873e+01 -6.7426705471932156e+00 -1.8442803060444724e+01 - 59 -6.6637290503388542e+01 1.0613630918459900e+02 8.7741455199771877e+01 - 60 -1.7749706497436613e+01 6.3756413885635709e+01 -1.5086911682892671e+02 - 61 -3.3559889608750574e+01 -1.0076809277084796e+02 -7.4536003122045898e+01 - 62 1.5883833834736391e+01 -5.8439916924705493e+00 2.8393403991146428e+01 - 63 1.3294237052896685e+02 -1.2724619636183077e+02 -6.4882384014218175e+01 - 64 1.0738250214938935e+02 1.2062290362868680e+02 7.4541927445529822e+01 + 1 -1.9977010483019221e+01 -2.9038171013970594e+02 -2.4259656082134676e+01 + 2 -1.0097149749216432e+02 -1.1446642672560066e+02 2.7101459065380720e+01 + 3 1.3570698949039266e+02 -1.9708578479601681e+02 9.1425100257463647e+00 + 4 2.0163734607868707e+02 2.6653650914646994e+02 -1.2060089691478484e+02 + 5 -7.1850556088203177e+01 1.0447445551752133e+02 -1.6169815371127507e+02 + 6 2.9526696745172828e+01 -3.1076000900817746e-01 -3.2989434693384351e+02 + 7 1.8873627009132250e+01 7.8647167669896163e+01 -2.2720929675040324e+01 + 8 -8.9160937828200559e+01 -2.5163439814987024e+02 1.5631620260950146e+02 + 9 3.9474995990801965e+01 7.8951405257906288e+01 1.3506314219003313e+01 + 10 -7.6070120908803275e+01 1.4252192903413697e+02 -1.2227844070520359e+02 + 11 -1.3561687298245550e+02 -2.0418726530220557e+01 2.1196100799251738e+02 + 12 5.8628742032608496e+00 4.3383132316022348e+01 -4.6638659719270493e+01 + 13 -1.4706261843081018e+02 -9.0538818099265427e+01 1.5355803596959601e+02 + 14 1.1456350790792241e+02 -3.3905168449418817e+01 -1.7985242163893162e+02 + 15 1.8628890219020172e+02 2.9762650853491232e+02 1.4663899413905864e+02 + 16 -4.3471143338396317e+01 2.1027790494285489e+02 3.1410406726810282e+02 + 17 -8.7907556704342582e-01 4.1411279584482745e+00 -1.3207840837213625e-01 + 18 2.1372326891264137e+02 -8.0370205083914257e+01 3.0353770031394191e+02 + 19 1.0448582906834271e+02 4.9025196371450953e+01 1.6082199151138545e+02 + 20 2.1546742308718845e+02 2.0808590023733777e+02 2.5287257765884885e+01 + 21 -6.9219420141702287e+01 1.0843374761773998e+01 -2.2895372523312261e+01 + 22 -9.5216482085253091e+01 -9.9708016803148283e+01 -9.6347016261455764e+01 + 23 -4.4625731834303977e+01 -8.7573267296997486e+01 -5.4634346188036979e+01 + 24 -2.8903903801759202e+02 -8.8664401076301900e+01 -1.7226565940541965e+02 + 25 8.2026190164830766e+00 2.4273537174751986e+01 -1.6294101790961889e+01 + 26 1.1623353129280341e+02 -9.1032393510186296e+00 1.7412278274043320e+01 + 27 8.5547637218841658e+01 -1.4249597587216974e+02 -8.3290728723719667e+01 + 28 -6.1927190494214067e+01 3.3734134398601356e+01 -4.5711024060837133e+01 + 29 -3.5961793239096650e+01 4.9920927302013908e+01 3.3635315767105006e+01 + 30 5.3869672608903016e+01 -2.5517413442672074e+02 4.4268498925755729e+01 + 31 -3.5706763705920622e+01 -7.0598741671600285e-01 -1.2152795434282970e+02 + 32 -3.7500759039176550e+01 -6.0047656479514636e+01 -3.5728452301791907e+02 + 33 -5.7427697249306938e+01 -6.7794066316939762e+01 2.7907425859183743e+01 + 34 -1.2191934999027400e+02 6.8647103365074955e+01 -1.0367606340867090e+02 + 35 -2.0897696998933760e+01 2.0449496591808042e+02 7.6198711397567948e+01 + 36 3.1472546108811954e+01 -1.0332452658786762e+02 2.6674532495368144e+01 + 37 -3.9182891641487032e+00 -1.0674817278677520e+02 5.4426669939481926e+01 + 38 2.3823688143357899e+01 -7.3606214196437548e+01 6.5169031336415145e+01 + 39 -3.3251571306393650e+01 -1.4168113735891747e+01 2.1818673759649885e+00 + 40 1.0600741402342176e+02 -8.7425872749493209e+01 7.1268818931891602e+01 + 41 -1.3045962544388613e+02 -7.8939297254937330e+01 -2.9611694773461971e+02 + 42 -2.1462663012226312e+02 1.3932915585637832e+02 2.5524443635915620e+01 + 43 1.0622863748895415e+02 -1.1433924368638060e+01 2.2669839882863141e+02 + 44 7.5252755426328605e+01 -1.0611616477717826e+02 -6.4238915017796927e+01 + 45 7.8625452329720645e+01 9.4864369916197433e+01 7.4434029092446437e+01 + 46 2.0401255029749783e+00 3.9538817739954917e+00 -4.0794059101275346e+00 + 47 2.5609332133324486e+01 6.3407994179053233e+00 -8.6486927019356017e+01 + 48 -8.6092152175950361e+01 -1.3803372609296196e+02 2.1311367949744701e+02 + 49 -5.9224556772478813e+01 7.0285567397228959e+01 2.3496177930449171e+01 + 50 -8.6776170422791097e+00 -5.2941999924042754e+01 2.6585062491247836e+01 + 51 1.3903027347755059e+02 -1.2819473529437320e+02 2.0594196049301314e+02 + 52 -6.1106493704673852e+01 6.7644761959361361e+01 -3.6420900035118514e+01 + 53 -1.9459057020142512e+02 2.0597736590718341e+02 -1.7148969961644377e+02 + 54 2.1792803984424140e+01 1.1705885121838426e+02 2.1816856482598621e+02 + 55 -3.8861231168562227e+01 5.0444928368787494e+01 -2.6470728767199223e+01 + 56 -2.5335356680495913e+01 1.5303290166246819e+01 -2.8928404325531865e+01 + 57 -8.5836413332049499e+00 1.3417900731797710e+01 1.9293697283212957e+01 + 58 8.0517329219131028e+01 -1.0356019543155350e+02 2.6833094697087506e+02 + 59 9.5220847078450319e+01 -5.5503238673930525e+01 -5.7716388445197751e+01 + 60 -9.1852973158508874e+01 1.8187014698633817e+02 -1.2675125128824241e+02 + 61 1.1252548815549714e+00 -2.5751305851222188e+01 -4.7749990408133192e+00 + 62 4.8013582816585995e+01 -2.2130955596579319e+01 -1.3288156575406396e+02 + 63 6.9406071621032808e+01 2.5581535425999185e+01 -6.8743205502411129e+01 + 64 7.7451429132741524e+01 1.3059935131137277e+02 -5.5603940263179993e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml index 3ccc44fe4b..5945a2048b 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff_lgvdw.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 30 Jul 2021 +lammps_version: 2 Apr 2025 tags: slow, unstable -date_generated: Mon Aug 23 20:32:03 2021 +date_generated: Fri Apr 25 19:44:17 2025 epsilon: 1e-11 skip_tests: prerequisites: ! | @@ -22,8 +22,8 @@ pre_commands: ! | mass 1 1.0 mass 2 12.0 mass 3 16.0 - set type 1 type/fraction 2 0.5 998877 - set type 2 type/fraction 3 0.5 887766 + set type 1 type/ratio 2 0.5 998877 + set type 2 type/ratio 3 0.5 887766 set type 1 charge 0.00 set type 2 charge 0.01 set type 3 charge -0.01 @@ -36,142 +36,142 @@ pair_coeff: ! | * * ffield.reax.lg H C O extract: ! "" natoms: 64 -init_vdwl: -2454.3149508399256 -init_coul: -344.1380904917979 +init_vdwl: -2496.1125481542695 +init_coul: -368.6319568947483 init_stress: ! |2- - 4.8195587070292204e+03 4.4865954368949615e+03 3.2679588293062939e+03 -1.8469678134590631e+03 7.6556385424846258e+02 -4.9517278307742424e+02 + 1.6869392467797309e+03 2.8301133922869371e+03 1.4880170784765373e+03 3.6646386308977796e+01 1.6609470513189149e+02 3.2809443028426597e+02 init_forces: ! |2 - 1 -1.9811664067580159e+02 -1.5618748554879568e+02 -1.0716617094919916e+02 - 2 -4.1075966889759641e+01 -6.7708246449675286e+01 -4.2506724189242021e+01 - 3 3.1596544789529464e+01 8.8571277602644372e+01 1.4850846557451493e+02 - 4 1.7447178183928258e+02 3.2866954415452341e+01 -3.1178861314763104e+01 - 5 1.1873199005658965e+02 5.9095115842130738e+01 2.3739439807686244e+02 - 6 1.3052453610124785e+03 -4.4208109447712940e+02 -1.4245452171137986e+03 - 7 -8.7153363585940426e+01 -1.0895261162467359e+02 -3.5604687372058174e+02 - 8 -9.1047579854191298e+01 4.4450937169776779e+01 1.1879559986803987e+02 - 9 4.7456602925193152e+01 1.7227642506022326e+02 -1.4638226748448135e+01 - 10 6.3508986324759455e+01 4.8590610415561628e+01 1.1075535682642681e+01 - 11 -5.1919052217198583e+01 7.3820742396411902e+01 5.1375340691983368e+01 - 12 -1.0171933720752850e+02 -1.9845958414352879e+01 -1.7437665462751557e+01 - 13 -7.3048376131505080e+01 -4.5586627360378003e+01 2.8533062846208615e+01 - 14 8.6287140258370783e+01 -4.1664353236768285e+01 1.7094340432183635e+01 - 15 -3.5690271737605578e+01 1.2671711108383596e+02 4.5865072089126130e+01 - 16 1.0608232372370705e+02 3.5980003156299965e+01 1.8676593635939877e+01 - 17 2.3577630118103406e+02 -9.8579505236746954e+01 4.1005658232556264e+01 - 18 -2.0815299273687838e+01 -1.1578579968450181e+02 6.5566787154472564e+01 - 19 4.3265264076047565e+01 1.0913234729250026e+02 3.0900987497773781e+02 - 20 -1.0086773950039212e+02 7.4841212143884178e+01 -1.6547856280073174e+02 - 21 -8.5974538718180185e+01 -4.5982868874736553e+00 -7.3066508052443197e+01 - 22 1.3343492132570228e+02 -1.2211943449611935e+02 9.0328124087551714e+01 - 23 5.2985077374888242e+01 2.0040750326968670e+01 -9.0416982004676285e+00 - 24 -1.8957025969382900e+02 8.1671696884795594e+01 -1.2920621849543304e+01 - 25 -1.0067836293726943e+02 1.3220054680372061e+02 -4.8975895235994514e+01 - 26 2.1849478729429595e+02 -1.9386903120078873e+02 1.7116657218419905e+02 - 27 -3.7478069218093054e+01 3.0044804022729668e+01 9.3872627169946981e+01 - 28 9.9359193467603447e+01 -5.5156189036814197e+01 -3.1541196450035862e+01 - 29 -3.9530012231991577e+01 5.6689953230829516e+01 2.5358584427671591e+01 - 30 -9.7652246814367359e+01 -2.2271920242502677e+02 -1.4460601547049527e+02 - 31 -4.6192346966779660e+01 7.2790084189834801e+01 3.1159158603347159e+01 - 32 1.2013060628467482e+01 -3.4474347848945179e+01 -1.0622600014669111e+02 - 33 5.2551051115345899e+01 4.2704675585248992e+01 -3.0154896799402348e+01 - 34 1.6822864099952508e+02 -1.6889974455174411e-02 1.1832622696299923e+02 - 35 5.1185090023661138e+02 -1.3214021604987868e+03 1.1319907541000705e+03 - 36 -1.4331382529301770e+01 9.9702896436312813e+01 -1.3159358421899253e+02 - 37 -8.9317756897655170e+02 1.3544128453102769e+03 -7.5922493710251410e+02 - 38 -3.8384748878233495e+02 1.2143676601363995e+02 1.7580047976723245e+02 - 39 1.6381134310552315e+02 -1.2998574463953297e+01 -7.8542909545440992e+01 - 40 6.1412235617277069e+01 -2.0153615037329580e+01 4.3186957794586327e+01 - 41 1.3114484088385700e+01 1.7854214885807362e+00 3.3683765652623272e+01 - 42 -6.4838533708030567e+01 5.2662237041256951e+01 -6.8645855319467699e+01 - 43 2.0925885626251986e+02 8.2942516657430446e+01 1.1786724503954716e+02 - 44 -3.8463410277622316e+01 -7.5319916775507551e+01 -1.3445887472637637e+02 - 45 -3.4797907366083635e+01 7.6266761873331220e+01 4.3023416525121014e+01 - 46 2.3463432665038884e+01 -1.5313857576705434e+01 -3.8707451594217472e+00 - 47 -3.7271493199629667e+01 -5.4876511333919964e+01 -1.9275411927395901e+01 - 48 2.8275275023555270e+02 -1.7973942289882777e+02 -6.0167953907639026e+02 - 49 -2.0529905689923398e+03 -6.7838314309842900e+01 7.6230272883402529e+02 - 50 1.3292222637274469e+02 -9.8795036249083523e+01 9.9132259532944744e+01 - 51 2.6168921895029325e+02 -1.9761595427509093e+02 2.4062513751852859e+02 - 52 -1.2257063176561259e+02 1.3353869954874475e+02 -1.1598337420807951e+02 - 53 3.8021621191835879e+02 8.1199705966172496e+02 2.7057346247419935e+02 - 54 6.9440336670547481e+01 -1.1592524541887384e+02 2.2072297942372268e+02 - 55 8.7300666059627844e+01 -1.3907353173150571e+02 5.9541107879138451e+01 - 56 3.4771676857170365e+02 -2.4546959502036736e+02 -3.5077189358394327e+02 - 57 6.1706174952482442e+01 7.9893925286374284e+01 3.4373445887641214e+00 - 58 3.7240798760941850e+01 -1.2919400623491885e+02 3.9695110774076205e+01 - 59 -5.2076445103995263e+02 2.1046582886974133e+02 1.7083299176148688e+02 - 60 -7.8657547105874528e+01 -2.3005356890255712e+01 -1.2454833328198735e+02 - 61 -3.9633103573230692e+01 -5.5165443660352508e+01 -4.0780192434587299e+01 - 62 -1.8742346202622745e+01 -1.3844690899540067e+01 2.2586546200029356e+00 - 63 6.5150947885421942e+01 7.1009493033300245e+01 -8.4093092375004943e+01 - 64 4.0079516427458039e+01 9.6476598333943798e+01 9.1213458480139110e+01 -run_vdwl: -2454.3233099608155 -run_coul: -344.1379608070727 + 1 -5.9749219487541559e+01 -1.8981661209604346e+02 -1.7189084816914973e+02 + 2 -1.6018654381456199e+02 -4.7302744097785478e+01 1.4065596852580896e+01 + 3 1.0153905266173749e+02 -2.1318467682732856e+02 8.1755940380535122e+01 + 4 1.3163692345475039e+02 2.1223635271692950e+02 -2.1298596181039215e+02 + 5 -3.4330736402782861e+01 2.3574152237894998e+02 -2.7854592423182261e+01 + 6 2.5901524942915387e+02 -1.4854201722287974e+02 -6.1000126889202306e+02 + 7 -8.7701774448021510e+00 1.3375245176863316e+02 -8.8782307286439291e+01 + 8 -2.5152187689908476e+02 -1.8292646261584389e+02 2.3501661442309762e+02 + 9 2.3691792690519485e+01 2.1519129442142720e+01 -3.7699817692669548e+01 + 10 -1.0655036061489957e+02 1.9172583671761805e+02 -3.3034930218977884e+01 + 11 -2.8081756703548473e+02 -7.5258217736535869e+02 -4.8049817002835186e+02 + 12 4.0430818215145528e+01 1.0942910728602838e+02 -6.9823926175316046e+01 + 13 -7.2199265990878985e+01 -1.2310388843676040e+02 1.5875838913587515e+02 + 14 6.8750298337783875e+01 -6.7687776370731655e+01 -1.6646468503968771e+02 + 15 3.4048600054287755e+02 9.3352547524737338e+02 6.5067319356423059e+02 + 16 3.9038542316372267e+00 1.1101705229406329e+02 2.2089394416522637e+02 + 17 -2.6953978131891816e+00 1.2284105720684246e+00 -2.7874123752590441e+00 + 18 3.1958077222302319e+02 -2.9457031875442533e+02 3.5279607883501552e+02 + 19 2.0834519987612299e+02 -5.0800230906058530e+01 2.1689314079982597e+02 + 20 6.9132770199664904e+01 2.1579928780954157e+02 -8.6955867438840784e+01 + 21 -1.1929298155172674e+02 9.9308753705085291e+00 -2.1738150427238967e+01 + 22 -4.3449199612317102e+01 -2.2611834293199379e+02 -9.2147511761502244e+01 + 23 -2.9162353240421208e+01 -6.1456123952839924e+01 -5.2667536136461315e+01 + 24 -1.1096120573253947e+02 -7.2591228907611423e+01 -9.5256838651695901e+01 + 25 3.5599489266019184e+01 2.7081408393632938e+01 -2.6779602695972518e+01 + 26 9.2391066200784078e+00 -2.2968916453192801e+01 -1.5246445927226254e+01 + 27 8.4301377418295786e+01 -6.8245429573690117e+01 -3.6691125670706853e+01 + 28 -3.0350463100361214e+01 4.8447122051576521e+01 -7.6818914831685285e+00 + 29 6.0145415351971920e-01 -1.2336625056779031e+01 5.2115510206984453e+01 + 30 2.0383173645434425e+02 -3.3740173923092908e+02 7.4765149086858841e+01 + 31 -2.7481842076079452e+01 4.1727677551950670e+01 -1.1219296376935310e+02 + 32 -2.3935841809989284e+02 1.5375690712299075e+02 -1.6155602962904717e+02 + 33 7.8823030095401947e+01 1.6470032228411361e+02 -2.4915214715369562e+01 + 34 -2.9197862419788669e+00 9.4897844183428788e+00 -3.4454398427553903e+00 + 35 -2.4114682002772062e+02 1.9415882067189486e+02 2.2898623728112952e+02 + 36 -1.5234695223099358e+01 -6.2451942184415067e+01 3.2114547061042323e+01 + 37 7.5772802990591259e+01 4.2358100795021493e+01 8.0840908898965750e+01 + 38 1.7388433829431364e+01 -7.3363242451352406e+01 8.4849583779819781e+01 + 39 -4.4540202138191951e+00 2.2240774766544483e+01 5.0013452948582881e+01 + 40 1.9421310127906242e+01 4.4018731415108050e+01 -1.1193198296524670e+01 + 41 -2.9636520098528808e+02 -2.7241053606488487e+02 -3.5992124217653873e+02 + 42 -1.4685782653729663e+02 3.5819853079583766e+01 1.3293768507309352e+02 + 43 2.4841036121014760e+01 -2.6077708364675757e+01 2.9501691426197618e+02 + 44 6.5952266773680776e+01 -1.0159862540920869e+02 -9.4831733758963708e+01 + 45 3.1922935760562893e+02 3.3405700309308560e+02 1.3474726444560619e+02 + 46 1.5379879141775975e+01 -9.0266749789491074e-01 6.2430047633438734e-01 + 47 5.6112167767713039e+01 9.7396583845521754e+00 -9.5354186718577679e+01 + 48 -1.5875605493702329e+02 -9.7882886194643376e+01 1.0126737958110370e+02 + 49 -2.8347524821517214e+02 1.0761858164321859e+02 1.6506001175992503e+02 + 50 -3.6687309754685252e+01 -3.4841468646586378e+01 1.0676643968105390e+02 + 51 2.0012778732430067e+02 -1.8082253491456601e+02 2.7067464503415988e+02 + 52 -5.8636368421617021e+01 3.9488221636495723e+01 -6.0871594306724376e+01 + 53 -1.5333495743587039e+02 2.9082676921961047e+02 -1.7525127796909626e+02 + 54 5.4876138390508181e+01 2.3925092620987364e+01 1.5730606161757518e+02 + 55 -2.6839666202896261e+01 3.8408370753823853e+01 -4.6678629995301890e+01 + 56 1.9449294032272817e+02 -1.9309019528120450e+02 -9.7002590492646931e+01 + 57 -2.0305072142998462e+01 -3.2475769884590497e+00 1.8633470848074413e+01 + 58 -1.0595660590400778e+01 -2.6209419454594599e+01 7.1786581231638976e+01 + 59 6.8321375371926436e+01 -3.9194115062647924e+01 -3.4219969306506023e+01 + 60 -1.8486323721703445e+02 2.8304606459415493e+02 -2.2433752364284288e+02 + 61 2.6061317166528067e+01 -4.4833750798675510e+01 2.5321308916142687e+01 + 62 4.4057103203785829e+01 -8.2857345809018401e+00 -1.0331522553740689e+02 + 63 7.6074335425581523e+01 3.1304744285126599e+01 -9.3157787943483214e+01 + 64 -1.9667644369711677e+01 -8.1271795690709027e+01 2.0553148058945801e+01 +run_vdwl: -2496.108099717699 +run_coul: -368.6322270706182 run_stress: ! |2- - 4.8194587329953774e+03 4.4865895224707238e+03 3.2679446938086630e+03 -1.8471163065259302e+03 7.6545324620048859e+02 -4.9527853267789408e+02 + 1.6870332398146152e+03 2.8302026824010104e+03 1.4880726337023248e+03 3.6531051357379894e+01 1.6614015073017021e+02 3.2800879826333949e+02 run_forces: ! |2 - 1 -1.9811556407056088e+02 -1.5618143620847064e+02 -1.0716119874908756e+02 - 2 -4.1073968384374929e+01 -6.7710647015368721e+01 -4.2502864658156838e+01 - 3 3.1592798331689615e+01 8.8575236369726582e+01 1.4850890801985429e+02 - 4 1.7447282006188135e+02 3.2862369867969377e+01 -3.1175721266395321e+01 - 5 1.1873112974792295e+02 5.9090963929047163e+01 2.3738916225937521e+02 - 6 1.3053008444613590e+03 -4.4210323642713900e+02 -1.4246081409032688e+03 - 7 -8.7152343512651242e+01 -1.0895314566818800e+02 -3.5604721285130728e+02 - 8 -9.1046846091347419e+01 4.4451665481009826e+01 1.1879618751723078e+02 - 9 4.7463133585714033e+01 1.7228438483982359e+02 -1.4645071927694708e+01 - 10 6.3506921990797643e+01 4.8587688349158064e+01 1.1073324095442819e+01 - 11 -5.1917951887543289e+01 7.3818630188510255e+01 5.1369234828489255e+01 - 12 -1.0172154753205881e+02 -1.9847809999838582e+01 -1.7441731987232863e+01 - 13 -7.3048126072732174e+01 -4.5586545373889997e+01 2.8534758158919409e+01 - 14 8.6288077929555229e+01 -4.1660634795038746e+01 1.7096747148189305e+01 - 15 -3.5688114877422194e+01 1.2671728980619812e+02 4.5864235397118840e+01 - 16 1.0608395201173600e+02 3.5983845233527155e+01 1.8672925070385567e+01 - 17 2.3576828121395229e+02 -9.8577850318505497e+01 4.1004495565128636e+01 - 18 -2.0815095995902841e+01 -1.1578710179047313e+02 6.5566934287391334e+01 - 19 4.3264252619510422e+01 1.0912982970441605e+02 3.0901253523346622e+02 - 20 -1.0088948935029266e+02 7.4849484282712737e+01 -1.6550538409007447e+02 - 21 -8.5974038585183592e+01 -4.5987854992621955e+00 -7.3065890363334759e+01 - 22 1.3343130763213867e+02 -1.2211553430043745e+02 9.0325064574872144e+01 - 23 5.2984912690316413e+01 2.0042805349786828e+01 -9.0417924141693788e+00 - 24 -1.8954830238390542e+02 8.1645824240163648e+01 -1.2893974448860810e+01 - 25 -1.0068116183998585e+02 1.3220505876703569e+02 -4.8977129584747772e+01 - 26 2.1847179335289812e+02 -1.9385136258527231e+02 1.7114800244815055e+02 - 27 -3.7476307441658555e+01 3.0046433191315668e+01 9.3873685757282061e+01 - 28 9.9355970623229155e+01 -5.5158350569167858e+01 -3.1544144508393771e+01 - 29 -3.9530224377034997e+01 5.6690552166969582e+01 2.5358784555345935e+01 - 30 -9.7652510697052577e+01 -2.2271892169387428e+02 -1.4460597467192878e+02 - 31 -4.6194950503295814e+01 7.2792554749932236e+01 3.1151667586195831e+01 - 32 1.2014466624027840e+01 -3.4469133688337621e+01 -1.0621837802800951e+02 - 33 5.2553699854340117e+01 4.2706400148047273e+01 -3.0154323622365027e+01 - 34 1.6822906612351355e+02 -1.7651825962111040e-02 1.1832699040444544e+02 - 35 5.1193507571856304e+02 -1.3215008853105999e+03 1.1320319719742367e+03 - 36 -1.4340338085502257e+01 9.9690347849156424e+01 -1.3158127406978670e+02 - 37 -8.9323390159980318e+02 1.3545163222654803e+03 -7.5929442355796618e+02 - 38 -3.8384755818822572e+02 1.2143789174035349e+02 1.7579570815453832e+02 - 39 1.6381197094628581e+02 -1.2998258674043434e+01 -7.8543109639930535e+01 - 40 6.1411228642099886e+01 -2.0154566391137791e+01 4.3186834298875425e+01 - 41 1.3119781105417216e+01 1.7920555043088842e+00 3.3686007139292201e+01 - 42 -6.4838490750750282e+01 5.2660553302313524e+01 -6.8647362072365695e+01 - 43 2.0926308211689741e+02 8.2945847275902850e+01 1.1786850503407675e+02 - 44 -3.8461829626420851e+01 -7.5317323697261926e+01 -1.3445959877777369e+02 - 45 -3.4805239678702364e+01 7.6262295586964342e+01 4.3024220690599236e+01 - 46 2.3465031078235281e+01 -1.5312554894709550e+01 -3.8725170500352220e+00 - 47 -3.7271036720207910e+01 -5.4879638482209522e+01 -1.9275876359755962e+01 - 48 2.8270391245290335e+02 -1.7971102191169626e+02 -6.0165064633346822e+02 - 49 -2.0529526126133560e+03 -6.7744467074995839e+01 7.6241869031244244e+02 - 50 1.3291615685330240e+02 -9.8801239572741693e+01 9.9131933784098351e+01 - 51 2.6169570171244902e+02 -1.9762541199560980e+02 2.4063463246277200e+02 - 52 -1.2256816067286644e+02 1.3353356136884102e+02 -1.1597765595389454e+02 - 53 3.8012282364003795e+02 8.1194045374755660e+02 2.7050484440708345e+02 - 54 6.9456553969441146e+01 -1.1593864337324254e+02 2.2074869335520964e+02 - 55 8.7303368709848456e+01 -1.3907755259033485e+02 5.9542185087028500e+01 - 56 3.4769731101937191e+02 -2.4546533348164306e+02 -3.5075782168770769e+02 - 57 6.1706155820464353e+01 7.9892471516404527e+01 3.4375912204703756e+00 - 58 3.7237511516194317e+01 -1.2919240641738787e+02 3.9695822512620701e+01 - 59 -5.2071132643271108e+02 2.1045883047165887e+02 1.7082619476821273e+02 - 60 -7.8658294909199697e+01 -2.3007149625533788e+01 -1.2454738729229290e+02 - 61 -3.9624794908667297e+01 -5.5169201638846154e+01 -4.0777145486524688e+01 - 62 -1.8741606623350233e+01 -1.3845552517299485e+01 2.2601936169381780e+00 - 63 6.5142845574860317e+01 7.0992677773634298e+01 -8.4109461087570082e+01 - 64 4.0079794681812878e+01 9.6475030340593307e+01 9.1215541718322896e+01 + 1 -5.9749682350094275e+01 -1.8981459118044359e+02 -1.7188944899332137e+02 + 2 -1.6018511740452598e+02 -4.7304864759911538e+01 1.4067868655709582e+01 + 3 1.0153838318702253e+02 -2.1318403585723266e+02 8.1756272198662174e+01 + 4 1.3163673464518220e+02 2.1223597655766673e+02 -2.1298581655432949e+02 + 5 -3.4331570326109038e+01 2.3574175336709101e+02 -2.7855925554322631e+01 + 6 2.5903680917807725e+02 -1.4855059966447968e+02 -6.1002167572354494e+02 + 7 -8.7690113511053589e+00 1.3375254440866411e+02 -8.8780266597160491e+01 + 8 -2.5152420906730717e+02 -1.8292610042683467e+02 2.3501790660057625e+02 + 9 2.3692596484843598e+01 2.1519064759924404e+01 -3.7701305437543638e+01 + 10 -1.0654854010248900e+02 1.9172393042438929e+02 -3.3037041411509172e+01 + 11 -2.8081206513081213e+02 -7.5259601378474770e+02 -4.8052165834035281e+02 + 12 4.0432727355706490e+01 1.0942861691796072e+02 -6.9826736265237358e+01 + 13 -7.2202429248963554e+01 -1.2310276604972732e+02 1.5875997658831562e+02 + 14 6.8751589932879838e+01 -6.7687080090359103e+01 -1.6646536711309068e+02 + 15 3.4048661580931696e+02 9.3353232415062018e+02 6.5067648334777698e+02 + 16 3.9039409033006200e+00 1.1101777827125498e+02 2.2089153762868457e+02 + 17 -2.6953203645517005e+00 1.2284796802413376e+00 -2.7873231283741915e+00 + 18 3.1965759143960679e+02 -2.9464984904975950e+02 3.5284773639149137e+02 + 19 2.0834842145582280e+02 -5.0803572283395759e+01 2.1689381430643303e+02 + 20 6.9133770110741779e+01 2.1579754432204234e+02 -8.6958666800412715e+01 + 21 -1.1929424173241594e+02 9.9305786637969273e+00 -2.1738036191354393e+01 + 22 -4.3450652098531442e+01 -2.2611781270353714e+02 -9.2150321330656084e+01 + 23 -2.9163067315015351e+01 -6.1456044462648990e+01 -5.2667254988673108e+01 + 24 -1.1095732184091821e+02 -7.2590772645502938e+01 -9.5255607773771956e+01 + 25 3.5600735484668569e+01 2.7080150284997668e+01 -2.6779598820418990e+01 + 26 9.2486494969238677e+00 -2.2976503532734082e+01 -1.5254112417290195e+01 + 27 8.4298281178091869e+01 -6.8245115626555659e+01 -3.6689576765515376e+01 + 28 -3.0349466332936029e+01 4.8447530359545212e+01 -7.6685984774058067e+00 + 29 5.9825401304827841e-01 -1.2322878804003386e+01 5.2116715786808953e+01 + 30 2.0383156358458766e+02 -3.3740082165868125e+02 7.4763669289574466e+01 + 31 -2.7482197200319131e+01 4.1726779832718762e+01 -1.1219388760650165e+02 + 32 -2.3945066504646371e+02 1.5383729174591318e+02 -1.6159483728890646e+02 + 33 7.8826849922277248e+01 1.6470571189309584e+02 -2.4913874161249066e+01 + 34 -2.9189848856155240e+00 9.4874043924281395e+00 -3.4438316245798952e+00 + 35 -2.4114388691002540e+02 1.9416024483026385e+02 2.2898635551897667e+02 + 36 -1.5232414785426156e+01 -6.2446310455370416e+01 3.2110457992479574e+01 + 37 7.5769451449704945e+01 4.2354501302048362e+01 8.0844687722658151e+01 + 38 1.7389072367026632e+01 -7.3362446811326834e+01 8.4849648214441132e+01 + 39 -4.4547422304294297e+00 2.2240459179714989e+01 5.0013341694850524e+01 + 40 1.9421663358340485e+01 4.4017834174347904e+01 -1.1192704801984473e+01 + 41 -2.9635660246268975e+02 -2.7240156062402792e+02 -3.5991959560982144e+02 + 42 -1.4685843561865190e+02 3.5818748738640721e+01 1.3293695071327514e+02 + 43 2.4843529731665480e+01 -2.6078853308079548e+01 2.9501612032263353e+02 + 44 6.5954293017243884e+01 -1.0159961297988438e+02 -9.4831904041526812e+01 + 45 3.1921964947907514e+02 3.3404965835950219e+02 1.3474454798997277e+02 + 46 1.5380124231237289e+01 -9.0328016515719045e-01 6.2487801103069984e-01 + 47 5.6111117387561691e+01 9.7411306230080363e+00 -9.5353358526837454e+01 + 48 -1.5875454095398374e+02 -9.7883282976150738e+01 1.0126293209645965e+02 + 49 -2.8349678900412925e+02 1.0762655718009194e+02 1.6508241443824818e+02 + 50 -3.6682948783358071e+01 -3.4846028017816280e+01 1.0677296588058083e+02 + 51 2.0013815835914141e+02 -1.8083482395076820e+02 2.7068817770370714e+02 + 52 -5.8636342807014586e+01 3.9488584194740298e+01 -6.0869311267141882e+01 + 53 -1.5334488819773222e+02 2.9083852848589066e+02 -1.7526566565117062e+02 + 54 5.4875017598583398e+01 2.3924053695946164e+01 1.5730296124848667e+02 + 55 -2.6840473690563865e+01 3.8410373385350056e+01 -4.6679884022581234e+01 + 56 1.9449046155000801e+02 -1.9309102814598248e+02 -9.7001429120905357e+01 + 57 -2.0304260435363286e+01 -3.2459664529605003e+00 1.8634114746759394e+01 + 58 -1.0596666936579036e+01 -2.6209951534160329e+01 7.1787651072422406e+01 + 59 6.8319893608607245e+01 -3.9192617032126570e+01 -3.4219181581215778e+01 + 60 -1.8485499260686038e+02 2.8305583303727462e+02 -2.2432928430341721e+02 + 61 2.6061068072479067e+01 -4.4835807336095002e+01 2.5319993832814450e+01 + 62 4.4057585739624301e+01 -8.2850202022018689e+00 -1.0331535362907114e+02 + 63 7.6073746968160677e+01 3.1305825710528662e+01 -9.3157490618910003e+01 + 64 -1.9685819879576993e+01 -8.1279780357037055e+01 2.0545752546275725e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml index 64812a6edf..a3a01d279f 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff_noqeq.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: slow, unstable -date_generated: Fri Mar 18 22:29:51 2022 +date_generated: Fri Apr 25 19:44:18 2025 epsilon: 2e-11 skip_tests: prerequisites: ! | @@ -20,7 +20,7 @@ pre_commands: ! | 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 type/ratio 2 0.5 998877 set type 1 charge 0.01 set type 2 charge -0.01 velocity all create 100 4534624 loop geom @@ -32,141 +32,141 @@ pair_coeff: ! | extract: ! "" natoms: 64 init_vdwl: -8975.381063460629 -init_coul: 0.5928529868716559 +init_coul: 0.6247056049568918 init_stress: ! |- - -1.1526162173764687e+03 -4.6218014500723211e+02 3.1954383274884714e+02 -2.2197591028227603e+03 3.4480244373669649e+02 -1.2644452447488172e+03 + -1.1522003809498901e+03 -4.6289046577270688e+02 3.1962936291769955e+02 -2.2196074238560545e+03 3.4470387773772359e+02 -1.2645313903143790e+03 init_forces: ! |2 - 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 + 1 -2.0914124099662672e+02 -1.8818872974175520e+02 -2.2844013105560973e+02 + 2 -5.9697207359941928e+01 -1.3792144050361912e+02 -6.1449592520066616e+01 + 3 1.0925839313245984e+02 5.4684408159191555e+01 8.7078731782081178e+00 + 4 2.2392796300657977e+02 -1.2605236051254923e+02 5.6101253514515314e+01 + 5 2.1350560875995534e+01 2.3984047198230880e+02 -1.1311828741115013e+02 + 6 -2.3464617129446890e+02 8.8012098463100330e+01 7.1410845592953763e+01 + 7 1.7782687523318486e+02 3.8512608347916071e+01 -2.7668254400639216e+02 + 8 -2.0965411618615562e+01 -4.0707781608993452e+02 1.5137942817842071e+02 + 9 -5.9328432189547421e+01 2.6268108092469748e+02 1.7447407303971282e+01 + 10 -8.4495765364498666e+01 1.5453557223796577e+02 5.9975468608612523e+00 + 11 -1.1158080831662544e+02 1.8657267880978389e+02 3.4449793789425883e+02 + 12 3.3347105753229511e+02 -3.8246413110417939e+02 5.1148802865473549e+01 + 13 -3.9348291009266251e+02 -9.9341433842605397e+01 2.4783370801319361e+02 + 14 1.7611214223379599e+02 -2.8020295387763275e+02 -2.7998929215161075e+02 + 15 2.5243356572711869e+02 -5.4744839915445731e+01 -1.3456120050146978e+02 + 16 1.6592818566166517e+02 1.6275751474672055e+02 4.2187991906944724e+01 + 17 4.0594664608520482e+01 2.0277202357044311e+02 1.1656924671198696e+02 + 18 1.9347142504900441e+02 -3.1759863448039226e+01 -3.0059826084264309e+01 + 19 -5.9081645094616277e+01 1.7667602025597329e+01 -1.0448763274395672e+02 + 20 1.3107393553805900e+02 2.5166179391920164e+01 1.3538565334579459e+02 + 21 -3.2005864253949017e+02 -1.1512400675252213e+02 -2.5794990677024906e+01 + 22 -1.2735924826014621e+01 -1.3036327279434636e+02 -1.4398934942692574e+02 + 23 -1.0144750896744854e+02 2.3314794696272514e+02 2.3904379065199643e+02 + 24 4.1545308084560531e+01 -1.2906036430976618e+01 -3.1681094599684020e+01 + 25 2.1165940423735742e+02 -2.0417493052723128e+02 -3.1226178851548120e+01 + 26 -2.6321858891239299e+02 1.2068017733990857e+02 2.6279435356041927e+02 + 27 -7.4517437069623483e+01 1.0779639662150767e+02 1.6092656619506607e+02 + 28 -2.4911089621835691e+02 -9.8520770964645365e+01 2.2241144032140954e+02 + 29 4.5657452963720698e+02 -5.6182340812478621e+01 -2.7585312800435065e+02 + 30 -1.1443170583858009e+02 5.2250940119139926e+01 -1.7194142939183340e+02 + 31 -1.8371574771530030e+02 -1.0039233008431701e+02 -9.6969926239091777e+01 + 32 1.5286945938545961e+02 -1.2909151965035034e+02 -1.8526860207291458e+02 + 33 2.0668838046812226e+01 3.7956081984237466e+02 -3.0327775133716738e+01 + 34 -1.8485243058900375e+02 -8.4902265611944557e+01 -1.0334922392462389e+02 + 35 -4.3921128724822381e+01 1.4144066121628940e+00 3.2304261040591385e+01 + 36 6.0406904407918228e+02 6.3220306296432750e+02 -1.5561278276597275e+01 + 37 -1.7705316662492615e+02 -3.4710265237042080e+02 2.0759227825955159e+02 + 38 -1.5988460530671847e+02 3.4348492526023620e+01 -1.1346401165856278e+02 + 39 1.2480842843615049e+02 3.1856263048326433e+01 2.4140284308485735e+02 + 40 -3.3951796201391039e+02 -5.2081833663831844e+02 -3.2738772249857519e+01 + 41 1.5970204196994148e+01 -2.5266331043726151e+01 -6.0962873230231594e+01 + 42 -3.5153358780320320e+02 1.0105229938479597e+02 1.0056444839536226e+02 + 43 1.8326269257033405e+02 -1.7844561365859846e+01 3.5791308564921650e+01 + 44 -1.7146905315524893e+02 6.5803638547523335e+01 -3.9054087658838917e+01 + 45 6.8021819720903750e+01 -5.2989025731943130e+01 -1.1277819878515446e+02 + 46 -1.9815505038641237e+02 3.1897442987787576e+02 -1.7123371507944114e+02 + 47 2.3516232814102085e+02 1.7328411787446552e+02 -4.6485447489192744e+01 + 48 -7.1003554303618728e+00 -2.1508513175350956e+02 2.8257156872764051e+02 + 49 2.4924592686720581e+02 -2.5981750361393829e+01 -1.9540199593701169e+02 + 50 9.0194001278304384e+01 2.6672225662845585e+02 4.8180959796654598e+01 + 51 2.7002870021497250e+02 -2.5022881948758243e+02 3.3083098845661993e+02 + 52 2.6767625774138310e+02 -1.3482625844032086e+02 -1.1000097866515480e+02 + 53 -3.0038929170399979e+02 1.7425773044456429e+02 -2.8370454746595635e+02 + 54 -1.8044584133615103e+02 3.2006963126548987e+02 -2.1984516064097204e+02 + 55 -6.7003251121046603e+01 2.8418517991325285e+02 -1.8257519576346087e+02 + 56 -9.3945699803526088e+02 7.6596999966254225e+02 -4.5873459456734366e+02 + 57 -2.7674559638427976e+01 -1.7257078564428772e+02 -1.6208665394496478e+02 + 58 7.1031682160942694e+02 -8.0886674379787894e+02 4.6677246926839877e+02 + 59 1.5686075444889278e+02 5.9884745092208249e+01 1.2643951211249683e+02 + 60 9.4082236177554165e+01 -1.1752337788314870e+02 -2.9916369959484737e+01 + 61 -4.8952507578033888e+01 1.6637775468626961e+02 6.7668580180221625e+01 + 62 1.6617796435817161e+02 7.3472506301982236e+01 2.2194397706696680e+02 + 63 4.6349202247480203e+00 -3.5577740960429975e+02 -3.8932105726092466e+01 + 64 -2.0021257419298206e+02 -1.1222280758830274e+02 3.0275915084479544e+02 +run_vdwl: -8975.380279231855 +run_coul: 0.6247057696351592 run_stress: ! |- - -1.1524045146329215e+03 -4.6202672628887183e+02 3.1947257175242123e+02 -2.2198788293036246e+03 3.4537925625758203e+02 -1.2645006400276918e+03 + -1.1519935233603646e+03 -4.6274247338353712e+02 3.1956208004207974e+02 -2.2197010731538394e+03 3.4524791300515221e+02 -1.2645659223719906e+03 run_forces: ! |2 - 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.0194077117530142e+01 2.6674400385736777e+02 4.8189887304663053e+01 - 51 2.7001321252850289e+02 -2.5024728349358162e+02 3.3082537396992757e+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 + 1 -2.0914350574623234e+02 -1.8819029916070144e+02 -2.2843856641129599e+02 + 2 -5.9698753828235496e+01 -1.3792188982094228e+02 -6.1451932986602202e+01 + 3 1.0925457638948292e+02 5.4688888466039316e+01 8.7074222645275974e+00 + 4 2.2392733460968827e+02 -1.2605002733309550e+02 5.6100868561454902e+01 + 5 2.1355818433721765e+01 2.3984415342818045e+02 -1.1312229508240013e+02 + 6 -2.3463708465440109e+02 8.7971064861895186e+01 7.1440469184714203e+01 + 7 1.7780029964655594e+02 3.8525099030618307e+01 -2.7663519733081012e+02 + 8 -2.0973015523035240e+01 -4.0708617254774134e+02 1.5138599477696837e+02 + 9 -5.9327425022303181e+01 2.6268270340612582e+02 1.7446432625862354e+01 + 10 -8.4496864107675876e+01 1.5453763010552484e+02 5.9992826240592416e+00 + 11 -1.1158248565147565e+02 1.8657232229047651e+02 3.4449925043543260e+02 + 12 3.3351781712966101e+02 -3.8252640963091216e+02 5.1092556959367407e+01 + 13 -3.9349022639098456e+02 -9.9341993214041054e+01 2.4783665765974655e+02 + 14 1.7610978467383006e+02 -2.8020136610362829e+02 -2.7999450334310410e+02 + 15 2.5243180310989601e+02 -5.4739799439838215e+01 -1.3455593303386925e+02 + 16 1.6593941774991498e+02 1.6276507603705906e+02 4.2205006195646305e+01 + 17 4.0597362842610792e+01 2.0277191918375829e+02 1.1656826749300028e+02 + 18 1.9347170111979500e+02 -3.1752291850668925e+01 -3.0070256216326648e+01 + 19 -5.9079475477436922e+01 1.7664815546112457e+01 -1.0449150411527420e+02 + 20 1.3107244651674645e+02 2.5166650999248873e+01 1.3538399787008404e+02 + 21 -3.2006032788729522e+02 -1.1512416547076603e+02 -2.5794324546460725e+01 + 22 -1.2756449129221718e+01 -1.3033919881249025e+02 -1.4400328996224908e+02 + 23 -1.0144705916012717e+02 2.3314837028772945e+02 2.3904426730503999e+02 + 24 4.1545367880505573e+01 -1.2907360295061620e+01 -3.1682793611971668e+01 + 25 2.1167830144343935e+02 -2.0420033179436982e+02 -3.1216378710176979e+01 + 26 -2.6322102202212437e+02 1.2068229336466415e+02 2.6279932652856036e+02 + 27 -7.4519059353793295e+01 1.0779186988731315e+02 1.6092315406894872e+02 + 28 -2.4910771427785087e+02 -9.8517542913334651e+01 2.2241666498715068e+02 + 29 4.5657902373533591e+02 -5.6187761013865568e+01 -2.7585600713058130e+02 + 30 -1.1443830876598267e+02 5.2264702977223038e+01 -1.7195055934705701e+02 + 31 -1.8371249105251832e+02 -1.0040206137231046e+02 -9.6966158987429878e+01 + 32 1.5286795703497984e+02 -1.2909474734778451e+02 -1.8527054208558266e+02 + 33 2.0668545181386456e+01 3.7956962080020025e+02 -3.0326441638387074e+01 + 34 -1.8484470160811745e+02 -8.4902849014776962e+01 -1.0335280907960015e+02 + 35 -4.3774117703436126e+01 1.3704101985490951e+00 3.2190247055601901e+01 + 36 6.0395916700610746e+02 6.3209387521440806e+02 -1.5639704727133127e+01 + 37 -1.7703934343133864e+02 -3.4709303724377003e+02 2.0758245187916003e+02 + 38 -1.5988329386666803e+02 3.4345220890498226e+01 -1.1346014213176119e+02 + 39 1.2480662936162817e+02 3.1842458112226044e+01 2.4137915656991319e+02 + 40 -3.3939496318052869e+02 -5.2071688965824330e+02 -3.2699651125044888e+01 + 41 1.5915545728164791e+01 -2.5289845221110099e+01 -6.0942027186387698e+01 + 42 -3.5153711005654952e+02 1.0104890755640496e+02 1.0055749716114701e+02 + 43 1.8328465140254673e+02 -1.7818816936341854e+01 3.5794828506361782e+01 + 44 -1.7146365238120029e+02 6.5793898987946221e+01 -3.9053207339644111e+01 + 45 6.8005269340392772e+01 -5.3006014678604274e+01 -1.1277591969643254e+02 + 46 -1.9815285284253972e+02 3.1896686717690585e+02 -1.7123077425475708e+02 + 47 2.3511462879582533e+02 1.7334398823589902e+02 -4.6445142146168841e+01 + 48 -7.0938476033151812e+00 -2.1508864734170234e+02 2.8256649308482702e+02 + 49 2.4924876885609456e+02 -2.5990553887376961e+01 -1.9540088802724233e+02 + 50 9.0193543960977038e+01 2.6672164556710089e+02 4.8182795787338165e+01 + 51 2.7002873733026138e+02 -2.5023173337055175e+02 3.3083363834386932e+02 + 52 2.6772121611184275e+02 -1.3483350452185292e+02 -1.0996979086561090e+02 + 53 -3.0038900371642694e+02 1.7425824201910839e+02 -2.8370405164307982e+02 + 54 -1.8044599633851573e+02 3.2006848522028349e+02 -2.1984703097519008e+02 + 55 -6.6978073317453905e+01 2.8427917107623398e+02 -1.8265545525090553e+02 + 56 -9.3982814313924780e+02 7.6631827134383423e+02 -4.5883964764640035e+02 + 57 -2.7681256477142483e+01 -1.7257989437034232e+02 -1.6208550961683679e+02 + 58 7.1045509278722113e+02 -8.0913604319450701e+02 4.6701376532841715e+02 + 59 1.5685636291434261e+02 5.9889724045596175e+01 1.2644134135206694e+02 + 60 9.4088118041714566e+01 -1.1754302423002507e+02 -2.9917942572075976e+01 + 61 -4.8941897278202184e+01 1.6631010092171667e+02 6.7626150607574260e+01 + 62 1.6621288132138534e+02 7.3508136257163642e+01 2.2199877860376401e+02 + 63 4.6358635235246961e+00 -3.5577834648227258e+02 -3.8932725329434177e+01 + 64 -2.0020451298820217e+02 -1.1221396522301396e+02 3.0276234033268082e+02 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml index f8331f0aac..d3dc58e27a 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: slow, unstable, noWindows -date_generated: Fri Mar 18 22:17:41 2022 +date_generated: Fri Apr 25 19:44:19 2025 epsilon: 1e-12 skip_tests: prerequisites: ! | @@ -23,8 +23,8 @@ pre_commands: ! | mass 1 1.0 mass 2 12.0 mass 3 16.0 - set type 1 type/fraction 2 0.5 998877 - set type 2 type/fraction 3 0.5 887766 + set type 1 type/ratio 2 0.5 998877 + set type 2 type/ratio 3 0.5 887766 set type 1 charge 0.00 set type 2 charge 0.01 set type 3 charge -0.01 @@ -37,142 +37,142 @@ pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -3248.7357862540734 -init_coul: -327.0655125227951 +init_vdwl: -3462.1619265333566 +init_coul: -347.646642744037 init_stress: ! |- - -9.1835020319342993e+02 -1.1070721188680361e+03 -7.1558466813461689e+02 -2.3040889388184749e+02 1.9640581541966318e+02 -6.6002885423290252e+02 + -9.5553219488299806e+02 -5.1243699099308242e+02 -1.0983994706206629e+03 -1.7124414453911609e+02 -1.7279164696898377e+02 -4.3393211860798459e+02 init_forces: ! |2 - 1 -8.8484243142053515e+01 -2.5824351291805911e+01 1.0916231386685236e+02 - 2 -1.0451347832614758e+02 -1.8136974287862017e+02 -2.1792749625845585e+02 - 3 -1.7141330932870576e+02 1.8106971255162952e+02 1.2675253960497237e+01 - 4 3.2218812838206141e+01 -5.1411756251267207e+01 9.0007306757968763e+01 - 5 1.8144819687099201e+02 1.6798395592379507e+01 -8.1726053808337198e+01 - 6 1.3634126802325500e+02 -3.0056831863560024e+02 2.9662272655036944e+01 - 7 -5.2968391883956642e+01 -1.2850613949952682e+02 -1.6373506942005392e+02 - 8 -1.5240314403220765e+02 4.1133257093807401e+01 1.5386487473711964e+02 - 9 3.2812532468307644e+01 1.0176367686189263e+02 1.4294427965087884e+01 - 10 7.9509811085534338e+01 1.3053732532659745e+02 1.1246398073074891e+02 - 11 -4.3144361329384928e+01 6.5763458097239578e+01 1.3482625633510355e+02 - 12 -9.6706456479566242e+01 -2.5878068074726670e+01 7.8323180467847902e+00 - 13 -6.3851121453490826e+01 -4.6607020158193130e+01 -3.6458352736129804e+01 - 14 7.8283848679560407e+01 -6.3646790831912000e+01 -8.9030561188056907e+01 - 15 -6.4212540181982206e+01 2.1093128152294048e+02 7.9060299592798870e+01 - 16 1.8608410345576542e+02 5.8084942932974435e+01 5.8538920003759820e+01 - 17 1.4285494615811757e+02 -3.9754521764346073e+01 -9.7686742464543400e+01 - 18 -4.1881548239260361e+01 -1.8476992042512521e+02 1.0708048360801494e+02 - 19 2.6677589878662894e+02 3.7179534199156791e+02 -3.3866575926816569e+02 - 20 -7.3520359401756707e+01 -8.3905077072098976e+01 -2.3854316876095305e-01 - 21 -7.2528668519171163e+01 -5.5898051886914701e+01 -1.1976059789266944e+02 - 22 1.5613953224968660e+02 -1.3200393155013305e+02 8.2112641076919502e+01 - 23 8.1833165091703748e+01 -1.7531644917124240e+01 -2.5648343293479975e+01 - 24 -2.1833127742352698e+02 1.9453922798678192e+02 -1.0817823414171293e+02 - 25 -1.1414613109864887e+02 1.9088917707975926e+02 -8.3362585828151552e+01 - 26 2.8281696751420094e+02 -2.1478267582733670e+02 2.2873793580282324e+02 - 27 -5.9769124622218207e+01 6.5221508924768258e+01 1.7553584075622010e+02 - 28 -2.9606162623425121e+00 3.8183918395203868e+01 3.2190129571074380e+01 - 29 -7.1069178571897908e+01 3.5485903180455900e+01 2.7311648896337541e+01 - 30 -1.7036975157904510e+02 -1.9851849204561219e+02 -1.1511387046436201e+02 - 31 -1.3744101014029070e+02 1.6223817575815920e+02 -1.1915340963940626e+02 - 32 2.7247730686207433e+01 -6.0237587331412904e+01 -1.7664910575209942e+02 - 33 -6.1822971861323794e+01 -6.2648749988188868e+01 6.4194672454602852e+01 - 34 -1.7144145154614449e+01 9.9612835226783318e+01 -6.7437146990429881e+01 - 35 2.7024145652917929e+02 -2.1533864682645751e+02 1.3021380112890239e+02 - 36 1.0192185945862155e+02 1.8671686332443750e+02 -1.9864174410201804e+02 - 37 -1.7944122400067309e+02 1.2994089095714867e+02 -6.4321354857450302e+01 - 38 -2.9675055634802914e+02 1.0371104129720563e+02 1.5526989537725115e+02 - 39 8.6949523213896370e+01 -5.9975159120196373e+01 2.1780252234486852e+01 - 40 2.1612729980868302e+01 -1.0242580356371187e+02 5.7270724021457596e+01 - 41 -5.7836015722977898e+01 1.2268076597658890e+01 -6.6177893589404093e+01 - 42 -9.4774792026638053e+01 3.6872244003647779e+01 -7.5003138682740200e+01 - 43 2.2327470123469584e+02 9.5798787537490597e+01 1.2250410628715098e+02 - 44 8.7959342085865856e+01 -9.8740455124803333e+01 -8.4938709742755620e+01 - 45 1.4089093363544627e+01 1.2499300233485771e+02 5.5864237375370912e+01 - 46 1.3547776948110462e+01 -2.9276229642219235e+01 2.2187402435966465e+01 - 47 3.3448457824361121e+01 -1.9209977417392133e+02 -6.9989895706263383e+01 - 48 6.7827627502623770e+01 -2.0361789453088591e+02 -2.8571736118815522e+01 - 49 -3.7476005148434723e+02 -2.4452451195186867e+01 1.0764661193358305e+02 - 50 4.0090993029104212e+01 -7.3201402054245477e+01 8.9025922810973825e+01 - 51 1.3736420686697036e+02 -1.0204157331499393e+02 1.5813725581140881e+02 - 52 -1.1253479916199494e+02 1.2293268076536030e+02 -1.2940078007359944e+02 - 53 -5.3560738472921315e+01 3.3353082884518039e+02 -1.1314448604068374e+00 - 54 -1.0678339177259399e+01 6.2810937621378287e+01 1.8344988318246166e+02 - 55 1.1231900459987541e+02 -1.7906654831317354e+02 7.6533681064342233e+01 - 56 -4.7772143767870254e+01 -1.3536779754026884e+02 3.4054518546944315e+01 - 57 9.6541690594805473e+01 7.5093838528685893e+01 -6.0858704719313309e+01 - 58 -2.0459002696752282e+01 -1.1535051272094138e+01 -1.4282722385693017e+01 - 59 -6.9459404830700208e+01 1.0185761321965293e+02 8.3383492919158030e+01 - 60 -1.6658947285274955e+01 6.4062738321772684e+01 -1.5162708730048084e+02 - 61 -3.5221540644535935e+01 -1.0209415023871219e+02 -7.4154806308030118e+01 - 62 1.5375061601631625e+01 -6.3257038363617211e+00 2.7511178147388687e+01 - 63 1.3464841040549354e+02 -1.2416888785900652e+02 -5.8961420295343736e+01 - 64 1.0701063550375243e+02 1.1895268715876527e+02 7.4448770962531555e+01 -run_vdwl: -3248.732462206598 -run_coul: -327.06539947713827 + 1 -2.4428929708976259e+01 -2.8005322422146008e+02 -1.9588088700422201e+01 + 2 -1.0151325930562190e+02 -1.1421387737317619e+02 2.6349780823641549e+01 + 3 1.3156234709780310e+02 -1.9435571501873312e+02 1.4380226401776600e+01 + 4 2.0163783809284413e+02 2.6653752261911893e+02 -1.2060076984144524e+02 + 5 -7.1728261166459788e+01 1.0462368309034633e+02 -1.6180689013772187e+02 + 6 2.8373124602118750e+01 -3.0466127197560411e-01 -3.2843816677741336e+02 + 7 1.9477013767212231e+01 7.7516863003595645e+01 -2.3654954938990869e+01 + 8 -8.9147655106915280e+01 -2.5164025827292301e+02 1.5630381036623402e+02 + 9 3.8838442188599409e+01 7.3659830492568290e+01 1.1430472317506112e+01 + 10 -7.5380203990552815e+01 1.4391962189232473e+02 -1.2089415824561648e+02 + 11 -1.3561600551375744e+02 -2.0414301666437318e+01 2.1197081239379023e+02 + 12 5.2164173727562098e+00 4.5148462386724390e+01 -4.6043320373398750e+01 + 13 -1.4435466202180160e+02 -8.9568703817108215e+01 1.5655882091721725e+02 + 14 1.0632017103286169e+02 -3.8130926991625351e+01 -1.7501399893030973e+02 + 15 1.8628723691362745e+02 2.9761809488070406e+02 1.4663587981548940e+02 + 16 -3.9350700783591805e+01 2.0387559334506909e+02 3.0849360427091761e+02 + 17 -9.2691448660742071e-01 4.0802527024267903e+00 -8.3991279271453265e-02 + 18 2.1336936975099800e+02 -8.1814291804489187e+01 3.0443662529205864e+02 + 19 1.0446050071315463e+02 4.9053153262619773e+01 1.6080476874292805e+02 + 20 2.0839436080532937e+02 2.0478007849859085e+02 1.7700513975178005e+01 + 21 -7.0719893699828603e+01 8.2617473022004138e+00 -2.1876697685968487e+01 + 22 -9.5219978736151148e+01 -9.9707752504915703e+01 -9.6344101039730418e+01 + 23 -4.4622971249087918e+01 -8.7569925717419153e+01 -5.4631627217054060e+01 + 24 -2.7964897603171659e+02 -8.2719014272724408e+01 -1.6822456042424719e+02 + 25 7.5677782091286456e+00 2.3365919984505076e+01 -1.6769937241985904e+01 + 26 1.1603364282596178e+02 -8.9470077201514133e+00 1.7292556869595501e+01 + 27 8.4713493011213984e+01 -1.3808665554409865e+02 -8.5960938849098468e+01 + 28 -6.1916698232380540e+01 3.3745077030413526e+01 -4.5711781535376076e+01 + 29 -3.5953135439030795e+01 4.9903126932318884e+01 3.3629710321775448e+01 + 30 5.3875230581661413e+01 -2.5517985279548930e+02 4.4271735868663875e+01 + 31 -3.2201842769263671e+01 5.5838355424333788e+00 -1.1880640430982142e+02 + 32 -3.7526691385234813e+01 -6.0032107112528408e+01 -3.5730869336520715e+02 + 33 -5.5175351378411172e+01 -6.5080088537111621e+01 2.5865292839344658e+01 + 34 -1.1543911216130398e+02 6.8236127903335600e+01 -1.0118927194451287e+02 + 35 -1.9213799956680472e+01 1.9102844607195075e+02 7.1033052103778402e+01 + 36 3.0831801005756219e+01 -1.0434098207680053e+02 2.6602370813951467e+01 + 37 -7.5713989526054775e+00 -1.0154277157924916e+02 5.2355102536455071e+01 + 38 2.3092581682908317e+01 -7.4103137089209241e+01 6.4780416657045649e+01 + 39 -2.9330290875477203e+01 -6.0960307285104278e+00 6.5901799160009933e+00 + 40 1.0600116458609058e+02 -8.7430816934088298e+01 7.1266265060335684e+01 + 41 -1.3017430333558579e+02 -8.1573259582159650e+01 -2.9776738110794918e+02 + 42 -2.1453051094016365e+02 1.3941569551228710e+02 2.5663751370391577e+01 + 43 1.0629399133593354e+02 -1.1466247197192891e+01 2.2661850441057820e+02 + 44 7.5018192468775652e+01 -1.0585560736160173e+02 -6.4472830750921986e+01 + 45 7.9088157890783776e+01 9.6841114351690962e+01 7.5519943073010879e+01 + 46 2.5302951664818547e+00 4.7807672829957060e+00 -5.1806857467086758e+00 + 47 2.4071848390126430e+01 1.2465810878449433e+00 -8.5591598461533550e+01 + 48 -8.8252810818004278e+01 -1.3452209615797966e+02 2.0822040822712148e+02 + 49 -6.1100468708663968e+01 6.7379169480035102e+01 2.1441518814216977e+01 + 50 -7.4118407705379248e+00 -5.1688261082488566e+01 2.8114887540313440e+01 + 51 1.3944057842560818e+02 -1.2733205956254339e+02 2.0515592770355565e+02 + 52 -6.1106883617627190e+01 6.7644614397380181e+01 -3.6422098308794773e+01 + 53 -1.9170676999130563e+02 2.0843616102282220e+02 -1.6959579316512270e+02 + 54 2.4878866915887226e+01 1.0596192588144160e+02 2.1250375074422794e+02 + 55 -3.9153422927045035e+01 5.1158004744033732e+01 -2.6564384804474741e+01 + 56 -2.8788922936807829e+01 1.8310220303650947e+01 -2.5904237982961323e+01 + 57 -8.3967616117189579e+00 1.3139640815820220e+01 1.8776856689543692e+01 + 58 8.0520346511830340e+01 -1.0356100790779284e+02 2.6833253341722650e+02 + 59 9.5332616520452888e+01 -5.5896064623920537e+01 -5.6619747031380633e+01 + 60 -9.0791379544766059e+01 1.8120554124534900e+02 -1.2771516247293829e+02 + 61 1.1257286974925211e+00 -2.5749832108467395e+01 -4.7742793375069290e+00 + 62 4.8335677189028729e+01 -2.2352155494149258e+01 -1.3288428813219548e+02 + 63 6.9406187818858854e+01 2.5581024848345599e+01 -6.8743421173092315e+01 + 64 7.6305806582397707e+01 1.2929079621357693e+02 -5.3915818980698262e+01 +run_vdwl: -3462.15832508689 +run_coul: -347.6469056403377 run_stress: ! |- - -9.1826184153105157e+02 -1.1070021528098894e+03 -7.1550580149014127e+02 -2.3049698812230326e+02 1.9635464153061940e+02 -6.6005793264640170e+02 + -9.5557280504299797e+02 -5.1248477586174465e+02 -1.0984422767816800e+03 -1.7123999046624530e+02 -1.7279633494715245e+02 -4.3392144074134490e+02 run_forces: ! |2 - 1 -8.8485813027205879e+01 -2.5824096764125525e+01 1.0916519811125180e+02 - 2 -1.0451269244764356e+02 -1.8137828885716345e+02 -2.1792302517211803e+02 - 3 -1.7141411648636472e+02 1.8106803267132443e+02 1.2674658958989310e+01 - 4 3.2220655253012147e+01 -5.1413086231066018e+01 9.0010227071395775e+01 - 5 1.8145005123751906e+02 1.6799086578425971e+01 -8.1723924656170112e+01 - 6 1.3640868425590043e+02 -3.0059549892327095e+02 2.9595528779455464e+01 - 7 -5.2968868171259274e+01 -1.2850640761855169e+02 -1.6373951876943821e+02 - 8 -1.5240417232930909e+02 4.1133578832982849e+01 1.5386572595284787e+02 - 9 3.2811395144161125e+01 1.0176141517530712e+02 1.4295529169372347e+01 - 10 7.9508569375402061e+01 1.3053469081285704e+02 1.1246210158699010e+02 - 11 -4.3142968406858984e+01 6.5760241919953870e+01 1.3481728343070949e+02 - 12 -9.6708250458846805e+01 -2.5879521605003482e+01 7.8278088000700956e+00 - 13 -6.3852523341823662e+01 -4.6607003335506974e+01 -3.6455965991574999e+01 - 14 7.8283534745824994e+01 -6.3643851884097195e+01 -8.9027881489334987e+01 - 15 -6.4209962316685761e+01 2.1093255387179562e+02 7.9059692211125224e+01 - 16 1.8608085162130848e+02 5.8088780803195213e+01 5.8532604899052622e+01 - 17 1.4285609630789867e+02 -3.9754014601715731e+01 -9.7689588113924316e+01 - 18 -4.1881237955183408e+01 -1.8477109777149803e+02 1.0708061287038574e+02 - 19 2.6677609377410056e+02 3.7179392086487513e+02 -3.3866472006706277e+02 - 20 -7.3532190353882811e+01 -8.3895301502997327e+01 -2.5591151699003645e-01 - 21 -7.2528695460850884e+01 -5.5899068566580368e+01 -1.1975970158719973e+02 - 22 1.5614083463623408e+02 -1.3200472837628507e+02 8.2112156159808734e+01 - 23 8.1835290134892873e+01 -1.7522433028940874e+01 -2.5648597332803881e+01 - 24 -2.1834038832017586e+02 1.9455197293610044e+02 -1.0818261235148471e+02 - 25 -1.1414871301032660e+02 1.9089327234338924e+02 -8.3363315092572293e+01 - 26 2.8282661127556150e+02 -2.1478990451658234e+02 2.2874215408671139e+02 - 27 -5.9765619577841832e+01 6.5223096224356397e+01 1.7553677772771701e+02 - 28 -2.9624987519851897e+00 3.8179667154298997e+01 3.2185280629057125e+01 - 29 -7.1069494187081887e+01 3.5486459200488106e+01 2.7311657807311299e+01 - 30 -1.7037047317028481e+02 -1.9851861739498051e+02 -1.1511395377375443e+02 - 31 -1.3744346258178393e+02 1.6223725554250453e+02 -1.1915482471876388e+02 - 32 2.7248541075000094e+01 -6.0231207974705242e+01 -1.7663875080811815e+02 - 33 -6.1822398570958846e+01 -6.2648503570176707e+01 6.4194898940197433e+01 - 34 -1.7143769208529715e+01 9.9611942509071866e+01 -6.7436075885014773e+01 - 35 2.7028238194295989e+02 -2.1538301386687783e+02 1.3022488558865422e+02 - 36 1.0192362247594411e+02 1.8671008619975396e+02 -1.9863711527085906e+02 - 37 -1.7946751638141629e+02 1.2998098195714053e+02 -6.4345576150932018e+01 - 38 -2.9675376021752220e+02 1.0371435865032272e+02 1.5526896750689843e+02 - 39 8.6950332148131821e+01 -5.9975388525041552e+01 2.1779869753193609e+01 - 40 2.1613442490343157e+01 -1.0242529062335275e+02 5.7271060256879721e+01 - 41 -5.7834219239598042e+01 1.2266148111030933e+01 -6.6169611760841988e+01 - 42 -9.4774021509188572e+01 3.6869981851995284e+01 -7.5005285702020970e+01 - 43 2.2327078175416045e+02 9.5796580610065718e+01 1.2250057895428380e+02 - 44 8.7963372590925957e+01 -9.8736166841310350e+01 -8.4943701327958024e+01 - 45 1.4080569929277932e+01 1.2498603359504180e+02 5.5870075675506833e+01 - 46 1.3549084713162397e+01 -2.9276453411014931e+01 2.2187141786217122e+01 - 47 3.3448153520154300e+01 -1.9209514330879966e+02 -6.9988284949882612e+01 - 48 6.7840148074197515e+01 -2.0361975956922043e+02 -2.8580806381848195e+01 - 49 -3.7480020999441189e+02 -2.4397739069897924e+01 1.0773474200196188e+02 - 50 4.0091767398973481e+01 -7.3200211843412120e+01 8.9024460533546659e+01 - 51 1.3736689552057086e+02 -1.0204490779999115e+02 1.5814099219631345e+02 - 52 -1.1253380764230057e+02 1.2293290174735424e+02 -1.2940467151627436e+02 - 53 -5.3596650492501226e+01 3.3350644289105054e+02 -1.1510223807931013e+00 - 54 -1.0666202581574392e+01 6.2798090272532065e+01 1.8346799239172432e+02 - 55 1.1232135575968978e+02 -1.7906994470748421e+02 7.6534265236354258e+01 - 56 -4.7780797026174341e+01 -1.3535955159718625e+02 3.4061208199866691e+01 - 57 9.6541265005137859e+01 7.5091144884198968e+01 -6.0860069746424841e+01 - 58 -2.0459328007572417e+01 -1.1533053731831775e+01 -1.4282938438265299e+01 - 59 -6.9467796604507171e+01 1.0186323697055771e+02 8.3388794196803403e+01 - 60 -1.6660217426513878e+01 6.4061566362646886e+01 -1.5162714312949183e+02 - 61 -3.5220536021453441e+01 -1.0209241739133059e+02 -7.4154706185261531e+01 - 62 1.5375483178245876e+01 -6.3263099051316445e+00 2.7512110875657353e+01 - 63 1.3464595988109846e+02 -1.2416936634154274e+02 -5.8957063242417227e+01 - 64 1.0701154605982788e+02 1.1895382951205521e+02 7.4449321163286456e+01 + 1 -2.4430315534254614e+01 -2.8004832007788019e+02 -1.9584906552543721e+01 + 2 -1.0151792026844252e+02 -1.1421397443022799e+02 2.6343455460841717e+01 + 3 1.3156161222739698e+02 -1.9435216603338736e+02 1.4381223005420141e+01 + 4 2.0163725642626855e+02 2.6653530746001792e+02 -1.2060066880351498e+02 + 5 -7.1729665475711499e+01 1.0462434100207217e+02 -1.6180852085636820e+02 + 6 2.8381046384561927e+01 -3.1043522425804326e-01 -3.2844606683196230e+02 + 7 1.9479825849867908e+01 7.7515561856384224e+01 -2.3651316977008587e+01 + 8 -8.9160759632319483e+01 -2.5163455610853902e+02 1.5631618361509192e+02 + 9 3.8837107770368185e+01 7.3659635846815064e+01 1.1428587754673860e+01 + 10 -7.5379803260168089e+01 1.4391740689909756e+02 -1.2089517455268330e+02 + 11 -1.3561687298495647e+02 -2.0418726529990266e+01 2.1196100799829293e+02 + 12 5.2155118264079041e+00 4.5147295071784932e+01 -4.6045731618905648e+01 + 13 -1.4435391808575389e+02 -8.9565763077738936e+01 1.5656019130252011e+02 + 14 1.0632345883765107e+02 -3.8129104423446314e+01 -1.7501644341364280e+02 + 15 1.8628890455248219e+02 2.9762650626245443e+02 1.4663899615626846e+02 + 16 -3.9347178810152855e+01 2.0388040019898148e+02 3.0850764218960933e+02 + 17 -9.2672329408236376e-01 4.0804488338941454e+00 -8.3916156460028674e-02 + 18 2.1334840259121864e+02 -8.1793680260789387e+01 3.0441972623043262e+02 + 19 1.0446965451636562e+02 4.9050800677429088e+01 1.6080340169195037e+02 + 20 2.0839445123442962e+02 2.0478210983373376e+02 1.7699724558753019e+01 + 21 -7.0718320624765539e+01 8.2566109479585652e+00 -2.1873088514791000e+01 + 22 -9.5218414105711190e+01 -9.9707468039054120e+01 -9.6345131695646685e+01 + 23 -4.4625731814109194e+01 -8.7573267265023318e+01 -5.4634346162501750e+01 + 24 -2.7964756788174157e+02 -8.2724984007457152e+01 -1.6822672173185802e+02 + 25 7.5683922540058761e+00 2.3366267836905774e+01 -1.6770506787070325e+01 + 26 1.1604790760944783e+02 -8.9594950849273545e+00 1.7280749604512629e+01 + 27 8.4712821576677001e+01 -1.3809303445857137e+02 -8.5964057822221662e+01 + 28 -6.1927190495957866e+01 3.3734134390012770e+01 -4.5711024047462907e+01 + 29 -3.5961790759317431e+01 4.9920924266276593e+01 3.3635317084946649e+01 + 30 5.3869670890313749e+01 -2.5517413322313789e+02 4.4268500365661424e+01 + 31 -3.2202505503981591e+01 5.5828623464167020e+00 -1.1880720492640272e+02 + 32 -3.7500759049558795e+01 -6.0047656469966256e+01 -3.5728452302182205e+02 + 33 -5.5178145568566684e+01 -6.5082158533009661e+01 2.5868392220404150e+01 + 34 -1.1543860118441475e+02 6.8235801457627616e+01 -1.0118874088124340e+02 + 35 -1.9207205286808197e+01 1.9102838550801960e+02 7.1031439509970141e+01 + 36 3.0831203485775930e+01 -1.0432900155657006e+02 2.6595183087826573e+01 + 37 -7.5737976096649966e+00 -1.0154442829476221e+02 5.2357585878493794e+01 + 38 2.3092498513401701e+01 -7.4102230677716619e+01 6.4780221438916143e+01 + 39 -2.9331084576333197e+01 -6.0975367648906786e+00 6.5895688319825672e+00 + 40 1.0600095163279190e+02 -8.7431470225864416e+01 7.1266421628039865e+01 + 41 -1.3017328830401735e+02 -8.1570348965554615e+01 -2.9776442172394337e+02 + 42 -2.1453046700154917e+02 1.3941326486318263e+02 2.5662062050342737e+01 + 43 1.0627914890319921e+02 -1.1455449124741092e+01 2.2663091287740994e+02 + 44 7.5019633897193856e+01 -1.0585752140897280e+02 -6.4472580116689215e+01 + 45 7.9083991392524098e+01 9.6838149770972720e+01 7.5518769048795704e+01 + 46 2.5303987696843429e+00 4.7806955467128054e+00 -5.1809025959580906e+00 + 47 2.4071659181283596e+01 1.2462863374651549e+00 -8.5591229804312945e+01 + 48 -8.8251976448078082e+01 -1.3452581107603882e+02 2.0821861346508436e+02 + 49 -6.1101475523120222e+01 6.7380420842769681e+01 2.1443572066418000e+01 + 50 -7.4108443338806698e+00 -5.1693852569340422e+01 2.8116638715409263e+01 + 51 1.3944516462581453e+02 -1.2733817411071853e+02 2.0516259166636041e+02 + 52 -6.1106538326662843e+01 6.7644593844629284e+01 -3.6420697913557078e+01 + 53 -1.9171037461979290e+02 2.0844249498693475e+02 -1.6960212091107570e+02 + 54 2.4882367570042433e+01 1.0595964233440492e+02 2.1250380754459579e+02 + 55 -3.9153904305876551e+01 5.1159352836597179e+01 -2.6565172918805139e+01 + 56 -2.8790138923238434e+01 1.8313449942404894e+01 -2.5902299265978520e+01 + 57 -8.3963523800333260e+00 1.3140761128226895e+01 1.8777449755091322e+01 + 58 8.0517328146292854e+01 -1.0356019329999572e+02 2.6833094528089066e+02 + 59 9.5330175717605997e+01 -5.5893277271235014e+01 -5.6618367496223406e+01 + 60 -9.0771794133511477e+01 1.8121760766984133e+02 -1.2769689414362621e+02 + 61 1.1252548849304365e+00 -2.5751305843276146e+01 -4.7749990374823019e+00 + 62 4.8336198365565622e+01 -2.2352464015141923e+01 -1.3288232683549251e+02 + 63 6.9406071564752736e+01 2.5581535338260785e+01 -6.8743205584880343e+01 + 64 7.6303354908211602e+01 1.2926893231393868e+02 -5.3945572382871710e+01 ... diff --git a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate_flag.yaml b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate_flag.yaml index e84f1549d7..c4d5edf2a4 100644 --- a/unittest/force-styles/tests/atomic-pair-reaxff_tabulate_flag.yaml +++ b/unittest/force-styles/tests/atomic-pair-reaxff_tabulate_flag.yaml @@ -1,7 +1,7 @@ --- -lammps_version: 17 Feb 2022 +lammps_version: 2 Apr 2025 tags: slow, unstable, noWindows -date_generated: Fri Mar 18 22:17:41 2022 +date_generated: Fri Apr 25 19:44:19 2025 epsilon: 1e-10 skip_tests: prerequisites: ! | @@ -23,8 +23,8 @@ pre_commands: ! | mass 1 1.0 mass 2 12.0 mass 3 16.0 - set type 1 type/fraction 2 0.5 998877 - set type 2 type/fraction 3 0.5 887766 + set type 1 type/ratio 2 0.5 998877 + set type 2 type/ratio 3 0.5 887766 set type 1 charge 0.00 set type 2 charge 0.01 set type 3 charge -0.01 @@ -37,142 +37,142 @@ pair_coeff: ! | * * ffield.reax.mattsson H C O extract: ! "" natoms: 64 -init_vdwl: -3296.3503506626616 -init_coul: -327.0655125227951 +init_vdwl: -3524.4677081314376 +init_coul: -347.646642744037 init_stress: ! |- - -1.0522112314767739e+03 -1.2629480788300507e+03 -8.6765541430813960e+02 -2.5149818635818815e+02 2.0624598409312082e+02 -6.4309968343211722e+02 + -1.1051529177618340e+03 -6.9898054108811152e+02 -1.2354119890995198e+03 -1.8088602511199127e+02 -1.6771232489480590e+02 -4.4506735206404625e+02 init_forces: ! |2 - 1 -8.8484559491556382e+01 -2.5824737864573983e+01 1.0916228789487873e+02 - 2 -1.1227736122977277e+02 -1.8092349731667605e+02 -2.2420586526897370e+02 - 3 -1.7210817575848947e+02 1.8292439782307875e+02 1.3552618819708533e+01 - 4 3.2997500231077154e+01 -5.1076027616179601e+01 9.0475628837081842e+01 - 5 1.8144778146276349e+02 1.6797701000585050e+01 -8.1725507301130364e+01 - 6 1.3634094180728192e+02 -3.0056789473999623e+02 2.9661495129810405e+01 - 7 -5.3287158661290789e+01 -1.2872927610193449e+02 -1.6347871108898252e+02 - 8 -1.5334883257588743e+02 4.0171483324132680e+01 1.5317461163040250e+02 - 9 1.8364155867626959e+01 8.1986572088184701e+01 2.8272397798085894e+01 - 10 8.4246730110715987e+01 1.4177487113457067e+02 1.2330079878579899e+02 - 11 -4.3218423112503842e+01 6.5551082199269587e+01 1.3464882148701912e+02 - 12 -9.7317470492945631e+01 -2.6234999414165472e+01 7.2277941881737764e+00 - 13 -6.3183329836750836e+01 -4.7368101002963598e+01 -3.7592654029327193e+01 - 14 7.8642975316494244e+01 -6.7997612991911694e+01 -9.9044775614588744e+01 - 15 -6.6373732796047932e+01 2.1787558547533155e+02 8.0103149369097338e+01 - 16 1.9216166082224782e+02 5.3228015320736134e+01 6.6260214054225131e+01 - 17 1.4496007689503503e+02 -3.9700923044581437e+01 -9.7503851828125505e+01 - 18 -4.4989550233791071e+01 -1.9360605894359685e+02 1.1274792197022768e+02 - 19 2.6657528138946020e+02 3.7189510796653042e+02 -3.3847307488286617e+02 - 20 -7.6341040242475444e+01 -8.8478925962195433e+01 1.3557778211944747e+00 - 21 -7.1188591900927975e+01 -5.1591439985149663e+01 -1.2279442803768826e+02 - 22 1.5504836733040739e+02 -1.3094504458747130e+02 8.1474408030773745e+01 - 23 7.8015302036850684e+01 -1.3272310040531675e+01 -2.2771427736555765e+01 - 24 -2.0546718065740677e+02 2.1611071031056295e+02 -1.2423208053538556e+02 - 25 -1.1402686646199388e+02 1.9100238121127512e+02 -8.3504908417575137e+01 - 26 2.8663576552100676e+02 -2.1773884754172562e+02 2.3144300100085067e+02 - 27 -6.3247409025600703e+01 6.9122196748089010e+01 1.8606936744368679e+02 - 28 -3.5426011056020812e+00 3.8764809029448422e+01 3.2874001946771756e+01 - 29 -7.1069178571897908e+01 3.5485903180455900e+01 2.7311648896337541e+01 - 30 -1.7036987830119247e+02 -1.9851827590032605e+02 -1.1511401829122852e+02 - 31 -1.3970409889743564e+02 1.6660943915627317e+02 -1.2913930522474985e+02 - 32 2.7179130444097446e+01 -6.0169059447608205e+01 -1.7669495182016888e+02 - 33 -6.2659679124097771e+01 -6.4422131921802787e+01 6.4150928205326565e+01 - 34 -2.2119065265688945e+01 1.0450386886831190e+02 -7.3998379587547589e+01 - 35 2.6982987783289036e+02 -2.1519317040004464e+02 1.3051628460667473e+02 - 36 1.0368628874510270e+02 1.8817377639771777e+02 -1.9748944223862577e+02 - 37 -1.8009522406830411e+02 1.2993653092252046e+02 -6.3523043394127271e+01 - 38 -2.9571205878459335e+02 1.0441609933480150e+02 1.5582204859043446e+02 - 39 8.7398805727037654e+01 -6.0025559644662380e+01 2.2209742009840170e+01 - 40 2.0540672579010515e+01 -1.0735874009092471e+02 5.8655918369889903e+01 - 41 -5.8895846271433207e+01 1.1852345624580465e+01 -6.6147257724520060e+01 - 42 -9.6895512314625066e+01 3.8928741136637136e+01 -7.5791929957169501e+01 - 43 2.2476051812062840e+02 9.5505204283227812e+01 1.2309042240718378e+02 - 44 8.9817373579481696e+01 -1.0616333580629221e+02 -8.6321519086262015e+01 - 45 1.7202629662563449e+01 1.2890307246702787e+02 5.2916171301120116e+01 - 46 1.3547783972599687e+01 -2.9276223331262454e+01 2.2187412696868645e+01 - 47 3.3389762514712750e+01 -1.9217585014964845e+02 -6.9956213241085010e+01 - 48 7.3631720332058350e+01 -2.0953007324684327e+02 -2.3183566221369695e+01 - 49 -3.7589944473226365e+02 -2.4083165714761193e+01 1.0770339502610332e+02 - 50 3.8603083564804365e+01 -7.3616481568807856e+01 9.0414065019653606e+01 - 51 1.3736420686697036e+02 -1.0204157331499393e+02 1.5813725581140881e+02 - 52 -1.0797257051088971e+02 1.1876975735152031e+02 -1.3295758126487445e+02 - 53 -5.3807540206216601e+01 3.3259462625846481e+02 -3.8426832264590871e-03 - 54 -1.0690184616179629e+01 6.2820270853641588e+01 1.8343158343322301e+02 - 55 1.1231900459987541e+02 -1.7906654831317354e+02 7.6533681064342233e+01 - 56 -4.1027190034880071e+01 -1.4085413191126139e+02 3.7483064289929089e+01 - 57 9.9904315214043436e+01 7.0938939080466611e+01 -6.8654961257655273e+01 - 58 -2.7563642882025118e+01 -6.7445498717118797e+00 -1.8442640542825089e+01 - 59 -6.6628933617811782e+01 1.0613066354106414e+02 8.7736153919801936e+01 - 60 -1.7748415247445365e+01 6.3757605316886128e+01 -1.5086907478327481e+02 - 61 -3.3560907195794940e+01 -1.0076987083174126e+02 -7.4536106106935293e+01 - 62 1.5883428926665619e+01 -5.8433760297918971e+00 2.8392494016028731e+01 - 63 1.3294494001299765e+02 -1.2724568063770006e+02 -6.4886848316829756e+01 - 64 1.0738157273931063e+02 1.2062173788161793e+02 7.4541400611720547e+01 -run_vdwl: -3296.346882377935 -run_coul: -327.0653995073889 + 1 -1.9975568051763766e+01 -2.9038675172530105e+02 -2.4262971074787028e+01 + 2 -1.0096684921630765e+02 -1.1446632411858414e+02 2.7107768487136340e+01 + 3 1.3570779596617965e+02 -1.9708962364053605e+02 9.1414372627359324e+00 + 4 2.0163792773517079e+02 2.6653872421153721e+02 -1.2060099790513077e+02 + 5 -7.1849159814082867e+01 1.0447379081879131e+02 -1.6169651782023629e+02 + 6 2.9518740900702255e+01 -3.0496184460491804e-01 -3.2988641889433922e+02 + 7 1.8870799339147972e+01 7.8648477976005751e+01 -2.2724554420025640e+01 + 8 -8.9147833235523834e+01 -2.5164010033629114e+02 1.5630382929053300e+02 + 9 3.9476418396821494e+01 7.8951585581062034e+01 1.3508270465629579e+01 + 10 -7.6070515048249959e+01 1.4252415664560385e+02 -1.2227741520158062e+02 + 11 -1.3561600551375744e+02 -2.0414301666437318e+01 2.1197081239379023e+02 + 12 5.8639561536255123e+00 4.3384249886616288e+01 -4.6636308382060832e+01 + 13 -1.4706349318650680e+02 -9.0541856209817524e+01 1.5355665947873055e+02 + 14 1.1456010048104319e+02 -3.3907083169926636e+01 -1.7984987197087995e+02 + 15 1.8628723453103086e+02 2.9761809716362177e+02 1.4663587778225585e+02 + 16 -4.3474707841854766e+01 2.1027305846251099e+02 3.1408997130697088e+02 + 17 -8.7927082508894627e-01 4.1409270081111291e+00 -1.3214993258283655e-01 + 18 2.1374422859345890e+02 -8.0390819928070513e+01 3.0355460568773907e+02 + 19 1.0447667769651514e+02 4.9027545225148643e+01 1.6082336119767012e+02 + 20 2.1546707348059911e+02 2.0808364634936493e+02 2.5287817794792982e+01 + 21 -6.9220962761161971e+01 1.0848607119354483e+01 -2.2899047529100098e+01 + 22 -9.5218047134246547e+01 -9.9708301270118199e+01 -9.6345985205420661e+01 + 23 -4.4622971249087918e+01 -8.7569925717419153e+01 -5.4631627217054060e+01 + 24 -2.8904031192989959e+02 -8.8657903574056434e+01 -1.7226320360835004e+02 + 25 8.2020312508649749e+00 2.4273149185024273e+01 -1.6293509333340939e+01 + 26 1.1621924932444810e+02 -9.0907387714378363e+00 1.7424074764350692e+01 + 27 8.5548460452082622e+01 -1.4248955254300122e+02 -8.3287702134173017e+01 + 28 -6.1916698232380540e+01 3.3745077030413526e+01 -4.5711781535376076e+01 + 29 -3.5953137924835339e+01 4.9903129984370715e+01 3.3629709007474020e+01 + 30 5.3875232342222183e+01 -2.5517985401026624e+02 4.4271734432015428e+01 + 31 -3.5706110116188739e+01 -7.0496219483541478e-01 -1.2152711141651086e+02 + 32 -3.7526691385234813e+01 -6.0032107112528408e+01 -3.5730869336520715e+02 + 33 -5.7424807380652631e+01 -6.7791879926404505e+01 2.7904266031965907e+01 + 34 -1.2191989751510908e+02 6.8647377200398054e+01 -1.0367659270795910e+02 + 35 -2.0904369548706537e+01 2.0449505803001026e+02 7.6200339736490449e+01 + 36 3.1473160714756702e+01 -1.0333653184736053e+02 2.6681713262971510e+01 + 37 -3.9158764048706765e+00 -1.0674654990048541e+02 5.4424182464674494e+01 + 38 2.3823784706349787e+01 -7.3607105690278132e+01 6.5169232769620564e+01 + 39 -3.3250767569142184e+01 -1.4166570800034185e+01 2.1824343009006300e+00 + 40 1.0600762780157665e+02 -8.7425218765160182e+01 7.1268662701325098e+01 + 41 -1.3046053875853050e+02 -7.8942090566228828e+01 -2.9611986340642090e+02 + 42 -2.1462667230740615e+02 1.3933158869993437e+02 2.5526136430486432e+01 + 43 1.0624349430036435e+02 -1.1444734415088266e+01 2.2668598482560358e+02 + 44 7.5251296888944012e+01 -1.0611422685799445e+02 -6.4239187905173594e+01 + 45 7.8629509748556714e+01 9.4867228448642905e+01 7.4435149525052068e+01 + 46 2.0400031644482031e+00 3.9539479722832862e+00 -4.0791732735838764e+00 + 47 2.5609470423892194e+01 6.3412090405715347e+00 -8.6487250654118611e+01 + 48 -8.6092982876803717e+01 -1.3802996303676863e+02 2.1311546448555615e+02 + 49 -5.9223694900013086e+01 7.0284185147649339e+01 2.3494049108911305e+01 + 50 -8.6786177835456080e+00 -5.2936415800059962e+01 2.6583304398912354e+01 + 51 1.3902569779981133e+02 -1.2818860749582635e+02 2.0593529384176713e+02 + 52 -6.1106838994151417e+01 6.7644782515935603e+01 -3.6422300435124477e+01 + 53 -1.9458684636758892e+02 2.0597114226466590e+02 -1.7148329972388041e+02 + 54 2.1789309799908633e+01 1.1706121801599821e+02 2.1816872944832392e+02 + 55 -3.8860777062185448e+01 5.0443615318386705e+01 -2.6469958938183225e+01 + 56 -2.5334105988573903e+01 1.5300050806882044e+01 -2.8930359024368592e+01 + 57 -8.5840513489993420e+00 1.3416779949434348e+01 1.9293105588304726e+01 + 58 8.0520347536282486e+01 -1.0356100998648635e+02 2.6833253509976845e+02 + 59 9.5223319862470305e+01 -5.5506040100749146e+01 -5.7717788619238455e+01 + 60 -9.1872524667981949e+01 1.8185806929801910e+02 -1.2676953988554003e+02 + 61 1.1257286974925211e+00 -2.5749832108467395e+01 -4.7742793375069290e+00 + 62 4.8013065364366874e+01 -2.2130646255798890e+01 -1.3288352300237679e+02 + 63 6.9406187868403975e+01 2.5581024929761924e+01 -6.8743421097545607e+01 + 64 7.7453771618895843e+01 1.3062109110031327e+02 -5.5574108415283050e+01 +run_vdwl: -3524.464095954964 +run_coul: -347.6469056590888 run_stress: ! |- - -1.0521225462933053e+03 -1.2628780139897558e+03 -8.6757617693171233e+02 -2.5158592653599607e+02 2.0619472152439226e+02 -6.4312943979318675e+02 + -1.1051934290121733e+03 -6.9902768302555398e+02 -1.2354546810888949e+03 -1.8088245184948778e+02 -1.6771726437668414e+02 -4.4505643915119549e+02 run_forces: ! |2 - 1 -8.8486129396000024e+01 -2.5824483374468659e+01 1.0916517213634297e+02 - 2 -1.1227648453174452e+02 -1.8093214754186096e+02 -2.2420118533941474e+02 - 3 -1.7210894875994919e+02 1.8292263268450859e+02 1.3551979435673994e+01 - 4 3.2999405001001179e+01 -5.1077312719540231e+01 9.0478579144055786e+01 - 5 1.8144963583124817e+02 1.6798391906829522e+01 -8.1723378082078895e+01 - 6 1.3640835897739544e+02 -3.0059507544861526e+02 2.9594750460787722e+01 - 7 -5.3287619129788126e+01 -1.2872953167027580e+02 -1.6348317368624893e+02 - 8 -1.5334990952322408e+02 4.0171746946782811e+01 1.5317542403105384e+02 - 9 1.8362961213920283e+01 8.1984428717781938e+01 2.8273598253031842e+01 - 10 8.4245458094792667e+01 1.4177227430519451e+02 1.2329899933660883e+02 - 11 -4.3217035356327344e+01 6.5547850976490480e+01 1.3463983671941662e+02 - 12 -9.7319343004584368e+01 -2.6236499899243547e+01 7.2232061905835634e+00 - 13 -6.3184735475527845e+01 -4.7368090836530385e+01 -3.7590268076047799e+01 - 14 7.8642680121811978e+01 -6.7994653297660861e+01 -9.9042134233426623e+01 - 15 -6.6371195967091822e+01 2.1787700653340664e+02 8.0102624694811567e+01 - 16 1.9215832443892984e+02 5.3231888618095191e+01 6.6253846562709271e+01 - 17 1.4496126989603567e+02 -3.9700366098754984e+01 -9.7506725874204676e+01 - 18 -4.4989211400009445e+01 -1.9360716191976400e+02 1.1274798810456160e+02 - 19 2.6657546213783013e+02 3.7189369483259810e+02 -3.3847202166066938e+02 - 20 -7.6352829159886866e+01 -8.8469178952293888e+01 1.3384778816960941e+00 - 21 -7.1188597560668626e+01 -5.1592404200752988e+01 -1.2279357314243077e+02 - 22 1.5504965184742042e+02 -1.3094582932681604e+02 8.1473922626951349e+01 - 23 7.8017376001382075e+01 -1.3263023728617453e+01 -2.2771654676285650e+01 - 24 -2.0547634460481828e+02 2.1612342044351584e+02 -1.2423651650061315e+02 - 25 -1.1402944116092222e+02 1.9100648219390598e+02 -8.3505645569840212e+01 - 26 2.8664542299412409e+02 -2.1774609219882660e+02 2.3144720166992016e+02 - 27 -6.3243843868032656e+01 6.9123801262967206e+01 1.8607035157681563e+02 - 28 -3.5444604842081215e+00 3.8760531647711197e+01 3.2869123667284832e+01 - 29 -7.1069494158200399e+01 3.5486459158788790e+01 2.7311657876198385e+01 - 30 -1.7037059987991728e+02 -1.9851840131670684e+02 -1.1511410156294964e+02 - 31 -1.3970663440086241e+02 1.6660841802304273e+02 -1.2914070628113075e+02 - 32 2.7179939937123169e+01 -6.0162678551463856e+01 -1.7668459764112271e+02 - 33 -6.2659124615696278e+01 -6.4421915847949094e+01 6.4151176691093468e+01 - 34 -2.2118740875414911e+01 1.0450303589341824e+02 -7.3997370482692702e+01 - 35 2.6987081482971610e+02 -2.1523754104001401e+02 1.3052736086177433e+02 - 36 1.0368798521809174e+02 1.8816694370717531e+02 -1.9748485159165185e+02 - 37 -1.8012152563997321e+02 1.2997662140310976e+02 -6.3547259053662522e+01 - 38 -2.9571525697590181e+02 1.0441941743732498e+02 1.5582112543443168e+02 - 39 8.7399620724583912e+01 -6.0025787992404332e+01 2.2209357601285220e+01 - 40 2.0541458171950481e+01 -1.0735817059033118e+02 5.8656280350522010e+01 - 41 -5.8893965304960851e+01 1.1850504754255528e+01 -6.6138932258972062e+01 - 42 -9.6894702780974654e+01 3.8926449644123046e+01 -7.5794133002818327e+01 - 43 2.2475651760389815e+02 9.5503072846826939e+01 1.2308683766845016e+02 - 44 8.9821846939836348e+01 -1.0615882525758136e+02 -8.6326896770196470e+01 - 45 1.7193681344320908e+01 1.2889564928825573e+02 5.2922372841304046e+01 - 46 1.3549091739277930e+01 -2.9276447091759820e+01 2.2187152043657580e+01 - 47 3.3389460345593911e+01 -1.9217121673024212e+02 -6.9954603582949275e+01 - 48 7.3644268618798534e+01 -2.0953201921818703e+02 -2.3192562071378255e+01 - 49 -3.7593958318940093e+02 -2.4028439106856851e+01 1.0779151134440758e+02 - 50 3.8603926624309118e+01 -7.3615255297997692e+01 9.0412505212301113e+01 - 51 1.3736689552205237e+02 -1.0204490780180465e+02 1.5814099219642898e+02 - 52 -1.0797151154268903e+02 1.1876989597627045e+02 -1.3296150756378304e+02 - 53 -5.3843453069379898e+01 3.3257024143948752e+02 -2.3416395286623981e-02 - 54 -1.0678049522660420e+01 6.2807424617051971e+01 1.8344969045861674e+02 - 55 1.1232135576105584e+02 -1.7906994470562006e+02 7.6534265234549238e+01 - 56 -4.1035945990491449e+01 -1.4084577238057412e+02 3.7489705598223743e+01 - 57 9.9903872061949045e+01 7.0936213558029181e+01 -6.8656338416446431e+01 - 58 -2.7563844572722548e+01 -6.7426705471903254e+00 -1.8442803060446984e+01 - 59 -6.6637290503326170e+01 1.0613630918456353e+02 8.7741455199743655e+01 - 60 -1.7749706497443636e+01 6.3756413885649643e+01 -1.5086911682893643e+02 - 61 -3.3559889608753323e+01 -1.0076809277084797e+02 -7.4536003122045486e+01 - 62 1.5883833834736718e+01 -5.8439916924713371e+00 2.8393403991140676e+01 - 63 1.3294237052897660e+02 -1.2724619636182842e+02 -6.4882384014242263e+01 - 64 1.0738250214939008e+02 1.2062290362869123e+02 7.4541927445538832e+01 + 1 -1.9977010483022376e+01 -2.9038171013969696e+02 -2.4259656082130270e+01 + 2 -1.0097149749217169e+02 -1.1446642672560409e+02 2.7101459065373231e+01 + 3 1.3570698949038788e+02 -1.9708578479602539e+02 9.1425100257332055e+00 + 4 2.0163734607868025e+02 2.6653650914647318e+02 -1.2060089691478943e+02 + 5 -7.1850556088178763e+01 1.0447445551751019e+02 -1.6169815371127874e+02 + 6 2.9526696745172075e+01 -3.1076000900428369e-01 -3.2989434693383976e+02 + 7 1.8873627009136261e+01 7.8647167669878499e+01 -2.2720929675050392e+01 + 8 -8.9160937828196865e+01 -2.5163439814986543e+02 1.5631620260948930e+02 + 9 3.9474995990802029e+01 7.8951405257908647e+01 1.3506314219006226e+01 + 10 -7.6070120908800718e+01 1.4252192903413575e+02 -1.2227844070520841e+02 + 11 -1.3561687298243561e+02 -2.0418726530238612e+01 2.1196100799247216e+02 + 12 5.8628742032479408e+00 4.3383132315999788e+01 -4.6638659719258506e+01 + 13 -1.4706261843079997e+02 -9.0538818099249340e+01 1.5355803596957921e+02 + 14 1.1456350790792358e+02 -3.3905168449424174e+01 -1.7985242163893255e+02 + 15 1.8628890219019638e+02 2.9762650853491584e+02 1.4663899413905750e+02 + 16 -4.3471143338401056e+01 2.1027790494286387e+02 3.1410406726812170e+02 + 17 -8.7907556704237499e-01 4.1411279584488145e+00 -1.3207840836997098e-01 + 18 2.1372326891264211e+02 -8.0370205083911486e+01 3.0353770031394583e+02 + 19 1.0448582906834505e+02 4.9025196371465000e+01 1.6082199151139287e+02 + 20 2.1546742308717594e+02 2.0808590023735570e+02 2.5287257765857014e+01 + 21 -6.9219420141700098e+01 1.0843374761767473e+01 -2.2895372523309700e+01 + 22 -9.5216482085243797e+01 -9.9708016803160746e+01 -9.6347016261433239e+01 + 23 -4.4625731834312241e+01 -8.7573267297006964e+01 -5.4634346188044660e+01 + 24 -2.8903903801760214e+02 -8.8664401076271005e+01 -1.7226565940540996e+02 + 25 8.2026190164742872e+00 2.4273537174744742e+01 -1.6294101790953359e+01 + 26 1.1623353129281666e+02 -9.1032393510298171e+00 1.7412278274027884e+01 + 27 8.5547637218857204e+01 -1.4249597587217573e+02 -8.3290728723727881e+01 + 28 -6.1927190494222899e+01 3.3734134398598783e+01 -4.5711024060836934e+01 + 29 -3.5961793239107273e+01 4.9920927302033597e+01 3.3635315767112942e+01 + 30 5.3869672608909042e+01 -2.5517413442673120e+02 4.4268498925763446e+01 + 31 -3.5706763705926377e+01 -7.0598741672264009e-01 -1.2152795434283411e+02 + 32 -3.7500759039191081e+01 -6.0047656479492289e+01 -3.5728452301786859e+02 + 33 -5.7427697249292557e+01 -6.7794066316947649e+01 2.7907425859181544e+01 + 34 -1.2191934999027282e+02 6.8647103365077569e+01 -1.0367606340867211e+02 + 35 -2.0897696998921699e+01 2.0449496591807653e+02 7.6198711397558057e+01 + 36 3.1472546108746275e+01 -1.0332452658794803e+02 2.6674532495443625e+01 + 37 -3.9182891640897743e+00 -1.0674817278669936e+02 5.4426669939403851e+01 + 38 2.3823688143363160e+01 -7.3606214196452484e+01 6.5169031336421369e+01 + 39 -3.3251571306390552e+01 -1.4168113735887943e+01 2.1818673759639347e+00 + 40 1.0600741402342236e+02 -8.7425872749494417e+01 7.1268818931890607e+01 + 41 -1.3045962544394851e+02 -7.8939297254989782e+01 -2.9611694773457310e+02 + 42 -2.1462663012225050e+02 1.3932915585634356e+02 2.5524443635879599e+01 + 43 1.0622863748895166e+02 -1.1433924368647574e+01 2.2669839882863400e+02 + 44 7.5252755426331106e+01 -1.0611616477718482e+02 -6.4238915017800906e+01 + 45 7.8625452329699698e+01 9.4864369916223907e+01 7.4434029092481126e+01 + 46 2.0401255029724541e+00 3.9538817739924235e+00 -4.0794059101240485e+00 + 47 2.5609332133327545e+01 6.3407994179109934e+00 -8.6486927019345472e+01 + 48 -8.6092152175977517e+01 -1.3803372609293939e+02 2.1311367949746872e+02 + 49 -5.9224556772467871e+01 7.0285567397232910e+01 2.3496177930450429e+01 + 50 -8.6776170422875953e+00 -5.2941999924050130e+01 2.6585062491255510e+01 + 51 1.3903027347739931e+02 -1.2819473529424036e+02 2.0594196049284392e+02 + 52 -6.1106493704696781e+01 6.7644761959382109e+01 -3.6420900035134117e+01 + 53 -1.9459057020128685e+02 2.0597736590704500e+02 -1.7148969961627557e+02 + 54 2.1792803984442983e+01 1.1705885121837125e+02 2.1816856482601818e+02 + 55 -3.8861231168564871e+01 5.0444928368786300e+01 -2.6470728767195713e+01 + 56 -2.5335356680443674e+01 1.5303290166316913e+01 -2.8928404325571542e+01 + 57 -8.5836413332033743e+00 1.3417900731802796e+01 1.9293697283217941e+01 + 58 8.0517329219141303e+01 -1.0356019543154989e+02 2.6833094697087910e+02 + 59 9.5220847078485619e+01 -5.5503238673952843e+01 -5.7716388445215031e+01 + 60 -9.1852973158515354e+01 1.8187014698635195e+02 -1.2675125128825071e+02 + 61 1.1252548815501979e+00 -2.5751305851216742e+01 -4.7749990408088641e+00 + 62 4.8013582816582840e+01 -2.2130955596585032e+01 -1.3288156575407896e+02 + 63 6.9406071621040510e+01 2.5581535426003192e+01 -6.8743205502425113e+01 + 64 7.7451429132742334e+01 1.3059935131137956e+02 -5.5603940263176803e+01 ... diff --git a/unittest/force-styles/tests/kspace-scafacos_direct.yaml b/unittest/force-styles/tests/kspace-scafacos_direct.yaml index 5c7570f15a..cd6052e882 100644 --- a/unittest/force-styles/tests/kspace-scafacos_direct.yaml +++ b/unittest/force-styles/tests/kspace-scafacos_direct.yaml @@ -1,6 +1,6 @@ --- -lammps_version: 28 Jul 2021 -date_generated: Thu Jul 29 13:45:54 2021 +lammps_version: 2 Apr 2025 +date_generated: Fri Apr 25 19:54:58 2025 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -39,137 +39,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 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 + 1 3.6470257993570548e-01 9.8206701934591378e-01 1.3822548047760129e+01 + 2 1.5337971999541661e+01 3.5666245557635063e+00 4.8574851771828707e+00 + 3 3.8759721693446867e+00 1.9733547238100950e+00 4.3214847722289598e+00 + 4 4.6697147840364597e+00 2.9559481084481325e+00 1.5809973012706102e+01 + 5 1.8072278867253897e+00 2.1486672322513622e+00 3.0289352478353102e+00 + 6 2.0684734413450943e+00 5.3914587633563285e+00 5.1019597411634221e+00 + 7 5.5630630696976393e+00 1.9384327011202296e+00 4.2441979046275575e+00 + 8 6.3569476335525525e+00 5.2077350770315958e+00 1.4534443327706685e+00 + 9 1.5355653607572693e+01 2.1954309454936620e+00 2.9851854630789532e-01 + 10 7.2707703265962538e+00 3.7129894057926864e+00 3.3469842142521791e+00 + 11 2.0608348030060611e+01 3.1137786260506026e+01 1.3272467114973750e+01 + 12 1.0725988300668213e+01 2.3105445979277968e+00 1.4382089726618529e+01 + 13 8.5749362180128443e+00 2.0293915054907172e+00 1.6189248857025620e+00 + 14 8.6227484562690986e+00 6.1239359151902830e+00 3.8115818083264799e+00 + 15 1.2956423208728696e+01 1.9506457336658287e+00 5.8110925785610377e+00 + 16 2.4689844208836522e+01 8.6288826520988593e+00 4.5827844793188568e+00 + 17 2.7056027266440957e+01 1.5791837356349085e+01 3.0139943878734428e+01 + 18 1.4497587903399760e+01 1.1268364744454205e+01 3.1102256153741705e+00 + 19 4.1255538695814904e+00 4.8053073265382897e+00 2.9525885952862438e+00 + 20 3.8996210093349126e+00 1.1059373349996715e+01 3.6716516102124747e-01 + 21 4.7761131190546138e+00 1.7291310697131443e+01 4.0504690770794047e+00 + 22 2.9107786026533161e-01 1.4241851719501250e+01 4.7051593623697254e+00 + 23 1.2174948858675091e+01 1.7214697513566055e+01 9.5915755775964033e+00 + 24 1.1066061163029101e+01 2.3814911030432928e+01 5.0563454733667417e+00 + 25 8.3096658718743335e+00 6.8785401000938933e+00 1.4529568761289431e+01 + 26 7.9124475119091846e+00 1.0979940098421233e+01 4.2433610701574107e+00 + 27 1.0117984706777921e+01 7.2394340716904937e+00 3.6285768385293942e+00 + 28 9.9125191380858304e+00 1.0036461138450838e+01 -7.2099013124852618e-01 + 29 9.4179418788483336e+00 8.4191892989969492e+00 1.6318986711557817e+00 + 30 8.5830406917337889e+00 1.2510572410948315e+01 6.4035198715232102e+00 + 31 2.6046483714591560e+01 1.6832088287860056e+01 1.0334825828693727e+01 + 32 2.5738187251569848e+01 2.5122366992959893e+01 -2.3815353457617006e+00 + 33 1.4054244361716629e+01 1.5091866428063664e+01 7.3896855348157500e+00 + 34 2.6584421662194760e+01 4.8648562968251516e+00 2.1718967686338321e+01 + 35 4.3649232711884540e+00 2.8199196407342100e+01 2.3096550734393688e+01 + 36 6.4071619508442099e+00 7.8336322455681486e+00 1.1890801392823949e+01 + 37 -7.1556356151974765e-01 -1.2226591768842085e-01 1.0274502446900778e+01 + 38 7.3827397126173375e+00 1.1087986213057990e+01 2.6480480522699047e+01 + 39 5.7930771745214704e+00 2.6291437257541892e+00 1.3237990137541331e+01 + 40 1.1105250861893277e+01 1.0208685112971661e+01 1.8286410589629071e+01 + 41 8.6851450771510841e+00 1.6493639882838321e-01 5.0368283698391965e+00 + 42 7.5796736858907607e+00 4.6703210864625184e+00 1.3797872053021031e+01 + 43 1.1237559030157840e+01 1.3846434054432040e+01 1.0522299780710878e+01 + 44 2.2920425499111143e+01 7.5016370790879945e+00 1.3250769771678982e+01 + 45 1.9526446706015022e+01 2.0392412604547330e+00 1.6635892857061716e+01 + 46 8.0306383112247630e+00 6.7349269699318075e+00 1.2731088342027412e+01 + 47 1.1842040709344468e+01 5.5668931051447668e-01 1.2238357685615172e+01 + 48 1.3414012249577207e+01 4.6647098671706306e+00 8.0217009664521619e+00 + 49 -3.2048911022116827e-01 7.0036905115983359e+00 6.5744897939667100e+00 + 50 1.3616082676453098e+01 1.1176777697539691e+01 9.9349319730891761e+00 + 51 1.1312310729495950e+01 1.4362637559421808e+01 2.5272483923031356e+01 + 52 6.5729562936333252e+00 2.2453775768537621e+01 1.3723838232196609e+01 + 53 -8.7708123445732333e-01 1.2235382160808985e+01 5.4867897988939047e+00 + 54 1.8922478002338179e+00 2.4524548992297401e+01 2.4785987566509721e+01 + 55 6.6893614327016637e+00 9.7644498233813746e+00 1.3337335400391650e+01 + 56 1.3568730346570431e+01 2.3105163932837538e+01 1.6610522750016251e+01 + 57 1.6916290549898687e+01 1.4533803150008247e+01 1.3716004486335214e+01 + 58 8.6215186853411598e+00 1.0951822646545297e+01 1.1005103089068163e+01 + 59 1.9999833949377624e+01 1.6384264489947743e+01 2.2173903516235409e+01 + 60 1.0766391020671371e+01 1.0424865641606702e+01 7.2862544555144275e+00 + 61 9.3113782856218990e+00 1.1934090903960318e+01 1.0451448927516276e+01 + 62 9.3381684150176820e+00 1.2487531640722098e+01 1.2951877740259501e+01 + 63 1.1471828694127590e+01 1.0585444012704135e+01 1.3289376202349732e+01 + 64 1.2317766106189719e+01 1.2613171538053210e+01 9.1443118389150015e+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 + 1 3.6666754857581318e-01 9.8301494639265641e-01 1.3819474566891603e+01 + 2 1.5337031429335974e+01 3.5715202949586593e+00 4.8563613327796871e+00 + 3 3.8725219894816330e+00 1.9827910470023096e+00 4.3274271044486694e+00 + 4 4.6742211382485586e+00 2.9593336531783758e+00 1.5814399907969859e+01 + 5 1.8078381293175583e+00 2.1513219966788140e+00 3.0299965591219844e+00 + 6 2.0716086967261749e+00 5.3927854987789701e+00 5.1021014825754767e+00 + 7 5.5627132790439484e+00 1.9406292444427968e+00 4.2467843239572414e+00 + 8 6.3567747983855591e+00 5.2104522768806474e+00 1.4573255258924296e+00 + 9 1.5363738405275519e+01 2.1961794778847370e+00 2.9643696500296002e-01 + 10 7.2697802073509958e+00 3.7153163802549685e+00 3.3506533664552065e+00 + 11 2.0595930128836169e+01 3.1141077212031419e+01 1.3279369668152151e+01 + 12 1.0721537466854281e+01 2.3175999602858872e+00 1.4381951772874295e+01 + 13 8.5777860690178098e+00 2.0255601582486511e+00 1.6170531828986647e+00 + 14 8.6206692348718779e+00 6.1245859322302065e+00 3.8124923377899886e+00 + 15 1.2953072399993104e+01 1.9574294230500737e+00 5.8169527021590905e+00 + 16 2.4692609484883558e+01 8.6351990563469077e+00 4.5948150704632038e+00 + 17 2.7059484734286539e+01 1.5793581277112640e+01 3.0141914236547088e+01 + 18 1.4498429368510159e+01 1.1265563333197207e+01 3.1114361912280208e+00 + 19 4.1217832516273605e+00 4.8076453960812158e+00 2.9553629885569248e+00 + 20 3.9096126967836446e+00 1.1053841285397038e+01 3.7185251237548916e-01 + 21 4.7784919935928034e+00 1.7291857377141614e+01 4.0504130172012163e+00 + 22 2.8832597196130277e-01 1.4243428368112694e+01 4.7075486114446656e+00 + 23 1.2181470942197409e+01 1.7211005690711655e+01 9.5925803532944354e+00 + 24 1.1063998752377458e+01 2.3808728872546340e+01 5.0638450431580573e+00 + 25 8.3059541964837909e+00 6.8851870789507919e+00 1.4526885432757368e+01 + 26 7.9154907707457554e+00 1.0980616604514427e+01 4.2404442644359577e+00 + 27 1.0120307242218132e+01 7.2413450477154591e+00 3.6280162865596721e+00 + 28 9.9183706901543083e+00 1.0041277998647317e+01 -7.1600769132075448e-01 + 29 9.4161260560197704e+00 8.4207085109326716e+00 1.6340018413874580e+00 + 30 8.5807562921109479e+00 1.2512921229967931e+01 6.4024961124970146e+00 + 31 2.6049260194981237e+01 1.6829404934504748e+01 1.0338396601805536e+01 + 32 2.5747774968105958e+01 2.5110016491817010e+01 -2.3932312168751637e+00 + 33 1.4053258039434148e+01 1.5092009460858218e+01 7.3918131652630397e+00 + 34 2.6585138418784233e+01 4.8676013615927962e+00 2.1717157764575269e+01 + 35 4.3685691182735642e+00 2.8205942414244820e+01 2.3095772962023897e+01 + 36 6.4248339114728372e+00 7.8412352648917425e+00 1.1897475117239816e+01 + 37 -7.2629328951004946e-01 -1.2835191385333883e-01 1.0274454608092222e+01 + 38 7.3878139687962792e+00 1.1089063188867694e+01 2.6484283147391182e+01 + 39 5.7959670666078473e+00 2.6300636644039446e+00 1.3236970260000064e+01 + 40 1.1110717746463695e+01 1.0212943923382248e+01 1.8286244308250577e+01 + 41 8.6836254975323577e+00 1.5832880739155897e-01 5.0370239776303194e+00 + 42 7.5864305097595457e+00 4.6691719907247560e+00 1.3785684458370172e+01 + 43 1.1239300084400051e+01 1.3847926452908828e+01 1.0522400685317780e+01 + 44 2.2913450722881727e+01 7.4988398886736150e+00 1.3255345225213720e+01 + 45 1.9526254887370740e+01 2.0508014416092446e+00 1.6647109397377950e+01 + 46 8.0292930107256186e+00 6.7240228715027337e+00 1.2728917583236258e+01 + 47 1.1840860247740727e+01 5.5775159198871016e-01 1.2237526116183885e+01 + 48 1.3416979986779197e+01 4.6649959762866535e+00 8.0197299405393778e+00 + 49 -3.1646889567794906e-01 7.0042026083955253e+00 6.5717290678520559e+00 + 50 1.3616610013065099e+01 1.1180092239031685e+01 9.9346604723818874e+00 + 51 1.1309477223344407e+01 1.4348098453079011e+01 2.5277843756181497e+01 + 52 6.5847107207564388e+00 2.2449205011933966e+01 1.3724334291204656e+01 + 53 -8.6926253102247175e-01 1.2250955667428620e+01 5.4793408662080996e+00 + 54 1.8864135243421234e+00 2.4527492276767770e+01 2.4781488760818029e+01 + 55 6.6932435148613632e+00 9.7591314494139869e+00 1.3339819562530417e+01 + 56 1.3565166415907450e+01 2.3106577203498432e+01 1.6615730451867247e+01 + 57 1.6913781831140387e+01 1.4532363033874740e+01 1.3713423000505934e+01 + 58 8.6240276993269944e+00 1.0951538263322217e+01 1.1006453901518944e+01 + 59 1.9991963570187657e+01 1.6382973600967052e+01 2.2179013360105518e+01 + 60 1.0764200177105844e+01 1.0425452900962087e+01 7.2883736433164401e+00 + 61 9.3160920742868711e+00 1.1939436390269599e+01 1.0455709954810954e+01 + 62 9.3390361972601799e+00 1.2492706451684207e+01 1.2949117341192872e+01 + 63 1.1474223730696522e+01 1.0587965727110488e+01 1.3287015455774439e+01 + 64 1.2318524422084360e+01 1.2614625707821277e+01 9.1449152234169357e+00 ... diff --git a/unittest/force-styles/tests/kspace-scafacos_ewald.yaml b/unittest/force-styles/tests/kspace-scafacos_ewald.yaml index ecd6ffc221..51d95d1710 100644 --- a/unittest/force-styles/tests/kspace-scafacos_ewald.yaml +++ b/unittest/force-styles/tests/kspace-scafacos_ewald.yaml @@ -1,6 +1,6 @@ --- -lammps_version: 28 Jul 2021 -date_generated: Thu Jul 29 13:45:55 2021 +lammps_version: 2 Apr 2025 +date_generated: Fri Apr 25 19:54:59 2025 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -39,137 +39,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 -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 + 1 -6.2296583150962104e-01 3.6651095837059638e-01 7.2037380838420748e-02 + 2 8.0156586435527699e-01 -4.9121282892128543e-01 6.2169364251014614e-01 + 3 -5.5579929508663717e-01 1.6312901459863476e+00 1.1425792337289711e+00 + 4 1.2002454321887515e+00 -7.3963869824551454e-01 1.4928053617868440e+00 + 5 -1.2599582088810979e-01 4.7097585199942638e-01 1.0327416772357849e+00 + 6 -3.8455248286789834e-01 -6.3807553911573611e-01 -9.1057934465216517e-01 + 7 3.2874405483343683e-01 2.4256376896360005e-01 -1.3730883431636773e+00 + 8 5.3290029793307414e-01 -5.4628233075135590e-01 2.3665691689998902e-01 + 9 1.9317001993471838e+00 1.8041504447422401e+00 -8.6312565408917319e-01 + 10 -5.9030694346963053e-01 -3.2765692864652529e-02 6.2507172253127394e-02 + 11 -2.2890565095046300e+00 3.1506304755436378e+00 5.5979585867181898e+00 + 12 1.2701302201006887e-01 -1.4434558621810192e+00 9.3141275572848320e-02 + 13 -5.2704019141048164e-01 -3.8908144509569792e-01 4.5504076043117403e-01 + 14 -2.3999031490073158e-01 3.5230543413266241e-01 -1.4959788777232441e+00 + 15 6.1153271055640168e-01 2.1220459482374954e-01 1.2248007633213559e-01 + 16 -5.3415563838966140e-01 -1.0958853657528234e+00 1.2510296187256229e+00 + 17 -1.7375572002863944e+00 1.6474433039977781e+00 1.4029158375278090e+00 + 18 3.5633810163251184e-01 1.5202187126365829e-01 -2.8910336170982270e-01 + 19 4.3099683997148802e-01 -1.9752609560846046e+00 -3.9112813338838581e-01 + 20 6.8986865231181516e-01 6.5880767259396691e-02 5.5077366031179388e-02 + 21 9.0157801118084746e-02 -4.9408875940633090e-01 4.9546339309311010e-01 + 22 -1.1394378850708324e+00 1.7305092278556118e+00 -1.0854934608290481e+00 + 23 2.4395357376860685e+00 -4.6775250591808554e-01 -5.6538979591264527e-01 + 24 6.3235711178242171e-01 -1.3149795315996236e+00 1.0557073676628570e+00 + 25 9.2746085921290211e-01 -3.6812923467313730e-01 3.9718266304469019e-01 + 26 5.3156443372630424e-01 1.0862736160682467e-01 6.9999084372469078e-01 + 27 -1.2135596610980801e+00 5.6151248149018340e-01 1.2770549443750212e-01 + 28 -6.1707607338202908e-01 -1.3436878824076082e+00 -1.0569515230911100e+00 + 29 5.2420374355148747e-01 -1.1733655557436162e+00 -5.3682070804900517e-01 + 30 -1.1363756542596302e+00 -2.1032786140286380e-01 7.3660397052988946e-01 + 31 -1.0285434749987747e+00 -6.1081830032102702e-01 5.5234445932649123e-01 + 32 1.8149207731000532e+00 -1.1952743312381677e+00 -6.4833720938615800e+00 + 33 -2.5351766731083430e-01 7.6585398257020720e-01 3.5508929305973991e-02 + 34 -2.4331500759041349e+00 -3.4143989955404228e+00 -1.0844805781838460e+00 + 35 -3.3313396835252984e+00 1.1129250957028022e-01 2.4491488996764166e+00 + 36 2.0459714305562948e-01 1.3829578771551634e+00 -3.8812618307704123e+00 + 37 -2.8663087563391465e+00 -2.1261394410405616e+00 1.3199287873903425e+00 + 38 3.2198117012025675e+00 -3.3144794150660808e-02 1.2443967013226362e+00 + 39 6.1671324474528511e-01 8.6144347842886182e-01 1.2753645801911588e+00 + 40 -3.4463859787834761e-01 -7.4886234333460056e-01 5.3665540641994380e-01 + 41 1.7494414196976760e+00 2.8462794147102166e-01 -2.8957224490763456e+00 + 42 -2.2372796021352701e-01 1.4881751171736224e+00 3.3325575727523247e+00 + 43 6.5580733777389544e-01 -2.4150827357634827e-01 8.7807089006382830e-02 + 44 1.6440691946472050e+00 6.9443487412055874e-02 -1.0708810024467432e+00 + 45 2.4945080929352401e+00 -1.7918621818578810e+00 -1.0932311682101026e+00 + 46 -1.7073857378176216e+00 1.6813573228929461e+00 -7.4108831240854567e-01 + 47 -4.6145436398790363e-01 -9.4724960923744783e-01 -2.9909404581185633e-01 + 48 2.6876733031515415e-01 -1.3681756685516013e+00 -1.4385342062523747e+00 + 49 -2.8946438314838485e-01 2.0572032865863728e-02 -1.4160699652434559e+00 + 50 -9.0173733316458593e-01 9.8035778062514567e-01 -4.0298889879637423e-01 + 51 4.7164357512837638e+00 -1.6219026266432792e+00 4.4167025607265717e+00 + 52 5.2670719465102112e-01 3.2310822564702857e-01 3.4437963899311475e-01 + 53 -3.2403846076084055e+00 3.4740275682116977e+00 -3.9199838153841315e+00 + 54 -1.8318841616833714e+00 4.4272506653557764e-01 -6.5537050211020298e-01 + 55 4.6185684114325065e-01 6.7887004550272867e-01 8.5864703639579626e-02 + 56 2.2355002008260771e+00 -3.7411686111644884e+00 -1.4112656110361252e+00 + 57 1.1399928649955353e+00 9.4191711457064356e-02 -2.2878998688326173e+00 + 58 6.8637986080940550e-01 -4.9771723552117642e-01 4.3761327045589504e-01 + 59 -2.8982845991251622e+00 1.8240465447469427e+00 1.2562765251084524e+00 + 60 -3.0509618675131661e-01 -7.8404011359284095e-03 1.3617973488936466e-01 + 61 9.0547505025774078e-01 2.9784261250186925e+00 1.4154940085456327e+00 + 62 1.9072276482731906e-01 -1.1436885158593893e-01 1.9897020797474435e-01 + 63 -1.2512869586403670e+00 1.2045783576052853e+00 8.3797242713782327e-01 + 64 -6.0581757826255045e-01 2.1739852137586006e-02 5.3441940908516505e-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 + 1 -6.2213251665649905e-01 3.6372321676065739e-01 7.0322940402407663e-02 + 2 7.9944886942872762e-01 -4.8559712798447080e-01 6.1688938724670972e-01 + 3 -5.6001188802746116e-01 1.6410545714471187e+00 1.1472378736921875e+00 + 4 1.2001510080944346e+00 -7.4003885833701577e-01 1.4936867418337767e+00 + 5 -1.2531297388646545e-01 4.7002769315436377e-01 1.0313776537578949e+00 + 6 -3.8432826223150002e-01 -6.3623463513089307e-01 -9.1407322092551335e-01 + 7 3.2966018479753884e-01 2.4450819556826958e-01 -1.3716898900091445e+00 + 8 5.3242054647252490e-01 -5.4261441803432153e-01 2.3944214750900802e-01 + 9 1.9388057979818687e+00 1.8053705642398232e+00 -8.6574305686556685e-01 + 10 -5.9396356227868929e-01 -3.0746839104237183e-02 6.6575179639516230e-02 + 11 -2.3025233149832460e+00 3.1542661062823218e+00 5.6047185800577539e+00 + 12 1.1980994482879698e-01 -1.4410871727509182e+00 8.9563086311133369e-02 + 13 -5.2508798317990701e-01 -3.9115862800682005e-01 4.4902650415456680e-01 + 14 -2.4351667814311934e-01 3.5165481925092301e-01 -1.4954530680288149e+00 + 15 6.0762807334626601e-01 2.1746892605931914e-01 1.2914154879781808e-01 + 16 -5.2715506015437930e-01 -1.0923440505729689e+00 1.2632545549771466e+00 + 17 -1.7298573895759031e+00 1.6504716163832842e+00 1.4023198455167625e+00 + 18 3.5893110196628442e-01 1.4883369638278654e-01 -2.9088081048637310e-01 + 19 4.2804583178171518e-01 -1.9761896367153748e+00 -3.9179677344271535e-01 + 20 6.9641768510616275e-01 6.1506416568835529e-02 6.0577029839324663e-02 + 21 8.6849800047976752e-02 -4.9819860900197271e-01 4.9425139295612208e-01 + 22 -1.1446518947160294e+00 1.7338866623979086e+00 -1.0857308744453038e+00 + 23 2.4405412507919304e+00 -4.7086718962915924e-01 -5.6645168105654198e-01 + 24 6.3133959039163290e-01 -1.3236149617264963e+00 1.0558547670675220e+00 + 25 9.2074815850148239e-01 -3.5961968226818275e-01 3.9500094604876390e-01 + 26 5.3450977841556668e-01 1.0724492694756732e-01 6.9670385030296911e-01 + 27 -1.2112507722399313e+00 5.5967089919620339e-01 1.2603574291635666e-01 + 28 -6.0980256625962959e-01 -1.3379667040554184e+00 -1.0508819377601910e+00 + 29 5.2129876219477600e-01 -1.1710003413296477e+00 -5.3628796511138610e-01 + 30 -1.1384581766678727e+00 -2.0843733892991737e-01 7.3626639062084698e-01 + 31 -1.0226921449268043e+00 -6.1598627823517316e-01 5.5236366375763357e-01 + 32 1.8215265564264040e+00 -1.2084251123266381e+00 -6.5039072371393969e+00 + 33 -2.5501182214186269e-01 7.6592066134702153e-01 3.9560790321122682e-02 + 34 -2.4322711466625200e+00 -3.4133795649837748e+00 -1.0842110411129522e+00 + 35 -3.3293144411935076e+00 1.1650420982317886e-01 2.4456309358647741e+00 + 36 2.2090207728570718e-01 1.3887830629407785e+00 -3.8789554206977734e+00 + 37 -2.8748561059629902e+00 -2.1352558431964126e+00 1.3223320269260410e+00 + 38 3.2172859377653236e+00 -3.1731598493026737e-02 1.2459924027443885e+00 + 39 6.1545235049100488e-01 8.6089379077414663e-01 1.2703715196082039e+00 + 40 -3.4294404338046702e-01 -7.5003371485258630e-01 5.3530238747214776e-01 + 41 1.7434384280189625e+00 2.7732607125611136e-01 -2.8934993749596880e+00 + 42 -2.1587362318619235e-01 1.4828448945040145e+00 3.3187775058099165e+00 + 43 6.5457042817112887e-01 -2.4240689635913906e-01 8.8681133141661275e-02 + 44 1.6403299359255898e+00 5.9952777610336599e-02 -1.0650745244336282e+00 + 45 2.4972210127324006e+00 -1.7787926493430171e+00 -1.0833519469080657e+00 + 46 -1.7076309082788388e+00 1.6696119920119397e+00 -7.4249003375221789e-01 + 47 -4.6283231340192643e-01 -9.4699826026369682e-01 -2.9943908400162383e-01 + 48 2.7195581141705699e-01 -1.3704593249955219e+00 -1.4419187651886975e+00 + 49 -2.8790800703391400e-01 2.0488535681579476e-02 -1.4215449741436770e+00 + 50 -9.0372707573119415e-01 9.8395463288957619e-01 -4.0068858072037317e-01 + 51 4.7156452849497867e+00 -1.6388352096113121e+00 4.4262315388906925e+00 + 52 5.3433823719629503e-01 3.1831714020626362e-01 3.4688948647024370e-01 + 53 -3.2360087215530537e+00 3.4892468497110496e+00 -3.9271951360863788e+00 + 54 -1.8407150994712727e+00 4.4815199468096306e-01 -6.6284076610363563e-01 + 55 4.6620254891148244e-01 6.7180650541308595e-01 8.8877136455666056e-02 + 56 2.2349658687004266e+00 -3.7380559989769533e+00 -1.4108661187103875e+00 + 57 1.1339411126887717e+00 8.9144279788110709e-02 -2.2899454321209154e+00 + 58 6.8661191831046053e-01 -4.9796634728880679e-01 4.3631559928091651e-01 + 59 -2.9076126836815037e+00 1.8258123592687108e+00 1.2607022221000599e+00 + 60 -3.0770739113392376e-01 -1.0430136900350858e-02 1.3924184379086882e-01 + 61 9.0750111143979251e-01 2.9838171557172672e+00 1.4203178381513442e+00 + 62 1.9188031562583416e-01 -1.1145021465778183e-01 1.9401583710626596e-01 + 63 -1.2514736694138444e+00 1.2079720070729896e+00 8.3792722434625477e-01 + 64 -6.0374308404966204e-01 2.5686112725485963e-02 5.3714045832417978e-01 ... diff --git a/unittest/force-styles/tests/kspace-scafacos_fmm.yaml b/unittest/force-styles/tests/kspace-scafacos_fmm.yaml index f0e6d4b7e3..8af5d92e4e 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:59:36 2021 +lammps_version: 2 Apr 2025 +date_generated: Fri Apr 25 19:54:59 2025 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -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.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 + 1 2.3205887691369973e-02 6.3393280212253666e-01 1.4195867200398856e+01 + 2 1.5295855133725613e+01 3.4551350553092592e+00 4.7268852221613935e+00 + 3 3.7113223856194844e+00 1.9883404004906591e+00 4.1634301997865197e+00 + 4 4.4996147080130546e+00 2.7699277099064288e+00 1.5834471793386012e+01 + 5 1.6095444351338370e+00 1.9506282586116983e+00 2.8219596197200150e+00 + 6 2.1299141300196949e+00 5.3563569835326943e+00 5.0721524497343689e+00 + 7 5.4990054399812767e+00 1.9902818576811001e+00 4.1984625708739509e+00 + 8 6.3071268626831447e+00 5.1650067380453235e+00 1.5366944847738715e+00 + 9 1.5183091271879750e+01 2.0550541666537199e+00 6.1447643809747605e-02 + 10 7.2742933496992110e+00 3.6991615571970859e+00 3.3400165565309301e+00 + 11 2.0919571842251258e+01 3.1177110098102592e+01 1.2959611784637524e+01 + 12 1.0847635815782738e+01 2.1719089541063470e+00 1.4350764923435371e+01 + 13 8.6423857642379929e+00 1.9488118214121875e+00 1.6093515929978626e+00 + 14 8.6303677949948892e+00 6.1268490160666982e+00 3.8078073077105437e+00 + 15 1.3025409555592201e+01 1.9481166960934073e+00 5.7428103955514276e+00 + 16 2.4872718814855105e+01 8.4514154273034716e+00 4.4922341843599387e+00 + 17 2.7248162677653863e+01 1.5734583135405206e+01 3.0291908084490192e+01 + 18 1.4526986081954114e+01 1.1434791832603224e+01 2.9532857650962994e+00 + 19 4.1140094087726542e+00 4.7907744272957462e+00 2.9332040760606874e+00 + 20 3.7391943581794775e+00 1.1245588894518033e+01 3.4534565986537352e-01 + 21 4.6770606840744895e+00 1.7437311551337505e+01 3.9500419613147750e+00 + 22 2.9200634359041655e-01 1.4334804716441894e+01 4.6126282050885505e+00 + 23 1.2186084593498659e+01 1.7244718740788336e+01 9.5577008008747111e+00 + 24 1.0897483549167116e+01 2.3976288371770924e+01 4.9123091971062660e+00 + 25 8.3013649313401618e+00 6.8615489730960926e+00 1.4387021899667452e+01 + 26 7.9190193543818648e+00 1.1008099494023813e+01 4.2260730343035631e+00 + 27 1.0140595565814147e+01 7.2384398461215511e+00 3.6125920904563964e+00 + 28 1.0061462210281549e+01 1.0206307987621903e+01 -6.9767693501231887e-01 + 29 9.4569376880655245e+00 8.4765667622698810e+00 1.6677993838951857e+00 + 30 8.6415595300420289e+00 1.2477775733724913e+01 6.3490647331913177e+00 + 31 2.5933184442996112e+01 1.6946150535438722e+01 1.0194230512938997e+01 + 32 2.6114105835693632e+01 2.5408099937765506e+01 -2.6999696737439054e+00 + 33 1.4163608764016923e+01 1.5181090840272814e+01 7.3653493471285802e+00 + 34 2.6549174146751156e+01 4.5882764678026113e+00 2.2020124846495751e+01 + 35 4.1437843453551730e+00 2.8141183493657174e+01 2.3317704741107089e+01 + 36 6.3780319807011798e+00 7.7575138089356335e+00 1.1931077577217852e+01 + 37 -7.6958114857630722e-01 -1.9159241614171241e-01 1.0356340696376693e+01 + 38 7.3010225126353872e+00 1.0884133220671266e+01 2.6633596065705309e+01 + 39 5.6898573390479070e+00 2.5894801782764709e+00 1.3337466048040428e+01 + 40 1.1099697497284961e+01 1.0191149089577438e+01 1.8304336295912883e+01 + 41 8.6440494355655879e+00 3.6345726152193231e-01 5.0695802150001565e+00 + 42 7.5782934946817475e+00 4.6757323902747787e+00 1.3831840979884626e+01 + 43 1.1359895843454055e+01 1.3799412767530100e+01 1.0617629581393320e+01 + 44 2.2950016560260913e+01 7.5197789867236144e+00 1.3245764912164780e+01 + 45 1.9554905425848201e+01 2.1830038123726423e+00 1.6715747860120747e+01 + 46 8.0906867052799996e+00 6.6622139563764691e+00 1.2673881101538749e+01 + 47 1.2010426972885762e+01 4.3685673002375358e-01 1.2411974286925668e+01 + 48 1.3357854967832360e+01 4.6373604203282834e+00 8.0652977872995546e+00 + 49 -9.7527779686613761e-02 6.9711638984114694e+00 6.6008763327226614e+00 + 50 1.3550459742797026e+01 1.1294630384641790e+01 1.0035718307869322e+01 + 51 1.1350007482608317e+01 1.4367099157434026e+01 2.5333760912197821e+01 + 52 6.6051940450003999e+00 2.2521882302443469e+01 1.3669106927647421e+01 + 53 -8.1577963138660681e-01 1.2257784789978162e+01 5.5264535276746374e+00 + 54 1.6582609869795053e+00 2.4856866552949246e+01 2.5092968015682231e+01 + 55 6.6561263345162791e+00 9.7973883795477246e+00 1.3259935102577064e+01 + 56 1.3490039476597307e+01 2.2950795465587202e+01 1.6681366563734734e+01 + 57 1.6924755064350411e+01 1.4537557376597523e+01 1.3711052521305508e+01 + 58 8.6370833219883849e+00 1.0948267557889091e+01 1.1019575790146293e+01 + 59 2.0000835399765709e+01 1.6385749795720606e+01 2.2206265570514706e+01 + 60 1.0778235217590078e+01 1.0447421433967087e+01 7.2720745830091875e+00 + 61 9.3202989967111414e+00 1.1937267340664196e+01 1.0447755656801533e+01 + 62 9.4122303873531283e+00 1.2537339469454697e+01 1.2984039210741036e+01 + 63 1.1523171879925947e+01 1.0662595811373238e+01 1.3333168794375014e+01 + 64 1.2368142862878829e+01 1.2670809135711242e+01 9.1806715765681286e+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.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 + 1 2.5398010459786520e-02 6.3502834073842362e-01 1.4192583157365110e+01 + 2 1.5294908093561549e+01 3.4600009916583492e+00 4.7257951837580014e+00 + 3 3.7077069705982679e+00 1.9978654039506782e+00 4.1692463953635945e+00 + 4 4.5040926021795400e+00 2.7733344777359998e+00 1.5838562376130557e+01 + 5 1.6102894682874789e+00 1.9531996545629409e+00 2.8230599558411207e+00 + 6 2.1330118215333984e+00 5.3576583347423510e+00 5.0723594716930469e+00 + 7 5.4985686275773977e+00 1.9924710463713406e+00 4.2010235695577816e+00 + 8 6.3069170448861858e+00 5.1676646007087212e+00 1.5406002377921570e+00 + 9 1.5190914427087383e+01 2.0557841766690368e+00 5.9179885316293014e-02 + 10 7.2733606281360048e+00 3.7014560748475973e+00 3.3437140826690488e+00 + 11 2.0907266860078451e+01 3.1180414960987410e+01 1.2966526358648256e+01 + 12 1.0843338101622651e+01 2.1788515160525588e+00 1.4350440581203738e+01 + 13 8.6452875824004636e+00 1.9451142990125654e+00 1.6072777956310831e+00 + 14 8.6283075284502662e+00 6.1275010517739243e+00 3.8087369840560323e+00 + 15 1.3022123080019988e+01 1.9548691006303334e+00 5.7485723484863893e+00 + 16 2.4875686026673723e+01 8.4577785603484035e+00 4.5045781143493109e+00 + 17 2.7251930789970690e+01 1.5736113640986909e+01 3.0293585106366571e+01 + 18 1.4527852504972138e+01 1.1431892834689473e+01 2.9546046636210548e+00 + 19 4.1103051361258736e+00 4.7931559619486039e+00 2.9359247018981338e+00 + 20 3.7490504279619152e+00 1.1240141764619574e+01 3.5022143440280284e-01 + 21 4.6792878751421414e+00 1.7437978274317071e+01 3.9501167691174479e+00 + 22 2.8931353740453486e-01 1.4336300526524656e+01 4.6151428746571552e+00 + 23 1.2192591818130914e+01 1.7241001930993480e+01 9.5587819894779713e+00 + 24 1.0895337737198268e+01 2.3969910691403332e+01 4.9195544568268632e+00 + 25 8.2977071741748478e+00 6.8680938619438265e+00 1.4384373574188496e+01 + 26 7.9220475543517805e+00 1.1008794233210512e+01 4.2231422781843850e+00 + 27 1.0142943945362449e+01 7.2404064629998821e+00 3.6120633055502069e+00 + 28 1.0067315876869801e+01 1.0211198840151964e+01 -6.9237910128944891e-01 + 29 9.4551412207701109e+00 8.4780769507432705e+00 1.6699666678468059e+00 + 30 8.6393103937735596e+00 1.2480114058983217e+01 6.3480181696748001e+00 + 31 2.5936092106899387e+01 1.6943505457837578e+01 1.0197900128937981e+01 + 32 2.6123789094386492e+01 2.5395832520373240e+01 -2.7119137641953990e+00 + 33 1.4162640181722500e+01 1.5181293661370063e+01 7.3672813790850586e+00 + 34 2.6549851362036435e+01 4.5910504887737815e+00 2.2018333895747421e+01 + 35 4.1472833222997227e+00 2.8147917689197314e+01 2.3317122238013379e+01 + 36 6.3956241554191982e+00 7.7650451652284289e+00 1.1937927781736693e+01 + 37 -7.8018890021982845e-01 -1.9779386078942612e-01 1.0356252589270934e+01 + 38 7.3058401778440603e+00 1.0885077160299488e+01 2.6637301232056419e+01 + 39 5.6927220753079242e+00 2.5903629577503025e+00 1.3336439965589250e+01 + 40 1.1105169220000544e+01 1.0195412501608255e+01 1.8304176027858869e+01 + 41 8.6424852906989482e+00 3.5693823097956412e-01 5.0698333892623655e+00 + 42 7.5850007193777582e+00 4.6744952740644070e+00 1.3819629694881714e+01 + 43 1.1361792716599435e+01 1.3800855547762684e+01 1.0617811074069184e+01 + 44 2.2943030187448649e+01 7.5169879666032324e+00 1.3250312146084717e+01 + 45 1.9554667796458759e+01 2.1947971312776979e+00 1.6727083605473201e+01 + 46 8.0893059049793070e+00 6.6513156726621743e+00 1.2671747162535572e+01 + 47 1.2009324729164568e+01 4.3793115923380499e-01 1.2411219398126889e+01 + 48 1.3360811868696779e+01 4.6376961995144006e+00 8.0633260229781758e+00 + 49 -9.3624463245552014e-02 6.9716208675061013e+00 6.5982736221640970e+00 + 50 1.3550790897855681e+01 1.1297967676592275e+01 1.0035436005593128e+01 + 51 1.1347296318158177e+01 1.4352529714361703e+01 2.5339252480707597e+01 + 52 6.6168938544497919e+00 2.2517294265893874e+01 1.3669526540091804e+01 + 53 -8.0799271726069366e-01 1.2273403034380680e+01 5.5189964771917017e+00 + 54 1.6522271976730774e+00 2.4859882526534633e+01 2.5088259704620551e+01 + 55 6.6599671543284584e+00 9.7921053344185438e+00 1.3262494599330525e+01 + 56 1.3486474651973131e+01 2.2952288567928587e+01 1.6686625987114645e+01 + 57 1.6922264762741296e+01 1.4536131712917868e+01 1.3708486210764963e+01 + 58 8.6396455321068899e+00 1.0948030438159838e+01 1.1020929348032071e+01 + 59 1.9992994727894221e+01 1.6384409464583122e+01 2.2211428448933269e+01 + 60 1.0776118837369976e+01 1.0448011302703822e+01 7.2741757610491913e+00 + 61 9.3250305648893423e+00 1.1942619550306999e+01 1.0452024141195237e+01 + 62 9.4131521767964852e+00 1.2542579132010079e+01 1.2981302629838668e+01 + 63 1.1525456389481072e+01 1.0665088142388250e+01 1.3330928195872032e+01 + 64 1.2368827005358483e+01 1.2672236643121842e+01 9.1811306975964726e+00 ... diff --git a/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml b/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml index 26eed51ded..ef056ed54e 100644 --- a/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml +++ b/unittest/force-styles/tests/kspace-scafacos_fmm_tuned.yaml @@ -1,6 +1,6 @@ --- -lammps_version: 28 Jul 2021 -date_generated: Thu Jul 29 13:50:59 2021 +lammps_version: 2 Apr 2025 +date_generated: Fri Apr 25 19:55:00 2025 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -41,137 +41,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.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 + 1 2.3360559404503083e-02 6.3420807398471124e-01 1.4195612153647772e+01 + 2 1.5295889852432738e+01 3.4551352708496772e+00 4.7268693339120995e+00 + 3 3.7112928303351183e+00 1.9883418499829566e+00 4.1634383397465875e+00 + 4 4.4996137424816833e+00 2.7699313655248208e+00 1.5834460843827967e+01 + 5 1.6095030924249170e+00 1.9506231645580969e+00 2.8219379273588725e+00 + 6 2.1299130975303013e+00 5.3563503173223195e+00 5.0721554548436414e+00 + 7 5.4989950824597242e+00 1.9902829773850479e+00 4.1984687309200712e+00 + 8 6.3071388116113676e+00 5.1650188111386059e+00 1.5367092085598766e+00 + 9 1.5183039412179504e+01 2.0551383794925262e+00 6.1510845391346686e-02 + 10 7.2742994499893081e+00 3.6991671627720146e+00 3.3400206310323872e+00 + 11 2.0919572483051319e+01 3.1177077924079004e+01 1.2959592953626643e+01 + 12 1.0847636361629718e+01 2.1718732239263909e+00 1.4350785818654698e+01 + 13 8.6424154273038010e+00 1.9488220810501267e+00 1.6093602423721118e+00 + 14 8.6303701352013782e+00 6.1268501831820306e+00 3.8078077336110931e+00 + 15 1.3025408786760066e+01 1.9481190252826883e+00 5.7427874954581855e+00 + 16 2.4872725079447438e+01 8.4513579394769440e+00 4.4922207416980324e+00 + 17 2.7248147787991407e+01 1.5734556229969664e+01 3.0291873032521412e+01 + 18 1.4526967882409773e+01 1.1434806978812803e+01 2.9532743052443413e+00 + 19 4.1140128416161543e+00 4.7907756589181485e+00 2.9332114102908471e+00 + 20 3.7391971632309713e+00 1.1245630084641789e+01 3.4530376865853807e-01 + 21 4.6770746906683218e+00 1.7437362257781864e+01 3.9500481199066013e+00 + 22 2.9202098805268789e-01 1.4334794525373162e+01 4.6126018358920629e+00 + 23 1.2186089465780945e+01 1.7244721839632629e+01 9.5576981317190555e+00 + 24 1.0897425861494327e+01 2.3976298951767617e+01 4.9122971612335498e+00 + 25 8.3013519437446277e+00 6.8615424458832095e+00 1.4387020043871930e+01 + 26 7.9190134672232464e+00 1.1008097771684993e+01 4.2260751532564766e+00 + 27 1.0140596263925879e+01 7.2384335412784822e+00 3.6125947977819792e+00 + 28 1.0061473504623541e+01 1.0206298016734518e+01 -6.9763989742332866e-01 + 29 9.4569313923992748e+00 8.4765587061879994e+00 1.6678022166610487e+00 + 30 8.6415508867023654e+00 1.2477777382799188e+01 6.3490707219260658e+00 + 31 2.5933200696819274e+01 1.6946123403822579e+01 1.0194263675197316e+01 + 32 2.6114157292809860e+01 2.5408106247225142e+01 -2.6999701849684041e+00 + 33 1.4163537619788164e+01 1.5180956126291086e+01 7.3653766833181988e+00 + 34 2.6549111555645236e+01 4.5882014561684237e+00 2.2020168585514966e+01 + 35 4.1437474018711473e+00 2.8141148617219841e+01 2.3317758615943074e+01 + 36 6.3780307852802602e+00 7.7575114329005714e+00 1.1931073654499789e+01 + 37 -7.6957279486941899e-01 -1.9158940572506108e-01 1.0356339737780438e+01 + 38 7.3010316729879401e+00 1.0884135512169493e+01 2.6633590899783712e+01 + 39 5.6898608758286917e+00 2.5894722759873701e+00 1.3337463574845163e+01 + 40 1.1099696427538117e+01 1.0191146236394143e+01 1.8304339162344966e+01 + 41 8.6440352691694162e+00 3.6344700684019277e-01 5.0696056821639015e+00 + 42 7.5782930071004770e+00 4.6757274685627763e+00 1.3831846866770830e+01 + 43 1.1359918504447837e+01 1.3799434350935211e+01 1.0617631007767894e+01 + 44 2.2950013961176648e+01 7.5197872104060934e+00 1.3245759572373222e+01 + 45 1.9554895316114251e+01 2.1829983888526607e+00 1.6715764407124112e+01 + 46 8.0906826364915236e+00 6.6621974993868287e+00 1.2673884536130538e+01 + 47 1.2010426771715947e+01 4.3685722333805882e-01 1.2412006025108692e+01 + 48 1.3357848250871482e+01 4.6373706901270149e+00 8.0652853016666377e+00 + 49 -9.7531856517931614e-02 6.9711462150334862e+00 6.6008881770452890e+00 + 50 1.3550487216734982e+01 1.1294646773073024e+01 1.0035717275037120e+01 + 51 1.1350003365834414e+01 1.4367101046246908e+01 2.5333774717815796e+01 + 52 6.6052128073261471e+00 2.2521870979488469e+01 1.3669097306729524e+01 + 53 -8.1577926730521622e-01 1.2257780618573344e+01 5.5264625631668141e+00 + 54 1.6582626176804096e+00 2.4856867898481109e+01 2.5093024189786334e+01 + 55 6.6561141970485629e+00 9.7973851404716168e+00 1.3259938399200150e+01 + 56 1.3490058643306616e+01 2.2950764543152239e+01 1.6681357094819905e+01 + 57 1.6924755909364325e+01 1.4537557918600321e+01 1.3711051825359711e+01 + 58 8.6370875756468202e+00 1.0948264267406902e+01 1.1019573292855343e+01 + 59 2.0000831833355033e+01 1.6385758024301406e+01 2.2206255404510902e+01 + 60 1.0778235554774209e+01 1.0447417497059632e+01 7.2720781968181933e+00 + 61 9.3203001182930763e+00 1.1937266377561047e+01 1.0447755561216320e+01 + 62 9.4122488242713001e+00 1.2537333954987266e+01 1.2984036090831824e+01 + 63 1.1523175023032334e+01 1.0662620511587310e+01 1.3333161817205699e+01 + 64 1.2368132920942340e+01 1.2670792695031947e+01 9.1806994893753533e+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 + 1 2.5552295443345151e-02 6.3530291690817098e-01 1.4192328973116457e+01 + 2 1.5294942697561366e+01 3.4600013048495089e+00 4.7257791520348444e+00 + 3 3.7076773859749710e+00 1.9978668344088848e+00 4.1692545790815547e+00 + 4 4.5040916303224616e+00 2.7733381599861842e+00 1.5838551398660758e+01 + 5 1.6102480910944807e+00 1.9531944176960763e+00 2.8230382807636687e+00 + 6 2.1330107749644331e+00 5.3576516732699320e+00 5.0723624602700195e+00 + 7 5.4985582594999034e+00 1.9924721404600312e+00 4.2010297191508874e+00 + 8 6.3069289824731545e+00 5.1676766470044022e+00 1.5406150089891317e+00 + 9 1.5190862301385602e+01 2.0558686077451265e+00 5.9243014580905133e-02 + 10 7.2733667350194482e+00 3.7014616928253599e+00 3.3437181560930549e+00 + 11 2.0907267517842453e+01 3.1180382787846732e+01 1.2966507374401321e+01 + 12 1.0843338639445962e+01 2.1788157427260391e+00 1.4350461419862407e+01 + 13 8.6453172296037906e+00 1.9451245590641366e+00 1.6072864080448608e+00 + 14 8.6283098653225405e+00 6.1275022217316417e+00 3.8087374077309009e+00 + 15 1.3022122312470167e+01 1.9548714152185946e+00 5.7485494522459435e+00 + 16 2.4875692327077903e+01 8.4577211958094658e+00 4.5045645609964371e+00 + 17 2.7251916237713075e+01 1.5736086521757148e+01 3.0293549967562790e+01 + 18 1.4527834319427996e+01 1.1431907898333305e+01 2.9545932760325111e+00 + 19 4.1103085505090879e+00 4.7931571904458057e+00 2.9359320326170697e+00 + 20 3.7490532020357463e+00 1.1240182973996276e+01 3.5017955355203062e-01 + 21 4.6793017531838670e+00 1.7438028996924832e+01 3.9501229366441257e+00 + 22 2.8932817855772419e-01 1.4336290373896290e+01 4.6151165297660812e+00 + 23 1.2192596676892880e+01 1.7241005035149584e+01 9.5587793343452585e+00 + 24 1.0895280120903442e+01 2.3969921371146526e+01 4.9195424340607534e+00 + 25 8.2976941953960122e+00 6.8680873588243454e+00 1.4384371726866240e+01 + 26 7.9220416716922610e+00 1.1008792522737512e+01 4.2231444044821265e+00 + 27 1.0142944636339406e+01 7.2404001724478562e+00 3.6120659925026488e+00 + 28 1.0067327124228477e+01 1.0211188804236970e+01 -6.9234206601015191e-01 + 29 9.4551349555747972e+00 8.4780689045868964e+00 1.6699694813729051e+00 + 30 8.6393017480888066e+00 1.2480115697184512e+01 6.3480241460322251e+00 + 31 2.5936108360572387e+01 1.6943478423162833e+01 1.0197933188356414e+01 + 32 2.6123840551078956e+01 2.5395838979385996e+01 -2.7119144353303040e+00 + 33 1.4162569251937132e+01 1.5181158903549116e+01 7.3673085860153442e+00 + 34 2.6549789083907434e+01 4.5909755357672788e+00 2.2018377696602766e+01 + 35 4.1472463476036276e+00 2.8147882906619735e+01 2.3317176029673735e+01 + 36 6.3956229676857141e+00 7.7650428128045386e+00 1.1937923819819305e+01 + 37 -7.8018055974733014e-01 -1.9779080795397475e-01 1.0356251604001182e+01 + 38 7.3058493177436796e+00 1.0885079445275753e+01 2.6637296093747555e+01 + 39 5.6927256048152257e+00 2.5903550694701614e+00 1.3336437471176671e+01 + 40 1.1105168154209297e+01 1.0195409659301941e+01 1.8304178886141074e+01 + 41 8.6424711470696725e+00 3.5692793626614067e-01 5.0698588468993337e+00 + 42 7.5850002454534824e+00 4.6744903569817708e+00 1.3819635554209993e+01 + 43 1.1361815363153049e+01 1.3800877217002929e+01 1.0617812569744073e+01 + 44 2.2943027572690774e+01 7.5169961725599981e+00 1.3250306831442973e+01 + 45 1.9554657688781663e+01 2.1947916639912473e+00 1.6727100159026907e+01 + 46 8.0893018653894249e+00 6.6512992365058263e+00 1.2671750590275952e+01 + 47 1.2009324515884002e+01 4.3793168422681755e-01 1.2411251149548381e+01 + 48 1.3360805148086973e+01 4.6377064563473596e+00 8.0633135751109482e+00 + 49 -9.3628514379978198e-02 6.9716032011016322e+00 6.5982854281578236e+00 + 50 1.3550818361216789e+01 1.1297984054554346e+01 1.0035434923217911e+01 + 51 1.1347292228134780e+01 1.4352531602304321e+01 2.5339266305628730e+01 + 52 6.6169126060448198e+00 2.2517283008739870e+01 1.3669516891220447e+01 + 53 -8.0799233634994438e-01 1.2273398871748086e+01 5.5190055131304874e+00 + 54 1.6522290205697616e+00 2.4859883843107788e+01 2.5088315959747145e+01 + 55 6.6599550090719388e+00 9.7921021100301679e+00 1.3262497939453176e+01 + 56 1.3486493754215454e+01 2.2952257734324004e+01 1.6686616533115579e+01 + 57 1.6922265603701447e+01 1.4536132254256970e+01 1.3708485517455587e+01 + 58 8.6396497822260372e+00 1.0948027160033577e+01 1.1020926851997841e+01 + 59 1.9992991137518295e+01 1.6384417670159198e+01 2.2211418310738303e+01 + 60 1.0776119163365335e+01 1.0448007367147197e+01 7.2741793714323402e+00 + 61 9.3250316821566113e+00 1.1942618597223458e+01 1.0452024049356730e+01 + 62 9.4131706166972293e+00 1.2542573623136953e+01 1.2981299519513076e+01 + 63 1.1525459497454007e+01 1.0665112823456411e+01 1.3330921215751877e+01 + 64 1.2368817110068770e+01 1.2672220208335444e+01 9.1811585459310798e+00 ... diff --git a/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml b/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml index 4d942c0684..ce163c4b93 100644 --- a/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml +++ b/unittest/force-styles/tests/kspace-scafacos_p2nfft.yaml @@ -1,6 +1,6 @@ --- -lammps_version: 28 Jul 2021 -date_generated: Thu Jul 29 13:45:55 2021 +lammps_version: 2 Apr 2025 +date_generated: Fri Apr 25 19:55:01 2025 epsilon: 7.5e-14 skip_tests: extract gpu intel omp opt single prerequisites: ! | @@ -21,7 +21,7 @@ pre_commands: ! | 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 type/ratio 2 0.666667 998877 set type 1 charge 0.8 set type 2 charge 0.4 velocity all create 100 4534624 loop geom @@ -39,137 +39,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 -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 + 1 -6.2299723687985520e-01 3.6648298904106713e-01 7.2017655408929931e-02 + 2 8.0157734100073419e-01 -4.9123357526038669e-01 6.2167177459640899e-01 + 3 -5.5583381571937696e-01 1.6313000303763443e+00 1.1425955768556078e+00 + 4 1.2002487272285920e+00 -7.3956546131186607e-01 1.4928407804348605e+00 + 5 -1.2599343060164619e-01 4.7099765084488338e-01 1.0327143771742235e+00 + 6 -3.8451493974829787e-01 -6.3806590149248055e-01 -9.1060295227808186e-01 + 7 3.2874944533497708e-01 2.4258321165704422e-01 -1.3730957966232988e+00 + 8 5.3288549214196135e-01 -5.4627704259312793e-01 2.3668278694063977e-01 + 9 1.9317562447983518e+00 1.8040934054510316e+00 -8.6321367256864956e-01 + 10 -5.9035736434809005e-01 -3.2779565234290826e-02 6.2517649936692454e-02 + 11 -2.2891193822078377e+00 3.1507249809341453e+00 5.5978148627638280e+00 + 12 1.2705111020858431e-01 -1.4434479603105201e+00 9.3157265986903479e-02 + 13 -5.2700473325372998e-01 -3.8913694767237111e-01 4.5501743504003228e-01 + 14 -2.4006528437859972e-01 3.5233233553812604e-01 -1.4959626695872166e+00 + 15 6.1154413200223134e-01 2.1218374209381560e-01 1.2249633471324503e-01 + 16 -5.3422379041040868e-01 -1.0958728113329506e+00 1.2509788801240926e+00 + 17 -1.7376826602979762e+00 1.6475676032340678e+00 1.4030533435456602e+00 + 18 3.5639615970908245e-01 1.5200811760685881e-01 -2.8906773063245728e-01 + 19 4.3101966612210785e-01 -1.9752396138524015e+00 -3.9110545198773805e-01 + 20 6.8987156807445293e-01 6.5836112212021569e-02 5.5066349479015640e-02 + 21 9.0130517259907103e-02 -4.9414877327020540e-01 4.9542936363594559e-01 + 22 -1.1394537795450717e+00 1.7305613577905141e+00 -1.0854982105928022e+00 + 23 2.4396348984284835e+00 -4.6781487825549989e-01 -5.6544916813872037e-01 + 24 6.3238656651525416e-01 -1.3150143098136915e+00 1.0556758699528166e+00 + 25 9.2747734192115872e-01 -3.6811936971960352e-01 3.9716995495528290e-01 + 26 5.3151782650852220e-01 1.0859778801093298e-01 7.0000084660185002e-01 + 27 -1.2135813371381046e+00 5.6149560332951953e-01 1.2771804799287881e-01 + 28 -6.1706213648707198e-01 -1.3437356738748027e+00 -1.0569752203973408e+00 + 29 5.2425830472816048e-01 -1.1733905760533829e+00 -5.3684956489182678e-01 + 30 -1.1363710511597969e+00 -2.1035037311443286e-01 7.3661336827875912e-01 + 31 -1.0286244802005191e+00 -6.1077808391348554e-01 5.5244740068255149e-01 + 32 1.8149646652942233e+00 -1.1952742601786415e+00 -6.4833790163495069e+00 + 33 -2.5353332257747224e-01 7.6589466250979599e-01 3.5497900647477799e-02 + 34 -2.4330475191421286e+00 -3.4144419939553172e+00 -1.0845397419182927e+00 + 35 -3.3312579439488248e+00 1.1131457186831546e-01 2.4492202110506214e+00 + 36 2.0459226992188412e-01 1.3829568574983004e+00 -3.8813265817670297e+00 + 37 -2.8662783920400354e+00 -2.1261696080568719e+00 1.3199085788821836e+00 + 38 3.2198040043943750e+00 -3.3136300610238333e-02 1.2444418059987756e+00 + 39 6.1671861894102276e-01 8.6145898694133216e-01 1.2753805736041619e+00 + 40 -3.4465766978340956e-01 -7.4884072554372572e-01 5.3667757599016330e-01 + 41 1.7494419975256099e+00 2.8462740377576767e-01 -2.8957387608126286e+00 + 42 -2.2373679084058512e-01 1.4881985376208202e+00 3.3326132134705015e+00 + 43 6.5583180299111965e-01 -2.4148864626210731e-01 8.7826368560547388e-02 + 44 1.6440267956062689e+00 6.9523813473086379e-02 -1.0709267935512976e+00 + 45 2.4945275964817597e+00 -1.7918134482086094e+00 -1.0932349764394789e+00 + 46 -1.7073804934892196e+00 1.6813768400973574e+00 -7.4108755474068533e-01 + 47 -4.6145860264126182e-01 -9.4726359094370494e-01 -2.9908180122934069e-01 + 48 2.6873861758079670e-01 -1.3681681164566486e+00 -1.4385554972610517e+00 + 49 -2.8944730774834965e-01 2.0610199285440809e-02 -1.4160972185953560e+00 + 50 -9.0175902806468911e-01 9.8036355209373183e-01 -4.0297899239932122e-01 + 51 4.7163341287425196e+00 -1.6219489394271525e+00 4.4167037742662538e+00 + 52 5.2676796912001411e-01 3.2311889823060180e-01 3.4436074109865666e-01 + 53 -3.2403902785179692e+00 3.4740209312954629e+00 -3.9199744869044229e+00 + 54 -1.8317738485443824e+00 4.4268175924604730e-01 -6.5543577210159065e-01 + 55 4.6191307739245790e-01 6.7883463986717607e-01 8.5838249704413117e-02 + 56 2.2354933069525496e+00 -3.7412435017961556e+00 -1.4111947022281008e+00 + 57 1.1399800523148360e+00 9.4237418516777818e-02 -2.2879685567058545e+00 + 58 6.8631028437272379e-01 -4.9774021098734889e-01 4.3760304916137149e-01 + 59 -2.8983467114496695e+00 1.8239859423835159e+00 1.2563637448501650e+00 + 60 -3.0512381815099554e-01 -7.8161932804735532e-03 1.3627673379316291e-01 + 61 9.0558096996894688e-01 2.9784344049960048e+00 1.4154842062084929e+00 + 62 1.9069552299019363e-01 -1.1437492110052007e-01 1.9895094570158692e-01 + 63 -1.2513398542733505e+00 1.2045478676790222e+00 8.3797373051041923e-01 + 64 -6.0582021248919737e-01 2.1738718579761611e-02 5.3444020599486974e-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 + 1 -6.2216371480478683e-01 3.6369583714201315e-01 7.0302963083571465e-02 + 2 7.9946062966668019e-01 -4.8561795169673344e-01 6.1686782956322328e-01 + 3 -5.6004648954208636e-01 1.6410640249717492e+00 1.1472542148665854e+00 + 4 1.2001547352113731e+00 -7.3996488745774192e-01 1.4937224085495295e+00 + 5 -1.2530963123444780e-01 4.7003574107358526e-01 1.0313570094904607e+00 + 6 -3.8429155269766302e-01 -6.3621081991047557e-01 -9.1410262566822320e-01 + 7 3.2966507685516327e-01 2.4452762079212872e-01 -1.3716974172079013e+00 + 8 5.3240530377740014e-01 -5.4260967879835675e-01 2.3946828329886263e-01 + 9 1.9388608289016795e+00 1.8053130134151607e+00 -8.6583111139841473e-01 + 10 -5.9401374349466984e-01 -3.0760940627993786e-02 6.6585223535737759e-02 + 11 -2.3025862453794410e+00 3.1543603116964656e+00 5.6045748565995144e+00 + 12 1.1984883632316654e-01 -1.4410789468926908e+00 8.9579767832271728e-02 + 13 -5.2505187972476530e-01 -3.9121497028104535e-01 4.4900368521876477e-01 + 14 -2.4358998958018493e-01 3.5167352121393330e-01 -1.4954234258282304e+00 + 15 6.0763940925944826e-01 2.1744800278238849e-01 1.2915718719858210e-01 + 16 -5.2722436467164535e-01 -1.0923312454196350e+00 1.2632035661335008e+00 + 17 -1.7299837434652718e+00 1.6505956925481600e+00 1.4024578311543054e+00 + 18 3.5898887008250452e-01 1.4881991463358527e-01 -2.9084480209720287e-01 + 19 4.2806802280111711e-01 -1.9761679390320648e+00 -3.9177369050700128e-01 + 20 6.9642060945236295e-01 6.1461841136321797e-02 6.0565722656047413e-02 + 21 8.6822814782788749e-02 -4.9825840280908423e-01 4.9421717723945657e-01 + 22 -1.1446942494791486e+00 1.7339215358813718e+00 -1.0857395882153560e+00 + 23 2.4406099692045884e+00 -4.7092780415273006e-01 -5.6651994323398458e-01 + 24 6.3136840100847169e-01 -1.3236487881843373e+00 1.0558239860204606e+00 + 25 9.2076492675936938e-01 -3.5961036913690547e-01 3.9498801997313127e-01 + 26 5.3446305000197003e-01 1.0721574401851200e-01 6.9671382756971723e-01 + 27 -1.2112723579632108e+00 5.5965441174440744e-01 1.2604830652847024e-01 + 28 -6.0978878901777878e-01 -1.3380145097838085e+00 -1.0509061969521625e+00 + 29 5.2138434675784828e-01 -1.1710280175656200e+00 -5.3630855043680503e-01 + 30 -1.1384537891264894e+00 -2.0845958713585877e-01 7.3627549117927504e-01 + 31 -1.0227735832162284e+00 -6.1594585720493489e-01 5.5246669332710996e-01 + 32 1.8215711196725839e+00 -1.2084252636352328e+00 -6.5039129469478283e+00 + 33 -2.5502733476308043e-01 7.6596130057801370e-01 3.9548996903883020e-02 + 34 -2.4321689361224306e+00 -3.4134230046178882e+00 -1.0842705856845447e+00 + 35 -3.3292327714510819e+00 1.1652645121573212e-01 2.4457028897672504e+00 + 36 2.2089694890768291e-01 1.3887815362936997e+00 -3.8790195502705127e+00 + 37 -2.8748262445800954e+00 -2.1352854893240663e+00 1.3223114100104911e+00 + 38 3.2172787953673230e+00 -3.1723969693296751e-02 1.2460383111146376e+00 + 39 6.1545846007749827e-01 8.6090926370462484e-01 1.2703882691017292e+00 + 40 -3.4296297821224508e-01 -7.5001149236659415e-01 5.3532456566107312e-01 + 41 1.7434391201122204e+00 2.7732546993354906e-01 -2.8935156369605148e+00 + 42 -2.1588285174901276e-01 1.4828691214106053e+00 3.3188335425306636e+00 + 43 6.5459546719632566e-01 -2.4238688292389166e-01 8.8700243675993037e-02 + 44 1.6403136441441570e+00 6.0051053487808786e-02 -1.0651166358107020e+00 + 45 2.4972401819045187e+00 -1.7787447894856194e+00 -1.0833560122197072e+00 + 46 -1.7076259021736853e+00 1.6696314735751507e+00 -7.4248954468677097e-01 + 47 -4.6283649350926670e-01 -9.4701254172312832e-01 -2.9942694677016202e-01 + 48 2.7192707831666324e-01 -1.3704515844548064e+00 -1.4419400073770943e+00 + 49 -2.8789038198160305e-01 2.0526485979924441e-02 -1.4215716813814021e+00 + 50 -9.0374829970627646e-01 9.8396023575010572e-01 -4.0067907966656324e-01 + 51 4.7155429135327287e+00 -1.6388814802900786e+00 4.4262321602829555e+00 + 52 5.3439904281802508e-01 3.1832823111082847e-01 3.4686951730416077e-01 + 53 -3.2360142213969687e+00 3.4892405614462145e+00 -3.9271861204594658e+00 + 54 -1.8406045229424792e+00 4.4810839151543930e-01 -6.6290585685444980e-01 + 55 4.6625819275528468e-01 6.7177167142879046e-01 8.8850577314980791e-02 + 56 2.2349588873122030e+00 -3.7381313677984318e+00 -1.4107948512862760e+00 + 57 1.1339287217626646e+00 8.9190192719112854e-02 -2.2900143227032856e+00 + 58 6.8654150079937415e-01 -4.9798048469563011e-01 4.3629201206333512e-01 + 59 -2.9076748744755276e+00 1.8257502342826648e+00 1.2607894746859243e+00 + 60 -3.0773498045629333e-01 -1.0405524552672364e-02 1.3933858662989015e-01 + 61 9.0760761264172496e-01 2.9838252695541390e+00 1.4203076492684876e+00 + 62 1.9185338368540847e-01 -1.1145601194321160e-01 1.9399704547990762e-01 + 63 -1.2515261438523928e+00 1.2079415152502457e+00 8.3792809430252091e-01 + 64 -6.0374587406946245e-01 2.5684646543226310e-02 5.3716080858128701e-01 ... diff --git a/unittest/python/python-numpy.py b/unittest/python/python-numpy.py index 4930527a61..be9109b9a3 100644 --- a/unittest/python/python-numpy.py +++ b/unittest/python/python-numpy.py @@ -153,7 +153,7 @@ class PythonNumpy(unittest.TestCase): self.assertEqual(values[0,0], 0.5) self.assertEqual(values[0,3], -0.5) self.assertEqual(values[1,0], 1.5) - self.assertEqual(values[1,3], 1.5) + self.assertEqual(values[1,3], -1.5) def testExtractAtom(self): self.lmp.command("units lj")