Merge branch 'clean-master2' of github.com:julient31/lammps into STT2

This commit is contained in:
julient31 2021-04-19 17:32:16 -06:00
commit 58549fa10d
261 changed files with 17830 additions and 982 deletions

View File

@ -124,7 +124,7 @@ set(STANDARD_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE
USER-LB USER-MANIFOLD USER-MEAMC USER-MESONT USER-MGPT USER-MISC USER-MOFFF
USER-MOLFILE USER-NETCDF USER-PHONON USER-PLUMED USER-PTM USER-QTB
USER-REACTION USER-REAXC USER-SCAFACOS USER-SDPD USER-SMD USER-SMTBQ USER-SPH
USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM USER-YAFF)
USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM USER-YAFF USER-PACE)
set(SUFFIX_PACKAGES CORESHELL GPU KOKKOS OPT USER-INTEL USER-OMP)
@ -269,6 +269,7 @@ endif()
set(ENABLE_IWYU OFF CACHE BOOL "Add 'iwyu' build target to call the include-what-you-use tool")
mark_as_advanced(ENABLE_IWYU)
if(ENABLE_IWYU)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_program(IWYU_EXE NAMES include-what-you-use iwyu)
find_program(IWYU_TOOL NAMES iwyu_tool iwyu-tool iwyu_tool.py)
if (IWYU_EXE AND IWYU_TOOL)
@ -387,9 +388,9 @@ else()
endif()
foreach(PKG_WITH_INCL KSPACE PYTHON MLIAP VORONOI USER-COLVARS USER-MOLFILE USER-NETCDF USER-PLUMED USER-QMMM
USER-QUIP USER-SCAFACOS USER-SMD USER-VTK KIM LATTE MESSAGE MSCG COMPRESS)
USER-QUIP USER-SCAFACOS USER-SMD USER-VTK KIM LATTE MESSAGE MSCG COMPRESS USER-PACE)
if(PKG_${PKG_WITH_INCL})
include(Packages/${PKG_WITH_INCL})
include(Packages/${PKG_WITH_INCL})
endif()
endforeach()
@ -730,7 +731,7 @@ get_target_property(DEFINES lammps COMPILE_DEFINITIONS)
include(FeatureSummary)
feature_summary(DESCRIPTION "The following tools and libraries have been found and configured:" WHAT PACKAGES_FOUND)
message(STATUS "<<< Build configuration >>>
Operating System: ${CMAKE_SYSTEM_NAME}
Operating System: ${CMAKE_SYSTEM_NAME} ${CMAKE_LINUX_DISTRO} ${CMAKE_DISTRO_VERSION}
Build type: ${CMAKE_BUILD_TYPE}
Install path: ${CMAKE_INSTALL_PREFIX}
Generator: ${CMAKE_GENERATOR} using ${CMAKE_MAKE_PROGRAM}")

View File

@ -104,3 +104,13 @@ function(FetchPotentials pkgfolder potfolder)
endforeach()
endif()
endfunction(FetchPotentials)
# set CMAKE_LINUX_DISTRO and CMAKE_DISTRO_VERSION on Linux
if((CMAKE_SYSTEM_NAME STREQUAL Linux) AND (EXISTS /etc/os-release))
file(STRINGS /etc/os-release distro REGEX "^NAME=")
string(REGEX REPLACE "NAME=\"?([^\"]*)\"?" "\\1" distro "${distro}")
file(STRINGS /etc/os-release disversion REGEX "^VERSION_ID=")
string(REGEX REPLACE "VERSION_ID=\"?([^\"]*)\"?" "\\1" disversion "${disversion}")
set(CMAKE_LINUX_DISTRO ${distro})
set(CMAKE_DISTRO_VERSION ${disversion})
endif()

View File

@ -0,0 +1,26 @@
set(PACELIB_URL "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/v.2021.4.9.tar.gz" CACHE STRING "URL for PACE evaluator library sources")
set(PACELIB_MD5 "4db54962fbd6adcf8c18d46e1798ceb5" CACHE STRING "MD5 checksum of PACE evaluator library tarball")
mark_as_advanced(PACELIB_URL)
mark_as_advanced(PACELIB_MD5)
# download library sources to build folder
file(DOWNLOAD ${PACELIB_URL} ${CMAKE_BINARY_DIR}/libpace.tar.gz SHOW_PROGRESS EXPECTED_HASH MD5=${PACELIB_MD5})
# uncompress downloaded sources
execute_process(
COMMAND ${CMAKE_COMMAND} -E remove_directory lammps-user-pace*
COMMAND ${CMAKE_COMMAND} -E tar xzf libpace.tar.gz
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
file(GLOB PACE_EVALUATOR_INCLUDE_DIR ${CMAKE_BINARY_DIR}/lammps-user-pace-*/USER-PACE)
file(GLOB PACE_EVALUATOR_SOURCES ${CMAKE_BINARY_DIR}/lammps-user-pace-*/USER-PACE/*.cpp)
list(FILTER PACE_EVALUATOR_SOURCES EXCLUDE REGEX pair_pace.cpp)
add_library(pace STATIC ${PACE_EVALUATOR_SOURCES})
set_target_properties(pace PROPERTIES OUTPUT_NAME pace${LAMMPS_MACHINE})
target_include_directories(pace PUBLIC ${PACE_EVALUATOR_INCLUDE_DIR})
target_link_libraries(lammps PRIVATE pace)

View File

@ -54,8 +54,9 @@ if(DOWNLOAD_PLUMED)
set(PLUMED_BUILD_BYPRODUCTS "<INSTALL_DIR>/lib/libplumedWrapper.a")
endif()
set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.7.0/plumed-src-2.7.0.tgz" CACHE STRING "URL for PLUMED tarball")
set(PLUMED_MD5 "95f29dd0c067577f11972ff90dfc7d12" CACHE STRING "MD5 checksum of PLUMED tarball")
set(PLUMED_URL "https://github.com/plumed/plumed2/releases/download/v2.7.1/plumed-src-2.7.1.tgz" CACHE STRING "URL for PLUMED tarball")
set(PLUMED_MD5 "4eac6a462ec84dfe0cec96c82421b8e8" CACHE STRING "MD5 checksum of PLUMED tarball")
mark_as_advanced(PLUMED_URL)
mark_as_advanced(PLUMED_MD5)

View File

@ -16,11 +16,14 @@ if(ENABLE_TESTING)
set(MEMORYCHECK_COMMAND "${VALGRIND_BINARY}" CACHE FILEPATH "Memory Check Command")
set(MEMORYCHECK_COMMAND_OPTIONS "${VALGRIND_DEFAULT_OPTIONS}" CACHE STRING "Memory Check Command Options")
# check if a faster linker is available.
# only verified with GNU and Clang compilers and new CMake
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
if((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang"))
# we need to build and link a LOT of tester executables, so it is worth checking if
# a faster linker is available. requires GNU or Clang compiler, newer CMake.
# also only verified with Fedora Linux > 30 and Ubuntu <= 18.04 (Ubuntu 20.04 fails)
if((CMAKE_SYSTEM_NAME STREQUAL Linux) AND (CMAKE_VERSION VERSION_GREATER_EQUAL 3.13)
AND ((${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
OR (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")))
if (((CMAKE_LINUX_DISTRO STREQUAL Ubuntu) AND (CMAKE_DISTRO_VERSION VERSION_LESS_EQUAL 18.04))
OR ((CMAKE_LINUX_DISTRO STREQUAL Fedora) AND (CMAKE_DISTRO_VERSION VERSION_GREATER 30)))
include(CheckCXXCompilerFlag)
set(CMAKE_CUSTOM_LINKER_DEFAULT default)
check_cxx_compiler_flag(-fuse-ld=lld HAVE_LLD_LINKER_FLAG)

View File

@ -18,8 +18,8 @@ digraph lammps {
Up [shape=box label="Update" color=blue]
Un [shape=box label="Universe" color=blue]
Ti [shape=box label="Timer" color=blue]
Lt [label="Lattice"]
Rg [label="Region" color=red]
Lt [label="Lattice"]
Rb [shape=box label="RegionBlock"]
Rs [shape=box label="RegionSphere"]
Av [label="AtomVec" color=red]
@ -34,6 +34,7 @@ digraph lammps {
Du [label="Dump" color=red]
Fi [label="Fix" color=red]
Cp [label="Compute" color=red]
Cm [label="Command" color=red]
Th [label="Thermo"]
Va [label="Variable"]
Ew [shape=box label="Ewald"]
@ -71,16 +72,19 @@ digraph lammps {
Dg [shape=box label="DumpCFG"]
Ve [shape=box label="Verlet"]
Rr [shape=box label="Respa"]
Ru [shape=box label="Run"]
Se [shape=box label="Set"]
Pt [shape=box label="PPPMTIP4P"]
Vs [shape=box label="VerletSplit"]
Ro [shape=box label="RespaOMP"]
Mc [shape=box label="MinCG"]
Mf [shape=box label="MinFire"]
La -> {At Ci Co Do Er Fo Gr In Me Mo Ne Ou Ti Up Un} [penwidth=2]
Do -> {Lt Rg} [penwidth=2]
Do -> {Rg Lt} [penwidth=2]
Rg -> {Rb Rs} [style=dashed penwidth=2]
Co -> {Cb Ct} [style=dashed penwidth=2]
In -> Va [penwidth=2]
In -> {Va Cm} [penwidth=2]
Cm -> {Ru Se} [style=dashed penwidth=2]
Mo -> {Fi Cp} [penwidth=2]
Fo -> {Pa Bo An Di Im Ks} [penwidth=2]
Ks -> {Ew Pp} [style=dashed penwidth=2]

View File

@ -52,6 +52,7 @@ This is the list of packages that may require additional steps.
* :ref:`USER-MESONT <user-mesont>`
* :ref:`USER-MOLFILE <user-molfile>`
* :ref:`USER-NETCDF <user-netcdf>`
* :ref:`USER-PACE <user-pace>`
* :ref:`USER-PLUMED <user-plumed>`
* :ref:`USER-OMP <user-omp>`
* :ref:`USER-QMMM <user-qmmm>`
@ -1247,6 +1248,46 @@ be built for the most part with all major versions of the C++ language.
----------
.. _user-pace:
USER-PACE package
-----------------------------
This package requires a library that can be downloaded and built
in lib/pace or somewhere else, which must be done before building
LAMMPS with this package. The code for the library can be found
at: `https://github.com/ICAMS/lammps-user-pace/ <https://github.com/ICAMS/lammps-user-pace/>`_
.. tabs::
.. tab:: CMake build
By default the library will be downloaded from the git repository
and built automatically when the USER-PACE package is enabled with
``-D PKG_USER-PACE=yes``. The location for the sources may be
customized by setting the variable ``PACELIB_URL`` when
configuring with CMake (e.g. to use a local archive on machines
without internet access). Since CMake checks the validity of the
archive with ``md5sum`` you may also need to set ``PACELIB_MD5``
if you provide a different library version than what is downloaded
automatically.
.. tab:: Traditional make
You can download and build the USER-PACE library
in one step from the ``lammps/src`` dir, using these commands,
which invoke the ``lib/pace/Install.py`` script.
.. code-block:: bash
$ make lib-pace # print help message
$ make lib-pace args="-b" # download and build the default version in lib/pace
You should not need to edit the ``lib/pace/Makefile.lammps`` file.
----------
.. _user-plumed:
USER-PLUMED package

View File

@ -30,17 +30,17 @@ steps, as explained on the :doc:`Build extras <Build_extras>` page.
These links take you to the extra instructions for those select
packages:
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`COMPRESS <compress>` | :ref:`GPU <gpu>` | :ref:`KIM <kim>` | :ref:`KOKKOS <kokkos>` | :ref:`LATTE <latte>` | :ref:`MESSAGE <message>` |
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`MSCG <mscg>` | :ref:`OPT <opt>` | :ref:`POEMS <poems>` | :ref:`PYTHON <python>` | :ref:`VORONOI <voronoi>` | :ref:`USER-ADIOS <user-adios>` |
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-ATC <user-atc>` | :ref:`USER-AWPMD <user-awpmd>` | :ref:`USER-COLVARS <user-colvars>` | :ref:`USER-H5MD <user-h5md>` | :ref:`USER-INTEL <user-intel>` | :ref:`USER-MOLFILE <user-molfile>` |
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-NETCDF <user-netcdf>` | :ref:`USER-PLUMED <user-plumed>` | :ref:`USER-OMP <user-omp>` | :ref:`USER-QMMM <user-qmmm>` | :ref:`USER-QUIP <user-quip>` | :ref:`USER-SCAFACOS <user-scafacos>` |
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-SMD <user-smd>` | :ref:`USER-VTK <user-vtk>` | | | | |
+----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`COMPRESS <compress>` | :ref:`GPU <gpu>` | :ref:`KIM <kim>` | :ref:`KOKKOS <kokkos>` | :ref:`LATTE <latte>` | :ref:`MESSAGE <message>` |
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`MSCG <mscg>` | :ref:`OPT <opt>` | :ref:`POEMS <poems>` | :ref:`PYTHON <python>` | :ref:`VORONOI <voronoi>` | :ref:`USER-ADIOS <user-adios>` |
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-ATC <user-atc>` | :ref:`USER-AWPMD <user-awpmd>` | :ref:`USER-COLVARS <user-colvars>` | :ref:`USER-H5MD <user-h5md>` | :ref:`USER-INTEL <user-intel>` | :ref:`USER-MOLFILE <user-molfile>` |
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-NETCDF <user-netcdf>` | :ref:`USER-PACE <user-pace>` | :ref:`USER-PLUMED <user-plumed>` | :ref:`USER-OMP <user-omp>` | :ref:`USER-QMMM <user-qmmm>` | :ref:`USER-QUIP <user-quip>` |
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
| :ref:`USER-SCAFACOS <user-scafacos>` | :ref:`USER-SMD <user-smd>` | :ref:`USER-VTK <user-vtk>` | | | |
+--------------------------------------+--------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+
The mechanism for including packages is simple but different for CMake
versus make.

View File

@ -46,6 +46,7 @@ OPT.
* :doc:`bond/react <fix_bond_react>`
* :doc:`bond/swap <fix_bond_swap>`
* :doc:`box/relax <fix_box_relax>`
* :doc:`charge/regulation <fix_charge_regulation>`
* :doc:`client/md <fix_client_md>`
* :doc:`cmap <fix_cmap>`
* :doc:`colvars <fix_colvars>`

View File

@ -216,6 +216,7 @@ OPT.
* :doc:`oxrna2/stk <pair_oxrna2>`
* :doc:`oxrna2/xstk <pair_oxrna2>`
* :doc:`oxrna2/coaxstk <pair_oxrna2>`
* :doc:`pace <pair_pace>`
* :doc:`peri/eps <pair_peri>`
* :doc:`peri/lps (o) <pair_peri>`
* :doc:`peri/pmb (o) <pair_peri>`

View File

@ -49,8 +49,8 @@ underscore character '_' to separate words. Outside of bundled libraries
which may have different conventions, all C and C++ header files have a
``.h`` extension, all C++ files have a ``.cpp`` extension, and C files a
``.c`` extension. A small number of C++ classes and utility functions
are implemented with only a ``.h`` file. Examples are the Pointer class
or the MathVec functions.
are implemented with only a ``.h`` file. Examples are the Pointers and
Commands classes or the MathVec functions.
Class topology
--------------
@ -144,7 +144,7 @@ implement specific commands that can be invoked before, after, or in
between runs. For these an instance of the class is created, its
command() method called and then, after completion, the class instance
deleted. Examples for this are the create_box, create_atoms, minimize,
run, or velocity command styles.
run, set, or velocity command styles.
For all those ``styles`` certain naming conventions are employed: for
the fix nve command the class is called FixNVE and the source files are
@ -175,11 +175,11 @@ follows:
- The Input class reads and processes input input strings and files,
stores variables, and invokes :doc:`commands <Commands_all>`.
- As discussed above, command style classes are directly derived from
the Pointers class. They provide input script commands that perform
one-time operations before/after/between simulations or which invoke a
simulation. They are instantiated from within the Input class,
invoked, then immediately destructed.
- Command style classes are derived from the Command class. They provide
input script commands that perform one-time operations
before/after/between simulations or which invoke a simulation. They
are usually instantiated from within the Input class, its ``command``
method invoked, and then immediately destructed.
- The Finish class is instantiated to print statistics to the screen
after a simulation is performed, by commands like run and minimize.

View File

@ -59,31 +59,25 @@ Members of ``lammpsplugin_t``
* - author
- String with the name and email of the author
* - creator.v1
- Pointer to factory function for pair, bond, angle, dihedral, or improper styles
- Pointer to factory function for pair, bond, angle, dihedral, improper or command styles
* - creator.v2
- Pointer to factory function for compute, fix, or region styles
* - creator.v3
- Pointer to factory function for command styles
* - handle
- Pointer to the open DSO file handle
Only one of the three alternate creator entries can be used at a time
and which of those is determined by the style of plugin. The "creator.v1"
element is for factory functions of supported styles computing forces (i.e.
pair, bond, angle, dihedral, or improper styles) and the function takes
as single argument the pointer to the LAMMPS instance. The factory function
is cast to the ``lammpsplugin_factory1`` type before assignment. The
"creator.v2" element is for factory functions creating an instance of
a fix, compute, or region style and takes three arguments: a pointer to
the LAMMPS instance, an integer with the length of the argument list and
a ``char **`` pointer to the list of arguments. The factory function pointer
needs to be cast to the ``lammpsplugin_factory2`` type before assignment.
The "creator.v3" element takes the same arguments as "creator.v3" but is
specific to creating command styles: the factory function has to instantiate
the command style locally passing the LAMMPS pointer as argument and then
call its "command" member function with the number and list of arguments.
The factory function pointer needs to be cast to the
``lammpsplugin_factory3`` type before assignment.
and which of those is determined by the style of plugin. The
"creator.v1" element is for factory functions of supported styles
computing forces (i.e. command, pair, bond, angle, dihedral, or
improper styles) and the function takes as single argument the pointer
to the LAMMPS instance. The factory function is cast to the
``lammpsplugin_factory1`` type before assignment. The "creator.v2"
element is for factory functions creating an instance of a fix, compute,
or region style and takes three arguments: a pointer to the LAMMPS
instance, an integer with the length of the argument list and a ``char
**`` pointer to the list of arguments. The factory function pointer
needs to be cast to the ``lammpsplugin_factory2`` type before
assignment.
Pair style example
^^^^^^^^^^^^^^^^^^
@ -123,12 +117,12 @@ function would look like this:
The factory function in this example is called ``morse2creator()``. It
receives a pointer to the LAMMPS class as only argument and thus has to
be assigned to the *creator.v1* member of the plugin struct and cast to the
``lammpsplugin_factory1`` pointer type. It returns a
be assigned to the *creator.v1* member of the plugin struct and cast to
the ``lammpsplugin_factory1`` function pointer type. It returns a
pointer to the allocated class instance derived from the ``Pair`` class.
This function may be declared static to avoid clashes with other plugins.
The name of the derived class, ``PairMorse2``, must be unique inside
the entire LAMMPS executable.
This function may be declared static to avoid clashes with other
plugins. The name of the derived class, ``PairMorse2``, however must be
unique inside the entire LAMMPS executable.
Fix style example
^^^^^^^^^^^^^^^^^
@ -169,9 +163,9 @@ Below is an example for that:
Command style example
^^^^^^^^^^^^^^^^^^^^^
For command styles there is a third variant of factory function as
Command styles also use the first variant of factory function as
demonstrated in the following example, which also shows that the
implementation of the plugin class may also be within the same
implementation of the plugin class may be within the same source
file as the plugin interface code:
.. code-block:: C++
@ -180,15 +174,15 @@ file as the plugin interface code:
#include "comm.h"
#include "error.h"
#include "pointers.h"
#include "command.h"
#include "version.h"
#include <cstring>
namespace LAMMPS_NS {
class Hello : protected Pointers {
class Hello : public Command {
public:
Hello(class LAMMPS *lmp) : Pointers(lmp) {};
Hello(class LAMMPS *lmp) : Command(lmp) {};
void command(int, char **);
};
}
@ -202,10 +196,9 @@ file as the plugin interface code:
utils::logmesg(lmp,fmt::format("Hello, {}!\n",argv[0]));
}
static void hellocreator(LAMMPS *lmp, int argc, char **argv)
static void hellocreator(LAMMPS *lmp)
{
Hello hello(lmp);
hello.command(argc,argv);
return new Hello(lmp);
}
extern "C" void lammpsplugin_init(void *lmp, void *handle, void *regfunc)
@ -216,9 +209,9 @@ file as the plugin interface code:
plugin.version = LAMMPS_VERSION;
plugin.style = "command";
plugin.name = "hello";
plugin.info = "Hello world command v1.0";
plugin.info = "Hello world command v1.1";
plugin.author = "Axel Kohlmeyer (akohlmey@gmail.com)";
plugin.creator.v3 = (lammpsplugin_factory3 *) &hellocreator;
plugin.creator.v1 = (lammpsplugin_factory1 *) &hellocreator;
plugin.handle = handle;
(*register_plugin)(&plugin,lmp);
}

View File

@ -21,8 +21,8 @@ orientations and their associated inter-atomic distances.
The command :doc:`fix precession/spin <fix_precession_spin>` allows to
apply a constant magnetic torque on all the spins in the system. This
torque can be an external magnetic field (Zeeman interaction), or an
uniaxial magnetic anisotropy.
torque can be an external magnetic field (Zeeman interaction), and an
uniaxial or cubic magnetic anisotropy.
A Langevin thermostat can be applied to those magnetic spins using
:doc:`fix langevin/spin <fix_langevin_spin>`. Typically, this thermostat

Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 286 KiB

View File

@ -1,14 +1,15 @@
Input script command style
==========================
New commands can be added to LAMMPS input scripts by adding new
classes that have a "command" method. For example, the create_atoms,
read_data, velocity, and run commands are all implemented in this
fashion. When such a command is encountered in the LAMMPS input
script, LAMMPS simply creates a class with the corresponding name,
invokes the "command" method of the class, and passes it the arguments
from the input script. The command method can perform whatever
operations it wishes on LAMMPS data structures.
New commands can be added to LAMMPS input scripts by adding new classes
that are derived from the Command class and thus must have a "command"
method. For example, the create_atoms, read_data, velocity, and run
commands are all implemented in this fashion. When such a command is
encountered in the LAMMPS input script, LAMMPS simply creates a class
instance with the corresponding name, invokes the "command" method of
the class, and passes it the arguments from the input script. The
command method can perform whatever operations it wishes on LAMMPS data
structures.
The single method your new class must define is as follows:

View File

@ -90,6 +90,7 @@ page gives those details.
* :ref:`USER-MOLFILE <PKG-USER-MOLFILE>`
* :ref:`USER-NETCDF <PKG-USER-NETCDF>`
* :ref:`USER-OMP <PKG-USER-OMP>`
* :ref:`USER-PACE <PKG-USER-PACE>`
* :ref:`USER-PHONON <PKG-USER-PHONON>`
* :ref:`USER-PLUMED <PKG-USER-PLUMED>`
* :ref:`USER-PTM <PKG-USER-PTM>`
@ -585,7 +586,7 @@ MC package
Several fixes and a pair style that have Monte Carlo (MC) or MC-like
attributes. These include fixes for creating, breaking, and swapping
bonds, for performing atomic swaps, and performing grand-canonical MC
(GCMC) in conjunction with dynamics.
(GCMC) or similar processes in conjunction with dynamics.
**Supporting info:**
@ -593,8 +594,12 @@ bonds, for performing atomic swaps, and performing grand-canonical MC
* :doc:`fix atom/swap <fix_atom_swap>`
* :doc:`fix bond/break <fix_bond_break>`
* :doc:`fix bond/create <fix_bond_create>`
* :doc:`fix bond/create/angle <fix_bond_create>`
* :doc:`fix bond/swap <fix_bond_swap>`
* :doc:`fix charge/regulation <fix_charge_regulation>`
* :doc:`fix gcmc <fix_gcmc>`
* :doc:`fix tfmc <fix_tfmc>`
* :doc:`fix widom <fix_widom>`
* :doc:`pair_style dsmc <pair_dsmc>`
* https://lammps.sandia.gov/movies.html#gcmc
@ -1349,6 +1354,46 @@ This package has :ref:`specific installation instructions <user-colvars>` on the
----------
.. _PKG-USER-PACE:
USER-PACE package
-------------------
**Contents:**
A pair style for the Atomic Cluster Expansion potential (ACE).
ACE is a methodology for deriving a highly accurate classical potential
fit to a large archive of quantum mechanical (DFT) data. The USER-PACE
package provides an efficient implementation for running simulations
with ACE potentials.
**Authors:**
This package was written by Yury Lysogorskiy^1,
Cas van der Oord^2, Anton Bochkarev^1,
Sarath Menon^1, Matteo Rinaldi^1, Thomas Hammerschmidt^1, Matous Mrovec^1,
Aidan Thompson^3, Gabor Csanyi^2, Christoph Ortner^4, Ralf Drautz^1.
^1: Ruhr-University Bochum, Bochum, Germany
^2: University of Cambridge, Cambridge, United Kingdom
^3: Sandia National Laboratories, Albuquerque, New Mexico, USA
^4: University of British Columbia, Vancouver, BC, Canada
**Install:**
This package has :ref:`specific installation instructions <user-pace>` on the :doc:`Build extras <Build_extras>` page.
**Supporting info:**
* src/USER-PACE: filenames -> commands
* :doc:`pair_style pace <pair_pace>`
* examples/USER/pace
----------
.. _PKG-USER-PLUMED:
USER-PLUMED package

View File

@ -81,6 +81,8 @@ package:
+------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+
| :ref:`USER-OMP <PKG-USER-OMP>` | OpenMP-enabled styles | :doc:`Speed omp <Speed_omp>` | `Benchmarks <https://lammps.sandia.gov/bench.html>`_ | no |
+------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+
| :ref:`USER-PACE <PKG-USER-PACE>` | Fast implementation of Atomic Cluster Expansion (ACE) potential | :doc:`pair pace <pair_pace>` | USER/pace | ext |
+------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+
| :ref:`USER-PHONON <PKG-USER-PHONON>` | phonon dynamical matrix | :doc:`fix phonon <fix_phonon>` | USER/phonon | no |
+------------------------------------------------+-----------------------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+---------+
| :ref:`USER-PLUMED <PKG-USER-PLUMED>` | :ref:`PLUMED <PLUMED>` free energy library | :doc:`fix plumed <fix_plumed>` | USER/plumed | ext |

View File

@ -27,7 +27,7 @@ Syntax
template-ID = ID of molecule template specified in a separate :doc:`molecule <molecule>` command
*hybrid* args = list of one or more sub-styles, each with their args
* accelerated styles (with same args) = *angle/kk* or *atomic/kk* or *bond/kk* or *charge/kk* or *full/kk* or *molecular/kk*
* accelerated styles (with same args) = *angle/kk* or *atomic/kk* or *bond/kk* or *charge/kk* or *full/kk* or *molecular/kk* or *spin/kk*
Examples
""""""""

View File

@ -308,9 +308,9 @@ performed with dump style *xtc*\ .
----------
The *format* keyword can be used to change the default numeric format
output by the text-based dump styles: *atom*\ , *custom*\ , *cfg*\ , and
*xyz* styles, and their MPIIO variants. Only the *line* or *none*
The *format* keyword can be used to change the default numeric format output
by the text-based dump styles: *atom*\ , *local*\ , *custom*\ , *cfg*\ , and
*xyz* styles, and their MPIIO variants. Only the *line* or *none*
options can be used with the *atom* and *xyz* styles.
All the specified format strings are C-style formats, e.g. as used by
@ -362,7 +362,7 @@ settings, reverting all values to their default format.
compute 1 all property/local batom1 batom2
dump 1 all local 100 tmp.bonds index c_1[1] c_1[2]
dump_modify 1 format "%d %0.0f %0.0f"
dump_modify 1 format line "%d %0.0f %0.0f"
will output the two atom IDs for atoms in each bond as integers. If
the dump_modify command were omitted, they would appear as

View File

@ -189,6 +189,7 @@ accelerated styles exist.
* :doc:`bond/react <fix_bond_react>` - apply topology changes to model reactions
* :doc:`bond/swap <fix_bond_swap>` - Monte Carlo bond swapping
* :doc:`box/relax <fix_box_relax>` - relax box size during energy minimization
* :doc:`charge/regulation <fix_charge_regulation>` - Monte Carlo sampling of charge regulation
* :doc:`client/md <fix_client_md>` - MD client for client/server simulations
* :doc:`cmap <fix_cmap>` - enables CMAP cross-terms of the CHARMM force field
* :doc:`colvars <fix_colvars>` - interface to the collective variables "Colvars" library

View File

@ -0,0 +1,276 @@
.. index:: fix charge/regulation
fix charge/regulation command
=============================
Syntax
""""""
.. parsed-literal::
fix ID group-ID charge/regulation cation_type anion_type keyword value(s)
* ID, group-ID are documented in fix command
* charge/regulation = style name of this fix command
* cation_type = atom type of free cations
* anion_type = atom type of free anions
* zero or more keyword/value pairs may be appended
.. parsed-literal::
keyword = *pH*, *pKa*, *pKb*, *pIp*, *pIm*, *pKs*, *acid_type*, *base_type*, *lunit_nm*, *temp*, *tempfixid*, *nevery*, *nmc*, *xrd*, *seed*, *tag*, *group*, *onlysalt*, *pmcmoves*
*pH* value = pH of the solution
*pKa* value = acid dissociation constant
*pKb* value = base dissociation constant
*pIp* value = chemical potential of free cations
*pIm* value = chemical potential of free anions
*pKs* value = solution self-dissociation constant
*acid_type* = atom type of acid groups
*base_type* = atom type of base groups
*lunit_nm* value = unit length used by LAMMPS (# in the units of nanometers)
*temp* value = temperature
*tempfixid* value = fix ID of temperature thermostat
*nevery* value = invoke this fix every nevery steps
*nmc* value = number of charge regulation MC moves to attempt every nevery steps
*xrd* value = cutoff distance for acid/base reaction
*seed* value = random # seed (positive integer)
*tag* value = yes or no (yes: The code assign unique tags to inserted ions; no: The tag of all inserted ions is "0")
*group* value = group-ID, inserted ions are assigned to group group-ID. Can be used multiple times to assign inserted ions to multiple groups.
*onlysalt* values = flag charge_cation charge_anion.
flag = yes or no (yes: the fix performs only ion insertion/deletion, no: perform acid/base dissociation and ion insertion/deletion)
charge_cation, charge_anion = value of cation/anion charge, must be an integer (only specify if flag = yes)
*pmcmoves* values = pmcA pmcB pmcI - MC move fractions for acid ionization (pmcA), base ionization (pmcB) and free ion exchange (pmcI)
Examples
""""""""
.. code-block:: LAMMPS
fix chareg all charge/regulation 1 2 acid_type 3 base_type 4 pKa 5 pKb 7 lb 1.0 nevery 200 nexchange 200 seed 123 tempfixid fT
fix chareg all charge/regulation 1 2 pIp 3 pIm 3 onlysalt yes 2 -1 seed 123 tag yes temp 1.0
Description
"""""""""""
This fix performs Monte Carlo (MC) sampling of charge regulation and
exchange of ions with a reservoir as discussed in :ref:`(Curk1) <Curk1>`
and :ref:`(Curk2) <Curk2>`. The implemented method is largely analogous
to the grand-reaction ensemble method in :ref:`(Landsgesell)
<Landsgesell>`. The implementation is parallelized, compatible with
existing LAMMPS functionalities, and applicable to any system utilizing
discrete, ionizable groups or surface sites.
Specifically, the fix implements the following three types of MC moves,
which discretely change the charge state of individual particles and
insert ions into the systems: :math:`\mathrm{A} \rightleftharpoons
\mathrm{A}^-+\mathrm{X}^+`, :math:`\mathrm{B} \rightleftharpoons
\mathrm{B}^++\mathrm{X}^-`, and :math:`\emptyset \rightleftharpoons
Z^-\mathrm{X}^{Z^+}+Z^+\mathrm{X}^{-Z^-}`. In the former two types of
reactions, Monte Carlo moves alter the charge value of specific atoms
(:math:`\mathrm{A}`, :math:`\mathrm{B}`) and simultaneously insert a
counterion to preserve the charge neutrality of the system, modeling the
dissociation/association process. The last type of reaction performs
grand canonical MC exchange of ion pairs with a (fictitious) reservoir.
In our implementation "acid" refers to particles that can attain charge
:math:`q=\{0,-1\}` and "base" to particles with :math:`q=\{0,1\}`,
whereas the MC exchange of free ions allows any integer charge values of
:math:`{Z^+}` and :math:`{Z^-}`.
Here we provide several practical examples for modeling charge
regulation effects in solvated systems. An acid ionization reaction
(:math:`\mathrm{A} \rightleftharpoons \mathrm{A}^-+\mathrm{H}^+`) can be
defined via a single line in the input file
.. code-block:: LAMMPS
fix acid_reaction all charge/regulation 2 3 acid_type 1 pH 7.0 pKa 5.0 pIp 7.0 pIm 7.0
where the fix attempts to charge :math:`\mathrm{A}` (discharge
:math:`\mathrm{A}^-`) to :math:`\mathrm{A}^-` (:math:`\mathrm{A}`) and
insert (delete) a proton (atom type 2). Besides, the fix implements
self-ionization reaction of water :math:`\emptyset \rightleftharpoons
\mathrm{H}^++\mathrm{OH}^-`. However, this approach is highly
inefficient at :math:`\mathrm{pH} \approx 7` when the concentration of
both protons and hydroxyl ions is low, resulting in a relatively low
acceptance rate of MC moves.
A more efficient way is to allow salt ions to participate in ionization
reactions, which can be easily achieved via
.. code-block:: LAMMPS
fix acid_reaction all charge/regulation 4 5 acid_type 1 pH 7.0 pKa 5.0 pIp 2.0 pIm 2.0
where particles of atom type 4 and 5 are the salt cations and anions,
both at chemical potential pI=2.0, see :ref:`(Curk1) <Curk1>` and
:ref:`(Landsgesell) <Landsgesell>` for more details.
Similarly, we could have simultaneously added a base ionization reaction
(:math:`\mathrm{B} \rightleftharpoons \mathrm{B}^++\mathrm{OH}^-`)
.. code-block:: LAMMPS
fix base_reaction all charge/regulation 2 3 base_type 6 pH 7.0 pKb 6.0 pIp 7.0 pIm 7.0
where the fix will attempt to charge :math:`\mathrm{B}` (discharge
:math:`\mathrm{B}^+`) to :math:`\mathrm{B}^+` (:math:`\mathrm{B}`) and
insert (delete) a hydroxyl ion :math:`\mathrm{OH}^-` of atom type 3. If
neither the acid or the base type is specified, for example,
.. code-block:: LAMMPS
fix salt_reaction all charge/regulation 4 5 pIp 2.0 pIm 2.0
the fix simply inserts or deletes an ion pair of a free cation (atom
type 4) and a free anion (atom type 5) as done in a conventional
grand-canonical MC simulation.
The fix is compatible with LAMMPS sub-packages such as *molecule* or
*rigid*. That said, the acid and base particles can be part of larger
molecules or rigid bodies. Free ions that are inserted to or deleted
from the system must be defined as single particles (no bonded
interactions allowed) and cannot be part of larger molecules or rigid
bodies. If *molecule* package is used, all inserted ions have a molecule
ID equal to zero.
Note that LAMMPS implicitly assumes a constant number of particles
(degrees of freedom). Since using this fix alters the total number of
particles during the simulation, any thermostat used by LAMMPS, such as
NVT or Langevin, must use a dynamic calculation of system
temperature. This can be achieved by specifying a dynamic temperature
compute (e.g. dtemp) and using it with the desired thermostat, e.g. a
Langevin thermostat:
.. code-block:: LAMMPS
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
The chemical potential units (e.g. pH) are in the standard log10
representation assuming reference concentration :math:`\rho_0 =
\mathrm{mol}/\mathrm{l}`. Therefore, to perform the internal unit
conversion, the length (in nanometers) of the LAMMPS unit length must be
specified via *lunit_nm* (default is set to the Bjerrum length in water
at room temperature *lunit_nm* = 0.71nm). For example, in the dilute
ideal solution limit, the concentration of free ions will be
:math:`c_\mathrm{I} = 10^{-\mathrm{pIp}}\mathrm{mol}/\mathrm{l}`.
The temperature used in MC acceptance probability is set by *temp*. This
temperature should be the same as the temperature set by the molecular
dynamics thermostat. For most purposes, it is probably best to use
*tempfixid* keyword which dynamically sets the temperature equal to the
chosen MD thermostat temperature, in the example above we assumed the
thermostat fix-ID is *fT*. The inserted particles attain a random
velocity corresponding to the specified temperature. Using *tempfixid*
overrides any fixed temperature set by *temp*.
The *xrd* keyword can be used to restrict the inserted/deleted
counterions to a specific radial distance from an acid or base particle
that is currently participating in a reaction. This can be used to
simulate more realist reaction dynamics. If *xrd* = 0 or *xrd* > *L* /
2, where *L* is the smallest box dimension, the radial restriction is
automatically turned off and free ion can be inserted or deleted
anywhere in the simulation box.
If the *tag yes* is used, every inserted atom gets a unique tag ID,
otherwise, the tag of every inserted atom is set to 0. *tag yes* might
cause an integer overflow in very long simulations since the tags are
unique to every particle and thus increase with every successful
particle insertion.
The *pmcmoves* keyword sets the relative probability of attempting the
three types of MC moves (reactions): acid charging, base charging, and
ion pair exchange. The fix only attempts to perform particle charging
MC moves if *acid_type* or *base_type* is defined. Otherwise fix only
performs free ion insertion/deletion. For example, if *acid_type* is not
defined, *pmcA* is automatically set to 0. The vector *pmcmoves* is
automatically normalized, for example, if set to *pmcmoves* 0 0.33 0.33,
the vector would be normalized to [0,0.5,0.5].
The *only_salt* option can be used to perform multivalent
grand-canonical ion-exchange moves. If *only_salt yes* is used, no
charge exchange is performed, only ion insertion/deletion (*pmcmoves* is
set to [0,0,1]), but ions can be multivalent. In the example above, an
MC move would consist of three ion insertion/deletion to preserve the
charge neutrality of the system.
The *group* keyword can be used to add inserted particles to a specific
group-ID. All inserted particles are automatically added to group *all*.
Output
""""""
This fix computes a global vector of length 8, which can be accessed by
various output commands. The vector values are the following global
quantities:
* 1 = cumulative MC attempts
* 2 = cumulative MC successes
* 3 = current # of neutral acid atoms
* 4 = current # of -1 charged acid atoms
* 5 = current # of neutral base atoms
* 6 = current # of +1 charged base atoms
* 7 = current # of free cations
* 8 = current # of free anions
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
<Build_package>` doc page for more info.
The :doc:`atom_style <atom_style>`, used must contain the charge
property, for example, the style could be *charge* or *full*. Only
usable for 3D simulations. Atoms specified as free ions cannot be part
of rigid bodies or molecules and cannot have bonding interactions. The
scheme is limited to integer charges, any atoms with non-integer charges
will not be considered by the fix.
All interaction potentials used must be continuous, otherwise the MD
integration and the particle exchange MC moves do not correspond to the
same equilibrium ensemble. For example, if an lj/cut pair style is used,
the LJ potential must be shifted so that it vanishes at the cutoff. This
can be easily achieved using the :doc:`pair_modify <pair_modify>`
command, i.e., by using: *pair_modify shift yes*.
.. note::
Region restrictions are not yet implemented.
Related commands
""""""""""""""""
:doc:`fix gcmc <fix_gcmc>`,
:doc:`fix atom/swap <fix_atom_swap>`
Default
"""""""
pH = 7.0; pKa = 100.0; pKb = 100.0; pIp = 5.0; pIm = 5.0; pKs = 14.0;
acid_type = -1; base_type = -1; lunit_nm = 0.71; temp = 1.0; nevery =
100; nmc = 100; xrd = 0; seed = 0; tag = no; onlysalt = no, pmcmoves =
[1/3, 1/3, 1/3], group-ID = all
----------
.. _Curk1:
**(Curk1)** T. Curk, J. Yuan, and E. Luijten, "Coarse-grained simulation of charge regulation using LAMMPS", preprint (2021).
.. _Curk2:
**(Curk2)** T. Curk and E. Luijten, "Charge-regulation effects in nanoparticle self-assembly", PRL (2021)
.. _Landsgesell:
**(Landsgesell)** J. Landsgesell, P. Hebbeker, O. Rud, R. Lunkad, P. Kosovan, and C. Holm, "Grand-reaction method for simulations of ionization equilibria coupled to ion partitioning", Macromolecules 53, 3007-3020 (2020).

View File

@ -56,27 +56,28 @@ Examples
Description
"""""""""""
Perform the charge equilibration (QEq) method as described in :ref:`(Rappe and Goddard) <Rappe1>` and formulated in :ref:`(Nakano) <Nakano1>` (also known
as the matrix inversion method) and in :ref:`(Rick and Stuart) <Rick1>` (also
known as the extended Lagrangian method) based on the
electronegativity equilization principle.
Perform the charge equilibration (QEq) method as described in
:ref:`(Rappe and Goddard) <Rappe1>` and formulated in :ref:`(Nakano)
<Nakano1>` (also known as the matrix inversion method) and in
:ref:`(Rick and Stuart) <Rick1>` (also known as the extended Lagrangian
method) based on the electronegativity equilization principle.
These fixes can be used with any :doc:`pair style <pair_style>` in
LAMMPS, so long as per-atom charges are defined. The most typical
use-case is in conjunction with a :doc:`pair style <pair_style>` that
performs charge equilibration periodically (e.g. every timestep), such
as the ReaxFF or Streitz-Mintmire potential.
But these fixes can also be used with
potentials that normally assume per-atom charges are fixed, e.g. a
:doc:`Buckingham <pair_buck>` or :doc:`LJ/Coulombic <pair_lj>` potential.
as the ReaxFF or Streitz-Mintmire potential. But these fixes can also
be used with potentials that normally assume per-atom charges are fixed,
e.g. a :doc:`Buckingham <pair_buck>` or :doc:`LJ/Coulombic <pair_lj>`
potential.
Because the charge equilibration calculation is effectively
independent of the pair style, these fixes can also be used to perform
a one-time assignment of charges to atoms. For example, you could
define the QEq fix, perform a zero-timestep run via the :doc:`run <run>`
command without any pair style defined which would set per-atom
charges (based on the current atom configuration), then remove the fix
via the :doc:`unfix <unfix>` command before performing further dynamics.
Because the charge equilibration calculation is effectively independent
of the pair style, these fixes can also be used to perform a one-time
assignment of charges to atoms. For example, you could define the QEq
fix, perform a zero-timestep run via the :doc:`run <run>` command
without any pair style defined which would set per-atom charges (based
on the current atom configuration), then remove the fix via the
:doc:`unfix <unfix>` command before performing further dynamics.
.. note::
@ -87,11 +88,14 @@ via the :doc:`unfix <unfix>` command before performing further dynamics.
.. note::
The :doc:`fix qeq/comb <fix_qeq_comb>` command must still be used
to perform charge equilibration with the :doc:`COMB potential <pair_comb>`. The :doc:`fix qeq/reax <fix_qeq_reax>`
command can be used to perform charge equilibration with the :doc:`ReaxFF force field <pair_reaxc>`, although fix qeq/shielded yields the
same results as fix qeq/reax if *Nevery*\ , *cutoff*\ , and *tolerance*
are the same. Eventually the fix qeq/reax command will be deprecated.
The :doc:`fix qeq/comb <fix_qeq_comb>` command must still be used to
perform charge equilibration with the :doc:`COMB potential
<pair_comb>`. The :doc:`fix qeq/reax <fix_qeq_reax>` command can be
used to perform charge equilibration with the :doc:`ReaxFF force
field <pair_reaxc>`, although fix qeq/shielded yields the same
results as fix qeq/reax if *Nevery*\ , *cutoff*\ , and *tolerance*
are the same. Eventually the fix qeq/reax command will be
deprecated.
The QEq method minimizes the electrostatic energy of the system (or
equalizes the derivative of energy with respect to charge of all the
@ -134,55 +138,57 @@ usually a good number.
The *qeq/shielded* style describes partial charges on atoms also as
point charges, but uses a shielded Coulomb potential to describe the
interaction between a pair of charged particles. Interaction through
the shielded Coulomb is given by equation (13) of the :ref:`ReaxFF force field <vanDuin>` paper. The shielding accounts for charge overlap
the shielded Coulomb is given by equation (13) of the :ref:`ReaxFF force
field <vanDuin>` paper. The shielding accounts for charge overlap
between charged particles at small separation. This style is the same
as :doc:`fix qeq/reax <fix_qeq_reax>`, and can be used with :doc:`pair_style reax/c <pair_reaxc>`. Only the *chi*\ , *eta*\ , and *gamma*
parameters from the *qfile* file are used. When using the string
*reax/c* as filename, these parameters are extracted directly from
an active *reax/c* pair style. This style solves partial
charges on atoms via the matrix inversion method. A tolerance of
1.0e-6 is usually a good number.
as :doc:`fix qeq/reax <fix_qeq_reax>`, and can be used with
:doc:`pair_style reax/c <pair_reaxc>`. Only the *chi*\ , *eta*\ , and
*gamma* parameters from the *qfile* file are used. When using the string
*reax/c* as filename, these parameters are extracted directly from an
active *reax/c* pair style. This style solves partial charges on atoms
via the matrix inversion method. A tolerance of 1.0e-6 is usually a
good number.
The *qeq/slater* style describes partial charges on atoms as spherical
charge densities centered around atoms via the Slater 1\ *s* orbital, so
that the interaction between a pair of charged particles is the
product of two Slater 1\ *s* orbitals. The expression for the Slater
1\ *s* orbital is given under equation (6) of the
:ref:`Streitz-Mintmire <Streitz1>` paper. Only the *chi*\ , *eta*\ , *zeta*\ , and
*qcore* parameters from the *qfile* file are used. When using the string
that the interaction between a pair of charged particles is the product
of two Slater 1\ *s* orbitals. The expression for the Slater 1\ *s*
orbital is given under equation (6) of the :ref:`Streitz-Mintmire
<Streitz1>` paper. Only the *chi*\ , *eta*\ , *zeta*\ , and *qcore*
parameters from the *qfile* file are used. When using the string
*coul/streitz* as filename, these parameters are extracted directly from
an active *coul/streitz* pair style. This style solves
partial charges on atoms via the matrix inversion method. A tolerance
of 1.0e-6 is usually a good number. Keyword *alpha* can be used to
change the Slater type orbital exponent.
an active *coul/streitz* pair style. This style solves partial charges
on atoms via the matrix inversion method. A tolerance of 1.0e-6 is
usually a good number. Keyword *alpha* can be used to change the Slater
type orbital exponent.
The *qeq/dynamic* style describes partial charges on atoms as point
charges that interact through 1/r, but the extended Lagrangian method
is used to solve partial charges on atoms. Only the *chi* and *eta*
charges that interact through 1/r, but the extended Lagrangian method is
used to solve partial charges on atoms. Only the *chi* and *eta*
parameters from the *qfile* file are used. Note that Coulomb
catastrophe can occur if repulsion between the pair of charged
particles is too weak. A tolerance of 1.0e-3 is usually a good
number. Keyword *qdamp* can be used to change the damping factor, while
keyword *qstep* can be used to change the time step size.
catastrophe can occur if repulsion between the pair of charged particles
is too weak. A tolerance of 1.0e-3 is usually a good number. Keyword
*qdamp* can be used to change the damping factor, while keyword *qstep*
can be used to change the time step size.
The :ref:`\ *qeq/fire*\ <Shan>` style describes the same charge model and charge
solver as the *qeq/dynamic* style, but employs a FIRE minimization
algorithm to solve for equilibrium charges.
Keyword *qdamp* can be used to change the damping factor, while
keyword *qstep* can be used to change the time step size.
The :ref:`\ *qeq/fire*\ <Shan>` style describes the same charge model
and charge solver as the *qeq/dynamic* style, but employs a FIRE
minimization algorithm to solve for equilibrium charges. Keyword
*qdamp* can be used to change the damping factor, while keyword *qstep*
can be used to change the time step size.
Note that *qeq/point*\ , *qeq/shielded*\ , and *qeq/slater* describe
different charge models, whereas the matrix inversion method and the
extended Lagrangian method (\ *qeq/dynamic* and *qeq/fire*\ ) are
different solvers.
Note that *qeq/point*\ , *qeq/dynamic* and *qeq/fire* styles all describe
charges as point charges that interact through 1/r relationship, but
solve partial charges on atoms using different solvers. These three
styles should yield comparable results if
the QEq parameters and *Nevery*\ , *cutoff*\ , and *tolerance* are the
same. Style *qeq/point* is typically faster, *qeq/dynamic* scales
better on larger sizes, and *qeq/fire* is faster than *qeq/dynamic*\ .
Note that *qeq/point*\ , *qeq/dynamic* and *qeq/fire* styles all
describe charges as point charges that interact through 1/r
relationship, but solve partial charges on atoms using different
solvers. These three styles should yield comparable results if the QEq
parameters and *Nevery*\ , *cutoff*\ , and *tolerance* are the same.
Style *qeq/point* is typically faster, *qeq/dynamic* scales better on
larger sizes, and *qeq/fire* is faster than *qeq/dynamic*\ .
.. note::
@ -200,9 +206,11 @@ better on larger sizes, and *qeq/fire* is faster than *qeq/dynamic*\ .
Restart, fix_modify, output, run start/stop, minimize info
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
No information about these fixes is written to :doc:`binary restart files <restart>`. No global scalar or vector or per-atom
quantities are stored by these fixes for access by various :doc:`output commands <Howto_output>`. No parameter of these fixes can be used
with the *start/stop* keywords of the :doc:`run <run>` command.
No information about these fixes is written to :doc:`binary restart
files <restart>`. No global scalar or vector or per-atom quantities are
stored by these fixes for access by various :doc:`output commands
<Howto_output>`. No parameter of these fixes can be used with the
*start/stop* keywords of the :doc:`run <run>` command.
Thexe fixes are invoked during :doc:`energy minimization <minimize>`.
@ -210,7 +218,8 @@ Restrictions
""""""""""""
These fixes are part of the QEQ package. They are only enabled if
LAMMPS was built with that package. See the :doc:`Build package <Build_package>` doc page for more info.
LAMMPS was built with that package. See the :doc:`Build package
<Build_package>` doc page for more info.
Related commands
""""""""""""""""

114
doc/src/pair_pace.rst Normal file
View File

@ -0,0 +1,114 @@
.. index:: pair_style pace
pair_style pace command
========================
Syntax
""""""
.. code-block:: LAMMPS
pair_style pace ... keyword values ...
* an optional keyword may be appended
* keyword = *product* or *recursive*
.. parsed-literal::
*product* = use product algorithm for basis functions
*recursive* = use recursive algorithm for basis functions
Examples
""""""""
.. code-block:: LAMMPS
pair_style pace
pair_style pace product
pair_coeff * * Cu-PBE-core-rep.ace Cu
Description
"""""""""""
Pair style *pace* computes interactions using the Atomic Cluster
Expansion (ACE), which is a general expansion of the atomic energy in
multi-body basis functions. :ref:`(Drautz) <Drautz20191>`.
The *pace* pair style
provides an efficient implementation that
is described in this paper :ref:`(Lysogorskiy) <Lysogorskiy20211>`.
In ACE, the total energy is decomposed into a sum over
atomic energies. The energy of atom *i* is expressed as a
linear or non-linear function of one or more density functions.
By projecting the
density onto a local atomic base, the lowest order contributions
to the energy can be expressed as a set of scalar polynomials in
basis function contributions summed over neighbor atoms.
Only a single pair_coeff command is used with the *pace* style which
specifies an ACE coefficient file followed by N additional arguments
specifying the mapping of ACE elements to LAMMPS atom types,
where N is the number of LAMMPS atom types:
* ACE coefficient file
* N element names = mapping of ACE elements to atom types
Only a single pair_coeff command is used with the *pace* style which
specifies an ACE file that fully defines the potential.
Note that unlike for other potentials, cutoffs are
not set in the pair_style or pair_coeff command; they are specified in
the ACE file.
The pair_style *pace* command may be followed by an optional keyword
*product* or *recursive*, which determines which of two algorithms
is used for the calculation of basis functions and derivatives.
The default is *recursive*.
See the :doc:`pair_coeff <pair_coeff>` doc page for alternate ways
to specify the path for the ACE coefficient file.
Mixing, shift, table, tail correction, restart, rRESPA info
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
For atom type pairs I,J and I != J, where types I and J correspond to
two different element types, mixing is performed by LAMMPS with
user-specifiable parameters as described above. You never need to
specify a pair_coeff command with I != J arguments for this style.
This pair style does not support the :doc:`pair_modify <pair_modify>`
shift, table, and tail options.
This pair style does not write its information to :doc:`binary restart files <restart>`, since it is stored in potential files. Thus, you
need to re-specify the pair_style and pair_coeff commands in an input
script that reads a restart file.
This pair style can only be used via the *pair* keyword of the
:doc:`run_style respa <run_style>` command. It does not support the
*inner*\ , *middle*\ , *outer* keywords.
----------
Restrictions
""""""""""""
This pair style is part of the USER-PACE package. It is only enabled if LAMMPS
was built with that package.
See the :doc:`Build package <Build_package>` doc page for more info.
Related commands
""""""""""""""""
:doc:`pair_style snap <pair_snap>`
Default
"""""""
recursive
.. _Drautz20191:
**(Drautz)** Drautz, Phys Rev B, 99, 014104 (2019).
.. _Lysogorskiy20211:
**(Lysogorskiy)** Lysogorskiy, van der Oord, Bochkarev, Menon, Rinaldi, Hammerschmidt, Mrovec, Thompson, Csanyi, Ortner, Drautz, TBD (2021).

View File

@ -99,7 +99,7 @@ accelerated styles exist.
* :doc:`zero <pair_zero>` - neighbor list but no interactions
* :doc:`adp <pair_adp>` - angular dependent potential (ADP) of Mishin
* :doc:`agni <pair_agni>` - machine learned potential mapping atomic environment to forces
* :doc:`agni <pair_agni>` - AGNI machine-learning potential
* :doc:`airebo <pair_airebo>` - AIREBO potential of Stuart
* :doc:`airebo/morse <pair_airebo>` - AIREBO with Morse instead of LJ
* :doc:`atm <pair_atm>` - Axilrod-Teller-Muto potential
@ -280,6 +280,7 @@ accelerated styles exist.
* :doc:`oxrna2/hbond <pair_oxrna2>` -
* :doc:`oxrna2/stk <pair_oxrna2>` -
* :doc:`oxrna2/xstk <pair_oxrna2>` -
* :doc:`pace <pair_pace>` - Atomic Cluster Expansion (ACE) machine-learning potential
* :doc:`peri/eps <pair_peri>` - peridynamic EPS potential
* :doc:`peri/lps <pair_peri>` - peridynamic LPS potential
* :doc:`peri/pmb <pair_peri>` - peridynamic PMB potential
@ -297,7 +298,7 @@ accelerated styles exist.
* :doc:`smd/ulsph <pair_smd_ulsph>` -
* :doc:`smtbq <pair_smtbq>` -
* :doc:`mliap <pair_mliap>` - Multiple styles of machine-learning potential
* :doc:`snap <pair_snap>` - SNAP quantum-accurate potential
* :doc:`snap <pair_snap>` - SNAP machine-learning potential
* :doc:`soft <pair_soft>` - Soft (cosine) potential
* :doc:`sph/heatconduction <pair_sph_heatconduction>` -
* :doc:`sph/idealgas <pair_sph_idealgas>` -

View File

@ -261,6 +261,7 @@ bitmask
bitrate
bitrates
Bitzek
Bjerrum
Blaise
blanchedalmond
blocksize
@ -268,6 +269,7 @@ blueviolet
bn
bni
bo
Bochkarev
Bochum
bocs
bodyflag
@ -343,6 +345,7 @@ Cao
Capolungo
Caro
cartesian
Cas
CasP
Caswell
Cates
@ -502,6 +505,8 @@ coulgauss
coulombic
Coulombic
Coulombics
counterion
counterions
Courant
covalent
covalently
@ -730,6 +735,7 @@ DRUDE
dsf
dsmc
dt
dtemp
dtgrow
dtheta
dtshrink
@ -878,6 +884,7 @@ equilibrates
equilibrating
equilibration
Equilibria
equilibria
equilization
equipartitioning
Ercolessi
@ -1069,6 +1076,7 @@ fuer
fx
fy
fz
Gabor
Gahler
gainsboro
Galindo
@ -1193,6 +1201,7 @@ Halperin
Halver
Hamaker
Hamel
Hammerschmidt
haptic
Hara
Harpertown
@ -1212,6 +1221,7 @@ hbnewflag
hbond
hcp
heatconduction
Hebbeker
Hebenstreit
Hecht
Heenen
@ -1279,6 +1289,7 @@ hy
hydrophobicity
hydrostatic
hydrostatically
hydroxyl
Hynninen
Hyoungki
hyperdynamics
@ -1369,6 +1380,7 @@ ints
inv
invariants
inversed
ionizable
ionocovalent
iostreams
iparam
@ -1548,6 +1560,7 @@ Koning
Kooser
Korn
Koskinen
Kosovan
Koster
Kosztin
Kp
@ -1594,6 +1607,7 @@ Lamoureux
Lanczos
Lande
Landron
Landsgesell
langevin
Langevin
Langston
@ -1731,10 +1745,13 @@ lpsapi
lrt
lsfftw
ltbbmalloc
Lua
lubricateU
lucy
Lua
Luding
Luijten
lunit
Lunkad
Lussetti
Lustig
lval
@ -1743,6 +1760,7 @@ lx
ly
Lybrand
lyon
Lysogorskiy
Lyulin
lz
Maaravi
@ -1801,8 +1819,10 @@ Materias
mathbf
mathjax
matlab
Matous
matplotlib
Matsubara
Matteo
Mattice
Mattox
Mattson
@ -1863,6 +1883,7 @@ MEMALIGN
membered
memcheck
Mendelev
Menon
mer
Meremianin
Mersenne
@ -1986,6 +2007,7 @@ mpiio
mpirun
mplayer
mps
Mrovec
Mryglod
mscg
MSCG
@ -2020,6 +2042,7 @@ multiscale
multisectioning
multithreading
Multithreading
multivalent
Mundy
Murdick
Murtola
@ -2065,6 +2088,7 @@ Nanoletters
nanomechanics
nanometer
nanometers
nanoparticle
nanoparticles
Nanotube
nanotube
@ -2174,6 +2198,7 @@ nm
Nm
Nmax
nmax
nmc
Nmin
nmin
Nmols
@ -2308,9 +2333,11 @@ OMP
oneAPI
onelevel
oneway
onlysalt
onn
ons
OO
Oord
opencl
openKIM
openmp
@ -2331,6 +2358,7 @@ Orsi
ortho
orthonormal
orthorhombic
Ortner
oso
Otype
Ouldridge
@ -2390,6 +2418,8 @@ pbc
pc
pchain
Pchain
pcmoves
pmcmoves
Pdamp
pdb
pdf
@ -2434,6 +2464,7 @@ phosphide
Phs
Physica
physik
pI
Piaggi
picocoulomb
picocoulombs
@ -2445,7 +2476,9 @@ pid
piecewise
Pieniazek
Pieter
pIm
pimd
pIp
Piola
Pisarev
Pishevar
@ -2460,6 +2493,9 @@ ploop
PloS
plt
plumedfile
pKa
pKb
pKs
pmb
Pmolrotate
Pmoltrans
@ -2620,6 +2656,7 @@ radians
Rafferty
rahman
Rahman
Ralf
Raman
ramped
ramping
@ -2727,6 +2764,7 @@ Rij
RIj
Rik
Rin
Rinaldi
Rino
RiRj
Risi
@ -2786,6 +2824,7 @@ rst
rstyle
Rubensson
Rubia
Rud
Rudd
Rudra
Rudranarayan
@ -2815,6 +2854,7 @@ Sandia
sandybrown
sanitizer
Sanyal
Sarath
sc
scafacos
SCAFACOS

View File

@ -3,9 +3,15 @@
# clean old res
rm res_*.dat
# compute Lammps
# test standard Lammps
./../../../../src/lmp_serial \
-in test-spin-precession.in
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in test-spin-precession.in
# extract data from Lammps run
in="$(grep -n Step log.lammps | awk -F ':' '{print $1}')"
en="$(grep -n Loop log.lammps | awk -F ':' '{print $1}')"
in="$(echo "$in+1" | bc -l)"

View File

@ -2,8 +2,10 @@
units metal
atom_style spin
# atom_style spin/kk
atom_modify map array
boundary f f f
shell echo "test1"
atom_modify map array
lattice sc 3.0

View File

@ -3,9 +3,15 @@
# clean old res
rm res_*.dat
# compute Lammps
# test standard Lammps
./../../../../src/lmp_serial \
-in test-spin-precession.in
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in test-spin-precession.in
# extract data from Lammps run
in="$(grep -n Step log.lammps | awk -F ':' '{print $1}')"
en="$(grep -n Loop log.lammps | awk -F ':' '{print $1}')"
in="$(echo "$in+1" | bc -l)"

View File

@ -2,6 +2,7 @@
units metal
atom_style spin
# atom_style spin/kk
atom_modify map array
boundary f f f

View File

@ -12,7 +12,14 @@ do
temp="$(echo "$tempi+$i*($tempf-$tempi)/$N" | bc -l)"
sed s/temperature/${temp}/g test-prec-spin.template > \
test-prec-spin.in
# test standard Lammps
./../../../../src/lmp_serial -in test-prec-spin.in
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in test-prec-spin.in
Hz="$(tail -n 1 average_spin | awk -F " " '{print $3}')"
sz="$(tail -n 1 average_spin | awk -F " " '{print $5}')"
en="$(tail -n 1 average_spin | awk -F " " '{print $6}')"

View File

@ -2,6 +2,7 @@
units metal
atom_style spin
# atom_style spin/kk
atom_modify map array
boundary p p p

View File

@ -3,6 +3,7 @@
clear
units metal
atom_style spin
# atom_style spin/kk
dimension 3
boundary p p p
@ -46,4 +47,8 @@ variable tmag equal c_out_mag[6]
thermo_style custom step time v_tmag temp v_emag ke pe etotal
thermo 200
compute outsp all property/atom spx spy spz sp fmx fmy fmz
dump 1 all custom 10 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3]
run 100000
# run 1

View File

@ -3,9 +3,14 @@
# clean old res
rm res_*.dat
# compute Lammps
./../../../../src/lmp_serial \
-in in.spin.iron-nve
# test standard Lammps
../../../../src/lmp_serial -in in.spin.iron-nve
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in in.spin.iron-nve
# extract data from Lammps run
in="$(grep -n Step log.lammps | awk -F ':' '{print $1}')"
en="$(grep -n Loop log.lammps | awk -F ':' '{print $1}')"
in="$(echo "$in+1" | bc -l)"

View File

@ -3,6 +3,7 @@
clear
units metal
atom_style spin
# atom_style spin/kk
dimension 3
boundary p p p

View File

@ -3,6 +3,7 @@
clear
units metal
atom_style spin
# atom_style spin/kk
dimension 3
boundary p p p

View File

@ -3,16 +3,32 @@
# clean old res
rm res_*.dat
# compute NVT Spin -> Lattice
### compute NVT Spin -> Lattice
# test standard Lammps
./../../../../src/lmp_serial -in in.spin.nvt_spin
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in in.spin.nvt_spin
# extract data from Lammps run
in="$(grep -n Step log.lammps | awk -F ':' '{print $1}')"
en="$(grep -n Loop log.lammps | awk -F ':' '{print $1}')"
in="$(echo "$in+1" | bc -l)"
en="$(echo "$en-$in" | bc -l)"
tail -n +$in log.lammps | head -n $en > res_nvt_spin.dat
# compute NVT Lattice -> Spin
### compute NVT Lattice -> Spin
# test standard Lammps
./../../../../src/lmp_serial -in in.spin.nvt_lattice
# test spin/kk with Kokkos Lammps
# mpirun -np 1 ../../../../src/lmp_kokkos_mpi_only \
# -k on -sf kk -in in.spin.nvt_lattice
# extract data from Lammps run
in="$(grep -n Step log.lammps | awk -F ':' '{print $1}')"
en="$(grep -n Loop log.lammps | awk -F ':' '{print $1}')"
in="$(echo "$in+1" | bc -l)"

View File

@ -0,0 +1,36 @@
This directory has two input scripts that illustrates how to use fix
charge_regulation in LAMMPS to perform coarse-grained molecular dynamics
(MD) simulations with incorporation of charge regulation effects. The
charge regulation is implemented via Monte Carlo (MC) sampling following
the reaction ensemble MC approach, producing a MC/MD hybrid tool for
modeling charge regulation in solvated systems.
The script `in.chreg-acid` sets up a simple weak acid electrolyte
(pH=7,pKa=6,pI=3). Four different types of MC moves are implemented:
acid protonation & de-protonation, and monovalent ion pair insertion and
deletion. Note here we have grouped all free monovalent ions into a
single type, a physically natural choice on the level of coarse-grained
primitive electrolyte models, which increases the calculation
performance but has no effects on thermodynamic observables. The
variables such as pH, pKa, pI, and lb at the top of the input script can
be adjusted to play with various simulation parameters. The cumulative
MC attempted moves and cumulative number of accepted moves, as well as,
current number of neutral and charged acid particles, neutral and
charged base particles (in this example always 0), and the current
number of free cations and anions in the system are printed in the
output.
The script `in.chreg-polymer` sets up a weak poly-electrolyte chain of
N=80 beads. Each bead is a weak acid with pKa=5 and solution has pH=7
and monovalent salt chemical potential pI=3. In this example, we choose
to treat salt ions, protons, and hydroxyl ions separately, which results
in 5 types of MC moves: acid [type 1] protonation & de-protonation (with
protons [type 4] insertion & deletion), acid [type 1] protonation &
de-protonation (with salt cation [type 2] insertion & deletion), water
self-ionization (insertion and deletion of proton [type4] and hydroxyl
ion [type 5] pair), insertion and deletion of monovalent salt pair [type
2 and type 3] , insertion and deletion of a proton [type4] and salt
anion [type 3]. The current number of neutral and charged acid
particles, the current number of free salt cations and anions, and the
current number of protons and hydroxyl ions are printed in the output.

View File

@ -0,0 +1,235 @@
LAMMPS data file generated by get_input.py
219 atoms
3 atom types
-2.5000000000000000e+01 2.5000000000000000e+01 xlo xhi
-2.5000000000000000e+01 2.5000000000000000e+01 ylo yhi
-2.5000000000000000e+01 2.5000000000000000e+01 zlo zhi
Masses
1 1
2 1
3 1
Atoms
1 1 0 2.5983275747497636 -8.368052973860795 20.001288664343484
2 1 -1 -18.182868728594865 -8.079792367885453 8.253737231981816
3 1 -1 -17.437350808966414 8.120411567445771 10.747650340639332
4 1 -1 6.502476583291578 -23.497326620756837 19.948223080086798
5 1 -1 -22.528179279677296 -18.783433570718127 -17.964657736688018
6 1 -1 -9.713496019164342 18.97235576760402 -19.495620818582825
7 1 -1 -12.831976006720659 0.12265736526942561 -21.679396938423718
8 1 -1 20.909063679212295 -2.16535062758771 0.46197866620165584
9 1 -1 23.86211981166997 24.024928465132284 10.534067202515907
10 1 -1 -0.5289298325031275 23.820222457999776 -2.657199543669442
11 1 -1 9.57021229491361 11.973871502198485 3.4206509716759186
12 1 -1 -10.201559985782705 7.557482594092384 12.07004973873643
13 1 -1 4.898458045226889 2.0169997859717945 -20.765285372762087
14 1 -1 -24.086606883730077 4.424991619615298 -4.204294764756856
15 1 -1 3.6837161829600795 -4.763233144818308 -12.75873457519811
16 1 -1 -12.217842496816345 -17.720229208905618 -13.556354139556914
17 1 -1 -21.456229140133704 -7.423996317612119 -6.94398044071275
18 1 -1 13.697298849253912 8.503639732052164 8.085487457359058
19 1 -1 -5.764222710061347 11.49890485049034 -5.1113880296575935
20 1 -1 3.9944161041544426 16.928204188257893 -14.875635895409372
21 1 -1 4.509525276444776 16.63590711792657 -22.21846494992397
22 1 -1 22.115374932704306 -18.97293932558108 -23.982486000144267
23 1 -1 14.169061011408473 -16.69837647199978 13.779039228068108
24 1 -1 17.186846147657228 8.827459489898189 23.055435051390333
25 1 -1 2.9822901981431045 -16.83687718528342 -21.278623587083484
26 1 -1 16.657554689423897 -1.6217275605348647 -11.315859420404218
27 1 -1 19.215533149393543 -15.512634977936068 7.2701088767584565
28 1 -1 -8.886744157248422 -24.09644410100167 4.013016013803799
29 1 -1 20.99918340066754 4.4716257356730225 0.3847245765737597
30 1 -1 1.3442294253060716 5.601341425720583 -14.918594492786674
31 1 -1 -6.962977050326831 20.470183675946515 -16.37885865567279
32 1 -1 -9.98531733187143 9.52233798117566 -24.979630708193724
33 1 -1 -17.327989778292306 5.761352103841766 5.720220488689204
34 1 -1 5.168359673466362 -23.698812306679418 2.6199762372169744
35 1 -1 18.978042448492154 6.41188742965139 6.31975357155018
36 1 -1 -16.38534911663758 -14.8262205163943 4.125239045887575
37 1 -1 7.974455406459249 -18.88332583451115 11.00721254217055
38 1 -1 13.779816416416402 1.8581999350851426 9.104219696003227
39 1 -1 -23.90949397031401 -3.346877828308571 -10.228782973473443
40 1 -1 21.61647622174447 8.443955423089903 -19.12066464239769
41 1 -1 -8.823979405515548 14.461154001848172 16.061704411241706
42 1 -1 -2.4406878944912513 12.5535360118296 20.606764200087852
43 1 -1 -18.459404356124697 15.260951448001258 21.187332685021346
44 1 -1 2.2354003384439878 -23.350013178190736 11.369307324043625
45 1 -1 15.595889705552018 -6.6075680254604805 5.434256329408505
46 1 -1 -17.528243443870238 4.109747707896265 -1.4167331089310942
47 1 -1 2.161977144405782 -16.511059804921263 -12.186191310598671
48 1 -1 -8.685671837367341 -7.0743613044263185 -1.1561844713769105
49 1 -1 15.62258718398045 -6.559293763708908 20.556775995508488
50 1 -1 -6.965207014475155 -14.348784897390543 -14.421447863144754
51 1 -1 -12.099361509567913 -24.62785640990423 -15.839126670614329
52 1 -1 6.673854222058246 7.83575773885061 -9.714128155619994
53 1 -1 -17.413453800948826 12.386754276446203 -16.882300786608994
54 1 -1 21.8966589175091 12.485943283688762 -14.553421680298634
55 1 -1 -8.37629917390651 -24.783875012947064 7.454467809536389
56 1 -1 14.081149297694104 -21.719204113108943 -17.447225564400064
57 1 -1 4.681992702049627 1.9719544892622558 -7.823736613205725
58 1 -1 4.353171917533494 15.86928389762705 24.669680272563014
59 1 -1 23.31502072066573 -4.685724298328946 2.459643890128799
60 1 -1 7.0470920520598455 23.016693234922386 -13.139471333592677
61 1 -1 11.725555941181668 -15.809323171320772 -1.6292879532275037
62 1 -1 -20.36388898925061 -12.084932320023162 -22.816700826388757
63 1 -1 -2.492146614764735 -0.7314052253623018 -15.89959178250266
64 1 -1 -22.45303825831233 -11.27996814407809 -9.553770912146142
65 1 -1 24.76771926037101 20.128947543233757 10.528974830883733
66 1 -1 11.326213670190818 -11.624187194192492 -9.687726413467862
67 1 -1 -5.712764220166093 15.778887306376163 -0.9263244618113831
68 1 -1 -15.073201136996362 -12.372916148178115 -5.461704510273556
69 1 -1 -5.82976670348781 -4.57812040989473 9.0443548565365
70 1 -1 -5.429195387856279 1.4542054472230177 -7.397291151203568
71 1 -1 -23.385555726942343 -11.924588975396505 3.8215294321466153
72 1 -1 -1.0694104826815725 2.999945633116507 3.67092922106918
73 1 -1 12.134312161994352 1.9747455475585376 -14.895893366599623
74 1 -1 21.30950120583112 18.97294626436546 -17.520867878211376
75 1 -1 -24.356703356157063 3.594879254976714 17.172993705171677
76 1 -1 12.634233603338409 24.373499564220822 4.561976273909789
77 1 -1 -10.740243207970495 19.345205140729554 -3.3368424800818097
78 1 -1 -3.027848793907552 10.604939843027267 7.493012332728249
79 1 -1 5.000539296336658 11.770088203844622 17.227492055930185
80 1 -1 1.1585200269400353 -24.45822157176123 -12.515688997756257
81 1 -1 1.9163088584430596 -14.064330279670672 11.302445490552905
82 1 -1 -20.857041355570576 21.292791787236673 17.397470691573346
83 1 -1 -24.50473305235651 -12.741459355708756 -1.9325218065560357
84 1 -1 2.658628688373309 -1.1131226252194608 7.491603553398086
85 1 -1 -18.515435126408363 24.20642384141299 14.466889392835121
86 1 -1 19.63928177206153 9.942655640416291 8.691463646789934
87 1 -1 -7.69626451160762 11.762517043363786 -7.457263991495665
88 1 -1 1.051431093064835 -11.460307039827766 16.90304637479744
89 1 -1 0.9157815447227939 23.656751182559688 -6.538587603918376
90 1 -1 23.330169435555234 -7.293893221439802 -10.739388379883973
91 1 -1 1.3454906653067376 0.3584300740797559 8.837879234629618
92 1 -1 -21.93056639286312 -10.890279576013356 -10.412914392053596
93 1 -1 21.9136101677979 -10.780221720642636 11.543925933359859
94 1 -1 1.213289938136601 -7.171863230861625 20.734527885288102
95 1 -1 23.102370131877777 21.949933206350458 0.29281565885028016
96 1 -1 -18.917780884063298 -0.03244735062602544 23.633906995676227
97 1 -1 7.583004866601307 10.74178675512821 -4.857297835527785
98 1 -1 -7.4910066746799835 -14.168364618485734 -6.426540836249767
99 1 -1 -20.672200987670426 -8.746789722660697 11.011389790610103
100 1 -1 -18.662115132221917 -21.356740361991612 -8.735991534410413
101 2 1 11.900973676882046 6.591531431964558 19.018193594877637
102 2 1 -23.433591822114983 -18.956429005519567 4.8373984358422994
103 2 1 -11.825475204099472 -3.8206287568445134 3.1167558949026173
104 2 1 -17.49780467176259 -23.115560141825554 9.614132296727426
105 2 1 10.88916113281772 4.512200980010334 18.685489050240854
106 2 1 -22.04662313800728 23.973268925992897 -23.417792740205652
107 2 1 -13.57041123540546 17.3687874050987 21.186270978357783
108 2 1 6.586851196789095 16.27860887432974 -3.638909639278946
109 2 1 8.191448685630277 6.828880619305412 -6.347576950950089
110 2 1 -15.723292856220288 -20.484673256634117 -15.14713811293425
111 2 1 18.58081219522701 19.060706710849452 -10.295676869062909
112 2 1 -21.09194001526127 -7.739334786748358 5.417635948058724
113 2 1 -14.10404878784055 -15.769737592448523 -18.881834262561505
114 2 1 -14.644589058195612 8.84169065013063 8.611654925486256
115 2 1 -11.719050253933538 -4.9700119000832 -0.9846728956163453
116 2 1 19.498247505274143 -10.418045613133986 -22.12098182226518
117 2 1 21.857683401772697 20.157098661061575 -13.652393197742995
118 2 1 -17.623414455798407 21.873813778550875 -6.533965802006303
119 2 1 7.231785003326529 -13.925962842972222 5.360080190636602
120 2 1 -7.509430039873415 19.13541714591672 -16.23545960168472
121 2 1 -4.048249209544995 13.126195473202351 -7.156541250053138
122 2 1 -20.26837137264583 21.46366988603839 15.603080527043964
123 2 1 -4.478253524569759 -3.1812369811955783 -18.52918159641348
124 2 1 21.541019047040052 13.514999235394065 -1.8086547561089752
125 2 1 -15.223319907923727 -5.958117989814905 -7.194967640819577
126 2 1 -20.87181173003304 -7.66780336209651 20.518235718821714
127 2 1 -3.7444846073700297 21.014628245718292 7.197818215477007
128 2 1 -5.904222844268787 7.656315546673127 -1.3911802017487425
129 2 1 -21.49072414090769 -23.123923448235523 10.49453669763092
130 2 1 24.90628307456096 7.081046671281136 -14.422530828641655
131 2 1 -12.173002002514222 -23.250366655717176 -5.145802772598103
132 2 1 -19.68809858318764 4.476541650697328 6.249229323733747
133 2 1 16.85550827580734 -0.8462194407221624 18.011901711631936
134 2 1 17.289399533444858 -11.99379336569853 11.875868193611936
135 2 1 19.532020913911126 -23.053375288330326 -4.9162076250112605
136 2 1 -12.432304028989998 5.029488375070969 7.535325299264009
137 2 1 14.934807008644 8.086694342170496 19.68691014849572
138 2 1 -7.088283921093918 -23.094109864922018 16.57088328184242
139 2 1 14.77413976080318 21.343550134324772 13.996489344579572
140 2 1 -14.606423208703657 -6.928316926567433 -22.717483260149475
141 2 1 -17.139771555632173 14.533410346451518 -21.83064865887975
142 2 1 4.261830086466784 15.518968841247663 -17.791505649414617
143 2 1 -9.814793042774223 -5.120956154726329 14.054454130549104
144 2 1 8.313311590434793 3.9666876022475606 -20.677101093823236
145 2 1 10.603190079756637 -2.62347089527481 1.6661989541795634
146 2 1 -17.763718339721695 1.2541370478041287 -21.55649971308305
147 2 1 -8.538066365356812 14.81814356892842 -4.478673557614034
148 2 1 -5.809558827384787 14.611789154829552 13.287687188309562
149 2 1 8.986830839040898 -17.43898584267833 -18.08640526127862
150 2 1 -13.315275244526854 8.890431200255954 -8.708179477452443
151 2 1 -0.5407152591412618 -23.67970550599055 -24.1586910560046
152 2 1 -19.79961109336906 -16.10906604558887 -5.879899717095562
153 2 1 -23.626316306846658 9.337407355717588 -9.640842288307239
154 2 1 -18.847256196659333 -16.303517291166603 -10.786416046984721
155 2 1 13.567770091716845 -24.4927974402177 8.896906985984664
156 2 1 13.652894892068794 -24.87567116574863 21.89026113439551
157 2 1 -8.575912713332162 9.92386172372207 5.029537530028822
158 2 1 20.69339436974964 1.129252448454178 0.3584458063532807
159 2 1 -0.9971941518705947 18.317397852358788 6.795424830570379
160 2 1 23.155704681402298 15.458725773368961 17.01599672991628
161 2 1 22.278634187244123 14.642946508468171 20.543957651530896
162 2 1 9.771629496835963 -21.696904301438853 -5.259678202922196
163 2 1 5.253009955872763 17.911287158418148 15.769047957152992
164 2 1 -20.759038961257414 5.59089552770853 -12.383953925685166
165 2 1 3.2163819108147145 -4.948608591009169 -17.85036103684716
166 2 1 20.637631925250837 9.109955226257064 6.177181979863878
167 2 1 5.306344093540837 12.647347581939556 23.229957406774105
168 2 1 -24.15187998806597 17.263903348029615 -17.141028077545826
169 2 1 -15.705280442832997 -15.655358704303895 -10.488762557871972
170 2 1 -6.601131108664461 -22.50322976595015 -5.672942609306119
171 2 1 22.869179482568555 13.369592422303498 -9.378437532422556
172 2 1 -23.151055417980903 -3.928919101213168 -11.117061489640207
173 2 1 1.3592343286386246 -18.552063924235036 -15.346172149331993
174 2 1 10.23567488314778 -18.14207926130103 -1.6884247085891886
175 2 1 12.595888032974493 -1.7416169207452157 -21.786811832485718
176 2 1 -0.14792438162408672 17.11748549051584 1.2788726677139053
177 2 1 24.349235298880274 -8.664350854740949 12.4309854455257
178 2 1 -18.827147816604253 -18.80258748867273 -1.6980553939283212
179 2 1 -9.048793002383698 -1.788614428205263 -11.841289777017172
180 2 1 -22.49667217853208 -22.112076711777533 10.01393503943838
181 2 1 -16.183333848138453 1.3098533508906556 0.8096413611556166
182 2 1 -4.007575369376703 -24.447854073342157 -19.683971619997376
183 2 1 8.79123015290173 -15.890906503248287 -23.45721570121758
184 2 1 -8.557898021171628 -21.985380426316674 22.626382729361595
185 2 1 7.143974673263372 16.57516065778192 0.5907315164854055
186 2 1 7.05280226857041 6.658154377550723 17.993436860997946
187 2 1 20.98391844656716 -3.7711929542825544 -22.37222924252256
188 2 1 -8.856382807041598 -16.421301042649826 -7.682473719905396
189 2 1 -14.381919492441797 -7.667674808763277 -10.178028203828621
190 2 1 -22.93472549116592 10.072854607637751 3.756868463885592
191 2 1 9.458987867260412 17.23200182595278 -0.03503381482496337
192 2 1 11.013603635791974 19.842184408029837 -5.83598462187852
193 2 1 23.28897987479008 2.835578651649044 -20.512845011389647
194 2 1 -18.86161127148128 8.956542530565656 14.193388541103026
195 2 1 13.688477473034126 -15.973205475346514 10.952445409682397
196 2 1 2.1058159557459497 2.740725960214597 -23.72037436968614
197 2 1 20.982351847235442 7.072739454450108 -24.07322254392252
198 2 1 5.962360707177609 -19.424513569281604 22.469955103109243
199 2 1 -17.13607356062674 20.038457022813326 12.94227215395123
200 2 1 11.592617137491743 22.283887092702138 2.339699650677858
201 2 1 -1.3864952037065237 19.199632510575505 -7.684210221911414
202 2 1 -22.44476570586083 -19.66385674506424 -8.981660607669522
203 2 1 0.36547911522815824 -7.628556098996082 16.326944822668068
204 2 1 -9.766164330974753 24.38435844399602 -14.352553497163
205 2 1 -0.6310792726759544 -5.625399375968325 13.665993163571486
206 2 1 2.6795300975636103 -0.37097710463575595 15.575183407667495
207 2 1 10.68508361399715 24.638181487800373 -17.538711281692827
208 2 1 18.30809729940504 18.39121662193474 18.285926328751984
209 2 1 -11.52561870836783 -11.871004571782223 12.890674390475048
210 3 -1 16.038097437687007 -0.8308290507120688 9.140710202344948
211 3 -1 -12.071581865552927 23.77532123232212 -6.250109721970887
212 3 -1 24.179073767023887 19.6390206210449 22.20321951706368
213 3 -1 22.899159789805424 8.918385700451317 -1.1269016129923664
214 3 -1 -10.48576153865241 5.691510884812594 21.955276995406933
215 3 -1 6.272776670877239 10.035821052072265 22.22030412319301
216 3 -1 14.689947575936934 -7.785907120217196 0.5033983092114553
217 3 -1 23.173937996535116 -21.041572031861037 -21.057283440516468
218 3 -1 -6.015120142466472 6.3962924962024985 21.58241945230285
219 3 -1 -0.77667042466472 0.3962848125024985 1.582473830285

View File

@ -0,0 +1,235 @@
LAMMPS data file generated by get_input.py
219 atoms
3 atom types
-180 180 xlo xhi
-180 180 ylo yhi
-180 180 zlo zhi
Masses
1 20
2 20
3 20
Atoms
1 1 0 18.70795854 -60.24998141 144.0092784
2 1 -1 -130.9166548 -58.17450505 59.42690807
3 1 -1 -125.5489258 58.46696329 77.38308245
4 1 -1 46.8178314 -169.1807517 143.6272062
5 1 -1 -162.2028908 -135.2407217 -129.3455357
6 1 -1 -69.93717134 136.6009615 -140.3684699
7 1 -1 -92.39022725 0.88313303 -156.091658
8 1 -1 150.5452585 -15.59052452 3.326246397
9 1 -1 171.8072626 172.9794849 75.84528386
10 1 -1 -3.808294794 171.5056017 -19.13183671
11 1 -1 68.90552852 86.21187482 24.628687
12 1 -1 -73.4512319 54.41387468 86.90435812
13 1 -1 35.26889793 14.52239846 -149.5100547
14 1 -1 -173.4235696 31.85993966 -30.27092231
15 1 -1 26.52275652 -34.29527864 -91.86288894
16 1 -1 -87.96846598 -127.5856503 -97.6057498
17 1 -1 -154.4848498 -53.45277349 -49.99665917
18 1 -1 98.62055171 61.22620607 58.21550969
19 1 -1 -41.50240351 82.79211492 -36.80199381
20 1 -1 28.75979595 121.8830702 -107.1045784
21 1 -1 32.46858199 119.7785312 -159.9729476
22 1 -1 159.2306995 -136.6051631 -172.6738992
23 1 -1 102.0172393 -120.2283106 99.20908244
24 1 -1 123.7452923 63.55770833 165.9991324
25 1 -1 21.47248943 -121.2255157 -153.2060898
26 1 -1 119.9343938 -11.67643844 -81.47418783
27 1 -1 138.3518387 -111.6909718 52.34478391
28 1 -1 -63.98455793 -173.4943975 28.8937153
29 1 -1 151.1941205 32.1957053 2.770016951
30 1 -1 9.678451862 40.32965827 -107.4138803
31 1 -1 -50.13343476 147.3853225 -117.9277823
32 1 -1 -71.89428479 68.56083346 -179.8533411
33 1 -1 -124.7615264 41.48173515 41.18558752
34 1 -1 37.21218965 -170.6314486 18.86382891
35 1 -1 136.6419056 46.16558949 45.50222572
36 1 -1 -117.9745136 -106.7487877 29.70172113
37 1 -1 57.41607893 -135.959946 79.2519303
38 1 -1 99.2146782 13.37903953 65.55038181
39 1 -1 -172.1483566 -24.09752036 -73.64723741
40 1 -1 155.6386288 60.79647905 -137.6687854
41 1 -1 -63.53265172 104.1203088 115.6442718
42 1 -1 -17.57295284 90.38545929 148.3687022
43 1 -1 -132.9077114 109.8788504 152.5487953
44 1 -1 16.09488244 -168.1200949 81.85901273
45 1 -1 112.2904059 -47.57448978 39.12664557
46 1 -1 -126.2033528 29.5901835 -10.20047838
47 1 -1 15.56623544 -118.8796306 -87.74057744
48 1 -1 -62.53683723 -50.93540139 -8.324528194
49 1 -1 112.4826277 -47.2269151 148.0087872
50 1 -1 -50.1494905 -103.3112513 -103.8344246
51 1 -1 -87.11540287 -177.3205662 -114.041712
52 1 -1 48.0517504 56.41745572 -69.94172272
53 1 -1 -125.3768674 89.18463079 -121.5525657
54 1 -1 157.6559442 89.89879164 -104.7846361
55 1 -1 -60.30935405 -178.4439001 53.67216823
56 1 -1 101.3842749 -156.3782696 -125.6200241
57 1 -1 33.71034745 14.19807232 -56.33090362
58 1 -1 31.34283781 114.2588441 177.621698
59 1 -1 167.8681492 -33.73721495 17.70943601
60 1 -1 50.73906277 165.7201913 -94.6041936
61 1 -1 84.42400278 -113.8271268 -11.73087326
62 1 -1 -146.6200007 -87.0115127 -164.2802459
63 1 -1 -17.94345563 -5.266117623 -114.4770608
64 1 -1 -161.6618755 -81.21577064 -68.78715057
65 1 -1 178.3275787 144.9284223 75.80861878
66 1 -1 81.54873843 -83.6941478 -69.75163018
67 1 -1 -41.13190239 113.6079886 -6.669536125
68 1 -1 -108.5270482 -89.08499627 -39.32427247
69 1 -1 -41.97432027 -32.96246695 65.11935497
70 1 -1 -39.09020679 10.47027922 -53.26049629
71 1 -1 -168.3760012 -85.85704062 27.51501191
72 1 -1 -7.699755475 21.59960856 26.43069039
73 1 -1 87.36704757 14.21816794 -107.2504322
74 1 -1 153.4284087 136.6052131 -126.1502487
75 1 -1 -175.3682642 25.88313064 123.6455547
76 1 -1 90.96648194 175.4891969 32.84622917
77 1 -1 -77.3297511 139.285477 -24.02526586
78 1 -1 -21.80051132 76.35556687 53.9496888
79 1 -1 36.00388293 84.74463507 124.0379428
80 1 -1 8.341344194 -176.0991953 -90.11296078
81 1 -1 13.79742378 -101.263178 81.37760753
82 1 -1 -150.1706978 153.3081009 125.261789
83 1 -1 -176.434078 -91.73850736 -13.91415701
84 1 -1 19.14212656 -8.014482902 53.93954558
85 1 -1 -133.3111329 174.2862517 104.1616036
86 1 -1 141.4028288 71.58712061 62.57853826
87 1 -1 -55.41310448 84.69012271 -53.69230074
88 1 -1 7.57030387 -82.51421069 121.7019339
89 1 -1 6.593627122 170.3286085 -47.07783075
90 1 -1 167.9772199 -52.51603119 -77.32359634
91 1 -1 9.68753279 2.580696533 63.63273049
92 1 -1 -157.900078 -78.41001295 -74.97298362
93 1 -1 157.7779932 -77.61759639 83.11626672
94 1 -1 8.735687555 -51.63741526 149.2886008
95 1 -1 166.3370649 158.0395191 2.108272744
96 1 -1 -136.2080224 -0.233620925 170.1641304
97 1 -1 54.59763504 77.34086464 -34.97254442
98 1 -1 -53.93524806 -102.0122253 -46.27109402
99 1 -1 -148.8398471 -62.976886 79.28200649
100 1 -1 -134.367229 -153.7685306 -62.89913905
101 2 1 85.68701047 47.45902631 136.9309939
102 2 1 -168.7218611 -136.4862888 34.82926874
103 2 1 -85.14342147 -27.50852705 22.44064244
104 2 1 -125.9841936 -166.432033 69.22175254
105 2 1 78.40196016 32.48784706 134.5355212
106 2 1 -158.7356866 172.6075363 -168.6081077
107 2 1 -97.70696089 125.0552693 152.541151
108 2 1 47.42532862 117.2059839 -26.2001494
109 2 1 58.97843054 49.16794046 -45.70255405
110 2 1 -113.2077086 -147.4896474 -109.0593944
111 2 1 133.7818478 137.2370883 -74.12887346
112 2 1 -151.8619681 -55.72321046 39.00697883
113 2 1 -101.5491513 -113.5421107 -135.9492067
114 2 1 -105.4410412 63.66017268 62.00391546
115 2 1 -84.37716183 -35.78408568 -7.089644848
116 2 1 140.387382 -75.00992841 -159.2710691
117 2 1 157.3753205 145.1311104 -98.29723102
118 2 1 -126.8885841 157.4914592 -47.04455377
119 2 1 52.06885202 -100.2669325 38.59257737
120 2 1 -54.06789629 137.7750035 -116.8953091
121 2 1 -29.14739431 94.50860741 -51.527097
122 2 1 -145.9322739 154.5384232 112.3421798
123 2 1 -32.24342538 -22.90490626 -133.4101075
124 2 1 155.0953371 97.30799449 -13.02231424
125 2 1 -109.6079033 -42.89844953 -51.80376701
126 2 1 -150.2770445 -55.20818421 147.7312972
127 2 1 -26.96028917 151.3053234 51.82429115
128 2 1 -42.51040448 55.12547194 -10.01649745
129 2 1 -154.7332138 -166.4922488 75.56066422
130 2 1 179.3252381 50.98353603 -103.842222
131 2 1 -87.64561442 -167.4026399 -37.04977996
132 2 1 -141.7543098 32.23109989 44.99445113
133 2 1 121.3596596 -6.092779973 129.6856923
134 2 1 124.4836766 -86.35531223 85.50625099
135 2 1 140.6305506 -165.9843021 -35.3966949
136 2 1 -89.51258901 36.2123163 54.25434215
137 2 1 107.5306105 58.22419926 141.7457531
138 2 1 -51.03564423 -166.277591 119.3103596
139 2 1 106.3738063 153.673561 100.7747233
140 2 1 -105.1662471 -49.88388187 -163.5658795
141 2 1 -123.4063552 104.6405545 -157.1806703
142 2 1 30.68517662 111.7365757 -128.0988407
143 2 1 -70.66650991 -36.87088431 101.1920697
144 2 1 59.85584345 28.56015074 -148.8751279
145 2 1 76.34296857 -18.88899045 11.99663247
146 2 1 -127.898772 9.029786744 -155.2067979
147 2 1 -61.47407783 106.6906337 -32.24644961
148 2 1 -41.82882356 105.2048819 95.67134776
149 2 1 64.70518204 -125.5606981 -130.2221179
150 2 1 -95.86998176 64.01110464 -62.69889224
151 2 1 -3.893149866 -170.4938796 -173.9425756
152 2 1 -142.5571999 -115.9852755 -42.33527796
153 2 1 -170.1094774 67.22933296 -69.41406448
154 2 1 -135.7002446 -117.3853245 -77.66219554
155 2 1 97.68794466 -176.3481416 64.0577303
156 2 1 98.30084322 -179.1048324 157.6098802
157 2 1 -61.74657154 71.45180441 36.21267022
158 2 1 148.9924395 8.130617629 2.580809806
159 2 1 -7.179797893 131.8852645 48.92705878
160 2 1 166.7210737 111.3028256 122.5151765
161 2 1 160.4061661 105.4292149 147.9164951
162 2 1 70.35573238 -156.217711 -37.86968306
163 2 1 37.82167168 128.9612675 113.5371453
164 2 1 -149.4650805 40.2544478 -89.16446826
165 2 1 23.15794976 -35.62998186 -128.5225995
166 2 1 148.5909499 65.59167763 44.47571026
167 2 1 38.20567747 91.06090259 167.2556933
168 2 1 -173.8935359 124.3001041 -123.4154022
169 2 1 -113.0780192 -112.7185827 -75.51909042
170 2 1 -47.52814398 -162.0232543 -40.84518679
171 2 1 164.6580923 96.26106544 -67.52475023
172 2 1 -166.687599 -28.28821753 -80.04284273
173 2 1 9.786487166 -133.5748603 -110.4924395
174 2 1 73.69685916 -130.6229707 -12.1566579
175 2 1 90.69039384 -12.53964183 -156.8650452
176 2 1 -1.065055548 123.2458955 9.207883208
177 2 1 175.3144942 -62.38332615 89.50309521
178 2 1 -135.5554643 -135.3786299 -12.22599884
179 2 1 -65.15130962 -12.87802388 -85.25728639
180 2 1 -161.9760397 -159.2069523 72.10033228
181 2 1 -116.5200037 9.430944126 5.8294178
182 2 1 -28.85454266 -176.0245493 -141.7245957
183 2 1 63.2968571 -114.4145268 -168.891953
184 2 1 -61.61686575 -158.2947391 162.9099557
185 2 1 51.43661765 119.3411567 4.253266919
186 2 1 50.78017633 47.93871152 129.5527454
187 2 1 151.0842128 -27.15258927 -161.0800505
188 2 1 -63.76595621 -118.2333675 -55.31381078
189 2 1 -103.5498203 -55.20725862 -73.28180307
190 2 1 -165.1300235 72.52455317 27.04945294
191 2 1 68.10471264 124.0704131 -0.252243467
192 2 1 79.29794618 142.8637277 -42.01908928
193 2 1 167.6806551 20.41616629 -147.6924841
194 2 1 -135.8036012 64.48710622 102.1923975
195 2 1 98.55703781 -115.0070794 78.85760695
196 2 1 15.16187488 19.73322691 -170.7866955
197 2 1 151.0729333 50.92372407 -173.3272023
198 2 1 42.92899709 -139.8564977 161.7836767
199 2 1 -123.3797296 144.2768906 93.18435951
200 2 1 83.46684339 160.4439871 16.84583748
201 2 1 -9.982765467 138.2373541 -55.3263136
202 2 1 -161.6023131 -141.5797686 -64.66795638
203 2 1 2.63144963 -54.92560391 117.5540027
204 2 1 -70.31638318 175.5673808 -103.3383852
205 2 1 -4.543770763 -40.50287551 98.39515078
206 2 1 19.2926167 -2.671035153 112.1413205
207 2 1 76.93260202 177.3949067 -126.2787212
208 2 1 131.8183006 132.4167597 131.6586696
209 2 1 -82.9844547 -85.47123292 92.81285561
210 3 -1 115.4743016 -5.981969165 65.81311346
211 3 -1 -86.91538943 171.1823129 -45.00079
212 3 -1 174.0893311 141.4009485 159.8631805
213 3 -1 164.8739505 64.21237704 -8.113691614
214 3 -1 -75.49748308 40.97887837 158.0779944
215 3 -1 45.16399203 72.25791157 159.9861897
216 3 -1 105.7676225 -56.05853127 3.624467826
217 3 -1 166.8523536 -151.4993186 -151.6124408
218 3 -1 -43.30886503 46.05330597 155.3934201
219 3 -1 -5.592027058 2.85325065 11.39381158

View File

@ -0,0 +1,264 @@
##A Weak PE Chain of N=80
160 atoms
79 bonds
5 atom types
1 bond types
-50 50 xlo xhi
-50 50 ylo yhi
-50 50 zlo zhi
Masses
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
Atoms
# atom_id molecule_id atom_type charge x y z
1 1 1 -1 0 0 -48.37753795169063
2 1 1 -1 0 0 -47.255075903381254
3 1 1 -1 0 0 -46.13261385507188
4 1 1 -1 0 0 -45.01015180676251
5 1 1 -1 0 0 -43.887689758453135
6 1 1 -1 0 0 -42.76522771014376
7 1 1 -1 0 0 -41.64276566183439
8 1 1 -1 0 0 -40.520303613525016
9 1 1 -1 0 0 -39.39784156521564
10 1 1 -1 0 0 -38.27537951690627
11 1 1 -1 0 0 -37.1529174685969
12 1 1 -1 0 0 -36.030455420287524
13 1 1 -1 0 0 -34.90799337197815
14 1 1 -1 0 0 -33.78553132366878
15 1 1 -1 0 0 -32.663069275359405
16 1 1 -1 0 0 -31.54060722705003
17 1 1 -1 0 0 -30.41814517874066
18 1 1 -1 0 0 -29.295683130431286
19 1 1 -1 0 0 -28.173221082121913
20 1 1 -1 0 0 -27.05075903381254
21 1 1 -1 0 0 -25.928296985503167
22 1 1 -1 0 0 -24.805834937193794
23 1 1 -1 0 0 -23.68337288888442
24 1 1 -1 0 0 -22.560910840575048
25 1 1 -1 0 0 -21.438448792265675
26 1 1 -1 0 0 -20.3159867439563
27 1 1 -1 0 0 -19.19352469564693
28 1 1 -1 0 0 -18.071062647337556
29 1 1 -1 0 0 -16.948600599028183
30 1 1 -1 0 0 -15.82613855071881
31 1 1 -1 0 0 -14.703676502409436
32 1 1 -1 0 0 -13.581214454100063
33 1 1 -1 0 0 -12.45875240579069
34 1 1 -1 0 0 -11.336290357481317
35 1 1 -1 0 0 -10.213828309171944
36 1 1 -1 0 0 -9.091366260862571
37 1 1 -1 0 0 -7.968904212553198
38 1 1 -1 0 0 -6.846442164243825
39 1 1 -1 0 0 -5.723980115934452
40 1 1 -1 0 0 -4.601518067625079
41 1 1 -1 0 0 -3.4790560193157063
42 1 1 -1 0 0 -2.3565939710063333
43 1 1 -1 0 0 -1.2341319226969603
44 1 1 -1 0 0 -0.11166987438758724
45 1 1 -1 0 0 1.0107921739217858
46 1 1 -1 0 0 2.133254222231159
47 1 1 -1 0 0 3.255716270540532
48 1 1 -1 0 0 4.378178318849905
49 1 1 -1 0 0 5.500640367159278
50 1 1 -1 0 0 6.623102415468651
51 1 1 -1 0 0 7.745564463778024
52 1 1 -1 0 0 8.868026512087397
53 1 1 -1 0 0 9.99048856039677
54 1 1 -1 0 0 11.112950608706143
55 1 1 -1 0 0 12.235412657015516
56 1 1 -1 0 0 13.357874705324889
57 1 1 -1 0 0 14.480336753634262
58 1 1 -1 0 0 15.602798801943635
59 1 1 -1 0 0 16.725260850253008
60 1 1 -1 0 0 17.84772289856238
61 1 1 -1 0 0 18.970184946871754
62 1 1 -1 0 0 20.092646995181127
63 1 1 -1 0 0 21.2151090434905
64 1 1 -1 0 0 22.337571091799873
65 1 1 -1 0 0 23.460033140109246
66 1 1 -1 0 0 24.58249518841862
67 1 1 -1 0 0 25.704957236727992
68 1 1 -1 0 0 26.827419285037365
69 1 1 -1 0 0 27.949881333346738
70 1 1 -1 0 0 29.07234338165611
71 1 1 -1 0 0 30.194805429965484
72 1 1 -1 0 0 31.317267478274857
73 1 1 -1 0 0 32.43972952658423
74 1 1 -1 0 0 33.5621915748936
75 1 1 -1 0 0 34.684653623202976
76 1 1 -1 0 0 35.80711567151235
77 1 1 -1 0 0 36.92957771982172
78 1 1 -1 0 0 38.052039768131095
79 1 1 -1 0 0 39.17450181644047
80 1 1 -1 0 0 40.29696386474984
81 0 2 1 -27.886422274724097 27.72001798427955 38.68169635811057
82 0 2 1 29.812255760623188 17.871838747003693 -29.094648426460257
83 0 2 1 -13.23881351410531 13.28123966828678 -24.422176415560116
84 0 2 1 4.9465650593939685 -37.7521903558826 -15.115417767729575
85 0 2 1 34.82527943387106 29.457664434004897 -25.565595338061254
86 0 2 1 46.35660570786446 -7.161776614070412 -20.2471250527001
87 0 2 1 39.20854546781531 34.96815569014278 13.893531822586723
88 0 2 1 -7.797240698180197 0.07861219105048889 48.686453603015224
89 0 2 1 43.92391845355516 -39.42362941705827 22.448930565867585
90 0 2 1 -40.371744364329984 -17.743039071967246 -15.08153047835009
91 0 2 1 -21.573165497710058 -0.5844447399891948 -45.73596994149077
92 0 2 1 -19.882394451769102 -7.392447895357577 30.733607063808876
93 0 2 1 -17.393031309514107 26.882975097407467 -47.64059480000892
94 0 2 1 25.652222561671735 1.0229206994719107 -14.959030208952043
95 0 2 1 26.075045766879313 19.902341017250052 46.70284805469666
96 0 2 1 39.91980369168496 0.753749460187592 -26.203575929573407
97 0 2 1 13.777613371273958 7.112171629839359 -33.5270487721399
98 0 2 1 18.944534687271826 20.090215089875286 -34.381335468790574
99 0 2 1 -23.801856387842435 -42.275962146864586 -8.322936238250279
100 0 2 1 -31.386991395893826 29.83894468611787 8.937114269513422
101 0 2 1 -41.07090001085809 49.59339931450579 6.666864232174753
102 0 2 1 -46.58911504232167 -32.46068937927039 19.40424197066872
103 0 2 1 -39.94659416571965 -36.28203465180086 5.841020764632312
104 0 2 1 -26.027467090120137 -41.05522015175137 -1.1145958296128313
105 0 2 1 37.09602855959457 23.76087951027276 45.09142423198867
106 0 2 1 -27.78138413517528 -48.97344929918942 45.91491289356401
107 0 2 1 4.468912883622387 -5.217782298407556 6.381420595433383
108 0 2 1 36.758686966564525 48.425582881586166 -25.909273336802997
109 0 2 1 -27.045102667146036 -19.713951008254117 4.339232870380627
110 0 2 1 -5.984280016624311 -49.45311479123866 36.35727783065221
111 0 2 1 27.833389147163018 -47.80144978082761 -47.71458334276804
112 0 2 1 -23.628507668044364 -30.353876765128685 36.174277933133254
113 0 2 1 -40.93360714431151 40.1336490864843 -27.035347797435495
114 0 2 1 6.3523980881104976 -28.636485436097082 -10.671354350535445
115 0 2 1 42.765716958607086 -32.85779663523676 -1.9682360265562124
116 0 2 1 -33.68069757415453 16.800769050458484 -6.273374390373085
117 0 2 1 13.909148568042937 4.921040289518388 12.111069913598996
118 0 2 1 6.728324076730296 -48.44092815223126 -35.92436883370601
119 0 2 1 -18.121173967321912 -15.76903395165283 2.2495451015454933
120 0 2 1 -11.75253233489407 -45.82569982175387 -12.477142440015896
121 0 2 1 1.9713864197144133 17.961034900064007 32.97992150691711
122 0 2 1 -3.993384770632943 -47.63120435620297 27.75490859098018
123 0 2 1 -0.32208279553454844 -47.30616152402566 -22.751109302380367
124 0 2 1 -0.135777029397957 23.88599790464609 -31.87440560354473
125 0 2 1 -6.123924906817393 -2.038519565120424 45.4809181974626
126 0 2 1 -29.622588299895046 42.40404115712096 6.640479709229595
127 0 2 1 -11.694512971272673 19.983258641775762 -38.152427411711145
128 0 2 1 -20.93721440637313 39.46397829322392 -45.52708262202337
129 0 2 1 34.13340147809369 36.14268504987945 -23.978137043267044
130 0 2 1 -37.422309952611485 29.181841318883087 27.55677757161692
131 0 2 1 30.11314373799594 18.721794400471353 1.5553303682670574
132 0 2 1 -7.3563467211571805 46.84253369205935 -39.84708490437832
133 0 2 1 -3.695927445484358 2.494403998274727 -7.634369981832755
134 0 2 1 44.09701173592077 17.717328437831043 31.54108326477207
135 0 2 1 48.070189931616795 10.601166369398662 -28.28574863896286
136 0 2 1 -7.044858382811761 -42.080663380241766 -1.4369925734636553
137 0 2 1 -12.485032488076918 23.87106169116919 6.178803347562642
138 0 2 1 -15.613232443702309 10.103630885941392 -20.447182948810916
139 0 2 1 28.610332347774147 37.08335835592116 -19.90280831362493
140 0 2 1 25.853920233242505 -27.768648181803655 24.971357611943475
141 0 2 1 9.256159541363296 -23.562096053197934 -4.722701100419371
142 0 2 1 39.96929397877305 -11.88228547846326 -28.70638149104603
143 0 2 1 -37.98545134633291 -23.50528193202669 -10.939982626098441
144 0 2 1 25.40017763114089 -47.49220127581256 15.1783064865064
145 0 2 1 28.073596076651768 3.6631266774864386 31.54355751177208
146 0 2 1 -19.596457173068703 46.79824882013442 -12.302655772327597
147 0 2 1 -36.46192411958321 -2.785830672302666 -25.1901381125736
148 0 2 1 -27.377389198969894 11.295792272951147 39.32842550184691
149 0 2 1 32.24967019136358 -20.517755791016402 31.20590722085157
150 0 2 1 47.70698618147787 9.75462874031868 -28.267447889542563
151 0 2 1 17.157803106328345 -27.48141290657965 7.7670687016760525
152 0 2 1 15.089833959419678 5.342811012118396 27.35336620165029
153 0 2 1 9.836963929211372 -11.047378229392443 -20.960811370690678
154 0 2 1 44.66600586278604 14.949733274456321 -29.328965994323575
155 0 2 1 -21.006260382140685 8.492712712433658 -46.31580169190271
156 0 2 1 -29.970979487850748 -36.46250489415931 26.914372830947457
157 0 2 1 -1.0821372755756329 -8.453379951300242 -19.95665062432509
158 0 2 1 -24.033653425909772 -39.51330620205049 20.067656167683793
159 0 2 1 27.747287624384626 -21.904990435351312 -10.819345241055956
160 0 2 1 -40.86737066410612 -25.609300376714796 -21.128139356809783
Bonds
# bond_id bond_type atom1_id atom2_id
1 1 1 2
2 1 2 3
3 1 3 4
4 1 4 5
5 1 5 6
6 1 6 7
7 1 7 8
8 1 8 9
9 1 9 10
10 1 10 11
11 1 11 12
12 1 12 13
13 1 13 14
14 1 14 15
15 1 15 16
16 1 16 17
17 1 17 18
18 1 18 19
19 1 19 20
20 1 20 21
21 1 21 22
22 1 22 23
23 1 23 24
24 1 24 25
25 1 25 26
26 1 26 27
27 1 27 28
28 1 28 29
29 1 29 30
30 1 30 31
31 1 31 32
32 1 32 33
33 1 33 34
34 1 34 35
35 1 35 36
36 1 36 37
37 1 37 38
38 1 38 39
39 1 39 40
40 1 40 41
41 1 41 42
42 1 42 43
43 1 43 44
44 1 44 45
45 1 45 46
46 1 46 47
47 1 47 48
48 1 48 49
49 1 49 50
50 1 50 51
51 1 51 52
52 1 52 53
53 1 53 54
54 1 54 55
55 1 55 56
56 1 56 57
57 1 57 58
58 1 58 59
59 1 59 60
60 1 60 61
61 1 61 62
62 1 62 63
63 1 63 64
64 1 64 65
65 1 65 66
66 1 66 67
67 1 67 68
68 1 68 69
69 1 69 70
70 1 70 71
71 1 71 72
72 1 72 73
73 1 73 74
74 1 74 75
75 1 75 76
76 1 76 77
77 1 77 78
78 1 78 79
79 1 79 80

View File

@ -0,0 +1,36 @@
# Charge regulation lammps for simple weak electrolyte
units lj
atom_style charge
neighbor 3.0 bin
read_data data.chreg-acid
variable cut_long equal 12.5
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)
variable lunit_nm equal 0.72 # in the units of nm
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_coeff * * 1.0 1.0
kspace_style ewald 1.0e-3
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep 0.005
run 2000

View File

@ -0,0 +1,44 @@
# Charge regulation lammps for simple weak electrolyte
units real
atom_style charge
neighbor 10.0 bin
read_data data.chreg-acid-real
#real units
variable sigma equal 7.2 # particle diameter 0.72 nm
variable temperature equal 298 # temperature 298 K
variable kb index 0.0019872067 # kB in Kcal/mol/K
variable epsilon equal ${kb}*${temperature}
variable tunit equal 2000 # time unit is 2000 fs
variable timestep equal 0.005*${tunit}
variable cut_long equal 12.5*${sigma}
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)*${sigma}
velocity all create ${temperature} 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_coeff * * ${epsilon} ${sigma}
kspace_style pppm 1.0e-3
dielectric 78
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin $(v_temperature) $(v_temperature) $(v_tunit) 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep ${timestep}
run 2000

View File

@ -0,0 +1,33 @@
# Charge regulation lammps for a polymer chain
units lj
atom_style full
neighbor 3.0 bin
read_data data.chreg-polymer
bond_style harmonic
bond_coeff 1 100 1.122462 # K R0
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long 1.122462 20
pair_coeff * * 1.0 1.0 1.122462 # charges
kspace_style pppm 1.0e-3
pair_modify shift yes
dielectric 1.0
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg1 all charge/regulation 2 3 acid_type 1 pH 7.0 pKa 6.5 pIp 3.0 pIm 3.0 temp 1.0 nmc 40 seed 2345
fix chareg2 all charge/regulation 4 5 acid_type 1 pH 7.0 pKa 6.5 pIp 7.0 pIm 7.0 temp 1.0 nmc 40 seed 2345
fix chareg3 all charge/regulation 4 3 pIp 7.0 pIm 3.0 temp 1.0 nmc 20 seed 2345
thermo 100
# print: step, potential energy, temperature, neutral acids, charged acids, salt cations, salt anions, H+ ions, OH- ions
thermo_style custom step pe c_dtemp f_chareg1[3] f_chareg1[4] f_chareg1[7] f_chareg1[8] f_chareg2[7] f_chareg2[8]
timestep 0.005
run 2000

View File

@ -0,0 +1,125 @@
LAMMPS (10 Feb 2021)
using 1 OpenMP thread(s) per MPI task
# Charge regulation lammps for simple weak electrolyte
units lj
atom_style charge
neighbor 3.0 bin
read_data data.chreg-acid
Reading data file ...
orthogonal box = (-25.000000 -25.000000 -25.000000) to (25.000000 25.000000 25.000000)
1 by 1 by 1 MPI processor grid
reading atoms ...
219 atoms
read_data CPU = 0.003 seconds
variable cut_long equal 12.5
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)
variable lunit_nm equal 0.72 # in the units of nm
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_style lj/cut/coul/long 1.12246204830937 ${cut_long}
pair_style lj/cut/coul/long 1.12246204830937 12.5
pair_coeff * * 1.0 1.0
kspace_style ewald 1.0e-3
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery 100 nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery 100 nmc 100 seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep 0.005
run 2000
Ewald initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:339)
G vector (1/distance) = 0.14221027
estimated absolute RMS force accuracy = 0.0010128126
estimated relative force accuracy = 0.0010128126
KSpace vectors: actual max1d max3d = 257 5 665
kxmax kymax kzmax = 5 5 5
0 atoms in group FixChargeRegulation:exclusion_group:chareg
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (src/neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 15.5
ghost atom cutoff = 15.5
binsize = 7.75, bins = 7 7 7
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 11.91 | 11.91 | 11.91 Mbytes
Step PotEng c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
0 -0.049662059 1 0 0 1 99 0 0 109 10
100 -0.053672881 0.99159291 100 71 16 84 0 0 92 8
200 -0.053383027 0.90935145 200 156 26 74 0 0 85 11
300 -0.040471335 0.97937429 300 240 21 79 0 0 87 8
400 -0.036188123 1.0837424 400 319 14 86 0 0 92 6
500 -0.057294925 1.0507526 500 407 10 90 0 0 98 8
600 -0.056009748 1.0669354 600 487 15 85 0 0 92 7
700 -0.069686562 0.99202496 700 567 14 86 0 0 96 10
800 -0.054695624 1.0592933 800 647 25 75 0 0 82 7
900 -0.058693653 0.97870458 900 728 27 73 0 0 83 10
1000 -0.062352957 1.0008923 1000 805 24 76 0 0 84 8
1100 -0.065011926 0.91691048 1100 886 22 78 0 0 87 9
1200 -0.080463686 0.98879304 1200 963 23 77 0 0 88 11
1300 -0.062146141 1.0566033 1300 1047 21 79 0 0 88 9
1400 -0.046980246 1.0847512 1400 1129 17 83 0 0 94 11
1500 -0.042935292 1.0075805 1500 1203 24 76 0 0 86 10
1600 -0.056075891 0.94173489 1600 1277 23 77 0 0 90 13
1700 -0.042279161 1.1126317 1700 1355 28 72 0 0 82 10
1800 -0.036842528 1.0255327 1800 1436 24 76 0 0 83 7
1900 -0.038816022 0.93883373 1900 1511 23 77 0 0 86 9
2000 -0.047008287 0.98904085 2000 1592 26 74 0 0 81 7
Loop time of 11.6365 on 1 procs for 2000 steps with 188 atoms
Performance: 74249.079 tau/day, 171.873 timesteps/s
99.8% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.24337 | 0.24337 | 0.24337 | 0.0 | 2.09
Kspace | 4.6009 | 4.6009 | 4.6009 | 0.0 | 39.54
Neigh | 0.023451 | 0.023451 | 0.023451 | 0.0 | 0.20
Comm | 0.027729 | 0.027729 | 0.027729 | 0.0 | 0.24
Output | 0.0007813 | 0.0007813 | 0.0007813 | 0.0 | 0.01
Modify | 6.7345 | 6.7345 | 6.7345 | 0.0 | 57.87
Other | | 0.005713 | | | 0.05
Nlocal: 188.000 ave 188 max 188 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 597.000 ave 597 max 597 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 2196.00 ave 2196 max 2196 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 2196
Ave neighs/atom = 11.680851
Neighbor list builds = 2059
Dangerous builds = 0
Total wall time: 0:00:11

View File

@ -0,0 +1,125 @@
LAMMPS (10 Feb 2021)
using 1 OpenMP thread(s) per MPI task
# Charge regulation lammps for simple weak electrolyte
units lj
atom_style charge
neighbor 3.0 bin
read_data data.chreg-acid
Reading data file ...
orthogonal box = (-25.000000 -25.000000 -25.000000) to (25.000000 25.000000 25.000000)
1 by 2 by 2 MPI processor grid
reading atoms ...
219 atoms
read_data CPU = 0.003 seconds
variable cut_long equal 12.5
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)
variable lunit_nm equal 0.72 # in the units of nm
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_style lj/cut/coul/long 1.12246204830937 ${cut_long}
pair_style lj/cut/coul/long 1.12246204830937 12.5
pair_coeff * * 1.0 1.0
kspace_style ewald 1.0e-3
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp ${pIp} pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm ${pIm} lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm ${lunit_nm} nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery 100 nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.72 nevery 100 nmc 100 seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep 0.005
run 2000
Ewald initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:339)
G vector (1/distance) = 0.14221027
estimated absolute RMS force accuracy = 0.0010128126
estimated relative force accuracy = 0.0010128126
KSpace vectors: actual max1d max3d = 257 5 665
kxmax kymax kzmax = 5 5 5
0 atoms in group FixChargeRegulation:exclusion_group:chareg
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (src/neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 15.5
ghost atom cutoff = 15.5
binsize = 7.75, bins = 7 7 7
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 11.89 | 11.89 | 11.89 Mbytes
Step PotEng c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
0 -0.049662059 1 0 0 1 99 0 0 109 10
100 -0.06196414 1.0156327 100 72 15 85 0 0 93 8
200 -0.053901683 0.95128403 200 160 24 76 0 0 87 11
300 -0.043852423 0.98035058 300 246 22 78 0 0 85 7
400 -0.048370798 1.0909844 400 324 16 84 0 0 91 7
500 -0.042546472 1.026849 500 410 13 87 0 0 95 8
600 -0.06133022 0.97805065 600 494 14 86 0 0 93 7
700 -0.053815853 1.0641005 700 572 17 83 0 0 91 8
800 -0.059974814 1.0192348 800 650 23 77 0 0 83 6
900 -0.051808132 1.0773288 900 728 25 75 0 0 85 10
1000 -0.050390995 1.0236954 1000 804 28 72 0 0 81 9
1100 -0.069766444 1.030965 1100 890 25 75 0 0 85 10
1200 -0.074580231 1.0490058 1200 963 21 79 0 0 88 9
1300 -0.060169443 0.93456607 1300 1043 22 78 0 0 86 8
1400 -0.05120764 1.0374062 1400 1127 19 81 0 0 92 11
1500 -0.027644416 0.99804782 1500 1204 24 76 0 0 85 9
1600 -0.038599195 0.99015524 1600 1283 22 78 0 0 90 12
1700 -0.050222686 1.1444379 1700 1365 27 73 0 0 84 11
1800 -0.049338003 1.1188048 1800 1449 22 78 0 0 84 6
1900 -0.04533154 0.99894341 1900 1527 22 78 0 0 86 8
2000 -0.058837311 0.95302017 2000 1608 26 74 0 0 81 7
Loop time of 3.98119 on 4 procs for 2000 steps with 188 atoms
Performance: 217020.495 tau/day, 502.362 timesteps/s
96.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.050626 | 0.061127 | 0.071318 | 3.4 | 1.54
Kspace | 1.1987 | 1.2504 | 1.288 | 3.1 | 31.41
Neigh | 0.0056982 | 0.0063858 | 0.0069821 | 0.7 | 0.16
Comm | 0.068302 | 0.11638 | 0.17922 | 12.8 | 2.92
Output | 0.00055408 | 0.00092399 | 0.0020106 | 0.0 | 0.02
Modify | 2.5399 | 2.5406 | 2.5417 | 0.0 | 63.81
Other | | 0.005394 | | | 0.14
Nlocal: 47.0000 ave 55 max 42 min
Histogram: 1 0 1 1 0 0 0 0 0 1
Nghost: 328.250 ave 335 max 317 min
Histogram: 1 0 0 0 0 1 0 0 0 2
Neighs: 547.000 ave 659 max 466 min
Histogram: 2 0 0 0 0 0 1 0 0 1
Total # of neighbors = 2188
Ave neighs/atom = 11.638298
Neighbor list builds = 2057
Dangerous builds = 0
Total wall time: 0:00:04

View File

@ -0,0 +1,131 @@
LAMMPS (10 Feb 2021)
using 1 OpenMP thread(s) per MPI task
# Charge regulation lammps for a polymer chain
units lj
atom_style full
neighbor 3.0 bin
read_data data.chreg-polymer
Reading data file ...
orthogonal box = (-50.000000 -50.000000 -50.000000) to (50.000000 50.000000 50.000000)
1 by 1 by 1 MPI processor grid
reading atoms ...
160 atoms
scanning bonds ...
1 = max bonds/atom
reading bonds ...
79 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.001 seconds
read_data CPU = 0.009 seconds
bond_style harmonic
bond_coeff 1 100 1.122462 # K R0
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long 1.122462 20
pair_coeff * * 1.0 1.0 1.122462 # charges
kspace_style pppm 1.0e-3
pair_modify shift yes
dielectric 1.0
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg1 all charge/regulation 2 3 acid_type 1 pH 7.0 pKa 6.5 pIp 3.0 pIm 3.0 temp 1.0 nmc 40 seed 2345
fix chareg2 all charge/regulation 4 5 acid_type 1 pH 7.0 pKa 6.5 pIp 7.0 pIm 7.0 temp 1.0 nmc 40 seed 2345
fix chareg3 all charge/regulation 4 3 pIp 7.0 pIm 3.0 temp 1.0 nmc 20 seed 2345
thermo 100
# print: step, potential energy, temperature, neutral acids, charged acids, salt cations, salt anions, H+ ions, OH- ions
thermo_style custom step pe c_dtemp f_chareg1[3] f_chareg1[4] f_chareg1[7] f_chareg1[8] f_chareg2[7] f_chareg2[8]
timestep 0.005
run 2000
PPPM initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:339)
G vector (1/distance) = 0.077106934
grid = 8 8 8
stencil order = 5
estimated absolute RMS force accuracy = 0.00074388331
estimated relative force accuracy = 0.00074388331
using double precision FFTW3
3d grid and FFT values/proc = 2197 512
0 atoms in group FixChargeRegulation:exclusion_group:chareg1
0 atoms in group FixChargeRegulation:exclusion_group:chareg2
0 atoms in group FixChargeRegulation:exclusion_group:chareg3
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (src/neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 23
ghost atom cutoff = 23
binsize = 11.5, bins = 9 9 9
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, 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.962 | 6.962 | 6.962 Mbytes
Step PotEng c_dtemp f_chareg1[3] f_chareg1[4] f_chareg1[7] f_chareg1[8] f_chareg2[7] f_chareg2[8]
0 0.50528297 1 0 80 80 0 0 0
100 0.61185377 0.95892928 13 67 74 7 0 0
200 0.54355177 1.1282424 19 61 76 15 0 0
300 0.4519957 1.0764688 20 60 85 26 1 0
400 0.41479389 0.99212685 24 56 92 36 0 0
500 0.37382446 0.99776674 28 52 98 46 0 0
600 0.34785337 1.1115081 28 52 109 57 0 0
700 0.34637618 1.0332262 28 52 120 68 0 0
800 0.21020932 1.1264036 29 51 125 74 0 0
900 0.21246108 1.1168609 30 50 131 81 0 0
1000 0.20997475 1.1201478 32 48 132 84 0 0
1100 0.1984165 1.0209092 31 49 144 95 0 0
1200 0.2061932 0.95880059 35 45 151 106 0 0
1300 0.17220376 0.980077 36 44 156 112 0 0
1400 0.15671143 0.93535342 37 43 161 118 0 0
1500 0.16174665 0.9495928 36 44 168 124 0 0
1600 0.11062965 0.94072924 40 40 164 124 0 0
1700 0.13002563 0.95010828 38 42 167 125 0 0
1800 0.14527814 0.93555342 37 43 172 129 0 0
1900 0.17627465 0.96682495 32 48 176 128 0 0
2000 0.16497265 0.95226954 33 47 180 133 0 0
Loop time of 7.45499 on 1 procs for 2000 steps with 393 atoms
Performance: 115895.577 tau/day, 268.277 timesteps/s
99.6% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.45607 | 0.45607 | 0.45607 | 0.0 | 6.12
Bond | 0.0062385 | 0.0062385 | 0.0062385 | 0.0 | 0.08
Kspace | 2.3257 | 2.3257 | 2.3257 | 0.0 | 31.20
Neigh | 0.067103 | 0.067103 | 0.067103 | 0.0 | 0.90
Comm | 0.02577 | 0.02577 | 0.02577 | 0.0 | 0.35
Output | 0.00087047 | 0.00087047 | 0.00087047 | 0.0 | 0.01
Modify | 4.5664 | 4.5664 | 4.5664 | 0.0 | 61.25
Other | | 0.006848 | | | 0.09
Nlocal: 393.000 ave 393 max 393 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 749.000 ave 749 max 749 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 5359.00 ave 5359 max 5359 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 5359
Ave neighs/atom = 13.636132
Ave special neighs/atom = 1.1908397
Neighbor list builds = 1489
Dangerous builds = 0
Total wall time: 0:00:07

View File

@ -0,0 +1,131 @@
LAMMPS (10 Feb 2021)
using 1 OpenMP thread(s) per MPI task
# Charge regulation lammps for a polymer chain
units lj
atom_style full
neighbor 3.0 bin
read_data data.chreg-polymer
Reading data file ...
orthogonal box = (-50.000000 -50.000000 -50.000000) to (50.000000 50.000000 50.000000)
1 by 2 by 2 MPI processor grid
reading atoms ...
160 atoms
scanning bonds ...
1 = max bonds/atom
reading bonds ...
79 bonds
Finding 1-2 1-3 1-4 neighbors ...
special bond factors lj: 0 0 0
special bond factors coul: 0 0 0
2 = max # of 1-2 neighbors
2 = max # of 1-3 neighbors
4 = max # of 1-4 neighbors
6 = max # of special neighbors
special bonds CPU = 0.001 seconds
read_data CPU = 0.016 seconds
bond_style harmonic
bond_coeff 1 100 1.122462 # K R0
velocity all create 1.0 8008 loop geom
pair_style lj/cut/coul/long 1.122462 20
pair_coeff * * 1.0 1.0 1.122462 # charges
kspace_style pppm 1.0e-3
pair_modify shift yes
dielectric 1.0
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin 1.0 1.0 1.0 123
fix_modify fT temp dtemp
fix chareg1 all charge/regulation 2 3 acid_type 1 pH 7.0 pKa 6.5 pIp 3.0 pIm 3.0 temp 1.0 nmc 40 seed 2345
fix chareg2 all charge/regulation 4 5 acid_type 1 pH 7.0 pKa 6.5 pIp 7.0 pIm 7.0 temp 1.0 nmc 40 seed 2345
fix chareg3 all charge/regulation 4 3 pIp 7.0 pIm 3.0 temp 1.0 nmc 20 seed 2345
thermo 100
# print: step, potential energy, temperature, neutral acids, charged acids, salt cations, salt anions, H+ ions, OH- ions
thermo_style custom step pe c_dtemp f_chareg1[3] f_chareg1[4] f_chareg1[7] f_chareg1[8] f_chareg2[7] f_chareg2[8]
timestep 0.005
run 2000
PPPM initialization ...
using 12-bit tables for long-range coulomb (src/kspace.cpp:339)
G vector (1/distance) = 0.077106934
grid = 8 8 8
stencil order = 5
estimated absolute RMS force accuracy = 0.00074388331
estimated relative force accuracy = 0.00074388331
using double precision FFTW3
3d grid and FFT values/proc = 1053 128
0 atoms in group FixChargeRegulation:exclusion_group:chareg1
0 atoms in group FixChargeRegulation:exclusion_group:chareg2
0 atoms in group FixChargeRegulation:exclusion_group:chareg3
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (src/neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 23
ghost atom cutoff = 23
binsize = 11.5, bins = 9 9 9
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, 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.878 | 6.935 | 6.992 Mbytes
Step PotEng c_dtemp f_chareg1[3] f_chareg1[4] f_chareg1[7] f_chareg1[8] f_chareg2[7] f_chareg2[8]
0 0.50528297 1 0 80 80 0 0 0
100 0.60223729 0.89547569 13 67 75 8 0 0
200 0.65253636 0.87662399 18 62 78 16 0 0
300 0.51550501 1.0542131 22 58 84 27 1 0
400 0.43566766 0.94557633 26 54 90 36 0 0
500 0.36269507 1.0386276 31 49 94 45 0 0
600 0.32430641 0.99903033 27 53 111 58 0 0
700 0.30255299 0.91225991 28 52 121 69 0 0
800 0.27189951 0.9747089 28 52 127 75 0 0
900 0.25495247 1.0747821 28 52 135 83 0 0
1000 0.25950416 0.95256449 32 48 134 86 0 0
1100 0.22561248 1.0102255 32 48 147 99 0 0
1200 0.1734754 0.99475154 33 47 157 110 0 0
1300 0.20081084 0.99873599 36 44 160 116 0 0
1400 0.14240417 0.99442152 36 44 164 121 1 0
1500 0.15314186 0.94559876 39 41 167 126 0 0
1600 0.13574107 1.0484195 43 37 164 127 0 0
1700 0.14477789 1.0105172 42 38 166 128 0 0
1800 0.13493107 1.0349667 41 39 171 132 0 0
1900 0.14849779 0.9994329 33 47 178 131 0 0
2000 0.14485171 0.99739608 34 46 183 137 0 0
Loop time of 3.18871 on 4 procs for 2000 steps with 400 atoms
Performance: 270955.695 tau/day, 627.212 timesteps/s
94.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.086456 | 0.11738 | 0.18562 | 11.8 | 3.68
Bond | 0.00099182 | 0.0018544 | 0.0030079 | 1.8 | 0.06
Kspace | 0.77406 | 0.79354 | 0.80895 | 1.5 | 24.89
Neigh | 0.017894 | 0.017948 | 0.018002 | 0.0 | 0.56
Comm | 0.029044 | 0.07885 | 0.11432 | 11.3 | 2.47
Output | 0.00054932 | 0.0009656 | 0.0021319 | 0.0 | 0.03
Modify | 2.1676 | 2.1706 | 2.1733 | 0.2 | 68.07
Other | | 0.007591 | | | 0.24
Nlocal: 100.000 ave 110 max 89 min
Histogram: 1 1 0 0 0 0 0 0 0 2
Nghost: 415.000 ave 418 max 411 min
Histogram: 1 0 1 0 0 0 0 0 0 2
Neighs: 1360.75 ave 1872 max 1018 min
Histogram: 1 1 0 0 1 0 0 0 0 1
Total # of neighbors = 5443
Ave neighs/atom = 13.607500
Ave special neighs/atom = 1.1700000
Neighbor list builds = 1492
Dangerous builds = 0
Total wall time: 0:00:03

View File

@ -0,0 +1,145 @@
LAMMPS (10 Feb 2021)
# Charge regulation lammps for simple weak electrolyte
units real
atom_style charge
neighbor 10.0 bin
read_data data.chreg-acid-real
Reading data file ...
orthogonal box = (-180.00000 -180.00000 -180.00000) to (180.00000 180.00000 180.00000)
1 by 1 by 1 MPI processor grid
reading atoms ...
219 atoms
read_data CPU = 0.002 seconds
#real units
variable sigma equal 7.2 # particle diameter 0.72 nm
variable temperature equal 298 # temperature 298 K
variable kb index 0.0019872067 # kB in Kcal/mol/K
variable epsilon equal ${kb}*${temperature}
variable epsilon equal 0.0019872067*${temperature}
variable epsilon equal 0.0019872067*298
variable tunit equal 2000 # time unit is 2000 fs
variable timestep equal 0.005*${tunit}
variable timestep equal 0.005*2000
variable cut_long equal 12.5*${sigma}
variable cut_long equal 12.5*7.2
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)*${sigma}
variable cut_lj equal 2^(1.0/6.0)*7.2
velocity all create ${temperature} 8008 loop geom
velocity all create 298 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_style lj/cut/coul/long 8.08172674782749 ${cut_long}
pair_style lj/cut/coul/long 8.08172674782749 90
pair_coeff * * ${epsilon} ${sigma}
pair_coeff * * 0.5921875966 ${sigma}
pair_coeff * * 0.5921875966 7.2
kspace_style pppm 1.0e-3
dielectric 78
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin $(v_temperature) $(v_temperature) $(v_tunit) 123
fix fT all langevin 298 $(v_temperature) $(v_tunit) 123
fix fT all langevin 298 298 $(v_tunit) 123
fix fT all langevin 298 298 2000 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery 100 nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery 100 nmc 100 seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep ${timestep}
timestep 10
run 2000
PPPM initialization ...
using 12-bit tables for long-range coulomb (../kspace.cpp:339)
G vector (1/distance) = 0.019408615
grid = 8 8 8
stencil order = 5
estimated absolute RMS force accuracy = 0.00012527706
estimated relative force accuracy = 3.7726815e-07
using double precision KISS FFT
3d grid and FFT values/proc = 2197 512
0 atoms in group FixChargeRegulation:exclusion_group:chareg
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 100
ghost atom cutoff = 100
binsize = 50, bins = 8 8 8
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 3.708 | 3.708 | 3.708 Mbytes
Step PotEng c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
0 -6.4798431 298 0 0 1 99 0 0 109 10
100 -6.9219668 306.44177 100 77 15 85 0 0 94 9
200 -6.8175255 306.64254 200 164 23 77 0 0 87 10
300 -5.2482381 331.67831 300 248 21 79 0 0 85 6
400 -7.4531538 285.3495 400 326 17 83 0 0 89 6
500 -6.9662528 286.2123 500 408 14 86 0 0 95 9
600 -6.528214 291.41762 600 492 14 86 0 0 95 9
700 -6.290871 271.50948 700 567 14 86 0 0 96 10
800 -6.4944741 300.66261 800 650 23 77 0 0 83 6
900 -8.0414672 305.6179 900 731 25 75 0 0 84 9
1000 -8.5694583 298.73349 1000 810 25 75 0 0 83 8
1100 -8.6677368 269.67435 1100 894 22 78 0 0 87 9
1200 -8.2246183 284.14886 1200 969 22 78 0 0 88 10
1300 -7.7674621 320.04838 1300 1040 23 77 0 0 85 8
1400 -9.5186335 303.48091 1400 1124 18 82 0 0 93 11
1500 -5.8437493 271.40712 1500 1204 25 75 0 0 83 8
1600 -5.9149181 268.24708 1600 1285 23 77 0 0 90 13
1700 -6.5047738 303.79732 1700 1369 27 73 0 0 84 11
1800 -7.3010139 308.98213 1800 1450 22 78 0 0 83 5
1900 -6.3505397 306.94357 1900 1527 22 78 0 0 86 8
2000 -5.7144173 287.06184 2000 1605 27 73 0 0 80 7
Loop time of 1.17189 on 1 procs for 2000 steps with 187 atoms
Performance: 1474.535 ns/day, 0.016 hours/ns, 1706.638 timesteps/s
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 | 0.035807 | 0.035807 | 0.035807 | 0.0 | 3.06
Kspace | 0.37689 | 0.37689 | 0.37689 | 0.0 | 32.16
Neigh | 0.008694 | 0.008694 | 0.008694 | 0.0 | 0.74
Comm | 0.004793 | 0.004793 | 0.004793 | 0.0 | 0.41
Output | 0.000746 | 0.000746 | 0.000746 | 0.0 | 0.06
Modify | 0.74292 | 0.74292 | 0.74292 | 0.0 | 63.39
Other | | 0.00205 | | | 0.17
Nlocal: 187.000 ave 187 max 187 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 437.000 ave 437 max 437 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 1500.00 ave 1500 max 1500 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 1500
Ave neighs/atom = 8.0213904
Neighbor list builds = 2080
Dangerous builds = 0
Total wall time: 0:00:01

View File

@ -0,0 +1,145 @@
LAMMPS (10 Feb 2021)
# Charge regulation lammps for simple weak electrolyte
units real
atom_style charge
neighbor 10.0 bin
read_data data.chreg-acid-real
Reading data file ...
orthogonal box = (-180.00000 -180.00000 -180.00000) to (180.00000 180.00000 180.00000)
1 by 2 by 2 MPI processor grid
reading atoms ...
219 atoms
read_data CPU = 0.002 seconds
#real units
variable sigma equal 7.2 # particle diameter 0.72 nm
variable temperature equal 298 # temperature 298 K
variable kb index 0.0019872067 # kB in Kcal/mol/K
variable epsilon equal ${kb}*${temperature}
variable epsilon equal 0.0019872067*${temperature}
variable epsilon equal 0.0019872067*298
variable tunit equal 2000 # time unit is 2000 fs
variable timestep equal 0.005*${tunit}
variable timestep equal 0.005*2000
variable cut_long equal 12.5*${sigma}
variable cut_long equal 12.5*7.2
variable nevery equal 100
variable nmc equal 100
variable pH equal 7.0
variable pKa equal 6.0
variable pIm equal 3.0
variable pIp equal 3.0
variable cut_lj equal 2^(1.0/6.0)*${sigma}
variable cut_lj equal 2^(1.0/6.0)*7.2
velocity all create ${temperature} 8008 loop geom
velocity all create 298 8008 loop geom
pair_style lj/cut/coul/long ${cut_lj} ${cut_long}
pair_style lj/cut/coul/long 8.08172674782749 ${cut_long}
pair_style lj/cut/coul/long 8.08172674782749 90
pair_coeff * * ${epsilon} ${sigma}
pair_coeff * * 0.5921875966 ${sigma}
pair_coeff * * 0.5921875966 7.2
kspace_style pppm 1.0e-3
dielectric 78
pair_modify shift yes
######### VERLET INTEGRATION WITH LANGEVIN THERMOSTAT ###########
fix fnve all nve
compute dtemp all temp
compute_modify dtemp dynamic yes
fix fT all langevin $(v_temperature) $(v_temperature) $(v_tunit) 123
fix fT all langevin 298 $(v_temperature) $(v_tunit) 123
fix fT all langevin 298 298 $(v_tunit) 123
fix fT all langevin 298 298 2000 123
fix_modify fT temp dtemp
fix chareg all charge/regulation 2 3 acid_type 1 pH ${pH} pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa ${pKa} pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp ${pIp} pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm ${pIm} lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery ${nevery} nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery 100 nmc ${nmc} seed 2345 tempfixid fT
fix chareg all charge/regulation 2 3 acid_type 1 pH 7 pKa 6 pIp 3 pIm 3 lunit_nm 0.1 nevery 100 nmc 100 seed 2345 tempfixid fT
thermo 100
thermo_style custom step pe c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
timestep ${timestep}
timestep 10
run 2000
PPPM initialization ...
using 12-bit tables for long-range coulomb (../kspace.cpp:339)
G vector (1/distance) = 0.019408615
grid = 8 8 8
stencil order = 5
estimated absolute RMS force accuracy = 0.00012527706
estimated relative force accuracy = 3.7726815e-07
using double precision KISS FFT
3d grid and FFT values/proc = 1053 128
0 atoms in group FixChargeRegulation:exclusion_group:chareg
WARNING: Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies (../neighbor.cpp:486)
Neighbor list info ...
update every 1 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 100
ghost atom cutoff = 100
binsize = 50, bins = 8 8 8
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair lj/cut/coul/long, perpetual
attributes: half, newton on
pair build: half/bin/atomonly/newton
stencil: half/bin/3d/newton
bin: standard
Per MPI rank memory allocation (min/avg/max) = 3.624 | 3.624 | 3.624 Mbytes
Step PotEng c_dtemp f_chareg[1] f_chareg[2] f_chareg[3] f_chareg[4] f_chareg[5] f_chareg[6] f_chareg[7] f_chareg[8]
0 -6.4798431 298 0 0 1 99 0 0 109 10
100 -7.6327126 304.68909 100 73 15 85 0 0 94 9
200 -6.1699041 272.19597 200 156 24 76 0 0 87 11
300 -7.7876571 288.90801 300 240 20 80 0 0 87 7
400 -6.3239918 274.65708 400 315 16 84 0 0 90 6
500 -5.3978659 257.49208 500 398 15 85 0 0 93 8
600 -5.6433949 322.52048 600 477 18 82 0 0 90 8
700 -6.5351367 269.20244 700 558 18 82 0 0 91 9
800 -6.2093085 315.21326 800 638 24 76 0 0 83 7
900 -7.0795998 311.93228 900 719 28 72 0 0 82 10
1000 -6.4668438 281.72674 1000 796 27 73 0 0 81 8
1100 -6.2377994 318.48594 1100 875 25 75 0 0 84 9
1200 -6.6305072 304.9091 1200 950 23 77 0 0 87 10
1300 -5.9624552 286.05027 1300 1029 22 78 0 0 86 8
1400 -4.4695814 261.81053 1400 1111 20 80 0 0 90 10
1500 -5.6928652 293.72403 1500 1191 24 76 0 0 86 10
1600 -6.8715413 290.47065 1600 1275 22 78 0 0 90 12
1700 -6.5067505 292.74735 1700 1356 25 75 0 0 85 10
1800 -5.3902702 307.79012 1800 1434 22 78 0 0 83 5
1900 -5.1407153 318.48918 1900 1510 21 79 0 0 87 8
2000 -4.9514719 281.87771 2000 1589 25 75 0 0 82 7
Loop time of 0.562889 on 4 procs for 2000 steps with 189 atoms
Performance: 3069.876 ns/day, 0.008 hours/ns, 3553.097 timesteps/s
99.6% CPU use with 4 MPI tasks x no OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 0.008399 | 0.010383 | 0.011765 | 1.2 | 1.84
Kspace | 0.17501 | 0.17543 | 0.1757 | 0.1 | 31.17
Neigh | 0.001833 | 0.0021325 | 0.002293 | 0.4 | 0.38
Comm | 0.023099 | 0.024255 | 0.026645 | 0.9 | 4.31
Output | 0.000465 | 0.000546 | 0.000783 | 0.0 | 0.10
Modify | 0.3464 | 0.34669 | 0.34698 | 0.0 | 61.59
Other | | 0.003452 | | | 0.61
Nlocal: 47.2500 ave 57 max 41 min
Histogram: 1 1 0 1 0 0 0 0 0 1
Nghost: 285.750 ave 303 max 263 min
Histogram: 1 0 0 0 1 0 0 0 1 1
Neighs: 403.500 ave 548 max 324 min
Histogram: 2 0 0 1 0 0 0 0 0 1
Total # of neighbors = 1614
Ave neighs/atom = 8.5396825
Neighbor list builds = 2081
Dangerous builds = 0
Total wall time: 0:00:00

View File

@ -0,0 +1 @@
../../../potentials/Cu-PBE-core-rep.ace

View File

@ -0,0 +1,38 @@
# simple test of fcc Cu with ACE product
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
region box block 0 4 0 4 0 4
create_box 1 box
create_atoms 1 box
mass 1 26.98
group Al type 1
pair_style pace product
pair_coeff * * Cu-PBE-core-rep.ace Cu
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100

View File

@ -0,0 +1,38 @@
# simple test of fcc Cu with ACE recursive
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
region box block 0 4 0 4 0 4
create_box 1 box
create_atoms 1 box
mass 1 26.98
group Al type 1
pair_style pace recursive
pair_coeff * * Cu-PBE-core-rep.ace Cu
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100

View File

@ -0,0 +1,108 @@
LAMMPS (24 Dec 2020)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94)
using 1 OpenMP thread(s) per MPI task
# simple test of fcc Cu with ACE product
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
lattice fcc 3.597
Lattice spacing in x,y,z = 3.5970000 3.5970000 3.5970000
region box block 0 4 0 4 0 4
create_box 1 box
Created orthogonal box = (0.0000000 0.0000000 0.0000000) to (14.388000 14.388000 14.388000)
1 by 1 by 1 MPI processor grid
create_atoms 1 box
Created 256 atoms
create_atoms CPU = 0.000 seconds
mass 1 26.98
group Al type 1
256 atoms in group Al
pair_style pace product
ACE version: 2021.2.3
Product evaluator is used
pair_coeff * * Cu-PBE-core-rep.ace Cu
Loading Cu-PBE-core-rep.ace
Total number of basis functions
Cu: 16 (r=1) 726 (r>1)
Mapping LAMMPS atom type #1(Cu) -> ACE species type #0
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100
Neighbor list info ...
update every 2 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 7.7
ghost atom cutoff = 7.7
binsize = 3.85, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair pace, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.036 | 4.036 | 4.036 Mbytes
Step Temp E_pair TotEng Press v_delenergy v_delpress
0 300 -945.9873 -936.0989 45359.818 0 2.1827873e-11
10 280.68558 -945.35055 -936.09878 46326.919 0 2.910383e-11
20 228.73618 -943.63789 -936.09844 48903.598 0 -2.910383e-11
30 160.53661 -941.38948 -936.09798 52222.083 0 -2.910383e-11
40 97.732944 -939.31899 -936.09758 55176.875 0 2.1827873e-11
50 59.165961 -938.04759 -936.0974 56850.103 0 2.910383e-11
60 53.124678 -937.84857 -936.09751 56878.948 0 0
70 74.623347 -938.5575 -936.09782 55565.237 0 4.3655746e-11
80 109.4762 -939.70663 -936.09815 53665.652 0 2.910383e-11
90 142.02657 -940.77975 -936.09837 52001.1 0 0
100 161.73598 -941.42945 -936.09842 51114.997 0 1.4551915e-11
Loop time of 11.4718 on 1 procs for 100 steps with 256 atoms
Performance: 0.377 ns/day, 63.732 hours/ns, 8.717 timesteps/s
99.3% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 11.468 | 11.468 | 11.468 | 0.0 | 99.96
Neigh | 0.001181 | 0.001181 | 0.001181 | 0.0 | 0.01
Comm | 0.001207 | 0.001207 | 0.001207 | 0.0 | 0.01
Output | 0.000876 | 0.000876 | 0.000876 | 0.0 | 0.01
Modify | 0.000455 | 0.000455 | 0.000455 | 0.0 | 0.00
Other | | 0.000397 | | | 0.00
Nlocal: 256.000 ave 256 max 256 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2201.00 ave 2201 max 2201 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0.00000 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
FullNghs: 43118.0 ave 43118 max 43118 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 43118
Ave neighs/atom = 168.42969
Neighbor list builds = 1
Dangerous builds = 0
Total wall time: 0:00:11

View File

@ -0,0 +1,108 @@
LAMMPS (24 Dec 2020)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94)
using 1 OpenMP thread(s) per MPI task
# simple test of fcc Cu with ACE product
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
lattice fcc 3.597
Lattice spacing in x,y,z = 3.5970000 3.5970000 3.5970000
region box block 0 4 0 4 0 4
create_box 1 box
Created orthogonal box = (0.0000000 0.0000000 0.0000000) to (14.388000 14.388000 14.388000)
1 by 2 by 2 MPI processor grid
create_atoms 1 box
Created 256 atoms
create_atoms CPU = 0.000 seconds
mass 1 26.98
group Al type 1
256 atoms in group Al
pair_style pace product
ACE version: 2021.2.3
Product evaluator is used
pair_coeff * * Cu-PBE-core-rep.ace Cu
Loading Cu-PBE-core-rep.ace
Total number of basis functions
Cu: 16 (r=1) 726 (r>1)
Mapping LAMMPS atom type #1(Cu) -> ACE species type #0
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100
Neighbor list info ...
update every 2 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 7.7
ghost atom cutoff = 7.7
binsize = 3.85, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair pace, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.005 | 4.005 | 4.005 Mbytes
Step Temp E_pair TotEng Press v_delenergy v_delpress
0 300 -945.9873 -936.0989 45359.818 0 -1.4551915e-11
10 280.68558 -945.35055 -936.09878 46326.919 0 2.910383e-11
20 228.73618 -943.63789 -936.09844 48903.598 0 0
30 160.53661 -941.38948 -936.09798 52222.083 0 -2.910383e-11
40 97.732944 -939.31899 -936.09758 55176.875 0 2.1827873e-11
50 59.165961 -938.04759 -936.0974 56850.103 0 -1.4551915e-11
60 53.124678 -937.84857 -936.09751 56878.948 0 7.2759576e-12
70 74.623347 -938.5575 -936.09782 55565.237 0 0
80 109.4762 -939.70663 -936.09815 53665.652 0 2.1827873e-11
90 142.02657 -940.77975 -936.09837 52001.1 0 -1.4551915e-11
100 161.73598 -941.42945 -936.09842 51114.997 0 1.4551915e-11
Loop time of 3.54317 on 4 procs for 100 steps with 256 atoms
Performance: 1.219 ns/day, 19.684 hours/ns, 28.223 timesteps/s
98.7% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 3.1375 | 3.3058 | 3.469 | 6.5 | 93.30
Neigh | 0.000284 | 0.00031975 | 0.000352 | 0.0 | 0.01
Comm | 0.071607 | 0.23492 | 0.40336 | 24.6 | 6.63
Output | 0.001189 | 0.0012315 | 0.001347 | 0.2 | 0.03
Modify | 0.000311 | 0.00032725 | 0.000351 | 0.0 | 0.01
Other | | 0.0005298 | | | 0.01
Nlocal: 64.0000 ave 71 max 57 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Nghost: 1373.00 ave 1380 max 1366 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Neighs: 0.00000 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 10779.5 ave 11978 max 9604 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Total # of neighbors = 43118
Ave neighs/atom = 168.42969
Neighbor list builds = 1
Dangerous builds = 0
Total wall time: 0:00:03

View File

@ -0,0 +1,108 @@
LAMMPS (24 Dec 2020)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94)
using 1 OpenMP thread(s) per MPI task
# simple test of fcc Cu with ACE recursive
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
lattice fcc 3.597
Lattice spacing in x,y,z = 3.5970000 3.5970000 3.5970000
region box block 0 4 0 4 0 4
create_box 1 box
Created orthogonal box = (0.0000000 0.0000000 0.0000000) to (14.388000 14.388000 14.388000)
1 by 1 by 1 MPI processor grid
create_atoms 1 box
Created 256 atoms
create_atoms CPU = 0.000 seconds
mass 1 26.98
group Al type 1
256 atoms in group Al
pair_style pace recursive
ACE version: 2021.2.3
Recursive evaluator is used
pair_coeff * * Cu-PBE-core-rep.ace Cu
Loading Cu-PBE-core-rep.ace
Total number of basis functions
Cu: 16 (r=1) 726 (r>1)
Mapping LAMMPS atom type #1(Cu) -> ACE species type #0
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100
Neighbor list info ...
update every 2 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 7.7
ghost atom cutoff = 7.7
binsize = 3.85, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair pace, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.036 | 4.036 | 4.036 Mbytes
Step Temp E_pair TotEng Press v_delenergy v_delpress
0 300 -945.9873 -936.0989 45359.818 0 0
10 280.68558 -945.35055 -936.09878 46326.919 0 5.8207661e-11
20 228.73618 -943.63789 -936.09844 48903.598 0 1.4551915e-11
30 160.53661 -941.38948 -936.09798 52222.083 0 7.2759576e-11
40 97.732944 -939.31899 -936.09758 55176.875 0 -5.8207661e-11
50 59.165961 -938.04759 -936.0974 56850.103 0 0
60 53.124678 -937.84857 -936.09751 56878.948 0 8.7311491e-11
70 74.623347 -938.5575 -936.09782 55565.237 0 -1.4551915e-11
80 109.4762 -939.70663 -936.09815 53665.652 0 2.1827873e-11
90 142.02657 -940.77975 -936.09837 52001.1 0 2.910383e-11
100 161.73598 -941.42945 -936.09842 51114.997 0 0
Loop time of 9.31437 on 1 procs for 100 steps with 256 atoms
Performance: 0.464 ns/day, 51.746 hours/ns, 10.736 timesteps/s
99.4% CPU use with 1 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 9.3103 | 9.3103 | 9.3103 | 0.0 | 99.96
Neigh | 0.001214 | 0.001214 | 0.001214 | 0.0 | 0.01
Comm | 0.001176 | 0.001176 | 0.001176 | 0.0 | 0.01
Output | 0.000827 | 0.000827 | 0.000827 | 0.0 | 0.01
Modify | 0.000479 | 0.000479 | 0.000479 | 0.0 | 0.01
Other | | 0.000363 | | | 0.00
Nlocal: 256.000 ave 256 max 256 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Nghost: 2201.00 ave 2201 max 2201 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Neighs: 0.00000 ave 0 max 0 min
Histogram: 1 0 0 0 0 0 0 0 0 0
FullNghs: 43118.0 ave 43118 max 43118 min
Histogram: 1 0 0 0 0 0 0 0 0 0
Total # of neighbors = 43118
Ave neighs/atom = 168.42969
Neighbor list builds = 1
Dangerous builds = 0
Total wall time: 0:00:09

View File

@ -0,0 +1,108 @@
LAMMPS (24 Dec 2020)
OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:94)
using 1 OpenMP thread(s) per MPI task
# simple test of fcc Cu with ACE recursive
units metal
atom_style atomic
neighbor 0.3 bin
neigh_modify every 2 delay 10 check yes
variable a equal 3.597
lattice fcc $a
lattice fcc 3.597
Lattice spacing in x,y,z = 3.5970000 3.5970000 3.5970000
region box block 0 4 0 4 0 4
create_box 1 box
Created orthogonal box = (0.0000000 0.0000000 0.0000000) to (14.388000 14.388000 14.388000)
1 by 2 by 2 MPI processor grid
create_atoms 1 box
Created 256 atoms
create_atoms CPU = 0.000 seconds
mass 1 26.98
group Al type 1
256 atoms in group Al
pair_style pace recursive
ACE version: 2021.2.3
Recursive evaluator is used
pair_coeff * * Cu-PBE-core-rep.ace Cu
Loading Cu-PBE-core-rep.ace
Total number of basis functions
Cu: 16 (r=1) 726 (r>1)
Mapping LAMMPS atom type #1(Cu) -> ACE species type #0
velocity all create 300 8728 loop geom
timestep 0.0005
fix 1 all nve
compute eatom all pe/atom
compute energy all reduce sum c_eatom
variable delenergy equal c_energy-pe
compute satom all stress/atom NULL
compute str all reduce sum c_satom[1] c_satom[2] c_satom[3]
variable delpress equal -(c_str[1]+c_str[2]+c_str[3])/(3*vol)-press
thermo 10
thermo_style custom step temp epair etotal press v_delenergy v_delpress
run 100
Neighbor list info ...
update every 2 steps, delay 10 steps, check yes
max neighbors/atom: 2000, page size: 100000
master list distance cutoff = 7.7
ghost atom cutoff = 7.7
binsize = 3.85, bins = 4 4 4
1 neighbor lists, perpetual/occasional/extra = 1 0 0
(1) pair pace, perpetual
attributes: full, newton on
pair build: full/bin/atomonly
stencil: full/bin/3d
bin: standard
Per MPI rank memory allocation (min/avg/max) = 4.005 | 4.005 | 4.005 Mbytes
Step Temp E_pair TotEng Press v_delenergy v_delpress
0 300 -945.9873 -936.0989 45359.818 0 -5.0931703e-11
10 280.68558 -945.35055 -936.09878 46326.919 0 1.4551915e-11
20 228.73618 -943.63789 -936.09844 48903.598 0 0
30 160.53661 -941.38948 -936.09798 52222.083 0 -2.910383e-11
40 97.732944 -939.31899 -936.09758 55176.875 0 0
50 59.165961 -938.04759 -936.0974 56850.103 0 -2.910383e-11
60 53.124678 -937.84857 -936.09751 56878.948 0 1.4551915e-11
70 74.623347 -938.5575 -936.09782 55565.237 0 3.6379788e-11
80 109.4762 -939.70663 -936.09815 53665.652 0 -7.2759576e-12
90 142.02657 -940.77975 -936.09837 52001.1 0 -2.910383e-11
100 161.73598 -941.42945 -936.09842 51114.997 0 7.2759576e-12
Loop time of 2.91339 on 4 procs for 100 steps with 256 atoms
Performance: 1.483 ns/day, 16.185 hours/ns, 34.324 timesteps/s
98.9% CPU use with 4 MPI tasks x 1 OpenMP threads
MPI task timing breakdown:
Section | min time | avg time | max time |%varavg| %total
---------------------------------------------------------------
Pair | 2.5753 | 2.723 | 2.8656 | 6.3 | 93.46
Neigh | 0.000308 | 0.000365 | 0.00046 | 0.0 | 0.01
Comm | 0.045106 | 0.18792 | 0.33552 | 24.1 | 6.45
Output | 0.001213 | 0.001259 | 0.001388 | 0.2 | 0.04
Modify | 0.000304 | 0.00033 | 0.00037 | 0.0 | 0.01
Other | | 0.0005595 | | | 0.02
Nlocal: 64.0000 ave 71 max 57 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Nghost: 1373.00 ave 1380 max 1366 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Neighs: 0.00000 ave 0 max 0 min
Histogram: 4 0 0 0 0 0 0 0 0 0
FullNghs: 10779.5 ave 11978 max 9604 min
Histogram: 1 0 0 0 1 1 0 0 0 1
Total # of neighbors = 43118
Ave neighs/atom = 168.42969
Neighbor list builds = 1
Dangerous builds = 0
Total wall time: 0:00:03

View File

@ -2,16 +2,16 @@
#include "lammpsplugin.h"
#include "comm.h"
#include "command.h"
#include "error.h"
#include "pointers.h"
#include "version.h"
#include <cstring>
namespace LAMMPS_NS {
class Hello : protected Pointers {
class Hello : public Command {
public:
Hello(class LAMMPS *lmp) : Pointers(lmp) {};
Hello(class LAMMPS *lmp) : Command(lmp) {};
void command(int, char **);
};
}
@ -25,10 +25,9 @@ void Hello::command(int argc, char **argv)
utils::logmesg(lmp,fmt::format("Hello, {}!\n",argv[0]));
}
static void hellocreator(LAMMPS *lmp, int argc, char **argv)
static Command *hellocreator(LAMMPS *lmp)
{
Hello hello(lmp);
hello.command(argc,argv);
return new Hello(lmp);
}
extern "C" void lammpsplugin_init(void *lmp, void *handle, void *regfunc)
@ -39,9 +38,9 @@ extern "C" void lammpsplugin_init(void *lmp, void *handle, void *regfunc)
plugin.version = LAMMPS_VERSION;
plugin.style = "command";
plugin.name = "hello";
plugin.info = "Hello world command v1.0";
plugin.info = "Hello world command v1.1";
plugin.author = "Axel Kohlmeyer (akohlmey@gmail.com)";
plugin.creator.v3 = (lammpsplugin_factory3 *) &hellocreator;
plugin.creator.v1 = (lammpsplugin_factory1 *) &hellocreator;
plugin.handle = handle;
(*register_plugin)(&plugin,lmp);
}

2
lib/pace/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/src
/libpace.a

105
lib/pace/Install.py Normal file
View File

@ -0,0 +1,105 @@
# TODO#!/usr/bin/env python
"""
Install.py tool to download, compile, and setup the pace library
used to automate the steps described in the README file in this dir
"""
from __future__ import print_function
import sys, os, subprocess, shutil
from argparse import ArgumentParser
sys.path.append('..')
from install_helpers import fullpath, geturl, checkmd5sum
# settings
thisdir = fullpath('.')
version = 'v.2021.4.9'
# known checksums for different PACE versions. used to validate the download.
checksums = { \
'v.2021.2.3.upd2' : '8fd1162724d349b930e474927197f20d',
'v.2021.4.9' : '4db54962fbd6adcf8c18d46e1798ceb5',
}
parser = ArgumentParser(prog='Install.py',
description="LAMMPS library build wrapper script")
# help message
HELP = """
Syntax from src dir: make lib-pace args="-b"
or: make lib-pace args="-b -v version"
Syntax from lib dir: python Install.py -b
or: python Install.py -b -v version
Examples:
make lib-pace args="-b" # install default version of PACE lib
make lib-pace args="-b -v version" # install specified version of PACE lib
"""
pgroup = parser.add_mutually_exclusive_group()
pgroup.add_argument("-b", "--build", action="store_true",
help="download and build base PACE library")
parser.add_argument("-v", "--version", default=version, choices=checksums.keys(),
help="set version of PACE library to download and build (default: %s)" % version)
parser.add_argument("-vv", "--verbose", action="store_true",
help="be more verbose about is happening while this script runs")
args = parser.parse_args()
# print help message and exit, if neither build nor path options are given
if not args.build:
parser.print_help()
sys.exit(HELP)
buildflag = args.build
verboseflag = args.verbose
version = args.version
archive_extension = "tar.gz"
url = "https://github.com/ICAMS/lammps-user-pace/archive/refs/tags/%s.%s" % (version, archive_extension)
unarchived_folder_name = "lammps-user-pace-%s"%(version)
# download PACE tarball, unpack, build PACE
if buildflag:
# download entire tarball
print("Downloading pace tarball ...")
archive_filename = "%s.%s" % (version, archive_extension)
download_filename = "%s/%s" % (thisdir, archive_filename)
print("Downloading from ",url," to ",download_filename, end=" ")
geturl(url, download_filename)
print(" done")
# verify downloaded archive integrity via md5 checksum, if known.
if version in checksums:
if not checkmd5sum(checksums[version], archive_filename):
sys.exit("Checksum for pace library does not match")
print("Unpacking pace tarball ...")
src_folder = thisdir+"/src"
cmd = 'cd "%s"; rm -rf "%s"; tar -xvf %s; mv %s %s' % (thisdir, src_folder, archive_filename, unarchived_folder_name, src_folder)
subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
# build
print("Building libpace ...")
cmd = 'make lib -j2'
txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
if verboseflag:
print(txt.decode("UTF-8"))
# remove source files
print("Removing pace build files and archive ...")
cmd = 'rm %s; make clean-build' % (download_filename)
subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)

37
lib/pace/Makefile Normal file
View File

@ -0,0 +1,37 @@
SHELL = /bin/sh
# ------ FILES ------
SRC_FILES = $(wildcard src/USER-PACE/*.cpp)
SRC = $(filter-out src/USER-PACE/pair_pace.cpp, $(SRC_FILES))
# ------ DEFINITIONS ------
LIB = libpace.a
OBJ = $(SRC:.cpp=.o)
# ------ SETTINGS ------
CXXFLAGS = -O3 -fPIC -Isrc/USER-PACE
ARCHIVE = ar
ARCHFLAG = -rc
USRLIB =
SYSLIB =
# ------ MAKE PROCEDURE ------
lib: $(OBJ)
$(ARCHIVE) $(ARFLAGS) $(LIB) $(OBJ)
# ------ COMPILE RULES ------
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
# ------ CLEAN ------
clean-all:
-rm -f *~ $(OBJ) $(LIB)
clean-build:
-rm -f *~ $(OBJ)

3
lib/pace/Makefile.lammps Normal file
View File

@ -0,0 +1,3 @@
pace_SYSINC =-I../../lib/pace/src/USER-PACE
pace_SYSLIB = -L../../lib/pace/ -lpace
pace_SYSPATH =

18
lib/pace/README Normal file
View File

@ -0,0 +1,18 @@
This directory contains files required to use the USER-PACE package,
which provides the pace pair style, an efficient implementation of
the Atomic Cluster Expansion potential (ACE).
ACE is a methodology for deriving a highly accurate classical potential
fit to a large archive of quantum mechanical (DFT) data.
This package was written by Yury Lysogorskiy and others
at ICAMS, the Interdisciplinary Centre for Advanced Materials Simulation,
Ruhr University Bochum, Germany, http://www.icams.de
You can type "make lib-pace" from the src directory to see help on
how to download and build this library via make commands, or you can
do the same thing by typing "python Install.py" from within this
directory.
More information about the USER-PACE implementation of ACE
is available here:
https://github.com/ICAMS/lammps-user-pace

View File

@ -17,7 +17,7 @@ parser = ArgumentParser(prog='Install.py',
# settings
version = "2.7.0"
version = "2.7.1"
mode = "static"
# help message
@ -47,9 +47,12 @@ checksums = { \
'2.5.2' : 'bd2f18346c788eb54e1e52f4f6acf41a', \
'2.5.3' : 'de30d6e7c2dcc0973298e24a6da24286', \
'2.5.4' : 'f31b7d16a4be2e30aa7d5c19c3d37853', \
'2.5.7' : '1ca36226fdb8110b1009aa61d615d4e5', \
'2.6.0' : '204d2edae58d9b10ba3ad460cad64191', \
'2.6.1' : '89a9a450fc6025299fe16af235957163', \
'2.6.3' : 'a9f8028fd74528c2024781ea1fdefeee', \
'2.7.0' : '95f29dd0c067577f11972ff90dfc7d12', \
'2.7.1' : '4eac6a462ec84dfe0cec96c82421b8e8', \
}
# parse and process arguments

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@ build target in the conventional and CMake based build systems
# copy LAMMPS shared library and lammps package to system dirs
from __future__ import print_function
import sys,os,shutil
import sys,os,shutil,time
from argparse import ArgumentParser
parser = ArgumentParser(prog='install.py',
@ -80,13 +80,15 @@ if args.dir:
sys.exit()
# extract version string from header
# extract LAMMPS version string from header
# and convert to python packaging compatible version
def get_lammps_version(header):
with open(header, 'r') as f:
line = f.readline()
start_pos = line.find('"')+1
end_pos = line.find('"', start_pos)
return "".join(line[start_pos:end_pos].split())
t = time.strptime("".join(line[start_pos:end_pos].split()), "%d%b%Y")
return "{}.{}.{}".format(t.tm_year,t.tm_mon,t.tm_mday)
verstr = get_lammps_version(args.version)

View File

@ -13,10 +13,16 @@ from .core import *
from .data import *
from .pylammps import *
# convert module string version to numeric version
# convert installed module string version to numeric version
def get_version_number():
import time
from os.path import join
from sys import version_info
# must report 0 when inside LAMMPS source tree
if __file__.find(join('python', 'lammps', '__init__.py')) > 0:
return 0
vstring = None
if version_info.major == 3 and version_info.minor >= 8:
from importlib.metadata import version
@ -32,7 +38,7 @@ def get_version_number():
if not vstring:
return 0
t = time.strptime(vstring, "%d%b%Y")
t = time.strptime(vstring, "%Y.%m.%d")
return t.tm_year*10000 + t.tm_mon*100 + t.tm_mday
__version__ = get_version_number()

View File

@ -1,7 +1,8 @@
# this only installs the LAMMPS python package
# it assumes the LAMMPS shared library is already installed
from distutils.core import setup
import os
from sys import version_info
import os,time
LAMMPS_PYTHON_DIR = os.path.dirname(os.path.realpath(__file__))
LAMMPS_DIR = os.path.dirname(LAMMPS_PYTHON_DIR)
@ -12,7 +13,13 @@ def get_lammps_version():
line = f.readline()
start_pos = line.find('"')+1
end_pos = line.find('"', start_pos)
return "".join(line[start_pos:end_pos].split())
t = time.strptime("".join(line[start_pos:end_pos].split()), "%d%b%Y")
return "{}.{}.{}".format(t.tm_year,t.tm_mon,t.tm_mday)
if version_info.major >= 3:
pkgs = ['lammps', 'lammps.mliap']
else:
pkgs = ['lammps']
setup(
name = "lammps",
@ -22,5 +29,5 @@ setup(
url = "https://lammps.sandia.gov",
description = "LAMMPS Molecular Dynamics Python package",
license = "GPL",
packages=["lammps","lammps.mliap"],
packages=pkgs,
)

3
src/.gitignore vendored
View File

@ -32,6 +32,9 @@
/pair_kim.cpp
/pair_kim.h
/pair_pace.cpp
/pair_pace.h
/superpose3d.h
/kokkos.cpp

View File

@ -11,24 +11,18 @@
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "dump_atom_gz.h"
#include "domain.h"
#include "dump_atom_gz.h"
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
DumpAtomGZ::DumpAtomGZ(LAMMPS *lmp, int narg, char **arg) :
DumpAtom(lmp, narg, arg)
{
gzFp = nullptr;
compression_level = Z_BEST_COMPRESSION;
if (!compressed)
error->all(FLERR,"Dump atom/gz only writes compressed files");
}
@ -37,9 +31,6 @@ DumpAtomGZ::DumpAtomGZ(LAMMPS *lmp, int narg, char **arg) :
DumpAtomGZ::~DumpAtomGZ()
{
if (gzFp) gzclose(gzFp);
gzFp = nullptr;
fp = nullptr;
}
/* ----------------------------------------------------------------------
@ -80,7 +71,9 @@ void DumpAtomGZ::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -91,17 +84,12 @@ void DumpAtomGZ::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
std::string mode;
if (append_flag) {
mode = fmt::format("ab{}", compression_level);
} else {
mode = fmt::format("wb{}", compression_level);
try {
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
gzFp = gzopen(filecurrent, mode.c_str());
if (gzFp == nullptr) error->one(FLERR,"Cannot open dump file");
} else gzFp = nullptr;
}
// delete string with timestep replaced
@ -112,29 +100,34 @@ void DumpAtomGZ::openfile()
void DumpAtomGZ::write_header(bigint ndump)
{
std::string header;
if ((multiproc) || (!multiproc && me == 0)) {
if (unit_flag && !unit_count) {
++unit_count;
gzprintf(gzFp,"ITEM: UNITS\n%s\n",update->unit_style);
header = fmt::format("ITEM: UNITS\n{}\n",update->unit_style);
}
if (time_flag) gzprintf(gzFp,"ITEM: TIME\n%.16g\n",compute_time());
gzprintf(gzFp,"ITEM: TIMESTEP\n");
gzprintf(gzFp,BIGINT_FORMAT "\n",update->ntimestep);
gzprintf(gzFp,"ITEM: NUMBER OF ATOMS\n");
gzprintf(gzFp,BIGINT_FORMAT "\n",ndump);
if (domain->triclinic == 0) {
gzprintf(gzFp,"ITEM: BOX BOUNDS %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxxlo,boxxhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxylo,boxyhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxzlo,boxzhi);
} else {
gzprintf(gzFp,"ITEM: BOX BOUNDS xy xz yz %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxxlo,boxxhi,boxxy);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxylo,boxyhi,boxxz);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxzlo,boxzhi,boxyz);
if (time_flag) {
header += fmt::format("ITEM: TIME\n{0:.16g}\n", compute_time());
}
gzprintf(gzFp,"ITEM: ATOMS %s\n",columns);
header += fmt::format("ITEM: TIMESTEP\n{}\n", update->ntimestep);
header += fmt::format("ITEM: NUMBER OF ATOMS\n{}\n", ndump);
if (domain->triclinic == 0) {
header += fmt::format("ITEM: BOX BOUNDS {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxxlo, boxxhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxylo, boxyhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxzlo, boxzhi);
} else {
header += fmt::format("ITEM: BOX BOUNDS xy xz yz {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxxlo, boxxhi, boxxy);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxylo, boxyhi, boxxz);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxzlo, boxzhi, boxyz);
}
header += fmt::format("ITEM: ATOMS {}\n", columns);
writer.write(header.c_str(), header.length());
}
}
@ -142,7 +135,33 @@ void DumpAtomGZ::write_header(bigint ndump)
void DumpAtomGZ::write_data(int n, double *mybuf)
{
gzwrite(gzFp,mybuf,sizeof(char)*n);
if (buffer_flag == 1) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
int written = 0;
if (image_flag == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, format,
static_cast<tagint> (mybuf[m]), static_cast<int> (mybuf[m+1]),
mybuf[m+2],mybuf[m+3],mybuf[m+4], static_cast<int> (mybuf[m+5]),
static_cast<int> (mybuf[m+6]), static_cast<int> (mybuf[m+7]));
} else {
written = snprintf(vbuffer, VBUFFER_SIZE, format,
static_cast<tagint> (mybuf[m]), static_cast<int> (mybuf[m+1]),
mybuf[m+2],mybuf[m+3],mybuf[m+4]);
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump atom/gz output");
}
m += size_one;
}
}
}
/* ---------------------------------------------------------------------- */
@ -152,11 +171,11 @@ void DumpAtomGZ::write()
DumpAtom::write();
if (filewriter) {
if (multifile) {
gzclose(gzFp);
gzFp = nullptr;
writer.close();
} else {
if (flush_flag)
gzflush(gzFp,Z_SYNC_FLUSH);
if (flush_flag && writer.isopen()) {
writer.flush();
}
}
}
}
@ -167,14 +186,15 @@ int DumpAtomGZ::modify_param(int narg, char **arg)
{
int consumed = DumpAtom::modify_param(narg, arg);
if (consumed == 0) {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int min_level = Z_DEFAULT_COMPRESSION;
int max_level = Z_BEST_COMPRESSION;
compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
if (compression_level < min_level || compression_level > max_level)
error->all(FLERR, fmt::format("Illegal dump_modify command: compression level must in the range of [{}, {}]", min_level, max_level));
return 2;
try {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
writer.setCompressionLevel(compression_level);
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -21,7 +21,7 @@ DumpStyle(atom/gz,DumpAtomGZ)
#define LMP_DUMP_ATOM_GZ_H
#include "dump_atom.h"
#include <zlib.h>
#include "gz_file_writer.h"
namespace LAMMPS_NS {
@ -31,8 +31,7 @@ class DumpAtomGZ : public DumpAtom {
virtual ~DumpAtomGZ();
protected:
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
GzFileWriter writer;
virtual void openfile();
virtual void write_header(bigint);

View File

@ -43,7 +43,7 @@ DumpAtomZstd::~DumpAtomZstd()
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or zstdipped
ASCII or binary or compressed
some derived classes override this function
------------------------------------------------------------------------- */
@ -79,7 +79,9 @@ void DumpAtomZstd::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -90,12 +92,8 @@ void DumpAtomZstd::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
if (append_flag) {
error->one(FLERR, "dump/zstd currently doesn't support append");
}
try {
writer.open(filecurrent);
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
@ -145,7 +143,33 @@ void DumpAtomZstd::write_header(bigint ndump)
void DumpAtomZstd::write_data(int n, double *mybuf)
{
writer.write(mybuf, n);
if (buffer_flag == 1) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
int written = 0;
if (image_flag == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, format,
static_cast<tagint> (mybuf[m]), static_cast<int> (mybuf[m+1]),
mybuf[m+2],mybuf[m+3],mybuf[m+4], static_cast<int> (mybuf[m+5]),
static_cast<int> (mybuf[m+6]), static_cast<int> (mybuf[m+7]));
} else {
written = snprintf(vbuffer, VBUFFER_SIZE, format,
static_cast<tagint> (mybuf[m]), static_cast<int> (mybuf[m+1]),
mybuf[m+2],mybuf[m+3],mybuf[m+4]);
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump atom/gz output");
}
m += size_one;
}
}
}
/* ---------------------------------------------------------------------- */
@ -184,7 +208,7 @@ int DumpAtomZstd::modify_param(int narg, char **arg)
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -11,41 +11,30 @@
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "dump_cfg_gz.h"
#include "atom.h"
#include "domain.h"
#include "dump_cfg_gz.h"
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
#define UNWRAPEXPAND 10.0
DumpCFGGZ::DumpCFGGZ(LAMMPS *lmp, int narg, char **arg) :
DumpCFG(lmp, narg, arg)
{
gzFp = nullptr;
compression_level = Z_BEST_COMPRESSION;
if (!compressed)
error->all(FLERR,"Dump cfg/gz only writes compressed files");
}
/* ---------------------------------------------------------------------- */
DumpCFGGZ::~DumpCFGGZ()
{
if (gzFp) gzclose(gzFp);
gzFp = nullptr;
fp = nullptr;
}
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or gzipped
@ -84,7 +73,9 @@ void DumpCFGGZ::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -95,17 +86,12 @@ void DumpCFGGZ::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
std::string mode;
if (append_flag) {
mode = fmt::format("ab{}", compression_level);
} else {
mode = fmt::format("wb{}", compression_level);
try {
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
gzFp = gzopen(filecurrent, mode.c_str());
if (gzFp == nullptr) error->one(FLERR,"Cannot open dump file");
} else gzFp = nullptr;
}
// delete string with timestep replaced
@ -127,30 +113,95 @@ void DumpCFGGZ::write_header(bigint n)
if (atom->peri_flag) scale = atom->pdscale;
else if (unwrapflag == 1) scale = UNWRAPEXPAND;
char str[64];
sprintf(str,"Number of particles = %s\n",BIGINT_FORMAT);
gzprintf(gzFp,str,n);
gzprintf(gzFp,"A = %g Angstrom (basic length-scale)\n",scale);
gzprintf(gzFp,"H0(1,1) = %g A\n",domain->xprd);
gzprintf(gzFp,"H0(1,2) = 0 A \n");
gzprintf(gzFp,"H0(1,3) = 0 A \n");
gzprintf(gzFp,"H0(2,1) = %g A \n",domain->xy);
gzprintf(gzFp,"H0(2,2) = %g A\n",domain->yprd);
gzprintf(gzFp,"H0(2,3) = 0 A \n");
gzprintf(gzFp,"H0(3,1) = %g A \n",domain->xz);
gzprintf(gzFp,"H0(3,2) = %g A \n",domain->yz);
gzprintf(gzFp,"H0(3,3) = %g A\n",domain->zprd);
gzprintf(gzFp,".NO_VELOCITY.\n");
gzprintf(gzFp,"entry_count = %d\n",nfield-2);
std::string header = fmt::format("Number of particles = {}\n", n);
header += fmt::format("A = {0:g} Angstrom (basic length-scale)\n", scale);
header += fmt::format("H0(1,1) = {0:g} A\n",domain->xprd);
header += fmt::format("H0(1,2) = 0 A \n");
header += fmt::format("H0(1,3) = 0 A \n");
header += fmt::format("H0(2,1) = {0:g} A \n",domain->xy);
header += fmt::format("H0(2,2) = {0:g} A\n",domain->yprd);
header += fmt::format("H0(2,3) = 0 A \n");
header += fmt::format("H0(3,1) = {0:g} A \n",domain->xz);
header += fmt::format("H0(3,2) = {0:g} A \n",domain->yz);
header += fmt::format("H0(3,3) = {0:g} A\n",domain->zprd);
header += fmt::format(".NO_VELOCITY.\n");
header += fmt::format("entry_count = {}\n",nfield-2);
for (int i = 0; i < nfield-5; i++)
gzprintf(gzFp,"auxiliary[%d] = %s\n",i,auxname[i]);
header += fmt::format("auxiliary[{}] = {}\n",i,auxname[i]);
writer.write(header.c_str(), header.length());
}
/* ---------------------------------------------------------------------- */
void DumpCFGGZ::write_data(int n, double *mybuf)
{
gzwrite(gzFp,mybuf,sizeof(char)*n);
if (buffer_flag) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
if (unwrapflag == 0) {
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (j == 0) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%f \n", mybuf[m]);
} else if (j == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%s \n", typenames[(int) mybuf[m]]);
} else if (j >= 2) {
if (vtype[j] == Dump::INT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
else if (vtype[j] == Dump::DOUBLE)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
else if (vtype[j] == Dump::STRING)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
else if (vtype[j] == Dump::BIGINT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump cfg/gz output");
}
m++;
}
writer.write("\n", 1);
}
} else if (unwrapflag == 1) {
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (j == 0) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%f \n", mybuf[m]);
} else if (j == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%s \n", typenames[(int) mybuf[m]]);
} else if (j >= 2 && j <= 4) {
double unwrap_coord = (mybuf[m] - 0.5)/UNWRAPEXPAND + 0.5;
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], unwrap_coord);
} else if (j >= 5) {
if (vtype[j] == Dump::INT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
else if (vtype[j] == Dump::DOUBLE)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
else if (vtype[j] == Dump::STRING)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
else if (vtype[j] == Dump::BIGINT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump cfg/gz output");
}
m++;
}
writer.write("\n", 1);
}
}
}
}
/* ---------------------------------------------------------------------- */
@ -160,11 +211,11 @@ void DumpCFGGZ::write()
DumpCFG::write();
if (filewriter) {
if (multifile) {
gzclose(gzFp);
gzFp = nullptr;
writer.close();
} else {
if (flush_flag)
gzflush(gzFp,Z_SYNC_FLUSH);
if (flush_flag && writer.isopen()) {
writer.flush();
}
}
}
}
@ -175,16 +226,16 @@ int DumpCFGGZ::modify_param(int narg, char **arg)
{
int consumed = DumpCFG::modify_param(narg, arg);
if (consumed == 0) {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int min_level = Z_DEFAULT_COMPRESSION;
int max_level = Z_BEST_COMPRESSION;
compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
if (compression_level < min_level || compression_level > max_level)
error->all(FLERR, fmt::format("Illegal dump_modify command: compression level must in the range of [{}, {}]", min_level, max_level));
return 2;
try {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
writer.setCompressionLevel(compression_level);
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;
}

View File

@ -21,7 +21,7 @@ DumpStyle(cfg/gz,DumpCFGGZ)
#define LMP_DUMP_CFG_GZ_H
#include "dump_cfg.h"
#include <zlib.h>
#include "gz_file_writer.h"
namespace LAMMPS_NS {
@ -31,8 +31,7 @@ class DumpCFGGZ : public DumpCFG {
virtual ~DumpCFGGZ();
protected:
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
GzFileWriter writer;
virtual void openfile();
virtual void write_header(bigint);

View File

@ -21,7 +21,6 @@
#include "domain.h"
#include "dump_cfg_zstd.h"
#include "error.h"
#include "file_writer.h"
#include "update.h"
#include <cstring>
@ -46,7 +45,7 @@ DumpCFGZstd::~DumpCFGZstd()
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or zstdipped
ASCII or binary or compressed
some derived classes override this function
------------------------------------------------------------------------- */
@ -82,7 +81,9 @@ void DumpCFGZstd::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -147,7 +148,72 @@ void DumpCFGZstd::write_header(bigint n)
void DumpCFGZstd::write_data(int n, double *mybuf)
{
writer.write(mybuf, n);
if (buffer_flag) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
if (unwrapflag == 0) {
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (j == 0) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%f \n", mybuf[m]);
} else if (j == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%s \n", typenames[(int) mybuf[m]]);
} else if (j >= 2) {
if (vtype[j] == Dump::INT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
else if (vtype[j] == Dump::DOUBLE)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
else if (vtype[j] == Dump::STRING)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
else if (vtype[j] == Dump::BIGINT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump cfg/gz output");
}
m++;
}
writer.write("\n", 1);
}
} else if (unwrapflag == 1) {
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (j == 0) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%f \n", mybuf[m]);
} else if (j == 1) {
written = snprintf(vbuffer, VBUFFER_SIZE, "%s \n", typenames[(int) mybuf[m]]);
} else if (j >= 2 && j <= 4) {
double unwrap_coord = (mybuf[m] - 0.5)/UNWRAPEXPAND + 0.5;
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], unwrap_coord);
} else if (j >= 5) {
if (vtype[j] == Dump::INT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
else if (vtype[j] == Dump::DOUBLE)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
else if (vtype[j] == Dump::STRING)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
else if (vtype[j] == Dump::BIGINT)
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump cfg/gz output");
}
m++;
}
writer.write("\n", 1);
}
}
}
}
/* ---------------------------------------------------------------------- */

View File

@ -11,39 +11,28 @@
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "dump_custom_gz.h"
#include "domain.h"
#include "dump_custom_gz.h"
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
DumpCustomGZ::DumpCustomGZ(LAMMPS *lmp, int narg, char **arg) :
DumpCustom(lmp, narg, arg)
{
gzFp = nullptr;
compression_level = Z_BEST_COMPRESSION;
if (!compressed)
error->all(FLERR,"Dump custom/gz only writes compressed files");
}
/* ---------------------------------------------------------------------- */
DumpCustomGZ::~DumpCustomGZ()
{
if (gzFp) gzclose(gzFp);
gzFp = nullptr;
fp = nullptr;
}
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or gzipped
@ -82,7 +71,9 @@ void DumpCustomGZ::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -93,17 +84,12 @@ void DumpCustomGZ::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
std::string mode;
if (append_flag) {
mode = fmt::format("ab{}", compression_level);
} else {
mode = fmt::format("wb{}", compression_level);
try {
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
gzFp = gzopen(filecurrent, mode.c_str());
if (gzFp == nullptr) error->one(FLERR,"Cannot open dump file");
} else gzFp = nullptr;
}
// delete string with timestep replaced
@ -112,29 +98,34 @@ void DumpCustomGZ::openfile()
void DumpCustomGZ::write_header(bigint ndump)
{
std::string header;
if ((multiproc) || (!multiproc && me == 0)) {
if (unit_flag && !unit_count) {
++unit_count;
gzprintf(gzFp,"ITEM: UNITS\n%s\n",update->unit_style);
header = fmt::format("ITEM: UNITS\n{}\n",update->unit_style);
}
if (time_flag) gzprintf(gzFp,"ITEM: TIME\n%.16g\n",compute_time());
gzprintf(gzFp,"ITEM: TIMESTEP\n");
gzprintf(gzFp,BIGINT_FORMAT "\n",update->ntimestep);
gzprintf(gzFp,"ITEM: NUMBER OF ATOMS\n");
gzprintf(gzFp,BIGINT_FORMAT "\n",ndump);
if (domain->triclinic == 0) {
gzprintf(gzFp,"ITEM: BOX BOUNDS %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxxlo,boxxhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxylo,boxyhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxzlo,boxzhi);
} else {
gzprintf(gzFp,"ITEM: BOX BOUNDS xy xz yz %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxxlo,boxxhi,boxxy);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxylo,boxyhi,boxxz);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxzlo,boxzhi,boxyz);
if (time_flag) {
header += fmt::format("ITEM: TIME\n{0:.16g}\n", compute_time());
}
gzprintf(gzFp,"ITEM: ATOMS %s\n",columns);
header += fmt::format("ITEM: TIMESTEP\n{}\n", update->ntimestep);
header += fmt::format("ITEM: NUMBER OF ATOMS\n{}\n", ndump);
if (domain->triclinic == 0) {
header += fmt::format("ITEM: BOX BOUNDS {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxxlo, boxxhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxylo, boxyhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxzlo, boxzhi);
} else {
header += fmt::format("ITEM: BOX BOUNDS xy xz yz {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxxlo, boxxhi, boxxy);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxylo, boxyhi, boxxz);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxzlo, boxzhi, boxyz);
}
header += fmt::format("ITEM: ATOMS {}\n", columns);
writer.write(header.c_str(), header.length());
}
}
@ -142,7 +133,35 @@ void DumpCustomGZ::write_header(bigint ndump)
void DumpCustomGZ::write_data(int n, double *mybuf)
{
gzwrite(gzFp,mybuf,sizeof(char)*n);
if (buffer_flag == 1) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < nfield; j++) {
int written = 0;
if (vtype[j] == Dump::INT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
} else if (vtype[j] == Dump::DOUBLE) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
} else if (vtype[j] == Dump::STRING) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
} else if (vtype[j] == Dump::BIGINT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump custom/gz output");
}
m++;
}
writer.write("\n", 1);
}
}
}
/* ---------------------------------------------------------------------- */
@ -152,11 +171,11 @@ void DumpCustomGZ::write()
DumpCustom::write();
if (filewriter) {
if (multifile) {
gzclose(gzFp);
gzFp = nullptr;
writer.close();
} else {
if (flush_flag)
gzflush(gzFp,Z_SYNC_FLUSH);
if (flush_flag && writer.isopen()) {
writer.flush();
}
}
}
}
@ -167,14 +186,15 @@ int DumpCustomGZ::modify_param(int narg, char **arg)
{
int consumed = DumpCustom::modify_param(narg, arg);
if (consumed == 0) {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int min_level = Z_DEFAULT_COMPRESSION;
int max_level = Z_BEST_COMPRESSION;
compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
if (compression_level < min_level || compression_level > max_level)
error->all(FLERR, fmt::format("Illegal dump_modify command: compression level must in the range of [{}, {}]", min_level, max_level));
return 2;
try {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
writer.setCompressionLevel(compression_level);
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -21,7 +21,7 @@ DumpStyle(custom/gz,DumpCustomGZ)
#define LMP_DUMP_CUSTOM_GZ_H
#include "dump_custom.h"
#include <zlib.h>
#include "gz_file_writer.h"
namespace LAMMPS_NS {
@ -31,8 +31,7 @@ class DumpCustomGZ : public DumpCustom {
virtual ~DumpCustomGZ();
protected:
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
GzFileWriter writer;
virtual void openfile();
virtual void write_header(bigint);

View File

@ -20,7 +20,6 @@
#include "domain.h"
#include "dump_custom_zstd.h"
#include "error.h"
#include "file_writer.h"
#include "update.h"
#include <cstring>
@ -79,7 +78,9 @@ void DumpCustomZstd::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -145,7 +146,35 @@ void DumpCustomZstd::write_header(bigint ndump)
void DumpCustomZstd::write_data(int n, double *mybuf)
{
writer.write(mybuf, n);
if (buffer_flag == 1) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < nfield; j++) {
int written = 0;
if (vtype[j] == Dump::INT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
} else if (vtype[j] == Dump::DOUBLE) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
} else if (vtype[j] == Dump::STRING) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], typenames[(int) mybuf[m]]);
} else if (vtype[j] == Dump::BIGINT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump custom/gz output");
}
m++;
}
writer.write("\n", 1);
}
}
}
/* ---------------------------------------------------------------------- */
@ -184,7 +213,7 @@ int DumpCustomZstd::modify_param(int narg, char **arg)
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -11,39 +11,28 @@
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "dump_local_gz.h"
#include "domain.h"
#include "dump_local_gz.h"
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
DumpLocalGZ::DumpLocalGZ(LAMMPS *lmp, int narg, char **arg) :
DumpLocal(lmp, narg, arg)
{
gzFp = nullptr;
compression_level = Z_BEST_COMPRESSION;
if (!compressed)
error->all(FLERR,"Dump local/gz only writes compressed files");
}
/* ---------------------------------------------------------------------- */
DumpLocalGZ::~DumpLocalGZ()
{
if (gzFp) gzclose(gzFp);
gzFp = nullptr;
fp = nullptr;
}
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or gzipped
@ -82,7 +71,9 @@ void DumpLocalGZ::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -93,17 +84,12 @@ void DumpLocalGZ::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
std::string mode;
if (append_flag) {
mode = fmt::format("ab{}", compression_level);
} else {
mode = fmt::format("wb{}", compression_level);
try {
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
gzFp = gzopen(filecurrent, mode.c_str());
if (gzFp == nullptr) error->one(FLERR,"Cannot open dump file");
} else gzFp = nullptr;
}
// delete string with timestep replaced
@ -112,29 +98,34 @@ void DumpLocalGZ::openfile()
void DumpLocalGZ::write_header(bigint ndump)
{
std::string header;
if ((multiproc) || (!multiproc && me == 0)) {
if (unit_flag && !unit_count) {
++unit_count;
gzprintf(gzFp,"ITEM: UNITS\n%s\n",update->unit_style);
header = fmt::format("ITEM: UNITS\n{}\n",update->unit_style);
}
if (time_flag) gzprintf(gzFp,"ITEM: TIME\n%.16g\n",compute_time());
gzprintf(gzFp,"ITEM: TIMESTEP\n");
gzprintf(gzFp,BIGINT_FORMAT "\n",update->ntimestep);
gzprintf(gzFp,"ITEM: NUMBER OF %s\n",label);
gzprintf(gzFp,BIGINT_FORMAT "\n",ndump);
if (domain->triclinic) {
gzprintf(gzFp,"ITEM: BOX BOUNDS xy xz yz %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxxlo,boxxhi,boxxy);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxylo,boxyhi,boxxz);
gzprintf(gzFp,"%-1.16e %-1.16e %-1.16e\n",boxzlo,boxzhi,boxyz);
} else {
gzprintf(gzFp,"ITEM: BOX BOUNDS %s\n",boundstr);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxxlo,boxxhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxylo,boxyhi);
gzprintf(gzFp,"%-1.16e %-1.16e\n",boxzlo,boxzhi);
if (time_flag) {
header += fmt::format("ITEM: TIME\n{0:.16g}\n", compute_time());
}
gzprintf(gzFp,"ITEM: %s %s\n",label,columns);
header += fmt::format("ITEM: TIMESTEP\n{}\n", update->ntimestep);
header += fmt::format("ITEM: NUMBER OF {}\n{}\n", label, ndump);
if (domain->triclinic == 0) {
header += fmt::format("ITEM: BOX BOUNDS {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxxlo, boxxhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxylo, boxyhi);
header += fmt::format("{0:-1.16e} {1:-1.16e}\n", boxzlo, boxzhi);
} else {
header += fmt::format("ITEM: BOX BOUNDS xy xz yz {}\n", boundstr);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxxlo, boxxhi, boxxy);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxylo, boxyhi, boxxz);
header += fmt::format("{0:-1.16e} {1:-1.16e} {2:-1.16e}\n", boxzlo, boxzhi, boxyz);
}
header += fmt::format("ITEM: {} {}\n", label, columns);
writer.write(header.c_str(), header.length());
}
}
@ -143,19 +134,32 @@ void DumpLocalGZ::write_header(bigint ndump)
void DumpLocalGZ::write_data(int n, double *mybuf)
{
if (buffer_flag == 1) {
gzwrite(gzFp,mybuf,sizeof(char)*n);
writer.write(mybuf, sizeof(char)*n);
} else {
int i,j;
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < size_one; j++) {
if (vtype[j] == INT)
gzprintf(gzFp,vformat[j],static_cast<int> (mybuf[m]));
else gzprintf(gzFp,vformat[j],mybuf[m]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (vtype[j] == Dump::INT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
} else if (vtype[j] == Dump::DOUBLE) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
} else if (vtype[j] == Dump::BIGINT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
} else {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump local/gz output");
}
m++;
}
gzprintf(gzFp,"\n");
writer.write("\n", 1);
}
}
}
@ -167,11 +171,11 @@ void DumpLocalGZ::write()
DumpLocal::write();
if (filewriter) {
if (multifile) {
gzclose(gzFp);
gzFp = nullptr;
writer.close();
} else {
if (flush_flag)
gzflush(gzFp,Z_SYNC_FLUSH);
if (flush_flag && writer.isopen()) {
writer.flush();
}
}
}
}
@ -182,14 +186,15 @@ int DumpLocalGZ::modify_param(int narg, char **arg)
{
int consumed = DumpLocal::modify_param(narg, arg);
if (consumed == 0) {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int min_level = Z_DEFAULT_COMPRESSION;
int max_level = Z_BEST_COMPRESSION;
compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
if (compression_level < min_level || compression_level > max_level)
error->all(FLERR, fmt::format("Illegal dump_modify command: compression level must in the range of [{}, {}]", min_level, max_level));
return 2;
try {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
writer.setCompressionLevel(compression_level);
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -21,7 +21,7 @@ DumpStyle(local/gz,DumpLocalGZ)
#define LMP_DUMP_LOCAL_GZ_H
#include "dump_local.h"
#include <zlib.h>
#include "gz_file_writer.h"
namespace LAMMPS_NS {
@ -31,8 +31,7 @@ class DumpLocalGZ : public DumpLocal {
virtual ~DumpLocalGZ();
protected:
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
GzFileWriter writer;
virtual void openfile();
virtual void write_header(bigint);

View File

@ -17,15 +17,13 @@
#ifdef LAMMPS_ZSTD
#include "dump_local_zstd.h"
#include "domain.h"
#include "dump_local_zstd.h"
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
DumpLocalZstd::DumpLocalZstd(LAMMPS *lmp, int narg, char **arg) :
@ -42,7 +40,6 @@ DumpLocalZstd::~DumpLocalZstd()
{
}
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or gzipped
@ -81,7 +78,9 @@ void DumpLocalZstd::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -145,7 +144,35 @@ void DumpLocalZstd::write_header(bigint ndump)
void DumpLocalZstd::write_data(int n, double *mybuf)
{
writer.write(mybuf, sizeof(char)*n);
if (buffer_flag == 1) {
writer.write(mybuf, sizeof(char)*n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < size_one; j++) {
int written = 0;
if (vtype[j] == Dump::INT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<int> (mybuf[m]));
} else if (vtype[j] == Dump::DOUBLE) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
} else if (vtype[j] == Dump::BIGINT) {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], static_cast<bigint> (mybuf[m]));
} else {
written = snprintf(vbuffer, VBUFFER_SIZE, vformat[j], mybuf[m]);
}
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump local/gz output");
}
m++;
}
writer.write("\n", 1);
}
}
}
/* ---------------------------------------------------------------------- */
@ -184,7 +211,7 @@ int DumpLocalZstd::modify_param(int narg, char **arg)
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -15,19 +15,13 @@
#include "error.h"
#include "update.h"
#include <cstring>
using namespace LAMMPS_NS;
DumpXYZGZ::DumpXYZGZ(LAMMPS *lmp, int narg, char **arg) :
DumpXYZ(lmp, narg, arg)
{
gzFp = nullptr;
compression_level = Z_BEST_COMPRESSION;
if (!compressed)
error->all(FLERR,"Dump xyz/gz only writes compressed files");
}
@ -37,12 +31,8 @@ DumpXYZGZ::DumpXYZGZ(LAMMPS *lmp, int narg, char **arg) :
DumpXYZGZ::~DumpXYZGZ()
{
if (gzFp) gzclose(gzFp);
gzFp = nullptr;
fp = nullptr;
}
/* ----------------------------------------------------------------------
generic opening of a dump file
ASCII or binary or gzipped
@ -81,7 +71,9 @@ void DumpXYZGZ::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -92,17 +84,12 @@ void DumpXYZGZ::openfile()
// each proc with filewriter = 1 opens a file
if (filewriter) {
std::string mode;
if (append_flag) {
mode = fmt::format("ab{}", compression_level);
} else {
mode = fmt::format("wb{}", compression_level);
try {
writer.open(filecurrent, append_flag);
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
}
gzFp = gzopen(filecurrent, mode.c_str());
if (gzFp == nullptr) error->one(FLERR,"Cannot open dump file");
} else gzFp = nullptr;
}
// delete string with timestep replaced
@ -112,8 +99,9 @@ void DumpXYZGZ::openfile()
void DumpXYZGZ::write_header(bigint ndump)
{
if (me == 0) {
gzprintf(gzFp,BIGINT_FORMAT "\n",ndump);
gzprintf(gzFp,"Atoms. Timestep: " BIGINT_FORMAT "\n",update->ntimestep);
std::string header = fmt::format("{}\n", ndump);
header += fmt::format("Atoms. Timestep: {}\n", update->ntimestep);
writer.write(header.c_str(), header.length());
}
}
@ -121,7 +109,24 @@ void DumpXYZGZ::write_header(bigint ndump)
void DumpXYZGZ::write_data(int n, double *mybuf)
{
gzwrite(gzFp,mybuf,sizeof(char)*n);
if (buffer_flag) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
int written = snprintf(vbuffer, VBUFFER_SIZE, format,
typenames[static_cast<int> (mybuf[m+1])],
mybuf[m+2],mybuf[m+3],mybuf[m+4]);
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump xyz/gz output");
}
m += size_one;
}
}
}
/* ---------------------------------------------------------------------- */
@ -131,11 +136,11 @@ void DumpXYZGZ::write()
DumpXYZ::write();
if (filewriter) {
if (multifile) {
gzclose(gzFp);
gzFp = nullptr;
writer.close();
} else {
if (flush_flag)
gzflush(gzFp,Z_SYNC_FLUSH);
if (flush_flag && writer.isopen()) {
writer.flush();
}
}
}
}
@ -146,14 +151,15 @@ int DumpXYZGZ::modify_param(int narg, char **arg)
{
int consumed = DumpXYZ::modify_param(narg, arg);
if (consumed == 0) {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int min_level = Z_DEFAULT_COMPRESSION;
int max_level = Z_BEST_COMPRESSION;
compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
if (compression_level < min_level || compression_level > max_level)
error->all(FLERR, fmt::format("Illegal dump_modify command: compression level must in the range of [{}, {}]", min_level, max_level));
return 2;
try {
if (strcmp(arg[0],"compression_level") == 0) {
if (narg < 2) error->all(FLERR,"Illegal dump_modify command");
int compression_level = utils::inumeric(FLERR, arg[1], false, lmp);
writer.setCompressionLevel(compression_level);
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -21,7 +21,7 @@ DumpStyle(xyz/gz,DumpXYZGZ)
#define LMP_DUMP_XYZ_GZ_H
#include "dump_xyz.h"
#include <zlib.h>
#include "gz_file_writer.h"
namespace LAMMPS_NS {
@ -31,8 +31,7 @@ class DumpXYZGZ : public DumpXYZ {
virtual ~DumpXYZGZ();
protected:
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
GzFileWriter writer;
virtual void openfile();
virtual void write_header(bigint);

View File

@ -19,7 +19,6 @@
#include "dump_xyz_zstd.h"
#include "error.h"
#include "file_writer.h"
#include "update.h"
#include <cstring>
@ -79,7 +78,9 @@ void DumpXYZZstd::openfile()
nameslist[numfiles] = utils::strdup(filecurrent);
++numfiles;
} else {
remove(nameslist[fileidx]);
if (remove(nameslist[fileidx]) != 0) {
error->warning(FLERR, fmt::format("Could not delete {}", nameslist[fileidx]));
}
delete[] nameslist[fileidx];
nameslist[fileidx] = utils::strdup(filecurrent);
fileidx = (fileidx + 1) % maxfiles;
@ -119,7 +120,24 @@ void DumpXYZZstd::write_header(bigint ndump)
void DumpXYZZstd::write_data(int n, double *mybuf)
{
writer.write(mybuf, n);
if (buffer_flag) {
writer.write(mybuf, n);
} else {
constexpr size_t VBUFFER_SIZE = 256;
char vbuffer[VBUFFER_SIZE];
int m = 0;
for (int i = 0; i < n; i++) {
int written = snprintf(vbuffer, VBUFFER_SIZE, format,
typenames[static_cast<int> (mybuf[m+1])],
mybuf[m+2],mybuf[m+3],mybuf[m+4]);
if (written > 0) {
writer.write(vbuffer, written);
} else if (written < 0) {
error->one(FLERR, "Error while writing dump xyz/gz output");
}
m += size_one;
}
}
}
/* ---------------------------------------------------------------------- */
@ -158,7 +176,7 @@ int DumpXYZZstd::modify_param(int narg, char **arg)
return 2;
}
} catch (FileWriterException &e) {
error->one(FLERR, e.what());
error->one(FLERR, fmt::format("Illegal dump_modify command: {}", e.what()));
}
}
return consumed;

View File

@ -0,0 +1,105 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://lammps.sandia.gov/, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Richard Berger (Temple U)
------------------------------------------------------------------------- */
#include "gz_file_writer.h"
#include <stdio.h>
#include "fmt/format.h"
using namespace LAMMPS_NS;
GzFileWriter::GzFileWriter() : FileWriter(),
compression_level(Z_BEST_COMPRESSION),
gzFp(nullptr)
{
}
/* ---------------------------------------------------------------------- */
GzFileWriter::~GzFileWriter()
{
close();
}
/* ---------------------------------------------------------------------- */
void GzFileWriter::open(const std::string &path, bool append)
{
if (isopen()) return;
std::string mode;
if (append) {
mode = fmt::format("ab{}", mode, compression_level);
} else {
mode = fmt::format("wb{}", mode, compression_level);
}
gzFp = gzopen(path.c_str(), mode.c_str());
if (gzFp == nullptr)
throw FileWriterException(fmt::format("Could not open file '{}'", path));
}
/* ---------------------------------------------------------------------- */
size_t GzFileWriter::write(const void * buffer, size_t length)
{
if (!isopen()) return 0;
return gzwrite(gzFp, buffer, length);
}
/* ---------------------------------------------------------------------- */
void GzFileWriter::flush()
{
if (!isopen()) return;
gzflush(gzFp, Z_SYNC_FLUSH);
}
/* ---------------------------------------------------------------------- */
void GzFileWriter::close()
{
if (!isopen()) return;
gzclose(gzFp);
gzFp = nullptr;
}
/* ---------------------------------------------------------------------- */
bool GzFileWriter::isopen() const
{
return gzFp;
}
/* ---------------------------------------------------------------------- */
void GzFileWriter::setCompressionLevel(int level)
{
if (isopen())
throw FileWriterException("Compression level can not be changed while file is open");
const int min_level = Z_DEFAULT_COMPRESSION;
const int max_level = Z_BEST_COMPRESSION;
if (level < min_level || level > max_level)
throw FileWriterException(fmt::format("Compression level must in the range of [{}, {}]", min_level, max_level));
compression_level = level;
}

View File

@ -0,0 +1,47 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Richard Berger (Temple U)
------------------------------------------------------------------------- */
#ifndef LMP_GZ_FILE_WRITER_H
#define LMP_GZ_FILE_WRITER_H
#include "file_writer.h"
#include <string>
#include <zlib.h>
#include <exception>
namespace LAMMPS_NS {
class GzFileWriter : public FileWriter {
int compression_level;
gzFile gzFp; // file pointer for the compressed output stream
public:
GzFileWriter();
virtual ~GzFileWriter();
virtual void open(const std::string &path, bool append = false) override;
virtual void close() override;
virtual void flush() override;
virtual size_t write(const void * buffer, size_t length) override;
virtual bool isopen() const override;
void setCompressionLevel(int level);
};
}
#endif

View File

@ -46,11 +46,15 @@ ZstdFileWriter::~ZstdFileWriter()
/* ---------------------------------------------------------------------- */
void ZstdFileWriter::open(const std::string &path)
void ZstdFileWriter::open(const std::string &path, bool append)
{
if (isopen()) return;
fp = fopen(path.c_str(), "wb");
if (append) {
fp = fopen(path.c_str(), "ab");
} else {
fp = fopen(path.c_str(), "wb");
}
if (!fp) {
throw FileWriterException(fmt::format("Could not open file '{}'", path));

View File

@ -38,7 +38,7 @@ class ZstdFileWriter : public FileWriter {
public:
ZstdFileWriter();
virtual ~ZstdFileWriter();
virtual void open(const std::string &path) override;
virtual void open(const std::string &path, bool append = false) override;
virtual void close() override;
virtual void flush() override;
virtual size_t write(const void * buffer, size_t length) override;

View File

@ -62,13 +62,13 @@ CommandStyle(kim,KimCommand)
#ifndef LMP_KIM_COMMAND_H
#define LMP_KIM_COMMAND_H
#include "pointers.h"
#include "command.h"
namespace LAMMPS_NS {
class KimCommand : protected Pointers {
class KimCommand : public Command {
public:
KimCommand(class LAMMPS *lmp) : Pointers(lmp) {};
KimCommand(class LAMMPS *lmp) : Command(lmp) {};
void command(int, char **);
};

View File

@ -63,6 +63,8 @@ action atom_vec_bond_kokkos.cpp atom_vec_bond.cpp
action atom_vec_bond_kokkos.h atom_vec_bond.h
action atom_vec_charge_kokkos.cpp
action atom_vec_charge_kokkos.h
action atom_vec_spin_kokkos.cpp
action atom_vec_spin_kokkos.h
action atom_vec_dpd_kokkos.cpp atom_vec_dpd.cpp
action atom_vec_dpd_kokkos.h atom_vec_dpd.h
action atom_vec_full_kokkos.cpp atom_vec_full.cpp

View File

@ -76,6 +76,12 @@ AtomKokkos::~AtomKokkos()
memoryKK->destroy_kokkos(k_improper_atom3, improper_atom3);
memoryKK->destroy_kokkos(k_improper_atom4, improper_atom4);
// SPIN package
memoryKK->destroy_kokkos(k_sp, sp);
memoryKK->destroy_kokkos(k_fm, fm);
memoryKK->destroy_kokkos(k_fm_long, fm_long);
// USER-DPD package
memoryKK->destroy_kokkos(k_uCond,uCond);
memoryKK->destroy_kokkos(k_uMech,uMech);

View File

@ -54,6 +54,11 @@ class AtomKokkos : public Atom {
DAT::tdual_float_2d k_dvector;
// SPIN package
DAT::tdual_float_1d_4 k_sp;
DAT::tdual_f_array k_fm;
DAT::tdual_f_array k_fm_long;
// USER-DPD package
DAT::tdual_efloat_1d k_uCond, k_uMech, k_uChem, k_uCG, k_uCGnew,

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,132 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef ATOM_CLASS
AtomStyle(spin/kk,AtomVecSpinKokkos)
AtomStyle(spin/kk/device,AtomVecSpinKokkos)
AtomStyle(spin/kk/host,AtomVecSpinKokkos)
#else
#ifndef LMP_ATOM_VEC_SPIN_KOKKOS_H
#define LMP_ATOM_VEC_SPIN_KOKKOS_H
#include "atom_vec_kokkos.h"
#include "kokkos_type.h"
namespace LAMMPS_NS {
class AtomVecSpinKokkos : public AtomVecKokkos {
public:
AtomVecSpinKokkos(class LAMMPS *);
void grow(int);
void copy(int, int, int);
int pack_border(int, int *, double *, int, int *);
int pack_border_vel(int, int *, double *, int, int *);
int pack_border_hybrid(int, int *, double *);
void unpack_border(int, int, double *);
void unpack_border_vel(int, int, double *);
int unpack_border_hybrid(int, int, double *);
int pack_exchange(int, double *);
int unpack_exchange(double *);
int size_restart();
int pack_restart(int, double *);
int unpack_restart(double *);
void create_atom(int, double *);
void data_atom(double *, imageint, char **);
int data_atom_hybrid(int, char **);
void pack_data(double **);
int pack_data_hybrid(int, double *);
void write_data(FILE *, int, double **);
int write_data_hybrid(FILE *, double *);
double memory_usage();
// clear magnetic and mechanic forces
void force_clear(int, size_t);
void grow_pointers();
// input lists to be checked
int pack_border_kokkos(int n, DAT::tdual_int_2d k_sendlist,
DAT::tdual_xfloat_2d buf,int iswap,
int pbc_flag, int *pbc, ExecutionSpace space);
void unpack_border_kokkos(const int &n, const int &nfirst,
const DAT::tdual_xfloat_2d &buf,
ExecutionSpace space);
int pack_exchange_kokkos(const int &nsend,DAT::tdual_xfloat_2d &buf,
DAT::tdual_int_1d k_sendlist,
DAT::tdual_int_1d k_copylist,
ExecutionSpace space, int dim,
X_FLOAT lo, X_FLOAT hi);
int unpack_exchange_kokkos(DAT::tdual_xfloat_2d &k_buf, int nrecv,
int nlocal, int dim, X_FLOAT lo, X_FLOAT hi,
ExecutionSpace space);
void sync(ExecutionSpace space, unsigned int mask);
void modified(ExecutionSpace space, unsigned int mask);
void sync_overlapping_device(ExecutionSpace space, unsigned int mask);
protected:
tagint *tag;
int *type,*mask;
imageint *image;
double **x,**v,**f; // lattice quantities
// spin quantities
double **sp; // sp[i][0-2] direction of the spin i
// sp[i][3] atomic magnetic moment of the spin i
double **fm; // fm[i][0-2] direction of magnetic precession
double **fm_long; // storage of long-range spin prec. components
DAT::t_tagint_1d d_tag;
HAT::t_tagint_1d h_tag;
DAT::t_int_1d d_type, d_mask;
HAT::t_int_1d h_type, h_mask;
DAT::t_imageint_1d d_image;
HAT::t_imageint_1d h_image;
DAT::t_x_array d_x;
DAT::t_v_array d_v;
DAT::t_f_array d_f;
DAT::t_sp_array d_sp;
DAT::t_fm_array d_fm;
DAT::t_fm_long_array d_fm_long;
HAT::t_sp_array h_sp;
HAT::t_fm_array h_fm;
HAT::t_fm_long_array h_fm_long;
DAT::tdual_int_1d k_count;
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Per-processor system is too big
The number of owned atoms plus ghost atoms on a single
processor must fit in 32-bit integer.
E: Invalid atom type in Atoms section of data file
Atom types must range from 1 to specified # of types.
*/

View File

@ -769,6 +769,36 @@ typedef tdual_virial_array::t_dev_um t_virial_array_um;
typedef tdual_virial_array::t_dev_const_um t_virial_array_const_um;
typedef tdual_virial_array::t_dev_const_randomread t_virial_array_randomread;
// Spin Types
//3d SP_FLOAT array n*4
#ifdef LMP_KOKKOS_NO_LEGACY
typedef Kokkos::DualView<X_FLOAT*[4], Kokkos::LayoutLeft, LMPDeviceType> tdual_float_1d_4;
#else
typedef Kokkos::DualView<X_FLOAT*[4], Kokkos::LayoutRight, LMPDeviceType> tdual_float_1d_4;
#endif
typedef tdual_float_1d_4::t_dev t_sp_array;
typedef tdual_float_1d_4::t_dev_const t_sp_array_const;
typedef tdual_float_1d_4::t_dev_um t_sp_array_um;
typedef tdual_float_1d_4::t_dev_const_um t_sp_array_const_um;
typedef tdual_float_1d_4::t_dev_const_randomread t_sp_array_randomread;
//3d FM_FLOAT array n*3
typedef tdual_f_array::t_dev t_fm_array;
typedef tdual_f_array::t_dev_const t_fm_array_const;
typedef tdual_f_array::t_dev_um t_fm_array_um;
typedef tdual_f_array::t_dev_const_um t_fm_array_const_um;
typedef tdual_f_array::t_dev_const_randomread t_fm_array_randomread;
//3d FML_FLOAT array n*3
typedef tdual_f_array::t_dev t_fm_long_array;
typedef tdual_f_array::t_dev_const t_fm_long_array_const;
typedef tdual_f_array::t_dev_um t_fm_long_array_um;
typedef tdual_f_array::t_dev_const_um t_fm_long_array_const_um;
typedef tdual_f_array::t_dev_const_randomread t_fm_long_array_randomread;
//Energy Types
//1d E_FLOAT array n
@ -1005,6 +1035,28 @@ typedef tdual_virial_array::t_host_um t_virial_array_um;
typedef tdual_virial_array::t_host_const_um t_virial_array_const_um;
typedef tdual_virial_array::t_host_const_randomread t_virial_array_randomread;
// Spin types
//2d X_FLOAT array n*4
typedef tdual_float_1d_4::t_host t_sp_array;
typedef tdual_float_1d_4::t_host_const t_sp_array_const;
typedef tdual_float_1d_4::t_host_um t_sp_array_um;
typedef tdual_float_1d_4::t_host_const_um t_sp_array_const_um;
typedef tdual_float_1d_4::t_host_const_randomread t_sp_array_randomread;
//2d F_FLOAT array n*3
typedef tdual_f_array::t_host t_fm_array;
typedef tdual_f_array::t_host_const t_fm_array_const;
typedef tdual_f_array::t_host_um t_fm_array_um;
typedef tdual_f_array::t_host_const_um t_fm_array_const_um;
typedef tdual_f_array::t_host_const_randomread t_fm_array_randomread;
//2d F_FLOAT array n*3
typedef tdual_f_array::t_host t_fm_long_array;
typedef tdual_f_array::t_host_const t_fm_long_array_const;
typedef tdual_f_array::t_host_um t_fm_long_array_um;
typedef tdual_f_array::t_host_const_um t_fm_long_array_const_um;
typedef tdual_f_array::t_host_const_randomread t_fm_long_array_randomread;
//Energy Types

View File

@ -595,6 +595,15 @@ void VerletKokkos::force_clear()
atomKK->modified(Device,TORQUE_MASK);
}
// reset SPIN forces
if (extraflag) {
Kokkos::parallel_for(nall, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm.view<LMPDeviceType>()));
atomKK->modified(Device,FM_MASK);
Kokkos::parallel_for(nall, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm_long.view<LMPDeviceType>()));
atomKK->modified(Device,FML_MASK);
}
// neighbor includegroup flag is set
// clear force only on initial nfirst particles
// if either newton flag is set, also include ghosts
@ -608,6 +617,15 @@ void VerletKokkos::force_clear()
atomKK->modified(Device,TORQUE_MASK);
}
// reset SPIN forces
if (extraflag) {
Kokkos::parallel_for(atomKK->nfirst, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm.view<LMPDeviceType>()));
atomKK->modified(Device,FM_MASK);
Kokkos::parallel_for(atomKK->nfirst, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm_long.view<LMPDeviceType>()));
atomKK->modified(Device,FML_MASK);
}
if (force->newton) {
auto range = Kokkos::RangePolicy<LMPDeviceType>(atomKK->nlocal, atomKK->nlocal + atomKK->nghost);
Kokkos::parallel_for(range, Zero<typename ArrayTypes<LMPDeviceType>::t_f_array>(atomKK->k_f.view<LMPDeviceType>()));
@ -617,6 +635,15 @@ void VerletKokkos::force_clear()
Kokkos::parallel_for(range, Zero<typename ArrayTypes<LMPDeviceType>::t_f_array>(atomKK->k_torque.view<LMPDeviceType>()));
atomKK->modified(Device,TORQUE_MASK);
}
// reset SPIN forces
if (extraflag) {
Kokkos::parallel_for(range, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm.view<LMPDeviceType>()));
atomKK->modified(Device,FM_MASK);
Kokkos::parallel_for(range, Zero<typename ArrayTypes<LMPDeviceType>::t_fm_array>(atomKK->k_fm_long.view<LMPDeviceType>()));
atomKK->modified(Device,FML_MASK);
}
}
}
}

View File

@ -17,21 +17,21 @@
#include "fix_qeq_comb.h"
#include <cmath>
#include <cstring>
#include "pair_comb.h"
#include "pair_comb3.h"
#include "neigh_list.h"
#include "atom.h"
#include "comm.h"
#include "error.h"
#include "force.h"
#include "group.h"
#include "memory.h"
#include "neigh_list.h"
#include "respa.h"
#include "update.h"
#include "memory.h"
#include "error.h"
#include <cmath>
#include <cstring>
#include "pair_comb.h"
#include "pair_comb3.h"
using namespace LAMMPS_NS;
using namespace FixConst;
@ -85,9 +85,6 @@ FixQEQComb::FixQEQComb(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg),
int nlocal = atom->nlocal;
for (int i = 0; i < nlocal; i++) qf[i] = 0.0;
comb = nullptr;
comb3 = nullptr;
comm_forward = 1;
}
@ -119,8 +116,9 @@ void FixQEQComb::init()
if (!atom->q_flag)
error->all(FLERR,"Fix qeq/comb requires atom attribute q");
comb = (PairComb *) force->pair_match("^comb",0);
comb3 = (PairComb3 *) force->pair_match("^comb3",0);
if (!comb3) comb = (PairComb *) force->pair_match("^comb",0);
if (comb == nullptr && comb3 == nullptr)
error->all(FLERR,"Must use pair_style comb or comb3 with fix qeq/comb");
@ -204,14 +202,17 @@ void FixQEQComb::post_force(int /*vflag*/)
double *q = atom->q;
int *mask = atom->mask;
if (comb) {
if (comb) {
inum = comb->list->inum;
ilist = comb->list->ilist;
}
if (comb3) {
} else if (comb3) {
inum = comb3->list->inum;
ilist = comb3->list->ilist;
} else {
inum = 0;
ilist = nullptr;
}
for (ii = 0; ii < inum; ii++) {
i = ilist[ii];
q1[i] = q2[i] = qf[i] = 0.0;
@ -227,8 +228,9 @@ void FixQEQComb::post_force(int /*vflag*/)
}
comm->forward_comm_fix(this);
enegtot = 0.0;
if (comb) enegtot = comb->yasu_char(qf,igroup);
if (comb3) enegtot = comb3->combqeq(qf,igroup);
else if (comb3) enegtot = comb3->combqeq(qf,igroup);
enegtot /= ngroup;
enegchk = enegmax = 0.0;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,118 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
Contributing author: Tine Curk (tcurk5@gmail.com) and Jiaxing Yuan (yuanjiaxing123@hotmail.com)
------------------------------------------------------------------------- */
#ifdef FIX_CLASS
FixStyle(charge/regulation,FixChargeRegulation)
#else
#ifndef LMP_FIX_CHARGE_REGULATION_H
#define LMP_FIX_CHARGE_REGULATION_H
#include "fix.h"
namespace LAMMPS_NS {
class FixChargeRegulation : public Fix {
public:
FixChargeRegulation(class LAMMPS *, int, char **);
~FixChargeRegulation();
int setmask();
void init();
void pre_exchange();
void forward_acid();
void backward_acid();
void forward_base();
void backward_base();
void forward_ions();
void forward_ions_multival();
void backward_ions();
void backward_ions_multival();
int get_random_particle(int, double, double, double *);
int insert_particle(int, double, double, double *);
double energy_full();
int particle_number(int, double);
int particle_number_xrd(int, double, double, double *);
double compute_vector(int n);
void assign_tags();
void options(int, char **);
void setThermoTemperaturePointer();
double memory_usage();
private:
int exclusion_group, exclusion_group_bit;
int nevery, seed; // begin MC cycle every nevery MD timesteps, random seed
int nmc; // MC move attempts per cycle
double llength_unit_in_nm ; // LAMMPS unit of length in nm, needed since chemical potentials are in units of mol/l
double pH, pKa, pKb, pKs, pI_plus, pI_minus; // chemical potentials and equilibrium constant in log10 base
double c10pH, c10pKa, c10pKb, c10pOH, c10pI_plus, c10pI_minus; // 10 raised to chemical potential value, in units of concentration [mol/liter]
double pmcmoves[3]; // mc move attempt probability: acid, base, ion pair exchange
double pmcc; // mc move cumulative attempt probability
int npart_xrd; // # of particles (ions) within xrd
int npart_xrd2; // # of particles (ions) within xrd
double vlocal_xrd; // # local volume within xrd
bool only_salt_flag; // true if performing only salt insertion/deletion, no acid/base dissociation.
bool add_tags_flag; // true if each inserted atom gets its unique atom tag
int groupbitall; // group bitmask for inserted atoms
int ngroups; // number of group-ids for inserted atoms
char **groupstrings; // list of group-ids for inserted atoms
// counters
unsigned long int nacid_attempts, nacid_successes, nbase_attempts, nbase_successes, nsalt_attempts, nsalt_successes;
int nacid_neutral, nacid_charged, nbase_neutral, nbase_charged, ncation, nanion; // particle type counts
int cr_nmax; // max number of local particles
double reservoir_temperature;
double beta, sigma, volume, volume_rx; // inverse temperature, speed, total volume, reacting volume
int salt_charge[2]; // charge of salt ions: [0] - cation, [1] - anion
int salt_charge_ratio; // charge ratio when using multivalent ion exchange
double xlo, xhi, ylo, yhi, zlo, zhi; // box size
double energy_stored; // full energy of old/current configuration
int triclinic; // 0 = orthog box, 1 = triclinic
double *sublo, *subhi; // triclinic size
int *ptype_ID; // particle ID array
double overlap_cutoffsq; // square distance cutoff for overlap
int overlap_flag;
int acid_type, cation_type, base_type, anion_type; // reacting atom types
int reaction_distance_flag; // radial reaction restriction flag
double reaction_distance; // max radial distance from acid/base for ion insertion
class Pair *pair;
class Compute *c_pe; // energy compute pointer
class RanPark *random_equal; // random number generator
class RanPark *random_unequal; // random number generator
char *idftemp; // pointer to the temperature fix
double *target_temperature_tcp; // current temperature of the thermostat
};
}
#endif
#endif
/* ERROR/WARNING messages:
E: Illegal ... command
Self-explanatory. Check the input script syntax and compare to the
documentation for the command. You can use -echo screen as a
command-line option when running LAMMPS to see the offending line.
Self-explanatory.
*/

View File

@ -580,14 +580,7 @@ void FixGCMC::init()
// neighbor list exclusion setup
// turn off interactions between group all and the exclusion group
int narg = 4;
char **arg = new char*[narg];;
arg[0] = (char *) "exclude";
arg[1] = (char *) "group";
arg[2] = (char *) group_id.c_str();
arg[3] = (char *) "all";
neighbor->modify_params(narg,arg);
delete [] arg;
neighbor->modify_params(fmt::format("exclude group {} all",group_id));
}
// create a new group for temporary use with selected molecules

View File

@ -342,14 +342,7 @@ void FixWidom::init()
// neighbor list exclusion setup
// turn off interactions between group all and the exclusion group
int narg = 4;
char **arg = new char*[narg];;
arg[0] = (char *) "exclude";
arg[1] = (char *) "group";
arg[2] = (char *) group_id.c_str();
arg[3] = (char *) "all";
neighbor->modify_params(narg,arg);
delete [] arg;
neighbor->modify_params(fmt::format("exclude group {} all",group_id));
}
// create a new group for temporary use with selected molecules

Some files were not shown because too many files have changed in this diff Show More